diff --git a/Cargo.lock b/Cargo.lock index c12d0e7..4c44c8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -49,47 +49,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -97,9 +98,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "approx" @@ -126,21 +127,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] -name = "atty" -version = "0.2.14" +name = "autocfg" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] -name = "autocfg" -version = "1.2.0" +name = "bezier-rs" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "bde3aa314326e2f984f81adcb399c64b93eed3c0f2cd4258b711bf494c5741de" +dependencies = [ + "glam", +] [[package]] name = "bitflags" @@ -156,21 +155,21 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytecount" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" [[package]] name = "byteorder" @@ -204,12 +203,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -220,16 +220,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -264,7 +264,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] @@ -275,17 +275,17 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "command_cad" -version = "0.5.0" +version = "0.6.0" dependencies = [ "anyhow", "arrayvec", - "atty", + "bezier-rs", "casey", "clap", "common_data_types", @@ -299,9 +299,11 @@ dependencies = [ "fj-math", "fortuples", "git2", + "glam", "imstr", "lazy_static", "log", + "macros", "nalgebra", "nom", "nom_locate", @@ -354,18 +356,18 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "csv" @@ -402,26 +404,26 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "enum_dispatch" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] @@ -441,7 +443,7 @@ checksum = "a0e8987f91d86aa10313adf7c767a8cfd040364432d4e9f722b049b8ff7e634a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] @@ -452,9 +454,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -462,18 +464,18 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fj-core" version = "0.49.0" -source = "git+https://github.com/hannobraun/fornjot.git#4ad0844ced9120b806d0e1abbdf9ae9e500667a1" +source = "git+https://github.com/hannobraun/fornjot.git#613779934166dea13b7f87c0d56f3952f9658ff9" dependencies = [ "fj-interop", "fj-math", - "itertools", + "itertools 0.13.0", "parking_lot", "robust", "spade", @@ -484,7 +486,7 @@ dependencies = [ [[package]] name = "fj-export" version = "0.49.0" -source = "git+https://github.com/hannobraun/fornjot.git#4ad0844ced9120b806d0e1abbdf9ae9e500667a1" +source = "git+https://github.com/hannobraun/fornjot.git#613779934166dea13b7f87c0d56f3952f9658ff9" dependencies = [ "fj-interop", "fj-math", @@ -497,7 +499,7 @@ dependencies = [ [[package]] name = "fj-interop" version = "0.49.0" -source = "git+https://github.com/hannobraun/fornjot.git#4ad0844ced9120b806d0e1abbdf9ae9e500667a1" +source = "git+https://github.com/hannobraun/fornjot.git#613779934166dea13b7f87c0d56f3952f9658ff9" dependencies = [ "fj-math", ] @@ -505,7 +507,7 @@ dependencies = [ [[package]] name = "fj-math" version = "0.49.0" -source = "git+https://github.com/hannobraun/fornjot.git#4ad0844ced9120b806d0e1abbdf9ae9e500667a1" +source = "git+https://github.com/hannobraun/fornjot.git#613779934166dea13b7f87c0d56f3952f9658ff9" dependencies = [ "approx 0.5.1", "decorum", @@ -518,9 +520,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -561,11 +563,20 @@ dependencies = [ "url", ] +[[package]] +name = "glam" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" +dependencies = [ + "serde", +] + [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -583,15 +594,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -655,11 +657,17 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.12.1" @@ -669,6 +677,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -677,9 +694,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -701,9 +718,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" @@ -741,9 +758,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -753,15 +770,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -773,6 +790,15 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "matrixmultiply" version = "0.3.8" @@ -797,18 +823,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] [[package]] name = "nalgebra" -version = "0.32.4" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4541eb06dce09c0241ebbaab7102f0a01a0c8994afed2e5d0d66775016e25ac2" +checksum = "3ea4908d4f23254adda3daa60ffef0f1ac7b8c3e9a864cf3cc154b251908a2ef" dependencies = [ "approx 0.5.1", "matrixmultiply", @@ -854,9 +880,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -869,7 +895,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] @@ -883,20 +909,19 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -916,9 +941,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.101" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -937,9 +962,9 @@ dependencies = [ [[package]] name = "ouroboros" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b7be5a8a3462b752f4be3ff2b2bf2f7f1d00834902e46be2a4d68b87b0573c" +checksum = "944fa20996a25aded6b4795c6d63f10014a7a83f8be9828a11860b08c5fc4a67" dependencies = [ "aliasable", "ouroboros_macro", @@ -948,23 +973,23 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b645dcde5f119c2c454a92d0dfa271a2a3b205da92e4292a68ead4bdbfde1f33" +checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" dependencies = [ "heck 0.4.1", - "itertools", + "itertools 0.12.1", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -972,28 +997,29 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "parry2d-f64" -version = "0.13.7" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5565e2f28bad470868b5e5c146fd0e2716345b67d8b9f27e0fc147a1dd4790b5" +checksum = "416b765a3db5f3e219fcc878d649ea6dc6b93490694be846c39c7398074f90d1" dependencies = [ "approx 0.5.1", "arrayvec", "bitflags 1.3.2", "downcast-rs", "either", + "log", "nalgebra", "num-derive", "num-traits", @@ -1006,15 +1032,16 @@ dependencies = [ [[package]] name = "parry3d-f64" -version = "0.13.7" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d259245abcc09379798e4d373d9019e0df4dc6f7f128ecd68700a5927dc32034" +checksum = "fdc07fa374273eca29066d59d3ded520bf845ed582e38c0d60109459ea4ed76e" dependencies = [ "approx 0.5.1", "arrayvec", "bitflags 1.3.2", "downcast-rs", "either", + "log", "nalgebra", "num-derive", "num-traits", @@ -1027,9 +1054,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -1045,9 +1072,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -1060,7 +1087,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", "version_check", "yansi", ] @@ -1077,9 +1104,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1099,6 +1126,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "robust" version = "1.1.0" @@ -1113,9 +1149,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -1126,15 +1162,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" @@ -1153,38 +1189,38 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.197" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -1234,9 +1270,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spade" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61addf9117b11d1f5b4bf6fe94242ba25f59d2d4b2080544b771bd647024fd00" +checksum = "5b20a809169ae442497e41a997fc5f14e2eea04e6ac590816a910d5d8068c8c0" dependencies = [ "hashbrown", "num-traits", @@ -1274,9 +1310,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -1291,9 +1327,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -1333,22 +1369,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] @@ -1506,7 +1542,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -1528,7 +1564,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1561,59 +1597,37 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" dependencies = [ - "redox_syscall", + "redox_syscall 0.4.1", "wasite", "web-sys", ] [[package]] name = "wide" -version = "0.7.15" +version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" +checksum = "cd8dc749a1b03f3c255a3064a4f5c0ee5ed09b7c6bc6d4525d31f779cd74d7fc" dependencies = [ "bytemuck", "safe_arch", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1631,7 +1645,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1651,17 +1665,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -1672,9 +1687,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -1684,9 +1699,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -1696,9 +1711,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -1708,9 +1729,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -1720,9 +1741,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -1732,9 +1753,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -1744,9 +1765,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "yansi" @@ -1756,22 +1777,22 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.66", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index b763eb9..d8769de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ -workspace = { members = ["crates/common_data_types"] } +workspace = { members = ["crates/common_data_types", "crates/macros"] } [package] name = "command_cad" -version = "0.5.0" +version = "0.6.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -24,7 +24,6 @@ lazy_static = "1.4" log = "0.4" nom = "7.1" nom_locate = "4.2" -ouroboros = "0.18" paste = "1.0" semver = { version = "1.0", features = [ "serde" ] } serde = { version = "1.0", features = [ "derive" ] } @@ -33,11 +32,14 @@ serde_yaml = "0.9" uom = "0.35" whoami = "1.4" stderrlog = "0.6" -atty = "0.2" tempfile = "3.10" common_data_types = { path = "crates/common_data_types" } nalgebra = "0.32" arrayvec = "0.7.4" +ouroboros = "0.18.3" +bezier-rs = "=0.4.0" +macros = { path = "crates/macros" } +glam = "0.24" [build-dependencies] csv = "1.3.0" diff --git a/build.rs b/build.rs index 0931004..c024905 100644 --- a/build.rs +++ b/build.rs @@ -22,6 +22,7 @@ pub struct Row { pub information_kind: bool, pub solid_angle_kind: bool, pub temperature_kind: bool, + pub pixel_kind: bool, pub singular: String, pub plural: String, pub abbreviation: String, @@ -78,6 +79,7 @@ fn main() { ratio_type_hint.set_is_information(row.information_kind); ratio_type_hint.set_is_solid_angle(row.solid_angle_kind); ratio_type_hint.set_is_temperature(row.temperature_kind); + ratio_type_hint.set_is_pixel(row.pixel_kind); let dimension = Dimension { length: row.length, diff --git a/crates/common_data_types/src/lib.rs b/crates/common_data_types/src/lib.rs index 145e820..7945510 100644 --- a/crates/common_data_types/src/lib.rs +++ b/crates/common_data_types/src/lib.rs @@ -4,8 +4,8 @@ use ordered_float::NotNan; use paste::paste; use serde::Serialize; -pub type RawNumber = f64; -pub type Number = NotNan; +pub type RawFloat = f64; +pub type Float = NotNan; pub use ordered_float::{FloatIsNan, ParseNotNanError}; pub use std::f64::consts; @@ -49,6 +49,7 @@ impl RatioTypeHint { const INFORMATION_MASK: u8 = 0x04; const SOLID_ANGLE_MASK: u8 = 0x08; const TEMPRATURE_MASK: u8 = 0x10; + const PIXEL_MASK: u8 = 0x20; bit_getter_setter!(Self::ANGLE_KIND_MASK, angle); bit_getter_setter!( @@ -58,6 +59,7 @@ impl RatioTypeHint { bit_getter_setter!(Self::INFORMATION_MASK, information); bit_getter_setter!(Self::SOLID_ANGLE_MASK, solid_angle); bit_getter_setter!(Self::TEMPRATURE_MASK, temperature); + bit_getter_setter!(Self::PIXEL_MASK, pixel); } impl std::ops::BitOr for RatioTypeHint { @@ -79,6 +81,7 @@ impl std::fmt::Debug for RatioTypeHint { .field("is_information", &self.is_information()) .field("is_solid_angle", &self.is_solid_angle()) .field("is_temperature", &self.is_temperature()) + .field("is_pixel", &self.is_pixel()) .finish() } } @@ -196,7 +199,7 @@ impl std::ops::Div for Dimension { } impl Dimension { - pub fn zero() -> Self { + pub const fn zero() -> Self { Self { length: 0, mass: 0, @@ -209,10 +212,7 @@ impl Dimension { } } - pub fn angle() -> Self { - let mut ratio_type_hint = RatioTypeHint(0); - ratio_type_hint.set_is_angle(true); - + pub const fn angle() -> Self { Self { length: 0, mass: 0, @@ -221,11 +221,11 @@ impl Dimension { thermodynamic_temprature: 0, amount_of_substance: 0, luminous_intensity: 0, - ratio_type_hint, + ratio_type_hint: RatioTypeHint(RatioTypeHint::ANGLE_KIND_MASK), } } - pub fn length() -> Self { + pub const fn length() -> Self { Self { length: 1, mass: 0, diff --git a/crates/macros/Cargo.toml b/crates/macros/Cargo.toml new file mode 100644 index 0000000..6520800 --- /dev/null +++ b/crates/macros/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "macros" +version = "0.1.0" +edition = "2021" + + +[lib] +proc-macro = true + +[dependencies] +quote = "1.0" +syn = { version = "2.0", features = ["derive"] } +proc-macro2 = "1.0" diff --git a/crates/macros/src/lib.rs b/crates/macros/src/lib.rs new file mode 100644 index 0000000..7d0f4a9 --- /dev/null +++ b/crates/macros/src/lib.rs @@ -0,0 +1,112 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, DeriveInput, Fields, Meta}; + +#[proc_macro_derive(Struct, attributes(default))] +pub fn derive_struct(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let struct_name = input.ident; + + let contains_span = input.generics.type_params().any(|param| param.ident == "S"); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + let struct_name_string = struct_name.to_string(); + let struct_definition_name = struct_name.to_string(); + let struct_definition_name2 = struct_definition_name.clone(); + + let function_generics = if !contains_span { + quote! { } + } else { + quote! {} + }; + + let fields = match input.data { + syn::Data::Struct(data) => match data.fields { + Fields::Named(fields) => fields.named, + _ => panic!("Struct must have named fields."), + }, + _ => { + panic!("Only structs can be made available to scripts."); + } + }; + let define_fields = fields.clone().into_iter().map(|field| { + let name = field.ident.unwrap().to_string(); + let ty = field.ty; + + let mut default = quote! { None }; + + for attribute in field.attrs.iter() { + if let Meta::NameValue(name_value) = &attribute.meta { + if name_value.path.is_ident("default") { + let value = &name_value.value; + default = quote! { Some(crate::script::parsing::Litteral::parse(S::from_str(#value)).unwrap().1) }; + } + } + } + + quote! { + MemberVariable { + name: S::from_str(#name), + ty: MemberVariableType { + ty: <#ty as crate::script::execution::types::TypedObject>::get_type(), + constraints: None, + default_value: #default, + } + } + } + }); + + let extract_fields = fields.clone().into_iter().map(|field| { + let name = field.ident.unwrap(); + let name_string = name.to_string(); + let ty = field.ty; + + quote! { + let #name = members.remove(#name_string).unwrap(); + let #name = #name.downcast::<#ty>(span)?; + } + }); + + let import_fields = fields.clone().into_iter().map(|field| { + let name = field.ident.unwrap(); + quote! { #name } + }); + + quote! { + impl #impl_generics #struct_name #ty_generics #where_clause { + pub fn unpack_struct #function_generics (span: &S, structure: crate::script::execution::types::Structure) -> std::result::Result> { + // Check that it's the correct type. + if structure.name() == #struct_name_string { + let mut members = Rc::unwrap_or_clone(structure.members); + + // Extract fields. + #(#extract_fields)* + + // Import fields into the struct. + Ok(#struct_name { + #(#import_fields),* + }) + } else { + Err(crate::script::execution::Failure::ExpectedGot(span.clone(), #struct_name_string.into(), structure.name().to_string().into())) + } + } + } + impl #impl_generics #struct_name #ty_generics #where_clause { + fn define_struct #function_generics (context: &mut crate::script::execution::ExecutionContext<'_, S>) { + context.stack.new_variable_str( + #struct_definition_name, + StructDefinition { + definition: Rc::new(parsing::StructDefinition { + name: S::from_str(#struct_definition_name2), + members: vec![ + #(#define_fields),* + ], + }), + } + .into(), + ); + } + } + }.into() +} diff --git a/examples/README.md b/examples/README.md index ce0bfed..e68ec32 100644 --- a/examples/README.md +++ b/examples/README.md @@ -78,6 +78,8 @@ Create a simple ring spacer. cargo run -- form examples/fornjot_demos.ccm spacer --output ~/output.stl -- 10mm 5mm 5mm ``` +### Star + Create a star. ``` cargo run -- form examples/fornjot_demos.ccm star --output ~/output.stl -- 5 10mm 5mm 5mm diff --git a/examples/advance_sketches.ccm b/examples/advance_sketches.ccm new file mode 100644 index 0000000..761b0d1 --- /dev/null +++ b/examples/advance_sketches.ccm @@ -0,0 +1,146 @@ + +sketch square(width: Length, height: Length) { + let half_width = width / 2; + let half_height = height / 2; + + let corner_1 = vec2(-half_width, -half_height); + let corner_2 = vec2(half_width, -half_height); + let corner_3 = vec2(half_width, half_height); + let corner_4 = vec2(-half_width, half_height); + + new_sketch(sketch_plane(), [ + new_region(Segments { + start = corner_1, + surface = sketch_plane(), + distance_between_verticies = default, + segments = [ + Line { + end = corner_2 + }, + Line { + end = corner_3 + }, + Line { + end = corner_4 + }, + Line { + end = corner_1 + }, + ] + }), + ]) +} + +solid square_sweep(depth: Length = 2mm, width: Length = 2cm, height: Length = 3cm) { + let square_sketch = square(width, height); + + square_sketch.sweep(global_xy_plane(), vec3(0m, 0m, depth)) +} + +sketch rounded_square(width: Length, height: Length, corner_radius: Length) { + let half_width = width / 2; + let half_height = height / 2; + + print("Half Width: {} Half Height: {}".format(half_width, half_height)); + + let corner_1 = vec2(-half_width, -half_height); + let corner_2 = vec2(half_width, -half_height); + let corner_3 = vec2(half_width, half_height); + let corner_4 = vec2(-half_width, half_height); + + print("Corner 1: ({})x({})".format(corner_1.x, corner_1.y)); + print("Corner 2: ({})x({})".format(corner_2.x, corner_2.y)); + print("Corner 3: ({})x({})".format(corner_3.x, corner_3.y)); + print("Corner 4: ({})x({})".format(corner_4.x, corner_4.y)); + + new_sketch(sketch_plane(), [ + new_region(Segments { + start = corner_1 + vec2(0m, corner_radius), + surface = sketch_plane(), + distance_between_verticies = default, + segments = [ + CenterArc { + center = corner_1 + vec2(corner_radius, corner_radius), + angle = 90deg, + clockwise = false, + }, + Line { + end = corner_2 + vec2(-corner_radius, 0m), + }, + CenterArc { + center = corner_2 + vec2(-corner_radius, corner_radius), + angle = 90deg, + clockwise = false, + }, + Line { + end = corner_3 + vec2(0m, -corner_radius), + }, + CenterArc { + center = corner_3 + vec2(-corner_radius, -corner_radius), + angle = 90deg, + clockwise = false, + }, + Line { + end = corner_4 + vec2(corner_radius, 0m), + }, + CenterArc { + center = corner_4 + vec2(corner_radius, -corner_radius), + angle = 90deg, + clockwise = false, + }, + Line { + end = corner_1 + vec2(0m, corner_radius), + }, + ] + }), + ]) +} + +solid rounded_square_sweep(depth: Length = 2mm, width: Length = 2cm, height: Length = 3cm, corner_radius: Length = 5mm) { + let square_sketch = rounded_square(width, height, corner_radius); + + square_sketch.sweep(global_xy_plane(), vec3(0m, 0m, depth)) +} + +sketch beziers(width: Length, height: Length) { + let half_width = width / 2; + let half_height = height / 2; + + print("Half Width: {} Half Height: {}".format(half_width, half_height)); + + let corner_1 = vec2(-half_width, -half_height); + let corner_2 = vec2(half_width, -half_height); + let corner_3 = vec2(half_width, half_height); + let corner_4 = vec2(-half_width, half_height); + + new_sketch(sketch_plane(), [ + new_region(Segments { + start = corner_1, + surface = sketch_plane(), + distance_between_verticies = default, + segments = [ + Line { + end = corner_2, + }, + QuadraticBezier { + end = corner_3, + handle = vec2(half_width * 2, 0m), + }, + Line { + end = corner_4, + }, + CubicBezier { + end = corner_1, + start_handle = corner_4 + vec2(half_width, 0m), + end_handle = corner_1 + vec2(-half_width, 0m), + }, + ] + }), + ]) +} + +solid beziers_sweep(depth: Length = 2mm, width: Length = 2cm, height: Length = 3cm) { + let beziers_sketch = beziers(width, height); + + beziers_sketch.sweep(global_xy_plane(), vec3(0m, 0m, depth)) +} \ No newline at end of file diff --git a/examples/fornjot_demos.ccm b/examples/fornjot_demos.ccm index 91f8bb0..2b84248 100644 --- a/examples/fornjot_demos.ccm +++ b/examples/fornjot_demos.ccm @@ -1,11 +1,13 @@ solid cuboid(x: Length, y: Length, z: Length) { let base_sketch = new_sketch(Polygon { points = [ - vec2(-x / 2., -y / 2.), - vec2(x / 2., -y / 2.), - vec2(x / 2., y / 2.), - vec2(-x / 2., y / 2.) - ]}); + vec2(-x / 2., -y / 2.), + vec2(x / 2., -y / 2.), + vec2(x / 2., y / 2.), + vec2(-x / 2., y / 2.) + ], + surface = global_xy_plane() + }); base_sketch.sweep(global_xy_plane(), vec3(0cm, 0cm, z)) } @@ -35,10 +37,10 @@ solid spacer(outer_radius: Length, inner_radius: Length, height: Length) { let bottom_surface = global_xy_plane(); let sweep_path = vec3(0mm, 0mm, height); - let base_sketch = new_sketch([ + let base_sketch = new_sketch(global_xy_plane(), [ new_region(RawRegion { - exterior = new_cycle(Circle { center = vec2(0mm, 0mm), radius = outer_radius }), - interiors = [new_cycle(Circle { center = vec2(0mm, 0mm), radius = inner_radius }).reverse()], + exterior = new_cycle(Circle { center = vec2(0mm, 0mm), radius = outer_radius, surface = global_xy_plane() }), + interiors = [new_cycle(Circle { center = vec2(0mm, 0mm), radius = inner_radius, surface = global_xy_plane() }).reverse()], }) ]); @@ -60,17 +62,17 @@ solid star(num_points: Number, r1: Length, r2: Length, h: Length) { let normal_vector = angle.sin_cos(); let point = normal_vector * radius; - outer_points = outer_points.append([point]); - inner_points = inner_points.append([point / 2]); + outer_points.append([point]); + inner_points.append([point / 2]); } let bottom_surface = global_xy_plane(); let sweep_path = vec3(0mm, 0mm, h); - let exterior = new_cycle(Polygon { points = outer_points }); - let interiors = [ new_cycle(Polygon { points = inner_points }).reverse() ]; + let exterior = new_cycle(Polygon { points = outer_points, surface = global_xy_plane() }); + let interiors = [ new_cycle(Polygon { points = inner_points, surface = global_xy_plane() }).reverse() ]; - let base = new_sketch([new_region(RawRegion { + let base = new_sketch(global_xy_plane(), [new_region(RawRegion { exterior = exterior, interiors = interiors, })]); diff --git a/examples/sketches.ccm b/examples/sketches.ccm index 3755e58..ed98a8b 100644 --- a/examples/sketches.ccm +++ b/examples/sketches.ccm @@ -1,16 +1,17 @@ sketch circle(diameter: Length) { - new_sketch(Circle { center = vec2(0mm, 0mm), radius = diameter / 2 }) + new_sketch(Circle { center = vec2(0mm, 0mm), radius = diameter / 2, surface = sketch_plane() }) } sketch square(width: Length) { - new_sketch(Polygon { points = [vec2(0m, 0m), vec2(0m, width), vec2(width, width), vec2(width, 0m)] }) + new_sketch(Polygon { points = [vec2(width, 0m), vec2(width, width), vec2(0m, width), vec2(0m, 0m)], + surface = sketch_plane() }) } sketch square_with_circle(square_width: Length, hole_diameter: Length) { - new_sketch([ - new_region(Circle { center = vec2(0m, 0m), radius = hole_diameter / 2 }), - new_region(Polygon { points = [vec2(hole_diameter, 0m), vec2(0m, square_width), vec2(square_width, square_width), vec2(square_width, 0m)] }) + new_sketch(sketch_plane(), [ + new_region(Circle { center = vec2(0m, 0m), radius = hole_diameter / 2, surface = sketch_plane() }), + new_region(Polygon { points = [vec2(hole_diameter, 0m), vec2(0m, square_width), vec2(square_width, square_width), vec2(square_width, 0m)], surface = sketch_plane() }) ]) } diff --git a/src/main.rs b/src/main.rs index 3175c03..9ddf3c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,7 +18,7 @@ use std::{ fs::{self, File}, - io::{Seek, Write}, + io::{IsTerminal, Seek, Write}, ops::Deref, path::PathBuf, str::FromStr, @@ -26,7 +26,6 @@ use std::{ use anyhow::{anyhow, bail, Context, Result}; use arguments::{ListUnitsArgs, OutputTarget, SolidOutputFormat, TaskOutputFormat}; -use atty::Stream; use clap::Parser; mod arguments; @@ -38,6 +37,8 @@ use fj_core::algorithms::{ }; use fj_export::{export_3mf, export_obj, export_stl}; use fj_math::{Aabb, Point, Scalar as FornjotScalar}; +use imstr::ImString; +use nom_locate::LocatedSpan; use script::{Failure, Runtime, SerializableValue}; use tempfile::SpooledTempFile; use uom::si::{f64::Length, length::millimeter}; @@ -137,13 +138,10 @@ fn form(form_args: arguments::FormArgs) { } None => { // Compute a default tolerance derived from the bounding box. - let aabb = runtime - .global_resources(|global_resources| { - solid - .handle - .deref() - .aabb(&global_resources.fornjot_core.layers.geometry) - }) + let aabb = solid + .handle + .deref() + .aabb(&runtime.global_resources.fornjot_core.layers.geometry) .unwrap_or(Aabb { min: Point::origin(), max: Point::origin(), @@ -163,9 +161,8 @@ fn form(form_args: arguments::FormArgs) { } }; - let mesh = runtime.global_resources_mut(|global_resources| { - (solid.handle.deref(), tolerance).triangulate(&mut global_resources.fornjot_core) - }); + let mesh = (solid.handle.deref(), tolerance) + .triangulate(&mut runtime.global_resources.fornjot_core); match form_args.output { OutputTarget::Stdout => { @@ -178,7 +175,7 @@ fn form(form_args: arguments::FormArgs) { SolidOutputFormat::Obj => false, }; - if is_binary_format && atty::is(Stream::Stdout) { + if is_binary_format && output.is_terminal() { bail!("Refusing to output binary data to terminal."); } @@ -230,8 +227,11 @@ fn trampoline( serialize_action: S, ) -> Result<()> where - A: FnOnce(&mut Runtime, Vec) -> std::result::Result, - S: FnOnce(R, &mut Runtime) -> Result<()>, + A: FnOnce( + &mut Runtime>, + Vec, + ) -> std::result::Result>>, + S: FnOnce(R, &mut Runtime>) -> Result<()>, { fn parse_argument(argument: &str) -> Result { match serde_json::from_str(argument) { @@ -254,9 +254,10 @@ where .context("Script name could not be UTF8 encoded")?; let code = fs::read_to_string(&script).context("Failed to read script into memory")?; + let code: ImString = code.into(); + let code = LocatedSpan::new(code); - let mut runtime = - script::Runtime::load((module_name, code)).context("Failed to load runtime")?; + let mut runtime = script::Runtime::load(module_name, code).context("Failed to load runtime")?; let mut unpacked_arguments = Vec::with_capacity(arguments.len()); diff --git a/src/script/execution/expressions.rs b/src/script/execution/expressions.rs index bcfcbee..d3e20c7 100644 --- a/src/script/execution/expressions.rs +++ b/src/script/execution/expressions.rs @@ -31,10 +31,10 @@ use super::{ type Result = std::result::Result>; // TODO this should not be returning a control flow. -pub fn run_expression<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - expression: &'a Expression, -) -> Result> { +pub fn run_expression( + context: &mut ExecutionContext, + expression: &Expression, +) -> Result> { match expression { Expression::And(a, b) => { let a_value = run_expression(context, a)?; @@ -52,14 +52,14 @@ pub fn run_expression<'a, S: Span>( } } -pub fn run_comparison<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - comparison: &'a Comparison, -) -> Result> { - fn cmp<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - a: &'a Comparison, - b: &'a ArithmeticExpression, +pub fn run_comparison( + context: &mut ExecutionContext, + comparison: &Comparison, +) -> Result> { + fn cmp( + context: &mut ExecutionContext, + a: &Comparison, + b: &ArithmeticExpression, ) -> Result { let value_a = run_comparison(context, a)?; let value_b = run_arithmetic_expression(context, b)?; @@ -84,10 +84,10 @@ pub fn run_comparison<'a, S: Span>( } } -pub fn run_arithmetic_expression<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - expression: &'a ArithmeticExpression, -) -> Result> { +pub fn run_arithmetic_expression( + context: &mut ExecutionContext, + expression: &ArithmeticExpression, +) -> Result> { match expression { ArithmeticExpression::Addition(a, b) => { let value_a = run_arithmetic_expression(context, a)?; @@ -105,10 +105,7 @@ pub fn run_arithmetic_expression<'a, S: Span>( } } -pub fn run_term<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - term: &'a Term, -) -> Result> { +pub fn run_term(context: &mut ExecutionContext, term: &Term) -> Result> { match term { Term::Multiply(a, b) => { let a_value = run_term(context, a)?; @@ -127,10 +124,10 @@ pub fn run_term<'a, S: Span>( } } -pub fn run_trailer<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - trailer: &'a Trailer, -) -> Result> { +pub fn run_trailer( + context: &mut ExecutionContext, + trailer: &Trailer, +) -> Result> { match trailer { Trailer::None(factor) => run_factor(context, factor), Trailer::Attribute(trailer, attribute) => { @@ -180,13 +177,13 @@ pub fn run_trailer<'a, S: Span>( } } -pub fn run_factor<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - factor: &'a Factor, -) -> Result> { +pub fn run_factor( + context: &mut ExecutionContext, + factor: &Factor, +) -> Result> { match factor { Factor::Litteral(litteral) => Value::from_litteral(context, litteral), - Factor::Variable(variable) => context.stack.get_variable(variable).cloned(), + Factor::Variable(variable) => Ok(context.stack.get_variable(variable)?.clone()), Factor::Parenthesis(expression) => run_expression(context, expression), Factor::UnaryPlus(factor) => { run_factor(context, factor)?.unary_plus(context.log, factor.get_span()) @@ -204,266 +201,199 @@ pub fn run_factor<'a, S: Span>( mod test { use super::*; - use common_data_types::Number; + use common_data_types::Float; use crate::script::{ execution::{ types::{function::IntoBuiltinFunction, DefaultValue, List, SString, Scalar}, - Module, ModuleScope, + Module, }, parsing::Litteral, + Runtime, }; #[test] fn expression_straight_number() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("24").unwrap().1)) - ), - Ok(Number::new(24.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("24").unwrap().1), + Ok(Float::new(24.0).unwrap().into()) + ); + }); } #[test] fn expression_logical_operators() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("true").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("false").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - - // Not - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("!true").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("!false").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - - // And - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("false && false").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("true && false").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("false && true").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("true && true").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - - // Or - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("false || false").unwrap().1)) - ), - Ok(Value::Boolean(false)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("true || false").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("false || true").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("true || true").unwrap().1)) - ), - Ok(Value::Boolean(true)) - ); - } - - #[test] - fn value_from_litteral() { - let mut context = ExecutionContext::default(); - - // Scalar - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("22mm").unwrap().1)) - ), - Ok( - Scalar::try_from(uom::si::f64::Length::new::( - 22.0 - )) - .unwrap() - .into() - ) - ); - // Number - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("22").unwrap().1)) - ), - Ok(Number::new(22.0).unwrap().into()) - ); - // String - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("\"test\"").unwrap().1)) - ), - Ok(SString::from("test").into()) - ); - // List - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("[1, 2, 3]").unwrap().1)) - ), - Ok(List::from([ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), - Number::new(3.0).unwrap().into() - ]) - .into()) - ); - // Boolean - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("true").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("false").unwrap().1)) - ), - Ok(false.into()) - ); - // Default - assert_eq!( - Value::from_litteral( - &mut context, - Box::leak(Box::new(Litteral::parse("default").unwrap().1)) - ), - Ok(DefaultValue.into()) - ); - } - - #[test] - fn variable_access() { - let mut context = ExecutionContext::default(); - context.stack.new_variable(&"global_scope", true.into()); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("true").unwrap().1), + Ok(Value::Boolean(true)) + ); + assert_eq!( + run_expression(context, &Expression::parse("false").unwrap().1), + Ok(Value::Boolean(false)) + ); - context.new_scope(|context| { - context.stack.new_variable(&"sub_scope", false.into()); + // Not + assert_eq!( + run_expression(context, &Expression::parse("!true").unwrap().1), + Ok(Value::Boolean(false)) + ); + assert_eq!( + run_expression(context, &Expression::parse("!false").unwrap().1), + Ok(Value::Boolean(true)) + ); + // And assert_eq!( - run_expression( - context, - Box::leak(Box::new(Expression::parse("sub_scope").unwrap().1)) - ), + run_expression(context, &Expression::parse("false && false").unwrap().1), + Ok(Value::Boolean(false)) + ); + assert_eq!( + run_expression(context, &Expression::parse("true && false").unwrap().1), + Ok(Value::Boolean(false)) + ); + assert_eq!( + run_expression(context, &Expression::parse("false && true").unwrap().1), Ok(Value::Boolean(false)) ); + assert_eq!( + run_expression(context, &Expression::parse("true && true").unwrap().1), + Ok(Value::Boolean(true)) + ); + // Or assert_eq!( - run_expression( - context, - Box::leak(Box::new(Expression::parse("global_scope").unwrap().1)) - ), + run_expression(context, &Expression::parse("false || false").unwrap().1), + Ok(Value::Boolean(false)) + ); + assert_eq!( + run_expression(context, &Expression::parse("true || false").unwrap().1), + Ok(Value::Boolean(true)) + ); + assert_eq!( + run_expression(context, &Expression::parse("false || true").unwrap().1), Ok(Value::Boolean(true)) ); + assert_eq!( + run_expression(context, &Expression::parse("true || true").unwrap().1), + Ok(Value::Boolean(true)) + ); + }); + } + #[test] + fn value_from_litteral() { + ExecutionContext::new(&mut Runtime::default(), |context| { + // Scalar assert_eq!( - run_expression( - context, - Box::leak(Box::new(Expression::parse("non_existant_scope").unwrap().1)) - ), - Err(Failure::VariableNotInScope( - "non_existant_scope", - "non_existant_scope".into() - )) + Value::from_litteral(context, &Litteral::parse("22mm").unwrap().1), + Ok( + Scalar::try_from(uom::si::f64::Length::new::( + 22.0 + )) + .unwrap() + .into() + ) + ); + // Number + assert_eq!( + Value::from_litteral(context, &Litteral::parse("22").unwrap().1), + Ok(Float::new(22.0).unwrap().into()) ); + // String + assert_eq!( + Value::from_litteral(context, &Litteral::parse("\"test\"").unwrap().1), + Ok(SString::from("test").into()) + ); + // List + assert_eq!( + Value::from_litteral(context, &Litteral::parse("[1, 2, 3]").unwrap().1), + Ok(List::from([ + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), + Float::new(3.0).unwrap().into() + ]) + .into()) + ); + // Boolean + assert_eq!( + Value::from_litteral(context, &Litteral::parse("true").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + Value::from_litteral(context, &Litteral::parse("false").unwrap().1), + Ok(false.into()) + ); + // Default + assert_eq!( + Value::from_litteral(context, &Litteral::parse("default").unwrap().1), + Ok(DefaultValue.into()) + ); + }); + } + + #[test] + fn variable_access() { + ExecutionContext::new(&mut Runtime::default(), |context| { + context.stack.new_variable(&"global_scope", true.into()); + + context.new_scope(|context| { + context.stack.new_variable(&"sub_scope", false.into()); + + assert_eq!( + run_expression( + context, + Box::leak(Box::new(Expression::parse("sub_scope").unwrap().1)) + ), + Ok(Value::Boolean(false)) + ); + + assert_eq!( + run_expression( + context, + Box::leak(Box::new(Expression::parse("global_scope").unwrap().1)) + ), + Ok(Value::Boolean(true)) + ); + + assert_eq!( + run_expression( + context, + Box::leak(Box::new(Expression::parse("non_existant_scope").unwrap().1)) + ), + Err(Failure::VariableNotInScope( + "non_existant_scope", + "non_existant_scope".into() + )) + ); + }); }); } #[test] fn unary_operators() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("+15").unwrap().1)) - ), - Ok(Number::new(15.0).unwrap().into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("-15").unwrap().1)) - ), - Ok(Number::new(-15.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("+15").unwrap().1), + Ok(Float::new(15.0).unwrap().into()) + ); + + assert_eq!( + run_expression(context, &Expression::parse("-15").unwrap().1), + Ok(Float::new(-15.0).unwrap().into()) + ); + }); } #[test] fn parenthasis() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("(1 + 2) * 3").unwrap().1)) - ), - Ok(Number::new(9.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("(1 + 2) * 3").unwrap().1), + Ok(Float::new(9.0).unwrap().into()) + ); + }); } #[test] @@ -479,304 +409,220 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - - let mut context = ExecutionContext::new(module_scope); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("DefaultStruct { ..default }.value") + ExecutionContext::new(&mut module.into(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("DefaultStruct { ..default }.value") .unwrap() .1 - )) - ), - Ok(Number::new(42.0).unwrap().into()) - ); + ), + Ok(Float::new(42.0).unwrap().into()) + ); + }); } #[test] fn method_call() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("24.25.floor()").unwrap().1)) - ), - Ok(Number::new(24.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("24.25.floor()").unwrap().1), + Ok(Float::new(24.0).unwrap().into()) + ); + }); } #[test] fn call() { - let mut context = ExecutionContext::default(); + ExecutionContext::new(&mut Runtime::default(), |context| { + fn my_function( + _context: &mut ExecutionContext, + _span: &S, + ) -> Result> { + Ok(Float::new(42.0).unwrap().into()) + } - fn my_function<'a, S: Span>( - _context: &mut ExecutionContext<'a, S>, - _span: &S, - ) -> Result> { - Ok(Number::new(42.0).unwrap().into()) - } + let my_function = my_function::<&'static str>.into_builtin_function(); + + context + .stack + .new_variable(&"my_function", my_function.into()); - context.stack.new_variable( - &"my_function", - my_function::<&str>.into_builtin_function().into(), - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("my_function()").unwrap().1)) - ), - Ok(Number::new(42.0).unwrap().into()) - ); + assert_eq!( + run_expression(context, &Expression::parse("my_function()").unwrap().1), + Ok(Float::new(42.0).unwrap().into()) + ); + }); } #[test] fn index() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("[1, 2, 3][0]").unwrap().1)) - ), - Ok(Number::new(1.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("[1, 2, 3][0]").unwrap().1), + Ok(Float::new(1.0).unwrap().into()) + ); + }); } #[test] fn multiply() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 + 2 * 3").unwrap().1)) - ), - Ok(Number::new(7.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("1 + 2 * 3").unwrap().1), + Ok(Float::new(7.0).unwrap().into()) + ); + }); } #[test] fn divide() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("9 / 3").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("9 / 3").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + }); } #[test] fn range() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("..").unwrap().1)) - ), - Ok(Range { - lower_bound: None, - upper_bound_is_inclusive: false, - upper_bound: None - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("..=").unwrap().1)) - ), - Err(Failure::MissingUpperBound("..=")) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("5..").unwrap().1)) - ), - Ok(Range { - lower_bound: Some(Number::new(5.0).unwrap().into()), - upper_bound_is_inclusive: false, - upper_bound: None - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("..5").unwrap().1)) - ), - Ok(Range { - lower_bound: None, - upper_bound_is_inclusive: false, - upper_bound: Some(Number::new(5.0).unwrap().into()) - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("..=5").unwrap().1)) - ), - Ok(Range { - lower_bound: None, - upper_bound_is_inclusive: true, - upper_bound: Some(Number::new(5.0).unwrap().into()) - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("..").unwrap().1), + Ok(Range { + lower_bound: None, + upper_bound_is_inclusive: false, + upper_bound: None + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("..=").unwrap().1), + Err(Failure::MissingUpperBound("..=")) + ); + assert_eq!( + run_expression(context, &Expression::parse("5..").unwrap().1), + Ok(Range { + lower_bound: Some(Float::new(5.0).unwrap().into()), + upper_bound_is_inclusive: false, + upper_bound: None + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("..5").unwrap().1), + Ok(Range { + lower_bound: None, + upper_bound_is_inclusive: false, + upper_bound: Some(Float::new(5.0).unwrap().into()) + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("..=5").unwrap().1), + Ok(Range { + lower_bound: None, + upper_bound_is_inclusive: true, + upper_bound: Some(Float::new(5.0).unwrap().into()) + } + .into()) + ); + }); } #[test] fn addition() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 + 2").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("1 + 2").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + }); } #[test] fn subtraction() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 + 2").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("1 + 2").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + }); } #[test] fn comparisions() { - let mut context = ExecutionContext::default(); - - // LessThan(_, _) - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 < 2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 < 2").unwrap().1)) - ), - Ok(false.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 < 1").unwrap().1)) - ), - Ok(false.into()) - ); - - // LessThanEqual(_, _) - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 <= 2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 <= 2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 <= 1").unwrap().1)) - ), - Ok(false.into()) - ); - - // Equal(_, _) - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 == 2").unwrap().1)) - ), - Ok(false.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 == 2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 == 1").unwrap().1)) - ), - Ok(false.into()) - ); - - // GreaterThanEqual(_, _) - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 >= 2").unwrap().1)) - ), - Ok(false.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 >= 2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 >= 1").unwrap().1)) - ), - Ok(true.into()) - ); - - // GreaterThan(_, _) - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1 > 2").unwrap().1)) - ), - Ok(false.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 > 2").unwrap().1)) - ), - Ok(false.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2 > 1").unwrap().1)) - ), - Ok(true.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + // LessThan(_, _) + assert_eq!( + run_expression(context, &Expression::parse("1 < 2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 < 2").unwrap().1), + Ok(false.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 < 1").unwrap().1), + Ok(false.into()) + ); + + // LessThanEqual(_, _) + assert_eq!( + run_expression(context, &Expression::parse("1 <= 2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 <= 2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 <= 1").unwrap().1), + Ok(false.into()) + ); + + // Equal(_, _) + assert_eq!( + run_expression(context, &Expression::parse("1 == 2").unwrap().1), + Ok(false.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 == 2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 == 1").unwrap().1), + Ok(false.into()) + ); + + // GreaterThanEqual(_, _) + assert_eq!( + run_expression(context, &Expression::parse("1 >= 2").unwrap().1), + Ok(false.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 >= 2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 >= 1").unwrap().1), + Ok(true.into()) + ); + + // GreaterThan(_, _) + assert_eq!( + run_expression(context, &Expression::parse("1 > 2").unwrap().1), + Ok(false.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 > 2").unwrap().1), + Ok(false.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2 > 1").unwrap().1), + Ok(true.into()) + ); + }); } } diff --git a/src/script/execution/failure_message.rs b/src/script/execution/failure_message.rs index ab9836c..b5396b9 100644 --- a/src/script/execution/failure_message.rs +++ b/src/script/execution/failure_message.rs @@ -75,6 +75,8 @@ pub enum Failure { FunctionCall(Box>), CharacterNotInVector(S, char), SwizzleTooLong(S, usize), + CannotBorrowImmutably(S, S), + CannotBorrowMutably(S, S), } impl Failure { @@ -433,6 +435,22 @@ impl std::fmt::Display for Failure { length ) } + Self::CannotBorrowImmutably(span, name) => { + write!( + f, + "{}: Failed to immutably borrow `{}`, because it currently has an exclusively mutable borrow on it", + span.format_span(), + name.as_str() + ) + } + Self::CannotBorrowMutably(span, name) => { + write!( + f, + "{}: Failed to get an exclusively mutable borrow on `{}`, because it already has another borrow on it", + span.format_span(), + name.as_str() + ) + } } } } diff --git a/src/script/execution/mod.rs b/src/script/execution/mod.rs index 4f91c3c..7c5586c 100644 --- a/src/script/execution/mod.rs +++ b/src/script/execution/mod.rs @@ -16,350 +16,55 @@ * program. If not, see . */ -use std::collections::{HashMap, HashSet}; - use crate::script::execution::types::NoneType; -use self::types::{validate_assignment_type, OperatorResult, Scalar}; +use self::{ + stack::ScopeType, + types::{Object, OperatorResult, Scalar}, +}; use super::{ logging::{self, RuntimeLog, StandardLog, UnpackValidationWarnings}, - parsing::{self, Block, CallableBlock}, - Span, + parsing::{self, Block, CallableBlock, MemberVariable}, + Runtime, Span, }; pub mod types; use common_data_types::ConversionFactor; -use compact_str::CompactString; use fj_core::Core; pub use types::print_all_supported_units; -use types::{StructDefinition, UserFunction, Value}; +use types::Value; mod expressions; mod failure_message; mod module; +mod stack; pub mod statements; pub use module::Module; pub use failure_message::Failure; +pub use stack::Stack; -#[derive(Debug)] -enum ScopeType { - Inherited, - Isolated, - Module, - Closure { - references: HashSet, - }, -} - -impl Default for ScopeType { - fn default() -> Self { - Self::Inherited - } -} - -#[derive(Debug)] -struct Scope<'a, S: Span> { - ty: ScopeType, - variables: HashMap>, -} - -impl<'a, S: Span> Default for Scope<'a, S> { - fn default() -> Self { - Self { - ty: ScopeType::Module, - variables: Default::default(), - } - } -} - -macro_rules! optionally_mut_ref { - (mutable $l:lifetime $ty:ty) => { - & $l mut $ty - }; - (immutable $l:lifetime $ty:ty) => { - & $l $ty - }; -} - -macro_rules! generate_variable_getter { - ($self:ident, $span:ident, $name:ident, $iter:ident, $get:ident, $mutable:ident) => { - { - fn check_module_scope<'a, 'b, S: Span>( - mut scope_iterator: impl Iterator)>, - name: &str, - ) -> Option)> { - if let Some(value) = scope_iterator - .find(|scope| matches!(&scope.ty, ScopeType::Module)) - .and_then(|scope| scope.variables.$get(name)) - { - Some(value) - } else { - None - } - } - - // TODO we should refuse to provide module level scopes when doing an immutable access, since those need to be fully immutable. - let mut scope_iterator = $self.scopes[..=$self.active_scope].$iter().rev(); - - for scope in &mut scope_iterator { - if let Some(value) = scope.variables.$get($name) { - return Ok(value); - } - - match &scope.ty { - // This is the scope of a closure. If the variable we are looking for is referenced, keep searching up the stack for it. - ScopeType::Closure { references } => { - if references.contains($name) { - continue; - } else { - // Oh, well then let's skip to the module scope. - if let Some(value) = check_module_scope(scope_iterator, $name) { - return Ok(value); - } - } - break; - } - // If this scope is isolated, then we should skip to the module scope. - ScopeType::Isolated => { - if let Some(value) = check_module_scope(scope_iterator, $name) { - return Ok(value); - } - break; - } - _ => {} - } - } - - Err(Failure::VariableNotInScope( - $span.clone(), - $name.to_string().into(), - )) - } - }; -} - -// TODO do we want to implement a stack limit? -#[derive(Debug)] -pub struct Stack<'a, S: Span> { - scopes: Vec>, - active_scope: usize, -} - -impl<'a, S: Span> Default for Stack<'a, S> { - fn default() -> Self { - Self { - scopes: vec![Scope { - ty: ScopeType::Module, - ..Default::default() - }], - active_scope: 0, - } - } -} - -impl<'a, S: Span> Stack<'a, S> { - pub fn new(module_scope: ModuleScope<'a, S>) -> Self { - let mut root_scope = Scope { - ty: ScopeType::Module, - ..Default::default() - }; - - for (name, definition) in module_scope.structs { - root_scope - .variables - .insert(name.into(), StructDefinition { definition }.into()); - } - - for (name, function) in module_scope.functions { - root_scope.variables.insert( - name.into(), - UserFunction { - block: &function.named_block, - signature: function.signature.clone(), - } - .into(), - ); - } - - for (name, task) in module_scope.tasks { - root_scope.variables.insert( - name.into(), - UserFunction { - block: &task.named_block, - signature: task.signature.clone(), - } - .into(), - ); - } - - for (name, sketch) in module_scope.sketches { - root_scope.variables.insert( - name.into(), - UserFunction { - block: &sketch.named_block, - signature: sketch.signature.clone(), - } - .into(), - ); - } - - for (name, solid) in module_scope.solids { - root_scope.variables.insert( - name.into(), - UserFunction { - block: &solid.named_block, - signature: solid.signature.clone(), - } - .into(), - ); - } - - Self { - scopes: vec![root_scope], - active_scope: 0, - } - } - - fn push_scope( - &mut self, - variables_to_copy: impl Iterator, - mode: ScopeType, - ) -> OperatorResult { - let next_scope_index = self.active_scope + 1; - if next_scope_index >= self.scopes.len() { - self.scopes.push(Scope::default()); - } - - self.scopes[next_scope_index].ty = mode; - - for variable in variables_to_copy { - let value = self.get_variable(variable)?.clone(); - self.scopes[next_scope_index] - .variables - .insert(variable.as_str().into(), value); - } - - self.active_scope = next_scope_index; - - Ok(()) - } - - fn pop_scope(&mut self) { - self.scopes[self.active_scope].variables.clear(); - self.active_scope -= 1; - } - - // TODO Recommending similar named variables would help users to notice typos. - pub fn get_variable(&self, name: &S) -> std::result::Result<&Value<'a, S>, Failure> { - self.get_variable_str(name, name.as_str()) - } - - pub fn get_variable_mut(&mut self, name: &S) -> Result<&mut Value<'a, S>, Failure> { - self.get_variable_str_mut(name, name.as_str()) - } - - pub fn get_variable_str(&self, span: &S, name: &str) -> Result<&Value<'a, S>, Failure> { - generate_variable_getter!(self, span, name, iter, get, immutable) - } - pub fn get_variable_str_mut( - &mut self, - span: &S, - name: &str, - ) -> Result<&mut Value<'a, S>, Failure> { - generate_variable_getter!(self, span, name, iter_mut, get_mut, mutable) - } - - pub fn new_variable(&mut self, name: &S, value: Value<'a, S>) { - self.new_variable_str(name.as_str(), value) - } - - pub fn new_variable_str(&mut self, name: impl Into, value: Value<'a, S>) { - let current_scope = &mut self.scopes[self.active_scope]; - - current_scope.variables.insert(name.into(), value); - } -} - -#[derive(Debug, Default)] -pub struct ModuleScope<'a, S: Span> { - structs: HashMap>, - functions: HashMap>, - tasks: HashMap>, - sketches: HashMap>, - solids: HashMap>, -} - -impl<'a, S: Span> ModuleScope<'a, S> { - pub fn new( - module: &'a Module, /* TODO I want to take in the Runtime at some point so we can resolve imports */ - ) -> Self { - let structs = module - .root_elements - .structs - .iter() - .map(|structure| (structure.name.to_string(), structure)) - .collect(); - - let functions = module - .root_elements - .functions - .iter() - .map(|function| (function.named_block.name.to_string(), function)) - .collect(); - - let tasks = module - .root_elements - .tasks - .iter() - .map(|task| (task.named_block.name.to_string(), task)) - .collect(); - - let sketches = module - .root_elements - .sketches - .iter() - .map(|sketch| (sketch.named_block.name.to_string(), sketch)) - .collect(); - - let solids = module - .root_elements - .solids - .iter() - .map(|wolid| (wolid.named_block.name.to_string(), wolid)) - .collect(); - - Self { - structs, - functions, - tasks, - sketches, - solids, - } - } -} - -pub type ExecutionResult<'a, S, V> = std::result::Result>; +pub type ExecutionResult = std::result::Result>; #[derive(Debug, PartialEq)] -pub enum ControlFlow<'a, S: Span> { +pub enum ControlFlow { Failure(Failure), Break { span: S, label: Option, - value: Value<'a, S>, + value: Value, }, Continue { span: S, label: Option, }, Return { - value: Value<'a, S>, + value: Value, }, } -impl From> for ControlFlow<'_, S> { +impl From> for ControlFlow { fn from(value: Failure) -> Self { Self::Failure(value) } @@ -367,8 +72,6 @@ impl From> for ControlFlow<'_, S> { pub struct GlobalResources { pub fornjot_unit_conversion_factor: &'static ConversionFactor, - - // FIXME we need to unwind the validation messages, otherwise this panics on drop. pub fornjot_core: Core, } @@ -382,44 +85,27 @@ impl Default for GlobalResources { } pub struct ExecutionContext<'a, S: Span> { - pub global_resources: GlobalResources, - pub log: &'a mut dyn RuntimeLog<'a, S>, - pub stack: Stack<'a, S>, -} - -impl<'a, S: Span> Default for ExecutionContext<'a, S> { - fn default() -> Self { - let mut context = Self { - global_resources: Default::default(), - log: StandardLog::global(), - stack: Default::default(), - }; - - // FIXME this registers the global functions as part of the module, - // which is not actually global. This is a bad way to do this because - // other modules won't have access to the global functions. - // TODO add constants: std::constants::PI, Angle::HALF_TURN, Angle::FULL_TURN, Scalar::ZERO for all measurement types, SolidAngle::SPHERE. - types::register_globals(&mut context); - - context - } + pub global_resources: &'a mut GlobalResources, + pub log: &'a mut dyn RuntimeLog, + pub stack: &'a mut Stack, } impl<'a, S: Span> ExecutionContext<'a, S> { - pub fn new(module_scope: ModuleScope<'a, S>) -> Self { + pub fn new(runtime: &'a mut Runtime, run: impl FnOnce(&mut Self) -> R) -> R { let mut context = Self { - global_resources: GlobalResources::default(), + global_resources: &mut runtime.global_resources, log: StandardLog::global(), - stack: Stack::new(module_scope), + stack: &mut runtime.stack, }; // FIXME this registers the global functions as part of the module, // which is not actually global. This is a bad way to do this because // other modules won't have access to the global functions. + // TODO add constants: std::constants::PI, Angle::HALF_TURN, Angle::FULL_TURN, Scalar::ZERO for all measurement types, SolidAngle::SPHERE. types::register_globals(&mut context); logging::register_globals(&mut context); - context + run(&mut context) } pub fn unpack_validation_warnings(&mut self, span: &S) { @@ -449,10 +135,10 @@ impl<'a, S: Span> ExecutionContext<'a, S> { result } - pub fn new_closure_scope( + pub fn new_closure_scope<'s, R>( &mut self, references: impl Iterator>, - copies: impl Iterator, + copies: impl Iterator, scope: impl FnOnce(&mut Self) -> R, ) -> OperatorResult { self.stack.push_scope( @@ -468,10 +154,44 @@ impl<'a, S: Span> ExecutionContext<'a, S> { } } -fn run_block<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - block: &'a Block, -) -> ExecutionResult<'a, S, Value<'a, S>> { +pub fn validate_assignment_type( + context: &mut ExecutionContext, + member: &MemberVariable, + variable_assignment: &S, + value: Value, + value_name: &S, +) -> OperatorResult> { + match value { + Value::Default(_) => { + // They want to use a default value. + if let Some(default) = member.ty.default_value.as_ref() { + Value::from_litteral(context, default) + } else { + Err(Failure::NoDefault( + variable_assignment.clone(), + variable_assignment.clone(), + )) + } + } + // No request for default. Check the type. + value => { + if value.matches_type(&member.ty.ty, context.log, value_name)? { + Ok(value) + } else { + Err(Failure::ExpectedGot( + variable_assignment.clone(), + member.ty.ty.name(), + value.type_name(), + )) + } + } + } +} + +fn run_block( + context: &mut ExecutionContext, + block: &Block, +) -> ExecutionResult> { let mut result = NoneType.into(); for statement in block.statements.iter() { @@ -483,13 +203,13 @@ fn run_block<'a, S: Span>( Ok(result) } -fn run_callable_block<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - block: &'a CallableBlock, - arguments: Vec>, +fn run_callable_block( + context: &mut ExecutionContext, + block: &CallableBlock, + arguments: Vec>, spans: &[parsing::Expression], default_span: &S, -) -> Result, Failure> { +) -> Result, Failure> { // We do not return a ControlFlow because control flow does not // pass through named blocks (we can't continue or break a for loop outside of this named block) match arguments.len().cmp(&block.parameters.len()) { @@ -503,7 +223,8 @@ fn run_callable_block<'a, S: Span>( .chain(std::iter::repeat(default_span)) .zip(arguments.into_iter().zip(&block.parameters)) { - match validate_assignment_type(context, parameter, span, argument) { + match validate_assignment_type(context, parameter, span, argument, ¶meter.name) + { Ok(value) => { context.stack.new_variable(¶meter.name, value); } @@ -553,10 +274,10 @@ mod test { use super::*; use crate::script::{ - execution::{expressions::run_expression, run_block, ExecutionContext, ModuleScope}, + execution::{expressions::run_expression, run_block, ExecutionContext}, parsing::Expression, }; - use common_data_types::Number; + use common_data_types::Float; #[test] fn functions() { @@ -571,13 +292,12 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); + ExecutionContext::new(&mut module.into(), |context| { + let block = parsing::Block::parse("{ my_function(5) }").unwrap().1; - let mut context = ExecutionContext::new(module_scope); - let block = parsing::Block::parse("{ my_function(5) }").unwrap().1; - - let result = run_block(&mut context, Box::leak(Box::new(block))); - assert_eq!(result, Ok(Number::new(5.0).unwrap().into())); + let result = run_block(context, Box::leak(Box::new(block))); + assert_eq!(result, Ok(Float::new(5.0).unwrap().into())); + }); } #[test] @@ -593,13 +313,12 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - - let mut context = ExecutionContext::new(module_scope); - let block = parsing::Block::parse("{ my_function(default) }").unwrap().1; + ExecutionContext::new(&mut module.into(), |context| { + let block = parsing::Block::parse("{ my_function(default) }").unwrap().1; - let result = run_block(&mut context, Box::leak(Box::new(block))); - assert_eq!(result, Ok(Number::new(5.0).unwrap().into())); + let result = run_block(context, Box::leak(Box::new(block))); + assert_eq!(result, Ok(Float::new(5.0).unwrap().into())); + }); } #[test] @@ -615,21 +334,21 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - - let mut context = ExecutionContext::new(module_scope); - let block = parsing::Block::parse("{ let value = 0; my_function(5); value }") - .unwrap() - .1; - - let result = context.new_scope(|context| run_block(context, Box::leak(Box::new(block)))); - assert_eq!( - result, - Err(ControlFlow::Failure(Failure::VariableNotInScope( - "value", - "value".into() - ))) - ); + ExecutionContext::new(&mut module.into(), |context| { + let block = parsing::Block::parse("{ let value = 0; my_function(5); value }") + .unwrap() + .1; + + let result = + context.new_scope(|context| run_block(context, Box::leak(Box::new(block)))); + assert_eq!( + result, + Err(ControlFlow::Failure(Failure::VariableNotInScope( + "value", + "value".into() + ))) + ); + }); } #[test] @@ -645,19 +364,19 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - - let mut context = ExecutionContext::new(module_scope); - let block = parsing::Block::parse("{ my_function() }").unwrap().1; - - let result = context.new_scope(|context| run_block(context, Box::leak(Box::new(block)))); - assert_eq!( - result.unwrap(), - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("MyStruct {}").unwrap().1)) - ) - .unwrap() - ); + ExecutionContext::new(&mut module.into(), |context| { + let block = parsing::Block::parse("{ my_function() }").unwrap().1; + + let result = + context.new_scope(|context| run_block(context, Box::leak(Box::new(block)))); + assert_eq!( + result.unwrap(), + run_expression( + context, + Box::leak(Box::new(Expression::parse("MyStruct {}").unwrap().1)) + ) + .unwrap() + ); + }); } } diff --git a/src/script/execution/module.rs b/src/script/execution/module.rs index 380eef4..2685749 100644 --- a/src/script/execution/module.rs +++ b/src/script/execution/module.rs @@ -48,6 +48,17 @@ enum CallableReference { pub struct Module { pub(super) file_name: String, pub(super) root_elements: RootElements, + span: S, +} + +impl Default for Module { + fn default() -> Self { + Self { + file_name: String::from("default"), + root_elements: Default::default(), + span: S::default(), + } + } } impl Module { @@ -59,7 +70,7 @@ impl Module { let file_name = file_name.into(); let code = code.into(); - let root_elements = Self::load_ast(code)?; + let root_elements = Self::load_ast(code.clone())?; let mut callables = HashMap::new(); // TODO Validation should have its own message types and not be considered a runtime failure. @@ -104,6 +115,7 @@ impl Module { let module = Self { file_name, root_elements, + span: code, }; module.validate(log); @@ -111,6 +123,10 @@ impl Module { Ok(module) } + pub fn get_span(&self) -> &S { + &self.span + } + fn load_ast(code: S) -> Result> { let (_, ast) = parsing::FileAST::parse(code) .map_err(|error| anyhow!("Failed to parse file: {:?}", error))?; @@ -120,16 +136,18 @@ impl Module { let mut functions = Vec::new(); let mut tasks = Vec::new(); let mut sketches = Vec::new(); - let mut widgets = Vec::new(); + let mut solids = Vec::new(); for element in ast.root_elements.into_iter() { match element { parsing::RootElement::Import(import) => imports.push(import), parsing::RootElement::Struct(sstruct) => structs.push(sstruct), - parsing::RootElement::Sketch(sketch) => sketches.push(sketch), - parsing::RootElement::Solid(widget) => widgets.push(widget), - parsing::RootElement::Task(task) => tasks.push(task), - parsing::RootElement::Function(function) => functions.push(function), + parsing::RootElement::Function(function) => match function.signature { + parsing::FunctionSignature::Function { .. } => functions.push(function), + parsing::FunctionSignature::Task { .. } => tasks.push(function), + parsing::FunctionSignature::Sketch { .. } => sketches.push(function), + parsing::FunctionSignature::Solid { .. } => solids.push(function), + }, } } @@ -139,7 +157,7 @@ impl Module { functions, tasks, sketches, - solids: widgets, + solids, }) } @@ -191,9 +209,22 @@ pub(super) struct RootElements { pub(super) imports: Vec>, pub(super) structs: Vec>, pub(super) functions: Vec>, - pub(super) tasks: Vec>, - pub(super) sketches: Vec>, - pub(super) solids: Vec>, + pub(super) tasks: Vec>, + pub(super) sketches: Vec>, + pub(super) solids: Vec>, +} + +impl Default for RootElements { + fn default() -> Self { + Self { + imports: Default::default(), + structs: Default::default(), + functions: Default::default(), + tasks: Default::default(), + sketches: Default::default(), + solids: Default::default(), + } + } } impl RootElements { @@ -289,8 +320,6 @@ impl RootElements { #[cfg(test)] mod test { - use std::rc::Rc; - use crate::script::parsing::{CallableBlock, FunctionSignature, VariableType}; use super::*; @@ -330,7 +359,7 @@ mod test { ); assert_eq!( root.sketches, - [parsing::Sketch { + [parsing::Function { starting_span: "sketch", named_block: parsing::NamedBlock { name: "my_sketch", @@ -340,12 +369,12 @@ mod test { block: parsing::Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Sketch { arguments: vec![] }), + signature: FunctionSignature::Sketch { arguments: vec![] }, }] ); assert_eq!( root.solids, - [parsing::Solid { + [parsing::Function { starting_span: "solid", named_block: parsing::NamedBlock { name: "my_solid", @@ -355,7 +384,7 @@ mod test { block: parsing::Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Solid { arguments: vec![] }), + signature: FunctionSignature::Solid { arguments: vec![] }, }] ); @@ -373,10 +402,10 @@ mod test { block: parsing::Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Length")), arguments: vec![] - }), + }, }] ); } diff --git a/src/script/execution/stack.rs b/src/script/execution/stack.rs new file mode 100644 index 0000000..eca4f15 --- /dev/null +++ b/src/script/execution/stack.rs @@ -0,0 +1,280 @@ +/* + * Copyright 2024 James Carl + * AGPL-3.0-only or AGPL-3.0-or-later + * + * This file is part of Command Cad. + * + * Command CAD is free software: you can redistribute it and/or modify it under the terms of + * the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License along with this + * program. If not, see . + */ + +use std::{ + collections::{HashMap, HashSet}, + rc::Rc, +}; + +use compact_str::CompactString; + +use crate::script::Span; + +use super::{ + types::{OperatorResult, StructDefinition, UserFunction, Value}, + Failure, Module, +}; + +#[derive(Debug)] +pub(super) enum ScopeType { + Inherited, + Isolated, + Module, + Closure { references: HashSet }, +} + +impl Default for ScopeType { + fn default() -> Self { + Self::Inherited + } +} + +#[derive(Debug)] +struct Scope { + ty: ScopeType, + variables: HashMap>, +} + +impl Default for Scope { + fn default() -> Self { + Self { + ty: ScopeType::Module, + variables: Default::default(), + } + } +} + +macro_rules! optionally_mut_ref { + (mutable $l:lifetime $ty:ty) => { + & $l mut $ty + }; + (immutable $l:lifetime $ty:ty) => { + & $l $ty + }; +} + +macro_rules! generate_variable_getter { + ($self:ident, $span:ident, $name:ident, $iter:ident, $get:ident, $mutable:ident) => { + { + fn check_module_scope<'a, 'b, S: Span>( + mut scope_iterator: impl Iterator)>, + name: &str, + ) -> Option)> { + if let Some(value) = scope_iterator + .find(|scope| matches!(&scope.ty, ScopeType::Module)) + .and_then(|scope| scope.variables.$get(name)) + { + Some(value) + } else { + None + } + } + + // TODO we should refuse to provide module level scopes when doing an immutable access, since those need to be fully immutable. + let mut scope_iterator = $self.scopes[..=$self.active_scope].$iter().rev(); + + for scope in &mut scope_iterator { + if let Some(value) = scope.variables.$get($name) { + return Ok(value); + } + + match &scope.ty { + // This is the scope of a closure. If the variable we are looking for is referenced, keep searching up the stack for it. + ScopeType::Closure { references } => { + if references.contains($name) { + continue; + } else { + // Oh, well then let's skip to the module scope. + if let Some(value) = check_module_scope(scope_iterator, $name) { + return Ok(value); + } + } + break; + } + // If this scope is isolated, then we should skip to the module scope. + ScopeType::Isolated => { + if let Some(value) = check_module_scope(scope_iterator, $name) { + return Ok(value); + } + break; + } + _ => {} + } + } + + Err(Failure::VariableNotInScope( + $span.clone(), + $name.to_string().into(), + )) + } + }; +} + +// TODO do we want to implement a stack limit? +#[derive(Debug)] +pub struct Stack { + scopes: Vec>, + active_scope: usize, +} + +impl Default for Stack { + fn default() -> Self { + Self { + scopes: vec![Scope { + ty: ScopeType::Module, + ..Default::default() + }], + active_scope: 0, + } + } +} + +impl Stack { + pub fn new(module: Module) -> Self { + let mut root_scope = Scope { + ty: ScopeType::Module, + ..Default::default() + }; + + let structs = module + .root_elements + .structs + .into_iter() + .map(|structure| (structure.name.to_string(), structure)); + for (name, definition) in structs { + root_scope.variables.insert( + name.into(), + StructDefinition { + definition: Rc::new(definition), + } + .into(), + ); + } + + let functions = module + .root_elements + .functions + .into_iter() + .map(|function| (function.named_block.name.to_string(), function)); + for (name, function) in functions { + root_scope + .variables + .insert(name.into(), UserFunction::new(function).into()); + } + + let tasks = module + .root_elements + .tasks + .into_iter() + .map(|task| (task.named_block.name.to_string(), task)); + for (name, task) in tasks { + root_scope + .variables + .insert(name.into(), UserFunction::new(task).into()); + } + + let sketches = module + .root_elements + .sketches + .into_iter() + .map(|sketch| (sketch.named_block.name.to_string(), sketch)); + for (name, sketch) in sketches { + root_scope + .variables + .insert(name.into(), UserFunction::new(sketch).into()); + } + + let solids = module + .root_elements + .solids + .into_iter() + .map(|wolid| (wolid.named_block.name.to_string(), wolid)); + for (name, solid) in solids { + root_scope + .variables + .insert(name.into(), UserFunction::new(solid).into()); + } + + Self { + scopes: vec![root_scope], + active_scope: 0, + } + } + + pub(super) fn push_scope<'a>( + &mut self, + variables_to_copy: impl Iterator, + mode: ScopeType, + ) -> OperatorResult + where + S: 'a, + { + let next_scope_index = self.active_scope + 1; + if next_scope_index >= self.scopes.len() { + self.scopes.push(Scope::default()); + } + + self.scopes[next_scope_index].ty = mode; + + for variable in variables_to_copy { + let value = self.get_variable(variable)?.clone(); + self.scopes[next_scope_index] + .variables + .insert(variable.as_str().into(), value); + } + + self.active_scope = next_scope_index; + + Ok(()) + } + + pub(super) fn pop_scope(&mut self) { + self.scopes[self.active_scope].variables.clear(); + self.active_scope -= 1; + } + + // TODO Recommending similar named variables would help users to notice typos. + pub fn get_variable(&self, name: &S) -> std::result::Result<&Value, Failure> { + self.get_variable_str(name, name.as_str()) + } + + pub fn get_variable_mut(&mut self, name: &S) -> Result<&mut Value, Failure> { + self.get_variable_str_mut(name, name.as_str()) + } + + pub fn get_variable_str(&self, span: &S, name: &str) -> Result<&Value, Failure> { + generate_variable_getter!(self, span, name, iter, get, immutable) + } + pub fn get_variable_str_mut( + &mut self, + span: &S, + name: &str, + ) -> Result<&mut Value, Failure> { + generate_variable_getter!(self, span, name, iter_mut, get_mut, mutable) + } + + pub fn new_variable(&mut self, name: &S, value: Value) { + self.new_variable_str(name.as_str(), value) + } + + pub fn new_variable_str(&mut self, name: impl Into, value: Value) { + let current_scope = &mut self.scopes[self.active_scope]; + + current_scope.variables.insert(name.into(), value); + } +} diff --git a/src/script/execution/statements.rs b/src/script/execution/statements.rs index f4a16fe..b5d519e 100644 --- a/src/script/execution/statements.rs +++ b/src/script/execution/statements.rs @@ -16,8 +16,10 @@ * program. If not, see . */ +use std::rc::Rc; + use crate::script::{ - execution::Failure, + execution::{types::List, Failure}, parsing::{ self, Assign, AssignableVariable, Break, Continue, For, Function, If, Loop, Match, Return, Statement, While, @@ -28,15 +30,14 @@ use crate::script::{ use super::{ expressions::{self, run_expression}, run_block, - types::{List, StructDefinition, UserFunction}, - types::{NoneType, Object, Value}, + types::{NoneType, Object, /*List, */ StructDefinition, UserFunction, Value}, ControlFlow, ExecutionContext, ExecutionResult, }; -pub fn run_statement<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - statement: &'a Statement, -) -> ExecutionResult<'a, S, Value<'a, S>> { +pub fn run_statement( + context: &mut ExecutionContext, + statement: &Statement, +) -> ExecutionResult> { match statement { Statement::Expression(expression) => Ok(expressions::run_expression(context, expression)?), Statement::Assign(assignment) => run_assignment(context, assignment), @@ -53,22 +54,24 @@ pub fn run_statement<'a, S: Span>( } } -fn assign_values<'a, S: Span>( +fn assign_values( + context: &mut ExecutionContext, to_assign: &parsing::Assignable, assignment_span: &S, source_span: &S, - value: Value<'a, S>, - mut assign: impl FnMut(&S, Value<'a, S>) -> ExecutionResult<'a, S, Value<'a, S>>, -) -> ExecutionResult<'a, S, Value<'a, S>> { - fn assign_single_value<'a, S: Span>( + value: Value, + mut assign: impl FnMut(&mut ExecutionContext, &S, Value) -> ExecutionResult>, +) -> ExecutionResult> { + fn assign_single_value( + context: &mut ExecutionContext, assignment_span: &S, - value: Value<'a, S>, + value: Value, variable: &AssignableVariable, - assign: impl FnOnce(&S, Value<'a, S>) -> ExecutionResult<'a, S, Value<'a, S>>, - ) -> ExecutionResult<'a, S, Value<'a, S>> { + assign: impl FnOnce(&mut ExecutionContext, &S, Value) -> ExecutionResult>, + ) -> ExecutionResult> { if let Some(ty) = &variable.ty { - if value.matches_type(ty) { - assign(&variable.name, value) + if value.matches_type(ty, context.log, assignment_span)? { + assign(context, &variable.name, value) } else { Err(ControlFlow::Failure(Failure::ExpectedGot( assignment_span.clone(), @@ -77,25 +80,26 @@ fn assign_values<'a, S: Span>( ))) } } else { - assign(&variable.name, value) + assign(context, &variable.name, value) } } match to_assign { parsing::Assignable::Variable(variable) => { - assign_single_value(assignment_span, value, variable, &mut assign) + assign_single_value(context, assignment_span, value, variable, &mut assign) } - parsing::Assignable::List(_span, variables) => { + parsing::Assignable::List(span, variables) => { let values = value.downcast::>(source_span)?; - if values.len() != variables.len() { + if values.len(span)? != variables.len() { return Err(ControlFlow::Failure(Failure::ListLengthsDontMatch( source_span.clone(), ))); } - for (variable, value) in variables.iter().zip(values.iter().cloned()) { - assign_single_value(assignment_span, value, variable, &mut assign)?; + let value_iter = values.iter(span)?; + for (variable, value) in variables.iter().zip(value_iter) { + assign_single_value(context, assignment_span, value, variable, &mut assign)?; } Ok(NoneType.into()) @@ -103,20 +107,24 @@ fn assign_values<'a, S: Span>( } } -fn run_assignment<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - assignment: &'a Assign, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_assignment( + context: &mut ExecutionContext, + assignment: &Assign, +) -> ExecutionResult> { let value = run_statement(context, &assignment.statement)?; if assignment.is_new { - let assign = |name: &S, value: Value<'a, S>| -> ExecutionResult<'a, S, Value<'a, S>> { + let assign = |context: &mut ExecutionContext, + name: &S, + value: Value| + -> ExecutionResult> { context.stack.new_variable(name, value); Ok(NoneType.into()) }; assign_values( + context, &assignment.to_assign, assignment.get_span(), assignment.statement.get_span(), @@ -124,16 +132,18 @@ fn run_assignment<'a, S: Span>( assign, ) } else { - let stack = &mut context.stack; - - let assign = |name: &S, value: Value<'a, S>| -> ExecutionResult<'a, S, Value<'a, S>> { - let variable = stack.get_variable_mut(name)?; + let assign = |context: &mut ExecutionContext, + name: &S, + value: Value| + -> ExecutionResult> { + let variable = context.stack.get_variable_mut(name)?; *variable = value; Ok(NoneType.into()) }; assign_values( + context, &assignment.to_assign, assignment.get_span(), assignment.statement.get_span(), @@ -143,10 +153,10 @@ fn run_assignment<'a, S: Span>( } } -fn run_return<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - return_statement: &'a Return, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_return( + context: &mut ExecutionContext, + return_statement: &Return, +) -> ExecutionResult> { let value = if let Some(expression) = return_statement.expression.as_ref() { run_expression(context, expression)? } else { @@ -156,10 +166,10 @@ fn run_return<'a, S: Span>( Err(ControlFlow::Return { value }) } -fn run_if<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - if_statement: &'a If, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_if( + context: &mut ExecutionContext, + if_statement: &If, +) -> ExecutionResult> { let condition = expressions::run_expression(context, &if_statement.expression)?; if condition.downcast::(if_statement.expression.get_span())? { @@ -175,33 +185,35 @@ fn run_if<'a, S: Span>( } } -fn run_match<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - match_statement: &'a Match, -) -> ExecutionResult<'a, S, Value<'a, S>> { - fn check_branch_matches<'a, S: Span>( - value: &Value<'a, S>, - branch_value: &Value<'a, S>, - ) -> bool { +fn run_match( + context: &mut ExecutionContext, + match_statement: &Match, +) -> ExecutionResult> { + fn check_branch_matches( + span: &S, + value: &Value, + branch_value: &Value, + ) -> ExecutionResult { if value == branch_value || matches!(branch_value, &Value::Default(_)) { - true + Ok(true) } else if let (Value::List(value_list), Value::List(branch_value_list)) = (value, branch_value) { // These are lists. We need to check the individual components. - if value_list.len() == branch_value_list.len() { - for (value, branch_value) in value_list.iter().zip(branch_value_list.iter()) { - if !check_branch_matches(value, branch_value) { - return false; + if value_list.len(span)? == branch_value_list.len(span)? { + let branch_value_list = branch_value_list.iter(span)?; + for (value, branch_value) in value_list.iter(span)?.zip(branch_value_list) { + if !check_branch_matches(span, &value, &branch_value)? { + return Ok(false); } } - true + Ok(true) } else { - false + Ok(false) } } else { - false + Ok(false) } } @@ -211,7 +223,7 @@ fn run_match<'a, S: Span>( for branch in match_statement.branches.iter() { let branch_value = Value::from_litteral(context, &branch.litteral)?; - if check_branch_matches(&value, &branch_value) { + if check_branch_matches(branch.litteral.get_span(), &value, &branch_value)? { return context.new_scope(|context| run_block(context, &branch.block)); } } @@ -221,15 +233,15 @@ fn run_match<'a, S: Span>( ))) } -fn loop_impl<'a, S, F>( +fn loop_impl( mut loop_control: F, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, name: Option<&S>, - block: &'a parsing::Block, -) -> ExecutionResult<'a, S, Value<'a, S>> + block: &parsing::Block, +) -> ExecutionResult> where S: Span, - F: FnMut(&mut ExecutionContext<'a, S>) -> ExecutionResult<'a, S, bool>, + F: FnMut(&mut ExecutionContext) -> ExecutionResult, { context.new_scope(|context| { loop { @@ -316,10 +328,10 @@ where }) } -fn run_for<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - for_statement: &'a For, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_for( + context: &mut ExecutionContext, + for_statement: &For, +) -> ExecutionResult> { let iter_expression = run_expression(context, &for_statement.iterator_expression)?; let mut iterator = iter_expression.iterate(context.log, for_statement.iterator_expression.get_span())?; @@ -327,13 +339,18 @@ fn run_for<'a, S: Span>( loop_impl( |context| { if let Some(next_value) = iterator.next() { - let assign = - |name: &S, value: Value<'a, S>| -> ExecutionResult<'a, S, Value<'a, S>> { - context.stack.new_variable(name, value); + let assign = |context: &mut ExecutionContext, + name: &S, + value: Value| + -> ExecutionResult> { + context.stack.new_variable(name, value); + + Ok(NoneType.into()) + }; + let next_value = next_value.clone(); - Ok(NoneType.into()) - }; assign_values( + context, &for_statement.variable_assignment, for_statement.variable_assignment.get_span(), for_statement.iterator_expression.get_span(), @@ -352,10 +369,10 @@ fn run_for<'a, S: Span>( ) } -fn run_while<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - while_statement: &'a While, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_while( + context: &mut ExecutionContext, + while_statement: &While, +) -> ExecutionResult> { loop_impl( |context| { Ok(run_expression(context, &while_statement.expression)? @@ -367,10 +384,10 @@ fn run_while<'a, S: Span>( ) } -fn run_loop<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - loop_statement: &'a Loop, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_loop( + context: &mut ExecutionContext, + loop_statement: &Loop, +) -> ExecutionResult> { loop_impl( |_context| Ok(true), context, @@ -379,10 +396,10 @@ fn run_loop<'a, S: Span>( ) } -fn run_break<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - break_statement: &'a Break, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_break( + context: &mut ExecutionContext, + break_statement: &Break, +) -> ExecutionResult> { let value = if let Some(expression) = &break_statement.expression { run_expression(context, expression)? } else { @@ -396,487 +413,547 @@ fn run_break<'a, S: Span>( }) } -fn run_continue<'a, S: Span>( +fn run_continue( _context: &mut ExecutionContext, - continue_statement: &'a Continue, -) -> ExecutionResult<'a, S, Value<'a, S>> { + continue_statement: &Continue, +) -> ExecutionResult> { Err(ControlFlow::Continue { span: continue_statement.get_span().clone(), label: continue_statement.loop_name.clone(), }) } -fn run_define_function<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - function: &'a Function, -) -> ExecutionResult<'a, S, Value<'a, S>> { +fn run_define_function( + context: &mut ExecutionContext, + function: &Rc>, +) -> ExecutionResult> { context.stack.new_variable( &function.named_block.name, - UserFunction { - block: &function.named_block, - signature: function.signature.clone(), - } - .into(), + UserFunction::from(function).into(), ); Ok(NoneType.into()) } -fn run_define_structure<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - definition: &'a parsing::StructDefinition, -) -> ExecutionResult<'a, S, Value<'a, S>> { - context - .stack - .new_variable(&definition.name, StructDefinition { definition }.into()); +fn run_define_structure( + context: &mut ExecutionContext, + definition: &Rc>, +) -> ExecutionResult> { + context.stack.new_variable( + &definition.name, + StructDefinition { + definition: Rc::clone(definition), + } + .into(), + ); Ok(NoneType.into()) } #[cfg(test)] mod test { - use crate::script::execution::{ControlFlow, Failure}; - use common_data_types::Number; + use crate::script::{ + execution::{ControlFlow, Failure}, + Runtime, + }; + use common_data_types::Float; use super::*; #[test] fn assignment() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("value = 1").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Err(ControlFlow::Failure(Failure::VariableNotInScope( - "value", - "value".into(), - ))) - ); - assert!(context.stack.get_variable(&"value").is_err()); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement(context, &parsing::Statement::parse("value = 1").unwrap().1), + Err(ControlFlow::Failure(Failure::VariableNotInScope( + "value", + "value".into(), + ))) + ); + assert!(context.stack.get_variable(&"value").is_err()); - let statement = parsing::Statement::parse("let value = 1").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let value = 1").unwrap().1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(1.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("value = 2").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(2.0).unwrap().into()) - ); + assert_eq!( + run_statement(context, &parsing::Statement::parse("value = 2").unwrap().1), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(2.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("let [one, two] = [1, 2]") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"one"), - Ok(&Number::new(1.0).unwrap().into()) - ); - assert_eq!( - context.stack.get_variable(&"two"), - Ok(&Number::new(2.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let [one, two] = [1, 2]") + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"one"), + Ok(&Float::new(1.0).unwrap().into()) + ); + assert_eq!( + context.stack.get_variable(&"two"), + Ok(&Float::new(2.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("[one, two] = [3, 4]").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"one"), - Ok(&Number::new(3.0).unwrap().into()) - ); - assert_eq!( - context.stack.get_variable(&"two"), - Ok(&Number::new(4.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("[one, two] = [3, 4]").unwrap().1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"one"), + Ok(&Float::new(3.0).unwrap().into()) + ); + assert_eq!( + context.stack.get_variable(&"two"), + Ok(&Float::new(4.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("let [one, two] = [1, 2, 3]") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Err(ControlFlow::Failure(Failure::ListLengthsDontMatch("["))) - ); - let statement = parsing::Statement::parse("let [one, two] = [1]").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Err(ControlFlow::Failure(Failure::ListLengthsDontMatch("["))) - ); - let statement = parsing::Statement::parse("let [one, two] = 1").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Err(ControlFlow::Failure(Failure::ExpectedGot( - "1", - "List".into(), - "Number".into() - ))) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let [one, two] = [1, 2, 3]") + .unwrap() + .1 + ), + Err(ControlFlow::Failure(Failure::ListLengthsDontMatch("["))) + ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let [one, two] = [1]").unwrap().1 + ), + Err(ControlFlow::Failure(Failure::ListLengthsDontMatch("["))) + ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let [one, two] = 1").unwrap().1 + ), + Err(ControlFlow::Failure(Failure::ExpectedGot( + "1", + "List".into(), + "Number".into() + ))) + ); + }); } #[test] fn assign_scopes() { - let mut context = ExecutionContext::default(); - context - .stack - .new_variable(&"one", Number::new(1.0).unwrap().into()); - context - .stack - .new_variable(&"value", Number::new(1.0).unwrap().into()); - - context.new_scope(|context| { - let statement = parsing::Statement::parse("let one = 2").unwrap().1; - assert_eq!( - run_statement(context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + context + .stack + .new_variable(&"one", Float::new(1.0).unwrap().into()); + context + .stack + .new_variable(&"value", Float::new(1.0).unwrap().into()); + + context.new_scope(|context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("let one = 2").unwrap().1 + ), + Ok(NoneType.into()) + ); + + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(1.0).unwrap().into()) + ); + assert_eq!( + run_statement(context, &parsing::Statement::parse("value = 2").unwrap().1), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(2.0).unwrap().into()) + ); + }); assert_eq!( context.stack.get_variable(&"value"), - Ok(&Number::new(1.0).unwrap().into()) - ); - let statement = parsing::Statement::parse("value = 2").unwrap().1; - assert_eq!( - run_statement(context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) + Ok(&Float::new(2.0).unwrap().into()) ); assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(2.0).unwrap().into()) + context.stack.get_variable(&"one"), + Ok(&Float::new(1.0).unwrap().into()) ); }); - - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(2.0).unwrap().into()) - ); - assert_eq!( - context.stack.get_variable(&"one"), - Ok(&Number::new(1.0).unwrap().into()) - ); } #[test] fn loop_statement() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("loop { break; }").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("loop { break; }").unwrap().1 + ), + Ok(NoneType.into()) + ); + }); } #[test] fn if_statement() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("if true { 1.0 }").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(1.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if true { 1.0 }").unwrap().1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("if false { 1.0 }").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if false { 1.0 }").unwrap().1 + ), + Ok(NoneType.into()) + ); - let statement = parsing::Statement::parse("if true { 1.0 } else { 2.0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if true { 1.0 } else { 2.0 }") + .unwrap() + .1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("if false { 1.0 } else { 2.0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(2.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if false { 1.0 } else { 2.0 }") + .unwrap() + .1 + ), + Ok(Float::new(2.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("if false { 1.0 } else if true { 2.0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(2.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if false { 1.0 } else if true { 2.0 }") + .unwrap() + .1 + ), + Ok(Float::new(2.0).unwrap().into()) + ); - let statement = parsing::Statement::parse("if true { 1.0 } else if true { 2.0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("if true { 1.0 } else if true { 2.0 }") + .unwrap() + .1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); - let statement = - parsing::Statement::parse("if false { 1.0 } else if false { 2.0 } else { 3.0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(Number::new(3.0).unwrap().into()) - ); + assert_eq!( + run_statement( + context, + &parsing::Statement::parse( + "if false { 1.0 } else if false { 2.0 } else { 3.0 }" + ) + .unwrap() + .1 + ), + Ok(Float::new(3.0).unwrap().into()) + ); + }); } #[test] fn break_statement() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("loop { break; }").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("loop { break; }").unwrap().1 + ), + Ok(NoneType.into()) + ); - let block = parsing::Block::parse( - "{ let test_one = 0; loop { test_one = 1; break; test_one = 2 } }", - ) - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"test_one"), - Ok(&Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ let test_one = 0; loop { test_one = 1; break; test_one = 2 } }", + ) + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"test_one"), + Ok(&Float::new(1.0).unwrap().into()) + ); - let block = parsing::Block::parse( + assert_eq!( + run_block(context, &parsing::Block::parse( "{ let test_one = 0; loop { if test_one >= 5 { break; } test_one = test_one + 1; } }", ) .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"test_one"), - Ok(&Number::new(5.0).unwrap().into()) - ); + .1), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"test_one"), + Ok(&Float::new(5.0).unwrap().into()) + ); - let block = parsing::Block::parse( - "{ let test_one = 0; 'parent: loop { loop { break 'parent; } test_one = 1 } }", - ) - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"test_one"), - Ok(&Number::new(0.0).unwrap().into()) - ); + assert_eq!( + run_block(context, &parsing::Block::parse( + "{ let test_one = 0; 'parent: loop { loop { break 'parent; } test_one = 1 } }", + ) + .unwrap() + .1), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"test_one"), + Ok(&Float::new(0.0).unwrap().into()) + ); - let block = parsing::Block::parse("{ loop { break 1.0; } }").unwrap().1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse("{ loop { break 1.0; } }").unwrap().1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); + }); } #[test] fn continue_statement() { - let mut context = ExecutionContext::default(); - - let block = parsing::Block::parse( - "{ let a = 0; let b = false; loop { a = a + 1; if a >= 2 { break; } continue; b = true; } }", - ) - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_block(context, &parsing::Block::parse( + "{ let a = 0; let b = false; loop { a = a + 1; if a >= 2 { break; } continue; b = true; } }", + ) + .unwrap() + .1), Ok(NoneType.into()) ); - assert_eq!(context.stack.get_variable(&"b"), Ok(&false.into())); + assert_eq!(context.stack.get_variable(&"b"), Ok(&false.into())); - let block = parsing::Block::parse( + assert_eq!( + run_block(context, &parsing::Block::parse( "{ let a = 0; let b = false; 'parent: loop { a = a + 1; if a >= 2 { break; } loop { continue 'parent; } b = true; } }", ) .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), + .1), Ok(NoneType.into()) ); - assert_eq!(context.stack.get_variable(&"b"), Ok(&false.into())); + assert_eq!(context.stack.get_variable(&"b"), Ok(&false.into())); + }); } #[test] fn while_statement() { - let mut context = ExecutionContext::default(); - - let block = - parsing::Block::parse("{ let count = 0; while count < 5 { count = count + 1; } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"count"), - Ok(&Number::new(5.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ let count = 0; while count < 5 { count = count + 1; } }" + ) + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"count"), + Ok(&Float::new(5.0).unwrap().into()) + ); + }); } #[test] fn for_statement() { - let mut context = ExecutionContext::default(); - - let block = - parsing::Block::parse("{ let count = 0; for i in 0..5 { count = count + 1; } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"count"), - Ok(&Number::new(5.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ let count = 0; for i in 0..5 { count = count + 1; } }" + ) + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"count"), + Ok(&Float::new(5.0).unwrap().into()) + ); - let block = - parsing::Block::parse("{ let count = 0; for i in 0..5 { count = count + i; } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"count"), - Ok(&Number::new(10.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ let count = 0; for i in 0..5 { count = count + i; } }" + ) + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"count"), + Ok(&Float::new(10.0).unwrap().into()) + ); - let block = parsing::Block::parse( + assert_eq!( + run_block(context, &parsing::Block::parse( "{ let a = 0; let b = 0; for [x, y] in [[1, 2], [3, 4]] { a = a + x; b = b + y; } }", ) .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - assert_eq!( - context.stack.get_variable(&"a"), - Ok(&Number::new(4.0).unwrap().into()) - ); - assert_eq!( - context.stack.get_variable(&"b"), - Ok(&Number::new(6.0).unwrap().into()) - ); + .1), + Ok(NoneType.into()) + ); + assert_eq!( + context.stack.get_variable(&"a"), + Ok(&Float::new(4.0).unwrap().into()) + ); + assert_eq!( + context.stack.get_variable(&"b"), + Ok(&Float::new(6.0).unwrap().into()) + ); + }); } #[test] fn match_statement() { - let mut context = ExecutionContext::default(); - - let block = parsing::Block::parse("{ match 1 { 1 => true, default => false } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(true.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_block( + context, + &parsing::Block::parse("{ match 1 { 1 => true, default => false } }") + .unwrap() + .1 + ), + Ok(true.into()) + ); - let block = parsing::Block::parse("{ match 2 { 1 => true, default => false } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(false.into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse("{ match 2 { 1 => true, default => false } }") + .unwrap() + .1 + ), + Ok(false.into()) + ); - let block = - parsing::Block::parse("{ match [1, 2] { [1, 1] => 2, [1, 2] => 1, default => 0 } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ match [1, 2] { [1, 1] => 2, [1, 2] => 1, default => 0 } }" + ) + .unwrap() + .1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); - let block = - parsing::Block::parse("{ match [1, 1] { [1, 1] => 2, [1, 2] => 1, default => 0 } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(Number::new(2.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse( + "{ match [1, 1] { [1, 1] => 2, [1, 2] => 1, default => 0 } }" + ) + .unwrap() + .1 + ), + Ok(Float::new(2.0).unwrap().into()) + ); - let block = parsing::Block::parse("{ match [1, 2] { [1, default] => 1, default => 0 } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse("{ match [1, 2] { [1, default] => 1, default => 0 } }") + .unwrap() + .1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); - let block = parsing::Block::parse("{ match [1, 1] { [1, default] => 1, default => 0 } }") - .unwrap() - .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(Number::new(1.0).unwrap().into()) - ); + assert_eq!( + run_block( + context, + &parsing::Block::parse("{ match [1, 1] { [1, default] => 1, default => 0 } }") + .unwrap() + .1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); + }); } #[test] fn define_function() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("function my_function() -> Number { 0 }") - .unwrap() - .1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("function my_function() -> Number { 0 }") + .unwrap() + .1 + ), + Ok(NoneType.into()) + ); - assert!(matches!( - context.stack.get_variable(&"my_function"), - Ok(Value::UserFunction(_)) - )); + assert!(matches!( + context.stack.get_variable(&"my_function"), + Ok(Value::UserFunction(_)) + )); + }); } #[test] fn define_structure() { - let mut context = ExecutionContext::default(); - - let statement = parsing::Statement::parse("struct MyStruct {}").unwrap().1; - assert_eq!( - run_statement(&mut context, Box::leak(Box::new(statement))), - Ok(NoneType.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_statement( + context, + &parsing::Statement::parse("struct MyStruct {}").unwrap().1 + ), + Ok(NoneType.into()) + ); - assert!(matches!( - context.stack.get_variable(&"MyStruct"), - Ok(Value::StructDefinition(_)) - )); + assert!(matches!( + context.stack.get_variable(&"MyStruct"), + Ok(Value::StructDefinition(_)) + )); + }); } } diff --git a/src/script/execution/types/boolean.rs b/src/script/execution/types/boolean.rs index fe714f8..a6698be 100644 --- a/src/script/execution/types/boolean.rs +++ b/src/script/execution/types/boolean.rs @@ -23,19 +23,24 @@ use crate::script::{logging::RuntimeLog, parsing::VariableType, Span}; use super::{ serializable::SerializableValue, string::formatting::{Style, UnsupportedMessage, UnwrapFormattingResult}, - NamedObject, Object, OperatorResult, Value, + NamedObject, Object, OperatorResult, TypedObject, Value, }; pub type Boolean = bool; -impl<'a, S: Span> Object<'a, S> for Boolean { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Boolean) +impl Object for Boolean { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Boolean)) } fn format( &self, - _log: &mut dyn RuntimeLog, + _context: &mut dyn RuntimeLog, span: &S, f: &mut dyn Write, style: Style, @@ -58,7 +63,7 @@ impl<'a, S: Span> Object<'a, S> for Boolean { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, + rhs: &Value, ) -> OperatorResult { let rhs = rhs.downcast_ref::(span)?; Ok(*self == *rhs) @@ -68,8 +73,8 @@ impl<'a, S: Span> Object<'a, S> for Boolean { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref(span)?; Ok((*self && *rhs).into()) } @@ -78,8 +83,8 @@ impl<'a, S: Span> Object<'a, S> for Boolean { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref(span)?; Ok((*self || *rhs).into()) } @@ -88,8 +93,8 @@ impl<'a, S: Span> Object<'a, S> for Boolean { &self, _log: &mut dyn RuntimeLog, _span: &S, - ) -> OperatorResult> { - Ok((!(*self)).into()) + ) -> OperatorResult> { + Ok((!self).into()) } fn export( @@ -101,6 +106,12 @@ impl<'a, S: Span> Object<'a, S> for Boolean { } } +impl TypedObject for Boolean { + fn get_type() -> VariableType { + VariableType::Boolean + } +} + impl NamedObject for Boolean { fn static_type_name() -> &'static str { "Boolean" diff --git a/src/script/execution/types/closure.rs b/src/script/execution/types/closure.rs index e828e3c..11762e0 100644 --- a/src/script/execution/types/closure.rs +++ b/src/script/execution/types/closure.rs @@ -16,35 +16,40 @@ * program. If not, see . */ -use std::{fmt::Debug, rc::Rc}; +use std::rc::Rc; use crate::script::{ execution::{run_callable_block, ExecutionContext}, - parsing::{self, CapturedVariable, Expression, FunctionSignature, VariableType}, + logging::RuntimeLog, + parsing::{self, CapturedVariable, Expression, VariableType}, Span, }; use super::{NamedObject, Object, OperatorResult, Value}; #[derive(Clone)] -pub struct Closure<'a, S: Span> { - pub closure: &'a parsing::Closure, - pub signature: Rc>, +pub struct Closure { + pub source: Rc>, } -impl<'a, S: Span> Object<'a, S> for Closure<'a, S> { - fn matches_type(&self, _ty: &VariableType) -> bool { - false +impl Object for Closure { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(false) } fn call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, spans: &[Expression], - ) -> OperatorResult> { - let referenced_variables = self.closure.captured_variables.iter().filter_map(|v| { + ) -> OperatorResult> { + let referenced_variables = self.source.captured_variables.iter().filter_map(|v| { if let CapturedVariable::Reference(name) = v { Some(name.as_str()) } else { @@ -52,7 +57,7 @@ impl<'a, S: Span> Object<'a, S> for Closure<'a, S> { } }); - let copied_variables = self.closure.captured_variables.iter().filter_map(|v| { + let copied_variables = self.source.captured_variables.iter().filter_map(|v| { if let CapturedVariable::Copy(name) = v { Some(name) } else { @@ -61,33 +66,34 @@ impl<'a, S: Span> Object<'a, S> for Closure<'a, S> { }); context.new_closure_scope(referenced_variables, copied_variables, |context| { - run_callable_block(context, &self.closure.callable, arguments, spans, span) + run_callable_block(context, &self.source.callable, arguments, spans, span) })? } } -impl<'a, S: Span> From<&'a parsing::Closure> for Closure<'a, S> { - fn from(closure: &'a parsing::Closure) -> Self { +impl<'a, S: Span> From<&'a Rc>> for Closure { + fn from(source: &'a Rc>) -> Self { Self { - signature: closure.signature.clone(), - closure, + source: Rc::clone(source), } } } -impl<'a, S: Span> Debug for Closure<'a, S> { +impl std::fmt::Debug for Closure { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("UserFunction").finish() + f.debug_struct("Closure") + .field("address", &Rc::as_ptr(&self.source)) + .finish() } } -impl<'a, S: Span> PartialEq for Closure<'a, S> { +impl PartialEq for Closure { fn eq(&self, _other: &Self) -> bool { false } } -impl<'a, S: Span> NamedObject for Closure<'a, S> { +impl NamedObject for Closure { fn static_type_name() -> &'static str { "Closure" } @@ -95,117 +101,119 @@ impl<'a, S: Span> NamedObject for Closure<'a, S> { #[cfg(test)] mod test { - use common_data_types::Number; + use common_data_types::Float; - use crate::script::execution::{ - expressions::run_expression, run_block, types::NoneType, ControlFlow, Failure, + use crate::script::{ + execution::{ + expressions::run_expression, run_block, types::NoneType, ControlFlow, Failure, + }, + Runtime, }; use super::*; #[test] fn call_closure() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("[]() -> Number { 1 }()").unwrap().1 - )) - ), - Ok(Number::new(1.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("[]() -> Number { 1 }()").unwrap().1 + ), + Ok(Float::new(1.0).unwrap().into()) + ); + }); } #[test] fn closure_hygene() { - let mut context = ExecutionContext::default(); - let block = parsing::Block::parse( - "{ let closure = []() -> Number { let value = 1; }; closure(); }", - ) - .unwrap() - .1; + ExecutionContext::new(&mut Runtime::default(), |context| { + let block = parsing::Block::parse( + "{ let closure = []() -> Number { let value = 1; }; closure(); }", + ) + .unwrap() + .1; - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Ok(NoneType.into()) - ); - - assert_eq!( - context.stack.get_variable(&"value"), - Err(Failure::VariableNotInScope("value", "value".into())) - ); - - let block = - parsing::Block::parse("{ let closure = []() -> Number { value = 1; }; closure(); }") - .unwrap() - .1; - - assert_eq!( - run_block(&mut context, Box::leak(Box::new(block))), - Err(ControlFlow::Failure(Failure::VariableNotInScope( - "value", - "value".into() - ))) - ); - - let block = parsing::Block::parse( - "{ let value = 2; let closure = []() -> Number { value = 1; }; closure(); }", - ) - .unwrap() - .1; + assert_eq!(run_block(context, &block), Ok(NoneType.into())); - // Running the test right on the module scope creates issues, so we need to create a new scope. - context.new_scope(|context| { assert_eq!( - run_block(context, Box::leak(Box::new(block))), + context.stack.get_variable(&"value"), + Err(Failure::VariableNotInScope("value", "value".into())) + ); + + let block = parsing::Block::parse( + "{ let closure = []() -> Number { value = 1; }; closure(); }", + ) + .unwrap() + .1; + + assert_eq!( + run_block(context, &block), Err(ControlFlow::Failure(Failure::VariableNotInScope( "value", "value".into() ))) ); - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(2.0).unwrap().into()) - ); + let block = parsing::Block::parse( + "{ let value = 2; let closure = []() -> Number { value = 1; }; closure(); }", + ) + .unwrap() + .1; + + // Running the test right on the module scope creates issues, so we need to create a new scope. + context.new_scope(|context| { + assert_eq!( + run_block(context, &block), + Err(ControlFlow::Failure(Failure::VariableNotInScope( + "value", + "value".into() + ))) + ); + + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(2.0).unwrap().into()) + ); + }); }); } #[test] fn pass_by_copy() { - let mut context = ExecutionContext::default(); - let block = parsing::Block::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let block = parsing::Block::parse( "{ let value = 1; let closure = [value]() -> Number { value = 2; value }; closure() }", ) .unwrap() .1; - let result = run_block(&mut context, Box::leak(Box::new(block))); - assert_eq!(result, Ok(Number::new(2.0).unwrap().into())); + let result = run_block(context, &block); + assert_eq!(result, Ok(Float::new(2.0).unwrap().into())); - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(1.0).unwrap().into()) - ); + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(1.0).unwrap().into()) + ); + }); } #[test] fn pass_by_reference() { - let mut context = ExecutionContext::default(); - let block = parsing::Block::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let block = parsing::Block::parse( "{ let value = 1; let closure = [&value]() -> Number { value = 2; value }; closure() }", ) .unwrap() .1; - let result = run_block(&mut context, Box::leak(Box::new(block))); - assert_eq!(result, Ok(Number::new(2.0).unwrap().into())); + let result = run_block(context, &block); + assert_eq!(result, Ok(Float::new(2.0).unwrap().into())); - assert_eq!( - context.stack.get_variable(&"value"), - Ok(&Number::new(2.0).unwrap().into()) - ); + assert_eq!( + context.stack.get_variable(&"value"), + Ok(&Float::new(2.0).unwrap().into()) + ); + }); } } diff --git a/src/script/execution/types/default.rs b/src/script/execution/types/default.rs index 42c4bf8..f821c20 100644 --- a/src/script/execution/types/default.rs +++ b/src/script/execution/types/default.rs @@ -16,16 +16,21 @@ * program. If not, see . */ -use crate::script::{parsing::VariableType, Span}; +use crate::script::{logging::RuntimeLog, parsing::VariableType, Span}; -use super::{NamedObject, Object}; +use super::{NamedObject, Object, OperatorResult}; #[derive(Debug, Clone, PartialEq)] pub struct DefaultValue; -impl Object<'_, S> for DefaultValue { - fn matches_type(&self, _ty: &VariableType) -> bool { - false +impl Object for DefaultValue { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(false) } } diff --git a/src/script/execution/types/fornjot/circle.rs b/src/script/execution/types/fornjot/circle.rs deleted file mode 100644 index 9b0e2a0..0000000 --- a/src/script/execution/types/fornjot/circle.rs +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2024 James Carl - * AGPL-3.0-only or AGPL-3.0-or-later - * - * This file is part of Command Cad. - * - * Command CAD is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this - * program. If not, see . - */ - -use std::rc::Rc; - -use fj_math::{Point, Scalar as FornjotScalar}; -use parsing::Span; - -use crate::script::{ - execution::{ - types::{OperatorResult, Scalar, StructDefinition, Structure, Vector2}, - ExecutionContext, - }, - parsing::{self, MemberVariable, MemberVariableType, VariableType}, -}; - -pub fn register_globals(context: &mut ExecutionContext<'_, S>) { - context.stack.new_variable_str( - "Circle", - StructDefinition { - // FIXME replace box leak with lazy static. - definition: Box::leak(Box::new(parsing::StructDefinition { - name: S::from_str("Circle"), - members: vec![ - MemberVariable { - name: S::from_str("center"), - ty: MemberVariableType { - ty: VariableType::Vector(2, S::from_str("Length")), - constraints: None, - default_value: None, - }, - }, - MemberVariable { - name: S::from_str("radius"), - ty: MemberVariableType { - ty: VariableType::Scalar(S::from_str("Length")), - constraints: None, - default_value: None, - }, - }, - ], - })), - } - .into(), - ); -} - -/// Unwraps a structure to be made into a circle (assumes you have already checked that the structure is a circle type) -pub fn unwrap_circle( - context: &ExecutionContext, - span: &S, - circle: Structure, -) -> OperatorResult, FornjotScalar)> { - let mut members = Rc::unwrap_or_clone(circle.members); - let center = members.remove("center").unwrap(); - let center = center.downcast::(span)?; - let center = center.as_fornjot_point(context, span)?; - - let radius = members.remove("radius").unwrap(); - let radius = radius.downcast::(span)?; - let radius = radius.as_scalar(context, span)?; - - Ok((center, radius)) -} diff --git a/src/script/execution/types/fornjot/polygon.rs b/src/script/execution/types/fornjot/polygon.rs deleted file mode 100644 index c156d67..0000000 --- a/src/script/execution/types/fornjot/polygon.rs +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2024 James Carl - * AGPL-3.0-only or AGPL-3.0-or-later - * - * This file is part of Command Cad. - * - * Command CAD is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this - * program. If not, see . - */ - -use std::rc::Rc; - -use fj_math::Point; -use parsing::Span; - -use crate::script::{ - execution::{ - types::{List, OperatorResult, StructDefinition, Structure, Vector2}, - ExecutionContext, - }, - parsing::{self, MemberVariable, MemberVariableType, VariableType}, -}; - -pub fn register_globals(context: &mut ExecutionContext<'_, S>) { - context.stack.new_variable_str( - "Polygon", - StructDefinition { - // TODO replace box leak with lazy static. - definition: Box::leak(Box::new(parsing::StructDefinition { - name: S::from_str("Polygon"), - members: vec![MemberVariable { - name: S::from_str("points"), - ty: MemberVariableType { - ty: VariableType::List, - constraints: None, - default_value: None, - }, - }], - })), - } - .into(), - ); -} - -/// Unwraps a structure to be made into a polygon (assumes you have already checked that the structure is a polygon type) -pub fn unwrap_polygon( - context: &ExecutionContext, - span: &S, - polygon: Structure, -) -> OperatorResult>> { - let mut members = Rc::unwrap_or_clone(polygon.members); - let provided_points = members - .remove("points") - .unwrap() - .downcast::>(span)?; - let mut fornjot_points = Vec::with_capacity(provided_points.len()); - - for point in provided_points.unpack_dynamic_length::(span)? { - let point = point.as_fornjot_point(context, span)?; - - fornjot_points.push(point); - } - - Ok(fornjot_points) -} diff --git a/src/script/execution/types/function.rs b/src/script/execution/types/function.rs index ff04400..0186c3a 100644 --- a/src/script/execution/types/function.rs +++ b/src/script/execution/types/function.rs @@ -16,150 +16,185 @@ * program. If not, see . */ -use std::{fmt::Debug, rc::Rc}; +use std::rc::Rc; use fortuples::fortuples; use crate::script::{ execution::{run_callable_block, types::NoneType, ExecutionContext, Failure}, - parsing::{Expression, FunctionSignature, NamedBlock, VariableType}, + logging::RuntimeLog, + parsing::{Expression, Function, VariableType}, Span, }; use super::{NamedObject, Object, OperatorResult, Value}; #[derive(Clone)] -pub struct UserFunction<'a, S: Span> { - pub block: &'a NamedBlock, - pub signature: Rc>, +pub struct UserFunction { + pub source: Rc>, } -impl<'a, S: Span> Object<'a, S> for UserFunction<'a, S> { - fn matches_type(&self, _ty: &VariableType) -> bool { - false +impl std::fmt::Debug for UserFunction { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("UserFunction") + .field("address", &Rc::as_ptr(&self.source)) + .finish() + } +} + +impl From<&'_ Rc>> for UserFunction { + fn from(value: &'_ Rc>) -> Self { + Self { + source: Rc::clone(value), + } + } +} + +impl UserFunction { + pub fn new(source: Function) -> Self { + Self { + source: Rc::new(source), + } + } +} + +impl Object for UserFunction { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(false) } fn call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, spans: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { context.new_isolated_scope(|context| { - run_callable_block(context, &self.block.callable, arguments, spans, span) + run_callable_block( + context, + &self.source.named_block.callable, + arguments, + spans, + span, + ) }) } } -impl<'a, S: Span> Debug for UserFunction<'a, S> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("UserFunction").finish() - } -} - -impl<'a, S: Span> PartialEq for UserFunction<'a, S> { +impl PartialEq for UserFunction { fn eq(&self, _other: &Self) -> bool { false } } -impl<'a, S: Span> NamedObject for UserFunction<'a, S> { +impl NamedObject for UserFunction { fn static_type_name() -> &'static str { "Function" } } -pub trait BuiltinFunctionPointer<'a, S: Span + 'a>: - Fn( - &mut ExecutionContext<'a, S>, +pub type BuiltinFunction = dyn Fn( + &mut ExecutionContext, &S, - Vec>, + Vec>, &[Expression], -) -> OperatorResult> -{ -} +) -> OperatorResult>; -impl<'a, S, F> BuiltinFunctionPointer<'a, S> for F -where - S: Span + 'a, - F: Fn( - &mut ExecutionContext<'a, S>, - &S, - Vec>, - &[Expression], - ) -> OperatorResult>, -{ -} +pub struct BuiltinFunctionRef(Rc>); -#[derive(Clone)] -pub struct BuiltinFunction<'a, S: Span>(Rc>); +impl std::ops::Deref for BuiltinFunctionRef { + type Target = BuiltinFunction; -impl<'a, S: Span> Object<'a, S> for BuiltinFunction<'a, S> { - fn matches_type(&self, _ty: &VariableType) -> bool { - false + fn deref(&self) -> &Self::Target { + &*self.0 } +} - fn call( - &self, - context: &mut ExecutionContext<'a, S>, - span: &S, - arguments: Vec>, - expressions: &[Expression], - ) -> OperatorResult> { - self.0(context, span, arguments, expressions) +impl std::cmp::Eq for BuiltinFunctionRef {} +impl std::cmp::PartialEq for BuiltinFunctionRef { + fn eq(&self, other: &Self) -> bool { + std::ptr::addr_eq(Rc::as_ptr(&self.0), Rc::as_ptr(&other.0)) } } -impl<'a, S: Span> BuiltinFunction<'a, S> { - pub fn new + 'static>(function: F) -> Self { - Self(Rc::new(function)) +impl Clone for BuiltinFunctionRef { + fn clone(&self) -> Self { + Self(Rc::clone(&self.0)) } } -impl Debug for BuiltinFunction<'_, S> { +impl std::fmt::Debug for BuiltinFunctionRef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Function").finish() + let mut debug_struct = f.debug_struct("BuiltinFunction"); + debug_struct.field("address", &Rc::as_ptr(&self.0)); + debug_struct.finish() } } -impl PartialEq for BuiltinFunction<'_, S> { - fn eq(&self, _other: &Self) -> bool { - false +impl From>> for BuiltinFunctionRef { + fn from(value: Box>) -> Self { + Self(value.into()) } } -impl NamedObject for BuiltinFunction<'_, S> { +impl Object for BuiltinFunctionRef { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(false) + } + + fn call( + &self, + context: &mut ExecutionContext, + span: &S, + arguments: Vec>, + expressions: &[Expression], + ) -> OperatorResult> { + (*self)(context, span, arguments, expressions) + } +} + +impl NamedObject for BuiltinFunctionRef { fn static_type_name() -> &'static str { "BuiltinFunction" } } -pub trait UnpackArguments<'a, S: Span, Tuple> { +pub trait UnpackArguments { fn unpack_arguments( span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], ) -> OperatorResult; fn unpack_arguments_optional( _span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], ) -> OperatorResult; } #[rustfmt::skip] fortuples! { - impl<'a, S> UnpackArguments<'a, S, #Tuple> for #Tuple + impl UnpackArguments for #Tuple where - S: Span + 'a, + S: Span, #(#Member: NamedObject),* - #(Value<'a, S>: TryInto<#Member>),* + #(Value: TryInto<#Member>),* { fn unpack_arguments( _span: &S, - mut arguments: Vec>, + mut arguments: Vec>, expressions: &[Expression], ) -> OperatorResult { arguments.reverse(); @@ -182,7 +217,7 @@ fortuples! { fn unpack_arguments_optional( _span: &S, - mut arguments: Vec>, + mut arguments: Vec>, expressions: &[Expression], ) -> OperatorResult { arguments.reverse(); @@ -192,7 +227,7 @@ fortuples! { if let Some(value) = arguments.pop() { value.downcast(expression_iter.next().unwrap().get_span()).map_err(|f| f.make_from_function_call())? } else { - Value::<'a, S>::from(NoneType).downcast(_span)? + Value::::from(NoneType).downcast(_span)? } };)* @@ -205,59 +240,59 @@ fortuples! { } } -pub trait AutoCall<'a, S, T> +pub trait AutoCall where S: Span, { - type Unpacker: UnpackArguments<'a, S, T>; + type Unpacker: UnpackArguments; fn auto_call( - &self, - context: &mut ExecutionContext<'a, S>, + self, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult>; + ) -> OperatorResult>; fn auto_call_optional( - &self, - context: &mut ExecutionContext<'a, S>, + self, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult>; + ) -> OperatorResult>; } #[rustfmt::skip] fortuples! { - impl<'a, S, F> AutoCall<'a, S, #Tuple> for F + impl AutoCall for F where - S: Span + 'a, + S: Span, #(#Member: NamedObject),* - #(Value<'a, S>: TryInto<#Member>),* - F: Fn(&mut ExecutionContext<'a, S>, &S, #(#Member),*) -> OperatorResult>, + #(Value: TryInto<#Member>),* + F: FnOnce(&mut ExecutionContext, &S, #(#Member),*) -> OperatorResult>, { type Unpacker = #Tuple; fn auto_call( - &self, - context: &mut ExecutionContext<'a, S>, + self, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { let (#(casey::lower!(#Member)),*) = Self::Unpacker::unpack_arguments(span, arguments, expressions)?; (self)(context, span, #(casey::lower!(#Member)),*) } fn auto_call_optional( - &self, - context: &mut ExecutionContext<'a, S>, + self, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { let (#(casey::lower!(#Member)),*) = Self::Unpacker::unpack_arguments_optional(span, arguments, expressions)?; (self)(context, span, #(casey::lower!(#Member)),*) @@ -265,23 +300,34 @@ fortuples! { } } -pub trait IntoBuiltinFunction<'a, S: Span, T>: AutoCall<'a, S, T> { - fn into_builtin_function(self) -> BuiltinFunction<'a, S>; +pub trait IntoBuiltinFunction: AutoCall { + fn into_builtin_function(self) -> BuiltinFunctionRef; + fn into_builtin_function_optional(self) -> BuiltinFunctionRef; } #[rustfmt::skip] fortuples! { - impl<'a, S, F> IntoBuiltinFunction<'a, S, #Tuple> for F + impl IntoBuiltinFunction for F where - S: Span +'a, - F: Fn(&mut ExecutionContext<'a, S>, &S, #(#Member),*) -> OperatorResult> + 'static, + S: Span, + F: Fn(&mut ExecutionContext, &S, #(#Member),*) -> OperatorResult> + Clone + 'static, #(#Member: NamedObject),* - #(Value<'a, S>: TryInto<#Member>),* + #(Value: TryInto<#Member>),* { - fn into_builtin_function(self) -> BuiltinFunction<'a, S> { - BuiltinFunction(Rc::new(move |context: &mut ExecutionContext<'a, S>, span: &S, arguments: Vec>, expressions: &[Expression]| -> OperatorResult> { - self.auto_call(context, span, arguments, expressions) - })) - } + fn into_builtin_function(self) -> BuiltinFunctionRef { + let function: Box> = Box::new(move |context: &mut ExecutionContext, span: &S, arguments: Vec>, expressions: &[Expression]| -> OperatorResult> { + self.clone().auto_call(context, span, arguments, expressions) + }); + + BuiltinFunctionRef::from(function) + } + + fn into_builtin_function_optional(self) -> BuiltinFunctionRef { + let function: Box> = Box::new(move |context: &mut ExecutionContext, span: &S, arguments: Vec>, expressions: &[Expression]| -> OperatorResult> { + self.clone().auto_call_optional(context, span, arguments, expressions) + }); + + BuiltinFunctionRef::from(function) + } } } diff --git a/src/script/execution/types/list.rs b/src/script/execution/types/list.rs index 3622256..ba2adb3 100644 --- a/src/script/execution/types/list.rs +++ b/src/script/execution/types/list.rs @@ -16,9 +16,10 @@ * program. If not, see . */ -use common_data_types::Number; +use common_data_types::Float; use enum_downcast::{AsVariant, EnumDowncast, IntoVariant}; -use std::{fmt::Write, isize, rc::Rc}; +use ouroboros::self_referencing; +use std::{cell::RefCell, fmt::Write, isize, rc::Rc}; use crate::script::{ execution::{expressions::run_expression, ExecutionContext, Failure}, @@ -28,84 +29,111 @@ use crate::script::{ }; use super::{ - function::AutoCall, number::UnwrapNotNan, serializable::SerializableValue, - string::formatting::Style, NamedObject, Object, OperatorResult, Scalar, Value, + function::AutoCall, math::Number, number::UnwrapNotNan, serializable::SerializableValue, + string::formatting::Style, NamedObject, NoneType, Object, OperatorResult, Scalar, TypedObject, + UnwrapBorrowFailure, Value, }; #[derive(Debug, Clone, PartialEq)] -pub struct List<'a, S: Span> { - vector: Rc>>, +pub struct List { + vector: Rc>>>, } -impl<'a, S: Span, I> From for List<'a, S> +impl From for List where - I: IntoIterator>, + I: IntoIterator>, { fn from(value: I) -> Self { let value = value.into_iter(); Self { - vector: Rc::new(value.collect()), + vector: Rc::new(RefCell::new(value.collect())), } } } -impl<'a, S: Span> List<'a, S> { - fn unwrap_or_clone(&self) -> Vec> { - // TODO In order to actually implement an "unwrap or clone" we need to be mutable. - self.vector.to_vec() - } - +impl List { pub(crate) fn from_parsed( - context: &mut ExecutionContext<'a, S>, - list: &'a parsing::List, - ) -> OperatorResult> { - let mut values = Vec::with_capacity(list.expressions.len()); + context: &mut ExecutionContext, + list: &parsing::List, + ) -> OperatorResult> { + let mut vector = Vec::with_capacity(list.expressions.len()); for expression in list.expressions.iter() { let value = run_expression(context, expression)?; - values.push(value); + vector.push(value); } Ok(Self { - vector: Rc::new(values), + vector: Rc::new(RefCell::new(vector)), } .into()) } fn internalize_index(&self, span: &S, index: isize) -> OperatorResult { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + let new_index = if index >= 0 { Ok(index as usize) - } else if let Some(new_index) = self.vector.len().checked_sub(index.unsigned_abs()) { + } else if let Some(new_index) = vector.len().checked_sub(index.unsigned_abs()) { Ok(new_index) } else { Err(Failure::IndexOutOfRange(span.clone(), index)) }?; - if new_index >= self.vector.len() { + if new_index >= vector.len() { Err(Failure::IndexOutOfRange(span.clone(), index)) } else { Ok(new_index) } } - pub fn len(&self) -> usize { - self.vector.len() + pub fn len(&self, span: &S) -> OperatorResult { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + Ok(vector.len()) } - pub fn iter(&self) -> impl Iterator> + Clone { - self.vector.iter() - } + pub fn iter(&self, span: &S) -> OperatorResult>> { + let vector = Rc::clone(&self.vector); + + #[self_referencing] + struct ListIter { + vector: Rc>>>, + + #[borrows(vector)] + #[not_covariant] + reference: std::cell::Ref<'this, Vec>>, + + #[borrows(reference)] + #[not_covariant] + iterator: std::iter::Cloned>>, + } + + impl Iterator for ListIter { + type Item = Value; - pub fn consume(self) -> impl Iterator> + Clone { - Rc::unwrap_or_clone(self.vector).into_iter() + fn next(&mut self) -> Option { + self.with_iterator_mut(|iterator| iterator.next()) + } + } + + ListIter::try_new( + vector, + |vector| vector.try_borrow().unwrap_borrow_failure(span), + |reference| Ok(reference.iter().cloned()), + ) } } -impl<'a, S: Span> Object<'a, S> for List<'a, S> { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::List) +impl Object for List { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::List)) } fn format( @@ -116,7 +144,9 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { style: Style, precision: Option, ) -> OperatorResult { - for item in self.vector.iter() { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + + for item in vector.iter() { item.format(log, span, f, style, precision)?; } @@ -127,63 +157,74 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { &self, _log: &mut dyn RuntimeLog, span: &S, - index: Value<'a, S>, - ) -> OperatorResult> { + index: Value, + ) -> OperatorResult> { match index { - Value::Scalar(index) => { - let index = index.to_index(span)?; + Value::Scalar(scalar) => { + let index = Number::try_from(scalar.clone()).map_err(|_| { + Failure::ExpectedGot( + span.clone(), + Number::static_type_name().into(), + >::type_name(&scalar), + ) + })?; + let index = index.to_index(); let localized_index = self.internalize_index(span, index)?; self.vector + .try_borrow() + .unwrap_borrow_failure(span)? .get(localized_index) .cloned() .ok_or(Failure::IndexOutOfRange(span.clone(), index)) } Value::Range(range) => { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + // TODO could we keep an immutable reference to the original list to avoid a copy? let slice = match ( range.lower_bound, range.upper_bound, range.upper_bound_is_inclusive, ) { - (None, None, false) => self.vector.get(..).ok_or((None, None)), + (None, None, false) => vector.get(..).ok_or((None, None)), (Some(lower_bound), None, false) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - self.vector + vector .get(lower_bound..) .ok_or((Some(signed_lower_bound), None)) } (None, Some(upper_bound), false) => { - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.vector + vector .get(..upper_bound) .ok_or((None, Some(signed_upper_bound))) } (None, Some(upper_bound), true) => { - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.vector + vector .get(..=upper_bound) .ok_or((None, Some(signed_upper_bound))) } (Some(lower_bound), Some(upper_bound), false) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.vector + vector .get(lower_bound..upper_bound) .ok_or((Some(signed_lower_bound), Some(signed_upper_bound))) } (Some(lower_bound), Some(upper_bound), true) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.vector + vector .get(lower_bound..=upper_bound) .ok_or((Some(signed_lower_bound), Some(signed_upper_bound))) } @@ -214,118 +255,121 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { fn iterate( &self, _log: &mut dyn RuntimeLog, - _span: &S, - ) -> OperatorResult> + '_>> { - Ok(Box::new(self.vector.iter().cloned())) + span: &S, + ) -> OperatorResult>>> { + Ok(Box::new(self.iter(span)?)) } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "append" => { - |_context: &mut ExecutionContext<'a, S>, - _span: &S, - other: List<'a, S>| - -> OperatorResult> { - // TODO make this accept any iteratable value. - - let mut vector = self.unwrap_or_clone(); - vector.extend_from_slice(&other.vector); - - Ok(Self { - vector: Rc::new(vector), - } - .into()) - } - .auto_call(context, span, arguments, expressions) + "append" => |_context: &mut ExecutionContext, + span: &S, + other: List| + -> OperatorResult> { + let mut other = other.vector.try_borrow_mut().unwrap_borrow_failure(span)?; + + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .append(&mut other); + + Ok(NoneType.into()) } + .auto_call(context, span, arguments, expressions), "dedup" => { - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { - let mut vector = self.unwrap_or_clone(); - vector.dedup(); - - Ok(Self { - vector: Rc::new(vector), - } - .into()) + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .dedup(); + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions) } - "insert" => |_context: &mut ExecutionContext<'a, S>, - span: &S, - index: Scalar, - value: Value<'a, S>| - -> OperatorResult> { - let index = index.to_index(span)?; - let mut vector = self.unwrap_or_clone(); + "insert" => move |_context: &mut ExecutionContext, + span: &S, + index: Number, + value: Value| + -> OperatorResult> { + let index = index.to_index(); let index = self.internalize_index(span, index)?; - vector.insert(index, value); + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .insert(index, value); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions), "is_empty" => { - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { - Ok(self.vector.is_empty().into()) + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Ok(self + .vector + .try_borrow() + .unwrap_borrow_failure(span)? + .is_empty() + .into()) } .auto_call(context, span, arguments, expressions) } "len" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { - Number::new(self.vector.len() as f64) + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Float::new(self.vector.try_borrow().unwrap_borrow_failure(span)?.len() as f64) .unwrap_not_nan(span) .map(|n| n.into()) } .auto_call(context, span, arguments, expressions) } - "push" => |_context: &mut ExecutionContext<'a, S>, - _span: &S, - other: Value<'a, S>| + "push" => |_context: &mut ExecutionContext, + span: &S, + other: Value| -> OperatorResult> { - let mut vector = self.unwrap_or_clone(); - vector.push(other); + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .push(other); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions), - "remove" => |_context: &mut ExecutionContext<'a, S>, + "remove" => |_context: &mut ExecutionContext, span: &S, - index: Scalar| + index: Number| -> OperatorResult> { - let index = index.to_index(span)?; + let index = index.to_index(); let index = self.internalize_index(span, index)?; - let mut vector = self.unwrap_or_clone(); - vector.remove(index); + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .remove(index); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions), - "contains" => |_context: &mut ExecutionContext<'a, S>, - _span: &S, - search: Value<'a, S>| + "contains" => |_context: &mut ExecutionContext, + span: &S, + search: Value| -> OperatorResult> { - Ok(self.vector.contains(&search).into()) + Ok(self + .vector + .try_borrow() + .unwrap_borrow_failure(span)? + .contains(&search) + .into()) } .auto_call(context, span, arguments, expressions), "last" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { - let last = self.vector.last(); + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + let last = vector.last(); if let Some(last) = last { Ok(last.clone()) @@ -336,8 +380,9 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { .auto_call(context, span, arguments, expressions) } "first" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { - let first = self.vector.first(); + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + let first = vector.first(); if let Some(first) = first { Ok(first.clone()) @@ -348,55 +393,54 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { .auto_call(context, span, arguments, expressions) } "reverse" => { - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { - let mut vector = self.unwrap_or_clone(); - vector.reverse(); + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.vector + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .reverse(); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions) } - "rotate_left" => |_context: &mut ExecutionContext<'a, S>, + "rotate_left" => |_context: &mut ExecutionContext, span: &S, - mid: Scalar| + mid: Number| -> OperatorResult> { - let mid = mid.to_index(span)?; + let mid = mid.to_index(); if mid.is_positive() { - let mid = mid as usize % self.vector.len(); - let mut vector = self.unwrap_or_clone(); + let mut vector = self.vector.try_borrow_mut().unwrap_borrow_failure(span)?; + let mid = mid as usize % vector.len(); vector.rotate_left(mid); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } else { Err(Failure::NumberMustBePositive(span.clone())) } } .auto_call(context, span, arguments, expressions), - "rotate_right" => |_context: &mut ExecutionContext<'a, S>, - _span: &S, - mid: Scalar| + "rotate_right" => |_context: &mut ExecutionContext, + span: &S, + mid: Number| -> OperatorResult> { - let mid = mid.to_index(span)?; + let mid = mid.to_index(); if mid.is_positive() { - let mid = mid as usize % self.vector.len(); - let mut vector = self.unwrap_or_clone(); + let mut vector = self.vector.try_borrow_mut().unwrap_borrow_failure(span)?; + let mid = mid as usize % vector.len(); vector.rotate_right(mid); - Ok(Self { - vector: Rc::new(vector), - } - .into()) + Ok(NoneType.into()) } else { Err(Failure::NumberMustBePositive(span.clone())) } } .auto_call(context, span, arguments, expressions), + "clone" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Ok(List::from(self.iter(span)?).into()) + } + .auto_call(context, span, arguments, expressions) + } _ => Err(Failure::UnknownAttribute(attribute.clone())), } } @@ -406,9 +450,11 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { log: &mut dyn RuntimeLog, span: &S, ) -> OperatorResult { - let mut list = Vec::with_capacity(self.vector.len()); + let vector = self.vector.try_borrow().unwrap_borrow_failure(span)?; + + let mut list = Vec::with_capacity(vector.len()); - for item in self.vector.iter() { + for item in vector.iter() { let serializable = item.export(log, span)?; list.push(serializable); } @@ -417,23 +463,29 @@ impl<'a, S: Span> Object<'a, S> for List<'a, S> { } } -impl<'a, S: Span> NamedObject for List<'a, S> { +impl TypedObject for List { + fn get_type() -> VariableType { + VariableType::List + } +} + +impl NamedObject for List { fn static_type_name() -> &'static str { "List" } } -impl<'a, S: Span> List<'a, S> { - pub fn unpack_dynamic_length( - self, - span: &S, - ) -> OperatorResult + Clone + 'a> +impl List { + pub fn unpack_dynamic_length(self, span: &S) -> OperatorResult> where - T: NamedObject + Clone, - Value<'a, S>: IntoVariant + AsVariant + TryInto, + T: NamedObject, + Value: IntoVariant + AsVariant + TryInto, { + // We're going to return copies of all the values in the end anyway, so may as well just own/copy it now. + let vector = Rc::unwrap_or_clone(self.vector).into_inner(); + // Verify that they're all of the right type. - for (index, item) in self.iter().enumerate() { + for (index, item) in vector.iter().enumerate() { if item.enum_downcast_ref::().is_none() { return Err(Failure::ListElement( span.clone(), @@ -449,23 +501,24 @@ impl<'a, S: Span> List<'a, S> { // Okay, we've validated them. Now we can really take them. // The unwraps will not fail because we've already validated the types. - let iter = self.consume().map(|v| v.enum_downcast::().unwrap()); + let iter = vector.into_iter().map(|v| v.enum_downcast::().unwrap()); Ok(iter) } pub fn unpack_fixed_length( self, span: &S, - ) -> OperatorResult + Clone + 'a> + ) -> OperatorResult> where - T: NamedObject + Clone, - Value<'a, S>: IntoVariant + AsVariant + TryInto, + T: NamedObject, + Value: IntoVariant + AsVariant + TryInto, { - if self.len() == D { + let length = self.vector.try_borrow().unwrap_borrow_failure(span)?.len(); + if length == D { // This cannot exceed length D because we already validated that the list matched that length. self.unpack_dynamic_length(span) } else { - Err(Failure::ListWrongLength(span.clone(), D, self.len())) + Err(Failure::ListWrongLength(span.clone(), D, length)) } } } @@ -477,76 +530,67 @@ mod test { use crate::script::{ execution::{expressions::run_expression, ExecutionContext}, parsing::Expression, + Runtime, Scalar, }; #[test] fn index() { - let mut context = ExecutionContext::default(); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("[1, 2, 3][0]").unwrap().1)) - ), - Ok(Number::new(1.0).unwrap().into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("[1, 2, 3][-1]").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("[1, 2, 3][3]").unwrap().1)) - ), - Err(Failure::IndexOutOfRange("[", 3)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("[1, 2, 3][-4]").unwrap().1)) - ), - Err(Failure::IndexOutOfRange("[", -4)) - ); + let mut runtime = Runtime::default(); + ExecutionContext::new(&mut runtime, |context| { + assert_eq!( + run_expression(context, &Expression::parse("[1, 2, 3][0]").unwrap().1), + Ok(Float::new(1.0).unwrap().into()) + ); + + assert_eq!( + run_expression(context, &Expression::parse("[1, 2, 3][-1]").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + + assert_eq!( + run_expression(context, &Expression::parse("[1, 2, 3][3]").unwrap().1), + Err(Failure::IndexOutOfRange("[", 3)) + ); + assert_eq!( + run_expression(context, &Expression::parse("[1, 2, 3][-4]").unwrap().1), + Err(Failure::IndexOutOfRange("[", -4)) + ); + }); } #[test] fn test_unpack() { assert_eq!( - List::<'_, &'static str>::from([ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), - Number::new(3.0).unwrap().into(), + List::<&'static str>::from([ + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), + Float::new(3.0).unwrap().into(), ]) .unpack_fixed_length::(&"span",) .map(|v| v.collect::>()), Ok(vec![ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), - Number::new(3.0).unwrap().into(), + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), + Float::new(3.0).unwrap().into(), ]) ); let values = [ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), ]; assert_eq!( - List::<'_, &'static str>::from(values) + List::<&'static str>::from(values) .unpack_fixed_length::(&"span",) .map(|v| v.collect::>()), Err(Failure::ListWrongLength("span", 3, 2)) ); - let values = [Number::new(1.0).unwrap().into(), true.into()]; + let values = [Float::new(1.0).unwrap().into(), true.into()]; assert_eq!( - List::<'_, &'static str>::from(values) + List::<&'static str>::from(values) .unpack_fixed_length::(&"span") .map(|v| v.collect::>()), Err(Failure::ListElement( diff --git a/src/script/execution/types/math/mod.rs b/src/script/execution/types/math/mod.rs index ba6b69f..88fea51 100644 --- a/src/script/execution/types/math/mod.rs +++ b/src/script/execution/types/math/mod.rs @@ -19,8 +19,8 @@ use std::{borrow::Cow, io}; use common_data_types::{ - BaseUnits, ConversionFactor, ConversionFactorDatabase, Dimension, DimensionNameDatabase, - Number, RatioTypeHint, RawNumber, UnitDescription, UnitList, + BaseUnits, ConversionFactor, ConversionFactorDatabase, Dimension, DimensionNameDatabase, Float, + RatioTypeHint, RawFloat, UnitDescription, UnitList, }; use nalgebra::{DefaultAllocator, DimName}; @@ -30,11 +30,11 @@ use crate::script::{ }; mod scalar; -pub use scalar::Scalar; +pub use scalar::{Angle, Length, Number, Scalar}; mod vector; use self::vector::Vector; -pub use vector::{Vector2, Vector3, Vector4}; +pub use vector::{LengthVector2, LengthVector3, Vector2, Vector3, Vector4}; mod transform; pub use transform::{Transform2D, Transform3D}; @@ -42,7 +42,7 @@ pub use transform::{Transform2D, Transform3D}; mod quaternion; pub use quaternion::Quaternion; -use super::{OperatorResult, SerializableValue}; +use super::OperatorResult; lazy_static::lazy_static! { static ref CONVERSION_FACTORS: ConversionFactorDatabase = include!(concat!(env!("OUT_DIR"), "/conversion_factors.rs")); @@ -65,8 +65,8 @@ trait CheckNan { impl< R: nalgebra::base::Dim, C: nalgebra::base::Dim, - S: nalgebra::base::storage::RawStorage, - > CheckNan for nalgebra::Matrix + S: nalgebra::base::storage::RawStorage, + > CheckNan for nalgebra::Matrix { fn check_nan(self, span: &SP) -> OperatorResult { if !self.iter().any(|c| c.is_nan()) { @@ -100,28 +100,34 @@ fn get_dimension_name(dimension: &Dimension) -> Cow<'static, str> { } pub trait ConvertUnit { - fn convert_to_base_unit(&self, input: Number) -> Number; - fn convert_from_base_unit(&self, input: Number) -> Number; + fn convert_to_base_unit(&self, input: Float) -> Float; + fn convert_from_base_unit(&self, input: Float) -> Float; fn convert_from_measurement_to_number( &self, span: &S, measurement: &Scalar, - ) -> OperatorResult; + ) -> OperatorResult; fn convert_from_vector_to_iter( &self, span: &S, vector: &Vector, - ) -> OperatorResult> + ) -> OperatorResult> + where + DefaultAllocator: nalgebra::allocator::Allocator; + fn convert_from_vector_to_iter_without_dimension_check( + &self, + vector: &vector::NVector, + ) -> impl Iterator where DefaultAllocator: nalgebra::allocator::Allocator; } impl ConvertUnit for ConversionFactor { - fn convert_to_base_unit(&self, input: Number) -> Number { + fn convert_to_base_unit(&self, input: Float) -> Float { input * self.coefficient + self.constant } - fn convert_from_base_unit(&self, input: Number) -> Number { + fn convert_from_base_unit(&self, input: Float) -> Float { (input - self.constant) / self.coefficient } @@ -129,7 +135,7 @@ impl ConvertUnit for ConversionFactor { &self, span: &S, measurement: &Scalar, - ) -> OperatorResult { + ) -> OperatorResult { if measurement.dimension == self.dimension { Ok(self.convert_from_base_unit(measurement.value)) } else { @@ -141,11 +147,24 @@ impl ConvertUnit for ConversionFactor { } } + fn convert_from_vector_to_iter_without_dimension_check( + &self, + vector: &vector::NVector, + ) -> impl Iterator + where + DefaultAllocator: nalgebra::allocator::Allocator, + { + vector + .iter() + .copied() + .map(|c| self.convert_from_base_unit(Float::new(c).unwrap())) + } + fn convert_from_vector_to_iter( &self, span: &S, vector: &Vector, - ) -> OperatorResult> + ) -> OperatorResult> where DefaultAllocator: nalgebra::allocator::Allocator, { @@ -154,7 +173,7 @@ impl ConvertUnit for ConversionFactor { .value .iter() .copied() - .map(|c| self.convert_from_base_unit(Number::new(c).unwrap()))) + .map(|c| self.convert_from_base_unit(Float::new(c).unwrap()))) } else { Err(Failure::ExpectedGot( span.clone(), diff --git a/src/script/execution/types/math/quaternion.rs b/src/script/execution/types/math/quaternion.rs index 1245a77..7922f6d 100644 --- a/src/script/execution/types/math/quaternion.rs +++ b/src/script/execution/types/math/quaternion.rs @@ -18,27 +18,27 @@ use std::borrow::Cow; -use common_data_types::{Dimension, RawNumber}; +use common_data_types::{Dimension, RawFloat}; use nalgebra::Unit; use crate::script::{ execution::{ types::{function::IntoBuiltinFunction, NamedObject, Object, OperatorResult, Value}, - ExecutionContext, Failure, + ExecutionContext, }, logging::RuntimeLog, parsing::VariableType, Span, }; -use super::{get_dimension_name, Scalar, Vector3}; +use super::{Angle, Vector3}; -pub type Quaternion = nalgebra::UnitQuaternion; +pub type Quaternion = nalgebra::UnitQuaternion; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "new_quaternion", - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Quaternion::identity().into()) } .into_builtin_function() @@ -47,19 +47,12 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "vector_to_quaternion", - |_context: &mut ExecutionContext<'a, S>, + |_context: &mut ExecutionContext, span: &S, axis: Vector3| - -> OperatorResult> { - if axis.dimension == Dimension::zero() { - Ok(Quaternion::new(axis.value).into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Normalized vector".into(), - get_dimension_name(&axis.dimension), - )) - } + -> OperatorResult> { + axis.check_dimension(span, Dimension::zero())?; + Ok(Quaternion::new(axis.value).into()) } .into_builtin_function() .into(), @@ -67,46 +60,33 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "axis_quaternion", - |_context: &mut ExecutionContext<'a, S>, + |_context: &mut ExecutionContext, span: &S, axis: Vector3, - angle: Scalar| - -> OperatorResult> { - if axis.dimension == Dimension::zero() { - // We only support translating by lengths. - if angle.dimension == Dimension::angle() { - let angle = angle.value; - - Ok( - Quaternion::from_axis_angle(&Unit::new_normalize(axis.value), *angle) - .into(), - ) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Angle".into(), - get_dimension_name(&angle.dimension), - )) - } - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Normalized vector".into(), - get_dimension_name(&axis.dimension), - )) - } + angle: Angle| + -> OperatorResult> { + axis.check_dimension(span, Dimension::zero())?; + + let angle = angle.value; + + Ok(Quaternion::from_axis_angle(&Unit::new_normalize(axis.value), *angle).into()) } .into_builtin_function() .into(), ); } -impl<'a, S> Object<'a, S> for Quaternion +impl Object for Quaternion where - S: Span + 'a, + S: Span, { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Quaternion) + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Quaternion)) } fn type_name(&self) -> Cow<'static, str> { @@ -117,8 +97,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref::(span)?; Ok(Quaternion::new_normalize(self.into_inner() * rhs.into_inner()).into()) @@ -127,8 +107,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref::(span)?; Ok(Quaternion::new_normalize(self.into_inner() * rhs.inverse().into_inner()).into()) @@ -151,64 +131,63 @@ mod test { types::math::vector::{NVector, Vector}, }, parsing::Expression, + Runtime, }; use super::*; #[test] fn rotate() { - let mut context = ExecutionContext::default(); - let result = run_expression( - &mut context, - Box::leak(Box::new( + ExecutionContext::new(&mut Runtime::default(), |context| { + let result = run_expression( + context, + & Expression::parse( "(new_transform3D() * axis_quaternion(vec3(0, 0, 1), 90deg)).apply_to_vector(vec3(1m, 0m, 0m))", ) .unwrap() .1, - )), ) .unwrap(); - let vector = result.downcast::>>(&"").unwrap(); + let vector = result.downcast::>>(&"").unwrap(); - assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + }); } #[test] fn addition() { - let mut context = ExecutionContext::default(); - let result = run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let result = run_expression( + context, + &Expression::parse( "(new_transform3D() * (axis_quaternion(vec3(0, 0, 1), 45deg) + axis_quaternion(vec3(0, 0, 1), 45deg))).apply_to_vector(vec3(1m, 0m, 0m))", ) .unwrap() .1, - )), ) .unwrap(); - let vector = result.downcast::>>(&"").unwrap(); + let vector = result.downcast::>>(&"").unwrap(); - assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + }); } #[test] fn subtraction() { - let mut context = ExecutionContext::default(); - let result = run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let result = run_expression( + context, + &Expression::parse( "(new_transform3D() * (axis_quaternion(vec3(0, 0, 1), 45deg) - axis_quaternion(vec3(0, 0, 1), 45deg))).apply_to_vector(vec3(1m, 0m, 0m))", ) .unwrap() .1, - )), ) .unwrap(); - let vector = result.downcast::>>(&"").unwrap(); + let vector = result.downcast::>>(&"").unwrap(); - assert!((dbg!(vector.value) - NVector::>::new(1.0, 0.0, 0.0)).norm() < 0.01); + assert!((vector.value - NVector::>::new(1.0, 0.0, 0.0)).norm() < 0.01); + }); } } diff --git a/src/script/execution/types/math/scalar.rs b/src/script/execution/types/math/scalar.rs index 96ae2be..1849037 100644 --- a/src/script/execution/types/math/scalar.rs +++ b/src/script/execution/types/math/scalar.rs @@ -17,7 +17,9 @@ */ use std::{borrow::Cow, cmp::Ordering, fmt, str::FromStr}; +use enum_downcast::EnumDowncast; use fj_math::Scalar as FornjotScalar; +use imstr::ImString; use nalgebra::Const; use serde::{ de::{self, Visitor}, @@ -28,20 +30,21 @@ use uom::{ typenum::ToInt, }; -use common_data_types::{consts, ConversionFactor, Dimension, Number, RatioTypeHint, RawNumber}; +use common_data_types::{consts, ConversionFactor, Dimension, Float, RatioTypeHint, RawFloat}; use crate::script::{ execution::{ types::{ function::AutoCall, number::{unwrap_float, UnwrapNotNan}, - NamedObject, Object, OperatorResult, SString, Style, UnwrapFormattingResult, Value, + NamedObject, Object, OperatorResult, SString, SerializableValue, Style, TypedObject, + UnwrapFormattingResult, Value, }, ExecutionContext, Failure, }, logging::{LogMessage, RuntimeLog}, parsing::{self, Expression, VariableType}, - SerializableValue, Span, + Span, }; use super::{ @@ -49,19 +52,123 @@ use super::{ CONVERSION_FACTORS, }; +macro_rules! define_fixed_dimension_scalar { + ($name:ident, $dimension:expr) => { + #[derive(Debug, Clone, Copy, Eq, PartialEq)] + pub struct $name { + pub value: Float, + } + + impl From<$name> for Scalar { + fn from(value: $name) -> Scalar { + Scalar { + dimension: $dimension, + value: value.value, + } + } + } + + impl From<$name> for Value { + fn from(value: $name) -> Value { + Value::from(Scalar::from(value)) + } + } + + impl TryFrom> for $name { + type Error = (); + + fn try_from(value: Value) -> Result { + let scalar: Scalar = value.enum_downcast().map_err(|_| ())?; + Self::try_from(scalar).map_err(|_| ()) + } + } + + impl TryFrom for $name { + type Error = Scalar; + + fn try_from(value: Scalar) -> Result { + if value.dimension == $dimension { + Ok(Self { value: value.value }) + } else { + Err(value) + } + } + } + + impl<'a> TryFrom<&'a Scalar> for $name { + type Error = &'a Scalar; + + fn try_from(value: &'a Scalar) -> Result { + if value.dimension == $dimension { + Ok(Self { value: value.value }) + } else { + Err(value) + } + } + } + + impl TypedObject for $name { + fn get_type() -> VariableType { + VariableType::Scalar(S::from_str(stringify!($name))) + } + } + + impl NamedObject for $name { + fn static_type_name() -> &'static str { + "Scalar" + } + } + }; +} + +define_fixed_dimension_scalar!(Length, Dimension::length()); + +impl Length { + pub fn as_fornjot_scale_float(&self, context: &ExecutionContext) -> Float { + context + .global_resources + .fornjot_unit_conversion_factor + .convert_from_base_unit(self.value) + } + + pub fn as_fornjot_scalar(&self, context: &ExecutionContext) -> FornjotScalar { + FornjotScalar::from_f64(self.as_fornjot_scale_float(context).into_inner()) + } +} + +define_fixed_dimension_scalar!(Angle, Dimension::angle()); +define_fixed_dimension_scalar!(Number, Dimension::zero()); + +impl Number { + pub fn to_index(self) -> isize { + self.value.round() as isize + } +} + +impl From for Number { + fn from(value: Float) -> Self { + Self { value } + } +} + #[derive(Debug, Clone, PartialEq)] pub struct Scalar { pub(super) dimension: Dimension, - pub(super) value: Number, + pub(super) value: Float, } -impl<'a, S: Span> Object<'a, S> for Scalar { - fn matches_type(&self, ty: &VariableType) -> bool { - if let VariableType::Scalar(name) = ty { +impl Object for Scalar { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(if let VariableType::Scalar(name) = ty { name.as_str() == Object::::type_name(self).as_ref() } else { false - } + }) } fn type_name(&self) -> Cow<'static, str> { @@ -193,57 +300,56 @@ impl<'a, S: Span> Object<'a, S> for Scalar { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = self.unpack_for_addition_or_subtraction(span, rhs)?; - let value = Number::new(*self.value + *rhs.value).unwrap_not_nan(span)?; + let value = Float::new(*self.value + *rhs.value).unwrap_not_nan(span)?; - Ok(Self { value, ..*self }.into()) + Ok(Self { + value, + ..self.clone() + } + .into()) } fn subtraction( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = self.unpack_for_addition_or_subtraction(span, rhs)?; - let value = Number::new(*self.value - *rhs.value).unwrap_not_nan(span)?; + let value = Float::new(*self.value - *rhs.value).unwrap_not_nan(span)?; - Ok(Self { value, ..*self }.into()) + Ok(Self { + value, + ..self.clone() + } + .into()) } fn multiply( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref::(span)?; - self.multiply_by_measurement(span, rhs) - .map(|rhs| rhs.into()) + self.multiply_by_scalar(span, rhs).map(|rhs| rhs.into()) } fn divide( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = rhs.downcast_ref::(span)?; self.divide_by_measurement(span, rhs).map(|rhs| rhs.into()) } - fn unary_plus( - &self, - _log: &mut dyn RuntimeLog, - _span: &S, - ) -> OperatorResult> { + fn unary_plus(&self, _log: &mut dyn RuntimeLog, _span: &S) -> OperatorResult> { Ok(self.clone().into()) } - fn unary_minus( - &self, - _log: &mut dyn RuntimeLog, - _span: &S, - ) -> OperatorResult> { + fn unary_minus(&self, _log: &mut dyn RuntimeLog, _span: &S) -> OperatorResult> { Ok(Self { value: -self.value, ..self.clone() @@ -254,7 +360,7 @@ impl<'a, S: Span> Object<'a, S> for Scalar { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, + rhs: &Value, ) -> OperatorResult { let rhs = rhs.downcast_ref::(span)?; if self.dimension == rhs.dimension { @@ -269,35 +375,35 @@ impl<'a, S: Span> Object<'a, S> for Scalar { } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "to_number" => |_context: &mut ExecutionContext<'a, S>, + "to_number" => |_context: &mut ExecutionContext, span: &S, ty: SString| -> OperatorResult> { - self.convert_to_number(span, ty.as_str()) + self.convert_to_number(span, &ty.as_str(span)?) } .auto_call(context, span, arguments, expressions), - "abs" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - Ok(Self { - value: Number::new(self.value.abs()).unwrap_not_nan(span)?, - ..self.clone() + "abs" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Ok(Self { + value: Float::new(self.value.abs()).unwrap_not_nan(span)?, + ..self.clone() + } + .into()) } - .into()) + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "clamp" => |_context: &mut ExecutionContext<'a, S>, + "clamp" => |_context: &mut ExecutionContext, span: &S, - min: Value<'a, S>, - max: Value<'a, S>| - -> OperatorResult> { + min: Value, + max: Value| + -> OperatorResult> { let min = self.unpack_for_addition_or_subtraction(span, &min)?; let max = self.unpack_for_addition_or_subtraction(span, &max)?; @@ -308,130 +414,130 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call(context, span, arguments, expressions), - "copysign" => |_context: &mut ExecutionContext<'a, S>, + "copysign" => |_context: &mut ExecutionContext, span: &S, - sign: Scalar| - -> OperatorResult> { - let sign = sign.to_index(span)?; + sign: Number| + -> OperatorResult> { + let sign = sign.to_index(); Ok(Self { - value: Number::new(self.value.copysign(sign as RawNumber)) + value: Float::new(self.value.copysign(sign as RawFloat)) .unwrap_not_nan(span)?, ..self.clone() } .into()) } .auto_call(context, span, arguments, expressions), - "hypot" => |_context: &mut ExecutionContext<'a, S>, + "hypot" => |_context: &mut ExecutionContext, span: &S, - other: Value<'a, S>| - -> OperatorResult> { + other: Value| + -> OperatorResult> { let other = self.unpack_for_addition_or_subtraction(span, &other)?; Ok(Self { - value: Number::new(self.value.hypot(*other.value)).unwrap_not_nan(span)?, + value: Float::new(self.value.hypot(*other.value)).unwrap_not_nan(span)?, ..self.clone() } .into()) } .auto_call(context, span, arguments, expressions), - "is_finite" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(self.value.is_finite().into()) + "is_finite" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self.value.is_finite().into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "is_infinite" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(self.value.is_infinite().into()) + "is_infinite" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self.value.is_infinite().into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "is_normal" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(self.value.is_normal().into()) + "is_normal" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self.value.is_normal().into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "cbrt" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - Ok(Self { - dimension: self.dimension / 3, - value: Number::new(self.value.cbrt()).unwrap_not_nan(span)?, + "cbrt" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Ok(Self { + dimension: self.dimension / 3, + value: Float::new(self.value.cbrt()).unwrap_not_nan(span)?, + } + .into()) } - .into()) + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "pow" => |_context: &mut ExecutionContext<'a, S>, + "pow" => |_context: &mut ExecutionContext, _span: &S, exponent: Scalar| - -> OperatorResult> { + -> OperatorResult> { let exponent = exponent.to_number(span)?; self.check_is_zero_dimension(span)?; Ok(Self { dimension: self.dimension, - value: Number::new(self.value.powf(exponent.into_inner())) + value: Float::new(self.value.powf(exponent.into_inner())) .unwrap_not_nan(span)?, } .into()) } .auto_call(context, span, arguments, expressions), - "powi" => |_context: &mut ExecutionContext<'a, S>, + "powi" => |_context: &mut ExecutionContext, _span: &S, - exponent: Scalar| - -> OperatorResult> { - let exponent = exponent.to_index(span)? as i8; + exponent: Number| + -> OperatorResult> { + let exponent = exponent.to_index() as i8; Ok(Self { dimension: self.dimension * exponent, - value: Number::new(self.value.powi(exponent as i32)).unwrap_not_nan(span)?, + value: Float::new(self.value.powi(exponent as i32)).unwrap_not_nan(span)?, } .into()) } .auto_call(context, span, arguments, expressions), - "sqrt" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(Self { - dimension: self.dimension / 2, - value: Number::new(self.value.sqrt()).unwrap_not_nan(span)?, + "sqrt" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(Self { + dimension: self.dimension / 2, + value: Float::new(self.value.sqrt()).unwrap_not_nan(span)?, + } + .into()) } - .into()) + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "is_sign_negative" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(self.value.is_sign_negative().into()) + "is_sign_negative" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self.value.is_sign_negative().into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "is_sign_positive" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(self.value.is_sign_positive().into()) + "is_sign_positive" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self.value.is_sign_positive().into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "recip" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - Ok(Self { - dimension: -self.dimension, - value: Number::new(1.0 / self.value.into_inner()).unwrap_not_nan(span)?, + "recip" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(Self { + dimension: -self.dimension, + value: Float::new(1.0 / self.value.into_inner()).unwrap_not_nan(span)?, + } + .into()) } - .into()) + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "round" => |_context: &mut ExecutionContext<'a, S>, + "round" => |_context: &mut ExecutionContext, span: &S, - unit: Value<'a, S>| - -> OperatorResult> { + unit: Value| + -> OperatorResult> { let conversion_factor = Self::get_operation_conversion_factor(span, unit)?; let value = conversion_factor.convert_from_measurement_to_number(span, self)?; - let value = Number::new(value.round()).unwrap_not_nan(span)?; + let value = Float::new(value.round()).unwrap_not_nan(span)?; Ok(Self { dimension: self.dimension, @@ -440,14 +546,14 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call_optional(context, span, arguments, expressions), - "trunc" => |_context: &mut ExecutionContext<'a, S>, + "trunc" => |_context: &mut ExecutionContext, span: &S, - unit: Value<'a, S>| - -> OperatorResult> { + unit: Value| + -> OperatorResult> { let conversion_factor = Self::get_operation_conversion_factor(span, unit)?; let value = conversion_factor.convert_from_measurement_to_number(span, self)?; - let value = Number::new(value.trunc()).unwrap_not_nan(span)?; + let value = Float::new(value.trunc()).unwrap_not_nan(span)?; Ok(Self { dimension: self.dimension, @@ -456,14 +562,14 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call_optional(context, span, arguments, expressions), - "fract" => |_context: &mut ExecutionContext<'a, S>, + "fract" => |_context: &mut ExecutionContext, span: &S, - unit: Value<'a, S>| - -> OperatorResult> { + unit: Value| + -> OperatorResult> { let conversion_factor = Self::get_operation_conversion_factor(span, unit)?; let value = conversion_factor.convert_from_measurement_to_number(span, self)?; - let value = Number::new(value.fract()).unwrap_not_nan(span)?; + let value = Float::new(value.fract()).unwrap_not_nan(span)?; Ok(Self { dimension: self.dimension, @@ -472,14 +578,14 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call_optional(context, span, arguments, expressions), - "floor" => |_context: &mut ExecutionContext<'a, S>, + "floor" => |_context: &mut ExecutionContext, span: &S, - unit: Value<'a, S>| - -> OperatorResult> { + unit: Value| + -> OperatorResult> { let conversion_factor = Self::get_operation_conversion_factor(span, unit)?; let value = conversion_factor.convert_from_measurement_to_number(span, self)?; - let value = Number::new(value.floor()).unwrap_not_nan(span)?; + let value = Float::new(value.floor()).unwrap_not_nan(span)?; Ok(Self { dimension: self.dimension, @@ -488,14 +594,14 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call_optional(context, span, arguments, expressions), - "ceil" => |_context: &mut ExecutionContext<'a, S>, + "ceil" => |_context: &mut ExecutionContext, span: &S, - unit: Value<'a, S>| - -> OperatorResult> { + unit: Value| + -> OperatorResult> { let conversion_factor = Self::get_operation_conversion_factor(span, unit)?; let value = conversion_factor.convert_from_measurement_to_number(span, self)?; - let value = Number::new(value.ceil()).unwrap_not_nan(span)?; + let value = Float::new(value.ceil()).unwrap_not_nan(span)?; Ok(Self { dimension: self.dimension, @@ -504,166 +610,166 @@ impl<'a, S: Span> Object<'a, S> for Scalar { .into()) } .auto_call_optional(context, span, arguments, expressions), - "max" => |_context: &mut ExecutionContext<'a, S>, + "max" => |_context: &mut ExecutionContext, _span: &S, - other: Value<'a, S>| - -> OperatorResult> { + other: Value| + -> OperatorResult> { let other = self.unpack_for_addition_or_subtraction(span, &other)?; - Ok(Number::new(*self.value.max(other.value)) + Ok(Float::new(*self.value.max(other.value)) .unwrap_not_nan(span)? .into()) } .auto_call(context, span, arguments, expressions), - "min" => |_context: &mut ExecutionContext<'a, S>, + "min" => |_context: &mut ExecutionContext, _span: &S, - other: Value<'a, S>| - -> OperatorResult> { + other: Value| + -> OperatorResult> { let other = self.unpack_for_addition_or_subtraction(span, &other)?; - Ok(Number::new(*self.value.min(other.value)) + Ok(Float::new(*self.value.min(other.value)) .unwrap_not_nan(span)? .into()) } .auto_call(context, span, arguments, expressions), - "mul_add" => |context: &mut ExecutionContext<'a, S>, + "mul_add" => |context: &mut ExecutionContext, span: &S, - a: Value<'a, S>, - b: Value<'a, S>| - -> OperatorResult> { + a: Value, + b: Value| + -> OperatorResult> { let multiply_result = self.multiply(context.log, span, &b)?; let add_result = multiply_result.addition(context.log, span, &a)?; Ok(add_result) } .auto_call(context, span, arguments, expressions), - "signum" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - Number::new(self.value.signum()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "signum" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Float::new(self.value.signum()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "acos" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).acos()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "acos" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).acos()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "acosh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).acosh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "acosh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).acosh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "asin" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).asin()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "asin" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).asin()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "asinh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).asinh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "asinh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).asinh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "atan" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).atan()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "atan" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).atan()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "atanh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_inverse_trig_compatible(span)?; - Number::new((self.value * consts::PI).atanh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "atanh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_inverse_trig_compatible(span)?; + Float::new((self.value * consts::PI).atanh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "cos" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).cos()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "cos" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).cos()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "cosh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).cosh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "cosh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).cosh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "sin" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).sin()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "sin" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).sin()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "sin_cos" => |_context: &mut ExecutionContext<'a, S>, - _span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - let (sin, cos) = (self.value * consts::PI).sin_cos(); - - Ok(Vector2 { - dimension: Dimension::zero(), - value: NVector::>::new(cos, sin), + "sin_cos" => { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + let (sin, cos) = (self.value * consts::PI).sin_cos(); + + Ok(Vector2 { + dimension: Dimension::zero(), + value: NVector::>::new(cos, sin), + } + .into()) } - .into()) + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "sinh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).sinh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "sinh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).sinh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "tan" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).tan()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "tan" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).tan()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), - "tanh" => |_context: &mut ExecutionContext<'a, S>, - span: &S| - -> OperatorResult> { - self.check_trig_compatible(span)?; - Number::new((self.value * consts::PI).tanh()) - .unwrap_not_nan(span) - .map(|n| n.into()) + "tanh" => { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + self.check_trig_compatible(span)?; + Float::new((self.value * consts::PI).tanh()) + .unwrap_not_nan(span) + .map(|n| n.into()) + } + .auto_call(context, span, arguments, expressions) } - .auto_call(context, span, arguments, expressions), // TODO we need functions to convert zero dimensional types to: Angles, Constitute Concentration, Information, Solid Angle, and Temperature. _ => Err(Failure::UnknownAttribute(attribute.clone())), } @@ -673,7 +779,7 @@ impl<'a, S: Span> Object<'a, S> for Scalar { &self, _log: &mut dyn RuntimeLog, _span: &S, - ) -> OperatorResult { + ) -> OperatorResult { Ok(SerializableValue::Scalar(self.clone())) } } @@ -685,36 +791,20 @@ impl NamedObject for Scalar { } impl Scalar { - pub fn multiply_by_measurement( - &self, - span: &S, - rhs: &Self, - ) -> OperatorResult { - let value = Number::new(*self.value * *rhs.value).unwrap_not_nan(span)?; + fn multiply_by_scalar(&self, span: &S, rhs: &Self) -> OperatorResult { + let value = Float::new(*self.value * *rhs.value).unwrap_not_nan(span)?; let dimension = self.dimension + rhs.dimension; Ok(Self { dimension, value }) } - pub fn multiply_by_number(&self, span: &S, rhs: &Number) -> OperatorResult { - let value = Number::new(*self.value * **rhs).unwrap_not_nan(span)?; - - Ok(Self { value, ..*self }) - } - - pub fn divide_by_measurement(&self, span: &S, rhs: &Self) -> OperatorResult { - let value = Number::new(*self.value / *rhs.value).unwrap_not_nan(span)?; + fn divide_by_measurement(&self, span: &S, rhs: &Self) -> OperatorResult { + let value = Float::new(*self.value / *rhs.value).unwrap_not_nan(span)?; let dimension = self.dimension - rhs.dimension; Ok(Self { dimension, value }) } - pub fn divide_by_number(&self, span: &S, rhs: &Number) -> OperatorResult { - let value = Number::new(*self.value / **rhs).unwrap_not_nan(span)?; - - Ok(Self { value, ..*self }) - } - fn check_is_zero_dimension(&self, span: &S) -> OperatorResult { if self.dimension.is_zero_dimension() { Ok(()) @@ -746,7 +836,7 @@ impl Scalar { fn unpack_for_addition_or_subtraction<'b, S: Span>( &'b self, span: &S, - rhs: &'b Value<'_, S>, + rhs: &'b Value, ) -> OperatorResult { if let Value::Scalar(rhs) = rhs { if self.dimension == rhs.dimension { @@ -767,29 +857,25 @@ impl Scalar { } } - pub fn convert_from_number<'a, S: Span>( - span: &S, - value: Number, - ty: SString, - ) -> OperatorResult> { - if let Some(conversion_factor) = CONVERSION_FACTORS.get(ty.as_str()) { - let value = conversion_factor.convert_to_base_unit(value); - let dimension = conversion_factor.dimension; - - Ok(Self { dimension, value }.into()) - } else { - Err(Failure::UnknownUnitType( - span.clone(), - ty.into_string().into(), - )) - } - } - - pub fn convert_to_number<'a, S: Span>( - &self, - span: &S, - ty: &str, - ) -> OperatorResult> { + // pub fn convert_from_number( + // span: &S, + // value: Number, + // ty: SString, + // ) -> OperatorResult> { + // if let Some(conversion_factor) = CONVERSION_FACTORS.get(ty.as_str()) { + // let value = conversion_factor.convert_to_base_unit(value); + // let dimension = conversion_factor.dimension; + + // Ok(Self { dimension, value }.into()) + // } else { + // Err(Failure::UnknownUnitType( + // span.clone(), + // ty.into_string().into(), + // )) + // } + // } + + pub fn convert_to_number(&self, span: &S, ty: &str) -> OperatorResult> { if let Some(conversion_factor) = CONVERSION_FACTORS.get(ty) { if self.dimension == conversion_factor.dimension { Ok(conversion_factor.convert_from_base_unit(self.value).into()) @@ -808,7 +894,7 @@ impl Scalar { } } - pub fn to_number(&self, span: &S) -> OperatorResult { + pub fn to_number(&self, span: &S) -> OperatorResult { self.check_is_zero_dimension(span)?; if self.dimension.ratio_type_hint.0 == 0 { // It's just a number/ratio, we can use that. @@ -822,7 +908,7 @@ impl Scalar { } } - pub fn from_number(value: Number) -> Self { + pub fn from_number(value: Float) -> Self { let dimension = Dimension { length: 0, mass: 0, @@ -837,20 +923,6 @@ impl Scalar { Self { dimension, value } } - pub fn to_index(&self, span: &S) -> OperatorResult { - self.check_is_zero_dimension(span)?; - if self.dimension.ratio_type_hint.0 == 0 { - // It's just a number/ratio, we can use that. - Ok(self.value.round() as isize) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Number".into(), - Object::::type_name(self), - )) - } - } - pub fn from_parsed_raw(measurement: &parsing::Scalar) -> OperatorResult { if let Some(conversion_factor) = CONVERSION_FACTORS.get(measurement.ty.as_str()) { let value = unwrap_float(measurement.number.get_span().clone(), &measurement.number)?; @@ -867,9 +939,7 @@ impl Scalar { } } - pub fn from_parsed<'a, S: Span>( - measurement: &parsing::Scalar, - ) -> OperatorResult> { + pub fn from_parsed(measurement: &parsing::Scalar) -> OperatorResult> { Self::from_parsed_raw(measurement).map(|measurement| measurement.into()) } @@ -885,10 +955,11 @@ impl Scalar { ) -> OperatorResult { let unit_specification = unit .downcast_optional::(span)? - .map(|s| s.into_string()); + .map(|s| s.to_string(span)); Ok(match unit_specification { Some(unit_specification) => { + let unit_specification = unit_specification?; Self::get_conversion_factor(unit_specification.as_ref()).ok_or( Failure::UnknownUnitType(span.clone(), unit_specification.into()), )? @@ -896,19 +967,6 @@ impl Scalar { None => Self::get_conversion_factor("").unwrap(), }) } - - pub fn as_scalar( - &self, - context: &ExecutionContext, - span: &S, - ) -> OperatorResult { - let length = context - .global_resources - .fornjot_unit_conversion_factor - .convert_from_measurement_to_number(span, self)?; - - Ok(FornjotScalar::from_f64(length.into_inner())) - } } impl TryFrom> for Scalar @@ -948,7 +1006,7 @@ where ratio_type_hint: RatioTypeHint::default(), }; - let value = Number::new(value.value)?; + let value = Float::new(value.value)?; Ok(Self { dimension, value }) } @@ -996,7 +1054,7 @@ impl FromStr for Scalar { type Err = anyhow::Error; fn from_str(s: &str) -> Result { - let (_leftover, measurement) = parsing::Scalar::parse(s) + let (_leftover, measurement) = parsing::Scalar::parse(ImString::from(s)) .map_err(|error| anyhow::anyhow!("Failed to parse measurement: {}", error))?; let measurement = Self::from_parsed_raw(&measurement) .map_err(|failure| anyhow::anyhow!("{}", failure))?; @@ -1005,8 +1063,8 @@ impl FromStr for Scalar { } } -impl From for Scalar { - fn from(value: Number) -> Self { +impl From for Scalar { + fn from(value: Float) -> Self { Self { dimension: Dimension { length: 0, @@ -1077,7 +1135,7 @@ impl<'de> Visitor<'de> for ScalarVisitor { where E: de::Error, { - let v = Number::new(v).map_err(|e| E::custom(e))?; + let v = Float::new(v).map_err(|e| E::custom(e))?; Ok(Scalar::from_number(v)) } @@ -1096,6 +1154,7 @@ mod test { use crate::script::{ execution::{expressions::run_expression, ExecutionContext}, logging::StandardLog, + Runtime, }; use super::*; @@ -1141,7 +1200,7 @@ mod test { let value_b: Value<&str> = Scalar::try_from(b).unwrap().into(); let value_c: Value<&str> = Scalar::try_from(c).unwrap().into(); assert_eq!( - value_a.multiply(&mut log, &"span", &value_b), + value_a.clone().multiply(&mut log, &"span", &value_b), Ok(Scalar::try_from(a * b).unwrap().into()) ); assert_eq!( @@ -1158,8 +1217,9 @@ mod test { let b = si::Length::new::(2.0); let value_a: Value<&str> = Scalar::try_from(a).unwrap().into(); let value_b: Value<&str> = Scalar::try_from(b).unwrap().into(); + assert_eq!( - value_a.divide(&mut log, &"span", &value_b), + value_a.clone().divide(&mut log, &"span", &value_b), Ok(Scalar::try_from(a / b).unwrap().into()) ); @@ -1192,32 +1252,24 @@ mod test { #[test] fn conversions() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("1m + 100cm == 2m").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("2m * 2m == 4m^2").unwrap().1)) - ), - Ok(true.into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("(2m).to_number(\"cm\") == 200") + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("1m + 100cm == 2m").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("2m * 2m == 4m^2").unwrap().1), + Ok(true.into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("(2m).to_number(\"cm\") == 200") .unwrap() .1 - )) - ), - { Ok(true.into()) } - ); + ), + { Ok(true.into()) } + ); + }); } } diff --git a/src/script/execution/types/math/transform.rs b/src/script/execution/types/math/transform.rs index ac27513..b0d9d37 100644 --- a/src/script/execution/types/math/transform.rs +++ b/src/script/execution/types/math/transform.rs @@ -18,7 +18,7 @@ use std::borrow::Cow; -use common_data_types::{Dimension, RawNumber}; +use common_data_types::{Dimension, RawFloat}; use enum_downcast::AsVariant; use nalgebra::{ allocator::Allocator, Const, DefaultAllocator, Dim, DimName, DimNameDiff, DimNameSub, OPoint, @@ -40,19 +40,19 @@ use crate::script::{ use super::{ get_dimension_name, - vector::{NVector, Vector}, - Scalar, Vector2, + vector::{LengthVector, NVector, Vector}, + Angle, Vector2, }; -pub type Transform = nalgebra::OMatrix; +pub type Transform = nalgebra::OMatrix; pub type Transform2D = Transform>; pub type Transform3D = Transform>; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "new_transform2D", - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Transform2D::identity().into()) } .into_builtin_function() @@ -60,7 +60,7 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { ); context.stack.new_variable_str( "new_transform3D", - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Transform3D::identity().into()) } .into_builtin_function() @@ -68,122 +68,99 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { ); } -impl<'a, S, D> Object<'a, S> for Transform +impl Object for Transform where D: DimName + DimNameSub, - S: Span + 'a, - DefaultAllocator: Allocator - + Allocator>::Output, >::Output> - + Allocator - + Allocator>::Output>, + S: Span, + DefaultAllocator: Allocator + + Allocator>::Output, >::Output> + + Allocator + + Allocator>::Output>, Self: NamedObject + TransformPoint<>::Output> + Rotate + CustomMultiply<>::Output>, - Vector: Into>, - Vector<>::Output>: NamedObject + Into>, - Value<'a, S>: From + Vector: Into>, + Vector<>::Output>: NamedObject + Into>, + Value: From + AsVariant>::Output>> - + TryInto>::Output>>, + + TryInto>::Output>> + + TryInto>::Output>>, { - fn matches_type(&self, ty: &VariableType) -> bool { - if let VariableType::Transform(dimension) = ty { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(if let VariableType::Transform(dimension) = ty { *dimension as usize == D::USIZE } else { false - } + }) } fn type_name(&self) -> Cow<'static, str> { Self::static_type_name().into() } - fn unary_minus( - &self, - _log: &mut dyn RuntimeLog, - _span: &S, - ) -> OperatorResult> { + fn unary_minus(&self, _log: &mut dyn RuntimeLog, _span: &S) -> OperatorResult> { Ok((-self.clone()).into()) } fn addition( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { - let translation = rhs.downcast_ref::>>(span)?; - - // We only support translating by lengths. - if translation.dimension == Dimension::length() { - let translation = &translation.value; - let translation = Self::new_translation(translation); - - Ok((self * translation).into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Length".into(), - get_dimension_name(&translation.dimension), - )) - } + rhs: &Value, + ) -> OperatorResult> { + let translation = + Vector::>::from_value_ref(span, rhs, Dimension::length())?; + let translation = &translation.value; + let translation = Self::new_translation(translation); + + Ok((self * translation).into()) } fn subtraction( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { - let translation = rhs.downcast_ref::>>(span)?; + rhs: &Value, + ) -> OperatorResult> { + let translation = + Vector::>::from_value_ref(span, rhs, Dimension::length())?; - // We only support translating by lengths. - if translation.dimension == Dimension::length() { - let translation = &translation.value; - let translation = Self::new_translation(&-translation); + let translation = &translation.value; + let translation = Self::new_translation(&-translation); - Ok((self * translation).into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Length".into(), - get_dimension_name(&translation.dimension), - )) - } + Ok((self * translation).into()) } fn multiply( &self, log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { self.custom_multiply(log, span, rhs) } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "apply_to_vector" => |_context: &mut ExecutionContext<'a, S>, - span: &S, - vector: Vector>| - -> OperatorResult> { - if vector.dimension == Dimension::length() { - let value = self.transform_point(&vector.value); - Ok(Vector::> { - dimension: Dimension::length(), - value, - } - .into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Length".into(), - get_dimension_name(&vector.dimension), - )) + "apply_to_vector" => |_context: &mut ExecutionContext, + _span: &S, + vector: LengthVector>| + -> OperatorResult> { + let value = self.transform_point(&vector.value); + Ok(Vector::> { + dimension: Dimension::length(), + value, } + .into()) } .auto_call(context, span, arguments, expressions), "rotate" => self.rotate(context, span, arguments, expressions), @@ -205,79 +182,55 @@ impl NamedObject for Transform3D { } trait Rotate { - fn rotate<'a, S: Span>( + fn rotate( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult>; + ) -> OperatorResult>; } impl Rotate for Transform2D { - fn rotate<'a, S: Span>( + fn rotate( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { - |_context: &mut ExecutionContext<'a, S>, - span: &S, - angle: Scalar| - -> OperatorResult> { - // We only support translating by lengths. - if angle.dimension == Dimension::angle() { - let angle = angle.value; - let angle = Self::new_rotation(*angle); - - Ok((self * angle).into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Angle".into(), - get_dimension_name(&angle.dimension), - )) - } + ) -> OperatorResult> { + |_context: &mut ExecutionContext, + _span: &S, + angle: Angle| + -> OperatorResult> { + let angle = angle.value; + let angle = Self::new_rotation(*angle); + + Ok((self * angle).into()) } .auto_call(context, span, arguments, expressions) } } impl Rotate for Transform3D { - fn rotate<'a, S: Span>( + fn rotate( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { - |_context: &mut ExecutionContext<'a, S>, + ) -> OperatorResult> { + |_context: &mut ExecutionContext, span: &S, axis: Vector>, - angle: Scalar| - -> OperatorResult> { - if axis.dimension == Dimension::zero() { - // We only support translating by lengths. - if angle.dimension == Dimension::angle() { - let angle = angle.value; - let rotation = Self::new_rotation(*angle * axis.value); - - Ok((self * rotation).into()) - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Angle".into(), - get_dimension_name(&angle.dimension), - )) - } - } else { - Err(Failure::ExpectedGot( - span.clone(), - "Normalized vector".into(), - get_dimension_name(&axis.dimension), - )) - } + angle: Angle| + -> OperatorResult> { + axis.check_dimension(span, Dimension::zero())?; + + let angle = angle.value; + let rotation = Self::new_rotation(*angle * axis.value); + + Ok((self * rotation).into()) } .auto_call(context, span, arguments, expressions) } @@ -287,21 +240,21 @@ trait CustomMultiply where D: Dim, { - fn custom_multiply<'a, S: Span>( + fn custom_multiply( &self, log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult>; + rhs: &Value, + ) -> OperatorResult>; } impl CustomMultiply> for Transform2D { - fn custom_multiply<'a, S: Span>( + fn custom_multiply( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let scale = rhs.downcast_ref::(span)?; if scale.dimension.is_zero_dimension() { let scale = Self::new_nonuniform_scaling(&scale.value); @@ -317,12 +270,12 @@ impl CustomMultiply> for Transform2D { } impl CustomMultiply> for Transform3D { - fn custom_multiply<'a, S: Span>( + fn custom_multiply( &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { match rhs { Value::Vector3(scale) => { if scale.dimension.is_zero_dimension() { @@ -355,7 +308,7 @@ where impl TransformPoint> for Transform2D where - DefaultAllocator: Allocator> + Allocator, Const<2>>, + DefaultAllocator: Allocator> + Allocator, Const<2>>, { fn transform_point(&self, pt: &NVector>) -> NVector> { let point = OPoint { coords: *pt }; @@ -366,7 +319,7 @@ where impl TransformPoint> for Transform3D where - DefaultAllocator: Allocator> + Allocator, Const<3>>, + DefaultAllocator: Allocator> + Allocator, Const<3>>, { fn transform_point(&self, pt: &NVector>) -> NVector> { let point = OPoint { coords: *pt }; @@ -377,145 +330,136 @@ where #[cfg(test)] mod test { - use crate::script::execution::{expressions::run_expression, types::math::vector::NVector}; + use crate::script::{ + execution::{expressions::run_expression, types::math::vector::NVector}, + Runtime, + }; use super::*; #[test] fn translate() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse( "(new_transform2D() + vec2(1m, 2m)).apply_to_vector(vec2(0m, 0m))" ) .unwrap() .1 - )) - ), - Ok(Vector { - dimension: Dimension::length(), - value: NVector::>::new(1.0, 2.0), - } - .into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ), + Ok(Vector { + dimension: Dimension::length(), + value: NVector::>::new(1.0, 2.0), + } + .into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse( "(new_transform2D() - vec2(1m, 2m)).apply_to_vector(vec2(0m, 0m))" ) .unwrap() .1 - )) - ), - Ok(Vector { - dimension: Dimension::length(), - value: NVector::>::new(-1.0, -2.0), - } - .into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ), + Ok(Vector { + dimension: Dimension::length(), + value: NVector::>::new(-1.0, -2.0), + } + .into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse( "(new_transform2D() + vec2(1m, 2m)).apply_to_vector(vec2(1m, 2m))" ) .unwrap() .1 - )) - ), - Ok(Vector { - dimension: Dimension::length(), - value: NVector::>::new(2.0, 4.0), - } - .into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ), + Ok(Vector { + dimension: Dimension::length(), + value: NVector::>::new(2.0, 4.0), + } + .into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse( "(new_transform2D() - vec2(1m, 2m)).apply_to_vector(vec2(2m, 3m))" ) .unwrap() .1 - )) - ), - Ok(Vector { - dimension: Dimension::length(), - value: NVector::>::new(1.0, 1.0), - } - .into()) - ); + ), + Ok(Vector { + dimension: Dimension::length(), + value: NVector::>::new(1.0, 1.0), + } + .into()) + ); + }); } #[test] fn scale() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse( "(new_transform2D() * vec2(1, 2)).apply_to_vector(vec2(2m, 2m))" ) .unwrap() .1 - )) - ), - Ok(Vector { - dimension: Dimension::length(), - value: NVector::>::new(2.0, 4.0), - } - .into()) - ); + ), + Ok(Vector { + dimension: Dimension::length(), + value: NVector::>::new(2.0, 4.0), + } + .into()) + ); + }); } #[test] fn rotate_2d() { - let mut context = ExecutionContext::default(); - let result = run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let result = run_expression( + context, + &Expression::parse( "(new_transform2D().rotate(90deg)).apply_to_vector(vec2(1m, 0m))", ) .unwrap() .1, - )), - ) - .unwrap(); - let vector = result.downcast::>>(&"").unwrap(); + ) + .unwrap(); + let vector = result.downcast::>>(&"").unwrap(); - assert!((vector.value - NVector::>::new(0.0, 1.0)).norm() < 0.01); + assert!((vector.value - NVector::>::new(0.0, 1.0)).norm() < 0.01); + }); } #[test] fn rotate_3d() { - let mut context = ExecutionContext::default(); - let result = run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( + ExecutionContext::new(&mut Runtime::default(), |context| { + let result = run_expression( + context, + & Expression::parse( "(new_transform3D().rotate(vec3(0, 0, 1), 90deg)).apply_to_vector(vec3(1m, 0m, 0m))", ) .unwrap() .1, - )), ) .unwrap(); - let vector = result.downcast::>>(&"").unwrap(); + let vector = result.downcast::>>(&"").unwrap(); - assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + assert!((vector.value - NVector::>::new(0.0, 1.0, 0.0)).norm() < 0.01); + }); } } diff --git a/src/script/execution/types/math/units.csv b/src/script/execution/types/math/units.csv index f638e69..df68a1a 100644 --- a/src/script/execution/types/math/units.csv +++ b/src/script/execution/types/math/units.csv @@ -1,2381 +1,2387 @@ -dimension_name,length,mass,time,electric_current,thermodynamic_temperature,amount_of_substance,luminous_intensity,angle_kind,constituent_concentration_kind,information_kind,solid_angle_kind,temperature_kind,singular,plural,abbreviation,keyboard_friendly_abbreviation,conversion_coefficient,conversion_constant -Absement,1,0,1,0,0,0,0,false,false,false,false,false,attometer second,attometer seconds,am · s,am*s,1E-18,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,centimeter second,centimeter seconds,cm · s,cm*s,0.01,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,decameter second,decameter seconds,dam · s,dam*s,10,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,decimeter second,decimeter seconds,dm · s,dm*s,0.1,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,exameter second,exameter seconds,Em · s,Em*s,1E+018,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,femtometer second,femtometer seconds,fm · s,fm*s,1E-15,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,foot second,foot seconds,ft · s,ft*s,0.3048,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,gigameter second,gigameter seconds,Gm · s,Gm*s,1000000000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,hectometer second,hectometer seconds,hm · s,hm*s,100,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,inch second,inch seconds,in · s,in*s,0.0254,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,kilometer hour,kilometer hours,km · h,km*h,3600000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,kilometer second,kilometer seconds,km · s,km*s,1000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,megameter second,megameter seconds,Mm · s,Mm*s,1000000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,meter second,meter seconds,m · s,m*s,1,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,micrometer second,micrometer seconds,µm · s,um*s,0.000001,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,millimeter second,millimeter seconds,mm · s,mm*s,0.001,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,nanometer second,nanometer seconds,nm · s,nm*s,0.000000001,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,petameter second,petameter seconds,Pm · s,Pm*s,1000000000000000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,picometer second,picometer seconds,pm · s,pm*s,1E-12,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,terameter second,terameter seconds,Tm · s,Tm*s,1000000000000,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,yoctometer second,yoctometer seconds,ym · s,ym*s,1E-24,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,yottameter second,yottameter seconds,Ym · s,Ym*s,1E+024,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,zeptometer second,zeptometer seconds,zm · s,zm*s,1E-21,0 -Absement,1,0,1,0,0,0,0,false,false,false,false,false,zettameter second,zettameter seconds,Zm · s,Zm*s,1E+021,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,attometer per second squared,attometers per second squared,am/s²,am/s^2,1E-18,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,centimeter per second squared,centimeters per second squared,cm/s²,cm/s^2,0.01,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,decameter per second squared,decameters per second squared,dam/s²,dam/s^2,10,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,decimeter per second squared,decimeters per second squared,dm/s²,dm/s^2,0.1,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,exameter per second squared,exameters per second squared,Em/s²,Em/s^2,1E+018,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,femtometer per second squared,femtometers per second squared,fm/s²,fm/s^2,1E-15,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,foot per second squared,feet per second squared,ft/s²,ft/s^2,0.3048,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,galileo,galileos,Gal,Gal,0.01,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,gigameter per second squared,gigameters per second squared,Gm/s²,Gm/s^2,1000000000,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,hectometer per second squared,hectometers per second squared,hm/s²,hm/s^2,100,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,inch per second squared,inches per second squared,in/s²,in/s^2,0.0254,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,kilometer per second squared,kilometers per second squared,km/s²,km/s^2,1000,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,megameter per second squared,megameters per second squared,Mm/s²,Mm/s^2,1000000,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,meter per second squared,meters per second squared,m/s²,m/s^2,1,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,micrometer per second squared,micrometers per second squared,µm/s²,um/s^2,0.000001,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,millimeter per minute squared,millimeters per minute squared,mm/min²,mm/min^2,2.77777777777778E-07,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,millimeter per second squared,millimeters per second squared,mm/s²,mm/s^2,0.001,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,nanometer per second squared,nanometers per second squared,nm/s²,nm/s^2,0.000000001,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,petameter per second squared,petameters per second squared,Pm/s²,Pm/s^2,1000000000000000,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,picometer per second squared,picometers per second squared,pm/s²,pm/s^2,1E-12,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,standard acceleration of gravity,standard accelerations of gravity,g₀,g\0,9.80665,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,terameter per second squared,terameters per second squared,Tm/s²,Tm/s^2,1000000000000,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,yoctometer per second squared,yoctometers per second squared,ym/s²,ym/s^2,1E-24,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,yottameter per second squared,yottameters per second squared,Ym/s²,Ym/s^2,1E+024,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,zeptometer per second squared,zeptometers per second squared,zm/s²,zm/s^2,1E-21,0 -Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,zettameter per second squared,zettameters per second squared,Zm/s²,Zm/s^2,1E+021,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,atomic unit of action,atomic units of action,ħ,n<-,1.054571817E-34,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,electronvolt second,electronvolt seconds,eV · s,eV*s,1.602176634E-19,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,erg second,erg seconds,erg · s,erg*s,0.0000001,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,joule second,joule seconds,J · s,J*s,1,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,planck constant,planck constants,h,h (planck),6.62607015E-34,0 -Action,2,1,-1,0,0,0,0,false,false,false,false,false,reduced planck constant,reduced planck constants,ħ,n<- planc,1.054571817E-34,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,attomole,attomoles,amol,amol,1E-18,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,centimole,centimoles,cmol,cmol,0.01,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,decamole,decamoles,damol,damol,10,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,decimole,decimoles,dmol,dmol,0.1,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,examole,examoles,Emol,Emol,1E+018,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,femtomole,femtomoles,fmol,fmol,1E-15,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,gigamole,gigamoles,Gmol,Gmol,1000000000,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,hectomole,hectomoles,hmol,hmol,100,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,kilomole,kilomoles,kmol,kmol,1000,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,megamole,megamoles,Mmol,Mmol,1000000,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,micromole,micromoles,µmol,umol,0.000001,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,millimole,millimoles,mmol,mmol,0.001,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,mole,moles,mol,mol,1,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,nanomole,nanomoles,nmol,nmol,0.000000001,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,particle,particles,particle,particle,1.66053906717385E-24,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,petamole,petamoles,Pmol,Pmol,1000000000000000,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,picomole,picomoles,pmol,pmol,1E-12,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,standard cubic centimeter,standard cubic centimeters,cm³(STP),cm^3(STP),4.40316145139823E-05,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,standard cubic foot,standard cubic feet,scf,scf,1.24683662345026,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,standard cubic meter,standard cubic meters,m³(STP),m^3(STP),44.0316145139823,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,standard liter,standard liters,L(STP),L(STP),0.0440316145139823,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,teramole,teramoles,Tmol,Tmol,1000000000000,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,yoctomole,yoctomoles,ymol,ymol,1E-24,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,yottamole,yottamoles,Ymol,Ymol,1E+024,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,zeptomole,zeptomoles,zmol,zmol,1E-21,0 -AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,zettamole,zettamoles,Zmol,Zmol,1E+021,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,degree,degrees,°,deg,0.0174532925199433,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,gon,gons,gon,gon,0.015707963267949,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,mil,mils,mil,mil,0.0009817477,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,minute,minutes,′,angle_minute,0.000290888208665722,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,radian,radians,rad,rad,1,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,revolution,revolutions,r,r,6.28318530717959,0 -Angle,0,0,0,0,0,0,0,true,false,false,false,false,second,seconds,″,angle_second,4.84813681109536E-06,0 -AngularAbsement,0,0,1,0,0,0,0,true,false,false,false,false,degree second,degree seconds,° · s,deg*s,0.0174532925199433,0 -AngularAbsement,0,0,1,0,0,0,0,true,false,false,false,false,radian second,radian seconds,rad · s,rad*s,1,0 -AngularAcceleration,0,0,-2,0,0,0,0,true,false,false,false,false,degree per second squared,degrees per second squared,°/s²,deg/s^2,0.0174532925199433,0 -AngularAcceleration,0,0,-2,0,0,0,0,true,false,false,false,false,radian per second squared,radians per second squared,rad/s²,rad/s^2,1,0 -AngularJerk,0,0,-3,0,0,0,0,true,false,false,false,false,degree per second cubed,degrees per second cubed,°/s³,deg/s^3,0.0174532925199433,0 -AngularJerk,0,0,-3,0,0,0,0,true,false,false,false,false,radian per second cubed,radians per second cubed,rad/s³,rad/s^3,1,0 -AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,degree per second,degrees per second,°/s,deg/s,0.0174532925199433,0 -AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,radian per second,radians per second,rad/s,rad/s,1,0 -AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,revolution per hour,revolutions per hour,rph,rph,0.00174532925199433,0 -AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,revolution per minute,revolutions per minute,rpm,rpm,0.10471975511966,0 -AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,revolution per second,revolutions per second,rps,rps,6.28318530717959,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,acre,acres,ac,ac,4046.873,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,are,ares,a,a,100,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,barn,barns,b,b,1E-28,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,circular mil,circular mils,cmil,cmil,5.067075E-10,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,hectare,hectares,ha,ha,10000,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square attometer,square attometers,am²,am^2,1E-36,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square centimeter,square centimeters,cm²,cm^2,0.0001,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square decameter,square decameters,dam²,dam^2,100,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square decimeter,square decimeters,dm²,dm^2,0.01,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square exameter,square exameters,Em²,Em^2,1E+036,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square femtometer,square femtometers,fm²,fm^2,1E-30,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square foot,square feet,ft²,ft^2,0.09290304,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square gigameter,square gigameters,Gm²,Gm^2,1E+018,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square hectometer,square hectometers,hm²,hm^2,10000,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square inch,square inches,in²,in^2,0.00064516,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square kilometer,square kilometers,km²,km^2,1000000,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square megameter,square megameters,Mm²,Mm^2,1000000000000,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square meter,square meters,m²,m^2,1,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square micrometer,square micrometers,µm²,um^2,1E-12,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square mile,square miles,mi²,mi^2,2589988,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square millimeter,square millimeters,mm²,mm^2,0.000001,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square nanometer,square nanometers,nm²,nm^2,1E-18,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square petameter,square petameters,Pm²,Pm^2,1E+030,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square picometer,square picometers,pm²,pm^2,1E-24,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square terameter,square terameters,Tm²,Tm^2,1E+024,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square yard,square yards,yd²,yd^2,0.8361274,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square yoctometer,square yoctometers,ym²,ym^2,1E-48,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square yottameter,square yottameters,Ym²,Ym^2,1E+048,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square zeptometer,square zeptometers,zm²,zm^2,1E-42,0 -Area,2,0,0,0,0,0,0,false,false,false,false,false,square zettameter,square zettameters,Zm²,Zm^2,1E+042,0 -ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,state per square centimeter electronvolt,states per square centimeter electronvolt,1/(cm² · eV),1/(cm^2*eV),6.24150907446076E+022,0 -ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,state per square centimeter joule,states per square centimeter joule,1/(cm² · J),1/(cm^2*J),10000,0 -ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,state per square meter joule,states per square meter joule,1/(m² · J),1/(m^2*J),1,0 -ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,gram per square centimeter,grams per square centimeter,g/cm²,g/cm^2,10,0 -ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,gram per square meter,grams per square meter,g/m²,g/m^2,0.001,0 -ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,kilogram per square meter,kilograms per square meter,kg/m²,kg/m^2,1,0 -ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,ounce per square foot,ounces per square foot,oz/ft²,oz/ft^2,0.305151693636721,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per acre,per acre,ac⁻²,Ac^-2,0.000247104369225325,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per are,per are,a⁻²,A^-2,0.01,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per barn,per barn,b⁻²,b^-2,1E+028,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per circular mil,per circular mil,cmil⁻²,cmil^-2,1973525159.97888,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per hectare,per hectare,ha⁻²,ha^-2,0.0001,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square centimeter,per square centimeter,cm⁻²,cm^-2,10000,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square decimeter,per square decimeter,dm⁻²,dm^-2,100,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square foot,per square foot,ft⁻²,ft^-2,10.7639104167097,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square inch,per square inch,in⁻²,in^-2,1550.0031000062,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square kilometer,per square kilometer,km⁻²,km^-2,0.000001,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square meter,per square meter,m⁻²,m^-2,1,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square micrometer,per square micrometer,µm⁻²,um^-2,1000000000000,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square mile,per square mile,mi⁻²,mi^-2,3.86102174990772E-07,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square millimeter,per square millimeter,mm⁻²,mm^-2,1000000,0 -ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,per square yard,per square yard,yd⁻²,yd^-2,1.1959899890854,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per acre second,per acre second,ac⁻¹ · s⁻¹,ac^-1*s^-1,0.000247104369225325,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per are second,per are second,a⁻¹ · s⁻¹,a^-1*s^-1,0.01,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per barn second,per barn second,b⁻¹ · s⁻¹,b^-1*s^-1,1E+028,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per circular mil second,per circular mil second,cmil⁻¹ · s⁻¹,cmil^-1*s^-1,1973525159.97888,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per hectare second,per hectare second,ha⁻¹ · s⁻¹,ha^-1*s^-1,0.0001,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square centimeter second,per square centimeter second,cm⁻² · s⁻¹,cm^-2*s^-1,10000,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square foot second,per square foot second,ft⁻² · s⁻¹,ft^-2*s^-1,10.7639104167097,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square inch second,per square inch second,in⁻² · s⁻¹,in^-2*s^-1,1550.0031000062,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square meter second,per square meter second,m⁻² · s⁻¹,m^-2*s^-1,1,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square mile second,per square mile second,mi⁻² · s⁻¹,mi^-2*s^-1,3.86102174990772E-07,0 -ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,per square yard second,per square yard second,yd⁻² · s⁻¹,yd^-2*s^-1,1.1959899890854,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,attojoule per kilogram,attojoules per kilogram,aJ/kg,aJ/kg,1E-18,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,British thermal unit (IT) per pound,British thermal units (IT) per pound,Btu (IT)/lb,Btu (IT)/lb,2326.0001710787,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,British thermal unit per pound,British thermal units per pound,Btu/lb,Btu/lb,2324.44370761062,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,calorie (IT) per gram,calories (IT) per gram,cal (IT)/lb,Cal (IT)/lb,4186.8,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,calorie per gram,calories per gram,cal/lb,cal/lb,4184,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,centijoule per kilogram,centijoules per kilogram,cJ/kg,cJ/kg,0.01,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,decajoule per kilogram,decajoules per kilogram,daJ/kg,daJ/kg,10,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,decijoule per kilogram,decijoules per kilogram,dJ/kg,dJ/kg,0.1,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,exajoule per kilogram,exajoules per kilogram,EJ/kg,EJ/kg,1E+018,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,femtojoule per kilogram,femtojoules per kilogram,fJ/kg,fJ/kg,1E-15,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,gigajoule per kilogram,gigajoules per kilogram,GJ/kg,GJ/kg,1000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,hectojoule per kilogram,hectojoules per kilogram,hJ/kg,hJ/kg,100,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per attogram,joules per attogram,J/ag,J/ag,1E+021,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per exagram,joules per exagram,J/Eg,J/Eg,1E-15,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per femtogram,joules per femtogram,J/fg,J/fg,1E+018,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per gigagram,joules per gigagram,J/Gg,J/Gg,0.000001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per gram,joules per gram,J/g,J/g,1000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per kilogram,joules per kilogram,J/kg,J/kg,1,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per megagram,joules per megagram,J/Mg,J/Mg,0.001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per microgram,joules per microgram,J/µg,J/ug,1000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per milligram,joules per milligram,J/mg,J/mg,1000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per nanogram,joules per nanogram,J/ng,J/ng,1000000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per petagram,joules per petagram,J/Pg,J/Pg,1E-12,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per picogram,joules per picogram,J/pg,J/pg,1000000000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per teragram,joules per teragram,J/Tg,J/Tg,0.000000001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per yottagram,joules per yottagram,J/Yg,J/Yg,1E-21,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per zeptogram,joules per zeptogram,J/zg,J/zg,1E+024,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,joule per zettagram,joules per zettagram,J/Zg,J/Zg,1E-18,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,kilojoule per kilogram,kilojoules per kilogram,kJ/kg,kJ/kg,1000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,megajoule per kilogram,megajoules per kilogram,MJ/kg,MJ/kg,1000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,microjoule per kilogram,microjoules per kilogram,µJ/kg,uJ/kg,0.000001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,millijoule per kilogram,millijoules per kilogram,mJ/kg,mJ/kg,0.001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,nanojoule per kilogram,nanojoules per kilogram,nJ/kg,nJ/kg,0.000000001,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,petajoule per kilogram,petajoules per kilogram,PJ/kg,PJ/kg,1000000000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,picojoule per kilogram,picojoules per kilogram,pJ/kg,pJ/kg,1E-12,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,terajoule per kilogram,terajoules per kilogram,TJ/kg,TJ/kg,1000000000000,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,yoctojoule per kilogram,yoctojoules per kilogram,yJ/kg,yJ/kg,1E-24,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,yottajoule per kilogram,yottajoules per kilogram,YJ/kg,YJ/kg,1E+024,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,zeptojoule per kilogram,zeptojoules per kilogram,zJ/kg,zJ/kg,1E-21,0 -AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,zettajoule per kilogram,zettajoules per kilogram,ZJ/kg,ZJ/kg,1E+021,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,abfarad,abfarads,abF,abF,1000000000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,attofarad,attofarads,aF,aF,1E-18,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,centifarad,centifarads,cF,cF,0.01,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,decafarad,decafarads,daF,daF,10,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,decifarad,decifarads,dF,dF,0.1,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,exafarad,exafarads,EF,EF,1E+018,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,farad,farads,F,F,1,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,femtofarad,femtofarads,fF,fF,1E-15,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,gigafarad,gigafarads,GF,GF,1000000000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,hectofarad,hectofarads,hF,hF,100,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,kilofarad,kilofarads,kF,kF,1000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,megafarad,megafarads,MF,MF,1000000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,microfarad,microfarads,µF,uF,0.000001,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,millifarad,millifarads,mF,mF,0.001,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,nanofarad,nanofarads,nF,nF,0.000000001,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,petafarad,petafarads,PF,PF,1000000000000000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,picofarad,picofarads,pF,pF,1E-12,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,statfarad,statfarads,statF,statF,1.11265E-12,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,terafarad,terafarads,TF,TF,1000000000000,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,yoctofarad,yoctofarads,yF,yF,1E-24,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,yottafarad,yottafarads,YF,YF,1E+024,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,zeptofarad,zeptofarads,zF,zF,1E-21,0 -Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,zettafarad,zettafarads,ZF,ZF,1E+021,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,atto enzyme unit,atto enzyme units,aU,aU,1.66666666666667E-26,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,attokatal,attokatals,akat,akat,1E-18,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,centi enzyme unit,centi enzyme units,cU,cU,1.66666666666667E-10,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,centikatal,centikatals,ckat,ckat,0.01,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,deca enzyme unit,deca enzyme units,daU,daU,1.66666666666667E-07,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,decakatal,decakatals,dakat,dakat,10,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,deci enzyme unit,deci enzyme units,dU,dU,1.66666666666667E-09,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,decikatal,decikatals,dkat,dkat,0.1,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,enzyme unit,enzyme units,U,U,1.66666666666667E-08,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,exa enzyme unit,exa enzyme units,EU,EU,16666666666.6667,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,exakatal,exakatals,Ekat,Ekat,1E+018,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,femto enzyme unit,femto enzyme units,fU,fU,1.66666666666667E-23,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,femtokatal,femtokatals,fkat,fkat,1E-15,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,giga enzyme unit,giga enzyme units,GU,GU,16.6666666666667,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,gigakatal,gigakatals,Gkat,Gkat,1000000000,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,hecto enzyme unit,hecto enzyme units,hU,hU,1.66666666666667E-06,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,hectokatal,hectokatals,hkat,hkat,100,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,katal,katals,kat,kat,1,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,kilo enzyme unit,kilo enzyme units,kU,kU,1.66666666666667E-05,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,kilokatal,kilokatals,kkat,kkat,1000,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,mega enzyme unit,mega enzyme units,MU,MU,0.0166666666666667,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,megakatal,megakatals,Mkat,Mkat,1000000,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,micro enzyme unit,micro enzyme units,μU,uU,1.66666666666667E-14,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,microkatal,microkatals,µkat,ukat,0.000001,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,milli enzyme unit,milli enzyme units,mU,mU,1.66666666666667E-11,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,millikatal,millikatals,mkat,mkat,0.001,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,mole per second,moles per second,mol/s,mol/s,1,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,nano enzyme unit,nano enzyme units,nU,nU,1.66666666666667E-17,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,nanokatal,nanokatals,nkat,nkat,0.000000001,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,particle per second,particles per second,particle/s,particle/s,1.66053906717385E-24,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,peta enzyme unit,peta enzyme units,PU,PU,16666666.6666667,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,petakatal,petakatals,Pkat,Pkat,1000000000000000,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,pico enzyme unit,pico enzyme units,pU,pU,1.66666666666667E-20,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,picokatal,picokatals,pkat,pkat,1E-12,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,standard centimeter per minute,standard centimeters per minute,sccm,sccm,7.33860241899706E-07,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,standard cubic foot per hour,standard cubic feet per hour,scfm,scfm,0.0207806103908377,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,standard cubic meter per minute,standard cubic meters per minute,m³(STP)/min,m^3(STP)/min,0.733860241899705,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,standard liter per minute,standard liters per minute,slm,slm,0.000733860241899706,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,tera enzyme unit,tera enzyme units,TU,TU,16666.6666666667,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,terakatal,terakatals,Tkat,Tkat,1000000000000,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,yocto enzyme unit,yocto enzyme units,yU,yU,1.66666666666667E-32,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,yoctokatal,yoctokatals,ykat,ykat,1E-24,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,yotta enzyme unit,yotta enzyme units,YU,YU,1.66666666666667E+016,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,yottakatal,yottakatals,Ykat,Ykat,1E+024,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,zepto enzyme unit,zepto enzyme units,zU,zU,1.66666666666667E-29,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,zeptokatal,zeptokatals,zkat,zkat,1E-21,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,zetta enzyme unit,zetta enzyme units,ZU,ZU,16666666666666.7,0 -CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,zettakatal,zettakatals,Zkat,Zkat,1E+021,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,atto enzyme unit per cubic meter,atto enzyme units per cubic meter,aU/m³,aU/m^3,1.66666666666667E-26,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,attokatal per cubic meter,attokatals per cubic meter,akat/m³,akat/m^3,1E-18,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,centi enzyme unit per cubic meter,centi enzyme units per cubic meter,cU/m³,cU/m^3,1.66666666666667E-10,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,centikatal per cubic meter,centikatals per cubic meter,ckat/m³,ckat/m^3,0.01,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,deca enzyme unit per cubic meter,deca enzyme units per cubic meter,daU/m³,daU/m^3,1.66666666666667E-07,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,decakatal per cubic meter,decakatals per cubic meter,dakat/m³,dakat/m^3,10,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,deci enzyme unit per cubic meter,deci enzyme units per cubic meter,dU/m³,dU/m^3,1.66666666666667E-09,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,decikatal per cubic meter,decikatals per cubic meter,dkat/m³,dkat/m^3,0.1,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,enzyme unit per cubic decimeter,enzyme units per cubic decimeter,U/dm³,U/dm^3,1.66666666666667E-05,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,enzyme unit per cubic meter,enzyme units per cubic meter,U/m³,U/m^3,1.66666666666667E-08,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,enzyme unit per deciliter,enzyme units per deciliter,U/dL,U/dL,0.000166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,enzyme unit per liter,enzyme units per liter,U/L,U/L,1.66666666666667E-05,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,enzyme unit per milliliter,enzyme units per milliliter,U/mL,U/mL,0.0166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,exa enzyme unit per cubic meter,exa enzyme units per cubic meter,EU/m³,EU/m^3,16666666666.6667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,exakatal per cubic meter,exakatals per cubic meter,Ekat/m³,Ekat/m^3,1E+018,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femto enzyme unit per cubic decimeter,femto enzyme units per cubic decimeter,fU/dm³,fU/dm^3,1.66666666666667E-20,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femto enzyme unit per cubic meter,femto enzyme units per cubic meter,fU/m³,fU/m^3,1.66666666666667E-23,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femto enzyme unit per deciliter,femto enzyme units per deciliter,fU/dL,fU/dL,1.66666666666667E-19,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femto enzyme unit per liter,femto enzyme units per liter,fU/L,fU/L,1.66666666666667E-20,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femto enzyme unit per milliliter,femto enzyme units per milliliter,fU/mL,fU/mL,1.66666666666667E-17,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femtokatal per cubic decimeter,femtokatals per cubic decimeter,fkat/dm³,fkat/dm^3,1E-12,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femtokatal per cubic meter,femtokatals per cubic meter,fkat/m³,fkat/m^3,1E-15,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femtokatal per deciliter,femtokatals per deciliter,fkat/dL,fkat/dL,1E-11,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femtokatal per liter,femtokatals per liter,fkat/L,fkat/L,1E-12,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,femtokatal per milliliter,femtokatals per milliliter,fkat/mL,fkat/mL,0.000000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,giga enzyme unit per cubic meter,giga enzyme units per cubic meter,GU/m³,GU/m^3,16.6666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,gigakatal per cubic meter,gigakatals per cubic meter,Gkat/m³,Gkat/m^3,1000000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,hecto enzyme unit per cubic meter,hecto enzyme units per cubic meter,hU/m³,hU/m^3,1.66666666666667E-06,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,hectokatal per cubic meter,hectokatals per cubic meter,hkat/m³,hkat/m^3,100,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,katal per cubic decimeter,katals per cubic decimeter,kat/dm³,kat/dm^3,1000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,katal per cubic meter,katals per cubic meter,kat/m³,kat/m^3,1,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,katal per deciliter,katals per deciliter,kat/dL,kat/dL,10000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,katal per liter,katals per liter,kat/L,kat/L,1000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,katal per milliliter,katals per milliliter,kat/mL,kat/mL,1000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilo enzyme unit per cubic decimeter,kilo enzyme units per cubic decimeter,kU/dm³,kU/dm^3,0.0166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilo enzyme unit per cubic meter,kilo enzyme units per cubic meter,kU/m³,kU/m^3,1.66666666666667E-05,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilo enzyme unit per deciliter,kilo enzyme units per deciliter,kU/dL,kU/dL,0.166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilo enzyme unit per liter,kilo enzyme units per liter,kU/L,kU/L,0.0166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilo enzyme unit per milliliter,kilo enzyme units per milliliter,kU/mL,kU/mL,16.6666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilokatal per cubic decimeter,kilokatals per cubic decimeter,kkat/dm³,kkat/dm^3,1000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilokatal per cubic meter,kilokatals per cubic meter,kkat/m³,kkat/m^3,1000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilokatal per deciliter,kilokatals per deciliter,kkat/dL,kkat/dL,10000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilokatal per liter,kilokatals per liter,kkat/L,kkat/L,1000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,kilokatal per milliliter,kilokatals per milliliter,kkat/mL,kkat/mL,1000000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,mega enzyme unit per cubic meter,mega enzyme units per cubic meter,MU/m³,MU/m^3,0.0166666666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,megakatal per cubic meter,megakatals per cubic meter,Mkat/m³,Mkat/m^3,1000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,micro enzyme unit per cubic decimeter,micro enzyme units per cubic decimeter,μU/dm³,uU/dm^3,1.66666666666667E-11,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,micro enzyme unit per cubic meter,micro enzyme units per cubic meter,µU/m³,uU/m^3,1.66666666666667E-14,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,micro enzyme unit per deciliter,micro enzyme units per deciliter,μU/dL,uU/dL,1.66666666666667E-10,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,micro enzyme unit per liter,micro enzyme units per liter,μU/L,uU/L,1.66666666666667E-11,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,micro enzyme unit per milliliter,micro enzyme units per milliliter,μU/mL,uU/mL,1.66666666666667E-08,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,microkatal per cubic decimeter,microkatals per cubic decimeter,μkat/dm³,ukat/dm^3,0.001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,microkatal per cubic meter,microkatals per cubic meter,µkat/m³,ukat/m^3,0.000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,microkatal per deciliter,microkatals per deciliter,μkat/dL,ukat/dL,0.01,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,microkatal per liter,microkatals per liter,μkat/L,ukat/L,0.001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,microkatal per milliliter,microkatals per milliliter,μkat/mL,ukat/mL,1,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,milli enzyme unit per cubic decimeter,milli enzyme units per cubic decimeter,mU/dm³,mU/dm^3,1.66666666666667E-08,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,milli enzyme unit per cubic meter,milli enzyme units per cubic meter,mU/m³,mU/m^3,1.66666666666667E-11,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,milli enzyme unit per deciliter,milli enzyme units per deciliter,mU/dL,mU/dL,1.66666666666667E-07,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,milli enzyme unit per liter,milli enzyme units per liter,mU/L,mU/L,1.66666666666667E-08,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,milli enzyme unit per milliliter,milli enzyme units per milliliter,mU/mL,mU/mL,1.66666666666667E-05,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,millikatal per cubic decimeter,millikatals per cubic decimeter,mkat/dm³,mkat/dm^3,1,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,millikatal per cubic meter,millikatals per cubic meter,mkat/m³,mkat/m^3,0.001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,millikatal per deciliter,millikatals per deciliter,mkat/dL,mkat/dL,10,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,millikatal per liter,millikatals per liter,mkat/L,mkat/L,1,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,millikatal per milliliter,millikatals per milliliter,mkat/mL,mkat/mL,1000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nano enzyme unit per cubic decimeter,nano enzyme units per cubic decimeter,nU/dm³,nU/dm^3,1.66666666666667E-14,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nano enzyme unit per cubic meter,nano enzyme units per cubic meter,nU/m³,nU/m^3,1.66666666666667E-17,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nano enzyme unit per deciliter,nano enzyme units per deciliter,nU/dL,nU/dL,1.66666666666667E-13,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nano enzyme unit per liter,nano enzyme units per liter,nU/L,nU/L,1.66666666666667E-14,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nano enzyme unit per milliliter,nano enzyme units per milliliter,nU/mL,nU/mL,1.66666666666667E-11,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nanokatal per cubic decimeter,nanokatals per cubic decimeter,nkat/dm³,nkat/dm^3,0.000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nanokatal per cubic meter,nanokatals per cubic meter,nkat/m³,nkat/m^3,0.000000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nanokatal per deciliter,nanokatals per deciliter,nkat/dL,nkat/dL,0.00001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nanokatal per liter,nanokatals per liter,nkat/L,nkat/L,0.000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,nanokatal per milliliter,nanokatals per milliliter,nkat/mL,nkat/mL,0.001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,particle per second cubic meter,particles per second cubic meter,particle · s⁻¹ · m⁻³,particle*s^-1*m^-3,1.66053906717385E-24,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,peta enzyme unit per cubic meter,peta enzyme units per cubic meter,PU/m³,PU/m^3,16666666.6666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,petakatal per cubic meter,petakatals per cubic meter,Pkat/m³,Pkat/m^3,1000000000000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,pico enzyme unit per cubic decimeter,pico enzyme units per cubic decimeter,pU/dm³,pU/dm^3,1.66666666666667E-17,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,pico enzyme unit per cubic meter,pico enzyme units per cubic meter,pU/m³,pU/m^3,1.66666666666667E-20,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,pico enzyme unit per deciliter,pico enzyme units per deciliter,pU/dL,pU/dL,1.66666666666667E-16,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,pico enzyme unit per liter,pico enzyme units per liter,pU/L,pU/L,1.66666666666667E-17,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,pico enzyme unit per milliliter,pico enzyme units per milliliter,pU/mL,pU/mL,1.66666666666667E-14,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,picokatal per cubic decimeter,picokatals per cubic decimeter,pkat/dm³,pkat/dm^3,0.000000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,picokatal per cubic meter,picokatals per cubic meter,pkat/m³,pkat/m^3,1E-12,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,picokatal per deciliter,picokatals per deciliter,pkat/dL,pkat/dL,0.00000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,picokatal per liter,picokatals per liter,pkat/L,pkat/L,0.000000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,picokatal per milliliter,picokatals per milliliter,pkat/mL,pkat/mL,0.000001,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,tera enzyme unit per cubic meter,tera enzyme units per cubic meter,TU/m³,TU/m^3,16666.6666666667,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,terakatal per cubic meter,terakatals per cubic meter,Tkat/m³,Tkat/m^3,1000000000000,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,yocto enzyme unit per cubic meter,yocto enzyme units per cubic meter,yU/m³,yU/m^3,1.66666666666667E-32,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,yoctokatal per cubic meter,yoctokatals per cubic meter,ykat/m³,ykat/m^3,1E-24,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,yotta enzyme unit per cubic meter,yotta enzyme units per cubic meter,YU/m³,YU/m^3,1.66666666666667E+016,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,yottakatal per cubic meter,yottakatals per cubic meter,Ykat/m³,Ykat/m^3,1E+024,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,zepto enzyme unit per cubic meter,zepto enzyme units per cubic meter,zU/m³,zU/m^3,1.66666666666667E-29,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,zeptokatal per cubic meter,zeptokatals per cubic meter,zkat/m³,zkat/m^3,1E-21,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,zetta enzyme unit per cubic meter,zetta enzyme units per cubic meter,ZU/m³,ZU/m^3,16666666666666.7,0 -CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,zettakatal per cubic meter,zettakatals per cubic meter,Zkat/m³,Zkat/m^3,1E+021,0 -Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,degree per meter,degrees per meter,°/m,deg/m,0.0174532925199433,0 -Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,degree per millimeter,degrees per millimeter,°/mm,deg/mm,17.4532925199433,0 -Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,radian per meter,radians per meter,rad/m,rad/m,1,0 -Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,radian per millimeter,radians per millimeter,rad/mm,rad/mm,1000,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,centistokes,centistokes,cSt,cSt,0.000001,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,square centimeter per second,square centimeters per second,cm²/s,cm^2/s,0.0001,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,square meter per second,square meters per second,m²/s,m^2/s,1,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,square micrometer per second,square micrometers per second,µm²/s,um^2/s,1E-12,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,square millimeter per second,square millimeters per second,mm²/s,mm^2/s,0.000001,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,square nanometer per second,square nanometers per second,nm²/s,nm^2/s,1E-18,0 -DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,Stokes,Stokes,St,St,0.0001,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,centipoise,centipoises,cP,cP,0.001,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,gram per centimeter second,grams per centimeter second,g/(cm · s),g/(cm*s),0.1,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,micropascal second,micropascal seconds,µPa · s,uPa*s,0.000001,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,millipascal second,millipascal seconds,mPa · s,mPa*s,0.001,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,pascal second,pascal seconds,Pa · s,Pa*s,1,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,poise,poises,P,P,0.1,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,pound-force second per square foot,pound-force seconds per square foot,lbf · s/ft²,lbf*s/ft^2,47.8802631216374,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,pound-force second per square inch,pound-force seconds per square inch,lbf · s/in²,lbf*s/in^2,6894.75788951578,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,pound per foot hour,pounds per foot hour,lb/(ft · h),lb/(ft*h),0.000413378900554097,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,pound per foot second,pounds per foot second,lb/(ft · s),lb/(ft*s),1.48816404199475,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,reyn,reyns,reyn,reyn,6894.75788951578,0 -DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,slug per foot second,slugs per foot second,slug/(ft · s),slug/(ft*s),47.880249343832,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,abcoulomb,abcoulombs,abC,abC,10,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,ampere hour,ampere hours,A · h,A*h,3600,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,atomic unit of charge,atomic units of charge,a.u. of charge,a.u. of charge,1.602176634E-19,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,attocoulomb,attocoulombs,aC,aC,1E-18,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,centicoulomb,centicoulombs,cC,cC,0.01,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,coulomb,coulombs,C,C,1,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,decaampere hour,decaampere hours,daA · h,daA*h,36000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,decacoulomb,decacoulombs,daC,daC,10,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,decicoulomb,decicoulombs,dC,dC,0.1,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,elementary charge,elementary charges,e,e,1.602176634E-19,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,exacoulomb,exacoulombs,EC,EC,1E+018,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,faraday,faradays,F,Faraday,96485.31,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,femtocoulomb,femtocoulombs,fC,fC,1E-15,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,franklin,franklins,Fr,Fr,3.335641E-10,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,gigaampere hour,gigaampere hours,GA · h,GA*h,3600000000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,gigacoulomb,gigacoulombs,GC,GC,1000000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,hectoampere hour,hectoampere hours,hA · h,hA*h,360000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,hectocoulomb,hectocoulombs,hC,hC,100,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,kiloampere hour,kiloampere hours,kA · h,kA*h,3600000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,kilocoulomb,kilocoulombs,kC,kC,1000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,megaampere hour,megaampere hours,MA · h,MA*h,3600000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,megacoulomb,megacoulombs,MC,MC,1000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,microampere hour,microampere hours,µA · h,uA*h,0.0036,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,microcoulomb,microcoulombs,µC,uC,0.000001,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,milliampere hour,milliampere hours,mA · h,mA*h,3.6,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,millcoulomb,millcoulombs,mC,mC,0.001,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,nanocoulomb,nanocoulombs,nC,nC,0.000000001,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,petaampere hour,petaampere hours,PA · h,PA*h,3.6E+018,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,petacoulomb,petacoulombs,PC,PC,1000000000000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,picocoulomb,picocoulombs,pC,pC,1E-12,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,statcoulomb,statcoulombs,statC,statC,3.335641E-10,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,teraampere hour,teraampere hours,TA · h,TA*h,3600000000000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,teracoulomb,teracoulombs,TC,TC,1000000000000,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,yoctocoulomb,yoctocoulombs,yC,yC,1E-24,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,yottacoulomb,yottacoulombs,YC,YC,1E+024,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,zeptocoulomb,zeptocoulombs,zC,zC,1E-21,0 -ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,zettacoulomb,zettacoulombs,ZC,ZC,1E+021,0 -ElectricChargeArealDensity,-2,0,1,1,0,0,0,false,true,false,false,false,coulomb per square centimeter,coulombs per square centimeter,C/cm²,C/cm^2,10000,0 -ElectricChargeArealDensity,-2,0,1,1,0,0,0,false,true,false,false,false,coulomb per square meter,coulombs per square meter,C/m²,C/m^2,1,0 -ElectricChargeLinearDensity,-1,0,1,1,0,0,0,false,true,false,false,false,coulomb per centimeter,coulombs per centimeter,C/cm,C/cm,100,0 -ElectricChargeLinearDensity,-1,0,1,1,0,0,0,false,true,false,false,false,coulomb per meter,coulombs per meter,C/m,C/m,1,0 -ElectricChargeVolumetricDensity,-3,0,1,1,0,0,0,false,true,false,false,false,coulomb per cubic centimeter,coulombs per cubic centimeter,C/cm³,C/cm^3,1000000,0 -ElectricChargeVolumetricDensity,-3,0,1,1,0,0,0,false,true,false,false,false,coulomb per cubic meter,coulombs per cubic meter,C/m³,C/m^3,1,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,abampere,abamperes,abA,abA,10,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,ampere,amperes,A,A,1,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,atomic unit of charge per second,atomic units of charge per second,a.u. of charge/s,a.u. of charge/s,1.602176634E-19,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,attoampere,attoamperes,aA,aA,1E-18,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,centiampere,centiamperes,cA,cA,0.01,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,decaampere,decaamperes,daA,daA,10,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,deciampere,deciamperes,dA,dA,0.1,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,elementary charge per second,elementary charges per second,e/s,e/s,1.602176634E-19,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,exaampere,exaamperes,EA,EA,1E+018,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,femtoampere,femtoamperes,fA,fA,1E-15,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,gigaampere,gigaamperes,GA,GA,1000000000,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,gilbert,gilberts,Gi,Gi,0.7957747,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,hectoampere,hectoamperes,hA,hA,100,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,kiloampere,kiloamperes,kA,kA,1000,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,megaampere,megaamperes,MA,MA,1000000,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,microampere,microamperes,µA,uA,0.000001,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,millampere,millamperes,mA,mA,0.001,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,nanoampere,nanoamperes,nA,nA,0.000000001,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,petaampere,petaamperes,PA,PA,1000000000000000,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,picoampere,picoamperes,pA,pA,1E-12,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,statampere,statamperes,statA,statA,3.335641E-10,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,teraampere,teraamperes,TA,TA,1000000000000,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,yoctoampere,yoctoamperes,yA,yA,1E-24,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,yottaampere,yottaamperes,YA,YA,1E+024,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,zeptoampere,zeptoamperes,zA,zA,1E-21,0 -ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,zettaampere,zettaamperes,ZA,ZA,1E+021,0 -ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,ampere per square centimeter,amperes per square centimeter,A/cm²,A/cm^2,10000,0 -ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,ampere per square meter,amperes per square meter,A/m²,A/m^2,1,0 -ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,ampere per square millimeter,amperes per square millimeter,A/mm²,A/mm^2,1000000,0 -ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,atomic unit of charge centimeter,atomic unit of charge centimeters,a.u. of charge · cm,a.u. of charge*cm,1.602176634E-21,0 -ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,atomic unit of electric dipole moment,atomic units of electric dipole moment,e · a₀,e*a\0,8.47835362554077E-30,0 -ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,coulomb meter,coulomb meters,C · m,C*m,1,0 -ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,debye,debyes,D,D,3.33564095198152E-30,0 -ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,elementary charge centimeter,elementary charge centimeters,e · cm,e*cm,1.602176634E-21,0 -ElectricDisplacementField,-2,0,1,1,0,0,0,false,false,false,false,false,coulomb per square centimeter,coulombs per square centimeter,C/cm²,C/cm^2 (displacement),10000,0 -ElectricDisplacementField,-2,0,1,1,0,0,0,false,false,false,false,false,coulomb per square meter,coulombs per square meter,C/m²,C/m^2 (displacement),1,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,atomic unit of electric field,atomic units of electric field,a.u. of electric field,a.u. of electric field,514220674763.26,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,kilovolt per millimeter,kilovolts per millimeter,kV/mm,kV/mm,1000000,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,megavolt per centimeter,megavolts per centimeter,MV/cm,MV/cm,100000000,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,megavolt per meter,megavolts per meter,MV/m,MV/m,1000000,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,volt per centimeter,volts per centimeter,V/cm,V/cm,100,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,volt per meter,volts per meter,V/m,V/m,1,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,volt per micrometer,volts per micrometer,V/μm,V/um,1000000,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,volt per mil,volts per mil,V/mil,V/mil,39370.0787401575,0 -ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,volt per millimeter,volts per millimeter,V/mm,V/mm,1000,0 -ElectricFlux,3,1,-3,-1,0,0,0,false,false,false,false,false,volt centimeter,volt centimeters,V ⋅ cm,V*cm,0.01,0 -ElectricFlux,3,1,-3,-1,0,0,0,false,false,false,false,false,volt meter,volt meters,V ⋅ m,V*m,1,0 -ElectricPermittivity,-3,-1,4,2,0,0,0,false,false,false,false,false,farad per meter,farads per meter,F/m,F/m,1,0 -ElectricPermittivity,-3,-1,4,2,0,0,0,false,false,false,false,false,vacuum electric permittivity,vacuum electric permittivity,ε₀,epsilon\0,8.8541878128E-12,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,abvolt,abvolts,abV,abV,0.00000001,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,attovolt,attovolts,aV,aV,1E-18,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,centivolt,centivolts,cV,cV,0.01,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,decavolt,decavolts,daV,daV,10,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,decivolt,decivolts,dV,dV,0.1,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,exavolt,exavolts,EV,EV,1E+018,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,femtovolt,femtovolts,fV,fV,1E-15,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,gigavolt,gigavolts,GV,GV,1000000000,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,hectovolt,hectovolts,hV,hV,100,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,kilovolt,kilovolts,kV,kV,1000,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,megavolt,megavolts,MV,MV,1000000,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,microvolt,microvolts,µV,uV,0.000001,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,millivolt,millivolts,mV,mV,0.001,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,nanovolt,nanovolts,nV,nV,0.000000001,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,petavolt,petavolts,PV,PV,1000000000000000,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,picovolt,picovolts,pV,pV,1E-12,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,statvolt,statvolts,statV,statV,299.7925,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,teravolt,teravolts,TV,TV,1000000000000,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,volt,volts,V,V,1,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,yoctovolt,yoctovolts,yV,yV,1E-24,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,yottavolt,yottavolts,YV,YV,1E+024,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,zeptovolt,zeptovolts,zV,zV,1E-21,0 -ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,zettavolt,zettavolts,ZV,ZV,1E+021,0 -ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,atomic unit of electric quadrupole moment,atomic units of electric quadrupole moment,e · a₀²,e*a\0^2,4.486551524613E-40,0 -ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,coulomb square meter,coulomb square meters,C · m²,C*m^2,1,0 -ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,elementary charge barn,elementary charge barns,e · b,e*b,1.602176634E-47,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,abmho,abmhos,abmho,abmho,1000000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,abmsiemens,abmsiemens,abS,abS,1000000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,attosiemens,attosiemens,aS,aS,1E-18,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,centisiemens,centisiemens,cS,cS,0.01,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,decasiemens,decasiemens,daS,daS,10,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,decisiemens,decisiemens,dS,dS,0.1,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,exasiemens,exasiemens,ES,ES,1E+018,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,femtosiemens,femtosiemens,fS,fS,1E-15,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,gigasiemens,gigasiemens,GS,GS,1000000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,hectosiemens,hectosiemens,hS,hS,100,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,kilosiemens,kilosiemens,kS,kS,1000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,megasiemens,megasiemens,MS,MS,1000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,mho,mhos,℧,mho,1,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,microsiemens,microsiemens,µS,uS,0.000001,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,millisiemens,millisiemens,mS,mS,0.001,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,nanosiemens,nanosiemens,nS,nS,0.000000001,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,petasiemens,petasiemens,PS,PS,1000000000000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,picosiemens,picosiemens,pS,pS,1E-12,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,siemens,siemens,S,S,1,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,statmho,statmhos,statmho,statmho,1.11265E-12,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,statsiemens,statsiemens,statS,statS,1.11265E-12,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,terasiemens,terasiemens,TS,TS,1000000000000,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,yoctosiemens,yoctosiemens,yS,yS,1E-24,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,yottasiemens,yottasiemens,YS,YS,1E+024,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,zeptosiemens,zeptosiemens,zS,zS,1E-21,0 -ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,zettasiemens,zettasiemens,ZS,ZS,1E+021,0 -ElectricalConductivity,-3,-1,3,2,0,0,0,false,false,false,false,false,siemens per centimeter,siemens per centimeter,S/cm,S/cm,100,0 -ElectricalConductivity,-3,-1,3,2,0,0,0,false,false,false,false,false,siemens per meter,siemens per meter,S/m,S/m,1,0 -ElectricalMobility,0,-1,2,1,0,0,0,false,false,false,false,false,square centimeter per volt second,square centimeters per volt second,cm²/(V · s),cm^2/(V*s),0.0001,0 -ElectricalMobility,0,-1,2,1,0,0,0,false,false,false,false,false,square meter per volt second,square meters per volt second,m²/(V · s),m^2/(V*s),1,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,abohm,abohms,abΩ,abohm,0.000000001,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,attoohm,attoohms,aΩ,aohm,1E-18,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,centiohm,centiohms,cΩ,cohm,0.01,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,decaohm,decaohms,daΩ,daohm,10,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,deciohm,deciohms,dΩ,dohm,0.1,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,exaohm,exaohms,EΩ,Eohm,1E+018,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,femtoohm,femtoohms,fΩ,fohm,1E-15,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,gigaohm,gigaohms,GΩ,Gohm,1000000000,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,hectoohm,hectoohms,hΩ,hohm,100,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,kiloohm,kiloohms,kΩ,kohm,1000,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,megaohm,megaohms,MΩ,Mohm,1000000,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,microohm,microohms,µΩ,uohm,0.000001,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,milliohm,milliohms,mΩ,mohm,0.001,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,nanoohm,nanoohms,nΩ,nohm,0.000000001,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,ohm,ohms,Ω,ohm,1,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,petaohm,petaohms,PΩ,Pohm,1000000000000000,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,picoohm,picoohms,pΩ,pohm,1E-12,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,statohm,statohms,statΩ,statohm,898755291711.548,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,teraohm,teraohms,TΩ,Tohm,1000000000000,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,yoctoohm,yoctoohms,yΩ,yohm,1E-24,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,yottaohm,yottaohms,YΩ,Yohm,1E+024,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,zeptoohm,zeptoohms,zΩ,zohm,1E-21,0 -ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,zettaohm,zettaohms,ZΩ,Zohm,1E+021,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,abohm centimeter,abohm centimeters,abΩ · cm,abohm*cm,1E-11,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,abohm meter,abohm meters,abΩ · m,abohm*m,0.000000001,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,attoohm meter,attoohm meters,aΩ · m,aohm*m,1E-18,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,centiohm meter,centiohm meters,cΩ · m,cohm*m,0.01,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,decaohm meter,decaohm meters,daΩ · m,daohm*m,10,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,deciohm meter,deciohm meters,dΩ · m,dohm*m,0.1,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,exaohm meter,exaohm meters,EΩ · m,Eohm*m,1E+018,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,femtoohm meter,femtoohm meters,fΩ · m,fohm*m,1E-15,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,gigaohm meter,gigaohm meters,GΩ · m,Gohm*m,1000000000,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,hectoohm meter,hectoohm meters,hΩ · m,hohm*m,100,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,kiloohm meter,kiloohm meters,kΩ · m,kohm*m,1000,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,megaohm meter,megaohm meters,MΩ · m,Mohm*m,1000000,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,microohm meter,microohm meters,µΩ · m,uohm*m,0.000001,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,milliohm meter,milliohm meters,mΩ · m,mohm*m,0.001,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,nanoohm meter,nanoohm meters,nΩ · m,nohm*m,0.000000001,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm centimeter,ohm centimeters,Ω · cm,ohm*cm,0.01,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm foot,ohm feet,Ω · ft,ohm*ft,0.3048,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm inch,ohm inches,Ω · in,ohm*in,0.0254,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm meter,ohm meters,Ω · m,ohm*m,1,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm square millimeter per meter,ohm square millimeters per meter,Ω · mm²/m,ohm*mm^2/m,0.000001,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,ohm yard,ohm yards,Ω · yd,ohm*yd,0.9144,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,petaohm meter,petaohm meters,PΩ · m,Pohm*m,1000000000000000,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,picoohm meter,picoohm meters,pΩ · m,pohm*m,1E-12,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,statohm centimeter,statohm centimeters,statΩ · cm,statohm*cm,8987552917.11548,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,statohm meter,statohm meters,statΩ · m,statohm*m,898755291711.548,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,teraohm meter,teraohm meters,TΩ · m,Tohm*m,1000000000000,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,yoctoohm meter,yoctoohm meters,yΩ · m,yohm*m,1E-24,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,yottaohm meter,yottaohm meters,YΩ · m,Yohm*m,1E+024,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,zeptoohm meter,zeptoohm meters,zΩ · m,zohm*m,1E-21,0 -ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,zettaohm meter,zettaohm meters,ZΩ · m,Zohm*m,1E+021,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,attojoule,attojoules,aJ,aJ,1E-18,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,British thermal unit,British thermal units,Btu,Btu,1054.35,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,British thermal unit (39 °F),British thermal units (39 °F),Btu₃₉,Btu\39,1059.67,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,British thermal unit (59 °F),British thermal units (59 °F),Btu₅₉,Btu\59,1054.8,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,British thermal unit (60 °F),British thermal units (60 °F),Btu₆₀,Btu\60,1054.68,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,British thermal unit (IT),British thermal units (IT),Btu (IT),Btu (IT),1055.056,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,calorie,calories,cal,cal,4.184,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,calorie (15 °C),calories (15 °C),cal₁₅,Cal\15,4.1858,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,calorie (20 °C),calories (20 °C),cal₂₀,Cal\20,4.1819,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,calorie (IT),calories (IT),cal (IT),cal (IT),4.1868,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,Calorie (IT),Calories (IT),Cal (IT),Cal (IT),4186.8,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,Calorie,Calories,Cal,Cal,4184,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,centijoule,centijoules,cJ,cJ,0.01,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,decaelectronvolt,decaelectronvolts,daeV,daeV,1.602176634E-18,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,decajoule,decajoules,daJ,daJ,10,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,decawatt hour,decawatt hours,daW · h,daW*h,36000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,decijoule,decijoules,dJ,dJ,0.1,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,electronvolt,electronvolts,eV,eV,1.602176634E-19,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,erg,ergs,erg,erg,0.0000001,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,exajoule,exajoules,EJ,EJ,1E+018,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,femtojoule,femtojoules,fJ,fJ,1E-15,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,foot pound-force,foot pounds-force,ft · lbf,ft*lbf,1.355818,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,foot poundal,foot poundals,ft · pdl,ft*pdl,0.04214011,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,gigaelectronvolt,gigaelectronvolts,GeV,GeV,1.602176634E-10,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,gigajoule,gigajoules,GJ,GJ,1000000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,gigawatt hour,gigawatt hours,GW · h,GW*h,3600000000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,hartree,hartrees,Eₕ,E\h,4.3597447222071E-18,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,hectoelectronvolt,hectoelectronvolts,heV,heV,1.602176634E-17,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,hectojoule,hectojoules,hJ,hJ,100,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,hectowatt hour,hectowatt hours,hW · h,hW*h,360000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,joule,joules,J,J,1,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,kilocalorie,kilocalories,kcal,kcal,4184,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,kilocalorie (IT),kilocalories (IT),kcal (IT),Kcal (IT),4186.8,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,kiloelectronvolt,kiloelectronvolts,keV,keV,1.602176634E-16,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,kilojoule,kilojoules,kJ,kJ,1000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,kilowatt hour,kilowatt hours,kW · h,kW*h,3600000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,megaelectronvolt,megaelectronvolts,MeV,MeV,1.602176634E-13,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,megajoule,megajoules,MJ,MJ,1000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,megawatt hour,megawatt hours,MW · h,MW*h,3600000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,microjoule,microjoules,µJ,uJ,0.000001,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,microwatt hour,microwatt hours,µW · h,uW*h,0.0036,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,millijoule,millijoules,mJ,mJ,0.001,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,milliwatt hour,milliwatt hours,mW · h,mW*h,3.6,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,nanojoule,nanojoules,nJ,nJ,0.000000001,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,petaelectronvolt,petaelectronvolts,PeV,PeV,0.0001602176634,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,petajoule,petajoules,PJ,PJ,1000000000000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,petawatt hour,petawatt hours,PW · h,PW*h,3.6E+018,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,picojoule,picojoules,pJ,pJ,1E-12,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,quad,quads,10¹⁵ Btu (IT),10^15 Btu (IT),1.055056E+018,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,teraelectronvolt,teraelectronvolts,TeV,TeV,0.0000001602176634,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,terajoule,terajoules,TJ,TJ,1000000000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,terawatt hour,terawatt hours,TW · h,TW*h,3600000000000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,therm (EC),therms (EC),thm (EC),Thm (EC),105506000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,therm,therms,thm,thm,105480400,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,ton of TNT,tons of TNT,t of TNT,T of TNT,4184000000,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,watt hour,watt hours,W · h,W*h,3600,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,watt second,watt seconds,W · s,W*s,1,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,yoctojoule,yoctojoules,yJ,yJ,1E-24,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,yottajoule,yottajoules,YJ,YJ,1E+024,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,zeptojoule,zeptojoules,zJ,zJ,1E-21,0 -Energy,2,1,-2,0,0,0,0,false,false,false,false,false,zettajoule,zettajoules,ZJ,ZJ,1E+021,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,attonewton,attonewtons,aN,aN,1E-18,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,centinewton,centinewtons,cN,cN,0.01,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,decanewton,decanewtons,daN,daN,10,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,decinewton,decinewtons,dN,dN,0.1,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,dyne,dynes,dyn,dyn,0.00001,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,exanewton,exanewtons,EN,EN,1E+018,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,femtonewton,femtonewtons,fN,fN,1E-15,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,giganewton,giganewtons,GN,GN,1000000000,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,hectonewton,hectonewtons,hN,hN,100,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,kilogram-force,kilograms-force,kgf,kgf,9.80665,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,kilonewton,kilonewtons,kN,kN,1000,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,kip,kips,kip,kip,4448.222,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,meganewton,meganewtons,MN,MN,1000000,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,micronewton,micronewtons,µN,uN,0.000001,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,millinewton,millinewtons,mN,mN,0.001,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,nanonewton,nanonewtons,nN,nN,0.000000001,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,newton,newtons,N,N,1,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,ounce-force,ounces-force,ozf,ozf,0.2780139,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,petanewton,petanewtons,PN,PN,1000000000000000,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,piconewton,piconewtons,pN,pN,1E-12,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,pound-force,pounds-force,lbf,lbf,4.448222,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,poundal,poundals,pdl,pdl,0.138255,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,teranewton,teranewtons,TN,TN,1000000000000,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,ton-force,tons-force,2000 lbf,2000 lbf,8896.443,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,yoctonewton,yoctonewtons,yN,yN,1E-24,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,yottanewton,yottanewtons,YN,YN,1E+024,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,zeptonewton,zeptonewtons,zN,zN,1E-21,0 -Force,1,1,-2,0,0,0,0,false,false,false,false,false,zettanewton,zettanewtons,ZN,ZN,1E+021,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,attohertz,attohertz,aHz,aHz,1E-18,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,centihertz,centihertz,cHz,cHz,0.01,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,cycle per day,cycles per day,1/d,1/d,1.15740740740741E-05,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,cycle per hour,cycles per hour,1/h,1/h,0.000277777777777778,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,cycle per minute,cycles per minute,1/min,1/min,0.0166666666666667,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,cycle per shake,cycles per shake,100 MHz,100 MHz,100000000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,cycle per year,cycles per year,1/a,1/a,3.17097919837646E-08,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,decahertz,decahertz,daHz,daHz,10,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,decihertz,decihertz,dHz,dHz,0.1,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,exahertz,exahertz,EHz,EHz,1E+018,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,femtohertz,femtohertz,fHz,fHz,1E-15,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,gigahertz,gigahertz,GHz,GHz,1000000000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,hectohertz,hectohertz,hHz,hHz,100,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,hertz,hertz,Hz,Hz,1,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,kilohertz,kilohertz,kHz,kHz,1000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,megahertz,megahertz,MHz,MHz,1000000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,microhertz,microhertz,µHz,uHz,0.000001,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,millihertz,millihertz,mHz,mHz,0.001,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,nanohertz,nanohertz,nHz,nHz,0.000000001,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,petahertz,petahertz,PHz,PHz,1000000000000000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,picohertz,picohertz,pHz,pHz,1E-12,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,terahertz,terahertz,THz,THz,1000000000000,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,yoctohertz,yoctohertz,yHz,yHz,1E-24,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,yottahertz,yottahertz,YHz,YHz,1E+024,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,zeptohertz,zeptohertz,zHz,zHz,1E-21,0 -Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,zettahertz,zettahertz,ZHz,ZHz,1E+021,0 -FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,gigahertz per second,gigahertz per second,GHz/s,GHz/s,1000000000,0 -FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,hertz per second,hertz per second,Hz/s,Hz/s,1,0 -FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,kilohertz per second,kilohertz per second,kHz/s,kHz/s,1000,0 -FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,megahertz per second,megahertz per second,MHz/s,MHz/s,1000000,0 -FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,terahertz per second,terahertz per second,THz/s,THz/s,1000000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,attogram square meter per second squared kelvin,attogram square meters per second squared kelvin,ag · m²/(s² · K),ag*m^2/(s^2*K),1E-21,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,attojoule per kelvin,attojoules per kelvin,aJ/K,aJ/K,1E-18,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,Boltzmann constant,Boltzmann constants,k,k,1.380649E-23,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per degree Fahrenheit,British thermal units (IT) per degree Fahrenheit,Btu (IT)/°F,Btu (IT)/degF,1899.1008,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,British thermal unit per degree Fahrenheit,British thermal units per degree Fahrenheit,Btu/°F,Btu/degF,1897.83,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,calorie per kelvin,calories per kelvin,cal/K,cal/K,4.184,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,centigram square meter per second squared kelvin,centigram square meters per second squared kelvin,cg · m²/(s² · K),cg*m^2/(s^2*K),0.00001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,centijoule per kelvin,centijoules per kelvin,cJ/K,cJ/K,0.01,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,decagram square meter per second squared kelvin,decagram square meters per second squared kelvin,dag · m²/(s² · K),dag*m^2/(s^2*K),0.01,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,decajoule per kelvin,decajoules per kelvin,daJ/K,daJ/K,10,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,decigram square meter per second squared kelvin,decigram square meters per second squared kelvin,dg · m²/(s² · K),dg*m^2/(s^2*K),0.0001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,decijoule per kelvin,decijoules per kelvin,dJ/K,dJ/K,0.1,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,exagram square meter per second squared kelvin,exagram square meters per second squared kelvin,Eg · m²/(s² · K),Eg*m^2/(s^2*K),1000000000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,exajoule per kelvin,exajoules per kelvin,EJ/K,EJ/K,1E+018,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,femtogram square meter per second squared kelvin,femtogram square meters per second squared kelvin,fg · m²/(s² · K),fg*m^2/(s^2*K),1E-18,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,femtojoule per kelvin,femtojoules per kelvin,fJ/K,fJ/K,1E-15,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,gigagram square meter per second squared kelvin,gigagram square meters per second squared kelvin,Gg · m²/(s² · K),Gg*m^2/(s^2*K),1000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,gigajoule per kelvin,gigajoules per kelvin,GJ/K,GJ/K,1000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,gram square meter per second squared kelvin,gram square meters per second squared kelvin,g · m²/(s² · K),g*m^2/(s^2*K),0.001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,hectogram square meter per second squared kelvin,hectogram square meters per second squared kelvin,hg · m²/(s² · K),hg*m^2/(s^2*K),0.1,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,hectojoule per kelvin,hectojoules per kelvin,hJ/K,hJ/K,100,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,joule per degree celsius,joules per degree celsius,J/°C,J/degC,1,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,joule per kelvin,joules per kelvin,J/K,J/K,1,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,kilogram square meter per second squared kelvin,kilogram square meters per second squared kelvin,kg · m²/(s² · K),kg*m^2/(s^2*K),1,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,kilojoule per degree celsius,kilojoules per degree celsius,kJ/°C,kJ/degC,1000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,kilojoule per kelvin,kilojoules per kelvin,kJ/K,kJ/K,1000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,megagram square meter per second squared kelvin,megagram square meters per second squared kelvin,Mg · m²/(s² · K),Mg*m^2/(s^2*K),1000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,megajoule per kelvin,megajoules per kelvin,MJ/K,MJ/K,1000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,microgram square meter per second squared kelvin,microgram square meters per second squared kelvin,µg · m²/(s² · K),ug*m^2/(s^2*K),0.000000001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,microjoule per kelvin,microjoules per kelvin,µJ/K,uJ/K,0.000001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,milligram square meter per second squared kelvin,milligram square meters per second squared kelvin,mg · m²/(s² · K),mg*m^2/(s^2*K),0.000001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,millijoule per degree celsius,millijoules per degree celsius,mJ/°C,mJ/degC,0.001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,millijoule per kelvin,millijoules per kelvin,mJ/K,mJ/K,0.001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,nanogram square meter per second squared kelvin,nanogram square meters per second squared kelvin,ng · m²/(s² · K),ng*m^2/(s^2*K),1E-12,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,nanojoule per kelvin,nanojoules per kelvin,nJ/K,nJ/K,0.000000001,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,petagram square meter per second squared kelvin,petagram square meters per second squared kelvin,Pg · m²/(s² · K),Pg*m^2/(s^2*K),1000000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,petajoule per kelvin,petajoules per kelvin,PJ/K,PJ/K,1000000000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,picogram square meter per second squared kelvin,picogram square meters per second squared kelvin,pg · m²/(s² · K),pg*m^2/(s^2*K),1E-15,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,picojoule per kelvin,picojoules per kelvin,pJ/K,pJ/K,1E-12,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,teragram square meter per second squared kelvin,teragram square meters per second squared kelvin,Tg · m²/(s² · K),Tg*m^2/(s^2*K),1000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,terajoule per kelvin,terajoules per kelvin,TJ/K,TJ/K,1000000000000,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,yoctogram square meter per second squared kelvin,yoctogram square meters per second squared kelvin,yg · m²/(s² · K),yg*m^2/(s^2*K),1E-27,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,yoctojoule per kelvin,yoctojoules per kelvin,yJ/K,yJ/K,1E-24,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,yottagram square meter per second squared kelvin,yottagram square meters per second squared kelvin,Yg · m²/(s² · K),Yg*m^2/(s^2*K),1E+021,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,yottajoule per kelvin,yottajoules per kelvin,YJ/K,YJ/K,1E+024,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,zeptogram square meter per second squared kelvin,zeptogram square meters per second squared kelvin,zg · m²/(s² · K),zg*m^2/(s^2*K),1E-24,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,zeptojoule per kelvin,zeptojoules per kelvin,zJ/K,zJ/K,1E-21,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,zettagram square meter per second squared kelvin,zettagram square meters per second squared kelvin,Zg · m²/(s² · K),Zg*m^2/(s^2*K),1E+018,0 -HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,zettajoule per kelvin,zettajoules per kelvin,ZJ/K,ZJ/K,1E+021,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,attowatt per square meter,attowatts per square meter,aW/m²,aW/m^2,1E-18,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,centiwatt per square meter,centiwatts per square meter,cW/m²,cW/m^2,0.01,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,decawatt per square meter,decawatts per square meter,daW/m²,daW/m^2,10,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,deciwatt per square meter,deciwatts per square meter,dW/m²,dW/m^2,0.1,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,exawatt per square meter,exawatts per square meter,EW/m²,EW/m^2,1E+018,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,femtowatt per square meter,femtowatts per square meter,fW/m²,fW/m^2,1E-15,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,gigawatt per square meter,gigawatts per square meter,GW/m²,GW/m^2,1000000000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,hectowatt per square meter,hectowatts per square meter,hW/m²,hW/m^2,100,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,kilowatt per square meter,kilowatts per square meter,kW/m²,kW/m^2,1000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,megawatt per square meter,megawatts per square meter,MW/m²,MW/m^2,1000000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,microwatt per square meter,microwatts per square meter,µW/m²,uW/m^2,0.000001,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,milliwatt per square meter,milliwatts per square meter,mW/m²,mW/m^2,0.001,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,nanowatt per square meter,nanowatts per square meter,nW/m²,nW/m^2,0.000000001,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,petawatt per square meter,petawatts per square meter,PW/m²,PW/m^2,1000000000000000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,picowatt per square meter,picowatts per square meter,pW/m²,pW/m^2,1E-12,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,terawatt per square meter,terawatts per square meter,TW/m²,TW/m^2,1000000000000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,watt per square centimeter,watts per square centimeter,W/cm²,W/cm^2,10000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,watt per square meter,watts per square meter,W/m²,W/m^2,1,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,watt per square millimeter,watts per square millimeter,W/mm²,W/mm^2,1000000,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,yoctowatt per square meter,yoctowatts per square meter,yW/m²,yW/m^2,1E-24,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,yottawatt per square meter,yottawatts per square meter,YW/m²,YW/m^2,1E+024,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,zeptowatt per square meter,zeptowatts per square meter,zW/m²,zW/m^2,1E-21,0 -HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,zettawatt per square meter,zettawatts per square meter,ZW/m²,ZW/m^2,1E+021,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,attogram per second cubed kelvin,attograms per second cubed kelvin,ag/(s³ · K),ag/(s^3*K),1E-21,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,attowatt per square meter kelvin,attowatts per square meter kelvin,aW/(m² · K),aW/(m^2*K),1E-18,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per hour square foot degree Fahrenheit,British thermal units (IT) per hour square foot degree Fahrenheit,Btu (IT)/(hr · ft² · °F),Btu (IT)/(hr*ft^2*degF),5.67826413430605,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per hour square inch degree Fahrenheit,British thermal units (IT) per hour square inch degree Fahrenheit,Btu (IT)/(hr · in² · °F),Btu (IT)/(hr*in^2*degF),817.670035340071,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per minute square foot degree Fahrenheit,British thermal units (IT) per minute square foot degree Fahrenheit,Btu (IT)/(min · ft² · °F),Btu (IT)/(min*ft^2*degF),340.695848058363,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per minute square inch degree Fahrenheit,British thermal units (IT) per minute square inch degree Fahrenheit,Btu (IT)/(min · in² · °F),Btu (IT)/(min*in^2*degF),49060.2021204043,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per second square foot degree Fahrenheit,British thermal units (IT) per second square foot degree Fahrenheit,Btu (IT)/(s · ft² · °F),Btu (IT)/(s*ft^2*degF),20441.7508835018,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per second square inch degree Fahrenheit,British thermal units (IT) per second square inch degree Fahrenheit,Btu (IT)/(s · in² · °F),Btu (IT)/(s*in^2*degF),2943612.12722425,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per hour square foot degree Fahrenheit,British thermal units per hour square foot degree Fahrenheit,Btu/(hr · ft² · °F),Btu/(hr*ft^2*degF),5.67446447392895,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per hour square inch degree Fahrenheit,British thermal units per hour square inch degree Fahrenheit,Btu/(hr · in² · °F),Btu/(hr*in^2*degF),817.122884245769,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per minute square foot degree Fahrenheit,British thermal units per minute square foot degree Fahrenheit,Btu/(min · ft² · °F),Btu/(min*ft^2*degF),340.467868435737,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per minute square inch degree Fahrenheit,British thermal units per minute square inch degree Fahrenheit,Btu/(min · in² · °F),Btu/(min*in^2*degF),49027.3730547461,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per second square foot degree Fahrenheit,British thermal units per second square foot degree Fahrenheit,Btu/(s · ft² · °F),Btu/(s*ft^2*degF),20428.0721061442,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,British thermal unit per second square inch degree Fahrenheit,British thermal units per second square inch degree Fahrenheit,Btu/(s · in² · °F),Btu/(s*in^2*degF),2941642.38328477,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,centigram per second cubed kelvin,centigrams per second cubed kelvin,cg/(s³ · K),cg/(s^3*K),0.00001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,centiwatt per square meter kelvin,centiwatts per square meter kelvin,cW/(m² · K),cW/(m^2*K),0.01,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,decagram per second cubed kelvin,decagrams per second cubed kelvin,dag/(s³ · K),dag/(s^3*K),0.01,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,decawatt per square meter kelvin,decawatts per square meter kelvin,daW/(m² · K),daW/(m^2*K),10,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,decigram per second cubed kelvin,decigrams per second cubed kelvin,dg/(s³ · K),dg/(s^3*K),0.0001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,deciwatt per square meter kelvin,deciwatts per square meter kelvin,dW/(m² · K),dW/(m^2*K),0.1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,exagram per second cubed kelvin,exagrams per second cubed kelvin,Eg/(s³ · K),Eg/(s^3*K),1000000000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,exawatt per square meter kelvin,exawatts per square meter kelvin,EW/(m² · K),EW/(m^2*K),1E+018,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,femtogram per second cubed kelvin,femtograms per second cubed kelvin,fg/(s³ · K),fg/(s^3*K),1E-18,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,femtowatt per square meter kelvin,femtowatts per square meter kelvin,fW/(m² · K),fW/(m^2*K),1E-15,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,gigagram per second cubed kelvin,gigagrams per second cubed kelvin,Gg/(s³ · K),Gg/(s^3*K),1000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,gigawatt per square meter kelvin,gigawatts per square meter kelvin,GW/(m² · K),GW/(m^2*K),1000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,gram per second cubed kelvin,grams per second cubed kelvin,g/(s³ · K),g/(s^3*K),0.001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,hectogram per second cubed kelvin,hectograms per second cubed kelvin,hg/(s³ · K),hg/(s^3*K),0.1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,hectowatt per square meter kelvin,hectowatts per square meter kelvin,hW/(m² · K),hW/(m^2*K),100,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,joule per second square meter degree celsius,joules per second square meter degree celsius,J/(s · m² · °C),J/(s*m^2*degC),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,joule per second square meter kelvin,joules per second square meter kelvin,J/(s · m² · K),J/(s*m^2*K),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,kilogram per second cubed degree celsius,kilograms per second cubed degree celsius,kg/(s³ · °C),kg/(s^3*degC),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,kilogram per second cubed kelvin,kilograms per second cubed kelvin,kg/(s³ · K),kg/(s^3*K),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,kilowatt per square meter kelvin,kilowatts per square meter kelvin,kW/(m² · K),kW/(m^2*K),1000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,megagram per second cubed kelvin,megagrams per second cubed kelvin,Mg/(s³ · K),Mg/(s^3*K),1000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,megawatt per square meter kelvin,megawatts per square meter kelvin,MW/(m² · K),MW/(m^2*K),1000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,microgram per second cubed kelvin,micrograms per second cubed kelvin,µg/(s³ · K),ug/(s^3*K),0.000000001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,microwatt per square meter kelvin,microwatts per square meter kelvin,µW/(m² · K),uW/(m^2*K),0.000001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,milligram per second cubed kelvin,milligrams per second cubed kelvin,mg/(s³ · K),mg/(s^3*K),0.000001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,milliwatt per square meter kelvin,milliwatts per square meter kelvin,mW/(m² · K),mW/(m^2*K),0.001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,nanogram per second cubed kelvin,nanograms per second cubed kelvin,ng/(s³ · K),ng/(s^3*K),1E-12,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,nanowatt per square meter kelvin,nanowatts per square meter kelvin,nW/(m² · K),nW/(m^2*K),0.000000001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,petagram per second cubed kelvin,petagrams per second cubed kelvin,Pg/(s³ · K),Pg/(s^3*K),1000000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,petawatt per square meter kelvin,petawatts per square meter kelvin,PW/(m² · K),PW/(m^2*K),1000000000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,picogram per second cubed kelvin,picograms per second cubed kelvin,pg/(s³ · K),pg/(s^3*K),1E-15,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,picowatt per square meter kelvin,picowatts per square meter kelvin,pW/(m² · K),pW/(m^2*K),1E-12,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,teragram per second cubed kelvin,teragrams per second cubed kelvin,Tg/(s³ · K),Tg/(s^3*K),1000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,terawatt per square meter kelvin,terawatts per square meter kelvin,TW/(m² · K),TW/(m^2*K),1000000000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,watt per square centimeter degree celsius,watts per square centimeter degree celsius,W/(cm² · °C),W/(cm^2*degC),10000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,watt per square kilometer degree celsius,watts per square kilometer degree celsius,W/(km² · °C),W/(km^2*degC),0.000001,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,watt per square meter degree celsius,watts per square meter degree celsius,W/(m² · °C),W/(m^2*degC),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,watt per square meter kelvin,watts per square meter kelvin,W/(m² · K),W/(m^2*K),1,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,watt per square millimeter degree celsius,watts per square millimeter degree celsius,W/(mm² · °C),W/(mm^2*degC),1000000,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,yoctogram per second cubed kelvin,yoctograms per second cubed kelvin,yg/(s³ · K),yg/(s^3*K),1E-27,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,yoctowatt per square meter kelvin,yoctowatts per square meter kelvin,yW/(m² · K),yW/(m^2*K),1E-24,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,yottagram per second cubed kelvin,yottagrams per second cubed kelvin,Yg/(s³ · K),Yg/(s^3*K),1E+021,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,yottawatt per square meter kelvin,yottawatts per square meter kelvin,YW/(m² · K),YW/(m^2*K),1E+024,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,zeptogram per second cubed kelvin,zeptograms per second cubed kelvin,zg/(s³ · K),zg/(s^3*K),1E-24,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,zeptowatt per square meter kelvin,zeptowatts per square meter kelvin,zW/(m² · K),zW/(m^2*K),1E-21,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,zettagram per second cubed kelvin,zettagrams per second cubed kelvin,Zg/(s³ · K),Zg/(s^3*K),1E+018,0 -HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,zettawatt per square meter kelvin,zettawatts per square meter kelvin,ZW/(m² · K),ZW/(m^2*K),1E+021,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,abhenry,abhenries,abH,abH,0.000000001,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,attohenry,attohenries,aH,aH,1E-18,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,centihenry,centihenries,cH,cH,0.01,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,decahenry,decahenries,daH,daH,10,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,decihenry,decihenries,dH,dH,0.1,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,exahenry,exahenries,EH,EH,1E+018,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,femtohenry,femtohenries,fH,fH,1E-15,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,gigahenry,gigahenries,GH,GH,1000000000,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,hectohenry,hectohenries,hH,hH,100,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,henry,henries,H,H,1,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,kilohenry,kilohenries,kH,kH,1000,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,megahenry,megahenries,MH,MH,1000000,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,microhenry,microhenries,µH,uH,0.000001,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,millihenry,millihenries,mH,mH,0.001,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,nanohenry,nanohenries,nH,nH,0.000000001,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,petahenry,petahenries,PH,PH,1000000000000000,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,picohenry,picohenries,pH,pH,1E-12,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,stathenry,stathenries,statH,statH,898755291711.548,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,terahenry,terahenries,TH,TH,1000000000000,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,yoctohenry,yoctohenries,yH,yH,1E-24,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,yottahenry,yottahenries,YH,YH,1E+024,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,zeptohenry,zeptohenries,zH,zH,1E-21,0 -Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,zettahenry,zettahenries,ZH,ZH,1E+021,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,bit,bits,b,bit,0.125,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,byte,bytes,B,B,1,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,crumb,crumbs,crumb,crumb,0.25,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,deciban,decibans,deciban,deciban,0.041524101186092,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,exabit,exabits,Eb,Eb,1.25E+017,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,exabyte,exabytes,EB,EB,1E+018,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,exbibit,exbibits,Eib,Eib,1.44115188075856E+017,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,exbibyte,exbibytes,EiB,EiB,1.15292150460685E+018,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,gibibit,gibibits,Gib,Gib,134217728,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,gibibyte,gibibytes,GiB,GiB,1073741824,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,gigabit,gigabits,Gb,Gb,125000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,gigabyte,gigabytes,GB,GB,1000000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,hartley,hartleys,Hart,Hart,0.41524101186092,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,kibibit,kibibits,Kib,Kib,128,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,kibibyte,kibibytes,KiB,KiB,1024,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,kilobit,kilobits,kb,kb,125,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,kilobyte,kilobytes,kB,kB,1000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,mebibit,mebibits,Mib,Mib,131072,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,mebibyte,mebibytes,MiB,MiB,1048576,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,megabit,megabits,Mb,Mb,125000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,megabyte,megabytes,MB,MB,1000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,natural unit of uniformation,natural units of information,nat,nat,0.18033688011112,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,nibble,nibbles,nibble,nibble,0.5,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,octet,octets,o,o,1,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,pebibit,pebibits,Pib,Pib,140737488355328,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,pebibyte,pebibytes,PiB,PiB,1125899906842624,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,petabit,petabits,Pb,Pb,125000000000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,petabyte,petabytes,PB,PB,1000000000000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,shannon,shannons,Sh,Sh,0.125,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,tibibit,tibibits,Tib,Tib,137438953472,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,tibibyte,tibibytes,TiB,TiB,1099511627776,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,terabit,terabits,Tb,Tb,125000000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,terabyte,terabytes,TB,TB,1000000000000,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,trit,trits,trit,trit,0.198120312590145,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,yobibit,yobibits,Yib,Yib,1.51115727451829E+023,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,yobibyte,yobibytes,YiB,YiB,1.20892581961463E+024,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,yottabit,yottabits,Yb,Yb,1.25E+023,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,yottabyte,yottabytes,YB,YB,1E+024,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,zebibit,zebibits,Zib,Zib,1.47573952589676E+020,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,zebibyte,zebibytes,ZiB,ZiB,1.18059162071741E+021,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,zettabit,zettabits,Zb,Zb,1.25E+020,0 -Information,0,0,0,0,0,0,0,false,false,true,false,false,zettabyte,zettabytes,ZB,ZB,1E+021,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,bit per second,bits per second,b/s,b/s,0.125,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,byte per second,bytes per second,B/s,B/s,1,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,exabit per second,exabits per second,Eb/s,Eb/s,1.25E+017,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,exabyte per second,exabytes per second,EB/s,EB/s,1E+018,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,exbibit per second,exbibits per second,Eib/s,Eib/s,1.44115188075856E+017,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,exbibyte per second,exbibytes per second,EiB/s,EiB/s,1.15292150460685E+018,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,gibibit per second,gibibits per second,Gib/s,Gib/s,134217728,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,gibibyte per second,gibibytes per second,GiB/s,GiB/s,1073741824,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,gigabit per second,gigabits per second,Gb/s,Gb/s,125000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,gigabyte per second,gigabytes per second,GB/s,GB/s,1000000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,kibibit per second,kibibits per second,Kib/s,Kib/s,128,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,kibibyte per second,kibibytes per second,KiB/s,KiB/s,1024,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,kilobit per second,kilobits per second,kb/s,kb/s,125,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,kilobyte per second,kilobytes per second,kB/s,kB/s,1000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,mebibit per second,mebibits per second,Mib/s,Mib/s,131072,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,mebibyte per second,mebibytes per second,MiB/s,MiB/s,1048576,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,megabit per second,megabits per second,Mb/s,Mb/s,125000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,megabyte per second,megabytes per second,MB/s,MB/s,1000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,octet per second,octets per second,o/s,o/s,1,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,pebibit per second,pebibits per second,Pib/s,Pib/s,140737488355328,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,pebibyte per second,pebibytes per second,PiB/s,PiB/s,1125899906842624,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,petabit per second,petabits per second,Pb/s,Pb/s,125000000000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,petabyte per second,petabytes per second,PB/s,PB/s,1000000000000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,tebibit per second,tebibits per second,Tib/s,Tib/s,137438953472,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,tebibyte per second,tebibytes per second,TiB/s,TiB/s,1099511627776,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,terabit per second,terabits per second,Tb/s,Tb/s,125000000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,terabyte per second,terabytes per second,TB/s,TB/s,1000000000000,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,yobibit per second,yobibits per second,Yib/s,Yib/s,1.51115727451829E+023,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,yobibyte per second,yobibytes per second,YiB/s,YiB/s,1.20892581961463E+024,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,yottabit per second,yottabits per second,Yb/s,Yb/s,1.25E+023,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,yottabyte per second,yottabytes per second,YB/s,YB/s,1E+024,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,zebibit per second,zebibits per second,Zib/s,Zib/s,1.47573952589676E+020,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,zebibyte per second,zebibytes per second,ZiB/s,ZiB/s,1.18059162071741E+021,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,zettabit per second,zettabits per second,Zb/s,Zb/s,1.25E+020,0 -InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,zettabyte per second,zettabytes per second,ZB/s,ZB/s,1E+021,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,attosecond per meter,attoseconds per meter,am/s,am/s (inverse),1E-18,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,centisecond per meter,centiseconds per meter,cm/s,cm/s (inverse),0.01,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,decasecond per meter,decaseconds per meter,dam/s,dam/s (inverse),10,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,decisecond per meter,deciseconds per meter,dm/s,dm/s (inverse),0.1,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,exasecond per meter,exaseconds per meter,Em/s,Em/s (inverse),1E+018,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,femtosecond per meter,femtoseconds per meter,fm/s,fm/s (inverse),1E-15,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,gigasecond per meter,gigaseconds per meter,Gm/s,Gm/s (inverse),1000000000,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,hectosecond per meter,hectoseconds per meter,hm/s,hm/s (inverse),100,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,hour per foot,hours per foot,h/ft,h/ft (inverse),11811.0236220472,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,hour per kilometer,hours per kilometer,h/km,h/km (inverse),3.6,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,hour per mile,hours per mile,h/mi,h/mi (inverse),2.2369362920544,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,kilosecond per meter,kiloseconds per meter,km/s,km/s (inverse),1000,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,megasecond per meter,megaseconds per meter,Mm/s,Mm/s (inverse),1000000,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,microsecond per meter,microseconds per meter,µm/s,um/s (inverse),0.000001,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,millisecond per meter,milliseconds per meter,mm/s,mm/s (inverse),0.001,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,minute per foot,minutes per foot,min/ft,min/ft (inverse),196.850393700787,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,minute per mile,minutes per mile,min/mi,min/mi (inverse),0.03728227153,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,nanosecond per meter,nanoseconds per meter,nm/s,nm/s (inverse),0.000000001,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,petasecond per meter,petaseconds per meter,Pm/s,Pm/s (inverse),1000000000000000,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,picosecond per meter,picoseconds per meter,pm/s,pm/s (inverse),1E-12,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,second per foot,seconds per foot,s/ft,s/ft (inverse),3.28083989501312,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,second per inch,seconds per inch,s/in,s/in (inverse),39.3700787401575,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,second per meter,seconds per meter,m/s,m/s (inverse),1,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,second per mile,seconds per mile,s/mi,s/mi (inverse),0.000621371192237334,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,terasecond per meter,teraseconds per meter,Tm/s,Tm/s (inverse),1000000000000,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,yoctosecond per meter,yoctoseconds per meter,ym/s,ym/s (inverse),1E-24,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,yottasecond per meter,yottaseconds per meter,Ym/s,Ym/s (inverse),1E+024,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,zeptosecond per meter,zeptoseconds per meter,zm/s,zm/s (inverse),1E-21,0 -InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,zettasecond per meter,zettaseconds per meter,Zm/s,Zm/s (inverse),1E+021,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,attometer per second cubed,attometers per second cubed,am/s³,am/s^3,1E-18,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,centimeter per second cubed,centimeters per second cubed,cm/s³,cm/s^3,0.01,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,decameter per second cubed,decameters per second cubed,dam/s³,dam/s^3,10,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,decimeter per second cubed,decimeters per second cubed,dm/s³,dm/s^3,0.1,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,exameter per second cubed,exameters per second cubed,Em/s³,Em/s^3,1E+018,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,femtometer per second cubed,femtometers per second cubed,fm/s³,fm/s^3,1E-15,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,foot per second cubed,feet per second cubed,ft/s³,ft/s^3,0.3048,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,gigameter per second cubed,gigameters per second cubed,Gm/s³,Gm/s^3,1000000000,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,hectometer per second cubed,hectometers per second cubed,hm/s³,hm/s^3,100,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,inch per second cubed,inches per second cubed,in/s³,in/s^3,0.0254,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,kilometer per minute cubed,kilometers per minute cubed,km/min³,km/min^3,0.00462962962962963,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,kilometer per second cubed,kilometers per second cubed,km/s³,km/s^3,1000,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,megameter per second cubed,megameters per second cubed,Mm/s³,Mm/s^3,1000000,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,meter per second cubed,meters per second cubed,m/s³,m/s^3,1,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,micrometer per second cubed,micrometers per second cubed,µm/s³,um/s^3,0.000001,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,millimeter per second cubed,millimeters per second cubed,mm/s³,mm/s^3,0.001,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,nanometer per second cubed,nanometers per second cubed,nm/s³,nm/s^3,0.000000001,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,petameter per second cubed,petameters per second cubed,Pm/s³,Pm/s^3,1000000000000000,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,picometer per second cubed,picometers per second cubed,pm/s³,pm/s^3,1E-12,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,terameter per second cubed,terameters per second cubed,Tm/s³,Tm/s^3,1000000000000,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,yoctometer per second cubed,yoctometers per second cubed,ym/s³,ym/s^3,1E-24,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,yottameter per second cubed,yottameters per second cubed,Ym/s³,Ym/s^3,1E+024,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,zeptometer per second cubed,zeptometers per second cubed,zm/s³,zm/s^3,1E-21,0 -Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,zettameter per second cubed,zettameters per second cubed,Zm/s³,Zm/s^3,1E+021,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,ångström,ångströms,Å,ang,1E-10,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,astronomical unit,astronomical units,ua,ua,149597900000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,atomic unit of length,atomic units of length,a.u. of length,a.u. of length,5.29177210903E-11,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,attometer,attometers,am,am,1E-18,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,bohr radius,bohr radiuses,a₀,a\0,5.29177210903E-11,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,centimeter,centimeters,cm,cm,0.01,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,chain,chains,ch,ch,20.11684,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,decameter,decameters,dam,dam,10,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,decimeter,decimeters,dm,dm,0.1,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,exameter,exameters,Em,Em,1E+018,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,fathom,fathoms,fathom,fathom,1.828804,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,femtometer,femtometers,fm,fm,1E-15,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,fermi,fermis,fermi,fermi,1E-15,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,foot,feet,ft,ft,0.3048,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,foot (U.S. survey),feet (U.S. survey),ft (U.S. survey),ft (U.S. survey),0.3048006,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,gigameter,gigameters,Gm,Gm,1000000000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,hectometer,hectometers,hm,hm,100,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,inch,inches,in,in,0.0254,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,kilometer,kilometers,km,km,1000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,light year,light years,l. y.,l. y.,9.46073E+015,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,megameter,megameters,Mm,Mm,1000000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,meter,meters,m,m,1,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,microinch,microinches,μin,uin,0.0000000254,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,micrometer,micrometers,µm,um,0.000001,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,micron,microns,μ,u,0.000001,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,mil,mils,0.001 in,0.001 in,0.0000254,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,mile,miles,mi,mi,1609.344,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,mile (U.S. survey),miles (U.S. survey),mi (U.S. survey),mi (U.S. survey),1609.347,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,millimeter,millimeters,mm,mm,0.001,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,nanometer,nanometers,nm,nm,0.000000001,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,nautical mile,nautical miles,M,M,1852,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,parsec,parsecs,pc,pc,3.085678E+016,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,petameter,petameters,Pm,Pm,1000000000000000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,pica (computer),picas (computer),1/6 in (computer),1/6 in (computer),0.00423333333333333,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,pica (printer's),picas (printer's),1/6 in,1/6 in,0.004217518,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,picometer,picometers,pm,pm,1E-12,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,point (computer),points (computer),1/72 in (computer),1/72 in (computer),0.0003527778,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,point (printer's),points (printer's),1/72 in,1/72 in,0.0003514598,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,rod,rods,rd,rd,5.02921,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,terameter,terameters,Tm,Tm,1000000000000,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,yard,yards,yd,yd,0.9144,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,yoctometer,yoctometers,ym,ym,1E-24,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,yottameter,yottameters,Ym,Ym,1E+024,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,zeptometer,zeptometers,zm,zm,1E-21,0 -Length,1,0,0,0,0,0,0,false,false,false,false,false,zettameter,zettameters,Zm,Zm,1E+021,0 -LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,state per centimeter electronvolt,states per centimeter electronvolt,1/(cm · eV),1/(cm*eV),6.24150907446076E+020,0 -LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,state per centimeter joule,states per centimeter joule,1/(cm · J),1/(cm*J),100,0 -LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,state per meter joule,states per meter joule,1/(m · J),1/(m*J),1,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,gram per centimeter,grams per centimeter,g/cm,g/cm,0.1,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,gram per kilometer,grams per kilometer,g/km,g/km,0.000001,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,kilogram per meter,kilograms per meter,kg/m,kg/m,1,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,ounce per foot,ounces per foot,oz/ft,oz/ft,0.0930102362204724,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,ounce per inch,ounces per inch,oz/in,oz/in,1.11612283464567,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,pound per foot,pounds per foot,lb/ft,lb/ft,1.48816404199475,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,pound per inch,pounds per inch,lb/in,lb/in,17.857968503937,0 -LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,pound per yard,pounds per yard,lb/yd,lb/yd,0.496054680664917,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per centimeter,per centimeter,cm⁻¹,cm^-1 (number density),100,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per decimeter,per decimeter,dm⁻¹,dm^-1 (number density),10,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per foot,per foot,ft⁻¹,ft^-1,3.28083989501312,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,foot (U.S. survey),foot (U.S. survey),ft (U.S. survey),ft (U.S. survey) (number density),3.28083343667959,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per inch,per inch,in⁻¹,in^-1,39.3700787401575,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per kilometer,per kilometer,km⁻¹,km^-1 (number density),0.001,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per meter,per meter,m⁻¹,m^-1 (number density),1,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per mile,per mile,mi⁻¹,mi^-1,0.000621371192237334,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per mile (U.S. survey),per mile (U.S. survey),mi⁻¹ (U.S. survey),mi^-1 (U.S. survey),0.000621370033933018,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per millimeter,per millimeter,mm⁻¹,mm^-1 (number density),1000,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per nautical mile,per nautical mile,M⁻¹,M^-1,0.000539956803455724,0 -LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,per yard,per yard,yd⁻¹,yd^-1,1.09361329833771,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per centimeter second,per centimeter second,cm⁻¹ · s⁻¹,cm^-1*s^-1,100,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per foot second,per foot second,ft⁻¹ · s⁻¹,ft^-1*s^-1,3.28083989501312,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per foot (U.S. survey) second,per foot (U.S. survey) second,ft⁻¹ (U.S. survey) · s⁻¹,ft^-1 (U.S. survey)*s^-1,3.28083343667959,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per inch second,per inch second,in⁻¹ · s⁻¹,in^-1*s^-1,39.3700787401575,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per kilometer second,per kilometer second,km⁻¹ · s⁻¹,km^-1*s^-1,0.001,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per meter second,per meter second,m⁻¹ · s⁻¹,m^-1*s^-1,1,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per mile second,per mile second,mi⁻¹ · s⁻¹,mi^-1*s^-1,0.000621371192237334,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per mile (U.S. survey) second,per mile (U.S. survey) second,mi⁻¹ (U.S. survey) · s⁻¹,mi^-1 (U.S. survey)*s^-1,0.000621370033933018,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per millimeter second,per millimeter second,mm⁻¹ · s⁻¹,mm^-1*s^-1,1000,0 -LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,per yard second,per yard second,yd⁻¹ · s⁻¹,yd^-1*s^-1,1.09361329833771,0 -LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,watt per centimeter,watts per centimeter,W/cm,W/cm,100,0 -LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,watt per meter,watts per meter,W/m,W/m,1,0 -LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,watt per millimeter,watts per millimeter,W/mm,W/mm,1000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,attocandela per square meter,attocandelas per square meter,acd/m²,acd/m^2,1E-18,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square centimeter,candelas per square centimeter,cd/cm²,cd/cm^2,10000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square foot,candelas per square foot,cd/ft²,cd/ft^2,10.7639104167097,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square gigameter,candelas per square gigameter,cd/Gm²,cd/Gm^2,1E-18,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square inch,candelas per square inch,cd/in²,cd/in^2,1550.0031000062,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square kilometer,candelas per square kilometer,cd/km²,cd/km^2,0.000001,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square megameter,candelas per square megameter,cd/Mm²,cd/Mm^2,1E-12,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square meter,candelas per square meter,cd/m²,cd/m^2,1,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square micrometer,candelas per square micrometer,cd/µm²,cd/um^2,1000000000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square millimeter,candelas per square millimeter,cd/mm²,cd/mm^2,1000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square nanometer,candelas per square nanometer,cd/nm²,cd/nm^2,1E+018,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square picometer,candelas per square picometer,cd/pm²,cd/pm^2,1E+024,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,candela per square terameter,candelas per square terameter,cd/Tm²,cd/Tm^2,1E-24,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,centicandela per square meter,centicandelas per square meter,ccd/m²,ccd/m^2,0.01,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,decacandela per square meter,decacandelas per square meter,dacd/m²,dacd/m^2,10,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,decicandela per square meter,decicandelas per square meter,dcd/m²,dcd/m^2,0.1,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,exacandela per square meter,exacandelas per square meter,Ecd/m²,Ecd/m^2,1E+018,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,femtocandela per square meter,femtocandelas per square meter,fcd/m²,fcd/m^2,1E-15,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,footlambert,footlamberts,fl,fl,3.42625909963539,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,gigacandela per square meter,gigacandelas per square meter,Gcd/m²,Gcd/m^2,1000000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,hectocandela per square meter,hectocandelas per square meter,hcd/m²,hcd/m^2,100,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,kilocandela per square meter,kilocandelas per square meter,kcd/m²,kcd/m^2,1000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,lambert,lamberts,la,la,3183.09886183791,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,megacandela per square meter,megacandelas per square meter,Mcd/m²,Mcd/m^2,1000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,microcandela per square meter,microcandelas per square meter,µcd/m²,ucd/m^2,0.000001,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,millicandela per square meter,millicandelas per square meter,mcd/m²,mcd/m^2,0.001,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,nanocandela per square meter,nanocandelas per square meter,ncd/m²,ncd/m^2,0.000000001,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,petacandela per square meter,petacandelas per square meter,Pcd/m²,Pcd/m^2,1000000000000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,picocandela per square meter,picocandelas per square meter,pcd/m²,pcd/m^2,1E-12,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,stilb,stilbs,sb,sb,10000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,teracandela per square meter,teracandelas per square meter,Tcd/m²,Tcd/m^2,1000000000000,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,yoctocandela per square meter,yoctocandelas per square meter,ycd/m²,ycd/m^2,1E-24,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,yottacandela per square meter,yottacandelas per square meter,Ycd/m²,Ycd/m^2,1E+024,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,zeptocandela per square meter,zeptocandelas per square meter,zcd/m²,zcd/m^2,1E-21,0 -Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,zettacandela per square meter,zettacandelas per square meter,Zcd/m²,Zcd/m^2,1E+021,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,attocandela,attocandelas,acd,acd,1E-18,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,candela,candelas,cd,cd,1,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,centicandela,centicandelas,ccd,ccd,0.01,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,decacandela,decacandelas,dacd,dacd,10,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,decicandela,decicandelas,dcd,dcd,0.1,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,exacandela,exacandelas,Ecd,Ecd,1E+018,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,femtocandela,femtocandelas,fcd,fcd,1E-15,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,gigacandela,gigacandelas,Gcd,Gcd,1000000000,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,hectocandela,hectocandelas,hcd,hcd,100,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,kilocandela,kilocandelas,kcd,kcd,1000,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,megacandela,megacandelas,Mcd,Mcd,1000000,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,microcandela,microcandelas,µcd,ucd,0.000001,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,millicandela,millicandelas,mcd,mcd,0.001,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,nanocandela,nanocandelas,ncd,ncd,0.000000001,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,petacandela,petacandelas,Pcd,Pcd,1000000000000000,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,picocandela,picocandelas,pcd,pcd,1E-12,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,teracandela,teracandelas,Tcd,Tcd,1000000000000,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,yoctocandela,yoctocandelas,ycd,ycd,1E-24,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,yottacandela,yottacandelas,Ycd,Ycd,1E+024,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,zeptocandela,zeptocandelas,zcd,zcd,1E-21,0 -LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,zettacandela,zettacandelas,Zcd,Zcd,1E+021,0 -MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,ampere per centimeter,amperes per centimeter,A/cm,A/cm,100,0 -MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,ampere per meter,amperes per meter,A/m,A/m,1,0 -MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,ampere per micrometer,amperes per micrometer,A/μm,A/um,1000000,0 -MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,ampere per millimeter,amperes per millimeter,A/mm,A/mm,1000,0 -MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,oersted,oersteds,Oe,Oe,79.5774715459477,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,attoweber,attowebers,aWb,aWb,1E-18,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,centiweber,centiwebers,cWb,cWb,0.01,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,decaweber,decawebers,daWb,daWb,10,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,deciweber,deciwebers,dWb,dWb,0.1,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,exaweber,exawebers,EWb,EWb,1E+018,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,femtoweber,femtowebers,fWb,fWb,1E-15,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,gigaweber,gigawebers,GWb,GWb,1000000000,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,hectoweber,hectowebers,hWb,hWb,100,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,kiloweber,kilowebers,kWb,kWb,1000,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,maxwell,maxwells,Mx,Mx,0.00000001,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,megaweber,megawebers,MWb,MWb,1000000,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,microweber,microwebers,µWb,uWb,0.000001,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,milliweber,milliwebers,mWb,mWb,0.001,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,nanoweber,nanowebers,nWb,nWb,0.000000001,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,petaweber,petawebers,PWb,PWb,1000000000000000,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,picoweber,picowebers,pWb,pWb,1E-12,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,teraweber,terawebers,TWb,TWb,1000000000000,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,weber,webers,Wb,Wb,1,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,yoctoweber,yoctowebers,yWb,yWb,1E-24,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,yottaweber,yottawebers,YWb,YWb,1E+024,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,zeptoweber,zeptowebers,zWb,zWb,1E-21,0 -MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,zettaweber,zettawebers,ZWb,ZWb,1E+021,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,attotesla,attoteslas,aT,aT,1E-18,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,centitesla,centiteslas,cT,cT,0.01,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,decatesla,decateslas,daT,daT,10,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,decitesla,deciteslas,dT,dT,0.1,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,exatesla,exateslas,ET,ET,1E+018,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,femtotesla,femtoteslas,fT,fT,1E-15,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,gamma,gammas,γ,Gamma,0.000000001,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,gauss,gauss,G,G,0.0001,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,gigatesla,gigateslas,GT,GT,1000000000,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,hectotesla,hectoteslas,hT,hT,100,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,kilotesla,kiloteslas,kT,kT,1000,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,megatesla,megateslas,MT,MT,1000000,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,microtesla,microteslas,µT,uT,0.000001,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,millitesla,milliteslas,mT,mT,0.001,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,nanotesla,nanoteslas,nT,nT,0.000000001,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,petatesla,petateslas,PT,PT,1000000000000000,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,picotesla,picoteslas,pT,pT,1E-12,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,teratesla,terateslas,TT,TT,1000000000000,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,tesla,teslas,T,T,1,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,yoctotesla,yoctoteslas,yT,yT,1E-24,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,yottatesla,yottateslas,YT,YT,1E+024,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,zeptotesla,zeptoteslas,zT,zT,1E-21,0 -MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,zettatesla,zettateslas,ZT,ZT,1E+021,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,ampere square centimeter,ampere square centimeters,A · cm²,A*cm^2,0.0001,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,ampere square meter,ampere square meters,A · m²,A*m^2,1,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,atomic unit of magnetic dipole moment, atomic units of magnetic dipole moment,ħ · e/mₑ,n<-*e/m\e,1.85480201566E-23,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,Bohr magneton,Bohr magnetons,µ(Bohr),u(Bohr),9.2740100783E-24,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,deuteron magnetic moment,deuteron magnetic moments,μ(deuteron),u(deuteron),4.330735094E-27,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,electron magnetic moment,electron magnetic moments,μₑ,u\e,-9.2847647043E-24,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,erg per gauss,ergs per gauss,erg/G,erg/G,0.001,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,helion magnetic moment,helion magnetic moments,μ(helion),u(helion),-1.074617532E-26,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,joule per tesla,joules per tesla,J/T,J/T,1,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,muon magnetic moment,muon magnetic moments,μ(muon),u(muon),-4.4904483E-26,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,neutron magnetic moment,neutron magnetic moments,μ(neutron),u(neutron),-9.6623651E-27,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,newton meter per tesla,newton meters per tesla,N · m/T,N*m/T,1,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,nuclear magneton,nuclear magnetons,μ(Nuclear),u(Nuclear),5.0507837461E-27,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,proton magnetic moment,proton magnetic moments,μ(proton),u(proton),1.41060679736E-26,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,shielded helion magnetic moment,shielded helion magnetic moments,μ’(helion),u'(helion),-1.07455309E-26,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,shielded proton magnetic moment,shielded proton magnetic moments,μ’(proton),u'(proton),1.41057056E-26,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,statampere square centimeter,statampere square centimeters,statA · cm²,statA*cm^2,3.335641E-14,0 -MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,triton magnetic moment,triton magnetic moments,μ(triton),u(triton),1.5046095202E-26,0 -MagneticPermeability,1,1,-2,-2,0,0,0,false,false,false,false,false,henry per meter,henrys per meter,H/m,H/m,1,0 -MagneticPermeability,1,1,-2,-2,0,0,0,false,false,false,false,false,vacuum magnetic permeability,vacuum magnetic permeability,µ₀,u\0,1.25663706212E-06,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,attogram,attograms,ag,ag,1E-21,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,carat,carats,ct,ct,0.0002,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,centigram,centigrams,cg,cg,0.00001,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,dalton,daltons,Da,Da,1.6605390666E-27,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,decagram,decagrams,dag,dag,0.01,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,decigram,decigrams,dg,dg,0.0001,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,exagram,exagrams,Eg,Eg,1000000000000000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,femtogram,femtograms,fg,fg,1E-18,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,gigagram,gigagrams,Gg,Gg,1000000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,grain,grains,gr,gr,0.00006479891,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,gram,grams,g,g,0.001,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,hectogram,hectograms,hg,hg,0.1,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,hundredweight (long),hundredweight (long),cwt long,cwt long,50.80235,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,hundredweight (short),hundredweight (short),cwt short,cwt short,45.35924,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,kilogram,kilograms,kg,kg,1,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,megagram,megagrams,Mg,Mg,1000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,microgram,micrograms,µg,ug,0.000000001,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,milligram,milligrams,mg,mg,0.000001,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,nanogram,nanograms,ng,ng,1E-12,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,ounce,ounces,oz,oz,0.02834952,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,troy ounce,troy ounces,oz t,oz t,0.03110348,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,pennyweight,pennyweight,dwt,dwt,0.001555174,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,petagram,petagrams,Pg,Pg,1000000000000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,picogram,picograms,pg,pg,1E-15,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,pound,pounds,lb,lb,0.4535924,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,troy pound,troy pounds,lb t,lb t,0.3732417,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,slug,slugs,slug,slug,14.5939,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,teragram,teragrams,Tg,Tg,1000000000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,ton,tons,t,t,1000,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,assay ton,assay tons,AT,AT,0.02916667,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,long ton,long tons,2240 lb,2240 lb,1016.047,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,short ton,short tons,2000 lb,2000 lb,907.1847,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,yoctogram,yoctograms,yg,yg,1E-27,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,yottagram,yottagrams,Yg,Yg,1E+021,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,zeptogram,zeptograms,zg,zg,1E-24,0 -Mass,0,1,0,0,0,0,0,false,false,false,false,false,zettagram,zettagrams,Zg,Zg,1E+018,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,attogram per cubic meter,attograms per cubic meter,ag/m³,ag/m^3 (mass concentration),1E-21,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,centigram per cubic meter,centigrams per cubic meter,cg/m³,cg/m^3 (mass concentration),0.00001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,decagram per cubic meter,decagrams per cubic meter,dag/m³,dag/m^3 (mass concentration),0.01,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,decigram per cubic meter,decigrams per cubic meter,dg/m³,dg/m^3 (mass concentration),0.0001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,exagram per cubic meter,exagrams per cubic meter,Eg/m³,Eg/m^3 (mass concentration),1000000000000000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,femtogram per cubic decimeter,femtograms per cubic decimeter,fg/dm³,fg/dm^3 (mass concentration),1E-15,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,femtogram per cubic meter,femtograms per cubic meter,fg/m³,fg/m^3 (mass concentration),1E-18,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,femtogram per deciliter,femtograms per deciliter,fg/dL,fg/dL (mass concentration),1E-14,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,femtogram per liter,femtograms per liter,fg/L,fg/L (mass concentration),1E-15,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,femtogram per milliliter,femtograms per milliliter,fg/mL,fg/mL (mass concentration),1E-12,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gigagram per cubic meter,gigagrams per cubic meter,Gg/m³,Gg/m^3 (mass concentration),1000000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gram per cubic decimeter,grams per cubic decimeter,g/dm³,g/dm^3 (mass concentration),1,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gram per cubic meter,grams per cubic meter,g/m³,g/m^3 (mass concentration),0.001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gram per deciliter,grams per deciliter,g/dL,g/dL (mass concentration),10,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gram per liter,grams per liter,g/L,g/L (mass concentration),1,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,gram per milliliter,grams per milliliter,g/mL,g/mL (mass concentration),1000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,hectogram per cubic meter,hectograms per cubic meter,hg/m³,hg/m^3 (mass concentration),0.1,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,kilogram per cubic decimeter,kilograms per cubic decimeter,kg/dm³,kg/dm^3 (mass concentration),1000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,kilogram per cubic meter,kilograms per cubic meter,kg/m³,kg/m^3 (mass concentration),1,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,kilogram per deciliter,kilograms per deciliter,kg/dL,kg/dL (mass concentration),10000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,kilogram per liter,kilograms per liter,kg/L,kg/L (mass concentration),1000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,kilogram per milliliter,kilograms per milliliter,kg/mL,kg/mL (mass concentration),1000000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,megagram per cubic meter,megagrams per cubic meter,Mg/m³,Mg/m^3 (mass concentration),1000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,microgram per cubic decimeter,micrograms per cubic decimeter,μg/dm³,ug/dm^3 (mass concentration),0.000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,microgram per cubic meter,micrograms per cubic meter,µg/m³,ug/m^3 (mass concentration),0.000000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,microgram per deciliter,micrograms per deciliter,μg/dL,ug/dL (mass concentration),0.00001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,microgram per liter,micrograms per liter,μg/L,ug/L (mass concentration),0.000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,microgram per milliliter,micrograms per milliliter,μg/mL,ug/mL (mass concentration),0.001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,milligram per cubic decimeter,milligrams per cubic decimeter,mg/dm³,mg/dm^3 (mass concentration),0.001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,milligram per cubic meter,milligrams per cubic meter,mg/m³,mg/m^3 (mass concentration),0.000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,milligram per deciliter,milligrams per deciliter,mg/dL,mg/dL (mass concentration),0.01,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,milligram per liter,milligrams per liter,mg/L,mg/L (mass concentration),0.001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,milligram per milliliter,milligrams per milliliter,mg/mL,mg/mL (mass concentration),1,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,nanogram per cubic decimeter,nanograms per cubic decimeter,ng/dm³,ng/dm^3 (mass concentration),0.000000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,nanogram per cubic meter,nanograms per cubic meter,ng/m³,ng/m^3 (mass concentration),1E-12,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,nanogram per deciliter,nanograms per deciliter,ng/dL,ng/dL (mass concentration),0.00000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,nanogram per liter,nanograms per liter,ng/L,ng/L (mass concentration),0.000000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,nanogram per milliliter,nanograms per milliliter,ng/mL,ng/mL (mass concentration),0.000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,petagram per cubic meter,petagrams per cubic meter,Pg/m³,Pg/m^3 (mass concentration),1000000000000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,picogram per cubic decimeter,picograms per cubic decimeter,pg/dm³,pg/dm^3 (mass concentration),1E-12,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,picogram per cubic meter,picograms per cubic meter,pg/m³,pg/m^3 (mass concentration),1E-15,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,picogram per deciliter,picograms per deciliter,pg/dL,pg/dL (mass concentration),1E-11,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,picogram per liter,picograms per liter,pg/L,pg/L (mass concentration),1E-12,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,picogram per milliliter,picograms per milliliter,pg/mL,pg/mL (mass concentration),0.000000001,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,teragram per cubic meter,teragrams per cubic meter,Tg/m³,Tg/m^3 (mass concentration),1000000000,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,yoctogram per cubic meter,yoctograms per cubic meter,yg/m³,yg/m^3 (mass concentration),1E-27,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,yottagram per cubic meter,yottagrams per cubic meter,Yg/m³,Yg/m^3 (mass concentration),1E+021,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,zeptogram per cubic meter,zeptograms per cubic meter,zg/m³,zg/m^3 (mass concentration),1E-24,0 -MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,zettagram per cubic meter,zettagrams per cubic meter,Zg/m³,Zg/m^3 (mass concentration),1E+018,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,attogram per cubic meter,attograms per cubic meter,ag/m³,ag/m^3,1E-21,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,carat per cubic meter,carats per cubic meter,ct/m³,ct/m^3,0.0002,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,centigram per cubic meter,centigrams per cubic meter,cg/m³,cg/m^3,0.00001,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,decagram per cubic meter,decagrams per cubic meter,dag/m³,dag/m^3,0.01,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,decigram per cubic meter,decigrams per cubic meter,dg/m³,dg/m^3,0.0001,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,exagram per cubic meter,exagrams per cubic meter,Eg/m³,Eg/m^3,1000000000000000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,femtogram per cubic meter,femtograms per cubic meter,fg/m³,fg/m^3,1E-18,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,gigagram per cubic meter,gigagrams per cubic meter,Gg/m³,Gg/m^3,1000000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,grain per cubic meter,grains per cubic meter,gr/m³,gr/m^3,0.00006479891,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,grain per gallon,grains per gallon,gr/gal,gr/gal,0.0171180600684945,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,gram per cubic centimeter,grams per cubic centimeter,g/cm³,g/cm^3,1000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,gram per cubic meter,grams per cubic meter,g/m³,g/m^3,0.001,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,hectogram per cubic meter,hectograms per cubic meter,hg/m³,hg/m^3,0.1,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,hundredweight (long) per cubic meter,hundredweight (long) per cubic meter,cwt long/m³,cwt long/m^3,50.80235,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,hundredweight (short) per cubic meter,hundredweight (short) per cubic meter,cwt short/m³,cwt short/m^3,45.35924,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,kilogram per cubic meter,kilograms per cubic meter,kg/m³,kg/m^3,1,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,megagram per cubic meter,megagrams per cubic meter,Mg/m³,Mg/m^3,1000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,microgram per cubic meter,micrograms per cubic meter,µg/m³,ug/m^3,0.000000001,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,milligram per cubic meter,milligrams per cubic meter,mg/m³,mg/m^3,0.000001,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,nanogram per cubic meter,nanograms per cubic meter,ng/m³,ng/m^3,1E-12,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,ounce per cubic inch,ounces per cubic inch,oz/in³,oz/in^3,1729.99427597141,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,ounce per cubic meter,ounces per cubic meter,oz/m³,oz/m^3,0.02834952,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,ounce per gallon,ounces per gallon,oz/gal,oz/gal,7.48915045442874,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,ounce per Imperial gallon,ounces per Imperial gallon,oz/gal (UK),oz/gal (UK),6.23602260403996,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,troy ounce per cubic meter,troy ounces per cubic meter,oz t/m³,oz t/m^3,0.03110348,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pennyweight per cubic meter,pennyweight per cubic meter,dwt/m³,dwt/m^3,0.001555174,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,petagram per cubic meter,petagrams per cubic meter,Pg/m³,Pg/m^3,1000000000000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,picogram per cubic meter,picograms per cubic meter,pg/m³,pg/m^3,1E-15,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per cubic foot,pounds per cubic foot,lb/ft³,lb/ft^3,16.01846250554,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per cubic inch,pounds per cubic inch,lb/in³,lb/in^3,27679.9132974432,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per cubic meter,pounds per cubic meter,lb/m³,lb/m^3,0.4535924,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per cubic yard,pounds per cubic yard,lb/yd³,lb/yd^3,0.593276427892882,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per gallon,pounds per gallon,lb/gal,lb/gal,119.826428404623,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,pound per Imperial gallon,pounds per Imperial gallon,lb/gal (UK),lb/gal (UK),99.7763792621791,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,troy pound per cubic meter,troy pounds per cubic meter,lb t/m³,lb t/m^3,0.3732417,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,slug per cubic foot,slugs per cubic foot,slug/ft³,slug/ft^3,515.378652639683,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,slug per cubic meter,slugs per cubic meter,slug/m³,slug/m^3,14.5939,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,teragram per cubic meter,teragrams per cubic meter,Tg/m³,Tg/m^3,1000000000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,assay ton per cubic meter,assay tons per cubic meter,AT/m³,AT/m^3,0.02916667,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,long ton per cubic meter,long tons per cubic meter,2240 lb/m³,2240 lb/m^3,1016.047,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,long ton per cubic yard,long tons per cubic yard,2240 lb/yd³,2240 lb/yd^3,1328.93922987087,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,ton per cubic meter,tons per cubic meter,t/m³,t/m^3,1000,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,short ton per cubic meter,short tons per cubic meter,2000 lb/m³,2000 lb/m^3,907.1847,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,short ton per cubic yard,short tons per cubic yard,2000 lb/yd³,2000 lb/yd^3,1186.55272499071,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,yoctogram per cubic meter,yoctograms per cubic meter,yg/m³,yg/m^3,1E-27,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,yottagram per cubic meter,yottagrams per cubic meter,Yg/m³,Yg/m^3,1E+021,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,zeptogram per cubic meter,zeptograms per cubic meter,zg/m³,zg/m^3,1E-24,0 -MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,zettagram per cubic meter,zettagrams per cubic meter,Zg/m³,Zg/m^3,1E+018,0 -MassFlux,-2,1,-1,0,0,0,0,false,false,false,false,false,gram per square centimeter second,grams per square centimeter second,g/(cm² · s),g/(cm^2*s),10,0 -MassFlux,-2,1,-1,0,0,0,0,false,false,false,false,false,kilogram per square meter second,kilograms per square meter second,kg/(m² · s),kg/(m^2*s),1,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,centigram per joule,centigrams per joule,cg/J,cg/J,0.00001,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,decagram per joule,decagrams per joule,dag/J,dag/J,0.01,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,decigram per joule,decigrams per joule,dg/J,dg/J,0.0001,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gigagram per joule,gigagrams per joule,Gg/J,Gg/J,1000000,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gram per gigawatt hour,grams per gigawatt hour,g/GWh,g/GWh,2.77777777777778E-16,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gram per joule,grams per joule,g/J,g/J,0.001,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gram per kilowatt hour,grams per kilowatt hour,g/kWh,g/kWh,2.77777777777778E-10,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gram per megawatt hour,grams per megawatt hour,g/MWh,g/MWh,2.77777777777778E-13,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,gram per watt hour,grams per watt hour,g/Wh,g/Wh,2.77777777777778E-07,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,hectogram per joule,hectograms per joule,hg/J,hg/J,0.1,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,kilogram per gigawatt hour,kilograms per gigawatt hour,kg/GWh,kg/GWh,2.77777777777778E-13,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,kilogram per joule,kilograms per joule,kg/J,kg/J,1,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,kilogram per kilowatt hour,kilograms per kilowatt hour,kg/kWh,kg/kWh,2.77777777777778E-07,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,kilogram per megawatt hour,kilograms per megawatt hour,kg/MWh,kg/MWh,2.77777777777778E-10,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,kilogram per watt hour,kilograms per watt hour,kg/Wh,kg/Wh,0.000277777777777778,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,megagram per joule,megagrams per joule,Mg/J,Mg/J,1000,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,microgram per joule,micrograms per joule,µg/J,ug/J,0.000000001,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,milligram per joule,milligrams per joule,mg/J,mg/J,0.000001,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,pound per gigawatt hour,pounds per gigawatt hour,lb/GWh,lb/GWh,1.25997888888889E-13,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,pound per joule,pounds per joule,lb/J,lb/J,0.4535924,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,pound per kilowatt hour,pounds per kilowatt hour,lb/kWh,lb/kWh,1.25997888888889E-07,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,pound per megawatt hour,pounds per megawatt hour,lb/MWh,lb/MWh,1.25997888888889E-10,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,pound per watt hour,pounds per watt hour,lb/Wh,lb/Wh,0.000125997888888889,0 -MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,teragram per joule,teragrams per joule,Tg/J,Tg/J,1000000000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,attogram per second,attograms per second,ag/s,ag/s,1E-21,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,carat per second,carats per second,ct/s,ct/s,0.0002,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,centigram per second,centigrams per second,cg/s,cg/s,0.00001,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,decagram per second,decagrams per second,dag/s,dag/s,0.01,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,decigram per second,decigrams per second,dg/s,dg/s,0.0001,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,exagram per second,exagrams per second,Eg/s,Eg/s,1000000000000000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,femtogram per second,femtograms per second,fg/s,fg/s,1E-18,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,gigagram per second,gigagrams per second,Gg/s,Gg/s,1000000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,grain per second,grains per second,gr/s,gr/s,0.00006479891,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,gram per day,grams per day,g/d,g/d,1.15740740740741E-08,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,gram per hour,grams per hour,g/h,g/h,2.77777777777778E-07,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,gram per minute,grams per minute,g/min,g/min,1.66666666666667E-05,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,gram per second,grams per second,g/s,g/s,0.001,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,hectogram per second,hectograms per second,hg/s,hg/s,0.1,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,hundredweight (long) per second,hundredweight (long) per second,cwt long/s,cwt long/s,50.80235,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,hundredweight (short) per second,hundredweight (short) per second,cwt short/s,cwt short/s,45.35924,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,kilogram per day,kilograms per day,kg/d,kg/d,1.15740740740741E-05,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,kilogram per hour,kilograms per hour,kg/h,kg/h,0.000277777777777778,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,kilogram per minute,kilograms per minute,kg/min,kg/min,0.0166666666666667,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,kilogram per second,kilograms per second,kg/s,kg/s,1,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,megagram per second,megagrams per second,Mg/s,Mg/s,1000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,microgram per second,micrograms per second,µg/s,ug/s,0.000000001,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,milligram per second,milligrams per second,mg/s,mg/s,0.000001,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,nanogram per second,nanograms per second,ng/s,ng/s,1E-12,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,ounce per second,ounces per second,oz/s,oz/s,0.02834952,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,troy ounce per second,troy ounces per second,oz t/s,oz t/s,0.03110348,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,pennyweight per second,pennyweight per second,dwt/s,dwt/s,0.001555174,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,petagram per second,petagrams per second,Pg/s,Pg/s,1000000000000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,picogram per second,picograms per second,pg/s,pg/s,1E-15,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,pound per day,pounds per day,lb/d,lb/d,5.24991203703704E-06,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,pound per hour,pounds per hour,lb/h,lb/h,0.000125997888888889,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,pound per minute,pounds per minute,lb/min,lb/min,0.00755987333333333,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,pound per second,pounds per second,lb/s,lb/s,0.4535924,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,troy pound per second,troy pounds per second,lb t/s,lb t/s,0.3732417,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,slug per second,slugs per second,slug/s,slug/s,14.5939,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,teragram per second,teragrams per second,Tg/s,Tg/s,1000000000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,assay ton per second,assay tons per second,AT/s,AT/s,0.02916667,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,long ton per second,long tons per second,2240 lb/s,2240 lb/s,1016.047,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,ton per day,tons per day,t/d,t/d,0.0115740740740741,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,ton per hour,tons per hour,t/h,t/h,0.277777777777778,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,ton per minute,tons per minute,t/min,t/min,16.6666666666667,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,ton per second,tons per second,t/s,t/s,1000,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,short ton per hour,short tons per hour,2000 lb/h,2000 lb/h,0.25199575,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,short ton per second,short tons per second,2000 lb/s,2000 lb/s,907.1847,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,yoctogram per second,yoctograms per second,yg/s,yg/s,1E-27,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,yottagram per second,yottagrams per second,Yg/s,Yg/s,1E+021,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,zeptogram per second,zeptograms per second,zg/s,zg/s,1E-24,0 -MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,zettagram per second,zettagrams per second,Zg/s,Zg/s,1E+018,0 -Molality,0,-1,0,0,0,1,0,false,true,false,false,false,mole per kilogram,moles per kilogram,mol/kg,mol/kg,1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,attomole per cubic meter,attomoles per cubic meter,amol/m³,amol/m^3,1E-18,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,centimole per cubic meter,centimoles per cubic meter,cmol/m³,cmol/m^3,0.01,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,decamole per cubic meter,decamoles per cubic meter,damol/m³,damol/m^3,10,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,decimole per cubic meter,decimoles per cubic meter,dmol/m³,dmol/m^3,0.1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,examole per cubic meter,examoles per cubic meter,Emol/m³,Emol/m^3,1E+018,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,femtomole per cubic decimeter,femtomoles per cubic decimeter,fmol/dm³,fmol/dm^3,1E-12,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,femtomole per cubic meter,femtomoles per cubic meter,fmol/m³,fmol/m^3,1E-15,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,femtomole per deciliter,femtomoles per deciliter,fmol/dL,fmol/dL,1E-11,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,femtomole per liter,femtomoles per liter,fmol/L,fmol/L,1E-12,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,femtomole per milliliter,femtomoles per milliliter,fmol/mL,fmol/mL,0.000000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,gigamole per cubic meter,gigamoles per cubic meter,Gmol/m³,Gmol/m^3,1000000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,hectomole per cubic meter,hectomoles per cubic meter,hmol/m³,hmol/m^3,100,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,kilomole per cubic decimeter,kilomoles per cubic decimeter,kmol/dm³,kmol/dm^3,1000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,kilomole per cubic meter,kilomoles per cubic meter,kmol/m³,kmol/m^3,1000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,kilomole per deciliter,kilomoles per deciliter,kmol/dL,kmol/dL,10000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,kilomole per liter,kilomoles per liter,kmol/L,kmol/L,1000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,kilomole per milliliter,kilomoles per milliliter,kmol/mL,kmol/mL,1000000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,megamole per cubic meter,megamoles per cubic meter,Mmol/m³,Mmol/m^3,1000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,micromole per cubic decimeter,micromoles per cubic decimeter,μmol/dm³,umol/dm^3,0.001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,micromole per cubic meter,micromoles per cubic meter,µmol/m³,umol/m^3,0.000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,micromole per deciliter,micromoles per deciliter,μmol/dL,umol/dL,0.01,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,micromole per liter,micromoles per liter,μmol/L,umol/L,0.001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,micromole per milliliter,micromoles per milliliter,μmol/mL,umol/mL,1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,millimole per cubic decimeter,millimoles per cubic decimeter,mmol/dm³,mmol/dm^3,1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,millimole per cubic meter,millimoles per cubic meter,mmol/m³,mmol/m^3,0.001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,millimole per deciliter,millimoles per deciliter,mmol/dL,mmol/dL,10,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,millimole per liter,millimoles per liter,mmol/L,mmol/L,1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,millimole per milliliter,millimoles per milliliter,mmol/mL,mmol/mL,1000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,mole per cubic decimeter,moles per cubic decimeter,mol/dm³,mol/dm^3,1000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,mole per cubic meter,moles per cubic meter,mol/m³,mol/m^3,1,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,mole per deciliter,moles per deciliter,mol/dL,mol/dL,10000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,mole per liter,moles per liter,mol/L,mol/L,1000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,mole per milliliter,moles per milliliter,mol/mL,mol/mL,1000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,nanomole per cubic decimeter,nanomoles per cubic decimeter,nmol/dm³,nmol/dm^3,0.000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,nanomole per cubic meter,nanomoles per cubic meter,nmol/m³,nmol/m^3,0.000000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,nanomole per deciliter,nanomoles per deciliter,nmol/dL,nmol/dL,0.00001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,nanomole per liter,nanomoles per liter,nmol/L,nmol/L,0.000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,nanomole per milliliter,nanomoles per milliliter,nmol/mL,nmol/mL,0.001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,particle per cubic decimeter,particles per cubic decimeter,particle/dm³,particle/dm^3,1.66053906717385E-21,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,particle per cubic meter,particles per cubic meter,particle/m³,particle/m^3,1.66053906717385E-24,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,particle per deciliter,particles per deciliter,particle/dL,particle/dL,1.66053906717385E-20,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,particle per liter,particles per liter,particle/L,particle/L,1.66053906717385E-21,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,particle per milliliter,particles per milliliter,particle/mL,particle/mL,1.66053906717385E-18,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,petamole per cubic meter,petamoles per cubic meter,Pmol/m³,Pmol/m^3,1000000000000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,picomole per cubic decimeter,picomoles per cubic decimeter,pmol/dm³,pmol/dm^3,0.000000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,picomole per cubic meter,picomoles per cubic meter,pmol/m³,pmol/m^3,1E-12,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,picomole per deciliter,picomoles per deciliter,pmol/dL,pmol/dL,0.00000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,picomole per liter,picomoles per liter,pmol/L,pmol/L,0.000000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,picomole per milliliter,picomoles per milliliter,pmol/mL,pmol/mL,0.000001,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,teramole per cubic meter,teramoles per cubic meter,Tmol/m³,Tmol/m^3,1000000000000,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,yoctomole per cubic meter,yoctomoles per cubic meter,ymol/m³,ymol/m^3,1E-24,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,yottamole per cubic meter,yottamoles per cubic meter,Ymol/m³,Ymol/m^3,1E+024,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,zeptomole per cubic meter,zeptomoles per cubic meter,zmol/m³,zmol/m^3,1E-21,0 -MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,zettamole per cubic meter,zettamoles per cubic meter,Zmol/m³,Zmol/m^3,1E+021,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,attojoule per mole,attojoules per mole,aJ/mol,aJ/mol,1E-18,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,British thermal unit (39 °F) per mole,British thermal units (39 °F) per mole,Btu₃₉/mol,Btu\3\9/mol,1059.67,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,British thermal unit (59 °F) per mole,British thermal units (59 °F) per mole,Btu₅₉/mol,Btu\5\9/mol,1054.8,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,British thermal unit (60 °F) per mole,British thermal units (60 °F) per mole,Btu₆₀/mol,Btu\6\0/mol,1054.68,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,British thermal unit (IT) per mole,British thermal units (IT) per mole,Btu (IT)/mol,Btu (IT)/mol,1055.056,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,British thermal unit per mole,British thermal units per mole,Btu/mol,Btu/mol,1054.35,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,calorie (15 °C) per mole,calories (15 °C) per mole,cal₁₅/mol,Cal\15/mol,4.1858,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,calorie (20 °C) per mole,calories (20 °C) per mole,cal₂₀/mol,Cal\20/mol,4.1819,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,Calorie (IT) per mole,Calories (IT) per mole,Cal (IT)/mol,Cal (IT)/mol,4186.8,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,calorie (IT) per mole,calories (IT) per mole,cal (IT)/mol,cal (IT)/mol,4.1868,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,Calorie per mole,Calories per mole,Cal/mol,Cal/mol,4184,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,calorie per mole,calories per mole,cal/mol,cal/mol,4.184,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,centijoule per mole,centijoules per mole,cJ/mol,cJ/mol,0.01,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,decajoule per mole,decajoules per mole,daJ/mol,daJ/mol,10,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,decawatt hour per mole,decawatt hours per mole,daW · h/mol,daW*h/mol,36000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,decijoule per mole,decijoules per mole,dJ/mol,dJ/mol,0.1,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,electronvolt per mole,electronvolts per mole,eV/mol,eV/mol,1.602176634E-19,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,electronvolt per particle,electronvolts per particle,eV/particle,eV/particle,96485.33212331,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,erg per mole,ergs per mole,erg/mol,erg/mol,0.0000001,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,exajoule per mole,exajoules per mole,EJ/mol,EJ/mol,1E+018,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,femtojoule per mole,femtojoules per mole,fJ/mol,fJ/mol,1E-15,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,foot pound-force per mole,foot pounds-force per mole,ft · lbf/mol,ft*lbf/mol,1.355818,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,foot poundal per mole,foot poundals per mole,ft · pdl/mol,ft*pdl/mol,0.04214011,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,gigajoule per mole,gigajoules per mole,GJ/mol,GJ/mol,1000000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,gigawatt hour per mole,gigawatt hours per mole,GW · h/mol,GW*h/mol,3600000000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,hectojoule per mole,hectojoules per mole,hJ/mol,hJ/mol,100,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,hectowatt hour per mole,hectowatt hours per mole,hW · h/mol,hW*h/mol,360000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,joule per mole,joules per mole,J/mol,J/mol,1,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,joule per particle,joules per particle,J/particle,J/particle,6.02214076E+023,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,kilocalorie (IT) per mole,kilocalories (IT) per mole,kcal (IT)/mol,kcal (IT)/mol,4186.8,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,kilocalorie per mole,kilocalories per mole,kcal/mol,kcal/mol,4184,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,kilogram square meter per second squared mole,kilograms square meter per second squared mole,kg · m²/(s² · mol),kg*m^2/(s^2*mol),1,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,kilojoule per mole,kilojoules per mole,kJ/mol,kJ/mol,1000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,kilowatt hour per mole,kilowatt hours per mole,kW · h/mol,kW*h/mol,3600000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,megajoule per mole,megajoules per mole,MJ/mol,MJ/mol,1000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,megawatt hour per mole,megawatt hours per mole,MW · h/mol,MW*h/mol,3600000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,microjoule per mole,microjoules per mole,µJ/mol,uJ/mol,0.000001,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,microwatt hour per mole,microwatt hours per mole,µW · h/mol,uW*h/mol,0.0036,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,millijoule per mole,millijoules per mole,mJ/mol,mJ/mol,0.001,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,milliwatt hour per mole,milliwatt hours per mole,mW · h/mol,mW*h/mol,3.6,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,nanojoule per mole,nanojoules per mole,nJ/mol,nJ/mol,0.000000001,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,petajoule per mole,petajoules per mole,PJ/mol,PJ/mol,1000000000000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,petawatt hour per mole,petawatt hours per mole,PW · h/mol,PW*h/mol,3.6E+018,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,picojoule per mole,picojoules per mole,pJ/mol,pJ/mol,1E-12,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,quad per mole,quads per mole,10¹⁵ Btu (IT)/mol,10^15 Btu (IT)/mol,1.055056E+018,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,terajoule per mole,terajoules per mole,TJ/mol,TJ/mol,1000000000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,terawatt hour per mole,terawatt hours per mole,TW · h/mol,TW*h/mol,3600000000000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,therm (EC) per mole,therms (EC) per mole,thm (EC)/mol,thm (EC)/mol,105506000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,therm per mole,therms per mole,thm/mol,thm/mol,105480400,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,ton of TNT per mole,tons of TNT per mole,t of TNT/mol,t of TNT/mol,4184000000,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,watt hour per mole,watt hours per mole,W · h/mol,W*h/mol,3600,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,watt second per mole,watt seconds per mole,W · s/mol,W*s/mol,1,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,yoctojoule per mole,yoctojoules per mole,yJ/mol,yJ/mol,1E-24,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,yottajoule per mole,yottajoules per mole,YJ/mol,YJ/mol,1E+024,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,zeptojoule per mole,zeptojoules per mole,zJ/mol,zJ/mol,1E-21,0 -MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,zettajoule per mole,zettajoules per mole,ZJ/mol,ZJ/mol,1E+021,0 -MolarFlux,-2,0,-1,0,0,1,0,false,false,false,false,false,mole per square meter second,moles per square meter second,mol/(m² · s),mol/(m^2*s),1,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,attojoule per kelvin mole,attojoules per kelvin mole,aJ/(K · mol),aJ/(K*mol),1E-18,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,British thermal unit (39 °F) per kelvin mole,British thermal units (39 °F) per kelvin mole,Btu₃₉/(K · mol),Btu\3\9/(K*mol),1059.67,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,British thermal unit (59 °F) per kelvin mole,British thermal units (59 °F) per kelvin mole,Btu₅₉/(K · mol),Btu\5\9/(K*mol),1054.8,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,British thermal unit (60 °F) per kelvin mole,British thermal units (60 °F) per kelvin mole,Btu₆₀/(K · mol),Btu\6\0/(K*mol),1054.68,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,British thermal unit (IT) per kelvin mole,British thermal units (IT) per kelvin mole,Btu (IT)/(K · mol),Btu (IT)/(K*mol),1055.056,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,British thermal unit per kelvin mole,British thermal units per kelvin mole,Btu/(K · mol),Btu/(K*mol),1054.35,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,calorie (15 °C) per kelvin mole,calories (15 °C) per kelvin mole,cal₁₅/(K · mol),cal\15/(K*mol),4.1858,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,calorie (20 °C) per kelvin mole,calories (20 °C) per kelvin mole,cal₂₀/(K · mol),cal\20/(K*mol),4.1819,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,Calorie (IT) per kelvin mole,Calories (IT) per kelvin mole,Cal (IT)/(K · mol),Cal (IT)/(K*mol),4186.8,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,calorie (IT) per kelvin mole,calories (IT) per kelvin mole,cal (IT)/(K · mol),cal (IT)/(K*mol),4.1868,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,Calorie per kelvin mole,Calories per kelvin mole,Cal/(K · mol),Cal/(K*mol),4184,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,calorie per kelvin mole,calories per kelvin mole,cal/(K · mol),cal/(K*mol),4.184,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,centijoule per kelvin mole,centijoules per kelvin mole,cJ/(K · mol),cJ/(K*mol),0.01,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,decajoule per kelvin mole,decajoules per kelvin mole,daJ/(K · mol),daJ/(K*mol),10,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,decijoule per kelvin mole,decijoules per kelvin mole,dJ/(K · mol),dJ/(K*mol),0.1,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,electronvolt per kelvin particle,electronvolts per kelvin particle,eV/(K · particle),eV/(K*particle),96485.33212331,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,exajoule per kelvin mole,exajoules per kelvin mole,EJ/(K · mol),EJ/(K*mol),1E+018,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,femtojoule per kelvin mole,femtojoules per kelvin mole,fJ/(K · mol),fJ/(K*mol),1E-15,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,gigajoule per kelvin mole,gigajoules per kelvin mole,GJ/(K · mol),GJ/(K*mol),1000000000,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,hectojoule per kelvin mole,hectojoules per kelvin mole,hJ/(K · mol),hJ/(K*mol),100,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,joule per kelvin mole,joules per kelvin mole,J/(K · mol),J/(K*mol),1,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,joule per kelvin particle,joules per kelvin particle,J/(K · particle),J/(K*particle),6.02214076E+023,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,kilocalorie (IT) per kelvin mole,kilocalories (IT) per kelvin mole,kcal (IT)/(K · mol),kcal (IT)/(K*mol),4186.8,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,kilocalorie per kelvin mole,kilocalories per kelvin mole,kcal/(K · mol),kcal/(K*mol),4184,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,kilojoule per kelvin mole,kilojoules per kelvin mole,kJ/(K · mol),kJ/(K*mol),1000,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,megajoule per kelvin mole,megajoules per kelvin mole,MJ/(K · mol),MJ/(K*mol),1000000,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,microjoule per kelvin mole,microjoules per kelvin mole,µJ/(K · mol),uJ/(K*mol),0.000001,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,millijoule per kelvin mole,millijoules per kelvin mole,mJ/(K · mol),mJ/(K*mol),0.001,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,molar gas constant,molar gas constants,R,R,8.314462618,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,nanojoule per kelvin mole,nanojoules per kelvin mole,nJ/(K · mol),nJ/(K*mol),0.000000001,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,petajoule per kelvin mole,petajoules per kelvin mole,PJ/(K · mol),PJ/(K*mol),1000000000000000,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,picojoule per kelvin mole,picojoules per kelvin mole,pJ/(K · mol),pJ/(K*mol),1E-12,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,terajoule per kelvin mole,terajoules per kelvin mole,TJ/(K · mol),TJ/(K*mol),1000000000000,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,yoctojoule per kelvin mole,yoctojoules per kelvin mole,yJ/(K · mol),yJ/(K*mol),1E-24,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,yottajoule per kelvin mole,yottajoules per kelvin mole,YJ/(K · mol),YJ/(K*mol),1E+024,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,zeptojoule per kelvin mole,zeptojoules per kelvin mole,zJ/(K · mol),zJ/(K*mol),1E-21,0 -MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,zettajoule per kelvin mole,zettajoules per kelvin mole,ZJ/(K · mol),ZJ/(K*mol),1E+021,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,attogram per mole,attograms per mole,ag/mol,ag/mol,1E-21,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,centigram per mole,centigrams per mole,cg/mol,cg/mol,0.00001,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,decagram per mole,decagrams per mole,dag/mol,dag/mol,0.01,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,decigram per mole,decigrams per mole,dg/mol,dg/mol,0.0001,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,exagram per mole,exagrams per mole,Eg/mol,Eg/mol,1000000000000000,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,femtogram per mole,femtograms per mole,fg/mol,fg/mol,1E-18,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,gigagram per mole,gigagrams per mole,Gg/mol,Gg/mol,1000000,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,gram per mole,grams per mole,g/mol,g/mol,0.001,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,hectogram per mole,hectograms per mole,hg/mol,hg/mol,0.1,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,kilogram per mole,kilograms per mole,kg/mol,kg/mol,1,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,megagram per mole,megagrams per mole,Mg/mol,Mg/mol,1000,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,microgram per mole,micrograms per mole,µg/mol,ug/mol,0.000000001,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,milligram per mole,milligrams per mole,mg/mol,mg/mol,0.000001,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,nanogram per mole,nanograms per mole,ng/mol,ng/mol,1E-12,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,petagram per mole,petagrams per mole,Pg/mol,Pg/mol,1000000000000,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,picogram per mole,picograms per mole,pg/mol,pg/mol,1E-15,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,teragram per mole,teragrams per mole,Tg/mol,Tg/mol,1000000000,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,yoctogram per mole,yoctograms per mole,yg/mol,yg/mol,1E-27,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,yottagram per mole,yottagrams per mole,Yg/mol,Yg/mol,1E+021,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,zeptogram per mole,zeptograms per mole,zg/mol,zg/mol,1E-24,0 -MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,zettagram per mole,zettagrams per mole,Zg/mol,Zg/mol,1E+018,0 -MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,becquerel per mole,becquerels per mole,Bq/mol,Bq/mol,1,0 -MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,curie per mole,curies per mole,Ci/mol,Ci/mol,37000000000,0 -MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,disintegration per minute per mole,disintegrations per minute per mole,dpm/mol,dpm/mol,0.0166666666666667,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic centimeter per mole,cubic centimeters per mole,cm³/mol,cm^3/mol,0.000001,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic decimeter per mole,cubic decimeters per mole,dm³/mol,dm^3/mol,0.001,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic meter per mole,cubic meters per mole,m³/mol,m^3/mol,1,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic meter per particle,cubic meters per particle,m³/particle,m^3/particle,6.02214076E+023,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic micrometer per particle,cubic micrometers per particle,µm³/particle,um^3/particle,602214.076,0 -MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,cubic nanometer per particle,cubic nanometers per particle,nm³/particle,nm^3/particle,0.000602214076,0 -MomentOfInertia,2,1,0,0,0,0,0,false,false,false,false,false,dalton square ångström,dalton square ångströms,Da · Ų,Da*ang^2,1.6605390666E-47,0 -MomentOfInertia,2,1,0,0,0,0,0,false,false,false,false,false,kilogram square meter,kilogram square meters,kg · m²,kg*m^2,1,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,attogram meter per second,attogram meters per second,ag · m/s,ag*m/s,1E-21,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,centigram meter per second,centigram meters per second,cg · m/s,cg*m/s,0.00001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,decagram meter per second,decagram meters per second,dag · m/s,dag*m/s,0.01,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,decigram meter per second,decigram meters per second,dg · m/s,dg*m/s,0.0001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,exagram meter per second,exagram meters per second,Eg · m/s,Eg*m/s,1000000000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,femtogram meter per second,femtogram meters per second,fg · m/s,fg*m/s,1E-18,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,gigagram meter per second,gigagram meters per second,Gg · m/s,Gg*m/s,1000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,gram meter per second,gram meters per second,g · m/s,g*m/s,0.001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,hectogram meter per second,hectogram meters per second,hg · m/s,hg*m/s,0.1,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram attometer per second,kilogram attometers per second,kg · am/s,kg*am/s,1E-18,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram centimeter per second,kilogram centimeters per second,kg · cm/s,kg*cm/s,0.01,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram decameter per second,kilogram decameters per second,kg · dam/s,kg*dam/s,10,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram decimeter per second,kilogram decimeters per second,kg · dm/s,kg*dm/s,0.1,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram exameter per second,kilogram exameters per second,kg · Em/s,kg*Em/s,1E+018,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram femtometer per second,kilogram femtometers per second,kg · fm/s,kg*fm/s,1E-15,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram gigameter per second,kilogram gigameters per second,kg · Gm/s,kg*Gm/s,1000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram hectometer per second,kilogram hectometers per second,kg · hm/s,kg*hm/s,100,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram kilometer per second,kilogram kilometers per second,kg · km/s,kg*km/s,1000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram megameter per second,kilogram megameters per second,kg · Mm/s,kg*Mm/s,1000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram meter per day,kilogram meters per day,kg · m/d,kg*m/d,1.15740740740741E-05,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram meter per hour,kilogram meters per hour,kg · m/h,kg*m/h,0.000277777777777778,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram meter per minute,kilogram meters per minute,kg · m/min,kg*m/min,0.0166666666666667,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram meter per second,kilogram meters per second,kg · m/s,kg*m/s,1,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram micrometer per second,kilogram micrometers per second,kg · µm/s,kg*um/s,0.000001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram millimeter per second,kilogram millimeters per second,kg · mm/s,kg*mm/s,0.001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram nanometer per second,kilogram nanometers per second,kg · nm/s,kg*nm/s,0.000000001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram petameter per second,kilogram petameters per second,kg · Pm/s,kg*Pm/s,1000000000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram picometer per second,kilogram picometers per second,kg · pm/s,kg*pm/s,1E-12,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram terameter per second,kilogram terameters per second,kg · Tm/s,kg*Tm/s,1000000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram yoctometer per second,kilogram yoctometers per second,kg · ym/s,kg*ym/s,1E-24,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram yottameter per second,kilogram yottameters per second,kg · Ym/s,kg*Ym/s,1E+024,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram zeptometer per second,kilogram zeptometers per second,kg · zm/s,kg*zm/s,1E-21,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,kilogram zettameter per second,kilogram zettameters per second,kg · Zm/s,kg*Zm/s,1E+021,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,megagram meter per second,megagram meters per second,Mg · m/s,Mg*m/s,1000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,microgram meter per second,microgram meters per second,µg · m/s,ug*m/s,0.000000001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,milligram meter per second,milligram meters per second,mg · m/s,mg*m/s,0.000001,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,nanogram meter per second,nanogram meters per second,ng · m/s,ng*m/s,1E-12,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,petagram meter per second,petagram meters per second,Pg · m/s,Pg*m/s,1000000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,picogram meter per second,picogram meters per second,pg · m/s,pg*m/s,1E-15,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,pound foot per second,pound feet per second,lb · ft/s,lb*ft/s,0.13825496352,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,pound inch per second,pound inches per second,lb · in/s,lb*in/s,0.01152124696,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,slug foot per second,slug feet per second,slug · ft/s,slug*ft/s,4.44822072,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,slug inch per second,slug inches per second,slug · in/s,slug*in/s,0.37068506,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,teragram meter per second,teragram meters per second,Tg · m/s,Tg*m/s,1000000000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,ton meter per second,ton meters per second,t · m/s,t*m/s,1000,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,yoctogram meter per second,yoctogram meters per second,yg · m/s,yg*m/s,1E-27,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,yottagram meter per second,yottagram meters per second,Yg · m/s,Yg*m/s,1E+021,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,zeptogram meter per second,zeptogram meters per second,zg · m/s,zg*m/s,1E-24,0 -Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,zettagram meter per second,zettagram meters per second,Zg · m/s,Zg*m/s,1E+018,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,attowatt,attowatts,aW,aW,1E-18,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,centiwatt,centiwatts,cW,cW,0.01,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,decawatt,decawatts,daW,daW,10,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,deciwatt,deciwatts,dW,dW,0.1,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,erg per second,ergs per second,erg/s,erg/s,0.0000001,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,exawatt,exawatts,EW,EW,1E+018,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,femtowatt,femtowatts,fW,fW,1E-15,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,foot pound-force per hour,foot pounds-force per hour,ft · lbf/h,ft*lbf/h,0.000376616111111111,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,foot pound-force per minute,foot pounds-force per minute,ft · lbf/min,ft*lbf/min,0.0225969666666667,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,foot pound-force per second,foot pounds-force per second,ft · lbf/s,ft*lbf/s,1.355818,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,gigawatt,gigawatts,GW,GW,1000000000,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,hectowatt,hectowatts,hW,hW,100,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,horsepower,horsepower,hp,hp,745.6999,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,horsepower (boiler),horsepower (boiler),hp (S),hp (S),9809.5,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,horsepower (electric),horsepower (electric),hp (E),hp (E),746,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,horsepower (Imperial),horsepower (Imperial),hp (I),hp (I),745.7,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,metric horsepower,metric horsepower,hp (M),hp (M),735.4988,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,hydraulic horsepower,hydraulic horsepower,hp (hydraulic),hp (hydraulic),746.043,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,kilowatt,kilowatts,kW,kW,1000,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,megawatt,megawatts,MW,MW,1000000,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,microwatt,microwatts,µW,uW,0.000001,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,milliwatt,milliwatts,mW,mW,0.001,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,nanowatt,nanowatts,nW,nW,0.000000001,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,petawatt,petawatts,PW,PW,1000000000000000,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,picowatt,picowatts,pW,pW,1E-12,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,terawatt,terawatts,TW,TW,1000000000000,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,watt,watts,W,W,1,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,yoctowatt,yoctowatts,yW,yW,1E-24,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,yottawatt,yottawatts,YW,YW,1E+024,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,zeptowatt,zeptowatts,zW,zW,1E-21,0 -Power,2,1,-3,0,0,0,0,false,false,false,false,false,zettawatt,zettawatts,ZW,ZW,1E+021,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,attowatt per second,attowatts per second,aW/s,aW/s,1E-18,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,centiwatt per second,centiwatts per second,cW/s,cW/s,0.01,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,decawatt per second,decawatts per second,daW/s,daW/s,10,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,deciwatt per second,deciwatts per second,dW/s,dW/s,0.1,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,erg per second squared,ergs per second squared,erg/s²,erg/s^2,0.0000001,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,exawatt per second,exawatts per second,EW/s,EW/s,1E+018,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,femtowatt per second,femtowatts per second,fW/s,fW/s,1E-15,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,foot pound-force per second squared,foot pounds-force per second squared,ft · lbf/s²,ft*lbf/s^2,1.355818,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,gigawatt per second,gigawatts per second,GW/s,GW/s,1000000000,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,hectowatt per second,hectowatts per second,hW/s,hW/s,100,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,horsepower per second,horsepower per second,hp/s,hp/s,745.6999,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,horsepower per second (boiler),horsepower per second (boiler),hp/s (S),hp/s (S),9809.5,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,horsepower per second (electric),horsepower per second (electric),hp/s (E),hp/s (E),746,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,horsepower per second (Imperial),horsepower per second (Imperial),hp/s (I),hp/s (I),745.7,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,metric horsepower per second,metric horsepower per second,hp/s (M),hp/s (M),735.4988,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,hydraulic horsepower per second,hydraulic horsepower per second,hp/s (hydraulic),hp/s (hydraulic),746.043,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,kilowatt per second,kilowatts per second,kW/s,kW/s,1000,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,megawatt per second,megawatts per second,MW/s,MW/s,1000000,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,microwatt per second,microwatts per second,µW/s,uW/s,0.000001,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,milliwatt per second,milliwatts per second,mW/s,mW/s,0.001,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,nanowatt per second,nanowatts per second,nW/s,nW/s,0.000000001,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,petawatt per second,petawatts per second,PW/s,PW/s,1000000000000000,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,picowatt per second,picowatts per second,pW/s,pW/s,1E-12,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,terawatt per second,terawatts per second,TW/s,TW/s,1000000000000,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,watt per second,watts per second,W/s,W/s,1,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,yoctowatt per second,yoctowatts per second,yW/s,yW/s,1E-24,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,yottawatt per second,yottawatts per second,YW/s,YW/s,1E+024,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,zeptowatt per second,zeptowatts per second,zW/s,zW/s,1E-21,0 -PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,zettawatt per second,zettawatts per second,ZW/s,ZW/s,1E+021,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,atmosphere,atmospheres,atm,atm,101325,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,atmosphere (technical),atmospheres (technical),at,at,98066.5,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,attopascal,attopascals,aPa,aPa,1E-18,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,bar,bar,bar,bar,100000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,centimeter of mercury,centimeters of mercury,cm Hg,cm Hg,1333.224,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,centimeter of mercury (0 °C),centimeters of mercury (0 °C),cm Hg (0 °C),cm Hg (0 degC),1333.22,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,centimeter of water,centimeters of water,cm H₂O,cm H\2O,98.0665,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,centimeter of water (4 °C),centimeters of water (4 °C),cm H₂O (4 °C),cm H\2O (4 degC),98.0638,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,centipascal,centipascals,cPa,cPa,0.01,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,decapascal,decapascals,daPa,daPa,10,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,decipascal,decipascals,dPa,dPa,0.1,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,dyne per square centimeter,dynes per square centimeter,dyn/cm²,dyn/cm^2,0.1,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,exapascal,exapascals,EPa,EPa,1E+018,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,femtopascal,femtopascals,fPa,fPa,1E-15,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,foot of mercury,feet of mercury,ft Hg,ft Hg,40636.66,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,foot of water,feet of water,ft H₂O,ft H\2O,2989.067,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,foot of water (39.2 °F),feet of water (39.2 °F),ft H₂O (39.2 °F),ft H\2O (39.2 degF),2988.98,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,gigapascal,gigapascals,GPa,GPa,1000000000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,gram-force per square centimeter,grams-force per square centimeter,gf/cm²,gf/cm^2,98.0665,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,hectopascal,hectopascals,hPa,hPa,100,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of mercury,inches of mercury,in Hg,in Hg,3386.389,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of mercury (32 °F),inches of mercury (32 °F),in Hg (32 °F),in Hg (32 degF),3386.38,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of mercury (60 °F),inches of mercury (60 °F),in Hg (60 °F),in Hg (60 degF),3376.85,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of water,inches of water,in H₂O,in H\2O,249.0889,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of water (39.2 °F),inches of water (39.2 °F),in H₂O (39.2 °F),in H\2O (39.2 degF),249.082,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,inch of water (60 °F),inches of water (60 °F),in H₂O (60 °F),in H\2O (60 degF),248.84,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,kilogram-force per square centimeter,kilograms-force per square centimeter,kgf/cm²,kgf/cm^2,98066.5,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,kilogram-force per square meter,kilograms-force per square meter,kgf/m²,kgf/m^2,9.80665,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,kilogram-force per square millimeter,kilograms-force per square millimeter,kgf/mm²,kgf/mm^2,9806650,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,kilopascal,kilopascals,kPa,kPa,1000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,kip per square inch,kips per square inch,kip/in²,kip/in^2,6894757.88951578,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,megapascal,megapascals,MPa,MPa,1000000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,micropascal,micropascals,µPa,uPa,0.000001,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,millibar,millibar,mbar,mbar,100,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,millimeter of mercury,millimeters of mercury,mm Hg,mm Hg,133.3224,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,millimeter of water,millimeters of water,mm H₂O,mm H\2O,9.80665,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,millipascal,millipascals,mPa,mPa,0.001,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,millitorr,millitorr,mTorr,mTorr,0.1333224,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,nanopascal,nanopascals,nPa,nPa,0.000000001,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,newton per square millimeter,newtons per square millimeter,N/mm²,N/mm^2,1000000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,pascal,pascals,Pa,Pa,1,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,petapascal,petapascals,PPa,PPa,1000000000000000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,picopascal,picopascals,pPa,pPa,1E-12,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,pound-force per square foot,pounds-force per square foot,lbf/ft²,lbf/ft^2,47.8802631216374,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,pound-force per square inch,pounds-force per square inch,lbf/in²,lbf/in^2,6894.75788951578,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,poundal per square foot,poundals per square foot,pdl/ft²,pdl/ft^2,1.4881644346622,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,pound-force per square inch,pounds-force per square inch,psi,psi,6894.757,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,terapascal,terapascals,TPa,TPa,1000000000000,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,torr,torr,Torr,Torr,133.3224,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,yoctopascal,yoctopascals,yPa,yPa,1E-24,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,yottapascal,yottapascals,YPa,YPa,1E+024,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,zeptopascal,zeptopascals,zPa,zPa,1E-21,0 -Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,zettapascal,zettapascals,ZPa,ZPa,1E+021,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,attojoule per square meter,attojoules per square meter,aJ/m²,aJ/m^2,1E-18,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,centijoule per square centimeter,centijoules per square centimeter,cJ/cm²,cJ/cm^2,100,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,centijoule per square meter,centijoules per square meter,cJ/m²,cJ/m^2,0.01,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,centijoule per square millimeter,centijoules per square millimeter,cJ/mm²,cJ/mm^2,10000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decajoule per square centimeter,decajoules per square centimeter,daJ/cm²,daJ/cm^2,100000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decajoule per square meter,decajoules per square meter,daJ/m²,daJ/m^2,10,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decajoule per square millimeter,decajoules per square millimeter,daJ/mm²,daJ/mm^2,10000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decijoule per square centimeter,decijoules per square centimeter,dJ/cm²,dJ/cm^2,1000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decijoule per square meter,decijoules per square meter,dJ/m²,dJ/m^2,0.1,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,decijoule per square millimeter,decijoules per square millimeter,dJ/mm²,dJ/mm^2,100000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,exajoule per square meter,exajoules per square meter,EJ/m²,EJ/m^2,1E+018,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,femtojoule per square meter,femtojoules per square meter,fJ/m²,fJ/m^2,1E-15,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,gigajoule per square centimeter,gigajoules per square centimeter,GJ/cm²,GJ/cm^2,10000000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,gigajoule per square meter,gigajoules per square meter,GJ/m²,GJ/m^2,1000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,gigajoule per square millimeter,gigajoules per square millimeter,GJ/mm²,GJ/mm^2,1000000000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,hectojoule per square centimeter,hectojoules per square centimeter,hJ/cm²,hJ/cm^2,1000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,hectojoule per square meter,hectojoules per square meter,hJ/m²,hJ/m^2,100,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,hectojoule per square millimeter,hectojoules per square millimeter,hJ/mm²,hJ/mm^2,100000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,joule per square centimeter,joules per square centimeter,J/cm²,J/cm^2,10000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,joule per square meter,joules per square meter,J/m²,J/m^2,1,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,joule per square millimeter,joules per square millimeter,J/mm²,J/mm^2,1000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,kilojoule per square centimeter,kilojoules per square centimeter,kJ/cm²,kJ/cm^2,10000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,kilojoule per square meter,kilojoules per square meter,kJ/m²,kJ/m^2,1000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,kilojoule per square millimeter,kilojoules per square millimeter,kJ/mm²,kJ/mm^2,1000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,megajoule per square centimeter,megajoules per square centimeter,MJ/cm²,MJ/cm^2,10000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,megajoule per square meter,megajoules per square meter,MJ/m²,MJ/m^2,1000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,megajoule per square millimeter,megajoules per square millimeter,MJ/mm²,MJ/mm^2,1000000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,microjoule per square centimeter,microjoules per square centimeter,µJ/cm²,uJ/cm^2,0.01,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,microjoule per square meter,microjoules per square meter,µJ/m²,uJ/m^2,0.000001,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,microjoule per square millimeter,microjoules per square millimeter,µJ/mm²,uJ/mm^2,1,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,millijoule per square centimeter,millijoules per square centimeter,mJ/cm²,mJ/cm^2,10,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,millijoule per square meter,millijoules per square meter,mJ/m²,mJ/m^2,0.001,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,millijoule per square millimeter,millijoules per square millimeter,mJ/mm²,mJ/mm^2,1000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,nanojoule per square centimeter,nanojoules per square centimeter,nJ/cm²,nJ/cm^2,0.00001,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,nanojoule per square meter,nanojoules per square meter,nJ/m²,nJ/m^2,0.000000001,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,nanojoule per square millimeter,nanojoules per square millimeter,nJ/mm²,nJ/mm^2,0.001,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,petajoule per square meter,petajoules per square meter,PJ/m²,PJ/m^2,1000000000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,picojoule per square meter,picojoules per square meter,pJ/m²,pJ/m^2,1E-12,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,terajoule per square meter,terajoules per square meter,TJ/m²,TJ/m^2,1000000000000,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,yoctojoule per square meter,yoctojoules per square meter,yJ/m²,yJ/m^2,1E-24,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,yottajoule per square meter,yottajoules per square meter,YJ/m²,YJ/m^2,1E+024,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,zeptojoule per square meter,zeptojoules per square meter,zJ/m²,zJ/m^2,1E-21,0 -RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,zettajoule per square meter,zettajoules per square meter,ZJ/m²,ZJ/m^2,1E+021,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,becquerel,becquerels,Bq,Bq,1,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,curie,curies,Ci,Ci,37000000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,decabecquerel,decabecquerels,daBq,daBq,10,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,disintegration per minute,disintegrations per minute,dpm,dpm,0.0166666666666667,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,exabecquerel,exabecquerels,EBq,EBq,1E+018,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,gigabecquerel,gigabecquerels,GBq,GBq,1000000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,gigacurie,gigacuries,GCi,GCi,3.7E+019,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,hectobecquerel,hectobecquerels,hBq,hBq,100,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,kilobecquerel,kilobecquerels,kBq,kBq,1000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,kilocurie,kilocuries,kCi,kCi,37000000000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,megabecquerel,megabecquerels,MBq,MBq,1000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,megacurie,megacuries,MCi,MCi,3.7E+016,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,microbecquerel,microbecquerels,µBq,uBq,0.000001,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,microcurie,microcuries,µCi,uCi,37000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,millibecquerel,millibecquerels,mBq,mBq,0.001,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,millicurie,millicuries,mCi,mCi,37000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,nanobecquerel,nanobecquerels,nBq,nBq,0.000000001,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,nanocurie,nanocuries,nCi,nCi,37,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,petabecquerel,petabecquerels,PBq,PBq,1000000000000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,terabecquerel,terabecquerels,TBq,TBq,1000000000000,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,yottabecquerel,yottabecquerels,YBq,YBq,1E+024,0 -Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,zettabecquerel,zettabecquerels,ZBq,ZBq,1E+021,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,basis point,basis points,bp,bp,0.0001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per billion,parts per billion,ppb,ppb,0.000000001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per hundred,parts per hundred,parts per hundred,parts per hundred,0.01,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per million,parts per million,ppm,ppm,0.000001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per quadrillion,parts per quadrillion,ppq,ppq,1E-15,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per then thousand,parts per ten thousand,parts per ten thousand,parts per ten thousand,0.0001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per thousand,parts per thousand,parts per thousand,parts per thousand,0.001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,part per trillion,parts per trillion,ppt,ppt,1E-12,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,per mille,per mille,‰,%\0,0.001,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,percent,percent,%,%,0.01,0 -Number,0,0,0,0,0,0,0,false,false,false,false,false,number,number,,,1,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,diopter,diopters,dpt,dpt,1,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal ångström,reciprocal ångströms,Å⁻¹,ang^-1,10000000000,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal centimeter,reciprocal centimeters,cm⁻¹,cm^-1,100,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal decimeter,reciprocal decimeters,dm⁻¹,dm^-1,10,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal kilometer,reciprocal kilometers,km⁻¹,km^-1,0.001,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal meter,reciprocal meters,m⁻¹,m^-1,1,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal micrometer,reciprocal micrometers,µm⁻¹,um^-1,1000000,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal millimeter,reciprocal millimeters,mm⁻¹,mm^-1,1000,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,reciprocal nanometer,reciprocal nanometers,nm⁻¹,nm^-1,1000000000,0 -ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,Rydberg constant,Rydberg constants,R∞,Rinfinity,10973731.56816,0 -SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,spat,spats,sp,sp,12.5663706143592,0 -SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,square degree,square degrees,°²,deg^2,0.000304617419786709,0 -SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,square minute,square minutes,′²,angle_minute^2,8.46159499407524E-08,0 -SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,square second,square seconds,″²,angle_second^2,2.35044305390979E-11,0 -SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,steradian,steradians,sr,sr,1,0 -SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,square centimeter per gram,square centimeters per gram,cm²/g,cm^2/g,0.1,0 -SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,square centimeter per kilogram,square centimeters per kilogram,cm²/kg,cm^2/kg,0.0001,0 -SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,square meter per gram,square meters per gram,m²/g,m^2/g,1000,0 -SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,square meter per kilogram,square meters per kilogram,m²/kg,m^2/kg,1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,attojoule per kilogram kelvin,attojoules per kilogram kelvin,aJ/(kg · K),aJ/(kg*K),1E-18,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per ounce degree Fahrenheit,British thermal units (IT) per ounce degree Fahrenheit,Btu (IT)/(oz · °F),Btu (IT)/(oz*degF),66988.8167418708,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per pound degree Fahrenheit,British thermal units (IT) per pound degree Fahrenheit,Btu (IT)/(lb · °F),Btu (IT)/(lb*degF),4186.80030794167,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit (IT) per ton degree Fahrenheit,British thermal units (IT) per ton degree Fahrenheit,Btu (IT)/(t · °F),Btu (IT)/(t*degF),1.8991008,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit per ounce degree Fahrenheit,British thermal units per ounce degree Fahrenheit,Btu/(oz · °F),Btu/(oz*degF),66943.990586084,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit per pound degree Fahrenheit,British thermal units per pound degree Fahrenheit,Btu/(lb · °F),Btu/(lb*degF),4183.99867369912,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,British thermal unit per ton degree Fahrenheit,British thermal units per ton degree Fahrenheit,Btu/(t · °F),Btu/(t*degF),1.89783,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,calorie per gram kelvin,calories per gram kelvin,cal/(g · K),cal/(g*K),4184,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,calorie per kilogram kelvin,calories per kilogram kelvin,cal/(kg · K),cal/(kg*K),4.184,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,centijoule per kilogram kelvin,centijoules per kilogram kelvin,cJ/(kg · K),cJ/(kg*K),0.01,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,decajoule per kilogram kelvin,decajoules per kilogram kelvin,daJ/(kg · K),daJ/(kg*K),10,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,decijoule per kilogram kelvin,decijoules per kilogram kelvin,dJ/(kg · K),dJ/(kg*K),0.1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,exajoule per kilogram kelvin,exajoules per kilogram kelvin,EJ/(kg · K),EJ/(kg*K),1E+018,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,femtojoule per kilogram kelvin,femtojoules per kilogram kelvin,fJ/(kg · K),fJ/(kg*K),1E-15,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,gigajoule per kilogram kelvin,gigajoules per kilogram kelvin,GJ/(kg · K),GJ/(kg*K),1000000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,hectojoule per kilogram kelvin,hectojoules per kilogram kelvin,hJ/(kg · K),hJ/(kg*K),100,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,joule per gram degree celsius,joules per gram degree celsius,J/(g · °C),J/(g*degC),1000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,joule per kilogram degree celsius,joules per kilogram degree celsius,J/(kg · °C),J/(kg*degC),1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,joule per kilogram kelvin,joules per kilogram kelvin,J/(kg · K),J/(kg*K),1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,kilojoule per gram degree celsius,kilojoules per gram degree celsius,kJ/(g · °C),kJ/(g*degC),1000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,kilojoule per kilogram degree celsius,kilojoules per kilogram degree celsius,kJ/(kg · °C),kJ/(kg*degC),1000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,kilojoule per kilogram kelvin,kilojoules per kilogram kelvin,kJ/(kg · K),kJ/(kg*K),1000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,megajoule per kilogram kelvin,megajoules per kilogram kelvin,MJ/(kg · K),MJ/(kg*K),1000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,microjoule per kilogram kelvin,microjoules per kilogram kelvin,µJ/(kg · K),uJ/(kg*K),0.000001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,millijoule per gram degree celsius,millijoules per gram degree celsius,mJ/(g · °C),mJ/(g*degC),1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,millijoule per kilogram degree celsius,millijoules per kilogram degree celsius,mJ/(kg · °C),mJ/(kg*degC),0.001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,millijoule per kilogram kelvin,millijoules per kilogram kelvin,mJ/(kg · K),mJ/(kg*K),0.001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,nanojoule per kilogram kelvin,nanojoules per kilogram kelvin,nJ/(kg · K),nJ/(kg*K),0.000000001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,petajoule per kilogram kelvin,petajoules per kilogram kelvin,PJ/(kg · K),PJ/(kg*K),1000000000000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,picojoule per kilogram kelvin,picojoules per kilogram kelvin,pJ/(kg · K),pJ/(kg*K),1E-12,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,square centimeter per second squared kelvin,square centimeters per second squared kelvin,cm²/(s² · K),cm^2/(s^2*K),0.0001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,square kilometer per second squared kelvin,square kilometers per second squared kelvin,km²/(s² · K),km^2/(s^2*K),1000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,square meter per second squared kelvin,square meters per second squared kelvin,m²/(s² · K),m^2/(s^2*K),1,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,square micrometer per second squared kelvin,square micrometers per second squared kelvin,µm²/(s² · K),um^2/(s^2*K),1E-12,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,square millimeter per second squared kelvin,square millimeters per second squared kelvin,mm²/(s² · K),mm^2/(s^2*K),0.000001,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,terajoule per kilogram kelvin,terajoules per kilogram kelvin,TJ/(kg · K),TJ/(kg*K),1000000000000,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,yoctojoule per kilogram kelvin,yoctojoules per kilogram kelvin,yJ/(kg · K),yJ/(kg*K),1E-24,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,yottajoule per kilogram kelvin,yottajoules per kilogram kelvin,YJ/(kg · K),YJ/(kg*K),1E+024,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,zeptojoule per kilogram kelvin,zeptojoules per kilogram kelvin,zJ/(kg · K),zJ/(kg*K),1E-21,0 -SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,zettajoule per kilogram kelvin,zettajoules per kilogram kelvin,ZJ/(kg · K),ZJ/(kg*K),1E+021,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,attowatt per kilogram,attowatts per kilogram,aW/kg,aW/kg,1E-18,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,centiwatt per kilogram,centiwatts per kilogram,cW/kg,cW/kg,0.01,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,decawatt per kilogram,decawatts per kilogram,daW/kg,daW/kg,10,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,deciwatt per kilogram,deciwatts per kilogram,dW/kg,dW/kg,0.1,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,erg per second per kilogram,ergs per second per kilogram,(erg/s)/kg,(erg/s)/kg,0.0000001,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,exawatt per kilogram,exawatts per kilogram,EW/kg,EW/kg,1E+018,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,femtowatt per kilogram,femtowatts per kilogram,fW/kg,fW/kg,1E-15,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,foot pound-force per hour per pound,foot pounds-force per hour per pound,(ft · lbf/h)/lb,(ft*lbf/h)/lb,0.000830296343393565,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,foot pound-force per minute per pound,foot pounds-force per minute per pound,(ft · lbf/min)/lb,(ft*lbf/min)/lb,0.0498177806036139,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,foot pound-force per second per pound,foot pounds-force per second per pound,(ft · lbf/s)/lb,(ft*lbf/s)/lb,2.98906683621683,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,gigawatt per kilogram,gigawatts per kilogram,GW/kg,GW/kg,1000000000,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,hectowatt per kilogram,hectowatts per kilogram,hW/kg,hW/kg,100,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,horsepower (boiler) per pound,horsepower (boiler) per pound,(hp (S))/lb,(hp (S))/lb,21626.2441786944,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,horsepower (electric) per pound,horsepower (electric) per pound,(hp (E))/lb,(hp (E))/lb,1644.64836712432,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,horsepower (Imperial) per pound,horsepower (Imperial) per pound,(hp (I))/lb,(hp (I))/lb,1643.98698038151,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,metric horsepower per pound,metric horsepower per pound,(hp (M))/lb,(hp (M))/lb,1621.49718557895,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,horsepower per pound,horsepower per pound,hp/lb,hp/lb,1643.98675991926,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,hydraulic horsepower per pound,hydraulic horsepower per pound,(hp (hydraulic))/lb,(hp (hydraulic))/lb,1644.74316589079,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,kilowatt per kilogram,kilowatts per kilogram,kW/kg,kW/kg,1000,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,megawatt per kilogram,megawatts per kilogram,MW/kg,MW/kg,1000000,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,microwatt per kilogram,microwatts per kilogram,µW/kg,uW/kg,0.000001,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,milliwatt per kilogram,milliwatts per kilogram,mW/kg,mW/kg,0.001,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,nanowatt per kilogram,nanowatts per kilogram,nW/kg,nW/kg,0.000000001,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,petawatt per kilogram,petawatts per kilogram,PW/kg,PW/kg,1000000000000000,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,picowatt per kilogram,picowatts per kilogram,pW/kg,pW/kg,1E-12,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,square meter per cubic second,square meters per cubic second,m² · s⁻³,m^2*s^-3,1,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,terawatt per kilogram,terawatts per kilogram,TW/kg,TW/kg,1000000000000,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,watt per kilogram,watts per kilogram,W/kg,W/kg,1,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,yoctowatt per kilogram,yoctowatts per kilogram,yW/kg,yW/kg,1E-24,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,yottawatt per kilogram,yottawatts per kilogram,YW/kg,YW/kg,1E+024,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,zeptowatt per kilogram,zeptowatts per kilogram,zW/kg,zW/kg,1E-21,0 -SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,zettawatt per kilogram,zettawatts per kilogram,ZW/kg,ZW/kg,1E+021,0 -SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,becquerel per kilogram,becquerels per kilogram,Bq/kg,Bq/kg,1,0 -SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,curie per kilogram,curie per kilogram,Ci/kg,Ci/kg,37000000000,0 -SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,disintegration per minute per kilogram,disintegrations per minute per kilogram,dpm/kg,dpm/kg,0.0166666666666667,0 -SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,cubic centimeter per gram,cubic centimeters per gram,cm³/g,cm^3/g,0.001,0 -SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,cubic centimeter per kilogram,cubic centimeters per kilogram,cm³/kg,cm^3/kg,0.000001,0 -SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,cubic meter per gram,cubic meters per gram,m³/g,m^3/g,1000,0 -SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,cubic meter per kilogram,cubic meters per kilogram,m³/kg,m^3/kg,1,0 -SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,ampere per centimeter,amperes per centimeter,A/cm,A/cm (surface density),100,0 -SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,ampere per meter,amperes per meter,A/m,A/m (surface density),1,0 -SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,ampere per micrometer,amperes per micrometer,A/μm,A/um (surface density),1000000,0 -SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,ampere per millimeter,amperes per millimeter,A/mm,A/mm (surface density),1000,0 -TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,per kelvin,per kelvin,K⁻¹,K^-1,1,0 -TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,ppm per degree Celsius,ppm per degree Celsius,ppm/°C,ppm/degC,0.000001,0 -TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,ppm per kelvin,ppm per kelvin,ppm/K,ppm/K,0.000001,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per centimeter,kelvins per centimeter,K/cm,K/cm,100,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per hectometer,kelvins per hectometer,K/hm,K/hm,0.01,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per kilometer,kelvins per kilometer,K/km,K/km,0.001,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per meter,kelvins per meter,K/m,K/m,1,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per micrometer,kelvins per micrometer,K/µm,K/um,1000000,0 -TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,kelvin per millimeter,kelvins per millimeter,K/mm,K/mm,1000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,attokelvin,attokelvins,aK,aK (interval),1E-18,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,centikelvin,centikelvins,cK,cK (interval),0.01,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,decakelvin,decakelvins,daK,daK (interval),10,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,decikelvin,decikelvins,dK,dK (interval),0.1,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,degree Celsius,degrees Celsius,°C,degC (interval),1,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,degree Fahrenheit,degrees Fahrenheit,°F,degF (interval),0.555555555555556,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,degree Rankine,degrees Rankine,°R,degR (interval),0.555555555555556,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,exakelvin,exakelvins,EK,EK (interval),1E+018,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,femtokelvin,femtokelvins,fK,fK (interval),1E-15,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,gigakelvin,gigakelvins,GK,GK (interval),1000000000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,hectokelvin,hectokelvins,hK,hK (interval),100,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,kelvin,kelvins,K,K (interval),1,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,kilokelvin,kilokelvins,kK,kK (interval),1000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,megakelvin,megakelvins,MK,MK (interval),1000000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,microkelvin,microkelvins,µK,uK (interval),0.000001,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,millikelvin,millikelvins,mK,mK (interval),0.001,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,nanokelvin,nanokelvins,nK,nK (interval),0.000000001,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,petakelvin,petakelvins,PK,PK (interval),1000000000000000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,picokelvin,picokelvins,pK,pK (interval),1E-12,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,terakelvin,terakelvins,TK,TK (interval),1000000000000,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,yoctokelvin,yoctokelvins,yK,yK (interval),1E-24,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,yottakelvin,yottakelvins,YK,YK (interval),1E+024,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,zeptokelvin,zeptokelvins,zK,zK (interval),1E-21,0 -TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,zettakelvin,zettakelvins,ZK,ZK (interval),1E+021,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,attogram meter squared per second cubed kelvin,attograms meter squared per second cubed kelvin,ag · m²/(s³ · K),ag*m^2/(s^3*K),1E-21,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,attowatt per kelvin,attowatts per kelvin,aW/K,aW/K,1E-18,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,centigram meter squared per second cubed kelvin,centigrams meter squared per second cubed kelvin,cg · m²/(s³ · K),cg*m^2/(s^3*K),0.00001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,centiwatt per kelvin,centiwatts per kelvin,cW/K,cW/K,0.01,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,decagram meter squared per second cubed kelvin,decagrams meter squared per second cubed kelvin,dag · m²/(s³ · K),dag*m^2/(s^3*K),0.01,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,decawatt per kelvin,decawatts per kelvin,daW/K,daW/K,10,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,decigram meter squared per second cubed kelvin,decigrams meter squared per second cubed kelvin,dg · m²/(s³ · K),dg*m^2/(s^3*K),0.0001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,deciwatt per kelvin,deciwatts per kelvin,dW/K,dW/K,0.1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,exagram meter squared per second cubed kelvin,exagrams meter squared per second cubed kelvin,Eg · m²/(s³ · K),Eg*m^2/(s^3*K),1000000000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,exawatt per kelvin,exawatts per kelvin,EW/K,EW/K,1E+018,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,femtogram meter squared per second cubed kelvin,femtograms meter squared per second cubed kelvin,fg · m²/(s³ · K),fg*m^2/(s^3*K),1E-18,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,femtowatt per kelvin,femtowatts per kelvin,fW/K,fW/K,1E-15,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,gigagram meter squared per second cubed kelvin,gigagrams meter squared per second cubed kelvin,Gg · m²/(s³ · K),Gg*m^2/(s^3*K),1000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,gigawatt per kelvin,gigawatts per kelvin,GW/K,GW/K,1000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,gram meter squared per second cubed kelvin,grams meter squared per second cubed kelvin,g · m/(s³ · K),g*m/(s^3*K),0.001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,hectogram meter squared per second cubed kelvin,hectograms meter squared per second cubed kelvin,hg · m²/(s³ · K),hg*m^2/(s^3*K),0.1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,hectowatt per kelvin,hectowatts per kelvin,hW/K,hW/K,100,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,kilogram meter squared per second cubed degree Celsius,kilograms meter squared per second cubed degree Celsius,kg · m²/(s³ · °C),kg*m^2/(s^3*degC),1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,kilogram meter squared per second cubed kelvin,kilograms meter squared per second cubed kelvin,kg · m²/(s³ · K),kg*m^2/(s^3*K),1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,kilowatt per degree Celsius,kilowatts per degree Celsius,kW/°C,kW/degC,1000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,kilowatt per kelvin,kilowatts per kelvin,kW/K,kW/K,1000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,megagram meter squared per second cubed kelvin,megagrams meter squared per second cubed kelvin,Mg · m²/(s³ · K),Mg*m^2/(s^3*K),1000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,megawatt per kelvin,megawatts per kelvin,MW/K,MW/K,1000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,microgram meter squared per second cubed kelvin,micrograms meter squared per second cubed kelvin,µg · m/(s³ · K),ug*m/(s^3*K),0.000000001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,microwatt per kelvin,microwatts per kelvin,µW/K,uW/K,0.000001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,milligram meter squared per second cubed kelvin,milligrams meter squared per second cubed kelvin,mg · m²/(s³ · K),mg*m^2/(s^3*K),0.000001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,milliwatt per degree Celsius,milliwatts per degree Celsius,mW/°C,mW/degC,0.001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,milliwatt per kelvin,milliwatts per kelvin,mW/K,mW/K,0.001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,nanogram meter squared per second cubed kelvin,nanograms meter squared per second cubed kelvin,ng · m²/(s³ · K),ng*m^2/(s^3*K),1E-12,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,nanowatt per kelvin,nanowatts per kelvin,nW/K,nW/K,0.000000001,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,petagram meter squared per second cubed kelvin,petagrams meter squared per second cubed kelvin,Pg · m²/(s³ · K),Pg*m^2/(s^3*K),1000000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,petawatt per kelvin,petawatts per kelvin,PW/K,PW/K,1000000000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,picogram meter squared per second cubed kelvin,picograms meter squared per second cubed kelvin,pg · m²/(s³ · K),pg*m^2/(s^3*K),1E-15,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,picowatt per kelvin,picowatts per kelvin,pW/K,pW/K,1E-12,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,teragram meter squared per second cubed kelvin,teragrams meter squared per second cubed kelvin,Tg · m²/(s³ · K),Tg*m^2/(s^3*K),1000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,terawatt per kelvin,terawatts per kelvin,TW/K,TW/K,1000000000000,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,watt per kelvin,watts per kelvin,W/K,W/K,1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,watt per degree Celsius,watts per degree Celsius,W/°C,W/degC,1,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,yoctogram meter squared per second cubed kelvin,yoctograms meter squared per second cubed kelvin,yg · m²/(s³ · K),yg*m^2/(s^3*K),1E-27,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,yoctowatt per kelvin,yoctowatts per kelvin,yW/K,yW/K,1E-24,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,yottagram meter squared per second cubed kelvin,yottagrams meter squared per second cubed kelvin,Yg · m²/(s³ · K),Yg*m^2/(s^3*K),1E+021,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,yottawatt per kelvin,yottawatts per kelvin,YW/K,YW/K,1E+024,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,zeptogram meter squared per second cubed kelvin,zeptograms meter squared per second cubed kelvin,zg · m²/(s³ · K),zg*m^2/(s^3*K),1E-24,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,zeptowatt per kelvin,zeptowatts per kelvin,zW/K,zW/K,1E-21,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,zettagram meter squared per second cubed kelvin,zettagrams meter squared per second cubed kelvin,Zg · m²/(s³ · K),Zg*m^2/(s^3*K),1E+018,0 -ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,zettawatt per kelvin,zettawatts per kelvin,ZW/K,ZW/K,1E+021,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,attogram meter per second cubed kelvin,attograms meter per second cubed kelvin,ag · m/(s³ · K),ag*m/(s^3*K),1E-21,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,attowatt per meter kelvin,attowatts per meter kelvin,aW/(m · K),aW/(m*K),1E-18,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,centigram meter per second cubed kelvin,centigrams meter per second cubed kelvin,cg · m/(s³ · K),cg*m/(s^3*K),0.00001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,centiwatt per meter kelvin,centiwatts per meter kelvin,cW/(m · K),cW/(m*K),0.01,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,decagram meter per second cubed kelvin,decagrams meter per second cubed kelvin,dag · m/(s³ · K),dag*m/(s^3*K),0.01,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,decawatt per meter kelvin,decawatts per meter kelvin,daW/(m · K),daW/(m*K),10,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,decigram meter per second cubed kelvin,decigrams meter per second cubed kelvin,dg · m/(s³ · K),dg*m/(s^3*K),0.0001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,deciwatt per meter kelvin,deciwatts per meter kelvin,dW/(m · K),dW/(m*K),0.1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,exagram meter per second cubed kelvin,exagrams meter per second cubed kelvin,Eg · m/(s³ · K),Eg*m/(s^3*K),1000000000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,exawatt per meter kelvin,exawatts per meter kelvin,EW/(m · K),EW/(m*K),1E+018,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,femtogram meter per second cubed kelvin,femtograms meter per second cubed kelvin,fg · m/(s³ · K),fg*m/(s^3*K),1E-18,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,femtowatt per meter kelvin,femtowatts per meter kelvin,fW/(m · K),fW/(m*K),1E-15,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,gigagram meter per second cubed kelvin,gigagrams meter per second cubed kelvin,Gg · m/(s³ · K),Gg*m/(s^3*K),1000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,gigawatt per meter kelvin,gigawatts per meter kelvin,GW/(m · K),GW/(m*K),1000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,gram meter per second cubed kelvin,grams meter per second cubed kelvin,g · m/(s³ · K),g*m/(s^3*K) (conductivity),0.001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,hectogram meter per second cubed kelvin,hectograms meter per second cubed kelvin,hg · m/(s³ · K),hg*m/(s^3*K),0.1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,hectowatt per meter kelvin,hectowatts per meter kelvin,hW/(m · K),hW/(m*K),100,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,kilogram meter per second cubed degree celsius,kilograms meter per second cubed degree celsius,kg · m/(s³ · °C),kg*m/(s^3*degC),1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,kilogram meter per second cubed kelvin,kilograms meter per second cubed kelvin,kg · m/(s³ · K),kg*m/(s^3*K),1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,kilowatt per meter degree celsius,kilowatts per meter degree celsius,kW/(m · °C),kW/(m*degC),1000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,kilowatt per meter kelvin,kilowatts per meter kelvin,kW/(m · K),kW/(m*K),1000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,megagram meter per second cubed kelvin,megagrams meter per second cubed kelvin,Mg · m/(s³ · K),Mg*m/(s^3*K),1000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,megawatt per meter kelvin,megawatts per meter kelvin,MW/(m · K),MW/(m*K),1000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,microgram meter per second cubed kelvin,micrograms meter per second cubed kelvin,µg · m/(s³ · K),ug*m/(s^3*K) (conductivity),0.000000001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,microwatt per meter kelvin,microwatts per meter kelvin,µW/(m · K),uW/(m*K),0.000001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,milligram meter per second cubed kelvin,milligrams meter per second cubed kelvin,mg · m/(s³ · K),mg*m/(s^3*K),0.000001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,milliwatt per meter degree celsius,milliwatts per meter degree celsius,mW/(m · °C),mW/(m*degC),0.001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,milliwatt per meter kelvin,milliwatts per meter kelvin,mW/(m · K),mW/(m*K),0.001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,nanogram meter per second cubed kelvin,nanograms meter per second cubed kelvin,ng · m/(s³ · K),ng*m/(s^3*K),1E-12,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,nanowatt per meter kelvin,nanowatts per meter kelvin,nW/(m · K),nW/(m*K),0.000000001,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,petagram meter per second cubed kelvin,petagrams meter per second cubed kelvin,Pg · m/(s³ · K),Pg*m/(s^3*K),1000000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,petawatt per meter kelvin,petawatts per meter kelvin,PW/(m · K),PW/(m*K),1000000000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,picogram meter per second cubed kelvin,picograms meter per second cubed kelvin,pg · m/(s³ · K),pg*m/(s^3*K),1E-15,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,picowatt per meter kelvin,picowatts per meter kelvin,pW/(m · K),pW/(m*K),1E-12,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,teragram meter per second cubed kelvin,teragrams meter per second cubed kelvin,Tg · m/(s³ · K),Tg*m/(s^3*K),1000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,terawatt per meter kelvin,terawatts per meter kelvin,TW/(m · K),TW/(m*K),1000000000000,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,watt per meter degree celsius,watts per meter degree celsius,W/(m · °C),W/(m*degC),1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,watt per meter kelvin,watts per meter kelvin,W/(m · K),W/(m*K),1,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,yoctogram meter per second cubed kelvin,yoctograms meter per second cubed kelvin,yg · m/(s³ · K),yg*m/(s^3*K),1E-27,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,yoctowatt per meter kelvin,yoctowatts per meter kelvin,yW/(m · K),yW/(m*K),1E-24,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,yottagram meter per second cubed kelvin,yottagrams meter per second cubed kelvin,Yg · m/(s³ · K),Yg*m/(s^3*K),1E+021,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,yottawatt per meter kelvin,yottawatts per meter kelvin,YW/(m · K),YW/(m*K),1E+024,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,zeptogram meter per second cubed kelvin,zeptograms meter per second cubed kelvin,zg · m/(s³ · K),zg*m/(s^3*K),1E-24,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,zeptowatt per meter kelvin,zeptowatts per meter kelvin,zW/(m · K),zW/(m*K),1E-21,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,zettagram meter per second cubed kelvin,zettagrams meter per second cubed kelvin,Zg · m/(s³ · K),Zg*m/(s^3*K),1E+018,0 -ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,zettawatt per meter kelvin,zettawatts per meter kelvin,ZW/(m · K),ZW/(m*K),1E+021,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,attokelvin,attokelvins,aK,aK,1E-18,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,centikelvin,centikelvins,cK,cK,0.01,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,decakelvin,decakelvins,daK,daK,10,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,decikelvin,decikelvins,dK,dK,0.1,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,degree Celsius,degrees Celsius,°C,degC,1,273.15 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,degree Fahrenheit,degrees Fahrenheit,°F,degF,0.555555555555556,459.67 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,degree Rankine,degrees Rankine,°R,degR,0.555555555555556,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,exakelvin,exakelvins,EK,EK,1E+018,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,femtokelvin,femtokelvins,fK,fK,1E-15,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,gigakelvin,gigakelvins,GK,GK,1000000000,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,hectokelvin,hectokelvins,hK,hK,100,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,kelvin,kelvins,K,K,1,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,kilokelvin,kilokelvins,kK,kK,1000,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,megakelvin,megakelvins,MK,MK,1000000,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,microkelvin,microkelvins,µK,uK,0.000001,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,millikelvin,millikelvins,mK,mK,0.001,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,nanokelvin,nanokelvins,nK,nK,0.000000001,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,petakelvin,petakelvins,PK,PK,1000000000000000,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,picokelvin,picokelvins,pK,pK,1E-12,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,terakelvin,terakelvins,TK,TK,1000000000000,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,yoctokelvin,yoctokelvins,yK,yK,1E-24,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,yottakelvin,yottakelvins,YK,YK,1E+024,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,zeptokelvin,zeptokelvins,zK,zK,1E-21,0 -ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,zettakelvin,zettakelvins,ZK,ZK,1E+021,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,attosecond,attoseconds,as,as,1E-18,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,centisecond,centiseconds,cs,cs,0.01,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,day,days,d,d,86400,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,day (sidereal),days (sidereal),d (sidereal),d (sidereal),86164.09,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,decasecond,decaseconds,das,das,10,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,decisecond,deciseconds,ds,ds,0.1,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,exasecond,exaseconds,Es,Es,1E+018,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,femtosecond,femtoseconds,fs,fs,1E-15,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,gigasecond,gigaseconds,Gs,Gs,1000000000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,hectosecond,hectoseconds,hs,hs,100,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,hour,hours,h,h,3600,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,hour (sidereal),hours (sidereal),h (sidereal),h (sidereal),3590.17,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,kilosecond,kiloseconds,ks,ks,1000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,megasecond,megaseconds,Ms,Ms,1000000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,microsecond,microseconds,µs,us,0.000001,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,millisecond,milliseconds,ms,ms,0.001,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,minute,minutes,min,min,60,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,nanosecond,nanoseconds,ns,ns,0.000000001,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,petasecond,petaseconds,Ps,Ps,1000000000000000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,picosecond,picoseconds,ps,ps,1E-12,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,second,seconds,s,s,1,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,second (sidereal),seconds (sidereal),s (sidereal),s (sidereal),0.9972696,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,shake,shakes,10.0 ns,10.0 ns,0.00000001,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,terasecond,teraseconds,Ts,Ts,1000000000000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,year,years,a,y,31536000,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,year (sidereal),years (sidereal),a (sidereal),a (sidereal),31558150,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,year (tropical),years (tropical),a (tropical),a (tropical),31556930,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,yoctosecond,yoctoseconds,ys,ys,1E-24,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,yottasecond,yottaseconds,Ys,Ys,1E+024,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,zeptosecond,zeptoseconds,zs,zs,1E-21,0 -Time,0,0,1,0,0,0,0,false,false,false,false,false,zettasecond,zettaseconds,Zs,Zs,1E+021,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,attonewton meter,attonewton meters,aN · m,aN*m,1E-18,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,centinewton meter,centinewton meters,cN · m,cN*m,0.01,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,decanewton meter,decanewton meters,daN · m,daN*m,10,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,decinewton meter,decinewton meters,dN · m,dN*m,0.1,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,dyne centimeter,dyne centimeters,dyn · cm,dyn*cm,0.0000001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,dyne meter,dyne meters,dyn · m,dyn*m,0.00001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,exanewton meter,exanewton meters,EN · m,EN*m,1E+018,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,femtonewton meter,femtonewton meters,fN · m,fN*m,1E-15,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,giganewton meter,giganewton meters,GN · m,GN*m,1000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,hectonewton meter,hectonewton meters,hN · m,hN*m,100,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,kilogram-force meter,kilogram-force meters,kgf · m,kgf*m,9.80665,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,kilonewton meter,kilonewton meters,kN · m,kN*m,1000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,meganewton meter,meganewton meters,MN · m,MN*m,1000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,micronewton meter,micronewton meters,µN · m,uN*m,0.000001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,millinewton meter,millinewton meters,mN · m,mN*m,0.001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,nanonewton meter,nanonewton meters,nN · m,nN*m,0.000000001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton attometer,newton attometers,N · am,N*am,1E-18,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton centimeter,newton centimeters,N · cm,N*cm,0.01,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton decameter,newton decameters,N · dam,N*dam,10,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton decimeter,newton decimeters,N · dm,N*dm,0.1,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton exameter,newton exameters,N · Em,N*Em,1E+018,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton femtometer,newton femtometers,N · fm,N*fm,1E-15,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton gigameter,newton gigameters,N · Gm,N*Gm,1000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton hectometer,newton hectometers,N · hm,N*hm,100,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton kilometer,newton kilometers,N · km,N*km,1000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton megameter,newton megameters,N · Mm,N*Mm,1000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton meter,newton meters,N · m,N*m,1,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton micrometer,newton micrometers,N · µm,N*um,0.000001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton millimeter,newton millimeters,N · mm,N*mm,0.001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton nanometer,newton nanometers,N · nm,N*nm,0.000000001,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton petameter,newton petameters,N · Pm,N*Pm,1000000000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton picometer,newton picometers,N · pm,N*pm,1E-12,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton terameter,newton terameters,N · Tm,N*Tm,1000000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton yoctometer,newton yoctometers,N · ym,N*ym,1E-24,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton yottameter,newton yottameters,N · Ym,N*Ym,1E+024,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton zeptometer,newton zeptometers,N · zm,N*zm,1E-21,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,newton zettameter,newton zettameters,N · Zm,N*Zm,1E+021,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,ounce-force inch,ounces-force inches,ozf · in,ozf*in,0.00706155306,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,petanewton meter,petanewton meters,PN · m,PN*m,1000000000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,piconewton meter,piconewton meters,pN · m,pN*m,1E-12,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,pound-force foot,pounds-force feet,lbf · ft,lbf*ft,1.3558180656,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,pound-force inch,pounds-force inches,lbf · in,lbf*in,0.1129848388,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,teranewton meter,teranewton meters,TN · m,TN*m,1000000000000,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,yoctonewton meter,yoctonewton meters,yN · m,yN*m,1E-24,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,yottanewton meter,yottanewton meters,YN · m,YN*m,1E+024,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,zeptonewton meter,zeptonewton meters,zN · m,zN*m,1E-21,0 -Torque,2,1,-2,0,0,0,0,true,false,false,false,false,zettanewton meter,zettanewton meters,ZN · m,ZN*m,1E+021,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,atomic unit of velocity,atomic units of velocity,a₀ · Eₕ/ħ,a\0*E\h/n<-,2187691.26364,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,attometer per second,attometers per second,am/s,am/s,1E-18,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,centimeter per second,centimeters per second,cm/s,cm/s,0.01,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,decameter per second,decameters per second,dam/s,dam/s,10,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,decimeter per second,decimeters per second,dm/s,dm/s,0.1,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,exameter per second,exameters per second,Em/s,Em/s,1E+018,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,femtometer per second,femtometers per second,fm/s,fm/s,1E-15,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,foot per hour,feet per hour,ft/h,ft/h,8.46666666666667E-05,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,foot per minute,feet per minute,ft/min,ft/min,0.00508,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,foot per second,feet per second,ft/s,ft/s,0.3048,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,gigameter per second,gigameters per second,Gm/s,Gm/s,1000000000,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,hectometer per second,hectometers per second,hm/s,hm/s,100,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,inch per second,inches per second,in/s,in/s,0.0254,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,kilometer per hour,kilometers per hour,km/h,km/h,0.277777777777778,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,kilometer per second,kilometers per second,km/s,km/s,1000,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,knot,knots,kn,kn,0.514444444444445,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,megameter per second,megameters per second,Mm/s,Mm/s,1000000,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,meter per second,meters per second,m/s,m/s,1,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,micrometer per second,micrometers per second,µm/s,um/s,0.000001,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,mile per hour,miles per hour,mi/h,mi/h,0.44704,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,mile per minute,miles per minute,mi/min,mi/min,26.8224,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,mile per second,miles per second,mi/s,mi/s,1609.344,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,millimeter per minute,millimeters per minute,mm/min,mm/min,1.66666666666667E-05,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,millimeter per second,millimeters per second,mm/s,mm/s,0.001,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,nanometer per second,nanometers per second,nm/s,nm/s,0.000000001,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,natural unit of velocity,natural units of velocity,c,c (natural units),299792458,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,petameter per second,petameters per second,Pm/s,Pm/s,1000000000000000,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,picometer per second,picometers per second,pm/s,pm/s,1E-12,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,speed of light in vacuum,speeds of light in vacuum,c,c (speed of light),299792458,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,terameter per second,terameters per second,Tm/s,Tm/s,1000000000000,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,yoctometer per second,yoctometers per second,ym/s,ym/s,1E-24,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,yottameter per second,yottameters per second,Ym/s,Ym/s,1E+024,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,zeptometer per second,zeptometers per second,zm/s,zm/s,1E-21,0 -Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,zettameter per second,zettameters per second,Zm/s,Zm/s,1E+021,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,acre-foot,acre-feet,ac · ft,ac*ft,1233.489,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,attoliter,attoliters,aL,aL,1E-21,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,barrel,barrels,bbl,bbl,0.1589873,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,bushel,bushels,bu,bu,0.03523907,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,centiliter,centiliters,cL,cL,0.00001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cord,cords,cords,cords,3.624556,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic attometer,cubic attometers,am³,am^3,1E-54,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic centimeter,cubic centimeters,cm³,cm^3,0.000001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic decameter,cubic decameters,dam³,dam^3,1000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic decimeter,cubic decimeters,dm³,dm^3,0.001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic exameter,cubic exameters,Em³,Em^3,1E+054,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic femtometer,cubic femtometers,fm³,fm^3,1E-45,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic foot,cubic feet,ft³,ft^3,0.02831685,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic gigameter,cubic gigameters,Gm³,Gm^3,1E+027,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic hectometer,cubic hectometers,hm³,hm^3,1000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic inch,cubic inches,in³,in^3,0.00001638706,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic kilometer,cubic kilometers,km³,km^3,1000000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic megameter,cubic megameters,Mm³,Mm^3,1E+018,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic meter,cubic meters,m³,m^3,1,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic micrometer,cubic micrometers,µm³,um^3,1E-18,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic mile,cubic miles,mi³,mi^3,4168182000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic millimeter,cubic millimeters,mm³,mm^3,0.000000001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic nanometer,cubic nanometers,nm³,nm^3,1E-27,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic petameter,cubic petameters,Pm³,Pm^3,1E+045,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic picometer,cubic picometers,pm³,pm^3,1E-36,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic terameter,cubic terameters,Tm³,Tm^3,1E+036,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic yard,cubic yards,yd³,yd^3,0.7645549,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic yoctometer,cubic yoctometers,ym³,ym^3,1E-72,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic yottameter,cubic yottameters,Ym³,Ym^3,1E+072,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic zeptometer,cubic zeptometers,zm³,zm^3,1E-63,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cubic zettameter,cubic zettameters,Zm³,Zm^3,1E+063,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,cup,cups,cup,cup,0.0002365882,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,decaliter,decaliters,daL,daL,0.01,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,deciliter,deciliters,dL,dL,0.0001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,exaliter,exaliters,EL,EL,1000000000000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,femtoliter,femtoliters,fL,fL,1E-18,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,fluid ounce,fluid ounces,fl oz,fl_oz,0.00002957353,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,Imperial fluid ounce,Imperial fluid ounces,fl oz (UK),fl oz (UK),0.00002841306,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,gallon,gallons,gal,gal,0.003785412,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,Imperial gallon,Imperial gallons,gal (UK),gal (UK),0.00454609,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,gigaliter,gigaliters,GL,GL,1000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,gill,gills,gi,gi,0.0001182941,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,Imperial gill,Imperial gills,gi (UK),gi (UK),0.0001420653,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,hectoliter,hectoliters,hL,hL,0.1,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,kiloliter,kiloliters,kL,kL,1,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,liter,liters,L,L,0.001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,megaliter,megaliters,ML,ML,1000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,microliter,microliters,µL,uL,0.000000001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,milliliter,milliliters,mL,mL,0.000001,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,nanoliter,nanoliters,nL,nL,1E-12,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,peck,pecks,pk,pk,0.008809768,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,petaliter,petaliters,PL,PL,1000000000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,picoliter,picoliters,pL,pL,1E-15,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,dry pint,dry pints,dry pt,dry_pt,0.0005506105,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,liquid pint,liquid pints,liq pt,liq_pt,0.0004731765,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,dry quart,dry quarts,dry qt,dry_qt,0.001101221,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,liquid quart,liquid quarts,liq qt,liq_qt,0.0009463529,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,register ton,register tons,RT,RT,2.831685,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,stere,steres,st,st,1,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,tablespoon,tablespoons,tbsp,tbsp,0.00001478676,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,teaspoon,teaspoons,tsp,tsp,0.000004928922,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,teraliter,teraliters,TL,TL,1000000000,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,yoctoliter,yoctoliters,yL,yL,1E-27,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,yottaliter,yottaliters,YL,YL,1E+021,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,zeptoliter,zeptoliters,zL,zL,1E-24,0 -Volume,3,0,0,0,0,0,0,false,false,false,false,false,zettaliter,zettaliters,ZL,ZL,1E+018,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,acre-foot per second,acre-feet per second,ac · ft/s,ac*ft/s,1233.489,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,attoliter per second,attoliters per second,aL/s,aL/s,1E-21,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,barrel per second,barrels per second,bbl/s,bbl/s,0.1589873,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,bushel per second,bushels per second,bu/s,bu/s,0.03523907,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,centiliter per second,centiliters per second,cL/s,cL/s,0.00001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cord per second,cords per second,cords/s,cords/s,3.624556,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic attometer per second,cubic attometers per second,am³/s,am^3/s,1E-54,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic centimeter per second,cubic centimeters per second,cm³/s,cm^3/s,0.000001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic decameter per second,cubic decameters per second,dam³/s,dam^3/s,1000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic decimeter per second,cubic decimeters per second,dm³/s,dm^3/s,0.001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic exameter per second,cubic exameters per second,Em³/s,Em^3/s,1E+054,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic femtometer per second,cubic femtometers per second,fm³/s,fm^3/s,1E-45,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic foot per minute,cubic feet per minute,ft³/min,ft^3/min,0.0004719475,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic foot per second,cubic feet per second,ft³/s,ft^3/s,0.02831685,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic gigameter per second,cubic gigameters per second,Gm³/s,Gm^3/s,1E+027,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic hectometer per second,cubic hectometers per second,hm³/s,hm^3/s,1000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic inch per minute,cubic inches per minute,in³/min,in^3/min,2.73117666666667E-07,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic inch per second,cubic inches per second,in³/s,in^3/s,0.00001638706,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic kilometer per second,cubic kilometers per second,km³/s,km^3/s,1000000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic megameter per second,cubic megameters per second,Mm³/s,Mm^3/s,1E+018,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic meter per hour,cubic meters per hour,m³/h,m^3/h,0.000277777777777778,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic meter per minute,cubic meters per minute,m³/min,m^3/min,0.0166666666666667,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic meter per second,cubic meters per second,m³/s,m^3/s,1,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic micrometer per second,cubic micrometers per second,µm³/s,um^3/s,1E-18,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic mile per second,cubic miles per second,mi³/s,mi^3/s,4168182000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic millimeter per second,cubic millimeters per second,mm³/s,mm^3/s,0.000000001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic nanometer per second,cubic nanometers per second,nm³/s,nm^3/s,1E-27,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic petameter per second,cubic petameters per second,Pm³/s,Pm^3/s,1E+045,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic picometer per second,cubic picometers per second,pm³/s,pm^3/s,1E-36,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic terameter per second,cubic terameters per second,Tm³/s,Tm^3/s,1E+036,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic yard per minute,cubic yards per minute,yd³/min,yd^3/min,0.0127425816666667,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic yard per second,cubic yards per second,yd³/s,yd^3/s,0.7645549,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic yoctometer per second,cubic yoctometers per second,ym³/s,ym^3/s,1E-72,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic yottameter per second,cubic yottameters per second,Ym³/s,Ym^3/s,1E+072,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic zeptometer per second,cubic zeptometers per second,zm³/s,zm^3/s,1E-63,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cubic zettameter per second,cubic zettameters per second,Zm³/s,Zm^3/s,1E+063,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,cup per second,cups per second,cup/s,cup/s,0.0002365882,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,decaliter per second,decaliters per second,daL/s,daL/s,0.01,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,deciliter per second,deciliters per second,dL/s,dL/s,0.0001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,exaliter per second,exaliters per second,EL/s,EL/s,1000000000000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,femtoliter per second,femtoliters per second,fL/s,fL/s,1E-18,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,Imperial fluid ounce per second,Imperial fluid ounces per second,fl oz (UK)/s,fl oz (UK)/s,0.00002841306,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,fluid ounce per second,fluid ounces per second,fl oz/s,fl_oz/s,0.00002957353,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,Imperial gallon per second,Imperial gallons per second,gal (UK)/s,gal (UK)/s,0.00454609,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,gallon per day,gallons per day,gal/d,gal/d,4.38126388888889E-08,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,gallon per minute,gallons per minute,gal/min,gal/min,0.0000630902,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,gallon per second,gallons per second,gal/s,gal/s,0.003785412,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,gigaliter per second,gigaliters per second,GL/s,GL/s,1000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,Imperial gill per second,Imperial gills per second,gi (UK)/s,gi (UK)/s,0.0001420653,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,gill per second,gills per second,gi/s,gi/s,0.0001182941,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,hectoliter per second,hectoliters per second,hL/s,hL/s,0.1,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,kiloliter per second,kiloliters per second,kL/s,kL/s,1,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,liter per minute,liters per minute,L/min,L/min,1.66666666666667E-05,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,liter per second,liters per second,L/s,L/s,0.001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,megaliter per second,megaliters per second,ML/s,ML/s,1000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,microliter per second,microliters per second,µL/s,uL/s,0.000000001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,milliliter per second,milliliters per second,mL/s,mL/s,0.000001,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,nanoliter per second,nanoliters per second,nL/s,nL/s,1E-12,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,peck per second,pecks per second,pk/s,pk/s,0.008809768,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,petaliter per second,petaliters per second,PL/s,PL/s,1000000000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,picoliter per second,picoliters per second,pL/s,pL/s,1E-15,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,dry pint per second,dry pints per second,dry pt/s,dry pt/s,0.0005506105,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,liquid pint per second,liquid pints per second,liq pt/s,liq pt/s,0.0004731765,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,dry quart per second,dry quarts per second,dry qt/s,dry qt/s,0.001101221,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,liquid quart per second,liquid quarts per second,liq qt/s,liq qt/s,0.0009463529,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,register ton per second,register tons per second,RT/s,RT/s,2.831685,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,stere per second,steres per second,st/s,st/s,1,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,tablespoon per second,tablespoons per second,tbsp/s,tbsp/s,0.00001478676,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,teaspoon per second,teaspoons per second,tsp/s,tsp/s,0.000004928922,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,teraliter per second,teraliters per second,TL/s,TL/s,1000000000,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,yoctoliter per second,yoctoliters per second,yL/s,yL/s,1E-27,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,yottaliter per second,yottaliters per second,YL/s,YL/s,1E+021,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,zeptoliter per second,zeptoliters per second,zL/s,zL/s,1E-24,0 -VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,zettaliter per second,zettaliters per second,ZL/s,ZL/s,1E+018,0 -VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,state per cubic centimeter electronvolt,states per cubic centimeter electronvolt,1/(cm³ · eV),1/(cm^3*eV),6.24150907446076E+024,0 -VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,state per cubic centimeter joule,states per cubic centimeter joule,1/(cm³ · J),1/(cm^3*J),1000000,0 -VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,state per cubic meter joule,states per cubic meter joule,1/(m³ · J),1/(m^3*J),1,0 -VolumetricHeatCapacity,-3,0,0,0,0,0,0,false,true,false,false,false,calorie per cubic meter kelvin,calories per cubic meter kelvin,cal/(m³ · K),cal/(m^3*K),4.184,0 -VolumetricHeatCapacity,-3,0,0,0,0,0,0,false,true,false,false,false,joule per cubic meter kelvin,joules per cubic meter kelvin,J/(m³ · K),J/(m^3*K),1,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per centiliter,per centiliter,cL⁻¹,cL^-1,100000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic centimeter,per cubic centimeter,cm⁻³,cm^-3,1000000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic decimeter,per cubic decimeter,dm⁻³,dm^-3,1000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic foot,per cubic foot,ft⁻³,ft^-3,35.3146624712848,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic inch,per cubic inch,in⁻³,in^-3,61023.7589903253,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic kilometer,per cubic kilometer,km⁻³,km^-3,0.000000001,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic meter,per cubic meter,m⁻³,m^-3,1,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic mile,per cubic mile,mi⁻³,mi^-3,2.39912748531614E-10,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic millimeter,per cubic millimeter,mm⁻³,mm^-3,1000000000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per cubic yard,per cubic yard,yd⁻³,yd^-3,1.30795054743616,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per deciliter,per deciliter,dL⁻¹,dL^-1,10000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per fluid ounce,per fluid ounce,per fl oz,per fl oz,33814.0222016107,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per Imperial fluid ounce,per Imperial fluid ounce,per fl oz (UK),per fl oz (UK),35195.0828245884,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per gallon,per gallon,per gal,per_gal,264.172037284185,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per Imperial gallon,per Imperial gallon,per gal (UK),per gal (UK),219.969248299088,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per liter,per liter,L⁻¹,L^-1,1000,0 -VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,per milliliter,per milliliter,mL⁻¹,mL^-1,1000000,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,becquerel per cubic meter,becquerels per cubic meter,Bq/m³,Bq/m^3,1,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,curie per cubic meter,curies per cubic meter,Ci/m³,Ci/m^3,37000000000,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,disintegration per minute per cubic meter,disintegrations per minute per cubic meter,dpm/m³,dpm/m^3,0.0166666666666667,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic centimeter second,per cubic centimeter second,cm⁻³ · s⁻¹,cm^-3*s^-1,1000000,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic foot second,per cubic foot second,ft⁻³ · s⁻¹,ft^-3*s^-1,35.3146624712848,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic inch second,per cubic inch second,in⁻³ · s⁻¹,in^-3*s^-1,61023.7589903253,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic meter second,per cubic meter second,m⁻³ · s⁻¹,m^-3*s^-1,1,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic mile second,per cubic mile second,mi⁻³ · s⁻¹,mi^-3*s^-1,2.39912748531614E-10,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic millimeter second,per cubic millimeter second,mm⁻³ · s⁻¹,mm^-3*s^-1,1000000000,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per cubic yard second,per cubic yard second,yd⁻³ · s⁻¹,yd^-3*s^-1,1.30795054743616,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per Imperial fluid ounce second,per Imperial fluid ounce second,fl oz⁻¹ (UK) · s⁻¹,fl oz^-1 (UK)*s^-1,35195.0828245884,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per fluid ounce second,per fluid ounce second,fl oz⁻¹ · s⁻¹,fl oz^-1*s^-1,33814.0222016107,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per Imperial gallon second,per Imperial gallon second,gal⁻¹ (UK) · s⁻¹,gal^-1 (UK)*s^-1,219.969248299088,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per gallon second,per gallon second,gal⁻¹ · s⁻¹,gal^-1*s^-1,264.172037284185,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per liter second,per liter second,L⁻¹ · s⁻¹,L^-1*s^-1,1000,0 -VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,per milliliter second,per milliliter second,mL⁻¹ · s⁻¹,mL^-1*s^-1,1000000,0 -VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,watt per cubic centimeter,watts per cubic centimeter,W/cm³,W/cm^3,1000000,0 -VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,watt per cubic meter,watts per cubic meter,W/m³,W/m^3,1,0 -VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,watt per cubic millimeter,watts per cubic millimeter,W/mm³,W/mm^3,1000000000,0 +dimension_name,length,mass,time,electric_current,thermodynamic_temperature,amount_of_substance,luminous_intensity,angle_kind,constituent_concentration_kind,information_kind,solid_angle_kind,temperature_kind,pixel_kind,singular,plural,abbreviation,keyboard_friendly_abbreviation,conversion_coefficient,conversion_constant +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,attometer second,attometer seconds,am · s,am*s,1E-18,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,centimeter second,centimeter seconds,cm · s,cm*s,0.01,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,decameter second,decameter seconds,dam · s,dam*s,10,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,decimeter second,decimeter seconds,dm · s,dm*s,0.1,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,exameter second,exameter seconds,Em · s,Em*s,1E+018,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,femtometer second,femtometer seconds,fm · s,fm*s,1E-15,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,foot second,foot seconds,ft · s,ft*s,0.3048,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,gigameter second,gigameter seconds,Gm · s,Gm*s,1000000000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,hectometer second,hectometer seconds,hm · s,hm*s,100,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,inch second,inch seconds,in · s,in*s,0.0254,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,kilometer hour,kilometer hours,km · h,km*h,3600000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,kilometer second,kilometer seconds,km · s,km*s,1000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,megameter second,megameter seconds,Mm · s,Mm*s,1000000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,meter second,meter seconds,m · s,m*s,1,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,micrometer second,micrometer seconds,µm · s,um*s,0.000001,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,millimeter second,millimeter seconds,mm · s,mm*s,0.001,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,nanometer second,nanometer seconds,nm · s,nm*s,0.000000001,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,petameter second,petameter seconds,Pm · s,Pm*s,1000000000000000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,picometer second,picometer seconds,pm · s,pm*s,1E-12,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,terameter second,terameter seconds,Tm · s,Tm*s,1000000000000,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,yoctometer second,yoctometer seconds,ym · s,ym*s,1E-24,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,yottameter second,yottameter seconds,Ym · s,Ym*s,1E+024,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,zeptometer second,zeptometer seconds,zm · s,zm*s,1E-21,0 +Absement,1,0,1,0,0,0,0,false,false,false,false,false,false,zettameter second,zettameter seconds,Zm · s,Zm*s,1E+021,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,attometer per second squared,attometers per second squared,am/s²,am/s^2,1E-18,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,centimeter per second squared,centimeters per second squared,cm/s²,cm/s^2,0.01,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,decameter per second squared,decameters per second squared,dam/s²,dam/s^2,10,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,decimeter per second squared,decimeters per second squared,dm/s²,dm/s^2,0.1,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,exameter per second squared,exameters per second squared,Em/s²,Em/s^2,1E+018,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,femtometer per second squared,femtometers per second squared,fm/s²,fm/s^2,1E-15,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,foot per second squared,feet per second squared,ft/s²,ft/s^2,0.3048,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,galileo,galileos,Gal,Gal,0.01,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,gigameter per second squared,gigameters per second squared,Gm/s²,Gm/s^2,1000000000,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,hectometer per second squared,hectometers per second squared,hm/s²,hm/s^2,100,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,inch per second squared,inches per second squared,in/s²,in/s^2,0.0254,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,kilometer per second squared,kilometers per second squared,km/s²,km/s^2,1000,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,megameter per second squared,megameters per second squared,Mm/s²,Mm/s^2,1000000,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,meter per second squared,meters per second squared,m/s²,m/s^2,1,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,micrometer per second squared,micrometers per second squared,µm/s²,um/s^2,0.000001,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,millimeter per minute squared,millimeters per minute squared,mm/min²,mm/min^2,2.77777777777778E-07,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,millimeter per second squared,millimeters per second squared,mm/s²,mm/s^2,0.001,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,nanometer per second squared,nanometers per second squared,nm/s²,nm/s^2,0.000000001,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,petameter per second squared,petameters per second squared,Pm/s²,Pm/s^2,1000000000000000,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,picometer per second squared,picometers per second squared,pm/s²,pm/s^2,1E-12,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,standard acceleration of gravity,standard accelerations of gravity,g₀,g\0,9.80665,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,terameter per second squared,terameters per second squared,Tm/s²,Tm/s^2,1000000000000,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,yoctometer per second squared,yoctometers per second squared,ym/s²,ym/s^2,1E-24,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,yottameter per second squared,yottameters per second squared,Ym/s²,Ym/s^2,1E+024,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,zeptometer per second squared,zeptometers per second squared,zm/s²,zm/s^2,1E-21,0 +Acceleration,1,0,2,0,0,0,0,false,false,false,false,false,false,zettameter per second squared,zettameters per second squared,Zm/s²,Zm/s^2,1E+021,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,atomic unit of action,atomic units of action,ħ,n<-,1.054571817E-34,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,electronvolt second,electronvolt seconds,eV · s,eV*s,1.602176634E-19,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,erg second,erg seconds,erg · s,erg*s,0.0000001,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,joule second,joule seconds,J · s,J*s,1,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,planck constant,planck constants,h,h (planck),6.62607015E-34,0 +Action,2,1,-1,0,0,0,0,false,false,false,false,false,false,reduced planck constant,reduced planck constants,ħ,n<- planc,1.054571817E-34,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,attomole,attomoles,amol,amol,1E-18,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,centimole,centimoles,cmol,cmol,0.01,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,decamole,decamoles,damol,damol,10,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,decimole,decimoles,dmol,dmol,0.1,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,examole,examoles,Emol,Emol,1E+018,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,femtomole,femtomoles,fmol,fmol,1E-15,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,gigamole,gigamoles,Gmol,Gmol,1000000000,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,hectomole,hectomoles,hmol,hmol,100,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,kilomole,kilomoles,kmol,kmol,1000,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,megamole,megamoles,Mmol,Mmol,1000000,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,micromole,micromoles,µmol,umol,0.000001,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,millimole,millimoles,mmol,mmol,0.001,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,mole,moles,mol,mol,1,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,nanomole,nanomoles,nmol,nmol,0.000000001,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,particle,particles,particle,particle,1.66053906717385E-24,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,petamole,petamoles,Pmol,Pmol,1000000000000000,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,picomole,picomoles,pmol,pmol,1E-12,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,standard cubic centimeter,standard cubic centimeters,cm³(STP),cm^3(STP),4.40316145139823E-05,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,standard cubic foot,standard cubic feet,scf,scf,1.24683662345026,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,standard cubic meter,standard cubic meters,m³(STP),m^3(STP),44.0316145139823,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,standard liter,standard liters,L(STP),L(STP),0.0440316145139823,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,teramole,teramoles,Tmol,Tmol,1000000000000,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,yoctomole,yoctomoles,ymol,ymol,1E-24,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,yottamole,yottamoles,Ymol,Ymol,1E+024,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,zeptomole,zeptomoles,zmol,zmol,1E-21,0 +AmountOfSubstance,0,0,0,0,0,1,0,false,false,false,false,false,false,zettamole,zettamoles,Zmol,Zmol,1E+021,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,degree,degrees,°,deg,0.0174532925199433,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,gon,gons,gon,gon,0.015707963267949,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,mil,mils,mil,mil,0.0009817477,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,minute,minutes,′,angle_minute,0.000290888208665722,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,radian,radians,rad,rad,1,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,revolution,revolutions,r,r,6.28318530717959,0 +Angle,0,0,0,0,0,0,0,true,false,false,false,false,false,second,seconds,″,angle_second,4.84813681109536E-06,0 +AngularAbsement,0,0,1,0,0,0,0,true,false,false,false,false,false,degree second,degree seconds,° · s,deg*s,0.0174532925199433,0 +AngularAbsement,0,0,1,0,0,0,0,true,false,false,false,false,false,radian second,radian seconds,rad · s,rad*s,1,0 +AngularAcceleration,0,0,-2,0,0,0,0,true,false,false,false,false,false,degree per second squared,degrees per second squared,°/s²,deg/s^2,0.0174532925199433,0 +AngularAcceleration,0,0,-2,0,0,0,0,true,false,false,false,false,false,radian per second squared,radians per second squared,rad/s²,rad/s^2,1,0 +AngularJerk,0,0,-3,0,0,0,0,true,false,false,false,false,false,degree per second cubed,degrees per second cubed,°/s³,deg/s^3,0.0174532925199433,0 +AngularJerk,0,0,-3,0,0,0,0,true,false,false,false,false,false,radian per second cubed,radians per second cubed,rad/s³,rad/s^3,1,0 +AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,false,degree per second,degrees per second,°/s,deg/s,0.0174532925199433,0 +AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,false,radian per second,radians per second,rad/s,rad/s,1,0 +AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,false,revolution per hour,revolutions per hour,rph,rph,0.00174532925199433,0 +AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,false,revolution per minute,revolutions per minute,rpm,rpm,0.10471975511966,0 +AngularVelocity,0,0,-1,0,0,0,0,true,false,false,false,false,false,revolution per second,revolutions per second,rps,rps,6.28318530717959,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,acre,acres,ac,ac,4046.873,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,are,ares,a,a,100,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,barn,barns,b,b,1E-28,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,circular mil,circular mils,cmil,cmil,5.067075E-10,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,hectare,hectares,ha,ha,10000,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square attometer,square attometers,am²,am^2,1E-36,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square centimeter,square centimeters,cm²,cm^2,0.0001,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square decameter,square decameters,dam²,dam^2,100,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square decimeter,square decimeters,dm²,dm^2,0.01,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square exameter,square exameters,Em²,Em^2,1E+036,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square femtometer,square femtometers,fm²,fm^2,1E-30,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square foot,square feet,ft²,ft^2,0.09290304,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square gigameter,square gigameters,Gm²,Gm^2,1E+018,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square hectometer,square hectometers,hm²,hm^2,10000,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square inch,square inches,in²,in^2,0.00064516,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square kilometer,square kilometers,km²,km^2,1000000,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square megameter,square megameters,Mm²,Mm^2,1000000000000,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square meter,square meters,m²,m^2,1,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square micrometer,square micrometers,µm²,um^2,1E-12,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square mile,square miles,mi²,mi^2,2589988,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square millimeter,square millimeters,mm²,mm^2,0.000001,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square nanometer,square nanometers,nm²,nm^2,1E-18,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square petameter,square petameters,Pm²,Pm^2,1E+030,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square picometer,square picometers,pm²,pm^2,1E-24,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square terameter,square terameters,Tm²,Tm^2,1E+024,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square yard,square yards,yd²,yd^2,0.8361274,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square yoctometer,square yoctometers,ym²,ym^2,1E-48,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square yottameter,square yottameters,Ym²,Ym^2,1E+048,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square zeptometer,square zeptometers,zm²,zm^2,1E-42,0 +Area,2,0,0,0,0,0,0,false,false,false,false,false,false,square zettameter,square zettameters,Zm²,Zm^2,1E+042,0 +ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,false,state per square centimeter electronvolt,states per square centimeter electronvolt,1/(cm² · eV),1/(cm^2*eV),6.24150907446076E+022,0 +ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,false,state per square centimeter joule,states per square centimeter joule,1/(cm² · J),1/(cm^2*J),10000,0 +ArealDensityOfStates,-4,-1,2,0,0,0,0,false,true,false,false,false,false,state per square meter joule,states per square meter joule,1/(m² · J),1/(m^2*J),1,0 +ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,false,gram per square centimeter,grams per square centimeter,g/cm²,g/cm^2,10,0 +ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,false,gram per square meter,grams per square meter,g/m²,g/m^2,0.001,0 +ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,false,kilogram per square meter,kilograms per square meter,kg/m²,kg/m^2,1,0 +ArealMassDensity,-2,1,0,0,-1,0,0,false,false,false,false,false,false,ounce per square foot,ounces per square foot,oz/ft²,oz/ft^2,0.305151693636721,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per acre,per acre,ac⁻²,Ac^-2,0.000247104369225325,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per are,per are,a⁻²,A^-2,0.01,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per barn,per barn,b⁻²,b^-2,1E+028,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per circular mil,per circular mil,cmil⁻²,cmil^-2,1973525159.97888,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per hectare,per hectare,ha⁻²,ha^-2,0.0001,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square centimeter,per square centimeter,cm⁻²,cm^-2,10000,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square decimeter,per square decimeter,dm⁻²,dm^-2,100,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square foot,per square foot,ft⁻²,ft^-2,10.7639104167097,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square inch,per square inch,in⁻²,in^-2,1550.0031000062,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square kilometer,per square kilometer,km⁻²,km^-2,0.000001,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square meter,per square meter,m⁻²,m^-2,1,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square micrometer,per square micrometer,µm⁻²,um^-2,1000000000000,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square mile,per square mile,mi⁻²,mi^-2,3.86102174990772E-07,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square millimeter,per square millimeter,mm⁻²,mm^-2,1000000,0 +ArealNumberDensity,-2,0,0,0,0,0,0,false,true,false,false,false,false,per square yard,per square yard,yd⁻²,yd^-2,1.1959899890854,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per acre second,per acre second,ac⁻¹ · s⁻¹,ac^-1*s^-1,0.000247104369225325,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per are second,per are second,a⁻¹ · s⁻¹,a^-1*s^-1,0.01,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per barn second,per barn second,b⁻¹ · s⁻¹,b^-1*s^-1,1E+028,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per circular mil second,per circular mil second,cmil⁻¹ · s⁻¹,cmil^-1*s^-1,1973525159.97888,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per hectare second,per hectare second,ha⁻¹ · s⁻¹,ha^-1*s^-1,0.0001,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square centimeter second,per square centimeter second,cm⁻² · s⁻¹,cm^-2*s^-1,10000,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square foot second,per square foot second,ft⁻² · s⁻¹,ft^-2*s^-1,10.7639104167097,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square inch second,per square inch second,in⁻² · s⁻¹,in^-2*s^-1,1550.0031000062,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square meter second,per square meter second,m⁻² · s⁻¹,m^-2*s^-1,1,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square mile second,per square mile second,mi⁻² · s⁻¹,mi^-2*s^-1,3.86102174990772E-07,0 +ArealNumberRate,-2,0,1,0,0,0,0,false,true,false,false,false,false,per square yard second,per square yard second,yd⁻² · s⁻¹,yd^-2*s^-1,1.1959899890854,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,attojoule per kilogram,attojoules per kilogram,aJ/kg,aJ/kg,1E-18,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit (IT) per pound,British thermal units (IT) per pound,Btu (IT)/lb,Btu (IT)/lb,2326.0001710787,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit per pound,British thermal units per pound,Btu/lb,Btu/lb,2324.44370761062,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,calorie (IT) per gram,calories (IT) per gram,cal (IT)/lb,Cal (IT)/lb,4186.8,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,calorie per gram,calories per gram,cal/lb,cal/lb,4184,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,centijoule per kilogram,centijoules per kilogram,cJ/kg,cJ/kg,0.01,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,decajoule per kilogram,decajoules per kilogram,daJ/kg,daJ/kg,10,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,decijoule per kilogram,decijoules per kilogram,dJ/kg,dJ/kg,0.1,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,exajoule per kilogram,exajoules per kilogram,EJ/kg,EJ/kg,1E+018,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,femtojoule per kilogram,femtojoules per kilogram,fJ/kg,fJ/kg,1E-15,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,gigajoule per kilogram,gigajoules per kilogram,GJ/kg,GJ/kg,1000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,hectojoule per kilogram,hectojoules per kilogram,hJ/kg,hJ/kg,100,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per attogram,joules per attogram,J/ag,J/ag,1E+021,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per exagram,joules per exagram,J/Eg,J/Eg,1E-15,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per femtogram,joules per femtogram,J/fg,J/fg,1E+018,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per gigagram,joules per gigagram,J/Gg,J/Gg,0.000001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per gram,joules per gram,J/g,J/g,1000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per kilogram,joules per kilogram,J/kg,J/kg,1,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per megagram,joules per megagram,J/Mg,J/Mg,0.001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per microgram,joules per microgram,J/µg,J/ug,1000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per milligram,joules per milligram,J/mg,J/mg,1000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per nanogram,joules per nanogram,J/ng,J/ng,1000000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per petagram,joules per petagram,J/Pg,J/Pg,1E-12,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per picogram,joules per picogram,J/pg,J/pg,1000000000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per teragram,joules per teragram,J/Tg,J/Tg,0.000000001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per yottagram,joules per yottagram,J/Yg,J/Yg,1E-21,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per zeptogram,joules per zeptogram,J/zg,J/zg,1E+024,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,joule per zettagram,joules per zettagram,J/Zg,J/Zg,1E-18,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,kilojoule per kilogram,kilojoules per kilogram,kJ/kg,kJ/kg,1000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,megajoule per kilogram,megajoules per kilogram,MJ/kg,MJ/kg,1000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,microjoule per kilogram,microjoules per kilogram,µJ/kg,uJ/kg,0.000001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,millijoule per kilogram,millijoules per kilogram,mJ/kg,mJ/kg,0.001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,nanojoule per kilogram,nanojoules per kilogram,nJ/kg,nJ/kg,0.000000001,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,petajoule per kilogram,petajoules per kilogram,PJ/kg,PJ/kg,1000000000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,picojoule per kilogram,picojoules per kilogram,pJ/kg,pJ/kg,1E-12,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,terajoule per kilogram,terajoules per kilogram,TJ/kg,TJ/kg,1000000000000,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,yoctojoule per kilogram,yoctojoules per kilogram,yJ/kg,yJ/kg,1E-24,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,yottajoule per kilogram,yottajoules per kilogram,YJ/kg,YJ/kg,1E+024,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,zeptojoule per kilogram,zeptojoules per kilogram,zJ/kg,zJ/kg,1E-21,0 +AvailableEnergy,2,0,-2,0,0,0,0,false,false,false,false,false,false,zettajoule per kilogram,zettajoules per kilogram,ZJ/kg,ZJ/kg,1E+021,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,abfarad,abfarads,abF,abF,1000000000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,attofarad,attofarads,aF,aF,1E-18,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,centifarad,centifarads,cF,cF,0.01,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,decafarad,decafarads,daF,daF,10,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,decifarad,decifarads,dF,dF,0.1,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,exafarad,exafarads,EF,EF,1E+018,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,farad,farads,F,F,1,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,femtofarad,femtofarads,fF,fF,1E-15,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,gigafarad,gigafarads,GF,GF,1000000000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,hectofarad,hectofarads,hF,hF,100,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,kilofarad,kilofarads,kF,kF,1000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,megafarad,megafarads,MF,MF,1000000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,microfarad,microfarads,µF,uF,0.000001,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,millifarad,millifarads,mF,mF,0.001,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,nanofarad,nanofarads,nF,nF,0.000000001,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,petafarad,petafarads,PF,PF,1000000000000000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,picofarad,picofarads,pF,pF,1E-12,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,statfarad,statfarads,statF,statF,1.11265E-12,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,terafarad,terafarads,TF,TF,1000000000000,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,yoctofarad,yoctofarads,yF,yF,1E-24,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,yottafarad,yottafarads,YF,YF,1E+024,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,zeptofarad,zeptofarads,zF,zF,1E-21,0 +Capacitance,-2,-1,4,2,0,0,0,false,false,false,false,false,false,zettafarad,zettafarads,ZF,ZF,1E+021,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,atto enzyme unit,atto enzyme units,aU,aU,1.66666666666667E-26,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,attokatal,attokatals,akat,akat,1E-18,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,centi enzyme unit,centi enzyme units,cU,cU,1.66666666666667E-10,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,centikatal,centikatals,ckat,ckat,0.01,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,deca enzyme unit,deca enzyme units,daU,daU,1.66666666666667E-07,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,decakatal,decakatals,dakat,dakat,10,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,deci enzyme unit,deci enzyme units,dU,dU,1.66666666666667E-09,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,decikatal,decikatals,dkat,dkat,0.1,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,enzyme unit,enzyme units,U,U,1.66666666666667E-08,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,exa enzyme unit,exa enzyme units,EU,EU,16666666666.6667,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,exakatal,exakatals,Ekat,Ekat,1E+018,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,femto enzyme unit,femto enzyme units,fU,fU,1.66666666666667E-23,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,femtokatal,femtokatals,fkat,fkat,1E-15,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,giga enzyme unit,giga enzyme units,GU,GU,16.6666666666667,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,gigakatal,gigakatals,Gkat,Gkat,1000000000,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,hecto enzyme unit,hecto enzyme units,hU,hU,1.66666666666667E-06,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,hectokatal,hectokatals,hkat,hkat,100,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,katal,katals,kat,kat,1,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,kilo enzyme unit,kilo enzyme units,kU,kU,1.66666666666667E-05,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,kilokatal,kilokatals,kkat,kkat,1000,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,mega enzyme unit,mega enzyme units,MU,MU,0.0166666666666667,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,megakatal,megakatals,Mkat,Mkat,1000000,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,micro enzyme unit,micro enzyme units,μU,uU,1.66666666666667E-14,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,microkatal,microkatals,µkat,ukat,0.000001,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,milli enzyme unit,milli enzyme units,mU,mU,1.66666666666667E-11,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,millikatal,millikatals,mkat,mkat,0.001,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,mole per second,moles per second,mol/s,mol/s,1,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,nano enzyme unit,nano enzyme units,nU,nU,1.66666666666667E-17,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,nanokatal,nanokatals,nkat,nkat,0.000000001,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,particle per second,particles per second,particle/s,particle/s,1.66053906717385E-24,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,peta enzyme unit,peta enzyme units,PU,PU,16666666.6666667,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,petakatal,petakatals,Pkat,Pkat,1000000000000000,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,pico enzyme unit,pico enzyme units,pU,pU,1.66666666666667E-20,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,picokatal,picokatals,pkat,pkat,1E-12,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,standard centimeter per minute,standard centimeters per minute,sccm,sccm,7.33860241899706E-07,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,standard cubic foot per hour,standard cubic feet per hour,scfm,scfm,0.0207806103908377,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,standard cubic meter per minute,standard cubic meters per minute,m³(STP)/min,m^3(STP)/min,0.733860241899705,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,standard liter per minute,standard liters per minute,slm,slm,0.000733860241899706,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,tera enzyme unit,tera enzyme units,TU,TU,16666.6666666667,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,terakatal,terakatals,Tkat,Tkat,1000000000000,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,yocto enzyme unit,yocto enzyme units,yU,yU,1.66666666666667E-32,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,yoctokatal,yoctokatals,ykat,ykat,1E-24,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,yotta enzyme unit,yotta enzyme units,YU,YU,1.66666666666667E+016,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,yottakatal,yottakatals,Ykat,Ykat,1E+024,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,zepto enzyme unit,zepto enzyme units,zU,zU,1.66666666666667E-29,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,zeptokatal,zeptokatals,zkat,zkat,1E-21,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,zetta enzyme unit,zetta enzyme units,ZU,ZU,16666666666666.7,0 +CatalyticActivity,0,0,-1,0,0,1,0,false,false,false,false,false,false,zettakatal,zettakatals,Zkat,Zkat,1E+021,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,atto enzyme unit per cubic meter,atto enzyme units per cubic meter,aU/m³,aU/m^3,1.66666666666667E-26,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,attokatal per cubic meter,attokatals per cubic meter,akat/m³,akat/m^3,1E-18,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,centi enzyme unit per cubic meter,centi enzyme units per cubic meter,cU/m³,cU/m^3,1.66666666666667E-10,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,centikatal per cubic meter,centikatals per cubic meter,ckat/m³,ckat/m^3,0.01,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,deca enzyme unit per cubic meter,deca enzyme units per cubic meter,daU/m³,daU/m^3,1.66666666666667E-07,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,decakatal per cubic meter,decakatals per cubic meter,dakat/m³,dakat/m^3,10,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,deci enzyme unit per cubic meter,deci enzyme units per cubic meter,dU/m³,dU/m^3,1.66666666666667E-09,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,decikatal per cubic meter,decikatals per cubic meter,dkat/m³,dkat/m^3,0.1,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,enzyme unit per cubic decimeter,enzyme units per cubic decimeter,U/dm³,U/dm^3,1.66666666666667E-05,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,enzyme unit per cubic meter,enzyme units per cubic meter,U/m³,U/m^3,1.66666666666667E-08,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,enzyme unit per deciliter,enzyme units per deciliter,U/dL,U/dL,0.000166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,enzyme unit per liter,enzyme units per liter,U/L,U/L,1.66666666666667E-05,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,enzyme unit per milliliter,enzyme units per milliliter,U/mL,U/mL,0.0166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,exa enzyme unit per cubic meter,exa enzyme units per cubic meter,EU/m³,EU/m^3,16666666666.6667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,exakatal per cubic meter,exakatals per cubic meter,Ekat/m³,Ekat/m^3,1E+018,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femto enzyme unit per cubic decimeter,femto enzyme units per cubic decimeter,fU/dm³,fU/dm^3,1.66666666666667E-20,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femto enzyme unit per cubic meter,femto enzyme units per cubic meter,fU/m³,fU/m^3,1.66666666666667E-23,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femto enzyme unit per deciliter,femto enzyme units per deciliter,fU/dL,fU/dL,1.66666666666667E-19,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femto enzyme unit per liter,femto enzyme units per liter,fU/L,fU/L,1.66666666666667E-20,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femto enzyme unit per milliliter,femto enzyme units per milliliter,fU/mL,fU/mL,1.66666666666667E-17,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femtokatal per cubic decimeter,femtokatals per cubic decimeter,fkat/dm³,fkat/dm^3,1E-12,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femtokatal per cubic meter,femtokatals per cubic meter,fkat/m³,fkat/m^3,1E-15,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femtokatal per deciliter,femtokatals per deciliter,fkat/dL,fkat/dL,1E-11,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femtokatal per liter,femtokatals per liter,fkat/L,fkat/L,1E-12,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,femtokatal per milliliter,femtokatals per milliliter,fkat/mL,fkat/mL,0.000000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,giga enzyme unit per cubic meter,giga enzyme units per cubic meter,GU/m³,GU/m^3,16.6666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,gigakatal per cubic meter,gigakatals per cubic meter,Gkat/m³,Gkat/m^3,1000000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,hecto enzyme unit per cubic meter,hecto enzyme units per cubic meter,hU/m³,hU/m^3,1.66666666666667E-06,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,hectokatal per cubic meter,hectokatals per cubic meter,hkat/m³,hkat/m^3,100,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,katal per cubic decimeter,katals per cubic decimeter,kat/dm³,kat/dm^3,1000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,katal per cubic meter,katals per cubic meter,kat/m³,kat/m^3,1,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,katal per deciliter,katals per deciliter,kat/dL,kat/dL,10000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,katal per liter,katals per liter,kat/L,kat/L,1000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,katal per milliliter,katals per milliliter,kat/mL,kat/mL,1000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilo enzyme unit per cubic decimeter,kilo enzyme units per cubic decimeter,kU/dm³,kU/dm^3,0.0166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilo enzyme unit per cubic meter,kilo enzyme units per cubic meter,kU/m³,kU/m^3,1.66666666666667E-05,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilo enzyme unit per deciliter,kilo enzyme units per deciliter,kU/dL,kU/dL,0.166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilo enzyme unit per liter,kilo enzyme units per liter,kU/L,kU/L,0.0166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilo enzyme unit per milliliter,kilo enzyme units per milliliter,kU/mL,kU/mL,16.6666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilokatal per cubic decimeter,kilokatals per cubic decimeter,kkat/dm³,kkat/dm^3,1000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilokatal per cubic meter,kilokatals per cubic meter,kkat/m³,kkat/m^3,1000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilokatal per deciliter,kilokatals per deciliter,kkat/dL,kkat/dL,10000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilokatal per liter,kilokatals per liter,kkat/L,kkat/L,1000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,kilokatal per milliliter,kilokatals per milliliter,kkat/mL,kkat/mL,1000000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,mega enzyme unit per cubic meter,mega enzyme units per cubic meter,MU/m³,MU/m^3,0.0166666666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,megakatal per cubic meter,megakatals per cubic meter,Mkat/m³,Mkat/m^3,1000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,micro enzyme unit per cubic decimeter,micro enzyme units per cubic decimeter,μU/dm³,uU/dm^3,1.66666666666667E-11,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,micro enzyme unit per cubic meter,micro enzyme units per cubic meter,µU/m³,uU/m^3,1.66666666666667E-14,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,micro enzyme unit per deciliter,micro enzyme units per deciliter,μU/dL,uU/dL,1.66666666666667E-10,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,micro enzyme unit per liter,micro enzyme units per liter,μU/L,uU/L,1.66666666666667E-11,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,micro enzyme unit per milliliter,micro enzyme units per milliliter,μU/mL,uU/mL,1.66666666666667E-08,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,microkatal per cubic decimeter,microkatals per cubic decimeter,μkat/dm³,ukat/dm^3,0.001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,microkatal per cubic meter,microkatals per cubic meter,µkat/m³,ukat/m^3,0.000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,microkatal per deciliter,microkatals per deciliter,μkat/dL,ukat/dL,0.01,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,microkatal per liter,microkatals per liter,μkat/L,ukat/L,0.001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,microkatal per milliliter,microkatals per milliliter,μkat/mL,ukat/mL,1,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,milli enzyme unit per cubic decimeter,milli enzyme units per cubic decimeter,mU/dm³,mU/dm^3,1.66666666666667E-08,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,milli enzyme unit per cubic meter,milli enzyme units per cubic meter,mU/m³,mU/m^3,1.66666666666667E-11,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,milli enzyme unit per deciliter,milli enzyme units per deciliter,mU/dL,mU/dL,1.66666666666667E-07,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,milli enzyme unit per liter,milli enzyme units per liter,mU/L,mU/L,1.66666666666667E-08,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,milli enzyme unit per milliliter,milli enzyme units per milliliter,mU/mL,mU/mL,1.66666666666667E-05,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,millikatal per cubic decimeter,millikatals per cubic decimeter,mkat/dm³,mkat/dm^3,1,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,millikatal per cubic meter,millikatals per cubic meter,mkat/m³,mkat/m^3,0.001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,millikatal per deciliter,millikatals per deciliter,mkat/dL,mkat/dL,10,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,millikatal per liter,millikatals per liter,mkat/L,mkat/L,1,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,millikatal per milliliter,millikatals per milliliter,mkat/mL,mkat/mL,1000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nano enzyme unit per cubic decimeter,nano enzyme units per cubic decimeter,nU/dm³,nU/dm^3,1.66666666666667E-14,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nano enzyme unit per cubic meter,nano enzyme units per cubic meter,nU/m³,nU/m^3,1.66666666666667E-17,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nano enzyme unit per deciliter,nano enzyme units per deciliter,nU/dL,nU/dL,1.66666666666667E-13,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nano enzyme unit per liter,nano enzyme units per liter,nU/L,nU/L,1.66666666666667E-14,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nano enzyme unit per milliliter,nano enzyme units per milliliter,nU/mL,nU/mL,1.66666666666667E-11,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nanokatal per cubic decimeter,nanokatals per cubic decimeter,nkat/dm³,nkat/dm^3,0.000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nanokatal per cubic meter,nanokatals per cubic meter,nkat/m³,nkat/m^3,0.000000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nanokatal per deciliter,nanokatals per deciliter,nkat/dL,nkat/dL,0.00001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nanokatal per liter,nanokatals per liter,nkat/L,nkat/L,0.000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,nanokatal per milliliter,nanokatals per milliliter,nkat/mL,nkat/mL,0.001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,particle per second cubic meter,particles per second cubic meter,particle · s⁻¹ · m⁻³,particle*s^-1*m^-3,1.66053906717385E-24,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,peta enzyme unit per cubic meter,peta enzyme units per cubic meter,PU/m³,PU/m^3,16666666.6666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,petakatal per cubic meter,petakatals per cubic meter,Pkat/m³,Pkat/m^3,1000000000000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,pico enzyme unit per cubic decimeter,pico enzyme units per cubic decimeter,pU/dm³,pU/dm^3,1.66666666666667E-17,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,pico enzyme unit per cubic meter,pico enzyme units per cubic meter,pU/m³,pU/m^3,1.66666666666667E-20,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,pico enzyme unit per deciliter,pico enzyme units per deciliter,pU/dL,pU/dL,1.66666666666667E-16,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,pico enzyme unit per liter,pico enzyme units per liter,pU/L,pU/L,1.66666666666667E-17,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,pico enzyme unit per milliliter,pico enzyme units per milliliter,pU/mL,pU/mL,1.66666666666667E-14,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,picokatal per cubic decimeter,picokatals per cubic decimeter,pkat/dm³,pkat/dm^3,0.000000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,picokatal per cubic meter,picokatals per cubic meter,pkat/m³,pkat/m^3,1E-12,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,picokatal per deciliter,picokatals per deciliter,pkat/dL,pkat/dL,0.00000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,picokatal per liter,picokatals per liter,pkat/L,pkat/L,0.000000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,picokatal per milliliter,picokatals per milliliter,pkat/mL,pkat/mL,0.000001,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,tera enzyme unit per cubic meter,tera enzyme units per cubic meter,TU/m³,TU/m^3,16666.6666666667,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,terakatal per cubic meter,terakatals per cubic meter,Tkat/m³,Tkat/m^3,1000000000000,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,yocto enzyme unit per cubic meter,yocto enzyme units per cubic meter,yU/m³,yU/m^3,1.66666666666667E-32,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,yoctokatal per cubic meter,yoctokatals per cubic meter,ykat/m³,ykat/m^3,1E-24,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,yotta enzyme unit per cubic meter,yotta enzyme units per cubic meter,YU/m³,YU/m^3,1.66666666666667E+016,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,yottakatal per cubic meter,yottakatals per cubic meter,Ykat/m³,Ykat/m^3,1E+024,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,zepto enzyme unit per cubic meter,zepto enzyme units per cubic meter,zU/m³,zU/m^3,1.66666666666667E-29,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,zeptokatal per cubic meter,zeptokatals per cubic meter,zkat/m³,zkat/m^3,1E-21,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,zetta enzyme unit per cubic meter,zetta enzyme units per cubic meter,ZU/m³,ZU/m^3,16666666666666.7,0 +CatalyticActivityConcentration,-3,0,-1,0,0,1,0,false,true,false,false,false,false,zettakatal per cubic meter,zettakatals per cubic meter,Zkat/m³,Zkat/m^3,1E+021,0 +Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,false,degree per meter,degrees per meter,°/m,deg/m,0.0174532925199433,0 +Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,false,degree per millimeter,degrees per millimeter,°/mm,deg/mm,17.4532925199433,0 +Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,false,radian per meter,radians per meter,rad/m,rad/m,1,0 +Curvature,-1,0,0,0,0,0,0,true,false,false,false,false,false,radian per millimeter,radians per millimeter,rad/mm,rad/mm,1000,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,centistokes,centistokes,cSt,cSt,0.000001,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,square centimeter per second,square centimeters per second,cm²/s,cm^2/s,0.0001,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,square meter per second,square meters per second,m²/s,m^2/s,1,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,square micrometer per second,square micrometers per second,µm²/s,um^2/s,1E-12,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,square millimeter per second,square millimeters per second,mm²/s,mm^2/s,0.000001,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,square nanometer per second,square nanometers per second,nm²/s,nm^2/s,1E-18,0 +DiffusionCoefficient,2,0,-1,0,0,0,0,false,false,false,false,false,false,Stokes,Stokes,St,St,0.0001,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,centipoise,centipoises,cP,cP,0.001,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,gram per centimeter second,grams per centimeter second,g/(cm · s),g/(cm*s),0.1,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,micropascal second,micropascal seconds,µPa · s,uPa*s,0.000001,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,millipascal second,millipascal seconds,mPa · s,mPa*s,0.001,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,pascal second,pascal seconds,Pa · s,Pa*s,1,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,poise,poises,P,P,0.1,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,pound-force second per square foot,pound-force seconds per square foot,lbf · s/ft²,lbf*s/ft^2,47.8802631216374,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,pound-force second per square inch,pound-force seconds per square inch,lbf · s/in²,lbf*s/in^2,6894.75788951578,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,pound per foot hour,pounds per foot hour,lb/(ft · h),lb/(ft*h),0.000413378900554097,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,pound per foot second,pounds per foot second,lb/(ft · s),lb/(ft*s),1.48816404199475,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,reyn,reyns,reyn,reyn,6894.75788951578,0 +DynamicViscosity,-1,1,-1,0,0,0,0,false,false,false,false,false,false,slug per foot second,slugs per foot second,slug/(ft · s),slug/(ft*s),47.880249343832,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,abcoulomb,abcoulombs,abC,abC,10,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,ampere hour,ampere hours,A · h,A*h,3600,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,atomic unit of charge,atomic units of charge,a.u. of charge,a.u. of charge,1.602176634E-19,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,attocoulomb,attocoulombs,aC,aC,1E-18,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,centicoulomb,centicoulombs,cC,cC,0.01,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,coulomb,coulombs,C,C,1,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,decaampere hour,decaampere hours,daA · h,daA*h,36000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,decacoulomb,decacoulombs,daC,daC,10,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,decicoulomb,decicoulombs,dC,dC,0.1,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,elementary charge,elementary charges,e,e,1.602176634E-19,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,exacoulomb,exacoulombs,EC,EC,1E+018,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,faraday,faradays,F,Faraday,96485.31,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,femtocoulomb,femtocoulombs,fC,fC,1E-15,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,franklin,franklins,Fr,Fr,3.335641E-10,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,gigaampere hour,gigaampere hours,GA · h,GA*h,3600000000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,gigacoulomb,gigacoulombs,GC,GC,1000000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,hectoampere hour,hectoampere hours,hA · h,hA*h,360000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,hectocoulomb,hectocoulombs,hC,hC,100,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,kiloampere hour,kiloampere hours,kA · h,kA*h,3600000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,kilocoulomb,kilocoulombs,kC,kC,1000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,megaampere hour,megaampere hours,MA · h,MA*h,3600000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,megacoulomb,megacoulombs,MC,MC,1000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,microampere hour,microampere hours,µA · h,uA*h,0.0036,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,microcoulomb,microcoulombs,µC,uC,0.000001,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,milliampere hour,milliampere hours,mA · h,mA*h,3.6,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,millcoulomb,millcoulombs,mC,mC,0.001,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,nanocoulomb,nanocoulombs,nC,nC,0.000000001,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,petaampere hour,petaampere hours,PA · h,PA*h,3.6E+018,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,petacoulomb,petacoulombs,PC,PC,1000000000000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,picocoulomb,picocoulombs,pC,pC,1E-12,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,statcoulomb,statcoulombs,statC,statC,3.335641E-10,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,teraampere hour,teraampere hours,TA · h,TA*h,3600000000000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,teracoulomb,teracoulombs,TC,TC,1000000000000,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,yoctocoulomb,yoctocoulombs,yC,yC,1E-24,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,yottacoulomb,yottacoulombs,YC,YC,1E+024,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,zeptocoulomb,zeptocoulombs,zC,zC,1E-21,0 +ElectricCharge,0,0,1,1,0,0,0,false,false,false,false,false,false,zettacoulomb,zettacoulombs,ZC,ZC,1E+021,0 +ElectricChargeArealDensity,-2,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per square centimeter,coulombs per square centimeter,C/cm²,C/cm^2,10000,0 +ElectricChargeArealDensity,-2,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per square meter,coulombs per square meter,C/m²,C/m^2,1,0 +ElectricChargeLinearDensity,-1,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per centimeter,coulombs per centimeter,C/cm,C/cm,100,0 +ElectricChargeLinearDensity,-1,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per meter,coulombs per meter,C/m,C/m,1,0 +ElectricChargeVolumetricDensity,-3,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per cubic centimeter,coulombs per cubic centimeter,C/cm³,C/cm^3,1000000,0 +ElectricChargeVolumetricDensity,-3,0,1,1,0,0,0,false,true,false,false,false,false,coulomb per cubic meter,coulombs per cubic meter,C/m³,C/m^3,1,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,abampere,abamperes,abA,abA,10,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,ampere,amperes,A,A,1,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,atomic unit of charge per second,atomic units of charge per second,a.u. of charge/s,a.u. of charge/s,1.602176634E-19,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,attoampere,attoamperes,aA,aA,1E-18,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,centiampere,centiamperes,cA,cA,0.01,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,decaampere,decaamperes,daA,daA,10,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,deciampere,deciamperes,dA,dA,0.1,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,elementary charge per second,elementary charges per second,e/s,e/s,1.602176634E-19,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,exaampere,exaamperes,EA,EA,1E+018,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,femtoampere,femtoamperes,fA,fA,1E-15,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,gigaampere,gigaamperes,GA,GA,1000000000,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,gilbert,gilberts,Gi,Gi,0.7957747,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,hectoampere,hectoamperes,hA,hA,100,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,kiloampere,kiloamperes,kA,kA,1000,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,megaampere,megaamperes,MA,MA,1000000,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,microampere,microamperes,µA,uA,0.000001,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,millampere,millamperes,mA,mA,0.001,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,nanoampere,nanoamperes,nA,nA,0.000000001,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,petaampere,petaamperes,PA,PA,1000000000000000,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,picoampere,picoamperes,pA,pA,1E-12,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,statampere,statamperes,statA,statA,3.335641E-10,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,teraampere,teraamperes,TA,TA,1000000000000,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,yoctoampere,yoctoamperes,yA,yA,1E-24,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,yottaampere,yottaamperes,YA,YA,1E+024,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,zeptoampere,zeptoamperes,zA,zA,1E-21,0 +ElectricCurrent,0,0,0,1,0,0,0,false,false,false,false,false,false,zettaampere,zettaamperes,ZA,ZA,1E+021,0 +ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,false,ampere per square centimeter,amperes per square centimeter,A/cm²,A/cm^2,10000,0 +ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,false,ampere per square meter,amperes per square meter,A/m²,A/m^2,1,0 +ElectricCurrentDensity,-2,0,0,1,0,0,0,false,false,false,false,false,false,ampere per square millimeter,amperes per square millimeter,A/mm²,A/mm^2,1000000,0 +ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,false,atomic unit of charge centimeter,atomic unit of charge centimeters,a.u. of charge · cm,a.u. of charge*cm,1.602176634E-21,0 +ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,false,atomic unit of electric dipole moment,atomic units of electric dipole moment,e · a₀,e*a\0,8.47835362554077E-30,0 +ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,false,coulomb meter,coulomb meters,C · m,C*m,1,0 +ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,false,debye,debyes,D,D,3.33564095198152E-30,0 +ElectricDipoleMoment,1,0,1,1,0,0,0,false,false,false,false,false,false,elementary charge centimeter,elementary charge centimeters,e · cm,e*cm,1.602176634E-21,0 +ElectricDisplacementField,-2,0,1,1,0,0,0,false,false,false,false,false,false,coulomb per square centimeter,coulombs per square centimeter,C/cm²,C/cm^2 (displacement),10000,0 +ElectricDisplacementField,-2,0,1,1,0,0,0,false,false,false,false,false,false,coulomb per square meter,coulombs per square meter,C/m²,C/m^2 (displacement),1,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,atomic unit of electric field,atomic units of electric field,a.u. of electric field,a.u. of electric field,514220674763.26,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,kilovolt per millimeter,kilovolts per millimeter,kV/mm,kV/mm,1000000,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,megavolt per centimeter,megavolts per centimeter,MV/cm,MV/cm,100000000,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,megavolt per meter,megavolts per meter,MV/m,MV/m,1000000,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,volt per centimeter,volts per centimeter,V/cm,V/cm,100,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,volt per meter,volts per meter,V/m,V/m,1,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,volt per micrometer,volts per micrometer,V/μm,V/um,1000000,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,volt per mil,volts per mil,V/mil,V/mil,39370.0787401575,0 +ElectricField,1,1,-3,-1,0,0,0,false,false,false,false,false,false,volt per millimeter,volts per millimeter,V/mm,V/mm,1000,0 +ElectricFlux,3,1,-3,-1,0,0,0,false,false,false,false,false,false,volt centimeter,volt centimeters,V ⋅ cm,V*cm,0.01,0 +ElectricFlux,3,1,-3,-1,0,0,0,false,false,false,false,false,false,volt meter,volt meters,V ⋅ m,V*m,1,0 +ElectricPermittivity,-3,-1,4,2,0,0,0,false,false,false,false,false,false,farad per meter,farads per meter,F/m,F/m,1,0 +ElectricPermittivity,-3,-1,4,2,0,0,0,false,false,false,false,false,false,vacuum electric permittivity,vacuum electric permittivity,ε₀,epsilon\0,8.8541878128E-12,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,abvolt,abvolts,abV,abV,0.00000001,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,attovolt,attovolts,aV,aV,1E-18,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,centivolt,centivolts,cV,cV,0.01,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,decavolt,decavolts,daV,daV,10,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,decivolt,decivolts,dV,dV,0.1,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,exavolt,exavolts,EV,EV,1E+018,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,femtovolt,femtovolts,fV,fV,1E-15,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,gigavolt,gigavolts,GV,GV,1000000000,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,hectovolt,hectovolts,hV,hV,100,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,kilovolt,kilovolts,kV,kV,1000,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,megavolt,megavolts,MV,MV,1000000,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,microvolt,microvolts,µV,uV,0.000001,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,millivolt,millivolts,mV,mV,0.001,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,nanovolt,nanovolts,nV,nV,0.000000001,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,petavolt,petavolts,PV,PV,1000000000000000,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,picovolt,picovolts,pV,pV,1E-12,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,statvolt,statvolts,statV,statV,299.7925,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,teravolt,teravolts,TV,TV,1000000000000,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,volt,volts,V,V,1,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,yoctovolt,yoctovolts,yV,yV,1E-24,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,yottavolt,yottavolts,YV,YV,1E+024,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,zeptovolt,zeptovolts,zV,zV,1E-21,0 +ElectricPotential,2,1,-3,-1,0,0,0,false,false,false,false,false,false,zettavolt,zettavolts,ZV,ZV,1E+021,0 +ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,false,atomic unit of electric quadrupole moment,atomic units of electric quadrupole moment,e · a₀²,e*a\0^2,4.486551524613E-40,0 +ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,false,coulomb square meter,coulomb square meters,C · m²,C*m^2,1,0 +ElectricQuadrupoleMoment,2,0,1,1,0,0,0,false,false,false,false,false,false,elementary charge barn,elementary charge barns,e · b,e*b,1.602176634E-47,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,abmho,abmhos,abmho,abmho,1000000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,abmsiemens,abmsiemens,abS,abS,1000000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,attosiemens,attosiemens,aS,aS,1E-18,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,centisiemens,centisiemens,cS,cS,0.01,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,decasiemens,decasiemens,daS,daS,10,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,decisiemens,decisiemens,dS,dS,0.1,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,exasiemens,exasiemens,ES,ES,1E+018,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,femtosiemens,femtosiemens,fS,fS,1E-15,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,gigasiemens,gigasiemens,GS,GS,1000000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,hectosiemens,hectosiemens,hS,hS,100,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,kilosiemens,kilosiemens,kS,kS,1000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,megasiemens,megasiemens,MS,MS,1000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,mho,mhos,℧,mho,1,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,microsiemens,microsiemens,µS,uS,0.000001,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,millisiemens,millisiemens,mS,mS,0.001,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,nanosiemens,nanosiemens,nS,nS,0.000000001,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,petasiemens,petasiemens,PS,PS,1000000000000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,picosiemens,picosiemens,pS,pS,1E-12,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,siemens,siemens,S,S,1,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,statmho,statmhos,statmho,statmho,1.11265E-12,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,statsiemens,statsiemens,statS,statS,1.11265E-12,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,terasiemens,terasiemens,TS,TS,1000000000000,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,yoctosiemens,yoctosiemens,yS,yS,1E-24,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,yottasiemens,yottasiemens,YS,YS,1E+024,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,zeptosiemens,zeptosiemens,zS,zS,1E-21,0 +ElectricalConductance,-2,-1,3,0,0,0,0,false,false,false,false,false,false,zettasiemens,zettasiemens,ZS,ZS,1E+021,0 +ElectricalConductivity,-3,-1,3,2,0,0,0,false,false,false,false,false,false,siemens per centimeter,siemens per centimeter,S/cm,S/cm,100,0 +ElectricalConductivity,-3,-1,3,2,0,0,0,false,false,false,false,false,false,siemens per meter,siemens per meter,S/m,S/m,1,0 +ElectricalMobility,0,-1,2,1,0,0,0,false,false,false,false,false,false,square centimeter per volt second,square centimeters per volt second,cm²/(V · s),cm^2/(V*s),0.0001,0 +ElectricalMobility,0,-1,2,1,0,0,0,false,false,false,false,false,false,square meter per volt second,square meters per volt second,m²/(V · s),m^2/(V*s),1,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,abohm,abohms,abΩ,abohm,0.000000001,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,attoohm,attoohms,aΩ,aohm,1E-18,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,centiohm,centiohms,cΩ,cohm,0.01,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,decaohm,decaohms,daΩ,daohm,10,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,deciohm,deciohms,dΩ,dohm,0.1,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,exaohm,exaohms,EΩ,Eohm,1E+018,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,femtoohm,femtoohms,fΩ,fohm,1E-15,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,gigaohm,gigaohms,GΩ,Gohm,1000000000,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,hectoohm,hectoohms,hΩ,hohm,100,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,kiloohm,kiloohms,kΩ,kohm,1000,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,megaohm,megaohms,MΩ,Mohm,1000000,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,microohm,microohms,µΩ,uohm,0.000001,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,milliohm,milliohms,mΩ,mohm,0.001,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,nanoohm,nanoohms,nΩ,nohm,0.000000001,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm,ohms,Ω,ohm,1,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,petaohm,petaohms,PΩ,Pohm,1000000000000000,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,picoohm,picoohms,pΩ,pohm,1E-12,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,statohm,statohms,statΩ,statohm,898755291711.548,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,teraohm,teraohms,TΩ,Tohm,1000000000000,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,yoctoohm,yoctoohms,yΩ,yohm,1E-24,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,yottaohm,yottaohms,YΩ,Yohm,1E+024,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,zeptoohm,zeptoohms,zΩ,zohm,1E-21,0 +ElectricalResistance,2,1,-3,-2,0,0,0,false,false,false,false,false,false,zettaohm,zettaohms,ZΩ,Zohm,1E+021,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,abohm centimeter,abohm centimeters,abΩ · cm,abohm*cm,1E-11,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,abohm meter,abohm meters,abΩ · m,abohm*m,0.000000001,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,attoohm meter,attoohm meters,aΩ · m,aohm*m,1E-18,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,centiohm meter,centiohm meters,cΩ · m,cohm*m,0.01,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,decaohm meter,decaohm meters,daΩ · m,daohm*m,10,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,deciohm meter,deciohm meters,dΩ · m,dohm*m,0.1,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,exaohm meter,exaohm meters,EΩ · m,Eohm*m,1E+018,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,femtoohm meter,femtoohm meters,fΩ · m,fohm*m,1E-15,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,gigaohm meter,gigaohm meters,GΩ · m,Gohm*m,1000000000,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,hectoohm meter,hectoohm meters,hΩ · m,hohm*m,100,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,kiloohm meter,kiloohm meters,kΩ · m,kohm*m,1000,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,megaohm meter,megaohm meters,MΩ · m,Mohm*m,1000000,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,microohm meter,microohm meters,µΩ · m,uohm*m,0.000001,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,milliohm meter,milliohm meters,mΩ · m,mohm*m,0.001,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,nanoohm meter,nanoohm meters,nΩ · m,nohm*m,0.000000001,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm centimeter,ohm centimeters,Ω · cm,ohm*cm,0.01,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm foot,ohm feet,Ω · ft,ohm*ft,0.3048,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm inch,ohm inches,Ω · in,ohm*in,0.0254,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm meter,ohm meters,Ω · m,ohm*m,1,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm square millimeter per meter,ohm square millimeters per meter,Ω · mm²/m,ohm*mm^2/m,0.000001,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,ohm yard,ohm yards,Ω · yd,ohm*yd,0.9144,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,petaohm meter,petaohm meters,PΩ · m,Pohm*m,1000000000000000,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,picoohm meter,picoohm meters,pΩ · m,pohm*m,1E-12,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,statohm centimeter,statohm centimeters,statΩ · cm,statohm*cm,8987552917.11548,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,statohm meter,statohm meters,statΩ · m,statohm*m,898755291711.548,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,teraohm meter,teraohm meters,TΩ · m,Tohm*m,1000000000000,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,yoctoohm meter,yoctoohm meters,yΩ · m,yohm*m,1E-24,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,yottaohm meter,yottaohm meters,YΩ · m,Yohm*m,1E+024,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,zeptoohm meter,zeptoohm meters,zΩ · m,zohm*m,1E-21,0 +ElectricalResistivity,3,1,-3,-2,0,0,0,false,false,false,false,false,false,zettaohm meter,zettaohm meters,ZΩ · m,Zohm*m,1E+021,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,attojoule,attojoules,aJ,aJ,1E-18,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit,British thermal units,Btu,Btu,1054.35,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit (39 °F),British thermal units (39 °F),Btu₃₉,Btu\39,1059.67,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit (59 °F),British thermal units (59 °F),Btu₅₉,Btu\59,1054.8,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit (60 °F),British thermal units (60 °F),Btu₆₀,Btu\60,1054.68,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,British thermal unit (IT),British thermal units (IT),Btu (IT),Btu (IT),1055.056,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,calorie,calories,cal,cal,4.184,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,calorie (15 °C),calories (15 °C),cal₁₅,Cal\15,4.1858,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,calorie (20 °C),calories (20 °C),cal₂₀,Cal\20,4.1819,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,calorie (IT),calories (IT),cal (IT),cal (IT),4.1868,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,Calorie (IT),Calories (IT),Cal (IT),Cal (IT),4186.8,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,Calorie,Calories,Cal,Cal,4184,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,centijoule,centijoules,cJ,cJ,0.01,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,decaelectronvolt,decaelectronvolts,daeV,daeV,1.602176634E-18,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,decajoule,decajoules,daJ,daJ,10,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,decawatt hour,decawatt hours,daW · h,daW*h,36000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,decijoule,decijoules,dJ,dJ,0.1,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,electronvolt,electronvolts,eV,eV,1.602176634E-19,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,erg,ergs,erg,erg,0.0000001,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,exajoule,exajoules,EJ,EJ,1E+018,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,femtojoule,femtojoules,fJ,fJ,1E-15,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,foot pound-force,foot pounds-force,ft · lbf,ft*lbf,1.355818,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,foot poundal,foot poundals,ft · pdl,ft*pdl,0.04214011,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,gigaelectronvolt,gigaelectronvolts,GeV,GeV,1.602176634E-10,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,gigajoule,gigajoules,GJ,GJ,1000000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,gigawatt hour,gigawatt hours,GW · h,GW*h,3600000000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,hartree,hartrees,Eₕ,E\h,4.3597447222071E-18,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,hectoelectronvolt,hectoelectronvolts,heV,heV,1.602176634E-17,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,hectojoule,hectojoules,hJ,hJ,100,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,hectowatt hour,hectowatt hours,hW · h,hW*h,360000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,joule,joules,J,J,1,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,kilocalorie,kilocalories,kcal,kcal,4184,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,kilocalorie (IT),kilocalories (IT),kcal (IT),Kcal (IT),4186.8,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,kiloelectronvolt,kiloelectronvolts,keV,keV,1.602176634E-16,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,kilojoule,kilojoules,kJ,kJ,1000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,kilowatt hour,kilowatt hours,kW · h,kW*h,3600000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,megaelectronvolt,megaelectronvolts,MeV,MeV,1.602176634E-13,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,megajoule,megajoules,MJ,MJ,1000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,megawatt hour,megawatt hours,MW · h,MW*h,3600000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,microjoule,microjoules,µJ,uJ,0.000001,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,microwatt hour,microwatt hours,µW · h,uW*h,0.0036,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,millijoule,millijoules,mJ,mJ,0.001,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,milliwatt hour,milliwatt hours,mW · h,mW*h,3.6,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,nanojoule,nanojoules,nJ,nJ,0.000000001,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,petaelectronvolt,petaelectronvolts,PeV,PeV,0.0001602176634,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,petajoule,petajoules,PJ,PJ,1000000000000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,petawatt hour,petawatt hours,PW · h,PW*h,3.6E+018,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,picojoule,picojoules,pJ,pJ,1E-12,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,quad,quads,10¹⁵ Btu (IT),10^15 Btu (IT),1.055056E+018,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,teraelectronvolt,teraelectronvolts,TeV,TeV,0.0000001602176634,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,terajoule,terajoules,TJ,TJ,1000000000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,terawatt hour,terawatt hours,TW · h,TW*h,3600000000000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,therm (EC),therms (EC),thm (EC),Thm (EC),105506000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,therm,therms,thm,thm,105480400,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,ton of TNT,tons of TNT,t of TNT,T of TNT,4184000000,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,watt hour,watt hours,W · h,W*h,3600,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,watt second,watt seconds,W · s,W*s,1,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,yoctojoule,yoctojoules,yJ,yJ,1E-24,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,yottajoule,yottajoules,YJ,YJ,1E+024,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,zeptojoule,zeptojoules,zJ,zJ,1E-21,0 +Energy,2,1,-2,0,0,0,0,false,false,false,false,false,false,zettajoule,zettajoules,ZJ,ZJ,1E+021,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,attonewton,attonewtons,aN,aN,1E-18,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,centinewton,centinewtons,cN,cN,0.01,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,decanewton,decanewtons,daN,daN,10,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,decinewton,decinewtons,dN,dN,0.1,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,dyne,dynes,dyn,dyn,0.00001,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,exanewton,exanewtons,EN,EN,1E+018,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,femtonewton,femtonewtons,fN,fN,1E-15,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,giganewton,giganewtons,GN,GN,1000000000,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,hectonewton,hectonewtons,hN,hN,100,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,kilogram-force,kilograms-force,kgf,kgf,9.80665,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,kilonewton,kilonewtons,kN,kN,1000,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,kip,kips,kip,kip,4448.222,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,meganewton,meganewtons,MN,MN,1000000,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,micronewton,micronewtons,µN,uN,0.000001,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,millinewton,millinewtons,mN,mN,0.001,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,nanonewton,nanonewtons,nN,nN,0.000000001,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,newton,newtons,N,N,1,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,ounce-force,ounces-force,ozf,ozf,0.2780139,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,petanewton,petanewtons,PN,PN,1000000000000000,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,piconewton,piconewtons,pN,pN,1E-12,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,pound-force,pounds-force,lbf,lbf,4.448222,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,poundal,poundals,pdl,pdl,0.138255,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,teranewton,teranewtons,TN,TN,1000000000000,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,ton-force,tons-force,2000 lbf,2000 lbf,8896.443,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,yoctonewton,yoctonewtons,yN,yN,1E-24,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,yottanewton,yottanewtons,YN,YN,1E+024,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,zeptonewton,zeptonewtons,zN,zN,1E-21,0 +Force,1,1,-2,0,0,0,0,false,false,false,false,false,false,zettanewton,zettanewtons,ZN,ZN,1E+021,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,attohertz,attohertz,aHz,aHz,1E-18,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,centihertz,centihertz,cHz,cHz,0.01,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,cycle per day,cycles per day,1/d,1/d,1.15740740740741E-05,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,cycle per hour,cycles per hour,1/h,1/h,0.000277777777777778,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,cycle per minute,cycles per minute,1/min,1/min,0.0166666666666667,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,cycle per shake,cycles per shake,100 MHz,100 MHz,100000000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,cycle per year,cycles per year,1/a,1/a,3.17097919837646E-08,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,decahertz,decahertz,daHz,daHz,10,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,decihertz,decihertz,dHz,dHz,0.1,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,exahertz,exahertz,EHz,EHz,1E+018,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,femtohertz,femtohertz,fHz,fHz,1E-15,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,gigahertz,gigahertz,GHz,GHz,1000000000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,hectohertz,hectohertz,hHz,hHz,100,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,hertz,hertz,Hz,Hz,1,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,kilohertz,kilohertz,kHz,kHz,1000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,megahertz,megahertz,MHz,MHz,1000000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,microhertz,microhertz,µHz,uHz,0.000001,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,millihertz,millihertz,mHz,mHz,0.001,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,nanohertz,nanohertz,nHz,nHz,0.000000001,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,petahertz,petahertz,PHz,PHz,1000000000000000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,picohertz,picohertz,pHz,pHz,1E-12,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,terahertz,terahertz,THz,THz,1000000000000,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,yoctohertz,yoctohertz,yHz,yHz,1E-24,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,yottahertz,yottahertz,YHz,YHz,1E+024,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,zeptohertz,zeptohertz,zHz,zHz,1E-21,0 +Frequency,0,0,-1,0,0,0,0,false,false,false,false,false,false,zettahertz,zettahertz,ZHz,ZHz,1E+021,0 +FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,false,gigahertz per second,gigahertz per second,GHz/s,GHz/s,1000000000,0 +FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,false,hertz per second,hertz per second,Hz/s,Hz/s,1,0 +FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,false,kilohertz per second,kilohertz per second,kHz/s,kHz/s,1000,0 +FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,false,megahertz per second,megahertz per second,MHz/s,MHz/s,1000000,0 +FrequencyDrift,0,0,-2,0,0,0,0,false,false,false,false,false,false,terahertz per second,terahertz per second,THz/s,THz/s,1000000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,attogram square meter per second squared kelvin,attogram square meters per second squared kelvin,ag · m²/(s² · K),ag*m^2/(s^2*K),1E-21,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,attojoule per kelvin,attojoules per kelvin,aJ/K,aJ/K,1E-18,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,Boltzmann constant,Boltzmann constants,k,k,1.380649E-23,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per degree Fahrenheit,British thermal units (IT) per degree Fahrenheit,Btu (IT)/°F,Btu (IT)/degF,1899.1008,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,British thermal unit per degree Fahrenheit,British thermal units per degree Fahrenheit,Btu/°F,Btu/degF,1897.83,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,calorie per kelvin,calories per kelvin,cal/K,cal/K,4.184,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,centigram square meter per second squared kelvin,centigram square meters per second squared kelvin,cg · m²/(s² · K),cg*m^2/(s^2*K),0.00001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,centijoule per kelvin,centijoules per kelvin,cJ/K,cJ/K,0.01,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,decagram square meter per second squared kelvin,decagram square meters per second squared kelvin,dag · m²/(s² · K),dag*m^2/(s^2*K),0.01,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,decajoule per kelvin,decajoules per kelvin,daJ/K,daJ/K,10,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,decigram square meter per second squared kelvin,decigram square meters per second squared kelvin,dg · m²/(s² · K),dg*m^2/(s^2*K),0.0001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,decijoule per kelvin,decijoules per kelvin,dJ/K,dJ/K,0.1,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,exagram square meter per second squared kelvin,exagram square meters per second squared kelvin,Eg · m²/(s² · K),Eg*m^2/(s^2*K),1000000000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,exajoule per kelvin,exajoules per kelvin,EJ/K,EJ/K,1E+018,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,femtogram square meter per second squared kelvin,femtogram square meters per second squared kelvin,fg · m²/(s² · K),fg*m^2/(s^2*K),1E-18,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,femtojoule per kelvin,femtojoules per kelvin,fJ/K,fJ/K,1E-15,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,gigagram square meter per second squared kelvin,gigagram square meters per second squared kelvin,Gg · m²/(s² · K),Gg*m^2/(s^2*K),1000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,gigajoule per kelvin,gigajoules per kelvin,GJ/K,GJ/K,1000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,gram square meter per second squared kelvin,gram square meters per second squared kelvin,g · m²/(s² · K),g*m^2/(s^2*K),0.001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,hectogram square meter per second squared kelvin,hectogram square meters per second squared kelvin,hg · m²/(s² · K),hg*m^2/(s^2*K),0.1,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,hectojoule per kelvin,hectojoules per kelvin,hJ/K,hJ/K,100,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,joule per degree celsius,joules per degree celsius,J/°C,J/degC,1,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,joule per kelvin,joules per kelvin,J/K,J/K,1,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,kilogram square meter per second squared kelvin,kilogram square meters per second squared kelvin,kg · m²/(s² · K),kg*m^2/(s^2*K),1,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,kilojoule per degree celsius,kilojoules per degree celsius,kJ/°C,kJ/degC,1000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,kilojoule per kelvin,kilojoules per kelvin,kJ/K,kJ/K,1000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,megagram square meter per second squared kelvin,megagram square meters per second squared kelvin,Mg · m²/(s² · K),Mg*m^2/(s^2*K),1000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,megajoule per kelvin,megajoules per kelvin,MJ/K,MJ/K,1000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,microgram square meter per second squared kelvin,microgram square meters per second squared kelvin,µg · m²/(s² · K),ug*m^2/(s^2*K),0.000000001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,microjoule per kelvin,microjoules per kelvin,µJ/K,uJ/K,0.000001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,milligram square meter per second squared kelvin,milligram square meters per second squared kelvin,mg · m²/(s² · K),mg*m^2/(s^2*K),0.000001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,millijoule per degree celsius,millijoules per degree celsius,mJ/°C,mJ/degC,0.001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,millijoule per kelvin,millijoules per kelvin,mJ/K,mJ/K,0.001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,nanogram square meter per second squared kelvin,nanogram square meters per second squared kelvin,ng · m²/(s² · K),ng*m^2/(s^2*K),1E-12,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,nanojoule per kelvin,nanojoules per kelvin,nJ/K,nJ/K,0.000000001,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,petagram square meter per second squared kelvin,petagram square meters per second squared kelvin,Pg · m²/(s² · K),Pg*m^2/(s^2*K),1000000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,petajoule per kelvin,petajoules per kelvin,PJ/K,PJ/K,1000000000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,picogram square meter per second squared kelvin,picogram square meters per second squared kelvin,pg · m²/(s² · K),pg*m^2/(s^2*K),1E-15,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,picojoule per kelvin,picojoules per kelvin,pJ/K,pJ/K,1E-12,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,teragram square meter per second squared kelvin,teragram square meters per second squared kelvin,Tg · m²/(s² · K),Tg*m^2/(s^2*K),1000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,terajoule per kelvin,terajoules per kelvin,TJ/K,TJ/K,1000000000000,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,yoctogram square meter per second squared kelvin,yoctogram square meters per second squared kelvin,yg · m²/(s² · K),yg*m^2/(s^2*K),1E-27,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,yoctojoule per kelvin,yoctojoules per kelvin,yJ/K,yJ/K,1E-24,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,yottagram square meter per second squared kelvin,yottagram square meters per second squared kelvin,Yg · m²/(s² · K),Yg*m^2/(s^2*K),1E+021,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,yottajoule per kelvin,yottajoules per kelvin,YJ/K,YJ/K,1E+024,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,zeptogram square meter per second squared kelvin,zeptogram square meters per second squared kelvin,zg · m²/(s² · K),zg*m^2/(s^2*K),1E-24,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,zeptojoule per kelvin,zeptojoules per kelvin,zJ/K,zJ/K,1E-21,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,zettagram square meter per second squared kelvin,zettagram square meters per second squared kelvin,Zg · m²/(s² · K),Zg*m^2/(s^2*K),1E+018,0 +HeatCapacity,2,1,-2,0,-1,0,0,false,false,false,false,false,false,zettajoule per kelvin,zettajoules per kelvin,ZJ/K,ZJ/K,1E+021,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,attowatt per square meter,attowatts per square meter,aW/m²,aW/m^2,1E-18,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,centiwatt per square meter,centiwatts per square meter,cW/m²,cW/m^2,0.01,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,decawatt per square meter,decawatts per square meter,daW/m²,daW/m^2,10,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,deciwatt per square meter,deciwatts per square meter,dW/m²,dW/m^2,0.1,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,exawatt per square meter,exawatts per square meter,EW/m²,EW/m^2,1E+018,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,femtowatt per square meter,femtowatts per square meter,fW/m²,fW/m^2,1E-15,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,gigawatt per square meter,gigawatts per square meter,GW/m²,GW/m^2,1000000000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,hectowatt per square meter,hectowatts per square meter,hW/m²,hW/m^2,100,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,kilowatt per square meter,kilowatts per square meter,kW/m²,kW/m^2,1000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,megawatt per square meter,megawatts per square meter,MW/m²,MW/m^2,1000000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,microwatt per square meter,microwatts per square meter,µW/m²,uW/m^2,0.000001,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,milliwatt per square meter,milliwatts per square meter,mW/m²,mW/m^2,0.001,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,nanowatt per square meter,nanowatts per square meter,nW/m²,nW/m^2,0.000000001,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,petawatt per square meter,petawatts per square meter,PW/m²,PW/m^2,1000000000000000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,picowatt per square meter,picowatts per square meter,pW/m²,pW/m^2,1E-12,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,terawatt per square meter,terawatts per square meter,TW/m²,TW/m^2,1000000000000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,watt per square centimeter,watts per square centimeter,W/cm²,W/cm^2,10000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,watt per square meter,watts per square meter,W/m²,W/m^2,1,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,watt per square millimeter,watts per square millimeter,W/mm²,W/mm^2,1000000,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,yoctowatt per square meter,yoctowatts per square meter,yW/m²,yW/m^2,1E-24,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,yottawatt per square meter,yottawatts per square meter,YW/m²,YW/m^2,1E+024,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,zeptowatt per square meter,zeptowatts per square meter,zW/m²,zW/m^2,1E-21,0 +HeatFluxDensity,0,1,-3,0,0,0,0,false,false,false,false,false,false,zettawatt per square meter,zettawatts per square meter,ZW/m²,ZW/m^2,1E+021,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,attogram per second cubed kelvin,attograms per second cubed kelvin,ag/(s³ · K),ag/(s^3*K),1E-21,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,attowatt per square meter kelvin,attowatts per square meter kelvin,aW/(m² · K),aW/(m^2*K),1E-18,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per hour square foot degree Fahrenheit,British thermal units (IT) per hour square foot degree Fahrenheit,Btu (IT)/(hr · ft² · °F),Btu (IT)/(hr*ft^2*degF),5.67826413430605,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per hour square inch degree Fahrenheit,British thermal units (IT) per hour square inch degree Fahrenheit,Btu (IT)/(hr · in² · °F),Btu (IT)/(hr*in^2*degF),817.670035340071,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per minute square foot degree Fahrenheit,British thermal units (IT) per minute square foot degree Fahrenheit,Btu (IT)/(min · ft² · °F),Btu (IT)/(min*ft^2*degF),340.695848058363,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per minute square inch degree Fahrenheit,British thermal units (IT) per minute square inch degree Fahrenheit,Btu (IT)/(min · in² · °F),Btu (IT)/(min*in^2*degF),49060.2021204043,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per second square foot degree Fahrenheit,British thermal units (IT) per second square foot degree Fahrenheit,Btu (IT)/(s · ft² · °F),Btu (IT)/(s*ft^2*degF),20441.7508835018,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per second square inch degree Fahrenheit,British thermal units (IT) per second square inch degree Fahrenheit,Btu (IT)/(s · in² · °F),Btu (IT)/(s*in^2*degF),2943612.12722425,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per hour square foot degree Fahrenheit,British thermal units per hour square foot degree Fahrenheit,Btu/(hr · ft² · °F),Btu/(hr*ft^2*degF),5.67446447392895,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per hour square inch degree Fahrenheit,British thermal units per hour square inch degree Fahrenheit,Btu/(hr · in² · °F),Btu/(hr*in^2*degF),817.122884245769,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per minute square foot degree Fahrenheit,British thermal units per minute square foot degree Fahrenheit,Btu/(min · ft² · °F),Btu/(min*ft^2*degF),340.467868435737,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per minute square inch degree Fahrenheit,British thermal units per minute square inch degree Fahrenheit,Btu/(min · in² · °F),Btu/(min*in^2*degF),49027.3730547461,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per second square foot degree Fahrenheit,British thermal units per second square foot degree Fahrenheit,Btu/(s · ft² · °F),Btu/(s*ft^2*degF),20428.0721061442,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,British thermal unit per second square inch degree Fahrenheit,British thermal units per second square inch degree Fahrenheit,Btu/(s · in² · °F),Btu/(s*in^2*degF),2941642.38328477,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,centigram per second cubed kelvin,centigrams per second cubed kelvin,cg/(s³ · K),cg/(s^3*K),0.00001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,centiwatt per square meter kelvin,centiwatts per square meter kelvin,cW/(m² · K),cW/(m^2*K),0.01,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,decagram per second cubed kelvin,decagrams per second cubed kelvin,dag/(s³ · K),dag/(s^3*K),0.01,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,decawatt per square meter kelvin,decawatts per square meter kelvin,daW/(m² · K),daW/(m^2*K),10,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,decigram per second cubed kelvin,decigrams per second cubed kelvin,dg/(s³ · K),dg/(s^3*K),0.0001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,deciwatt per square meter kelvin,deciwatts per square meter kelvin,dW/(m² · K),dW/(m^2*K),0.1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,exagram per second cubed kelvin,exagrams per second cubed kelvin,Eg/(s³ · K),Eg/(s^3*K),1000000000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,exawatt per square meter kelvin,exawatts per square meter kelvin,EW/(m² · K),EW/(m^2*K),1E+018,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,femtogram per second cubed kelvin,femtograms per second cubed kelvin,fg/(s³ · K),fg/(s^3*K),1E-18,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,femtowatt per square meter kelvin,femtowatts per square meter kelvin,fW/(m² · K),fW/(m^2*K),1E-15,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,gigagram per second cubed kelvin,gigagrams per second cubed kelvin,Gg/(s³ · K),Gg/(s^3*K),1000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,gigawatt per square meter kelvin,gigawatts per square meter kelvin,GW/(m² · K),GW/(m^2*K),1000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,gram per second cubed kelvin,grams per second cubed kelvin,g/(s³ · K),g/(s^3*K),0.001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,hectogram per second cubed kelvin,hectograms per second cubed kelvin,hg/(s³ · K),hg/(s^3*K),0.1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,hectowatt per square meter kelvin,hectowatts per square meter kelvin,hW/(m² · K),hW/(m^2*K),100,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,joule per second square meter degree celsius,joules per second square meter degree celsius,J/(s · m² · °C),J/(s*m^2*degC),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,joule per second square meter kelvin,joules per second square meter kelvin,J/(s · m² · K),J/(s*m^2*K),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram per second cubed degree celsius,kilograms per second cubed degree celsius,kg/(s³ · °C),kg/(s^3*degC),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram per second cubed kelvin,kilograms per second cubed kelvin,kg/(s³ · K),kg/(s^3*K),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,kilowatt per square meter kelvin,kilowatts per square meter kelvin,kW/(m² · K),kW/(m^2*K),1000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,megagram per second cubed kelvin,megagrams per second cubed kelvin,Mg/(s³ · K),Mg/(s^3*K),1000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,megawatt per square meter kelvin,megawatts per square meter kelvin,MW/(m² · K),MW/(m^2*K),1000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,microgram per second cubed kelvin,micrograms per second cubed kelvin,µg/(s³ · K),ug/(s^3*K),0.000000001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,microwatt per square meter kelvin,microwatts per square meter kelvin,µW/(m² · K),uW/(m^2*K),0.000001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,milligram per second cubed kelvin,milligrams per second cubed kelvin,mg/(s³ · K),mg/(s^3*K),0.000001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,milliwatt per square meter kelvin,milliwatts per square meter kelvin,mW/(m² · K),mW/(m^2*K),0.001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,nanogram per second cubed kelvin,nanograms per second cubed kelvin,ng/(s³ · K),ng/(s^3*K),1E-12,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,nanowatt per square meter kelvin,nanowatts per square meter kelvin,nW/(m² · K),nW/(m^2*K),0.000000001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,petagram per second cubed kelvin,petagrams per second cubed kelvin,Pg/(s³ · K),Pg/(s^3*K),1000000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,petawatt per square meter kelvin,petawatts per square meter kelvin,PW/(m² · K),PW/(m^2*K),1000000000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,picogram per second cubed kelvin,picograms per second cubed kelvin,pg/(s³ · K),pg/(s^3*K),1E-15,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,picowatt per square meter kelvin,picowatts per square meter kelvin,pW/(m² · K),pW/(m^2*K),1E-12,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,teragram per second cubed kelvin,teragrams per second cubed kelvin,Tg/(s³ · K),Tg/(s^3*K),1000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,terawatt per square meter kelvin,terawatts per square meter kelvin,TW/(m² · K),TW/(m^2*K),1000000000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per square centimeter degree celsius,watts per square centimeter degree celsius,W/(cm² · °C),W/(cm^2*degC),10000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per square kilometer degree celsius,watts per square kilometer degree celsius,W/(km² · °C),W/(km^2*degC),0.000001,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per square meter degree celsius,watts per square meter degree celsius,W/(m² · °C),W/(m^2*degC),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per square meter kelvin,watts per square meter kelvin,W/(m² · K),W/(m^2*K),1,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per square millimeter degree celsius,watts per square millimeter degree celsius,W/(mm² · °C),W/(mm^2*degC),1000000,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctogram per second cubed kelvin,yoctograms per second cubed kelvin,yg/(s³ · K),yg/(s^3*K),1E-27,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctowatt per square meter kelvin,yoctowatts per square meter kelvin,yW/(m² · K),yW/(m^2*K),1E-24,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,yottagram per second cubed kelvin,yottagrams per second cubed kelvin,Yg/(s³ · K),Yg/(s^3*K),1E+021,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,yottawatt per square meter kelvin,yottawatts per square meter kelvin,YW/(m² · K),YW/(m^2*K),1E+024,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptogram per second cubed kelvin,zeptograms per second cubed kelvin,zg/(s³ · K),zg/(s^3*K),1E-24,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptowatt per square meter kelvin,zeptowatts per square meter kelvin,zW/(m² · K),zW/(m^2*K),1E-21,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,zettagram per second cubed kelvin,zettagrams per second cubed kelvin,Zg/(s³ · K),Zg/(s^3*K),1E+018,0 +HeatTransfer,0,1,-3,0,-1,0,0,false,false,false,false,false,false,zettawatt per square meter kelvin,zettawatts per square meter kelvin,ZW/(m² · K),ZW/(m^2*K),1E+021,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,abhenry,abhenries,abH,abH,0.000000001,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,attohenry,attohenries,aH,aH,1E-18,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,centihenry,centihenries,cH,cH,0.01,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,decahenry,decahenries,daH,daH,10,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,decihenry,decihenries,dH,dH,0.1,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,exahenry,exahenries,EH,EH,1E+018,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,femtohenry,femtohenries,fH,fH,1E-15,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,gigahenry,gigahenries,GH,GH,1000000000,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,hectohenry,hectohenries,hH,hH,100,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,henry,henries,H,H,1,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,kilohenry,kilohenries,kH,kH,1000,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,megahenry,megahenries,MH,MH,1000000,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,microhenry,microhenries,µH,uH,0.000001,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,millihenry,millihenries,mH,mH,0.001,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,nanohenry,nanohenries,nH,nH,0.000000001,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,petahenry,petahenries,PH,PH,1000000000000000,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,picohenry,picohenries,pH,pH,1E-12,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,stathenry,stathenries,statH,statH,898755291711.548,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,terahenry,terahenries,TH,TH,1000000000000,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,yoctohenry,yoctohenries,yH,yH,1E-24,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,yottahenry,yottahenries,YH,YH,1E+024,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,zeptohenry,zeptohenries,zH,zH,1E-21,0 +Inductance,2,1,-2,-2,0,0,0,false,false,false,false,false,false,zettahenry,zettahenries,ZH,ZH,1E+021,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,bit,bits,b,bit,0.125,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,byte,bytes,B,B,1,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,crumb,crumbs,crumb,crumb,0.25,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,deciban,decibans,deciban,deciban,0.041524101186092,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,exabit,exabits,Eb,Eb,1.25E+017,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,exabyte,exabytes,EB,EB,1E+018,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,exbibit,exbibits,Eib,Eib,1.44115188075856E+017,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,exbibyte,exbibytes,EiB,EiB,1.15292150460685E+018,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,gibibit,gibibits,Gib,Gib,134217728,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,gibibyte,gibibytes,GiB,GiB,1073741824,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,gigabit,gigabits,Gb,Gb,125000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,gigabyte,gigabytes,GB,GB,1000000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,hartley,hartleys,Hart,Hart,0.41524101186092,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,kibibit,kibibits,Kib,Kib,128,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,kibibyte,kibibytes,KiB,KiB,1024,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,kilobit,kilobits,kb,kb,125,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,kilobyte,kilobytes,kB,kB,1000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,mebibit,mebibits,Mib,Mib,131072,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,mebibyte,mebibytes,MiB,MiB,1048576,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,megabit,megabits,Mb,Mb,125000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,megabyte,megabytes,MB,MB,1000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,natural unit of uniformation,natural units of information,nat,nat,0.18033688011112,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,nibble,nibbles,nibble,nibble,0.5,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,octet,octets,o,o,1,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,pebibit,pebibits,Pib,Pib,140737488355328,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,pebibyte,pebibytes,PiB,PiB,1125899906842624,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,petabit,petabits,Pb,Pb,125000000000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,petabyte,petabytes,PB,PB,1000000000000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,shannon,shannons,Sh,Sh,0.125,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,tibibit,tibibits,Tib,Tib,137438953472,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,tibibyte,tibibytes,TiB,TiB,1099511627776,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,terabit,terabits,Tb,Tb,125000000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,terabyte,terabytes,TB,TB,1000000000000,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,trit,trits,trit,trit,0.198120312590145,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,yobibit,yobibits,Yib,Yib,1.51115727451829E+023,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,yobibyte,yobibytes,YiB,YiB,1.20892581961463E+024,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,yottabit,yottabits,Yb,Yb,1.25E+023,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,yottabyte,yottabytes,YB,YB,1E+024,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,zebibit,zebibits,Zib,Zib,1.47573952589676E+020,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,zebibyte,zebibytes,ZiB,ZiB,1.18059162071741E+021,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,zettabit,zettabits,Zb,Zb,1.25E+020,0 +Information,0,0,0,0,0,0,0,false,false,true,false,false,false,zettabyte,zettabytes,ZB,ZB,1E+021,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,bit per second,bits per second,b/s,b/s,0.125,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,byte per second,bytes per second,B/s,B/s,1,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,exabit per second,exabits per second,Eb/s,Eb/s,1.25E+017,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,exabyte per second,exabytes per second,EB/s,EB/s,1E+018,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,exbibit per second,exbibits per second,Eib/s,Eib/s,1.44115188075856E+017,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,exbibyte per second,exbibytes per second,EiB/s,EiB/s,1.15292150460685E+018,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,gibibit per second,gibibits per second,Gib/s,Gib/s,134217728,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,gibibyte per second,gibibytes per second,GiB/s,GiB/s,1073741824,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,gigabit per second,gigabits per second,Gb/s,Gb/s,125000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,gigabyte per second,gigabytes per second,GB/s,GB/s,1000000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,kibibit per second,kibibits per second,Kib/s,Kib/s,128,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,kibibyte per second,kibibytes per second,KiB/s,KiB/s,1024,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,kilobit per second,kilobits per second,kb/s,kb/s,125,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,kilobyte per second,kilobytes per second,kB/s,kB/s,1000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,mebibit per second,mebibits per second,Mib/s,Mib/s,131072,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,mebibyte per second,mebibytes per second,MiB/s,MiB/s,1048576,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,megabit per second,megabits per second,Mb/s,Mb/s,125000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,megabyte per second,megabytes per second,MB/s,MB/s,1000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,octet per second,octets per second,o/s,o/s,1,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,pebibit per second,pebibits per second,Pib/s,Pib/s,140737488355328,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,pebibyte per second,pebibytes per second,PiB/s,PiB/s,1125899906842624,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,petabit per second,petabits per second,Pb/s,Pb/s,125000000000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,petabyte per second,petabytes per second,PB/s,PB/s,1000000000000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,tebibit per second,tebibits per second,Tib/s,Tib/s,137438953472,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,tebibyte per second,tebibytes per second,TiB/s,TiB/s,1099511627776,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,terabit per second,terabits per second,Tb/s,Tb/s,125000000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,terabyte per second,terabytes per second,TB/s,TB/s,1000000000000,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,yobibit per second,yobibits per second,Yib/s,Yib/s,1.51115727451829E+023,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,yobibyte per second,yobibytes per second,YiB/s,YiB/s,1.20892581961463E+024,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,yottabit per second,yottabits per second,Yb/s,Yb/s,1.25E+023,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,yottabyte per second,yottabytes per second,YB/s,YB/s,1E+024,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,zebibit per second,zebibits per second,Zib/s,Zib/s,1.47573952589676E+020,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,zebibyte per second,zebibytes per second,ZiB/s,ZiB/s,1.18059162071741E+021,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,zettabit per second,zettabits per second,Zb/s,Zb/s,1.25E+020,0 +InformationRate,0,0,-1,0,0,0,0,false,true,false,false,false,false,zettabyte per second,zettabytes per second,ZB/s,ZB/s,1E+021,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,attosecond per meter,attoseconds per meter,am/s,am/s (inverse),1E-18,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,centisecond per meter,centiseconds per meter,cm/s,cm/s (inverse),0.01,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,decasecond per meter,decaseconds per meter,dam/s,dam/s (inverse),10,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,decisecond per meter,deciseconds per meter,dm/s,dm/s (inverse),0.1,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,exasecond per meter,exaseconds per meter,Em/s,Em/s (inverse),1E+018,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,femtosecond per meter,femtoseconds per meter,fm/s,fm/s (inverse),1E-15,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,gigasecond per meter,gigaseconds per meter,Gm/s,Gm/s (inverse),1000000000,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,hectosecond per meter,hectoseconds per meter,hm/s,hm/s (inverse),100,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,hour per foot,hours per foot,h/ft,h/ft (inverse),11811.0236220472,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,hour per kilometer,hours per kilometer,h/km,h/km (inverse),3.6,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,hour per mile,hours per mile,h/mi,h/mi (inverse),2.2369362920544,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,kilosecond per meter,kiloseconds per meter,km/s,km/s (inverse),1000,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,megasecond per meter,megaseconds per meter,Mm/s,Mm/s (inverse),1000000,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,microsecond per meter,microseconds per meter,µm/s,um/s (inverse),0.000001,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,millisecond per meter,milliseconds per meter,mm/s,mm/s (inverse),0.001,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,minute per foot,minutes per foot,min/ft,min/ft (inverse),196.850393700787,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,minute per mile,minutes per mile,min/mi,min/mi (inverse),0.03728227153,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,nanosecond per meter,nanoseconds per meter,nm/s,nm/s (inverse),0.000000001,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,petasecond per meter,petaseconds per meter,Pm/s,Pm/s (inverse),1000000000000000,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,picosecond per meter,picoseconds per meter,pm/s,pm/s (inverse),1E-12,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,second per foot,seconds per foot,s/ft,s/ft (inverse),3.28083989501312,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,second per inch,seconds per inch,s/in,s/in (inverse),39.3700787401575,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,second per meter,seconds per meter,m/s,m/s (inverse),1,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,second per mile,seconds per mile,s/mi,s/mi (inverse),0.000621371192237334,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,terasecond per meter,teraseconds per meter,Tm/s,Tm/s (inverse),1000000000000,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,yoctosecond per meter,yoctoseconds per meter,ym/s,ym/s (inverse),1E-24,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,yottasecond per meter,yottaseconds per meter,Ym/s,Ym/s (inverse),1E+024,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,zeptosecond per meter,zeptoseconds per meter,zm/s,zm/s (inverse),1E-21,0 +InverseVelocity,-1,0,1,0,0,0,0,false,false,false,false,false,false,zettasecond per meter,zettaseconds per meter,Zm/s,Zm/s (inverse),1E+021,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,attometer per second cubed,attometers per second cubed,am/s³,am/s^3,1E-18,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,centimeter per second cubed,centimeters per second cubed,cm/s³,cm/s^3,0.01,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,decameter per second cubed,decameters per second cubed,dam/s³,dam/s^3,10,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,decimeter per second cubed,decimeters per second cubed,dm/s³,dm/s^3,0.1,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,exameter per second cubed,exameters per second cubed,Em/s³,Em/s^3,1E+018,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,femtometer per second cubed,femtometers per second cubed,fm/s³,fm/s^3,1E-15,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,foot per second cubed,feet per second cubed,ft/s³,ft/s^3,0.3048,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,gigameter per second cubed,gigameters per second cubed,Gm/s³,Gm/s^3,1000000000,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,hectometer per second cubed,hectometers per second cubed,hm/s³,hm/s^3,100,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,inch per second cubed,inches per second cubed,in/s³,in/s^3,0.0254,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,kilometer per minute cubed,kilometers per minute cubed,km/min³,km/min^3,0.00462962962962963,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,kilometer per second cubed,kilometers per second cubed,km/s³,km/s^3,1000,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,megameter per second cubed,megameters per second cubed,Mm/s³,Mm/s^3,1000000,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,meter per second cubed,meters per second cubed,m/s³,m/s^3,1,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,micrometer per second cubed,micrometers per second cubed,µm/s³,um/s^3,0.000001,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,millimeter per second cubed,millimeters per second cubed,mm/s³,mm/s^3,0.001,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,nanometer per second cubed,nanometers per second cubed,nm/s³,nm/s^3,0.000000001,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,petameter per second cubed,petameters per second cubed,Pm/s³,Pm/s^3,1000000000000000,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,picometer per second cubed,picometers per second cubed,pm/s³,pm/s^3,1E-12,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,terameter per second cubed,terameters per second cubed,Tm/s³,Tm/s^3,1000000000000,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,yoctometer per second cubed,yoctometers per second cubed,ym/s³,ym/s^3,1E-24,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,yottameter per second cubed,yottameters per second cubed,Ym/s³,Ym/s^3,1E+024,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,zeptometer per second cubed,zeptometers per second cubed,zm/s³,zm/s^3,1E-21,0 +Jerk,1,0,-3,0,0,0,0,false,false,false,false,false,false,zettameter per second cubed,zettameters per second cubed,Zm/s³,Zm/s^3,1E+021,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,ångström,ångströms,Å,ang,1E-10,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,astronomical unit,astronomical units,ua,ua,149597900000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,atomic unit of length,atomic units of length,a.u. of length,a.u. of length,5.29177210903E-11,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,attometer,attometers,am,am,1E-18,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,bohr radius,bohr radiuses,a₀,a\0,5.29177210903E-11,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,centimeter,centimeters,cm,cm,0.01,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,chain,chains,ch,ch,20.11684,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,decameter,decameters,dam,dam,10,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,decimeter,decimeters,dm,dm,0.1,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,exameter,exameters,Em,Em,1E+018,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,fathom,fathoms,fathom,fathom,1.828804,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,femtometer,femtometers,fm,fm,1E-15,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,fermi,fermis,fermi,fermi,1E-15,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,foot,feet,ft,ft,0.3048,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,foot (U.S. survey),feet (U.S. survey),ft (U.S. survey),ft (U.S. survey),0.3048006,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,gigameter,gigameters,Gm,Gm,1000000000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,hectometer,hectometers,hm,hm,100,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,inch,inches,in,in,0.0254,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,kilometer,kilometers,km,km,1000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,light year,light years,l. y.,l. y.,9.46073E+015,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,megameter,megameters,Mm,Mm,1000000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,meter,meters,m,m,1,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,microinch,microinches,μin,uin,0.0000000254,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,micrometer,micrometers,µm,um,0.000001,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,micron,microns,μ,u,0.000001,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,mil,mils,0.001 in,0.001 in,0.0000254,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,mile,miles,mi,mi,1609.344,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,mile (U.S. survey),miles (U.S. survey),mi (U.S. survey),mi (U.S. survey),1609.347,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,millimeter,millimeters,mm,mm,0.001,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,nanometer,nanometers,nm,nm,0.000000001,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,nautical mile,nautical miles,M,M,1852,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,parsec,parsecs,pc,pc,3.085678E+016,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,petameter,petameters,Pm,Pm,1000000000000000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,pica (computer),picas (computer),1/6 in (computer),1/6 in (computer),0.00423333333333333,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,pica (printer's),picas (printer's),1/6 in,1/6 in,0.004217518,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,picometer,picometers,pm,pm,1E-12,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,point (computer),points (computer),1/72 in (computer),1/72 in (computer),0.0003527778,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,point (printer's),points (printer's),1/72 in,1/72 in,0.0003514598,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,rod,rods,rd,rd,5.02921,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,terameter,terameters,Tm,Tm,1000000000000,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,yard,yards,yd,yd,0.9144,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,yoctometer,yoctometers,ym,ym,1E-24,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,yottameter,yottameters,Ym,Ym,1E+024,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,zeptometer,zeptometers,zm,zm,1E-21,0 +Length,1,0,0,0,0,0,0,false,false,false,false,false,false,zettameter,zettameters,Zm,Zm,1E+021,0 +LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,false,state per centimeter electronvolt,states per centimeter electronvolt,1/(cm · eV),1/(cm*eV),6.24150907446076E+020,0 +LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,false,state per centimeter joule,states per centimeter joule,1/(cm · J),1/(cm*J),100,0 +LinearDensityOfStates,-3,-1,2,0,0,0,0,false,true,false,false,false,false,state per meter joule,states per meter joule,1/(m · J),1/(m*J),1,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,gram per centimeter,grams per centimeter,g/cm,g/cm,0.1,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,gram per kilometer,grams per kilometer,g/km,g/km,0.000001,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,kilogram per meter,kilograms per meter,kg/m,kg/m,1,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,ounce per foot,ounces per foot,oz/ft,oz/ft,0.0930102362204724,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,ounce per inch,ounces per inch,oz/in,oz/in,1.11612283464567,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,pound per foot,pounds per foot,lb/ft,lb/ft,1.48816404199475,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,pound per inch,pounds per inch,lb/in,lb/in,17.857968503937,0 +LinearMassDensity,-1,1,0,0,0,0,0,false,false,false,false,false,false,pound per yard,pounds per yard,lb/yd,lb/yd,0.496054680664917,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per centimeter,per centimeter,cm⁻¹,cm^-1 (number density),100,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per decimeter,per decimeter,dm⁻¹,dm^-1 (number density),10,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per foot,per foot,ft⁻¹,ft^-1,3.28083989501312,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,foot (U.S. survey),foot (U.S. survey),ft (U.S. survey),ft (U.S. survey) (number density),3.28083343667959,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per inch,per inch,in⁻¹,in^-1,39.3700787401575,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per kilometer,per kilometer,km⁻¹,km^-1 (number density),0.001,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per meter,per meter,m⁻¹,m^-1 (number density),1,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per mile,per mile,mi⁻¹,mi^-1,0.000621371192237334,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per mile (U.S. survey),per mile (U.S. survey),mi⁻¹ (U.S. survey),mi^-1 (U.S. survey),0.000621370033933018,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per millimeter,per millimeter,mm⁻¹,mm^-1 (number density),1000,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per nautical mile,per nautical mile,M⁻¹,M^-1,0.000539956803455724,0 +LinearNumberDensity,-1,0,0,0,0,0,0,false,true,false,false,false,false,per yard,per yard,yd⁻¹,yd^-1,1.09361329833771,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per centimeter second,per centimeter second,cm⁻¹ · s⁻¹,cm^-1*s^-1,100,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per foot second,per foot second,ft⁻¹ · s⁻¹,ft^-1*s^-1,3.28083989501312,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per foot (U.S. survey) second,per foot (U.S. survey) second,ft⁻¹ (U.S. survey) · s⁻¹,ft^-1 (U.S. survey)*s^-1,3.28083343667959,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per inch second,per inch second,in⁻¹ · s⁻¹,in^-1*s^-1,39.3700787401575,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per kilometer second,per kilometer second,km⁻¹ · s⁻¹,km^-1*s^-1,0.001,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per meter second,per meter second,m⁻¹ · s⁻¹,m^-1*s^-1,1,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per mile second,per mile second,mi⁻¹ · s⁻¹,mi^-1*s^-1,0.000621371192237334,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per mile (U.S. survey) second,per mile (U.S. survey) second,mi⁻¹ (U.S. survey) · s⁻¹,mi^-1 (U.S. survey)*s^-1,0.000621370033933018,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per millimeter second,per millimeter second,mm⁻¹ · s⁻¹,mm^-1*s^-1,1000,0 +LinearNumberRate,-1,0,-1,0,0,0,0,false,true,false,false,false,false,per yard second,per yard second,yd⁻¹ · s⁻¹,yd^-1*s^-1,1.09361329833771,0 +LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per centimeter,watts per centimeter,W/cm,W/cm,100,0 +LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per meter,watts per meter,W/m,W/m,1,0 +LinearPowerDensity,1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per millimeter,watts per millimeter,W/mm,W/mm,1000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,attocandela per square meter,attocandelas per square meter,acd/m²,acd/m^2,1E-18,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square centimeter,candelas per square centimeter,cd/cm²,cd/cm^2,10000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square foot,candelas per square foot,cd/ft²,cd/ft^2,10.7639104167097,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square gigameter,candelas per square gigameter,cd/Gm²,cd/Gm^2,1E-18,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square inch,candelas per square inch,cd/in²,cd/in^2,1550.0031000062,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square kilometer,candelas per square kilometer,cd/km²,cd/km^2,0.000001,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square megameter,candelas per square megameter,cd/Mm²,cd/Mm^2,1E-12,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square meter,candelas per square meter,cd/m²,cd/m^2,1,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square micrometer,candelas per square micrometer,cd/µm²,cd/um^2,1000000000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square millimeter,candelas per square millimeter,cd/mm²,cd/mm^2,1000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square nanometer,candelas per square nanometer,cd/nm²,cd/nm^2,1E+018,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square picometer,candelas per square picometer,cd/pm²,cd/pm^2,1E+024,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,candela per square terameter,candelas per square terameter,cd/Tm²,cd/Tm^2,1E-24,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,centicandela per square meter,centicandelas per square meter,ccd/m²,ccd/m^2,0.01,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,decacandela per square meter,decacandelas per square meter,dacd/m²,dacd/m^2,10,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,decicandela per square meter,decicandelas per square meter,dcd/m²,dcd/m^2,0.1,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,exacandela per square meter,exacandelas per square meter,Ecd/m²,Ecd/m^2,1E+018,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,femtocandela per square meter,femtocandelas per square meter,fcd/m²,fcd/m^2,1E-15,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,footlambert,footlamberts,fl,fl,3.42625909963539,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,gigacandela per square meter,gigacandelas per square meter,Gcd/m²,Gcd/m^2,1000000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,hectocandela per square meter,hectocandelas per square meter,hcd/m²,hcd/m^2,100,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,kilocandela per square meter,kilocandelas per square meter,kcd/m²,kcd/m^2,1000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,lambert,lamberts,la,la,3183.09886183791,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,megacandela per square meter,megacandelas per square meter,Mcd/m²,Mcd/m^2,1000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,microcandela per square meter,microcandelas per square meter,µcd/m²,ucd/m^2,0.000001,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,millicandela per square meter,millicandelas per square meter,mcd/m²,mcd/m^2,0.001,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,nanocandela per square meter,nanocandelas per square meter,ncd/m²,ncd/m^2,0.000000001,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,petacandela per square meter,petacandelas per square meter,Pcd/m²,Pcd/m^2,1000000000000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,picocandela per square meter,picocandelas per square meter,pcd/m²,pcd/m^2,1E-12,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,stilb,stilbs,sb,sb,10000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,teracandela per square meter,teracandelas per square meter,Tcd/m²,Tcd/m^2,1000000000000,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,yoctocandela per square meter,yoctocandelas per square meter,ycd/m²,ycd/m^2,1E-24,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,yottacandela per square meter,yottacandelas per square meter,Ycd/m²,Ycd/m^2,1E+024,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,zeptocandela per square meter,zeptocandelas per square meter,zcd/m²,zcd/m^2,1E-21,0 +Luminance,-2,0,0,0,0,0,1,false,false,false,false,false,false,zettacandela per square meter,zettacandelas per square meter,Zcd/m²,Zcd/m^2,1E+021,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,attocandela,attocandelas,acd,acd,1E-18,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,candela,candelas,cd,cd,1,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,centicandela,centicandelas,ccd,ccd,0.01,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,decacandela,decacandelas,dacd,dacd,10,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,decicandela,decicandelas,dcd,dcd,0.1,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,exacandela,exacandelas,Ecd,Ecd,1E+018,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,femtocandela,femtocandelas,fcd,fcd,1E-15,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,gigacandela,gigacandelas,Gcd,Gcd,1000000000,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,hectocandela,hectocandelas,hcd,hcd,100,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,kilocandela,kilocandelas,kcd,kcd,1000,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,megacandela,megacandelas,Mcd,Mcd,1000000,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,microcandela,microcandelas,µcd,ucd,0.000001,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,millicandela,millicandelas,mcd,mcd,0.001,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,nanocandela,nanocandelas,ncd,ncd,0.000000001,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,petacandela,petacandelas,Pcd,Pcd,1000000000000000,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,picocandela,picocandelas,pcd,pcd,1E-12,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,teracandela,teracandelas,Tcd,Tcd,1000000000000,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,yoctocandela,yoctocandelas,ycd,ycd,1E-24,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,yottacandela,yottacandelas,Ycd,Ycd,1E+024,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,zeptocandela,zeptocandelas,zcd,zcd,1E-21,0 +LuminousIntensity,0,0,0,0,0,0,1,false,false,false,false,false,false,zettacandela,zettacandelas,Zcd,Zcd,1E+021,0 +MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,false,ampere per centimeter,amperes per centimeter,A/cm,A/cm,100,0 +MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,false,ampere per meter,amperes per meter,A/m,A/m,1,0 +MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,false,ampere per micrometer,amperes per micrometer,A/μm,A/um,1000000,0 +MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,false,ampere per millimeter,amperes per millimeter,A/mm,A/mm,1000,0 +MagneticFieldStrength,-1,0,0,1,0,0,0,false,false,false,false,false,false,oersted,oersteds,Oe,Oe,79.5774715459477,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,attoweber,attowebers,aWb,aWb,1E-18,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,centiweber,centiwebers,cWb,cWb,0.01,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,decaweber,decawebers,daWb,daWb,10,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,deciweber,deciwebers,dWb,dWb,0.1,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,exaweber,exawebers,EWb,EWb,1E+018,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,femtoweber,femtowebers,fWb,fWb,1E-15,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,gigaweber,gigawebers,GWb,GWb,1000000000,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,hectoweber,hectowebers,hWb,hWb,100,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,kiloweber,kilowebers,kWb,kWb,1000,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,maxwell,maxwells,Mx,Mx,0.00000001,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,megaweber,megawebers,MWb,MWb,1000000,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,microweber,microwebers,µWb,uWb,0.000001,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,milliweber,milliwebers,mWb,mWb,0.001,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,nanoweber,nanowebers,nWb,nWb,0.000000001,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,petaweber,petawebers,PWb,PWb,1000000000000000,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,picoweber,picowebers,pWb,pWb,1E-12,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,teraweber,terawebers,TWb,TWb,1000000000000,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,weber,webers,Wb,Wb,1,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,yoctoweber,yoctowebers,yWb,yWb,1E-24,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,yottaweber,yottawebers,YWb,YWb,1E+024,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,zeptoweber,zeptowebers,zWb,zWb,1E-21,0 +MagneticFlux,2,1,-2,-1,0,0,0,false,false,false,false,false,false,zettaweber,zettawebers,ZWb,ZWb,1E+021,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,attotesla,attoteslas,aT,aT,1E-18,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,centitesla,centiteslas,cT,cT,0.01,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,decatesla,decateslas,daT,daT,10,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,decitesla,deciteslas,dT,dT,0.1,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,exatesla,exateslas,ET,ET,1E+018,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,femtotesla,femtoteslas,fT,fT,1E-15,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,gamma,gammas,γ,Gamma,0.000000001,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,gauss,gauss,G,G,0.0001,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,gigatesla,gigateslas,GT,GT,1000000000,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,hectotesla,hectoteslas,hT,hT,100,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,kilotesla,kiloteslas,kT,kT,1000,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,megatesla,megateslas,MT,MT,1000000,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,microtesla,microteslas,µT,uT,0.000001,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,millitesla,milliteslas,mT,mT,0.001,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,nanotesla,nanoteslas,nT,nT,0.000000001,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,petatesla,petateslas,PT,PT,1000000000000000,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,picotesla,picoteslas,pT,pT,1E-12,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,teratesla,terateslas,TT,TT,1000000000000,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,tesla,teslas,T,T,1,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,yoctotesla,yoctoteslas,yT,yT,1E-24,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,yottatesla,yottateslas,YT,YT,1E+024,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,zeptotesla,zeptoteslas,zT,zT,1E-21,0 +MagneticFluxDensity,0,1,-2,-1,0,0,0,false,false,false,false,false,false,zettatesla,zettateslas,ZT,ZT,1E+021,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,ampere square centimeter,ampere square centimeters,A · cm²,A*cm^2,0.0001,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,ampere square meter,ampere square meters,A · m²,A*m^2,1,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,atomic unit of magnetic dipole moment, atomic units of magnetic dipole moment,ħ · e/mₑ,n<-*e/m\e,1.85480201566E-23,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,Bohr magneton,Bohr magnetons,µ(Bohr),u(Bohr),9.2740100783E-24,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,deuteron magnetic moment,deuteron magnetic moments,μ(deuteron),u(deuteron),4.330735094E-27,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,electron magnetic moment,electron magnetic moments,μₑ,u\e,-9.2847647043E-24,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,erg per gauss,ergs per gauss,erg/G,erg/G,0.001,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,helion magnetic moment,helion magnetic moments,μ(helion),u(helion),-1.074617532E-26,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,joule per tesla,joules per tesla,J/T,J/T,1,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,muon magnetic moment,muon magnetic moments,μ(muon),u(muon),-4.4904483E-26,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,neutron magnetic moment,neutron magnetic moments,μ(neutron),u(neutron),-9.6623651E-27,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,newton meter per tesla,newton meters per tesla,N · m/T,N*m/T,1,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,nuclear magneton,nuclear magnetons,μ(Nuclear),u(Nuclear),5.0507837461E-27,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,proton magnetic moment,proton magnetic moments,μ(proton),u(proton),1.41060679736E-26,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,shielded helion magnetic moment,shielded helion magnetic moments,μ’(helion),u'(helion),-1.07455309E-26,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,shielded proton magnetic moment,shielded proton magnetic moments,μ’(proton),u'(proton),1.41057056E-26,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,statampere square centimeter,statampere square centimeters,statA · cm²,statA*cm^2,3.335641E-14,0 +MagneticMoment,2,0,0,1,0,0,0,false,false,false,false,false,false,triton magnetic moment,triton magnetic moments,μ(triton),u(triton),1.5046095202E-26,0 +MagneticPermeability,1,1,-2,-2,0,0,0,false,false,false,false,false,false,henry per meter,henrys per meter,H/m,H/m,1,0 +MagneticPermeability,1,1,-2,-2,0,0,0,false,false,false,false,false,false,vacuum magnetic permeability,vacuum magnetic permeability,µ₀,u\0,1.25663706212E-06,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,attogram,attograms,ag,ag,1E-21,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,carat,carats,ct,ct,0.0002,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,centigram,centigrams,cg,cg,0.00001,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,dalton,daltons,Da,Da,1.6605390666E-27,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,decagram,decagrams,dag,dag,0.01,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,decigram,decigrams,dg,dg,0.0001,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,exagram,exagrams,Eg,Eg,1000000000000000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,femtogram,femtograms,fg,fg,1E-18,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,gigagram,gigagrams,Gg,Gg,1000000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,grain,grains,gr,gr,0.00006479891,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,gram,grams,g,g,0.001,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,hectogram,hectograms,hg,hg,0.1,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,hundredweight (long),hundredweight (long),cwt long,cwt long,50.80235,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,hundredweight (short),hundredweight (short),cwt short,cwt short,45.35924,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,kilogram,kilograms,kg,kg,1,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,megagram,megagrams,Mg,Mg,1000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,microgram,micrograms,µg,ug,0.000000001,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,milligram,milligrams,mg,mg,0.000001,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,nanogram,nanograms,ng,ng,1E-12,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,ounce,ounces,oz,oz,0.02834952,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,troy ounce,troy ounces,oz t,oz t,0.03110348,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,pennyweight,pennyweight,dwt,dwt,0.001555174,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,petagram,petagrams,Pg,Pg,1000000000000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,picogram,picograms,pg,pg,1E-15,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,pound,pounds,lb,lb,0.4535924,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,troy pound,troy pounds,lb t,lb t,0.3732417,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,slug,slugs,slug,slug,14.5939,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,teragram,teragrams,Tg,Tg,1000000000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,ton,tons,t,t,1000,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,assay ton,assay tons,AT,AT,0.02916667,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,long ton,long tons,2240 lb,2240 lb,1016.047,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,short ton,short tons,2000 lb,2000 lb,907.1847,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,yoctogram,yoctograms,yg,yg,1E-27,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,yottagram,yottagrams,Yg,Yg,1E+021,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,zeptogram,zeptograms,zg,zg,1E-24,0 +Mass,0,1,0,0,0,0,0,false,false,false,false,false,false,zettagram,zettagrams,Zg,Zg,1E+018,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,attogram per cubic meter,attograms per cubic meter,ag/m³,ag/m^3 (mass concentration),1E-21,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,centigram per cubic meter,centigrams per cubic meter,cg/m³,cg/m^3 (mass concentration),0.00001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,decagram per cubic meter,decagrams per cubic meter,dag/m³,dag/m^3 (mass concentration),0.01,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,decigram per cubic meter,decigrams per cubic meter,dg/m³,dg/m^3 (mass concentration),0.0001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,exagram per cubic meter,exagrams per cubic meter,Eg/m³,Eg/m^3 (mass concentration),1000000000000000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,femtogram per cubic decimeter,femtograms per cubic decimeter,fg/dm³,fg/dm^3 (mass concentration),1E-15,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,femtogram per cubic meter,femtograms per cubic meter,fg/m³,fg/m^3 (mass concentration),1E-18,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,femtogram per deciliter,femtograms per deciliter,fg/dL,fg/dL (mass concentration),1E-14,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,femtogram per liter,femtograms per liter,fg/L,fg/L (mass concentration),1E-15,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,femtogram per milliliter,femtograms per milliliter,fg/mL,fg/mL (mass concentration),1E-12,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gigagram per cubic meter,gigagrams per cubic meter,Gg/m³,Gg/m^3 (mass concentration),1000000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gram per cubic decimeter,grams per cubic decimeter,g/dm³,g/dm^3 (mass concentration),1,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gram per cubic meter,grams per cubic meter,g/m³,g/m^3 (mass concentration),0.001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gram per deciliter,grams per deciliter,g/dL,g/dL (mass concentration),10,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gram per liter,grams per liter,g/L,g/L (mass concentration),1,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,gram per milliliter,grams per milliliter,g/mL,g/mL (mass concentration),1000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,hectogram per cubic meter,hectograms per cubic meter,hg/m³,hg/m^3 (mass concentration),0.1,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,kilogram per cubic decimeter,kilograms per cubic decimeter,kg/dm³,kg/dm^3 (mass concentration),1000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,kilogram per cubic meter,kilograms per cubic meter,kg/m³,kg/m^3 (mass concentration),1,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,kilogram per deciliter,kilograms per deciliter,kg/dL,kg/dL (mass concentration),10000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,kilogram per liter,kilograms per liter,kg/L,kg/L (mass concentration),1000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,kilogram per milliliter,kilograms per milliliter,kg/mL,kg/mL (mass concentration),1000000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,megagram per cubic meter,megagrams per cubic meter,Mg/m³,Mg/m^3 (mass concentration),1000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,microgram per cubic decimeter,micrograms per cubic decimeter,μg/dm³,ug/dm^3 (mass concentration),0.000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,microgram per cubic meter,micrograms per cubic meter,µg/m³,ug/m^3 (mass concentration),0.000000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,microgram per deciliter,micrograms per deciliter,μg/dL,ug/dL (mass concentration),0.00001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,microgram per liter,micrograms per liter,μg/L,ug/L (mass concentration),0.000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,microgram per milliliter,micrograms per milliliter,μg/mL,ug/mL (mass concentration),0.001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,milligram per cubic decimeter,milligrams per cubic decimeter,mg/dm³,mg/dm^3 (mass concentration),0.001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,milligram per cubic meter,milligrams per cubic meter,mg/m³,mg/m^3 (mass concentration),0.000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,milligram per deciliter,milligrams per deciliter,mg/dL,mg/dL (mass concentration),0.01,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,milligram per liter,milligrams per liter,mg/L,mg/L (mass concentration),0.001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,milligram per milliliter,milligrams per milliliter,mg/mL,mg/mL (mass concentration),1,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,nanogram per cubic decimeter,nanograms per cubic decimeter,ng/dm³,ng/dm^3 (mass concentration),0.000000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,nanogram per cubic meter,nanograms per cubic meter,ng/m³,ng/m^3 (mass concentration),1E-12,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,nanogram per deciliter,nanograms per deciliter,ng/dL,ng/dL (mass concentration),0.00000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,nanogram per liter,nanograms per liter,ng/L,ng/L (mass concentration),0.000000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,nanogram per milliliter,nanograms per milliliter,ng/mL,ng/mL (mass concentration),0.000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,petagram per cubic meter,petagrams per cubic meter,Pg/m³,Pg/m^3 (mass concentration),1000000000000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,picogram per cubic decimeter,picograms per cubic decimeter,pg/dm³,pg/dm^3 (mass concentration),1E-12,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,picogram per cubic meter,picograms per cubic meter,pg/m³,pg/m^3 (mass concentration),1E-15,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,picogram per deciliter,picograms per deciliter,pg/dL,pg/dL (mass concentration),1E-11,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,picogram per liter,picograms per liter,pg/L,pg/L (mass concentration),1E-12,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,picogram per milliliter,picograms per milliliter,pg/mL,pg/mL (mass concentration),0.000000001,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,teragram per cubic meter,teragrams per cubic meter,Tg/m³,Tg/m^3 (mass concentration),1000000000,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,yoctogram per cubic meter,yoctograms per cubic meter,yg/m³,yg/m^3 (mass concentration),1E-27,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,yottagram per cubic meter,yottagrams per cubic meter,Yg/m³,Yg/m^3 (mass concentration),1E+021,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,zeptogram per cubic meter,zeptograms per cubic meter,zg/m³,zg/m^3 (mass concentration),1E-24,0 +MassConcentration,-3,1,0,0,0,0,0,false,true,false,false,false,false,zettagram per cubic meter,zettagrams per cubic meter,Zg/m³,Zg/m^3 (mass concentration),1E+018,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,attogram per cubic meter,attograms per cubic meter,ag/m³,ag/m^3,1E-21,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,carat per cubic meter,carats per cubic meter,ct/m³,ct/m^3,0.0002,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,centigram per cubic meter,centigrams per cubic meter,cg/m³,cg/m^3,0.00001,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,decagram per cubic meter,decagrams per cubic meter,dag/m³,dag/m^3,0.01,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,decigram per cubic meter,decigrams per cubic meter,dg/m³,dg/m^3,0.0001,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,exagram per cubic meter,exagrams per cubic meter,Eg/m³,Eg/m^3,1000000000000000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,femtogram per cubic meter,femtograms per cubic meter,fg/m³,fg/m^3,1E-18,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,gigagram per cubic meter,gigagrams per cubic meter,Gg/m³,Gg/m^3,1000000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,grain per cubic meter,grains per cubic meter,gr/m³,gr/m^3,0.00006479891,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,grain per gallon,grains per gallon,gr/gal,gr/gal,0.0171180600684945,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,gram per cubic centimeter,grams per cubic centimeter,g/cm³,g/cm^3,1000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,gram per cubic meter,grams per cubic meter,g/m³,g/m^3,0.001,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,hectogram per cubic meter,hectograms per cubic meter,hg/m³,hg/m^3,0.1,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,hundredweight (long) per cubic meter,hundredweight (long) per cubic meter,cwt long/m³,cwt long/m^3,50.80235,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,hundredweight (short) per cubic meter,hundredweight (short) per cubic meter,cwt short/m³,cwt short/m^3,45.35924,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,kilogram per cubic meter,kilograms per cubic meter,kg/m³,kg/m^3,1,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,megagram per cubic meter,megagrams per cubic meter,Mg/m³,Mg/m^3,1000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,microgram per cubic meter,micrograms per cubic meter,µg/m³,ug/m^3,0.000000001,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,milligram per cubic meter,milligrams per cubic meter,mg/m³,mg/m^3,0.000001,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,nanogram per cubic meter,nanograms per cubic meter,ng/m³,ng/m^3,1E-12,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,ounce per cubic inch,ounces per cubic inch,oz/in³,oz/in^3,1729.99427597141,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,ounce per cubic meter,ounces per cubic meter,oz/m³,oz/m^3,0.02834952,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,ounce per gallon,ounces per gallon,oz/gal,oz/gal,7.48915045442874,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,ounce per Imperial gallon,ounces per Imperial gallon,oz/gal (UK),oz/gal (UK),6.23602260403996,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,troy ounce per cubic meter,troy ounces per cubic meter,oz t/m³,oz t/m^3,0.03110348,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pennyweight per cubic meter,pennyweight per cubic meter,dwt/m³,dwt/m^3,0.001555174,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,petagram per cubic meter,petagrams per cubic meter,Pg/m³,Pg/m^3,1000000000000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,picogram per cubic meter,picograms per cubic meter,pg/m³,pg/m^3,1E-15,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per cubic foot,pounds per cubic foot,lb/ft³,lb/ft^3,16.01846250554,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per cubic inch,pounds per cubic inch,lb/in³,lb/in^3,27679.9132974432,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per cubic meter,pounds per cubic meter,lb/m³,lb/m^3,0.4535924,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per cubic yard,pounds per cubic yard,lb/yd³,lb/yd^3,0.593276427892882,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per gallon,pounds per gallon,lb/gal,lb/gal,119.826428404623,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,pound per Imperial gallon,pounds per Imperial gallon,lb/gal (UK),lb/gal (UK),99.7763792621791,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,troy pound per cubic meter,troy pounds per cubic meter,lb t/m³,lb t/m^3,0.3732417,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,slug per cubic foot,slugs per cubic foot,slug/ft³,slug/ft^3,515.378652639683,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,slug per cubic meter,slugs per cubic meter,slug/m³,slug/m^3,14.5939,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,teragram per cubic meter,teragrams per cubic meter,Tg/m³,Tg/m^3,1000000000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,assay ton per cubic meter,assay tons per cubic meter,AT/m³,AT/m^3,0.02916667,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,long ton per cubic meter,long tons per cubic meter,2240 lb/m³,2240 lb/m^3,1016.047,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,long ton per cubic yard,long tons per cubic yard,2240 lb/yd³,2240 lb/yd^3,1328.93922987087,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,ton per cubic meter,tons per cubic meter,t/m³,t/m^3,1000,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,short ton per cubic meter,short tons per cubic meter,2000 lb/m³,2000 lb/m^3,907.1847,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,short ton per cubic yard,short tons per cubic yard,2000 lb/yd³,2000 lb/yd^3,1186.55272499071,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,yoctogram per cubic meter,yoctograms per cubic meter,yg/m³,yg/m^3,1E-27,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,yottagram per cubic meter,yottagrams per cubic meter,Yg/m³,Yg/m^3,1E+021,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,zeptogram per cubic meter,zeptograms per cubic meter,zg/m³,zg/m^3,1E-24,0 +MassDensity,-3,1,0,0,0,0,0,false,false,false,false,false,false,zettagram per cubic meter,zettagrams per cubic meter,Zg/m³,Zg/m^3,1E+018,0 +MassFlux,-2,1,-1,0,0,0,0,false,false,false,false,false,false,gram per square centimeter second,grams per square centimeter second,g/(cm² · s),g/(cm^2*s),10,0 +MassFlux,-2,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram per square meter second,kilograms per square meter second,kg/(m² · s),kg/(m^2*s),1,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,centigram per joule,centigrams per joule,cg/J,cg/J,0.00001,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,decagram per joule,decagrams per joule,dag/J,dag/J,0.01,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,decigram per joule,decigrams per joule,dg/J,dg/J,0.0001,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gigagram per joule,gigagrams per joule,Gg/J,Gg/J,1000000,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gram per gigawatt hour,grams per gigawatt hour,g/GWh,g/GWh,2.77777777777778E-16,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gram per joule,grams per joule,g/J,g/J,0.001,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gram per kilowatt hour,grams per kilowatt hour,g/kWh,g/kWh,2.77777777777778E-10,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gram per megawatt hour,grams per megawatt hour,g/MWh,g/MWh,2.77777777777778E-13,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,gram per watt hour,grams per watt hour,g/Wh,g/Wh,2.77777777777778E-07,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,hectogram per joule,hectograms per joule,hg/J,hg/J,0.1,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,kilogram per gigawatt hour,kilograms per gigawatt hour,kg/GWh,kg/GWh,2.77777777777778E-13,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,kilogram per joule,kilograms per joule,kg/J,kg/J,1,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,kilogram per kilowatt hour,kilograms per kilowatt hour,kg/kWh,kg/kWh,2.77777777777778E-07,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,kilogram per megawatt hour,kilograms per megawatt hour,kg/MWh,kg/MWh,2.77777777777778E-10,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,kilogram per watt hour,kilograms per watt hour,kg/Wh,kg/Wh,0.000277777777777778,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,megagram per joule,megagrams per joule,Mg/J,Mg/J,1000,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,microgram per joule,micrograms per joule,µg/J,ug/J,0.000000001,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,milligram per joule,milligrams per joule,mg/J,mg/J,0.000001,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,pound per gigawatt hour,pounds per gigawatt hour,lb/GWh,lb/GWh,1.25997888888889E-13,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,pound per joule,pounds per joule,lb/J,lb/J,0.4535924,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,pound per kilowatt hour,pounds per kilowatt hour,lb/kWh,lb/kWh,1.25997888888889E-07,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,pound per megawatt hour,pounds per megawatt hour,lb/MWh,lb/MWh,1.25997888888889E-10,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,pound per watt hour,pounds per watt hour,lb/Wh,lb/Wh,0.000125997888888889,0 +MassPerEnergy,-2,0,2,0,0,0,0,false,false,false,false,false,false,teragram per joule,teragrams per joule,Tg/J,Tg/J,1000000000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,attogram per second,attograms per second,ag/s,ag/s,1E-21,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,carat per second,carats per second,ct/s,ct/s,0.0002,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,centigram per second,centigrams per second,cg/s,cg/s,0.00001,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,decagram per second,decagrams per second,dag/s,dag/s,0.01,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,decigram per second,decigrams per second,dg/s,dg/s,0.0001,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,exagram per second,exagrams per second,Eg/s,Eg/s,1000000000000000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,femtogram per second,femtograms per second,fg/s,fg/s,1E-18,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,gigagram per second,gigagrams per second,Gg/s,Gg/s,1000000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,grain per second,grains per second,gr/s,gr/s,0.00006479891,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,gram per day,grams per day,g/d,g/d,1.15740740740741E-08,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,gram per hour,grams per hour,g/h,g/h,2.77777777777778E-07,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,gram per minute,grams per minute,g/min,g/min,1.66666666666667E-05,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,gram per second,grams per second,g/s,g/s,0.001,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,hectogram per second,hectograms per second,hg/s,hg/s,0.1,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,hundredweight (long) per second,hundredweight (long) per second,cwt long/s,cwt long/s,50.80235,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,hundredweight (short) per second,hundredweight (short) per second,cwt short/s,cwt short/s,45.35924,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram per day,kilograms per day,kg/d,kg/d,1.15740740740741E-05,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram per hour,kilograms per hour,kg/h,kg/h,0.000277777777777778,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram per minute,kilograms per minute,kg/min,kg/min,0.0166666666666667,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram per second,kilograms per second,kg/s,kg/s,1,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,megagram per second,megagrams per second,Mg/s,Mg/s,1000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,microgram per second,micrograms per second,µg/s,ug/s,0.000000001,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,milligram per second,milligrams per second,mg/s,mg/s,0.000001,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,nanogram per second,nanograms per second,ng/s,ng/s,1E-12,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,ounce per second,ounces per second,oz/s,oz/s,0.02834952,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,troy ounce per second,troy ounces per second,oz t/s,oz t/s,0.03110348,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,pennyweight per second,pennyweight per second,dwt/s,dwt/s,0.001555174,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,petagram per second,petagrams per second,Pg/s,Pg/s,1000000000000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,picogram per second,picograms per second,pg/s,pg/s,1E-15,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,pound per day,pounds per day,lb/d,lb/d,5.24991203703704E-06,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,pound per hour,pounds per hour,lb/h,lb/h,0.000125997888888889,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,pound per minute,pounds per minute,lb/min,lb/min,0.00755987333333333,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,pound per second,pounds per second,lb/s,lb/s,0.4535924,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,troy pound per second,troy pounds per second,lb t/s,lb t/s,0.3732417,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,slug per second,slugs per second,slug/s,slug/s,14.5939,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,teragram per second,teragrams per second,Tg/s,Tg/s,1000000000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,assay ton per second,assay tons per second,AT/s,AT/s,0.02916667,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,long ton per second,long tons per second,2240 lb/s,2240 lb/s,1016.047,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,ton per day,tons per day,t/d,t/d,0.0115740740740741,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,ton per hour,tons per hour,t/h,t/h,0.277777777777778,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,ton per minute,tons per minute,t/min,t/min,16.6666666666667,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,ton per second,tons per second,t/s,t/s,1000,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,short ton per hour,short tons per hour,2000 lb/h,2000 lb/h,0.25199575,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,short ton per second,short tons per second,2000 lb/s,2000 lb/s,907.1847,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,yoctogram per second,yoctograms per second,yg/s,yg/s,1E-27,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,yottagram per second,yottagrams per second,Yg/s,Yg/s,1E+021,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,zeptogram per second,zeptograms per second,zg/s,zg/s,1E-24,0 +MassRate,0,1,-1,0,0,0,0,false,false,false,false,false,false,zettagram per second,zettagrams per second,Zg/s,Zg/s,1E+018,0 +Molality,0,-1,0,0,0,1,0,false,true,false,false,false,false,mole per kilogram,moles per kilogram,mol/kg,mol/kg,1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,attomole per cubic meter,attomoles per cubic meter,amol/m³,amol/m^3,1E-18,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,centimole per cubic meter,centimoles per cubic meter,cmol/m³,cmol/m^3,0.01,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,decamole per cubic meter,decamoles per cubic meter,damol/m³,damol/m^3,10,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,decimole per cubic meter,decimoles per cubic meter,dmol/m³,dmol/m^3,0.1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,examole per cubic meter,examoles per cubic meter,Emol/m³,Emol/m^3,1E+018,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,femtomole per cubic decimeter,femtomoles per cubic decimeter,fmol/dm³,fmol/dm^3,1E-12,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,femtomole per cubic meter,femtomoles per cubic meter,fmol/m³,fmol/m^3,1E-15,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,femtomole per deciliter,femtomoles per deciliter,fmol/dL,fmol/dL,1E-11,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,femtomole per liter,femtomoles per liter,fmol/L,fmol/L,1E-12,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,femtomole per milliliter,femtomoles per milliliter,fmol/mL,fmol/mL,0.000000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,gigamole per cubic meter,gigamoles per cubic meter,Gmol/m³,Gmol/m^3,1000000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,hectomole per cubic meter,hectomoles per cubic meter,hmol/m³,hmol/m^3,100,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,kilomole per cubic decimeter,kilomoles per cubic decimeter,kmol/dm³,kmol/dm^3,1000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,kilomole per cubic meter,kilomoles per cubic meter,kmol/m³,kmol/m^3,1000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,kilomole per deciliter,kilomoles per deciliter,kmol/dL,kmol/dL,10000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,kilomole per liter,kilomoles per liter,kmol/L,kmol/L,1000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,kilomole per milliliter,kilomoles per milliliter,kmol/mL,kmol/mL,1000000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,megamole per cubic meter,megamoles per cubic meter,Mmol/m³,Mmol/m^3,1000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,micromole per cubic decimeter,micromoles per cubic decimeter,μmol/dm³,umol/dm^3,0.001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,micromole per cubic meter,micromoles per cubic meter,µmol/m³,umol/m^3,0.000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,micromole per deciliter,micromoles per deciliter,μmol/dL,umol/dL,0.01,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,micromole per liter,micromoles per liter,μmol/L,umol/L,0.001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,micromole per milliliter,micromoles per milliliter,μmol/mL,umol/mL,1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,millimole per cubic decimeter,millimoles per cubic decimeter,mmol/dm³,mmol/dm^3,1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,millimole per cubic meter,millimoles per cubic meter,mmol/m³,mmol/m^3,0.001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,millimole per deciliter,millimoles per deciliter,mmol/dL,mmol/dL,10,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,millimole per liter,millimoles per liter,mmol/L,mmol/L,1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,millimole per milliliter,millimoles per milliliter,mmol/mL,mmol/mL,1000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,mole per cubic decimeter,moles per cubic decimeter,mol/dm³,mol/dm^3,1000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,mole per cubic meter,moles per cubic meter,mol/m³,mol/m^3,1,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,mole per deciliter,moles per deciliter,mol/dL,mol/dL,10000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,mole per liter,moles per liter,mol/L,mol/L,1000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,mole per milliliter,moles per milliliter,mol/mL,mol/mL,1000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,nanomole per cubic decimeter,nanomoles per cubic decimeter,nmol/dm³,nmol/dm^3,0.000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,nanomole per cubic meter,nanomoles per cubic meter,nmol/m³,nmol/m^3,0.000000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,nanomole per deciliter,nanomoles per deciliter,nmol/dL,nmol/dL,0.00001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,nanomole per liter,nanomoles per liter,nmol/L,nmol/L,0.000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,nanomole per milliliter,nanomoles per milliliter,nmol/mL,nmol/mL,0.001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,particle per cubic decimeter,particles per cubic decimeter,particle/dm³,particle/dm^3,1.66053906717385E-21,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,particle per cubic meter,particles per cubic meter,particle/m³,particle/m^3,1.66053906717385E-24,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,particle per deciliter,particles per deciliter,particle/dL,particle/dL,1.66053906717385E-20,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,particle per liter,particles per liter,particle/L,particle/L,1.66053906717385E-21,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,particle per milliliter,particles per milliliter,particle/mL,particle/mL,1.66053906717385E-18,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,petamole per cubic meter,petamoles per cubic meter,Pmol/m³,Pmol/m^3,1000000000000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,picomole per cubic decimeter,picomoles per cubic decimeter,pmol/dm³,pmol/dm^3,0.000000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,picomole per cubic meter,picomoles per cubic meter,pmol/m³,pmol/m^3,1E-12,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,picomole per deciliter,picomoles per deciliter,pmol/dL,pmol/dL,0.00000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,picomole per liter,picomoles per liter,pmol/L,pmol/L,0.000000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,picomole per milliliter,picomoles per milliliter,pmol/mL,pmol/mL,0.000001,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,teramole per cubic meter,teramoles per cubic meter,Tmol/m³,Tmol/m^3,1000000000000,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,yoctomole per cubic meter,yoctomoles per cubic meter,ymol/m³,ymol/m^3,1E-24,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,yottamole per cubic meter,yottamoles per cubic meter,Ymol/m³,Ymol/m^3,1E+024,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,zeptomole per cubic meter,zeptomoles per cubic meter,zmol/m³,zmol/m^3,1E-21,0 +MolarConcentration,-3,0,0,0,0,1,0,false,false,false,false,false,false,zettamole per cubic meter,zettamoles per cubic meter,Zmol/m³,Zmol/m^3,1E+021,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,attojoule per mole,attojoules per mole,aJ/mol,aJ/mol,1E-18,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,British thermal unit (39 °F) per mole,British thermal units (39 °F) per mole,Btu₃₉/mol,Btu\3\9/mol,1059.67,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,British thermal unit (59 °F) per mole,British thermal units (59 °F) per mole,Btu₅₉/mol,Btu\5\9/mol,1054.8,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,British thermal unit (60 °F) per mole,British thermal units (60 °F) per mole,Btu₆₀/mol,Btu\6\0/mol,1054.68,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,British thermal unit (IT) per mole,British thermal units (IT) per mole,Btu (IT)/mol,Btu (IT)/mol,1055.056,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,British thermal unit per mole,British thermal units per mole,Btu/mol,Btu/mol,1054.35,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,calorie (15 °C) per mole,calories (15 °C) per mole,cal₁₅/mol,Cal\15/mol,4.1858,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,calorie (20 °C) per mole,calories (20 °C) per mole,cal₂₀/mol,Cal\20/mol,4.1819,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,Calorie (IT) per mole,Calories (IT) per mole,Cal (IT)/mol,Cal (IT)/mol,4186.8,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,calorie (IT) per mole,calories (IT) per mole,cal (IT)/mol,cal (IT)/mol,4.1868,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,Calorie per mole,Calories per mole,Cal/mol,Cal/mol,4184,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,calorie per mole,calories per mole,cal/mol,cal/mol,4.184,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,centijoule per mole,centijoules per mole,cJ/mol,cJ/mol,0.01,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,decajoule per mole,decajoules per mole,daJ/mol,daJ/mol,10,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,decawatt hour per mole,decawatt hours per mole,daW · h/mol,daW*h/mol,36000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,decijoule per mole,decijoules per mole,dJ/mol,dJ/mol,0.1,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,electronvolt per mole,electronvolts per mole,eV/mol,eV/mol,1.602176634E-19,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,electronvolt per particle,electronvolts per particle,eV/particle,eV/particle,96485.33212331,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,erg per mole,ergs per mole,erg/mol,erg/mol,0.0000001,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,exajoule per mole,exajoules per mole,EJ/mol,EJ/mol,1E+018,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,femtojoule per mole,femtojoules per mole,fJ/mol,fJ/mol,1E-15,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,foot pound-force per mole,foot pounds-force per mole,ft · lbf/mol,ft*lbf/mol,1.355818,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,foot poundal per mole,foot poundals per mole,ft · pdl/mol,ft*pdl/mol,0.04214011,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,gigajoule per mole,gigajoules per mole,GJ/mol,GJ/mol,1000000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,gigawatt hour per mole,gigawatt hours per mole,GW · h/mol,GW*h/mol,3600000000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,hectojoule per mole,hectojoules per mole,hJ/mol,hJ/mol,100,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,hectowatt hour per mole,hectowatt hours per mole,hW · h/mol,hW*h/mol,360000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,joule per mole,joules per mole,J/mol,J/mol,1,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,joule per particle,joules per particle,J/particle,J/particle,6.02214076E+023,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,kilocalorie (IT) per mole,kilocalories (IT) per mole,kcal (IT)/mol,kcal (IT)/mol,4186.8,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,kilocalorie per mole,kilocalories per mole,kcal/mol,kcal/mol,4184,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,kilogram square meter per second squared mole,kilograms square meter per second squared mole,kg · m²/(s² · mol),kg*m^2/(s^2*mol),1,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,kilojoule per mole,kilojoules per mole,kJ/mol,kJ/mol,1000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,kilowatt hour per mole,kilowatt hours per mole,kW · h/mol,kW*h/mol,3600000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,megajoule per mole,megajoules per mole,MJ/mol,MJ/mol,1000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,megawatt hour per mole,megawatt hours per mole,MW · h/mol,MW*h/mol,3600000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,microjoule per mole,microjoules per mole,µJ/mol,uJ/mol,0.000001,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,microwatt hour per mole,microwatt hours per mole,µW · h/mol,uW*h/mol,0.0036,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,millijoule per mole,millijoules per mole,mJ/mol,mJ/mol,0.001,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,milliwatt hour per mole,milliwatt hours per mole,mW · h/mol,mW*h/mol,3.6,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,nanojoule per mole,nanojoules per mole,nJ/mol,nJ/mol,0.000000001,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,petajoule per mole,petajoules per mole,PJ/mol,PJ/mol,1000000000000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,petawatt hour per mole,petawatt hours per mole,PW · h/mol,PW*h/mol,3.6E+018,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,picojoule per mole,picojoules per mole,pJ/mol,pJ/mol,1E-12,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,quad per mole,quads per mole,10¹⁵ Btu (IT)/mol,10^15 Btu (IT)/mol,1.055056E+018,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,terajoule per mole,terajoules per mole,TJ/mol,TJ/mol,1000000000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,terawatt hour per mole,terawatt hours per mole,TW · h/mol,TW*h/mol,3600000000000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,therm (EC) per mole,therms (EC) per mole,thm (EC)/mol,thm (EC)/mol,105506000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,therm per mole,therms per mole,thm/mol,thm/mol,105480400,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,ton of TNT per mole,tons of TNT per mole,t of TNT/mol,t of TNT/mol,4184000000,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,watt hour per mole,watt hours per mole,W · h/mol,W*h/mol,3600,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,watt second per mole,watt seconds per mole,W · s/mol,W*s/mol,1,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,yoctojoule per mole,yoctojoules per mole,yJ/mol,yJ/mol,1E-24,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,yottajoule per mole,yottajoules per mole,YJ/mol,YJ/mol,1E+024,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,zeptojoule per mole,zeptojoules per mole,zJ/mol,zJ/mol,1E-21,0 +MolarEnergy,2,1,-2,0,0,-1,0,false,false,false,false,false,false,zettajoule per mole,zettajoules per mole,ZJ/mol,ZJ/mol,1E+021,0 +MolarFlux,-2,0,-1,0,0,1,0,false,false,false,false,false,false,mole per square meter second,moles per square meter second,mol/(m² · s),mol/(m^2*s),1,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,attojoule per kelvin mole,attojoules per kelvin mole,aJ/(K · mol),aJ/(K*mol),1E-18,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,British thermal unit (39 °F) per kelvin mole,British thermal units (39 °F) per kelvin mole,Btu₃₉/(K · mol),Btu\3\9/(K*mol),1059.67,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,British thermal unit (59 °F) per kelvin mole,British thermal units (59 °F) per kelvin mole,Btu₅₉/(K · mol),Btu\5\9/(K*mol),1054.8,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,British thermal unit (60 °F) per kelvin mole,British thermal units (60 °F) per kelvin mole,Btu₆₀/(K · mol),Btu\6\0/(K*mol),1054.68,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,British thermal unit (IT) per kelvin mole,British thermal units (IT) per kelvin mole,Btu (IT)/(K · mol),Btu (IT)/(K*mol),1055.056,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,British thermal unit per kelvin mole,British thermal units per kelvin mole,Btu/(K · mol),Btu/(K*mol),1054.35,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,calorie (15 °C) per kelvin mole,calories (15 °C) per kelvin mole,cal₁₅/(K · mol),cal\15/(K*mol),4.1858,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,calorie (20 °C) per kelvin mole,calories (20 °C) per kelvin mole,cal₂₀/(K · mol),cal\20/(K*mol),4.1819,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,Calorie (IT) per kelvin mole,Calories (IT) per kelvin mole,Cal (IT)/(K · mol),Cal (IT)/(K*mol),4186.8,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,calorie (IT) per kelvin mole,calories (IT) per kelvin mole,cal (IT)/(K · mol),cal (IT)/(K*mol),4.1868,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,Calorie per kelvin mole,Calories per kelvin mole,Cal/(K · mol),Cal/(K*mol),4184,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,calorie per kelvin mole,calories per kelvin mole,cal/(K · mol),cal/(K*mol),4.184,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,centijoule per kelvin mole,centijoules per kelvin mole,cJ/(K · mol),cJ/(K*mol),0.01,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,decajoule per kelvin mole,decajoules per kelvin mole,daJ/(K · mol),daJ/(K*mol),10,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,decijoule per kelvin mole,decijoules per kelvin mole,dJ/(K · mol),dJ/(K*mol),0.1,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,electronvolt per kelvin particle,electronvolts per kelvin particle,eV/(K · particle),eV/(K*particle),96485.33212331,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,exajoule per kelvin mole,exajoules per kelvin mole,EJ/(K · mol),EJ/(K*mol),1E+018,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,femtojoule per kelvin mole,femtojoules per kelvin mole,fJ/(K · mol),fJ/(K*mol),1E-15,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,gigajoule per kelvin mole,gigajoules per kelvin mole,GJ/(K · mol),GJ/(K*mol),1000000000,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,hectojoule per kelvin mole,hectojoules per kelvin mole,hJ/(K · mol),hJ/(K*mol),100,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,joule per kelvin mole,joules per kelvin mole,J/(K · mol),J/(K*mol),1,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,joule per kelvin particle,joules per kelvin particle,J/(K · particle),J/(K*particle),6.02214076E+023,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,kilocalorie (IT) per kelvin mole,kilocalories (IT) per kelvin mole,kcal (IT)/(K · mol),kcal (IT)/(K*mol),4186.8,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,kilocalorie per kelvin mole,kilocalories per kelvin mole,kcal/(K · mol),kcal/(K*mol),4184,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,kilojoule per kelvin mole,kilojoules per kelvin mole,kJ/(K · mol),kJ/(K*mol),1000,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,megajoule per kelvin mole,megajoules per kelvin mole,MJ/(K · mol),MJ/(K*mol),1000000,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,microjoule per kelvin mole,microjoules per kelvin mole,µJ/(K · mol),uJ/(K*mol),0.000001,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,millijoule per kelvin mole,millijoules per kelvin mole,mJ/(K · mol),mJ/(K*mol),0.001,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,molar gas constant,molar gas constants,R,R,8.314462618,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,nanojoule per kelvin mole,nanojoules per kelvin mole,nJ/(K · mol),nJ/(K*mol),0.000000001,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,petajoule per kelvin mole,petajoules per kelvin mole,PJ/(K · mol),PJ/(K*mol),1000000000000000,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,picojoule per kelvin mole,picojoules per kelvin mole,pJ/(K · mol),pJ/(K*mol),1E-12,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,terajoule per kelvin mole,terajoules per kelvin mole,TJ/(K · mol),TJ/(K*mol),1000000000000,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,yoctojoule per kelvin mole,yoctojoules per kelvin mole,yJ/(K · mol),yJ/(K*mol),1E-24,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,yottajoule per kelvin mole,yottajoules per kelvin mole,YJ/(K · mol),YJ/(K*mol),1E+024,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,zeptojoule per kelvin mole,zeptojoules per kelvin mole,zJ/(K · mol),zJ/(K*mol),1E-21,0 +MolarHeatCapacity,2,1,-2,0,-1,-1,0,false,false,false,false,false,false,zettajoule per kelvin mole,zettajoules per kelvin mole,ZJ/(K · mol),ZJ/(K*mol),1E+021,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,attogram per mole,attograms per mole,ag/mol,ag/mol,1E-21,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,centigram per mole,centigrams per mole,cg/mol,cg/mol,0.00001,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,decagram per mole,decagrams per mole,dag/mol,dag/mol,0.01,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,decigram per mole,decigrams per mole,dg/mol,dg/mol,0.0001,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,exagram per mole,exagrams per mole,Eg/mol,Eg/mol,1000000000000000,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,femtogram per mole,femtograms per mole,fg/mol,fg/mol,1E-18,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,gigagram per mole,gigagrams per mole,Gg/mol,Gg/mol,1000000,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,gram per mole,grams per mole,g/mol,g/mol,0.001,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,hectogram per mole,hectograms per mole,hg/mol,hg/mol,0.1,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,kilogram per mole,kilograms per mole,kg/mol,kg/mol,1,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,megagram per mole,megagrams per mole,Mg/mol,Mg/mol,1000,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,microgram per mole,micrograms per mole,µg/mol,ug/mol,0.000000001,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,milligram per mole,milligrams per mole,mg/mol,mg/mol,0.000001,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,nanogram per mole,nanograms per mole,ng/mol,ng/mol,1E-12,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,petagram per mole,petagrams per mole,Pg/mol,Pg/mol,1000000000000,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,picogram per mole,picograms per mole,pg/mol,pg/mol,1E-15,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,teragram per mole,teragrams per mole,Tg/mol,Tg/mol,1000000000,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,yoctogram per mole,yoctograms per mole,yg/mol,yg/mol,1E-27,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,yottagram per mole,yottagrams per mole,Yg/mol,Yg/mol,1E+021,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,zeptogram per mole,zeptograms per mole,zg/mol,zg/mol,1E-24,0 +MolarMass,0,1,0,0,0,-1,0,false,false,false,false,false,false,zettagram per mole,zettagrams per mole,Zg/mol,Zg/mol,1E+018,0 +MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,false,becquerel per mole,becquerels per mole,Bq/mol,Bq/mol,1,0 +MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,false,curie per mole,curies per mole,Ci/mol,Ci/mol,37000000000,0 +MolarRadioactivity,0,0,-1,0,0,-1,0,false,true,false,false,false,false,disintegration per minute per mole,disintegrations per minute per mole,dpm/mol,dpm/mol,0.0166666666666667,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic centimeter per mole,cubic centimeters per mole,cm³/mol,cm^3/mol,0.000001,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic decimeter per mole,cubic decimeters per mole,dm³/mol,dm^3/mol,0.001,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic meter per mole,cubic meters per mole,m³/mol,m^3/mol,1,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic meter per particle,cubic meters per particle,m³/particle,m^3/particle,6.02214076E+023,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic micrometer per particle,cubic micrometers per particle,µm³/particle,um^3/particle,602214.076,0 +MolarVolume,3,0,0,0,0,-1,0,false,false,false,false,false,false,cubic nanometer per particle,cubic nanometers per particle,nm³/particle,nm^3/particle,0.000602214076,0 +MomentOfInertia,2,1,0,0,0,0,0,false,false,false,false,false,false,dalton square ångström,dalton square ångströms,Da · Ų,Da*ang^2,1.6605390666E-47,0 +MomentOfInertia,2,1,0,0,0,0,0,false,false,false,false,false,false,kilogram square meter,kilogram square meters,kg · m²,kg*m^2,1,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,attogram meter per second,attogram meters per second,ag · m/s,ag*m/s,1E-21,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,centigram meter per second,centigram meters per second,cg · m/s,cg*m/s,0.00001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,decagram meter per second,decagram meters per second,dag · m/s,dag*m/s,0.01,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,decigram meter per second,decigram meters per second,dg · m/s,dg*m/s,0.0001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,exagram meter per second,exagram meters per second,Eg · m/s,Eg*m/s,1000000000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,femtogram meter per second,femtogram meters per second,fg · m/s,fg*m/s,1E-18,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,gigagram meter per second,gigagram meters per second,Gg · m/s,Gg*m/s,1000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,gram meter per second,gram meters per second,g · m/s,g*m/s,0.001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,hectogram meter per second,hectogram meters per second,hg · m/s,hg*m/s,0.1,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram attometer per second,kilogram attometers per second,kg · am/s,kg*am/s,1E-18,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram centimeter per second,kilogram centimeters per second,kg · cm/s,kg*cm/s,0.01,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram decameter per second,kilogram decameters per second,kg · dam/s,kg*dam/s,10,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram decimeter per second,kilogram decimeters per second,kg · dm/s,kg*dm/s,0.1,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram exameter per second,kilogram exameters per second,kg · Em/s,kg*Em/s,1E+018,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram femtometer per second,kilogram femtometers per second,kg · fm/s,kg*fm/s,1E-15,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram gigameter per second,kilogram gigameters per second,kg · Gm/s,kg*Gm/s,1000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram hectometer per second,kilogram hectometers per second,kg · hm/s,kg*hm/s,100,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram kilometer per second,kilogram kilometers per second,kg · km/s,kg*km/s,1000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram megameter per second,kilogram megameters per second,kg · Mm/s,kg*Mm/s,1000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram meter per day,kilogram meters per day,kg · m/d,kg*m/d,1.15740740740741E-05,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram meter per hour,kilogram meters per hour,kg · m/h,kg*m/h,0.000277777777777778,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram meter per minute,kilogram meters per minute,kg · m/min,kg*m/min,0.0166666666666667,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram meter per second,kilogram meters per second,kg · m/s,kg*m/s,1,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram micrometer per second,kilogram micrometers per second,kg · µm/s,kg*um/s,0.000001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram millimeter per second,kilogram millimeters per second,kg · mm/s,kg*mm/s,0.001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram nanometer per second,kilogram nanometers per second,kg · nm/s,kg*nm/s,0.000000001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram petameter per second,kilogram petameters per second,kg · Pm/s,kg*Pm/s,1000000000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram picometer per second,kilogram picometers per second,kg · pm/s,kg*pm/s,1E-12,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram terameter per second,kilogram terameters per second,kg · Tm/s,kg*Tm/s,1000000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram yoctometer per second,kilogram yoctometers per second,kg · ym/s,kg*ym/s,1E-24,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram yottameter per second,kilogram yottameters per second,kg · Ym/s,kg*Ym/s,1E+024,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram zeptometer per second,kilogram zeptometers per second,kg · zm/s,kg*zm/s,1E-21,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,kilogram zettameter per second,kilogram zettameters per second,kg · Zm/s,kg*Zm/s,1E+021,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,megagram meter per second,megagram meters per second,Mg · m/s,Mg*m/s,1000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,microgram meter per second,microgram meters per second,µg · m/s,ug*m/s,0.000000001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,milligram meter per second,milligram meters per second,mg · m/s,mg*m/s,0.000001,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,nanogram meter per second,nanogram meters per second,ng · m/s,ng*m/s,1E-12,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,petagram meter per second,petagram meters per second,Pg · m/s,Pg*m/s,1000000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,picogram meter per second,picogram meters per second,pg · m/s,pg*m/s,1E-15,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,pound foot per second,pound feet per second,lb · ft/s,lb*ft/s,0.13825496352,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,pound inch per second,pound inches per second,lb · in/s,lb*in/s,0.01152124696,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,slug foot per second,slug feet per second,slug · ft/s,slug*ft/s,4.44822072,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,slug inch per second,slug inches per second,slug · in/s,slug*in/s,0.37068506,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,teragram meter per second,teragram meters per second,Tg · m/s,Tg*m/s,1000000000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,ton meter per second,ton meters per second,t · m/s,t*m/s,1000,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,yoctogram meter per second,yoctogram meters per second,yg · m/s,yg*m/s,1E-27,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,yottagram meter per second,yottagram meters per second,Yg · m/s,Yg*m/s,1E+021,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,zeptogram meter per second,zeptogram meters per second,zg · m/s,zg*m/s,1E-24,0 +Momentum,1,1,-1,0,0,0,0,false,false,false,false,false,false,zettagram meter per second,zettagram meters per second,Zg · m/s,Zg*m/s,1E+018,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,attowatt,attowatts,aW,aW,1E-18,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,centiwatt,centiwatts,cW,cW,0.01,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,decawatt,decawatts,daW,daW,10,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,deciwatt,deciwatts,dW,dW,0.1,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,erg per second,ergs per second,erg/s,erg/s,0.0000001,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,exawatt,exawatts,EW,EW,1E+018,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,femtowatt,femtowatts,fW,fW,1E-15,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per hour,foot pounds-force per hour,ft · lbf/h,ft*lbf/h,0.000376616111111111,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per minute,foot pounds-force per minute,ft · lbf/min,ft*lbf/min,0.0225969666666667,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per second,foot pounds-force per second,ft · lbf/s,ft*lbf/s,1.355818,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,gigawatt,gigawatts,GW,GW,1000000000,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,hectowatt,hectowatts,hW,hW,100,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,horsepower,horsepower,hp,hp,745.6999,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,horsepower (boiler),horsepower (boiler),hp (S),hp (S),9809.5,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,horsepower (electric),horsepower (electric),hp (E),hp (E),746,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,horsepower (Imperial),horsepower (Imperial),hp (I),hp (I),745.7,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,metric horsepower,metric horsepower,hp (M),hp (M),735.4988,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,hydraulic horsepower,hydraulic horsepower,hp (hydraulic),hp (hydraulic),746.043,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,kilowatt,kilowatts,kW,kW,1000,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,megawatt,megawatts,MW,MW,1000000,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,microwatt,microwatts,µW,uW,0.000001,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,milliwatt,milliwatts,mW,mW,0.001,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,nanowatt,nanowatts,nW,nW,0.000000001,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,petawatt,petawatts,PW,PW,1000000000000000,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,picowatt,picowatts,pW,pW,1E-12,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,terawatt,terawatts,TW,TW,1000000000000,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,watt,watts,W,W,1,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,yoctowatt,yoctowatts,yW,yW,1E-24,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,yottawatt,yottawatts,YW,YW,1E+024,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,zeptowatt,zeptowatts,zW,zW,1E-21,0 +Power,2,1,-3,0,0,0,0,false,false,false,false,false,false,zettawatt,zettawatts,ZW,ZW,1E+021,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,attowatt per second,attowatts per second,aW/s,aW/s,1E-18,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,centiwatt per second,centiwatts per second,cW/s,cW/s,0.01,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,decawatt per second,decawatts per second,daW/s,daW/s,10,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,deciwatt per second,deciwatts per second,dW/s,dW/s,0.1,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,erg per second squared,ergs per second squared,erg/s²,erg/s^2,0.0000001,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,exawatt per second,exawatts per second,EW/s,EW/s,1E+018,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,femtowatt per second,femtowatts per second,fW/s,fW/s,1E-15,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,foot pound-force per second squared,foot pounds-force per second squared,ft · lbf/s²,ft*lbf/s^2,1.355818,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,gigawatt per second,gigawatts per second,GW/s,GW/s,1000000000,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,hectowatt per second,hectowatts per second,hW/s,hW/s,100,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,horsepower per second,horsepower per second,hp/s,hp/s,745.6999,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,horsepower per second (boiler),horsepower per second (boiler),hp/s (S),hp/s (S),9809.5,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,horsepower per second (electric),horsepower per second (electric),hp/s (E),hp/s (E),746,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,horsepower per second (Imperial),horsepower per second (Imperial),hp/s (I),hp/s (I),745.7,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,metric horsepower per second,metric horsepower per second,hp/s (M),hp/s (M),735.4988,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,hydraulic horsepower per second,hydraulic horsepower per second,hp/s (hydraulic),hp/s (hydraulic),746.043,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,kilowatt per second,kilowatts per second,kW/s,kW/s,1000,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,megawatt per second,megawatts per second,MW/s,MW/s,1000000,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,microwatt per second,microwatts per second,µW/s,uW/s,0.000001,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,milliwatt per second,milliwatts per second,mW/s,mW/s,0.001,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,nanowatt per second,nanowatts per second,nW/s,nW/s,0.000000001,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,petawatt per second,petawatts per second,PW/s,PW/s,1000000000000000,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,picowatt per second,picowatts per second,pW/s,pW/s,1E-12,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,terawatt per second,terawatts per second,TW/s,TW/s,1000000000000,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,watt per second,watts per second,W/s,W/s,1,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,yoctowatt per second,yoctowatts per second,yW/s,yW/s,1E-24,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,yottawatt per second,yottawatts per second,YW/s,YW/s,1E+024,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,zeptowatt per second,zeptowatts per second,zW/s,zW/s,1E-21,0 +PowerRate,2,1,-4,0,0,0,0,false,false,false,false,false,false,zettawatt per second,zettawatts per second,ZW/s,ZW/s,1E+021,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,atmosphere,atmospheres,atm,atm,101325,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,atmosphere (technical),atmospheres (technical),at,at,98066.5,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,attopascal,attopascals,aPa,aPa,1E-18,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,bar,bar,bar,bar,100000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,centimeter of mercury,centimeters of mercury,cm Hg,cm Hg,1333.224,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,centimeter of mercury (0 °C),centimeters of mercury (0 °C),cm Hg (0 °C),cm Hg (0 degC),1333.22,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,centimeter of water,centimeters of water,cm H₂O,cm H\2O,98.0665,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,centimeter of water (4 °C),centimeters of water (4 °C),cm H₂O (4 °C),cm H\2O (4 degC),98.0638,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,centipascal,centipascals,cPa,cPa,0.01,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,decapascal,decapascals,daPa,daPa,10,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,decipascal,decipascals,dPa,dPa,0.1,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,dyne per square centimeter,dynes per square centimeter,dyn/cm²,dyn/cm^2,0.1,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,exapascal,exapascals,EPa,EPa,1E+018,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,femtopascal,femtopascals,fPa,fPa,1E-15,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,foot of mercury,feet of mercury,ft Hg,ft Hg,40636.66,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,foot of water,feet of water,ft H₂O,ft H\2O,2989.067,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,foot of water (39.2 °F),feet of water (39.2 °F),ft H₂O (39.2 °F),ft H\2O (39.2 degF),2988.98,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,gigapascal,gigapascals,GPa,GPa,1000000000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,gram-force per square centimeter,grams-force per square centimeter,gf/cm²,gf/cm^2,98.0665,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,hectopascal,hectopascals,hPa,hPa,100,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of mercury,inches of mercury,in Hg,in Hg,3386.389,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of mercury (32 °F),inches of mercury (32 °F),in Hg (32 °F),in Hg (32 degF),3386.38,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of mercury (60 °F),inches of mercury (60 °F),in Hg (60 °F),in Hg (60 degF),3376.85,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of water,inches of water,in H₂O,in H\2O,249.0889,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of water (39.2 °F),inches of water (39.2 °F),in H₂O (39.2 °F),in H\2O (39.2 degF),249.082,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,inch of water (60 °F),inches of water (60 °F),in H₂O (60 °F),in H\2O (60 degF),248.84,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,kilogram-force per square centimeter,kilograms-force per square centimeter,kgf/cm²,kgf/cm^2,98066.5,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,kilogram-force per square meter,kilograms-force per square meter,kgf/m²,kgf/m^2,9.80665,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,kilogram-force per square millimeter,kilograms-force per square millimeter,kgf/mm²,kgf/mm^2,9806650,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,kilopascal,kilopascals,kPa,kPa,1000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,kip per square inch,kips per square inch,kip/in²,kip/in^2,6894757.88951578,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,megapascal,megapascals,MPa,MPa,1000000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,micropascal,micropascals,µPa,uPa,0.000001,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,millibar,millibar,mbar,mbar,100,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,millimeter of mercury,millimeters of mercury,mm Hg,mm Hg,133.3224,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,millimeter of water,millimeters of water,mm H₂O,mm H\2O,9.80665,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,millipascal,millipascals,mPa,mPa,0.001,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,millitorr,millitorr,mTorr,mTorr,0.1333224,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,nanopascal,nanopascals,nPa,nPa,0.000000001,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,newton per square millimeter,newtons per square millimeter,N/mm²,N/mm^2,1000000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,pascal,pascals,Pa,Pa,1,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,petapascal,petapascals,PPa,PPa,1000000000000000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,picopascal,picopascals,pPa,pPa,1E-12,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,pound-force per square foot,pounds-force per square foot,lbf/ft²,lbf/ft^2,47.8802631216374,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,pound-force per square inch,pounds-force per square inch,lbf/in²,lbf/in^2,6894.75788951578,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,poundal per square foot,poundals per square foot,pdl/ft²,pdl/ft^2,1.4881644346622,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,pound-force per square inch,pounds-force per square inch,psi,psi,6894.757,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,terapascal,terapascals,TPa,TPa,1000000000000,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,torr,torr,Torr,Torr,133.3224,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,yoctopascal,yoctopascals,yPa,yPa,1E-24,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,yottapascal,yottapascals,YPa,YPa,1E+024,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,zeptopascal,zeptopascals,zPa,zPa,1E-21,0 +Pressure,-1,1,-2,0,0,0,0,false,false,false,false,false,false,zettapascal,zettapascals,ZPa,ZPa,1E+021,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,attojoule per square meter,attojoules per square meter,aJ/m²,aJ/m^2,1E-18,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,centijoule per square centimeter,centijoules per square centimeter,cJ/cm²,cJ/cm^2,100,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,centijoule per square meter,centijoules per square meter,cJ/m²,cJ/m^2,0.01,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,centijoule per square millimeter,centijoules per square millimeter,cJ/mm²,cJ/mm^2,10000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decajoule per square centimeter,decajoules per square centimeter,daJ/cm²,daJ/cm^2,100000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decajoule per square meter,decajoules per square meter,daJ/m²,daJ/m^2,10,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decajoule per square millimeter,decajoules per square millimeter,daJ/mm²,daJ/mm^2,10000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decijoule per square centimeter,decijoules per square centimeter,dJ/cm²,dJ/cm^2,1000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decijoule per square meter,decijoules per square meter,dJ/m²,dJ/m^2,0.1,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,decijoule per square millimeter,decijoules per square millimeter,dJ/mm²,dJ/mm^2,100000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,exajoule per square meter,exajoules per square meter,EJ/m²,EJ/m^2,1E+018,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,femtojoule per square meter,femtojoules per square meter,fJ/m²,fJ/m^2,1E-15,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,gigajoule per square centimeter,gigajoules per square centimeter,GJ/cm²,GJ/cm^2,10000000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,gigajoule per square meter,gigajoules per square meter,GJ/m²,GJ/m^2,1000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,gigajoule per square millimeter,gigajoules per square millimeter,GJ/mm²,GJ/mm^2,1000000000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,hectojoule per square centimeter,hectojoules per square centimeter,hJ/cm²,hJ/cm^2,1000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,hectojoule per square meter,hectojoules per square meter,hJ/m²,hJ/m^2,100,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,hectojoule per square millimeter,hectojoules per square millimeter,hJ/mm²,hJ/mm^2,100000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,joule per square centimeter,joules per square centimeter,J/cm²,J/cm^2,10000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,joule per square meter,joules per square meter,J/m²,J/m^2,1,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,joule per square millimeter,joules per square millimeter,J/mm²,J/mm^2,1000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,kilojoule per square centimeter,kilojoules per square centimeter,kJ/cm²,kJ/cm^2,10000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,kilojoule per square meter,kilojoules per square meter,kJ/m²,kJ/m^2,1000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,kilojoule per square millimeter,kilojoules per square millimeter,kJ/mm²,kJ/mm^2,1000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,megajoule per square centimeter,megajoules per square centimeter,MJ/cm²,MJ/cm^2,10000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,megajoule per square meter,megajoules per square meter,MJ/m²,MJ/m^2,1000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,megajoule per square millimeter,megajoules per square millimeter,MJ/mm²,MJ/mm^2,1000000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,microjoule per square centimeter,microjoules per square centimeter,µJ/cm²,uJ/cm^2,0.01,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,microjoule per square meter,microjoules per square meter,µJ/m²,uJ/m^2,0.000001,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,microjoule per square millimeter,microjoules per square millimeter,µJ/mm²,uJ/mm^2,1,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,millijoule per square centimeter,millijoules per square centimeter,mJ/cm²,mJ/cm^2,10,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,millijoule per square meter,millijoules per square meter,mJ/m²,mJ/m^2,0.001,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,millijoule per square millimeter,millijoules per square millimeter,mJ/mm²,mJ/mm^2,1000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,nanojoule per square centimeter,nanojoules per square centimeter,nJ/cm²,nJ/cm^2,0.00001,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,nanojoule per square meter,nanojoules per square meter,nJ/m²,nJ/m^2,0.000000001,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,nanojoule per square millimeter,nanojoules per square millimeter,nJ/mm²,nJ/mm^2,0.001,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,petajoule per square meter,petajoules per square meter,PJ/m²,PJ/m^2,1000000000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,picojoule per square meter,picojoules per square meter,pJ/m²,pJ/m^2,1E-12,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,terajoule per square meter,terajoules per square meter,TJ/m²,TJ/m^2,1000000000000,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,yoctojoule per square meter,yoctojoules per square meter,yJ/m²,yJ/m^2,1E-24,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,yottajoule per square meter,yottajoules per square meter,YJ/m²,YJ/m^2,1E+024,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,zeptojoule per square meter,zeptojoules per square meter,zJ/m²,zJ/m^2,1E-21,0 +RadiantExposure,0,1,-2,0,0,0,0,false,false,false,false,false,false,zettajoule per square meter,zettajoules per square meter,ZJ/m²,ZJ/m^2,1E+021,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,becquerel,becquerels,Bq,Bq,1,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,curie,curies,Ci,Ci,37000000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,decabecquerel,decabecquerels,daBq,daBq,10,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,disintegration per minute,disintegrations per minute,dpm,dpm,0.0166666666666667,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,exabecquerel,exabecquerels,EBq,EBq,1E+018,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,gigabecquerel,gigabecquerels,GBq,GBq,1000000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,gigacurie,gigacuries,GCi,GCi,3.7E+019,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,hectobecquerel,hectobecquerels,hBq,hBq,100,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,kilobecquerel,kilobecquerels,kBq,kBq,1000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,kilocurie,kilocuries,kCi,kCi,37000000000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,megabecquerel,megabecquerels,MBq,MBq,1000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,megacurie,megacuries,MCi,MCi,3.7E+016,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,microbecquerel,microbecquerels,µBq,uBq,0.000001,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,microcurie,microcuries,µCi,uCi,37000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,millibecquerel,millibecquerels,mBq,mBq,0.001,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,millicurie,millicuries,mCi,mCi,37000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,nanobecquerel,nanobecquerels,nBq,nBq,0.000000001,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,nanocurie,nanocuries,nCi,nCi,37,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,petabecquerel,petabecquerels,PBq,PBq,1000000000000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,terabecquerel,terabecquerels,TBq,TBq,1000000000000,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,yottabecquerel,yottabecquerels,YBq,YBq,1E+024,0 +Radioactivity,0,0,-1,0,0,0,0,false,true,false,false,false,false,zettabecquerel,zettabecquerels,ZBq,ZBq,1E+021,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,basis point,basis points,bp,bp,0.0001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per billion,parts per billion,ppb,ppb,0.000000001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per hundred,parts per hundred,parts per hundred,parts per hundred,0.01,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per million,parts per million,ppm,ppm (ratio),0.000001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per quadrillion,parts per quadrillion,ppq,ppq,1E-15,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per then thousand,parts per ten thousand,parts per ten thousand,parts per ten thousand,0.0001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per thousand,parts per thousand,parts per thousand,parts per thousand,0.001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,part per trillion,parts per trillion,ppt,ppt,1E-12,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,per mille,per mille,‰,%\0,0.001,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,percent,percent,%,%,0.01,0 +Number,0,0,0,0,0,0,0,false,false,false,false,false,false,number,number,,,1,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,diopter,diopters,dpt,dpt,1,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal ångström,reciprocal ångströms,Å⁻¹,ang^-1,10000000000,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal centimeter,reciprocal centimeters,cm⁻¹,cm^-1,100,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal decimeter,reciprocal decimeters,dm⁻¹,dm^-1,10,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal kilometer,reciprocal kilometers,km⁻¹,km^-1,0.001,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal meter,reciprocal meters,m⁻¹,m^-1,1,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal micrometer,reciprocal micrometers,µm⁻¹,um^-1,1000000,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal millimeter,reciprocal millimeters,mm⁻¹,mm^-1,1000,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,reciprocal nanometer,reciprocal nanometers,nm⁻¹,nm^-1,1000000000,0 +ReciprocalLength,-1,0,0,0,0,0,0,false,false,false,false,false,false,Rydberg constant,Rydberg constants,R∞,Rinfinity,10973731.56816,0 +SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,false,spat,spats,sp,sp,12.5663706143592,0 +SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,false,square degree,square degrees,°²,deg^2,0.000304617419786709,0 +SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,false,square minute,square minutes,′²,angle_minute^2,8.46159499407524E-08,0 +SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,false,square second,square seconds,″²,angle_second^2,2.35044305390979E-11,0 +SolidAngle,2,-1,0,0,0,0,0,false,false,false,true,false,false,steradian,steradians,sr,sr,1,0 +SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,false,square centimeter per gram,square centimeters per gram,cm²/g,cm^2/g,0.1,0 +SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,false,square centimeter per kilogram,square centimeters per kilogram,cm²/kg,cm^2/kg,0.0001,0 +SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,false,square meter per gram,square meters per gram,m²/g,m^2/g,1000,0 +SpecificArea,2,-1,0,0,0,0,0,false,false,false,false,false,false,square meter per kilogram,square meters per kilogram,m²/kg,m^2/kg,1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,attojoule per kilogram kelvin,attojoules per kilogram kelvin,aJ/(kg · K),aJ/(kg*K),1E-18,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per ounce degree Fahrenheit,British thermal units (IT) per ounce degree Fahrenheit,Btu (IT)/(oz · °F),Btu (IT)/(oz*degF),66988.8167418708,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per pound degree Fahrenheit,British thermal units (IT) per pound degree Fahrenheit,Btu (IT)/(lb · °F),Btu (IT)/(lb*degF),4186.80030794167,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit (IT) per ton degree Fahrenheit,British thermal units (IT) per ton degree Fahrenheit,Btu (IT)/(t · °F),Btu (IT)/(t*degF),1.8991008,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit per ounce degree Fahrenheit,British thermal units per ounce degree Fahrenheit,Btu/(oz · °F),Btu/(oz*degF),66943.990586084,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit per pound degree Fahrenheit,British thermal units per pound degree Fahrenheit,Btu/(lb · °F),Btu/(lb*degF),4183.99867369912,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,British thermal unit per ton degree Fahrenheit,British thermal units per ton degree Fahrenheit,Btu/(t · °F),Btu/(t*degF),1.89783,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,calorie per gram kelvin,calories per gram kelvin,cal/(g · K),cal/(g*K),4184,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,calorie per kilogram kelvin,calories per kilogram kelvin,cal/(kg · K),cal/(kg*K),4.184,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,centijoule per kilogram kelvin,centijoules per kilogram kelvin,cJ/(kg · K),cJ/(kg*K),0.01,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,decajoule per kilogram kelvin,decajoules per kilogram kelvin,daJ/(kg · K),daJ/(kg*K),10,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,decijoule per kilogram kelvin,decijoules per kilogram kelvin,dJ/(kg · K),dJ/(kg*K),0.1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,exajoule per kilogram kelvin,exajoules per kilogram kelvin,EJ/(kg · K),EJ/(kg*K),1E+018,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,femtojoule per kilogram kelvin,femtojoules per kilogram kelvin,fJ/(kg · K),fJ/(kg*K),1E-15,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,gigajoule per kilogram kelvin,gigajoules per kilogram kelvin,GJ/(kg · K),GJ/(kg*K),1000000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,hectojoule per kilogram kelvin,hectojoules per kilogram kelvin,hJ/(kg · K),hJ/(kg*K),100,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,joule per gram degree celsius,joules per gram degree celsius,J/(g · °C),J/(g*degC),1000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,joule per kilogram degree celsius,joules per kilogram degree celsius,J/(kg · °C),J/(kg*degC),1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,joule per kilogram kelvin,joules per kilogram kelvin,J/(kg · K),J/(kg*K),1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,kilojoule per gram degree celsius,kilojoules per gram degree celsius,kJ/(g · °C),kJ/(g*degC),1000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,kilojoule per kilogram degree celsius,kilojoules per kilogram degree celsius,kJ/(kg · °C),kJ/(kg*degC),1000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,kilojoule per kilogram kelvin,kilojoules per kilogram kelvin,kJ/(kg · K),kJ/(kg*K),1000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,megajoule per kilogram kelvin,megajoules per kilogram kelvin,MJ/(kg · K),MJ/(kg*K),1000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,microjoule per kilogram kelvin,microjoules per kilogram kelvin,µJ/(kg · K),uJ/(kg*K),0.000001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,millijoule per gram degree celsius,millijoules per gram degree celsius,mJ/(g · °C),mJ/(g*degC),1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,millijoule per kilogram degree celsius,millijoules per kilogram degree celsius,mJ/(kg · °C),mJ/(kg*degC),0.001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,millijoule per kilogram kelvin,millijoules per kilogram kelvin,mJ/(kg · K),mJ/(kg*K),0.001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,nanojoule per kilogram kelvin,nanojoules per kilogram kelvin,nJ/(kg · K),nJ/(kg*K),0.000000001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,petajoule per kilogram kelvin,petajoules per kilogram kelvin,PJ/(kg · K),PJ/(kg*K),1000000000000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,picojoule per kilogram kelvin,picojoules per kilogram kelvin,pJ/(kg · K),pJ/(kg*K),1E-12,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,square centimeter per second squared kelvin,square centimeters per second squared kelvin,cm²/(s² · K),cm^2/(s^2*K),0.0001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,square kilometer per second squared kelvin,square kilometers per second squared kelvin,km²/(s² · K),km^2/(s^2*K),1000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,square meter per second squared kelvin,square meters per second squared kelvin,m²/(s² · K),m^2/(s^2*K),1,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,square micrometer per second squared kelvin,square micrometers per second squared kelvin,µm²/(s² · K),um^2/(s^2*K),1E-12,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,square millimeter per second squared kelvin,square millimeters per second squared kelvin,mm²/(s² · K),mm^2/(s^2*K),0.000001,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,terajoule per kilogram kelvin,terajoules per kilogram kelvin,TJ/(kg · K),TJ/(kg*K),1000000000000,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,yoctojoule per kilogram kelvin,yoctojoules per kilogram kelvin,yJ/(kg · K),yJ/(kg*K),1E-24,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,yottajoule per kilogram kelvin,yottajoules per kilogram kelvin,YJ/(kg · K),YJ/(kg*K),1E+024,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,zeptojoule per kilogram kelvin,zeptojoules per kilogram kelvin,zJ/(kg · K),zJ/(kg*K),1E-21,0 +SpecificHeatCapacity,2,0,0,0,-1,0,0,false,false,false,false,false,false,zettajoule per kilogram kelvin,zettajoules per kilogram kelvin,ZJ/(kg · K),ZJ/(kg*K),1E+021,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,attowatt per kilogram,attowatts per kilogram,aW/kg,aW/kg,1E-18,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,centiwatt per kilogram,centiwatts per kilogram,cW/kg,cW/kg,0.01,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,decawatt per kilogram,decawatts per kilogram,daW/kg,daW/kg,10,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,deciwatt per kilogram,deciwatts per kilogram,dW/kg,dW/kg,0.1,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,erg per second per kilogram,ergs per second per kilogram,(erg/s)/kg,(erg/s)/kg,0.0000001,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,exawatt per kilogram,exawatts per kilogram,EW/kg,EW/kg,1E+018,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,femtowatt per kilogram,femtowatts per kilogram,fW/kg,fW/kg,1E-15,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per hour per pound,foot pounds-force per hour per pound,(ft · lbf/h)/lb,(ft*lbf/h)/lb,0.000830296343393565,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per minute per pound,foot pounds-force per minute per pound,(ft · lbf/min)/lb,(ft*lbf/min)/lb,0.0498177806036139,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,foot pound-force per second per pound,foot pounds-force per second per pound,(ft · lbf/s)/lb,(ft*lbf/s)/lb,2.98906683621683,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,gigawatt per kilogram,gigawatts per kilogram,GW/kg,GW/kg,1000000000,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,hectowatt per kilogram,hectowatts per kilogram,hW/kg,hW/kg,100,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,horsepower (boiler) per pound,horsepower (boiler) per pound,(hp (S))/lb,(hp (S))/lb,21626.2441786944,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,horsepower (electric) per pound,horsepower (electric) per pound,(hp (E))/lb,(hp (E))/lb,1644.64836712432,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,horsepower (Imperial) per pound,horsepower (Imperial) per pound,(hp (I))/lb,(hp (I))/lb,1643.98698038151,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,metric horsepower per pound,metric horsepower per pound,(hp (M))/lb,(hp (M))/lb,1621.49718557895,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,horsepower per pound,horsepower per pound,hp/lb,hp/lb,1643.98675991926,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,hydraulic horsepower per pound,hydraulic horsepower per pound,(hp (hydraulic))/lb,(hp (hydraulic))/lb,1644.74316589079,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,kilowatt per kilogram,kilowatts per kilogram,kW/kg,kW/kg,1000,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,megawatt per kilogram,megawatts per kilogram,MW/kg,MW/kg,1000000,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,microwatt per kilogram,microwatts per kilogram,µW/kg,uW/kg,0.000001,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,milliwatt per kilogram,milliwatts per kilogram,mW/kg,mW/kg,0.001,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,nanowatt per kilogram,nanowatts per kilogram,nW/kg,nW/kg,0.000000001,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,petawatt per kilogram,petawatts per kilogram,PW/kg,PW/kg,1000000000000000,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,picowatt per kilogram,picowatts per kilogram,pW/kg,pW/kg,1E-12,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,square meter per cubic second,square meters per cubic second,m² · s⁻³,m^2*s^-3,1,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,terawatt per kilogram,terawatts per kilogram,TW/kg,TW/kg,1000000000000,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,watt per kilogram,watts per kilogram,W/kg,W/kg,1,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,yoctowatt per kilogram,yoctowatts per kilogram,yW/kg,yW/kg,1E-24,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,yottawatt per kilogram,yottawatts per kilogram,YW/kg,YW/kg,1E+024,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,zeptowatt per kilogram,zeptowatts per kilogram,zW/kg,zW/kg,1E-21,0 +SpecificPower,2,0,-3,0,0,0,0,false,false,false,false,false,false,zettawatt per kilogram,zettawatts per kilogram,ZW/kg,ZW/kg,1E+021,0 +SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,false,becquerel per kilogram,becquerels per kilogram,Bq/kg,Bq/kg,1,0 +SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,false,curie per kilogram,curie per kilogram,Ci/kg,Ci/kg,37000000000,0 +SpecificRadioactivity,0,-1,-1,0,0,0,0,false,true,false,false,false,false,disintegration per minute per kilogram,disintegrations per minute per kilogram,dpm/kg,dpm/kg,0.0166666666666667,0 +SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,false,cubic centimeter per gram,cubic centimeters per gram,cm³/g,cm^3/g,0.001,0 +SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,false,cubic centimeter per kilogram,cubic centimeters per kilogram,cm³/kg,cm^3/kg,0.000001,0 +SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,false,cubic meter per gram,cubic meters per gram,m³/g,m^3/g,1000,0 +SpecificVolume,3,-1,0,0,0,0,0,false,false,false,false,false,false,cubic meter per kilogram,cubic meters per kilogram,m³/kg,m^3/kg,1,0 +SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,false,ampere per centimeter,amperes per centimeter,A/cm,A/cm (surface density),100,0 +SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,false,ampere per meter,amperes per meter,A/m,A/m (surface density),1,0 +SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,false,ampere per micrometer,amperes per micrometer,A/μm,A/um (surface density),1000000,0 +SurfaceElectricCurrentDensity,-1,0,0,1,0,0,0,false,true,false,false,false,false,ampere per millimeter,amperes per millimeter,A/mm,A/mm (surface density),1000,0 +TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,false,per kelvin,per kelvin,K⁻¹,K^-1,1,0 +TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,false,ppm per degree Celsius,ppm per degree Celsius,ppm/°C,ppm/degC,0.000001,0 +TemperatureCoefficient,0,0,0,0,-1,0,0,false,false,false,false,false,false,ppm per kelvin,ppm per kelvin,ppm/K,ppm/K,0.000001,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per centimeter,kelvins per centimeter,K/cm,K/cm,100,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per hectometer,kelvins per hectometer,K/hm,K/hm,0.01,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per kilometer,kelvins per kilometer,K/km,K/km,0.001,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per meter,kelvins per meter,K/m,K/m,1,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per micrometer,kelvins per micrometer,K/µm,K/um,1000000,0 +TemperatureGradient,-1,0,0,0,1,0,0,false,false,false,false,false,false,kelvin per millimeter,kelvins per millimeter,K/mm,K/mm,1000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,attokelvin,attokelvins,aK,aK (interval),1E-18,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,centikelvin,centikelvins,cK,cK (interval),0.01,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,decakelvin,decakelvins,daK,daK (interval),10,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,decikelvin,decikelvins,dK,dK (interval),0.1,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,degree Celsius,degrees Celsius,°C,degC (interval),1,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,degree Fahrenheit,degrees Fahrenheit,°F,degF (interval),0.555555555555556,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,degree Rankine,degrees Rankine,°R,degR (interval),0.555555555555556,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,exakelvin,exakelvins,EK,EK (interval),1E+018,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,femtokelvin,femtokelvins,fK,fK (interval),1E-15,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,gigakelvin,gigakelvins,GK,GK (interval),1000000000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,hectokelvin,hectokelvins,hK,hK (interval),100,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,kelvin,kelvins,K,K (interval),1,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,kilokelvin,kilokelvins,kK,kK (interval),1000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,megakelvin,megakelvins,MK,MK (interval),1000000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,microkelvin,microkelvins,µK,uK (interval),0.000001,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,millikelvin,millikelvins,mK,mK (interval),0.001,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,nanokelvin,nanokelvins,nK,nK (interval),0.000000001,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,petakelvin,petakelvins,PK,PK (interval),1000000000000000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,picokelvin,picokelvins,pK,pK (interval),1E-12,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,terakelvin,terakelvins,TK,TK (interval),1000000000000,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,yoctokelvin,yoctokelvins,yK,yK (interval),1E-24,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,yottakelvin,yottakelvins,YK,YK (interval),1E+024,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,zeptokelvin,zeptokelvins,zK,zK (interval),1E-21,0 +TemperatureInterval,0,0,0,0,1,0,0,false,false,false,false,false,false,zettakelvin,zettakelvins,ZK,ZK (interval),1E+021,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,attogram meter squared per second cubed kelvin,attograms meter squared per second cubed kelvin,ag · m²/(s³ · K),ag*m^2/(s^3*K),1E-21,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,attowatt per kelvin,attowatts per kelvin,aW/K,aW/K,1E-18,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,centigram meter squared per second cubed kelvin,centigrams meter squared per second cubed kelvin,cg · m²/(s³ · K),cg*m^2/(s^3*K),0.00001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,centiwatt per kelvin,centiwatts per kelvin,cW/K,cW/K,0.01,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,decagram meter squared per second cubed kelvin,decagrams meter squared per second cubed kelvin,dag · m²/(s³ · K),dag*m^2/(s^3*K),0.01,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,decawatt per kelvin,decawatts per kelvin,daW/K,daW/K,10,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,decigram meter squared per second cubed kelvin,decigrams meter squared per second cubed kelvin,dg · m²/(s³ · K),dg*m^2/(s^3*K),0.0001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,deciwatt per kelvin,deciwatts per kelvin,dW/K,dW/K,0.1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,exagram meter squared per second cubed kelvin,exagrams meter squared per second cubed kelvin,Eg · m²/(s³ · K),Eg*m^2/(s^3*K),1000000000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,exawatt per kelvin,exawatts per kelvin,EW/K,EW/K,1E+018,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,femtogram meter squared per second cubed kelvin,femtograms meter squared per second cubed kelvin,fg · m²/(s³ · K),fg*m^2/(s^3*K),1E-18,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,femtowatt per kelvin,femtowatts per kelvin,fW/K,fW/K,1E-15,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,gigagram meter squared per second cubed kelvin,gigagrams meter squared per second cubed kelvin,Gg · m²/(s³ · K),Gg*m^2/(s^3*K),1000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,gigawatt per kelvin,gigawatts per kelvin,GW/K,GW/K,1000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,gram meter squared per second cubed kelvin,grams meter squared per second cubed kelvin,g · m/(s³ · K),g*m/(s^3*K),0.001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,hectogram meter squared per second cubed kelvin,hectograms meter squared per second cubed kelvin,hg · m²/(s³ · K),hg*m^2/(s^3*K),0.1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,hectowatt per kelvin,hectowatts per kelvin,hW/K,hW/K,100,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram meter squared per second cubed degree Celsius,kilograms meter squared per second cubed degree Celsius,kg · m²/(s³ · °C),kg*m^2/(s^3*degC),1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram meter squared per second cubed kelvin,kilograms meter squared per second cubed kelvin,kg · m²/(s³ · K),kg*m^2/(s^3*K),1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,kilowatt per degree Celsius,kilowatts per degree Celsius,kW/°C,kW/degC,1000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,kilowatt per kelvin,kilowatts per kelvin,kW/K,kW/K,1000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,megagram meter squared per second cubed kelvin,megagrams meter squared per second cubed kelvin,Mg · m²/(s³ · K),Mg*m^2/(s^3*K),1000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,megawatt per kelvin,megawatts per kelvin,MW/K,MW/K,1000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,microgram meter squared per second cubed kelvin,micrograms meter squared per second cubed kelvin,µg · m/(s³ · K),ug*m/(s^3*K),0.000000001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,microwatt per kelvin,microwatts per kelvin,µW/K,uW/K,0.000001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,milligram meter squared per second cubed kelvin,milligrams meter squared per second cubed kelvin,mg · m²/(s³ · K),mg*m^2/(s^3*K),0.000001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,milliwatt per degree Celsius,milliwatts per degree Celsius,mW/°C,mW/degC,0.001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,milliwatt per kelvin,milliwatts per kelvin,mW/K,mW/K,0.001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,nanogram meter squared per second cubed kelvin,nanograms meter squared per second cubed kelvin,ng · m²/(s³ · K),ng*m^2/(s^3*K),1E-12,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,nanowatt per kelvin,nanowatts per kelvin,nW/K,nW/K,0.000000001,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,petagram meter squared per second cubed kelvin,petagrams meter squared per second cubed kelvin,Pg · m²/(s³ · K),Pg*m^2/(s^3*K),1000000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,petawatt per kelvin,petawatts per kelvin,PW/K,PW/K,1000000000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,picogram meter squared per second cubed kelvin,picograms meter squared per second cubed kelvin,pg · m²/(s³ · K),pg*m^2/(s^3*K),1E-15,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,picowatt per kelvin,picowatts per kelvin,pW/K,pW/K,1E-12,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,teragram meter squared per second cubed kelvin,teragrams meter squared per second cubed kelvin,Tg · m²/(s³ · K),Tg*m^2/(s^3*K),1000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,terawatt per kelvin,terawatts per kelvin,TW/K,TW/K,1000000000000,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per kelvin,watts per kelvin,W/K,W/K,1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per degree Celsius,watts per degree Celsius,W/°C,W/degC,1,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctogram meter squared per second cubed kelvin,yoctograms meter squared per second cubed kelvin,yg · m²/(s³ · K),yg*m^2/(s^3*K),1E-27,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctowatt per kelvin,yoctowatts per kelvin,yW/K,yW/K,1E-24,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,yottagram meter squared per second cubed kelvin,yottagrams meter squared per second cubed kelvin,Yg · m²/(s³ · K),Yg*m^2/(s^3*K),1E+021,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,yottawatt per kelvin,yottawatts per kelvin,YW/K,YW/K,1E+024,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptogram meter squared per second cubed kelvin,zeptograms meter squared per second cubed kelvin,zg · m²/(s³ · K),zg*m^2/(s^3*K),1E-24,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptowatt per kelvin,zeptowatts per kelvin,zW/K,zW/K,1E-21,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,zettagram meter squared per second cubed kelvin,zettagrams meter squared per second cubed kelvin,Zg · m²/(s³ · K),Zg*m^2/(s^3*K),1E+018,0 +ThermalConductance,2,1,-3,0,-1,0,0,false,false,false,false,false,false,zettawatt per kelvin,zettawatts per kelvin,ZW/K,ZW/K,1E+021,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,attogram meter per second cubed kelvin,attograms meter per second cubed kelvin,ag · m/(s³ · K),ag*m/(s^3*K),1E-21,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,attowatt per meter kelvin,attowatts per meter kelvin,aW/(m · K),aW/(m*K),1E-18,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,centigram meter per second cubed kelvin,centigrams meter per second cubed kelvin,cg · m/(s³ · K),cg*m/(s^3*K),0.00001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,centiwatt per meter kelvin,centiwatts per meter kelvin,cW/(m · K),cW/(m*K),0.01,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,decagram meter per second cubed kelvin,decagrams meter per second cubed kelvin,dag · m/(s³ · K),dag*m/(s^3*K),0.01,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,decawatt per meter kelvin,decawatts per meter kelvin,daW/(m · K),daW/(m*K),10,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,decigram meter per second cubed kelvin,decigrams meter per second cubed kelvin,dg · m/(s³ · K),dg*m/(s^3*K),0.0001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,deciwatt per meter kelvin,deciwatts per meter kelvin,dW/(m · K),dW/(m*K),0.1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,exagram meter per second cubed kelvin,exagrams meter per second cubed kelvin,Eg · m/(s³ · K),Eg*m/(s^3*K),1000000000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,exawatt per meter kelvin,exawatts per meter kelvin,EW/(m · K),EW/(m*K),1E+018,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,femtogram meter per second cubed kelvin,femtograms meter per second cubed kelvin,fg · m/(s³ · K),fg*m/(s^3*K),1E-18,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,femtowatt per meter kelvin,femtowatts per meter kelvin,fW/(m · K),fW/(m*K),1E-15,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,gigagram meter per second cubed kelvin,gigagrams meter per second cubed kelvin,Gg · m/(s³ · K),Gg*m/(s^3*K),1000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,gigawatt per meter kelvin,gigawatts per meter kelvin,GW/(m · K),GW/(m*K),1000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,gram meter per second cubed kelvin,grams meter per second cubed kelvin,g · m/(s³ · K),g*m/(s^3*K) (conductivity),0.001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,hectogram meter per second cubed kelvin,hectograms meter per second cubed kelvin,hg · m/(s³ · K),hg*m/(s^3*K),0.1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,hectowatt per meter kelvin,hectowatts per meter kelvin,hW/(m · K),hW/(m*K),100,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram meter per second cubed degree celsius,kilograms meter per second cubed degree celsius,kg · m/(s³ · °C),kg*m/(s^3*degC),1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,kilogram meter per second cubed kelvin,kilograms meter per second cubed kelvin,kg · m/(s³ · K),kg*m/(s^3*K),1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,kilowatt per meter degree celsius,kilowatts per meter degree celsius,kW/(m · °C),kW/(m*degC),1000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,kilowatt per meter kelvin,kilowatts per meter kelvin,kW/(m · K),kW/(m*K),1000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,megagram meter per second cubed kelvin,megagrams meter per second cubed kelvin,Mg · m/(s³ · K),Mg*m/(s^3*K),1000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,megawatt per meter kelvin,megawatts per meter kelvin,MW/(m · K),MW/(m*K),1000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,microgram meter per second cubed kelvin,micrograms meter per second cubed kelvin,µg · m/(s³ · K),ug*m/(s^3*K) (conductivity),0.000000001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,microwatt per meter kelvin,microwatts per meter kelvin,µW/(m · K),uW/(m*K),0.000001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,milligram meter per second cubed kelvin,milligrams meter per second cubed kelvin,mg · m/(s³ · K),mg*m/(s^3*K),0.000001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,milliwatt per meter degree celsius,milliwatts per meter degree celsius,mW/(m · °C),mW/(m*degC),0.001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,milliwatt per meter kelvin,milliwatts per meter kelvin,mW/(m · K),mW/(m*K),0.001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,nanogram meter per second cubed kelvin,nanograms meter per second cubed kelvin,ng · m/(s³ · K),ng*m/(s^3*K),1E-12,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,nanowatt per meter kelvin,nanowatts per meter kelvin,nW/(m · K),nW/(m*K),0.000000001,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,petagram meter per second cubed kelvin,petagrams meter per second cubed kelvin,Pg · m/(s³ · K),Pg*m/(s^3*K),1000000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,petawatt per meter kelvin,petawatts per meter kelvin,PW/(m · K),PW/(m*K),1000000000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,picogram meter per second cubed kelvin,picograms meter per second cubed kelvin,pg · m/(s³ · K),pg*m/(s^3*K),1E-15,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,picowatt per meter kelvin,picowatts per meter kelvin,pW/(m · K),pW/(m*K),1E-12,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,teragram meter per second cubed kelvin,teragrams meter per second cubed kelvin,Tg · m/(s³ · K),Tg*m/(s^3*K),1000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,terawatt per meter kelvin,terawatts per meter kelvin,TW/(m · K),TW/(m*K),1000000000000,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per meter degree celsius,watts per meter degree celsius,W/(m · °C),W/(m*degC),1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,watt per meter kelvin,watts per meter kelvin,W/(m · K),W/(m*K),1,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctogram meter per second cubed kelvin,yoctograms meter per second cubed kelvin,yg · m/(s³ · K),yg*m/(s^3*K),1E-27,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,yoctowatt per meter kelvin,yoctowatts per meter kelvin,yW/(m · K),yW/(m*K),1E-24,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,yottagram meter per second cubed kelvin,yottagrams meter per second cubed kelvin,Yg · m/(s³ · K),Yg*m/(s^3*K),1E+021,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,yottawatt per meter kelvin,yottawatts per meter kelvin,YW/(m · K),YW/(m*K),1E+024,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptogram meter per second cubed kelvin,zeptograms meter per second cubed kelvin,zg · m/(s³ · K),zg*m/(s^3*K),1E-24,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,zeptowatt per meter kelvin,zeptowatts per meter kelvin,zW/(m · K),zW/(m*K),1E-21,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,zettagram meter per second cubed kelvin,zettagrams meter per second cubed kelvin,Zg · m/(s³ · K),Zg*m/(s^3*K),1E+018,0 +ThermalConductivity,1,1,-3,0,-1,0,0,false,false,false,false,false,false,zettawatt per meter kelvin,zettawatts per meter kelvin,ZW/(m · K),ZW/(m*K),1E+021,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,attokelvin,attokelvins,aK,aK,1E-18,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,centikelvin,centikelvins,cK,cK,0.01,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,decakelvin,decakelvins,daK,daK,10,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,decikelvin,decikelvins,dK,dK,0.1,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,degree Celsius,degrees Celsius,°C,degC,1,273.15 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,degree Fahrenheit,degrees Fahrenheit,°F,degF,0.555555555555556,459.67 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,degree Rankine,degrees Rankine,°R,degR,0.555555555555556,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,exakelvin,exakelvins,EK,EK,1E+018,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,femtokelvin,femtokelvins,fK,fK,1E-15,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,gigakelvin,gigakelvins,GK,GK,1000000000,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,hectokelvin,hectokelvins,hK,hK,100,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,kelvin,kelvins,K,K,1,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,kilokelvin,kilokelvins,kK,kK,1000,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,megakelvin,megakelvins,MK,MK,1000000,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,microkelvin,microkelvins,µK,uK,0.000001,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,millikelvin,millikelvins,mK,mK,0.001,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,nanokelvin,nanokelvins,nK,nK,0.000000001,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,petakelvin,petakelvins,PK,PK,1000000000000000,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,picokelvin,picokelvins,pK,pK,1E-12,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,terakelvin,terakelvins,TK,TK,1000000000000,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,yoctokelvin,yoctokelvins,yK,yK,1E-24,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,yottakelvin,yottakelvins,YK,YK,1E+024,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,zeptokelvin,zeptokelvins,zK,zK,1E-21,0 +ThermodynamicTemperature,0,0,0,0,1,0,0,false,false,false,false,true,false,zettakelvin,zettakelvins,ZK,ZK,1E+021,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,attosecond,attoseconds,as,as,1E-18,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,centisecond,centiseconds,cs,cs,0.01,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,day,days,d,d,86400,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,day (sidereal),days (sidereal),d (sidereal),d (sidereal),86164.09,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,decasecond,decaseconds,das,das,10,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,decisecond,deciseconds,ds,ds,0.1,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,exasecond,exaseconds,Es,Es,1E+018,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,femtosecond,femtoseconds,fs,fs,1E-15,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,gigasecond,gigaseconds,Gs,Gs,1000000000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,hectosecond,hectoseconds,hs,hs,100,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,hour,hours,h,h,3600,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,hour (sidereal),hours (sidereal),h (sidereal),h (sidereal),3590.17,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,kilosecond,kiloseconds,ks,ks,1000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,megasecond,megaseconds,Ms,Ms,1000000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,microsecond,microseconds,µs,us,0.000001,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,millisecond,milliseconds,ms,ms,0.001,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,minute,minutes,min,min,60,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,nanosecond,nanoseconds,ns,ns,0.000000001,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,petasecond,petaseconds,Ps,Ps,1000000000000000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,picosecond,picoseconds,ps,ps,1E-12,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,second,seconds,s,s,1,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,second (sidereal),seconds (sidereal),s (sidereal),s (sidereal),0.9972696,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,shake,shakes,10.0 ns,10.0 ns,0.00000001,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,terasecond,teraseconds,Ts,Ts,1000000000000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,year,years,a,y,31536000,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,year (sidereal),years (sidereal),a (sidereal),a (sidereal),31558150,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,year (tropical),years (tropical),a (tropical),a (tropical),31556930,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,yoctosecond,yoctoseconds,ys,ys,1E-24,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,yottasecond,yottaseconds,Ys,Ys,1E+024,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,zeptosecond,zeptoseconds,zs,zs,1E-21,0 +Time,0,0,1,0,0,0,0,false,false,false,false,false,false,zettasecond,zettaseconds,Zs,Zs,1E+021,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,attonewton meter,attonewton meters,aN · m,aN*m,1E-18,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,centinewton meter,centinewton meters,cN · m,cN*m,0.01,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,decanewton meter,decanewton meters,daN · m,daN*m,10,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,decinewton meter,decinewton meters,dN · m,dN*m,0.1,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,dyne centimeter,dyne centimeters,dyn · cm,dyn*cm,0.0000001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,dyne meter,dyne meters,dyn · m,dyn*m,0.00001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,exanewton meter,exanewton meters,EN · m,EN*m,1E+018,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,femtonewton meter,femtonewton meters,fN · m,fN*m,1E-15,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,giganewton meter,giganewton meters,GN · m,GN*m,1000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,hectonewton meter,hectonewton meters,hN · m,hN*m,100,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,kilogram-force meter,kilogram-force meters,kgf · m,kgf*m,9.80665,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,kilonewton meter,kilonewton meters,kN · m,kN*m,1000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,meganewton meter,meganewton meters,MN · m,MN*m,1000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,micronewton meter,micronewton meters,µN · m,uN*m,0.000001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,millinewton meter,millinewton meters,mN · m,mN*m,0.001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,nanonewton meter,nanonewton meters,nN · m,nN*m,0.000000001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton attometer,newton attometers,N · am,N*am,1E-18,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton centimeter,newton centimeters,N · cm,N*cm,0.01,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton decameter,newton decameters,N · dam,N*dam,10,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton decimeter,newton decimeters,N · dm,N*dm,0.1,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton exameter,newton exameters,N · Em,N*Em,1E+018,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton femtometer,newton femtometers,N · fm,N*fm,1E-15,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton gigameter,newton gigameters,N · Gm,N*Gm,1000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton hectometer,newton hectometers,N · hm,N*hm,100,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton kilometer,newton kilometers,N · km,N*km,1000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton megameter,newton megameters,N · Mm,N*Mm,1000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton meter,newton meters,N · m,N*m,1,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton micrometer,newton micrometers,N · µm,N*um,0.000001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton millimeter,newton millimeters,N · mm,N*mm,0.001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton nanometer,newton nanometers,N · nm,N*nm,0.000000001,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton petameter,newton petameters,N · Pm,N*Pm,1000000000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton picometer,newton picometers,N · pm,N*pm,1E-12,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton terameter,newton terameters,N · Tm,N*Tm,1000000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton yoctometer,newton yoctometers,N · ym,N*ym,1E-24,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton yottameter,newton yottameters,N · Ym,N*Ym,1E+024,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton zeptometer,newton zeptometers,N · zm,N*zm,1E-21,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,newton zettameter,newton zettameters,N · Zm,N*Zm,1E+021,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,ounce-force inch,ounces-force inches,ozf · in,ozf*in,0.00706155306,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,petanewton meter,petanewton meters,PN · m,PN*m,1000000000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,piconewton meter,piconewton meters,pN · m,pN*m,1E-12,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,pound-force foot,pounds-force feet,lbf · ft,lbf*ft,1.3558180656,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,pound-force inch,pounds-force inches,lbf · in,lbf*in,0.1129848388,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,teranewton meter,teranewton meters,TN · m,TN*m,1000000000000,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,yoctonewton meter,yoctonewton meters,yN · m,yN*m,1E-24,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,yottanewton meter,yottanewton meters,YN · m,YN*m,1E+024,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,zeptonewton meter,zeptonewton meters,zN · m,zN*m,1E-21,0 +Torque,2,1,-2,0,0,0,0,true,false,false,false,false,false,zettanewton meter,zettanewton meters,ZN · m,ZN*m,1E+021,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,atomic unit of velocity,atomic units of velocity,a₀ · Eₕ/ħ,a\0*E\h/n<-,2187691.26364,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,attometer per second,attometers per second,am/s,am/s,1E-18,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,centimeter per second,centimeters per second,cm/s,cm/s,0.01,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,decameter per second,decameters per second,dam/s,dam/s,10,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,decimeter per second,decimeters per second,dm/s,dm/s,0.1,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,exameter per second,exameters per second,Em/s,Em/s,1E+018,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,femtometer per second,femtometers per second,fm/s,fm/s,1E-15,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,foot per hour,feet per hour,ft/h,ft/h,8.46666666666667E-05,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,foot per minute,feet per minute,ft/min,ft/min,0.00508,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,foot per second,feet per second,ft/s,ft/s,0.3048,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,gigameter per second,gigameters per second,Gm/s,Gm/s,1000000000,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,hectometer per second,hectometers per second,hm/s,hm/s,100,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,inch per second,inches per second,in/s,in/s,0.0254,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,kilometer per hour,kilometers per hour,km/h,km/h,0.277777777777778,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,kilometer per second,kilometers per second,km/s,km/s,1000,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,knot,knots,kn,kn,0.514444444444445,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,megameter per second,megameters per second,Mm/s,Mm/s,1000000,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,meter per second,meters per second,m/s,m/s,1,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,micrometer per second,micrometers per second,µm/s,um/s,0.000001,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,mile per hour,miles per hour,mi/h,mi/h,0.44704,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,mile per minute,miles per minute,mi/min,mi/min,26.8224,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,mile per second,miles per second,mi/s,mi/s,1609.344,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,millimeter per minute,millimeters per minute,mm/min,mm/min,1.66666666666667E-05,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,millimeter per second,millimeters per second,mm/s,mm/s,0.001,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,nanometer per second,nanometers per second,nm/s,nm/s,0.000000001,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,natural unit of velocity,natural units of velocity,c,c (natural units),299792458,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,petameter per second,petameters per second,Pm/s,Pm/s,1000000000000000,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,picometer per second,picometers per second,pm/s,pm/s,1E-12,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,speed of light in vacuum,speeds of light in vacuum,c,c (speed of light),299792458,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,terameter per second,terameters per second,Tm/s,Tm/s,1000000000000,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,yoctometer per second,yoctometers per second,ym/s,ym/s,1E-24,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,yottameter per second,yottameters per second,Ym/s,Ym/s,1E+024,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,zeptometer per second,zeptometers per second,zm/s,zm/s,1E-21,0 +Velocity,1,0,-1,0,0,0,0,false,false,false,false,false,false,zettameter per second,zettameters per second,Zm/s,Zm/s,1E+021,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,acre-foot,acre-feet,ac · ft,ac*ft,1233.489,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,attoliter,attoliters,aL,aL,1E-21,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,barrel,barrels,bbl,bbl,0.1589873,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,bushel,bushels,bu,bu,0.03523907,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,centiliter,centiliters,cL,cL,0.00001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cord,cords,cords,cords,3.624556,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic attometer,cubic attometers,am³,am^3,1E-54,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic centimeter,cubic centimeters,cm³,cm^3,0.000001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic decameter,cubic decameters,dam³,dam^3,1000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic decimeter,cubic decimeters,dm³,dm^3,0.001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic exameter,cubic exameters,Em³,Em^3,1E+054,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic femtometer,cubic femtometers,fm³,fm^3,1E-45,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic foot,cubic feet,ft³,ft^3,0.02831685,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic gigameter,cubic gigameters,Gm³,Gm^3,1E+027,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic hectometer,cubic hectometers,hm³,hm^3,1000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic inch,cubic inches,in³,in^3,0.00001638706,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic kilometer,cubic kilometers,km³,km^3,1000000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic megameter,cubic megameters,Mm³,Mm^3,1E+018,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic meter,cubic meters,m³,m^3,1,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic micrometer,cubic micrometers,µm³,um^3,1E-18,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic mile,cubic miles,mi³,mi^3,4168182000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic millimeter,cubic millimeters,mm³,mm^3,0.000000001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic nanometer,cubic nanometers,nm³,nm^3,1E-27,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic petameter,cubic petameters,Pm³,Pm^3,1E+045,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic picometer,cubic picometers,pm³,pm^3,1E-36,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic terameter,cubic terameters,Tm³,Tm^3,1E+036,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic yard,cubic yards,yd³,yd^3,0.7645549,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic yoctometer,cubic yoctometers,ym³,ym^3,1E-72,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic yottameter,cubic yottameters,Ym³,Ym^3,1E+072,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic zeptometer,cubic zeptometers,zm³,zm^3,1E-63,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cubic zettameter,cubic zettameters,Zm³,Zm^3,1E+063,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,cup,cups,cup,cup,0.0002365882,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,decaliter,decaliters,daL,daL,0.01,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,deciliter,deciliters,dL,dL,0.0001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,exaliter,exaliters,EL,EL,1000000000000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,femtoliter,femtoliters,fL,fL,1E-18,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,fluid ounce,fluid ounces,fl oz,fl_oz,0.00002957353,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,Imperial fluid ounce,Imperial fluid ounces,fl oz (UK),fl oz (UK),0.00002841306,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,gallon,gallons,gal,gal,0.003785412,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,Imperial gallon,Imperial gallons,gal (UK),gal (UK),0.00454609,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,gigaliter,gigaliters,GL,GL,1000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,gill,gills,gi,gi,0.0001182941,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,Imperial gill,Imperial gills,gi (UK),gi (UK),0.0001420653,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,hectoliter,hectoliters,hL,hL,0.1,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,kiloliter,kiloliters,kL,kL,1,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,liter,liters,L,L,0.001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,megaliter,megaliters,ML,ML,1000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,microliter,microliters,µL,uL,0.000000001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,milliliter,milliliters,mL,mL,0.000001,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,nanoliter,nanoliters,nL,nL,1E-12,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,peck,pecks,pk,pk,0.008809768,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,petaliter,petaliters,PL,PL,1000000000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,picoliter,picoliters,pL,pL,1E-15,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,dry pint,dry pints,dry pt,dry_pt,0.0005506105,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,liquid pint,liquid pints,liq pt,liq_pt,0.0004731765,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,dry quart,dry quarts,dry qt,dry_qt,0.001101221,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,liquid quart,liquid quarts,liq qt,liq_qt,0.0009463529,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,register ton,register tons,RT,RT,2.831685,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,stere,steres,st,st,1,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,tablespoon,tablespoons,tbsp,tbsp,0.00001478676,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,teaspoon,teaspoons,tsp,tsp,0.000004928922,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,teraliter,teraliters,TL,TL,1000000000,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,yoctoliter,yoctoliters,yL,yL,1E-27,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,yottaliter,yottaliters,YL,YL,1E+021,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,zeptoliter,zeptoliters,zL,zL,1E-24,0 +Volume,3,0,0,0,0,0,0,false,false,false,false,false,false,zettaliter,zettaliters,ZL,ZL,1E+018,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,acre-foot per second,acre-feet per second,ac · ft/s,ac*ft/s,1233.489,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,attoliter per second,attoliters per second,aL/s,aL/s,1E-21,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,barrel per second,barrels per second,bbl/s,bbl/s,0.1589873,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,bushel per second,bushels per second,bu/s,bu/s,0.03523907,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,centiliter per second,centiliters per second,cL/s,cL/s,0.00001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cord per second,cords per second,cords/s,cords/s,3.624556,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic attometer per second,cubic attometers per second,am³/s,am^3/s,1E-54,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic centimeter per second,cubic centimeters per second,cm³/s,cm^3/s,0.000001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic decameter per second,cubic decameters per second,dam³/s,dam^3/s,1000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic decimeter per second,cubic decimeters per second,dm³/s,dm^3/s,0.001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic exameter per second,cubic exameters per second,Em³/s,Em^3/s,1E+054,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic femtometer per second,cubic femtometers per second,fm³/s,fm^3/s,1E-45,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic foot per minute,cubic feet per minute,ft³/min,ft^3/min,0.0004719475,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic foot per second,cubic feet per second,ft³/s,ft^3/s,0.02831685,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic gigameter per second,cubic gigameters per second,Gm³/s,Gm^3/s,1E+027,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic hectometer per second,cubic hectometers per second,hm³/s,hm^3/s,1000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic inch per minute,cubic inches per minute,in³/min,in^3/min,2.73117666666667E-07,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic inch per second,cubic inches per second,in³/s,in^3/s,0.00001638706,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic kilometer per second,cubic kilometers per second,km³/s,km^3/s,1000000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic megameter per second,cubic megameters per second,Mm³/s,Mm^3/s,1E+018,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic meter per hour,cubic meters per hour,m³/h,m^3/h,0.000277777777777778,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic meter per minute,cubic meters per minute,m³/min,m^3/min,0.0166666666666667,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic meter per second,cubic meters per second,m³/s,m^3/s,1,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic micrometer per second,cubic micrometers per second,µm³/s,um^3/s,1E-18,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic mile per second,cubic miles per second,mi³/s,mi^3/s,4168182000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic millimeter per second,cubic millimeters per second,mm³/s,mm^3/s,0.000000001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic nanometer per second,cubic nanometers per second,nm³/s,nm^3/s,1E-27,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic petameter per second,cubic petameters per second,Pm³/s,Pm^3/s,1E+045,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic picometer per second,cubic picometers per second,pm³/s,pm^3/s,1E-36,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic terameter per second,cubic terameters per second,Tm³/s,Tm^3/s,1E+036,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic yard per minute,cubic yards per minute,yd³/min,yd^3/min,0.0127425816666667,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic yard per second,cubic yards per second,yd³/s,yd^3/s,0.7645549,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic yoctometer per second,cubic yoctometers per second,ym³/s,ym^3/s,1E-72,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic yottameter per second,cubic yottameters per second,Ym³/s,Ym^3/s,1E+072,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic zeptometer per second,cubic zeptometers per second,zm³/s,zm^3/s,1E-63,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cubic zettameter per second,cubic zettameters per second,Zm³/s,Zm^3/s,1E+063,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,cup per second,cups per second,cup/s,cup/s,0.0002365882,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,decaliter per second,decaliters per second,daL/s,daL/s,0.01,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,deciliter per second,deciliters per second,dL/s,dL/s,0.0001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,exaliter per second,exaliters per second,EL/s,EL/s,1000000000000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,femtoliter per second,femtoliters per second,fL/s,fL/s,1E-18,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,Imperial fluid ounce per second,Imperial fluid ounces per second,fl oz (UK)/s,fl oz (UK)/s,0.00002841306,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,fluid ounce per second,fluid ounces per second,fl oz/s,fl_oz/s,0.00002957353,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,Imperial gallon per second,Imperial gallons per second,gal (UK)/s,gal (UK)/s,0.00454609,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,gallon per day,gallons per day,gal/d,gal/d,4.38126388888889E-08,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,gallon per minute,gallons per minute,gal/min,gal/min,0.0000630902,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,gallon per second,gallons per second,gal/s,gal/s,0.003785412,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,gigaliter per second,gigaliters per second,GL/s,GL/s,1000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,Imperial gill per second,Imperial gills per second,gi (UK)/s,gi (UK)/s,0.0001420653,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,gill per second,gills per second,gi/s,gi/s,0.0001182941,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,hectoliter per second,hectoliters per second,hL/s,hL/s,0.1,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,kiloliter per second,kiloliters per second,kL/s,kL/s,1,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,liter per minute,liters per minute,L/min,L/min,1.66666666666667E-05,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,liter per second,liters per second,L/s,L/s,0.001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,megaliter per second,megaliters per second,ML/s,ML/s,1000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,microliter per second,microliters per second,µL/s,uL/s,0.000000001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,milliliter per second,milliliters per second,mL/s,mL/s,0.000001,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,nanoliter per second,nanoliters per second,nL/s,nL/s,1E-12,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,peck per second,pecks per second,pk/s,pk/s,0.008809768,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,petaliter per second,petaliters per second,PL/s,PL/s,1000000000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,picoliter per second,picoliters per second,pL/s,pL/s,1E-15,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,dry pint per second,dry pints per second,dry pt/s,dry pt/s,0.0005506105,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,liquid pint per second,liquid pints per second,liq pt/s,liq pt/s,0.0004731765,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,dry quart per second,dry quarts per second,dry qt/s,dry qt/s,0.001101221,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,liquid quart per second,liquid quarts per second,liq qt/s,liq qt/s,0.0009463529,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,register ton per second,register tons per second,RT/s,RT/s,2.831685,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,stere per second,steres per second,st/s,st/s,1,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,tablespoon per second,tablespoons per second,tbsp/s,tbsp/s,0.00001478676,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,teaspoon per second,teaspoons per second,tsp/s,tsp/s,0.000004928922,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,teraliter per second,teraliters per second,TL/s,TL/s,1000000000,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,yoctoliter per second,yoctoliters per second,yL/s,yL/s,1E-27,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,yottaliter per second,yottaliters per second,YL/s,YL/s,1E+021,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,zeptoliter per second,zeptoliters per second,zL/s,zL/s,1E-24,0 +VolumeRate,3,0,-1,0,0,0,0,false,false,false,false,false,false,zettaliter per second,zettaliters per second,ZL/s,ZL/s,1E+018,0 +VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,false,state per cubic centimeter electronvolt,states per cubic centimeter electronvolt,1/(cm³ · eV),1/(cm^3*eV),6.24150907446076E+024,0 +VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,false,state per cubic centimeter joule,states per cubic centimeter joule,1/(cm³ · J),1/(cm^3*J),1000000,0 +VolumetricDensityOfStates,-5,-1,2,0,0,0,0,false,true,false,false,false,false,state per cubic meter joule,states per cubic meter joule,1/(m³ · J),1/(m^3*J),1,0 +VolumetricHeatCapacity,-3,0,0,0,0,0,0,false,true,false,false,false,false,calorie per cubic meter kelvin,calories per cubic meter kelvin,cal/(m³ · K),cal/(m^3*K),4.184,0 +VolumetricHeatCapacity,-3,0,0,0,0,0,0,false,true,false,false,false,false,joule per cubic meter kelvin,joules per cubic meter kelvin,J/(m³ · K),J/(m^3*K),1,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per centiliter,per centiliter,cL⁻¹,cL^-1,100000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic centimeter,per cubic centimeter,cm⁻³,cm^-3,1000000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic decimeter,per cubic decimeter,dm⁻³,dm^-3,1000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic foot,per cubic foot,ft⁻³,ft^-3,35.3146624712848,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic inch,per cubic inch,in⁻³,in^-3,61023.7589903253,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic kilometer,per cubic kilometer,km⁻³,km^-3,0.000000001,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic meter,per cubic meter,m⁻³,m^-3,1,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic mile,per cubic mile,mi⁻³,mi^-3,2.39912748531614E-10,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic millimeter,per cubic millimeter,mm⁻³,mm^-3,1000000000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per cubic yard,per cubic yard,yd⁻³,yd^-3,1.30795054743616,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per deciliter,per deciliter,dL⁻¹,dL^-1,10000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per fluid ounce,per fluid ounce,per fl oz,per fl oz,33814.0222016107,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per Imperial fluid ounce,per Imperial fluid ounce,per fl oz (UK),per fl oz (UK),35195.0828245884,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per gallon,per gallon,per gal,per_gal,264.172037284185,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per Imperial gallon,per Imperial gallon,per gal (UK),per gal (UK),219.969248299088,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per liter,per liter,L⁻¹,L^-1,1000,0 +VolumetricNumberDensity,-3,0,0,0,0,0,0,false,true,false,false,false,false,per milliliter,per milliliter,mL⁻¹,mL^-1,1000000,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,becquerel per cubic meter,becquerels per cubic meter,Bq/m³,Bq/m^3,1,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,curie per cubic meter,curies per cubic meter,Ci/m³,Ci/m^3,37000000000,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,disintegration per minute per cubic meter,disintegrations per minute per cubic meter,dpm/m³,dpm/m^3,0.0166666666666667,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic centimeter second,per cubic centimeter second,cm⁻³ · s⁻¹,cm^-3*s^-1,1000000,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic foot second,per cubic foot second,ft⁻³ · s⁻¹,ft^-3*s^-1,35.3146624712848,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic inch second,per cubic inch second,in⁻³ · s⁻¹,in^-3*s^-1,61023.7589903253,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic meter second,per cubic meter second,m⁻³ · s⁻¹,m^-3*s^-1,1,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic mile second,per cubic mile second,mi⁻³ · s⁻¹,mi^-3*s^-1,2.39912748531614E-10,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic millimeter second,per cubic millimeter second,mm⁻³ · s⁻¹,mm^-3*s^-1,1000000000,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per cubic yard second,per cubic yard second,yd⁻³ · s⁻¹,yd^-3*s^-1,1.30795054743616,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per Imperial fluid ounce second,per Imperial fluid ounce second,fl oz⁻¹ (UK) · s⁻¹,fl oz^-1 (UK)*s^-1,35195.0828245884,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per fluid ounce second,per fluid ounce second,fl oz⁻¹ · s⁻¹,fl oz^-1*s^-1,33814.0222016107,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per Imperial gallon second,per Imperial gallon second,gal⁻¹ (UK) · s⁻¹,gal^-1 (UK)*s^-1,219.969248299088,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per gallon second,per gallon second,gal⁻¹ · s⁻¹,gal^-1*s^-1,264.172037284185,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per liter second,per liter second,L⁻¹ · s⁻¹,L^-1*s^-1,1000,0 +VolumetricNumberRate,-3,0,-1,0,0,0,0,false,true,false,false,false,false,per milliliter second,per milliliter second,mL⁻¹ · s⁻¹,mL^-1*s^-1,1000000,0 +VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per cubic centimeter,watts per cubic centimeter,W/cm³,W/cm^3,1000000,0 +VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per cubic meter,watts per cubic meter,W/m³,W/m^3,1,0 +VolumetricPowerDensity,-1,1,-3,0,0,0,0,false,false,false,false,false,false,watt per cubic millimeter,watts per cubic millimeter,W/mm³,W/mm^3,1000000000,0 +Pixel,0,0,0,0,0,0,0,false,false,false,false,false,true,pixel,pixels,px,px,1,0 +PixelDensity,-1,0,0,0,0,0,0,false,false,false,false,false,true,pixel per inch,pixels per inch,ppi,ppi,0.3937008,0 +PixelDensity,-1,0,0,0,0,0,0,false,false,false,false,false,true,pixel per foot,pixels per foot,ppf,ppf,4.7244096,0 +PixelDensity,-1,0,0,0,0,0,0,false,false,false,false,false,true,pixel per yard,pixels per yard,ppy,ppy,14.1732288,0 +PixelDensity,-1,0,0,0,0,0,0,false,false,false,false,false,true,pixel per centimeter,pixels per centimeter,ppcm,ppcm,1,0 +PixelDensity,-1,0,0,0,0,0,0,false,false,false,false,false,true,pixel per meter,pixels per meter,ppm,ppm,0.001,0 diff --git a/src/script/execution/types/math/vector.rs b/src/script/execution/types/math/vector.rs index 6280db6..53dbe89 100644 --- a/src/script/execution/types/math/vector.rs +++ b/src/script/execution/types/math/vector.rs @@ -19,8 +19,8 @@ use std::borrow::Cow; use arrayvec::ArrayVec; -use common_data_types::{consts, Dimension, Number, RawNumber}; -use enum_downcast::AsVariant; +use common_data_types::{consts, Dimension, Float, RawFloat}; +use enum_downcast::{AsVariant, EnumDowncast, IntoVariant}; use fj_math::Scalar as FornjotScalar; use nalgebra::{ allocator::Allocator, base::dimension::Const, DefaultAllocator, DimName, ToTypenum, @@ -29,8 +29,9 @@ use nalgebra::{ use crate::script::{ execution::{ types::{ - function::AutoCall, number::UnwrapNotNan, BuiltinFunction, NamedObject, Object, - OperatorResult, Value, + function::{AutoCall, BuiltinFunctionRef}, + number::UnwrapNotNan, + BuiltinFunction, NamedObject, Object, OperatorResult, TypedObject, Value, }, ExecutionContext, Failure, }, @@ -39,26 +40,182 @@ use crate::script::{ Span, }; -use super::{get_dimension_name, CheckNan, ConvertUnit, Scalar}; +use super::{get_dimension_name, CheckNan, ConvertUnit, Number, Scalar}; -pub(super) type NVector = nalgebra::OVector; +pub(super) type NVector = nalgebra::OVector; pub type Vector2 = Vector>; pub type Vector3 = Vector>; pub type Vector4 = Vector>; +pub type LengthVector2 = LengthVector>; +pub type LengthVector3 = LengthVector>; + +macro_rules! define_fixed_dimension_vector { + ($name:ident, $dimension_name:literal, $dimension:expr) => { + #[derive(Debug, Clone, PartialEq)] + pub struct $name + where + DefaultAllocator: Allocator, + { + pub value: NVector, + } + + impl From<$name> for Vector + where + DefaultAllocator: Allocator, + { + fn from(value: $name) -> Vector { + Vector { + dimension: $dimension, + value: value.value, + } + } + } + + impl From<$name> for Value + where + DefaultAllocator: Allocator, + Value: From>, + { + fn from(value: $name) -> Value { + Value::from(Vector::from(value)) + } + } + + impl TryFrom> for $name + where + DefaultAllocator: Allocator, + Value: IntoVariant>, + { + type Error = (); + + fn try_from(value: Value) -> Result { + let vector: Vector = value.enum_downcast().map_err(|_| ())?; + Self::try_from(vector).map_err(|_| ()) + } + } + + impl TryFrom> for $name + where + DefaultAllocator: Allocator, + { + type Error = Vector; + + fn try_from(value: Vector) -> Result { + if value.dimension == $dimension { + Ok(Self { value: value.value }) + } else { + Err(value) + } + } + } + + impl<'a, D: DimName> TryFrom<&'a Vector> for $name + where + DefaultAllocator: Allocator, + { + type Error = &'a Vector; + + fn try_from(value: &'a Vector) -> Result { + if value.dimension == $dimension { + Ok(Self { + value: value.value.clone(), + }) + } else { + Err(value) + } + } + } + + impl TypedObject for $name + where + DefaultAllocator: Allocator, + { + fn get_type() -> VariableType { + VariableType::Vector(D::USIZE as u8, S::from_str($dimension_name)) + } + } + + impl NamedObject for $name + where + Vector: NamedObject, + DefaultAllocator: Allocator, + { + fn static_type_name() -> &'static str { + Vector::::static_type_name() + } + } + }; +} + +define_fixed_dimension_vector!(LengthVector, "Length", Dimension::length()); + +impl LengthVector +where + DefaultAllocator: Allocator, +{ + fn as_fornjot_scale_array( + &self, + context: &ExecutionContext, + ) -> [Float; FD] { + let mut number_array = context + .global_resources + .fornjot_unit_conversion_factor + .convert_from_vector_to_iter_without_dimension_check(&self.value); + + std::array::from_fn(|_| number_array.next().unwrap()) + } + + pub fn as_fornjot_scale_nalgebra_vector( + &self, + context: &ExecutionContext, + ) -> NVector { + let components: [_; FD] = self.as_fornjot_scale_array(context).map(|c| c.into_inner()); + NVector::from_row_slice(&components) + } + + pub fn as_fornjot_vector( + &self, + context: &ExecutionContext, + ) -> fj_math::Vector + where + Const: ToTypenum, + { + let components = self + .as_fornjot_scale_array(context) + .map(|c| FornjotScalar::from_f64(c.into_inner())); + + fj_math::Vector { components } + } + + pub fn as_fornjot_point( + &self, + context: &ExecutionContext, + ) -> fj_math::Point + where + Const: ToTypenum, + { + fj_math::Point { + coords: self.as_fornjot_vector(context), + } + } +} + pub fn register_globals(context: &mut ExecutionContext) { - fn build_constructor<'a, S: Span, D: DimName>() -> BuiltinFunction<'a, S> + fn build_constructor() -> BuiltinFunctionRef where - DefaultAllocator: Allocator, - Value<'a, S>: From>, + DefaultAllocator: Allocator, + Value: From>, { - BuiltinFunction::new( - |context: &mut ExecutionContext<'a, S>, + let closure: Box> = Box::new( + |context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression]| { - match Vector::::splat.auto_call(context, span, arguments.clone(), expressions) { + let splat_arguments = arguments.to_vec(); + + match Vector::::splat.auto_call(context, span, splat_arguments, expressions) { Ok(vector) => Ok(vector), Err(Failure::FunctionCall(_call_failure)) => { Vector::::from_components(context, span, arguments, expressions) @@ -66,7 +223,8 @@ pub fn register_globals(context: &mut ExecutionContext) { Err(failure) => Err(failure), } }, - ) + ); + BuiltinFunctionRef::from(closure) } context @@ -83,44 +241,58 @@ pub fn register_globals(context: &mut ExecutionContext) { #[derive(Debug, Clone, PartialEq)] pub struct Vector where - DefaultAllocator: Allocator, + DefaultAllocator: Allocator, { pub(super) dimension: Dimension, pub(super) value: NVector, } -impl<'a, S, D: DimName> Object<'a, S> for Vector +impl Object for Vector where - S: Span + 'a, - DefaultAllocator: Allocator, - Vector: NamedObject + Into>, - Value<'a, S>: AsVariant> + TryInto>, + S: Span, + DefaultAllocator: Allocator, + Vector: NamedObject + Into>, + Value: AsVariant> + TryInto>, NVector: Copy, { - fn matches_type(&self, ty: &VariableType) -> bool { - if let VariableType::Vector(dimension, name) = ty { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(if let VariableType::Vector(dimension, name) = ty { *dimension as usize == D::USIZE && name.as_str() == Object::::type_name(self).as_ref() } else { false - } + }) } fn type_name(&self) -> Cow<'static, str> { get_dimension_name(&self.dimension) } + // TODO add formatting support. + fn index( &self, _log: &mut dyn RuntimeLog, span: &S, - index: Value<'a, S>, - ) -> OperatorResult> { + index: Value, + ) -> OperatorResult> { let index = index.downcast::(span)?; - let index = index.to_index(span)?; + let index = Number::try_from(index.clone()).map_err(|_| { + Failure::ExpectedGot( + span.clone(), + Number::static_type_name().into(), + >::type_name(&index), + ) + })?; + let index = index.to_index(); if let Some(component) = self.value.get(index as usize).copied() { - Ok(Number::new(component).unwrap().into()) + Ok(Float::new(component).unwrap().into()) } else { Err(Failure::IndexOutOfRange(span.clone(), index)) } @@ -131,7 +303,7 @@ where _log: &mut dyn RuntimeLog, span: &S, attribute: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { let swizzle = attribute.as_str(); let len = swizzle.len(); let mut chars = swizzle.chars(); @@ -204,8 +376,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = self.unpack_for_addition_or_subtraction(span, rhs)?; let value = self.value + rhs.value; @@ -221,8 +393,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let rhs = self.unpack_for_addition_or_subtraction(span, rhs)?; let value = self.value - rhs.value; @@ -238,8 +410,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let scalar = rhs.downcast_ref::(span)?; let dimension = self.dimension + scalar.dimension; @@ -252,8 +424,8 @@ where &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { let scalar = rhs.downcast_ref::(span)?; let dimension = self.dimension - scalar.dimension; @@ -264,14 +436,14 @@ where } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "dot" => |_context: &mut ExecutionContext<'a, S>, + "dot" => |_context: &mut ExecutionContext, span: &S, rhs: Vector| -> OperatorResult> { @@ -279,12 +451,12 @@ where Ok(Scalar { dimension: Dimension::zero(), - value: Number::new(self.value.dot(&rhs.value)).unwrap_not_nan(span)?, + value: Float::new(self.value.dot(&rhs.value)).unwrap_not_nan(span)?, } .into()) } .auto_call(context, span, arguments, expressions), - "cross" => |_context: &mut ExecutionContext<'a, S>, + "cross" => |_context: &mut ExecutionContext, span: &S, rhs: Vector| -> OperatorResult> { @@ -300,7 +472,7 @@ where } .auto_call(context, span, arguments, expressions), "abs" => { - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Self { dimension: self.dimension, value: self.value.abs(), @@ -309,7 +481,7 @@ where } .auto_call(context, span, arguments, expressions) } - "add_scalar" => |_context: &mut ExecutionContext<'a, S>, + "add_scalar" => |_context: &mut ExecutionContext, span: &S, scalar: Scalar| -> OperatorResult> { @@ -328,7 +500,7 @@ where } } .auto_call(context, span, arguments, expressions), - "sub_scalar" => |_context: &mut ExecutionContext<'a, S>, + "sub_scalar" => |_context: &mut ExecutionContext, span: &S, scalar: Scalar| -> OperatorResult> { @@ -347,40 +519,40 @@ where } } .auto_call(context, span, arguments, expressions), - "angle" => |_context: &mut ExecutionContext<'a, S>, + "angle" => |_context: &mut ExecutionContext, span: &S, rhs: Vector| -> OperatorResult> { // In Radians let value = self.value.angle(&rhs.value) / consts::PI; - let value = Number::new(value).unwrap_not_nan(span)?; + let value = Float::new(value).unwrap_not_nan(span)?; let dimension = Dimension::angle(); Ok(Scalar { dimension, value }.into()) } .auto_call(context, span, arguments, expressions), "norm" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { Ok(Scalar { dimension: self.dimension, - value: Number::new(self.value.norm()).unwrap_not_nan(span)?, + value: Float::new(self.value.norm()).unwrap_not_nan(span)?, } .into()) } .auto_call(context, span, arguments, expressions) } "norm_squared" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { Ok(Scalar { dimension: self.dimension, - value: Number::new(self.value.norm_squared()).unwrap_not_nan(span)?, + value: Float::new(self.value.norm_squared()).unwrap_not_nan(span)?, } .into()) } .auto_call(context, span, arguments, expressions) } "normalize" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { let value = self.value.normalize(); value.check_nan(span)?; @@ -417,11 +589,41 @@ impl NamedObject for Vector> { impl Vector where - DefaultAllocator: Allocator, + DefaultAllocator: Allocator, { - fn validate_dimensions_match<'a, S: Span>(&self, span: &S, rhs: &Self) -> OperatorResult + pub(super) fn check_dimension( + &self, + span: &S, + dimension: Dimension, + ) -> OperatorResult { + if self.dimension == dimension { + Ok(()) + } else { + Err(Failure::ExpectedGot( + span.clone(), + get_dimension_name(&dimension), + get_dimension_name(&self.dimension), + )) + } + } + + pub(super) fn from_value_ref<'b, S: Span>( + span: &S, + value: &'b Value, + dimension: Dimension, + ) -> OperatorResult where - Vector: NamedObject + Object<'a, S>, + Self: NamedObject, + Value: AsVariant, + { + let value = value.downcast_ref::(span)?; + value.check_dimension(span, dimension)?; + + Ok(value) + } + fn validate_dimensions_match(&self, span: &S, rhs: &Self) -> OperatorResult + where + Vector: NamedObject + Object, { if self.dimension == rhs.dimension { Ok(()) @@ -434,14 +636,14 @@ where } } - fn unpack_for_addition_or_subtraction<'a, 'b, S: Span>( + fn unpack_for_addition_or_subtraction<'b, S: Span>( &'b self, span: &S, - rhs: &'b Value<'a, S>, + rhs: &'b Value, ) -> OperatorResult where - Vector: NamedObject + Object<'a, S>, - Value<'a, S>: AsVariant>, + Vector: NamedObject + Object, + Value: AsVariant>, { let rhs = rhs.downcast_ref::>(span)?; self.validate_dimensions_match(span, rhs)?; @@ -449,7 +651,7 @@ where Ok(rhs) } - fn index_by_character(&self, span: &S, c: char) -> OperatorResult { + fn index_by_character(&self, span: &S, c: char) -> OperatorResult { let index = match c { 'x' | 'r' => 0, 'y' | 'g' => 1, @@ -459,19 +661,19 @@ where }; if let Some(component) = self.value.get(index).copied() { - Ok(Number::new(component).unwrap()) + Ok(Float::new(component).unwrap()) } else { Err(Failure::CharacterNotInVector(span.clone(), c)) } } - fn splat<'a, S: Span>( - _context: &mut ExecutionContext<'a, S>, + fn splat( + _context: &mut ExecutionContext, _span: &S, splat_value: Scalar, - ) -> OperatorResult> + ) -> OperatorResult> where - Value<'a, S>: From, + Value: From, { let dimension = splat_value.dimension; let value = NVector::repeat(*splat_value.value); @@ -479,19 +681,19 @@ where Ok(Vector { dimension, value }.into()) } - fn from_components<'a, S: Span>( - _context: &mut ExecutionContext<'a, S>, + fn from_components( + _context: &mut ExecutionContext, span: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> + ) -> OperatorResult> where - Value<'a, S>: From, + Value: From, { let mut expression_iter = expressions.iter(); let mut argument_iter = arguments.into_iter(); - let mut components = ArrayVec::::new(); + let mut components = ArrayVec::::new(); let first_argument = argument_iter .next() @@ -534,479 +736,357 @@ where .into()) } } - - pub fn as_fornjot_vector( - &self, - context: &ExecutionContext, - span: &S, - ) -> OperatorResult> - where - Const: ToTypenum, - { - let mut number_array = context - .global_resources - .fornjot_unit_conversion_factor - .convert_from_vector_to_iter(span, self)? - .map(|c| FornjotScalar::from_f64(c.into_inner())); - - let components = std::array::from_fn(|_| number_array.next().unwrap()); - - let vector = fj_math::Vector { components }; - - Ok(vector) - } - - pub fn as_fornjot_point( - &self, - context: &ExecutionContext, - span: &S, - ) -> OperatorResult> - where - Const: ToTypenum, - { - Ok(fj_math::Point { - coords: self.as_fornjot_vector(context, span)?, - }) - } } #[cfg(test)] mod test { use super::*; - use common_data_types::{Dimension, RatioTypeHint, RawNumber}; + use common_data_types::{Dimension, RatioTypeHint, RawFloat}; use crate::script::{ execution::{expressions::run_expression, ExecutionContext}, parsing::Expression, + Runtime, }; #[test] fn construct_vec2() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(1.0, 1.0), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(1.0, 2.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1)").unwrap().1), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(1.0, 1.0), + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2)").unwrap().1), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(1.0, 2.0), + } + .into()) + ); + }); } #[test] fn construct_vec3() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec3(1)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 1.0, 1.0), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec3(1, 2, 3)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 2.0, 3.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec3(1)").unwrap().1), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 1.0, 1.0), + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec3(1, 2, 3)").unwrap().1), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 2.0, 3.0), + } + .into()) + ); + }); } #[test] fn construct_vec4() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 1.0, 1.0, 1.0), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4)").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 2.0, 3.0, 4.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec4(1)").unwrap().1), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 1.0, 1.0, 1.0), + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4)").unwrap().1), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 2.0, 3.0, 4.0), + } + .into()) + ); + }); } #[test] fn to_fornjot_vector() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1mm, 2mm)").unwrap().1)) - ) - .unwrap() - .downcast::>>(&"") - .unwrap() - .as_fornjot_vector(&context, &""), - Ok(fj_math::Vector::<2> { - components: [1.0.into(), 2.0.into()] - }) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1rad, 2rad)").unwrap().1)) - ) - .unwrap() - .downcast::>>(&"") - .unwrap() - .as_fornjot_vector::<_, 2>(&context, &""), - Err(Failure::ExpectedGot("", "Length".into(), "Angle".into())) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1mm, 2mm)").unwrap().1) + .unwrap() + .downcast::>>(&"") + .map(|v| -> LengthVector2 { v.try_into().unwrap() }) + .unwrap() + .as_fornjot_vector(context), + fj_math::Vector::<2> { + components: [1.0.into(), 2.0.into()] + } + ); + }); } #[test] fn to_fornjot_point() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1mm, 2mm)").unwrap().1)) - ) - .unwrap() - .downcast::>>(&"") - .unwrap() - .as_fornjot_point(&context, &""), - Ok(fj_math::Point::<2> { - coords: fj_math::Vector::<2> { - components: [1.0.into(), 2.0.into()] + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1mm, 2mm)").unwrap().1) + .unwrap() + .downcast::>>(&"") + .map(|v| -> LengthVector2 { v.try_into().unwrap() }) + .unwrap() + .as_fornjot_point(context), + fj_math::Point::<2> { + coords: fj_math::Vector::<2> { + components: [1.0.into(), 2.0.into()] + } } - }) - ); + ); + }); } #[test] fn index() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2)[0]").unwrap().1)) - ), - Ok(Scalar::from_number(Number::new(1.0).unwrap()).into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2)[1]").unwrap().1)) - ), - Ok(Scalar::from_number(Number::new(2.0).unwrap()).into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2)[2]").unwrap().1)) - ), - Err(Failure::IndexOutOfRange("vec2", 2)) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2)[-1]").unwrap().1)) - ), - Err(Failure::IndexOutOfRange("vec2", -1)) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2)[0]").unwrap().1), + Ok(Scalar::from_number(Float::new(1.0).unwrap()).into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2)[1]").unwrap().1), + Ok(Scalar::from_number(Float::new(2.0).unwrap()).into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2)[2]").unwrap().1), + Err(Failure::IndexOutOfRange("vec2", 2)) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2)[-1]").unwrap().1), + Err(Failure::IndexOutOfRange("vec2", -1)) + ); + }); } #[test] fn swizzle() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).x").unwrap().1)) - ), - Ok(Number::new(1.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).y").unwrap().1)) - ), - Ok(Number::new(2.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).z").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).w").unwrap().1)) - ), - Ok(Number::new(4.0).unwrap().into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).r").unwrap().1)) - ), - Ok(Number::new(1.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).g").unwrap().1)) - ), - Ok(Number::new(2.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).b").unwrap().1)) - ), - Ok(Number::new(3.0).unwrap().into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec4(1, 2, 3, 4).a").unwrap().1)) - ), - Ok(Number::new(4.0).unwrap().into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec4(1, 2, 3, 4).xy").unwrap().1 - )) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 2.0), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec4(1, 2, 3, 4).xyz").unwrap().1 - )) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 2.0, 3.0,), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec4(1, 2, 3, 4).xyzw").unwrap().1 - )) - ), - Ok(Vector { - dimension: Dimension { - length: 0, - mass: 0, - time: 0, - electric_current: 0, - thermodynamic_temprature: 0, - amount_of_substance: 0, - luminous_intensity: 0, - ratio_type_hint: RatioTypeHint(0), - }, - value: NVector::>::new(1.0, 2.0, 3.0, 4.0,), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).x").unwrap().1), + Ok(Float::new(1.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).y").unwrap().1), + Ok(Float::new(2.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).z").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).w").unwrap().1), + Ok(Float::new(4.0).unwrap().into()) + ); + + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).r").unwrap().1), + Ok(Float::new(1.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).g").unwrap().1), + Ok(Float::new(2.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).b").unwrap().1), + Ok(Float::new(3.0).unwrap().into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec4(1, 2, 3, 4).a").unwrap().1), + Ok(Float::new(4.0).unwrap().into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse("vec4(1, 2, 3, 4).xy").unwrap().1 + ), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 2.0), + } + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("vec4(1, 2, 3, 4).xyz").unwrap().1 + ), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 2.0, 3.0,), + } + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("vec4(1, 2, 3, 4).xyzw").unwrap().1 + ), + Ok(Vector { + dimension: Dimension { + length: 0, + mass: 0, + time: 0, + electric_current: 0, + thermodynamic_temprature: 0, + amount_of_substance: 0, + luminous_intensity: 0, + ratio_type_hint: RatioTypeHint(0), + }, + value: NVector::>::new(1.0, 2.0, 3.0, 4.0,), + } + .into()) + ); + }); } #[test] fn addition() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec2(1, 2) + vec2(3, 4)").unwrap().1 - )) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(4.0, 6.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("vec2(1, 2) + vec2(3, 4)").unwrap().1 + ), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(4.0, 6.0), + } + .into()) + ); + }); } #[test] fn subtraction() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec2(1, 2) - vec2(3, 4)").unwrap().1 - )) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(-2.0, -2.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("vec2(1, 2) - vec2(3, 4)").unwrap().1 + ), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(-2.0, -2.0), + } + .into()) + ); + }); } #[test] fn scalar_multiplication() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2) * 4").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(4.0, 8.0), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2) * 4").unwrap().1), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(4.0, 8.0), + } + .into()) + ); + }); } #[test] fn scalar_division() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2) / 2").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(0.5, 1.0), - } - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("vec2(1, 2) / 0").unwrap().1)) - ), - Ok(Vector { - dimension: Dimension::zero(), - value: NVector::>::new(RawNumber::INFINITY, RawNumber::INFINITY,), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2) / 2").unwrap().1), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(0.5, 1.0), + } + .into()) + ); + assert_eq!( + run_expression(context, &Expression::parse("vec2(1, 2) / 0").unwrap().1), + Ok(Vector { + dimension: Dimension::zero(), + value: NVector::>::new(RawFloat::INFINITY, RawFloat::INFINITY,), + } + .into()) + ); + }); } #[test] fn nan_check() { assert_eq!(NVector::>::new(1.0, 1.0).check_nan(&"nan"), Ok(())); assert_eq!( - NVector::>::new(RawNumber::NAN, 1.0).check_nan(&"nan"), + NVector::>::new(RawFloat::NAN, 1.0).check_nan(&"nan"), Err(Failure::ResultIsNan("nan")), ); assert_eq!( - NVector::>::new(1.0, RawNumber::NAN).check_nan(&"nan"), + NVector::>::new(1.0, RawFloat::NAN).check_nan(&"nan"), Err(Failure::ResultIsNan("nan")), ); @@ -1015,35 +1095,33 @@ mod test { Ok(()) ); assert_eq!( - NVector::>::new(RawNumber::NAN, 1.0, 1.0).check_nan(&"nan"), + NVector::>::new(RawFloat::NAN, 1.0, 1.0).check_nan(&"nan"), Err(Failure::ResultIsNan("nan")), ); assert_eq!( - NVector::>::new(1.0, RawNumber::NAN, 1.0).check_nan(&"nan"), + NVector::>::new(1.0, RawFloat::NAN, 1.0).check_nan(&"nan"), Err(Failure::ResultIsNan("nan")), ); assert_eq!( - NVector::>::new(1.0, 1.0, RawNumber::NAN).check_nan(&"nan"), + NVector::>::new(1.0, 1.0, RawFloat::NAN).check_nan(&"nan"), Err(Failure::ResultIsNan("nan")), ); } #[test] fn angle() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("vec2(0, 1).angle(vec2(1, 0))").unwrap().1 - )) - ), - Ok(Scalar { - dimension: Dimension::angle(), - value: Number::new(0.5).unwrap(), - } - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("vec2(0, 1).angle(vec2(1, 0))").unwrap().1 + ), + Ok(Scalar { + dimension: Dimension::angle(), + value: Float::new(0.5).unwrap(), + } + .into()) + ); + }); } } diff --git a/src/script/execution/types/mod.rs b/src/script/execution/types/mod.rs index ed62f0e..0c629c2 100644 --- a/src/script/execution/types/mod.rs +++ b/src/script/execution/types/mod.rs @@ -44,7 +44,7 @@ pub mod function; pub use function::{BuiltinFunction, UserFunction}; mod structures; -pub use structures::{validate_assignment_type, StructDefinition, Structure}; +pub use structures::{StructDefinition, Structure}; mod list; pub use list::List; @@ -56,9 +56,10 @@ pub use string::{ }; mod math; +use self::function::BuiltinFunctionRef; pub use self::math::{ - print_all_supported_units, Quaternion, Scalar, Transform2D, Transform3D, Vector2, Vector3, - Vector4, + print_all_supported_units, Length, LengthVector2, Quaternion, Scalar, Transform2D, Transform3D, + Vector2, Vector3, Vector4, }; mod range; @@ -70,20 +71,21 @@ pub use closure::Closure; mod serializable; pub use serializable::SerializableValue; -mod fornjot; -pub use fornjot::{ +mod modeling; +pub use modeling::{ curve::Curve, cycle::Cycle, face::Face, half_edge::HalfEdge, region::Region, shell::Shell, sketch::Sketch, solid::Solid, surface::Surface, vertex::Vertex, }; pub fn register_globals(context: &mut ExecutionContext<'_, S>) { math::register_globals(context); - fornjot::register_globals(context); + modeling::register_globals(context); } +// TODO this should probably be moved to failure_message.rs pub type OperatorResult = std::result::Result>; -fn unsupported_operation_message<'a, S: Span, R, O: Object<'a, S>>( +fn unsupported_operation_message + ?Sized>( object: &O, span: &S, operation_name: &'static str, @@ -95,13 +97,22 @@ fn unsupported_operation_message<'a, S: Span, R, O: Object<'a, S>>( )) } +pub trait TypedObject { + fn get_type() -> VariableType; +} + pub trait NamedObject { fn static_type_name() -> &'static str; } #[enum_dispatch] -pub trait Object<'a, S: Span>: Sized + Clone + NamedObject { - fn matches_type(&self, ty: &VariableType) -> bool; +pub trait Object: NamedObject { + fn matches_type( + &self, + ty: &VariableType, + log: &mut dyn RuntimeLog, + variable_name_span: &S, + ) -> OperatorResult; fn format( &self, @@ -122,64 +133,59 @@ pub trait Object<'a, S: Span>: Sized + Clone + NamedObject { &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "and") } fn or( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "or") } fn cmp( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, + _rhs: &Value, ) -> OperatorResult { unsupported_operation_message(self, span, "compare") } - fn eq( - &self, - log: &mut dyn RuntimeLog, - span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult { + fn eq(&self, log: &mut dyn RuntimeLog, span: &S, rhs: &Value) -> OperatorResult { Ok(matches!(self.cmp(log, span, rhs)?, Ordering::Equal)) } fn addition( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "addition") } fn subtraction( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "subtraction") } fn multiply( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "multiply") } fn divide( &self, _log: &mut dyn RuntimeLog, span: &S, - _rhs: &Value<'a, S>, - ) -> OperatorResult> { + _rhs: &Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "divide") } fn attribute( @@ -187,62 +193,54 @@ pub trait Object<'a, S: Span>: Sized + Clone + NamedObject { _log: &mut dyn RuntimeLog, _span: &S, attribute: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { Err(Failure::UnknownAttribute(attribute.clone())) } fn call( &self, - _context: &mut ExecutionContext<'a, S>, + _context: &mut ExecutionContext, span: &S, - _arguments: Vec>, + _arguments: Vec>, _spans: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { unsupported_operation_message(self, span, "call") } fn method_call( &self, - _context: &mut ExecutionContext<'a, S>, + _context: &mut ExecutionContext, _span: &S, attribute: &S, - _arguments: Vec>, + _arguments: Vec>, _spans: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { Err(Failure::UnknownAttribute(attribute.clone())) } fn index( &self, _log: &mut dyn RuntimeLog, span: &S, - _index: Value<'a, S>, - ) -> OperatorResult> { + _index: Value, + ) -> OperatorResult> { unsupported_operation_message(self, span, "index") } fn iterate( &self, _log: &mut dyn RuntimeLog, span: &S, - ) -> OperatorResult> + '_>> { + ) -> OperatorResult>>> { unsupported_operation_message(self, span, "iterate") } - fn unary_plus( - &self, - _log: &mut dyn RuntimeLog, - span: &S, - ) -> OperatorResult> { + fn unary_plus(&self, _log: &mut dyn RuntimeLog, span: &S) -> OperatorResult> { unsupported_operation_message(self, span, "unary plus") } - fn unary_minus( - &self, - _log: &mut dyn RuntimeLog, - span: &S, - ) -> OperatorResult> { + fn unary_minus(&self, _log: &mut dyn RuntimeLog, span: &S) -> OperatorResult> { unsupported_operation_message(self, span, "unary minus") } fn unary_logical_not( &self, _log: &mut dyn RuntimeLog, span: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { unsupported_operation_message(self, span, "unary logical not") } @@ -255,20 +253,36 @@ pub trait Object<'a, S: Span>: Sized + Clone + NamedObject { } } -#[enum_dispatch(Object, FormatArgument)] -#[derive(Debug, Clone, PartialEq, EnumDowncast)] -pub enum Value<'a, S: Span> { +trait UnwrapBorrowFailure { + fn unwrap_borrow_failure(self, span: &S) -> Result>; +} + +impl UnwrapBorrowFailure for Result { + fn unwrap_borrow_failure(self, span: &S) -> Result> { + self.map_err(|_error| Failure::CannotBorrowImmutably(span.clone(), span.clone())) + } +} + +impl UnwrapBorrowFailure for Result { + fn unwrap_borrow_failure(self, span: &S) -> Result> { + self.map_err(|_error| Failure::CannotBorrowMutably(span.clone(), span.clone())) + } +} + +#[enum_dispatch(Object, ObjectClone, FormatArgument)] +#[derive(Debug, PartialEq, EnumDowncast, Clone)] +pub enum Value { NoneType, Default(DefaultValue), Boolean, - BuiltinFunction(BuiltinFunction<'a, S>), - UserFunction(UserFunction<'a, S>), - Structure(Structure<'a, S>), - StructDefinition(StructDefinition<'a, S>), - List(List<'a, S>), + BuiltinFunction(BuiltinFunctionRef), + UserFunction(UserFunction), + Structure(Structure), + StructDefinition(StructDefinition), + List(List), String(SString), Range(Range), - Closure(Closure<'a, S>), + Closure(Closure), Scalar, Vector2(Vector2), Vector3(Vector3), @@ -288,13 +302,13 @@ pub enum Value<'a, S: Span> { Vertex, } -impl<'a, S: Span> NamedObject for Value<'a, S> { +impl NamedObject for Value { fn static_type_name() -> &'static str { "Value" } } -impl<'a, S: Span> Value<'a, S> { +impl Value { pub fn downcast_ref(&self, span: &S) -> OperatorResult where T: NamedObject, @@ -340,8 +354,8 @@ impl<'a, S: Span> Value<'a, S> { } pub fn from_litteral( - context: &mut ExecutionContext<'a, S>, - value: &'a Litteral, + context: &mut ExecutionContext, + value: &Litteral, ) -> OperatorResult { match value { Litteral::Scalar(scalar) => Scalar::from_parsed(scalar), diff --git a/src/script/execution/types/fornjot/curve.rs b/src/script/execution/types/modeling/curve.rs similarity index 76% rename from src/script/execution/types/fornjot/curve.rs rename to src/script/execution/types/modeling/curve.rs index 12d1d3c..e226777 100644 --- a/src/script/execution/types/fornjot/curve.rs +++ b/src/script/execution/types/modeling/curve.rs @@ -19,7 +19,11 @@ use fj_core::{storage::Handle, topology::Curve as FornjotCurve}; use crate::script::{ - execution::{types::Object, ExecutionContext}, + execution::{ + types::{Object, OperatorResult}, + ExecutionContext, + }, + logging::RuntimeLog, parsing::VariableType, Span, }; @@ -35,9 +39,14 @@ pub struct Curve { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Curve { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Face) +impl Object for Curve { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Face)) } } diff --git a/src/script/execution/types/fornjot/cycle.rs b/src/script/execution/types/modeling/cycle.rs similarity index 55% rename from src/script/execution/types/fornjot/cycle.rs rename to src/script/execution/types/modeling/cycle.rs index af5868a..9684fca 100644 --- a/src/script/execution/types/fornjot/cycle.rs +++ b/src/script/execution/types/modeling/cycle.rs @@ -22,10 +22,11 @@ use crate::script::{ execution::{ types::{ function::{AutoCall, IntoBuiltinFunction}, - Object, OperatorResult, Structure, Value, + Object, OperatorResult, Value, }, ExecutionContext, Failure, }, + logging::RuntimeLog, parsing::VariableType, Span, }; @@ -36,19 +37,24 @@ use fj_core::{ topology::Cycle as FornjotCycle, }; -use super::{circle::unwrap_circle, handle_wrapper, polygon::unwrap_polygon}; +use super::{ + handle_wrapper, + structs::{Circle, Polygon, Segments}, +}; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "new_cycle", - (|context: &mut ExecutionContext<'a, S>, span: &S, configuration: Structure<'a, S>| { - match configuration.name() { + (|context: &mut ExecutionContext, span: &S, configuration: Value| match configuration + { + Value::Structure(configuration) => match configuration.name() { "Circle" => { - let (center, radius) = unwrap_circle(context, span, configuration)?; + let circle = Circle::unpack_struct(span, configuration)?; let circle = FornjotCycle::circle( - center, - radius, + circle.center.as_fornjot_point(context), + circle.radius.as_fornjot_scalar(context), + circle.surface.handle, &mut context.global_resources.fornjot_core, ); let circle = circle.insert(&mut context.global_resources.fornjot_core); @@ -57,24 +63,43 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { Ok(Cycle { handle: circle }.into()) } "Polygon" => { - let points = unwrap_polygon(context, span, configuration)?; + let polygon = Polygon::unpack_struct(span, configuration)?; + + let polygone = FornjotCycle::polygon( + polygon.points(context, span)?, + polygon.surface.handle, + &mut context.global_resources.fornjot_core, + ); + let polygon = polygone.insert(&mut context.global_resources.fornjot_core); + context.unpack_validation_warnings(span); - let polygone = - FornjotCycle::polygon(points, &mut context.global_resources.fornjot_core); + Ok(Cycle { handle: polygon }.into()) + } + "Segments" => { + let segments = Segments::unpack_struct(span, configuration)?; + let points = segments.as_polygon(context, span)?; + + let polygone = FornjotCycle::polygon( + points, + segments.surface.handle, + &mut context.global_resources.fornjot_core, + ); let polygon = polygone.insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); Ok(Cycle { handle: polygon }.into()) } - // "RawCycle" => { - // todo!() // TODO I want to be able to build a region from half-edges. - // } _ => Err(Failure::ExpectedGot( span.clone(), - "Empty, Circle, or Polygon".into(), + "Empty, Circle, Polygon, or list of edges".into(), configuration.name().to_string().into(), )), - } + }, + configuration => Err(Failure::ExpectedGot( + span.clone(), + "Empty, Circle, Polygon, or list of edges".into(), + configuration.type_name(), + )), }) .into_builtin_function() .into(), @@ -86,22 +111,27 @@ pub struct Cycle { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Cycle { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Cycle) +impl Object for Cycle { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Cycle)) } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, spans: &[crate::script::parsing::Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { "reverse" => { - |context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + |context: &mut ExecutionContext, _span: &S| -> OperatorResult> { let reversed = self .handle .deref() @@ -126,45 +156,42 @@ mod test { use crate::script::{ execution::{expressions::run_expression, types::Value}, parsing::Expression, + Runtime, }; use super::*; #[test] fn construct_circle() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm })" + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + run_expression( + context, + &Expression::parse( + "new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() })" ) .unwrap() .1 - )), - ), - Ok(Value::Cycle(_)) - )); + ), + Ok(Value::Cycle(_)) + )); + }); } #[test] fn construct_polygon() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_cycle(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)] })" + context, + &Expression::parse( + "new_cycle(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)], surface = global_xy_plane() })" ) .unwrap() .1 - )) ), Ok(Value::Cycle(_)) )); + }); } } diff --git a/src/script/execution/types/fornjot/face.rs b/src/script/execution/types/modeling/face.rs similarity index 78% rename from src/script/execution/types/fornjot/face.rs rename to src/script/execution/types/modeling/face.rs index 9e39b96..a47ef05 100644 --- a/src/script/execution/types/fornjot/face.rs +++ b/src/script/execution/types/modeling/face.rs @@ -19,7 +19,11 @@ use fj_core::{storage::Handle, topology::Face as FornjotFace}; use crate::script::{ - execution::{types::Object, ExecutionContext}, + execution::{ + types::{Object, OperatorResult}, + ExecutionContext, + }, + logging::RuntimeLog, parsing::VariableType, Span, }; @@ -35,9 +39,14 @@ pub struct Face { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Face { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Face) +impl Object for Face { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Face)) } } diff --git a/src/script/execution/types/fornjot/half_edge.rs b/src/script/execution/types/modeling/half_edge.rs similarity index 76% rename from src/script/execution/types/fornjot/half_edge.rs rename to src/script/execution/types/modeling/half_edge.rs index 37d067f..f62644c 100644 --- a/src/script/execution/types/fornjot/half_edge.rs +++ b/src/script/execution/types/modeling/half_edge.rs @@ -19,7 +19,11 @@ use fj_core::{storage::Handle, topology::HalfEdge as FornjotHalfEdge}; use crate::script::{ - execution::{types::Object, ExecutionContext}, + execution::{ + types::{Object, OperatorResult}, + ExecutionContext, + }, + logging::RuntimeLog, parsing::VariableType, Span, }; @@ -35,9 +39,14 @@ pub struct HalfEdge { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for HalfEdge { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Face) +impl Object for HalfEdge { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Face)) } } diff --git a/src/script/execution/types/fornjot/mod.rs b/src/script/execution/types/modeling/mod.rs similarity index 86% rename from src/script/execution/types/fornjot/mod.rs rename to src/script/execution/types/modeling/mod.rs index fbadabe..45f4b70 100644 --- a/src/script/execution/types/fornjot/mod.rs +++ b/src/script/execution/types/modeling/mod.rs @@ -19,23 +19,21 @@ use crate::script::{execution::ExecutionContext, Span}; // TODO I want a box type that can be a square or a rectangle. -mod circle; pub mod curve; pub mod cycle; pub mod face; pub mod half_edge; pub mod object_set; -mod polygon; pub mod region; pub mod shell; pub mod sketch; pub mod solid; +mod structs; pub mod surface; pub mod vertex; pub fn register_globals(context: &mut ExecutionContext<'_, S>) { - circle::register_globals(context); - polygon::register_globals(context); + structs::register_globals(context); cycle::register_globals(context); face::register_globals(context); @@ -51,7 +49,7 @@ pub fn register_globals(context: &mut ExecutionContext<'_, S>) { macro_rules! handle_wrapper { ($name:ident, $handle:ident) => { - impl<'a, S: Span> From> for crate::script::execution::types::Value<'a, S> { + impl From> for crate::script::execution::types::Value { fn from(handle: Handle<$handle>) -> Self { $name::from(handle).into() } @@ -68,13 +66,11 @@ macro_rules! handle_wrapper { } } - impl<'a, S: Span> TryFrom> - for Handle<$handle> - { - type Error = crate::script::execution::types::Value<'a, S>; + impl TryFrom> for Handle<$handle> { + type Error = crate::script::execution::types::Value; fn try_from( - value: crate::script::execution::types::Value<'a, S>, + value: crate::script::execution::types::Value, ) -> Result { use enum_downcast::EnumDowncast; let value = value.enum_downcast::<$name>()?; @@ -96,6 +92,12 @@ macro_rules! handle_wrapper { } } + impl crate::script::execution::types::TypedObject for $name { + fn get_type() -> VariableType { + VariableType::$name + } + } + impl crate::script::execution::types::NamedObject for $name { fn static_type_name() -> &'static str { stringify!($name) diff --git a/src/script/execution/types/fornjot/object_set.rs b/src/script/execution/types/modeling/object_set.rs similarity index 91% rename from src/script/execution/types/fornjot/object_set.rs rename to src/script/execution/types/modeling/object_set.rs index 0084184..e23ae01 100644 --- a/src/script/execution/types/fornjot/object_set.rs +++ b/src/script/execution/types/modeling/object_set.rs @@ -26,12 +26,14 @@ use crate::script::{ Span, }; -impl<'a, S, T> From<&ObjectSet> for Value<'a, S> +impl Value where S: Span, - Value<'a, S>: From>, { - fn from(object_set: &ObjectSet) -> Self { + pub fn from_object_set(object_set: &ObjectSet) -> Self + where + Value: From>, + { List::from(object_set.iter().map(|handle| Value::from(handle.clone()))).into() } } diff --git a/src/script/execution/types/fornjot/region.rs b/src/script/execution/types/modeling/region.rs similarity index 61% rename from src/script/execution/types/fornjot/region.rs rename to src/script/execution/types/modeling/region.rs index d40edd4..66df9c5 100644 --- a/src/script/execution/types/fornjot/region.rs +++ b/src/script/execution/types/modeling/region.rs @@ -27,23 +27,28 @@ use fj_core::{ use crate::script::{ execution::{ types::{ - fornjot::cycle::Cycle, function::IntoBuiltinFunction, List, Object, OperatorResult, - StructDefinition, Structure, + function::IntoBuiltinFunction, List, Object, OperatorResult, StructDefinition, + Structure, }, ExecutionContext, Failure, }, + logging::RuntimeLog, parsing::{self, MemberVariable, MemberVariableType, VariableType}, Span, }; -use super::{circle::unwrap_circle, handle_wrapper, polygon::unwrap_polygon}; +use super::{ + cycle::Cycle, + handle_wrapper, + structs::{Circle, Polygon, Segments}, +}; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "RawRegion", StructDefinition { // TODO replace box leak with lazy static. - definition: Box::leak(Box::new(parsing::StructDefinition { + definition: Rc::new(parsing::StructDefinition { name: S::from_str("RawRegion"), members: vec![ MemberVariable { @@ -63,22 +68,23 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { }, }, ], - })), + }), } .into(), ); context.stack.new_variable_str( "new_region", - (|context: &mut ExecutionContext<'a, S>, span: &S, configuration: Structure<'a, S>| { + (|context: &mut ExecutionContext, span: &S, configuration: Structure| { match configuration.name() { "Circle" => { - let (center, radius) = unwrap_circle(context, span, configuration)?; + let circle = Circle::unpack_struct(span, configuration)?; let region = Region::from( FornjotRegion::circle( - center, - radius, + circle.center.as_fornjot_point(context), + circle.radius.as_fornjot_scalar(context), + circle.surface.handle, &mut context.global_resources.fornjot_core, ) .insert(&mut context.global_resources.fornjot_core), @@ -89,17 +95,40 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { Ok(region.into()) } "Polygon" => { - let points = unwrap_polygon(context, span, configuration)?; + let polygon = Polygon::unpack_struct(span, configuration)?; let region = Region::from( - FornjotRegion::polygon(points, &mut context.global_resources.fornjot_core) - .insert(&mut context.global_resources.fornjot_core), + FornjotRegion::polygon( + polygon.points(context, span)?, + polygon.surface.handle, + &mut context.global_resources.fornjot_core, + ) + .insert(&mut context.global_resources.fornjot_core), ); context.unpack_validation_warnings(span); Ok(region.into()) } + "Segments" => { + let segments = Segments::unpack_struct(span, configuration)?; + let mut polygon = segments.as_polygon(context, span)?; + + // The last point just returns to the starting point. + // TODO validate that it's actually at the starting point. + polygon.pop(); + + let region = Region::from( + FornjotRegion::polygon( + polygon, + segments.surface.handle, + &mut context.global_resources.fornjot_core, + ) + .insert(&mut context.global_resources.fornjot_core), + ); + context.unpack_validation_warnings(span); + Ok(region.into()) + } "RawRegion" => { let region = Region::build_raw(context, span, configuration)?; Ok(region.into()) @@ -107,7 +136,7 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { // TODO build a region from an SVG file. _ => Err(Failure::ExpectedGot( span.clone(), - "Empty, Circle, or Polygon".into(), + "Empty, Circle, Polygon, or Segments".into(), configuration.name().to_string().into(), )), } @@ -123,10 +152,10 @@ pub struct Region { } impl Region { - fn build_raw<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, + fn build_raw( + context: &mut ExecutionContext, span: &S, - configuration: Structure<'a, S>, + configuration: Structure, ) -> OperatorResult { let mut members = Rc::unwrap_or_clone(configuration.members); @@ -157,9 +186,14 @@ impl Region { } } -impl<'a, S: Span> Object<'a, S> for Region { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Region) +impl Object for Region { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Region)) } } @@ -170,64 +204,61 @@ mod test { use crate::script::{ execution::{expressions::run_expression, types::Value}, parsing::Expression, + Runtime, }; use super::*; #[test] fn construct_circle() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_region(Circle { center = vec2(1mm, 2mm), radius = 3mm })" + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + run_expression( + context, + &Expression::parse( + "new_region(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() })" ) .unwrap() .1 - )) - ), - Ok(Value::Region(_)) - )); + ), + Ok(Value::Region(_)) + )); + }); } #[test] fn construct_polygon() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_region(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)] })" + context, + &Expression::parse( + "new_region(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)], surface = global_xy_plane() })" ) .unwrap() .1 - )), ), Ok(Value::Region(_)) )); + }); } #[test] fn construct_raw() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( run_expression( - &mut context, - Box::leak(Box::new(Expression::parse( - "new_region(RawRegion { exterior = new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm }), - interiors = [new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm / 2 })] })" + context, + &Expression::parse( + "new_region(RawRegion { exterior = new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() }), + interiors = [new_cycle(Circle { center = vec2(1mm, 2mm), radius = 3mm / 2, surface = global_xy_plane() })] })" ) .unwrap() - .1)), + .1, ), Ok(Value::Region(_)) )); + }); } // TODO validation failure test (Fornjot failure validation should result in a Failure type when constructing an invalid region) diff --git a/src/script/execution/types/fornjot/shell.rs b/src/script/execution/types/modeling/shell.rs similarity index 82% rename from src/script/execution/types/fornjot/shell.rs rename to src/script/execution/types/modeling/shell.rs index 648fd77..7270e6d 100644 --- a/src/script/execution/types/fornjot/shell.rs +++ b/src/script/execution/types/modeling/shell.rs @@ -30,12 +30,15 @@ use fj_core::{ use crate::script::{ execution::{ - types::{function::AutoCall, List, Object, OperatorResult, Value, Vector2, Vector3}, + types::{ + function::AutoCall, math::LengthVector3, Length, LengthVector2, List, Object, + OperatorResult, Value, + }, ExecutionContext, Failure, }, logging::RuntimeLog, parsing::{Expression, VariableType}, - Scalar, Span, + Span, }; use super::{face::Face, handle_wrapper, object_set::check_for_duplicates}; @@ -49,9 +52,14 @@ pub struct Shell { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Shell { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Shell) +impl Object for Shell { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Shell)) } fn attribute( @@ -59,37 +67,36 @@ impl<'a, S: Span> Object<'a, S> for Shell { _log: &mut dyn RuntimeLog, _span: &S, attribute: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "faces" => Ok(self.handle.faces().into()), + "faces" => Ok(Value::from_object_set(self.handle.faces())), _ => Err(Failure::UnknownAttribute(attribute.clone())), } } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, spans: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "add_blind_hole" => |context: &mut ExecutionContext<'a, S>, + "add_blind_hole" => |context: &mut ExecutionContext, span: &S, face: Face, - position: Vector2, - radius: Scalar, - path: Vector3| + position: LengthVector2, + radius: Length, + path: LengthVector3| -> OperatorResult> { if !self.handle.deref().faces().contains(&face.handle) { return Err(Failure::FaceNotInShell(span.clone())); } - let position = position.as_fornjot_point(context, span)?; - let radius = radius.as_scalar(context, span)?; - - let path = path.as_fornjot_vector(context, span)?; + let position = position.as_fornjot_point(context); + let radius = radius.as_fornjot_scalar(context); + let path = path.as_fornjot_vector(context); let new_shell = self.handle.deref().add_blind_hole( HoleLocation { @@ -108,25 +115,25 @@ impl<'a, S: Span> Object<'a, S> for Shell { Ok(new_shell.into()) } .auto_call(context, span, arguments, spans), - "add_through_hole" => |context: &mut ExecutionContext<'a, S>, + "add_through_hole" => |context: &mut ExecutionContext, span: &S, front_face: Face, - front_position: Vector2, + front_position: LengthVector2, back_face: Face, - back_position: Vector2, + back_position: LengthVector2, - radius: Scalar| + radius: Length| -> OperatorResult> { let faces = self.handle.deref().faces(); if !faces.contains(&front_face.handle) || !faces.contains(&front_face.handle) { return Err(Failure::FaceNotInShell(span.clone())); } - let front_position = front_position.as_fornjot_point(context, span)?; - let back_position = back_position.as_fornjot_point(context, span)?; + let front_position = front_position.as_fornjot_point(context); + let back_position = back_position.as_fornjot_point(context); - let radius = radius.as_scalar(context, span)?; + let radius = radius.as_fornjot_scalar(context); let new_shell = self.handle.deref().add_through_hole( [ @@ -150,10 +157,10 @@ impl<'a, S: Span> Object<'a, S> for Shell { Ok(new_shell.into()) } .auto_call(context, span, arguments, spans), - "update_face" => |context: &mut ExecutionContext<'a, S>, + "update_face" => |context: &mut ExecutionContext, span: &S, face: Face, - update: Value<'a, S>| + update: Value| -> OperatorResult> { // Update shell will panic if the shell isn't found in the solid, so check that it's in there. if !self.handle.deref().faces().contains(&face.handle) { @@ -164,7 +171,7 @@ impl<'a, S: Span> Object<'a, S> for Shell { // the update function. let new_faces = update.call(context, span, vec![face.clone().into()], &[])?; let new_faces = new_faces.downcast::>(span)?; - let num_faces = new_faces.len(); + let num_faces = new_faces.len(span)?; let new_faces = new_faces .unpack_dynamic_length::(span)? .map(|shell| shell.handle); @@ -186,11 +193,11 @@ impl<'a, S: Span> Object<'a, S> for Shell { } .auto_call(context, span, arguments, spans), "add_faces" => { - |context: &mut ExecutionContext<'a, S>, + |context: &mut ExecutionContext, span: &S, - new_faces: List<'a, S>| + new_faces: List| -> OperatorResult> { - let num_faces = new_faces.len(); + let num_faces = new_faces.len(span)?; let new_faces = new_faces .unpack_dynamic_length::(span)? .map(|shell| shell.handle); diff --git a/src/script/execution/types/fornjot/sketch.rs b/src/script/execution/types/modeling/sketch.rs similarity index 56% rename from src/script/execution/types/fornjot/sketch.rs rename to src/script/execution/types/modeling/sketch.rs index 37474a5..7d06e4d 100644 --- a/src/script/execution/types/fornjot/sketch.rs +++ b/src/script/execution/types/modeling/sketch.rs @@ -26,66 +26,77 @@ use crate::script::{ execution::{ types::{ function::{AutoCall, IntoBuiltinFunction}, - Object, OperatorResult, Value, Vector3, + math::LengthVector3, + Object, OperatorResult, Value, }, ExecutionContext, Failure, }, + logging::RuntimeLog, parsing::{self, VariableType}, Span, }; use super::{ - circle::unwrap_circle, handle_wrapper, polygon::unwrap_polygon, region::Region, solid::Solid, + handle_wrapper, + region::Region, + solid::Solid, + structs::{Circle, Polygon}, surface::Surface, }; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "new_sketch", - (|context: &mut ExecutionContext<'a, S>, + (|context: &mut ExecutionContext, span: &S, - argument: Value<'a, S>| - -> OperatorResult> { - match argument { - Value::List(regions) => { + argument1: Value, + argument2: Value| + -> OperatorResult> { + match (argument1, argument2) { + (Value::Surface(surface), Value::List(regions)) => { let regions = regions .unpack_dynamic_length::(span)? .map(|region| region.handle); - let handle = FornjotSketch::new(regions) + let handle = FornjotSketch::new(surface.handle, regions) .insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); Ok(Sketch { handle }.into()) } - Value::Structure(configuration) => match configuration.name() { + (Value::Structure(configuration), Value::NoneType(_)) => match configuration.name() + { "Circle" => { - let (center, radius) = unwrap_circle(context, span, configuration)?; + let circle = Circle::unpack_struct(span, configuration)?; let region = FornjotRegion::circle( - center, - radius, + circle.center.as_fornjot_point(context), + circle.radius.as_fornjot_scalar(context), + circle.surface.handle.clone(), &mut context.global_resources.fornjot_core, ) .insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); - let handle = FornjotSketch::new([region]) + let handle = FornjotSketch::new(circle.surface.handle, [region]) .insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); Ok(Sketch { handle }.into()) } "Polygon" => { - let points = unwrap_polygon(context, span, configuration)?; + let polygon = Polygon::unpack_struct(span, configuration)?; + + let points = polygon.points(context, span)?; + let surface = polygon.surface; let polygon = FornjotRegion::polygon( points, + surface.handle.clone(), &mut context.global_resources.fornjot_core, ); - let polygon = polygon; let region = polygon.insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); - let handle = FornjotSketch::new([region]) + let handle = FornjotSketch::new(surface.handle, [region]) .insert(&mut context.global_resources.fornjot_core); context.unpack_validation_warnings(span); @@ -98,14 +109,14 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { configuration.name().to_string().into(), )), }, - value => Err(Failure::ExpectedGot( + (value_a, _value_b) => Err(Failure::ExpectedGot( span.clone(), - "Circle, Polygon, or a List of regions".into(), - value.type_name(), + "Circle, Polygon, or a surface followed by a List of regions".into(), + value_a.type_name(), )), } }) - .into_builtin_function() + .into_builtin_function_optional() .into(), ) } @@ -115,27 +126,32 @@ pub struct Sketch { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Sketch { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Sketch) +impl Object for Sketch { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Sketch)) } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, spans: &[parsing::Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "sweep" => |context: &mut ExecutionContext<'a, S>, + "sweep" => |context: &mut ExecutionContext, span: &S, surface: Surface, - path: Vector3| + path: LengthVector3| -> OperatorResult> { let surface = surface.handle; - let path = path.as_fornjot_vector(context, span)?; + let path = path.as_fornjot_vector(context); let solid = self .handle @@ -155,83 +171,77 @@ handle_wrapper!(Sketch, FornjotSketch); #[cfg(test)] mod test { - use crate::script::{execution::expressions::run_expression, parsing::Expression}; + use crate::script::{execution::expressions::run_expression, parsing::Expression, Runtime}; use super::*; #[test] fn construct_circle() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_sketch(Circle { center = vec2(1mm, 2mm), radius = 3mm })" + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + run_expression( + context, + &Expression::parse( + "new_sketch(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() })" ) .unwrap() .1 - )), - ), - Ok(Value::Sketch(_)) - )); + ), + Ok(Value::Sketch(_)) + )); + }); } #[test] fn construct_polygon() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_sketch(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)] })" + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + run_expression( + context, + &Expression::parse( + "new_sketch(Polygon { points = [vec2(0m, 0m), vec2(0m, 1m), vec2(1m, 1m), vec2(1m, 0m)], surface = global_xy_plane() })" ) .unwrap() .1 - )), - ), - Ok(Value::Sketch(_)) - )); + ), + Ok(Value::Sketch(_)) + )); + }); } #[test] fn construct_from_regions() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse( - "new_sketch([new_region(Circle { center = vec2(1mm, 2mm), radius = 3mm }), -new_region(Circle { center = vec2(4mm, 2mm), radius = 3mm })])" + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + run_expression( + context, + &Expression::parse( + "new_sketch(global_xy_plane(), [new_region(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() }), +new_region(Circle { center = vec2(4mm, 2mm), radius = 3mm, surface = global_xy_plane() })])" ) .unwrap() .1 - )), - ), - Ok(Value::Sketch(_)) - )); + ), + Ok(Value::Sketch(_)) + )); + }); } #[test] fn sweep() { - let mut context = ExecutionContext::<&'static str>::default(); - - assert!(matches!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse( - "new_sketch(Circle { center = vec2(1mm, 2mm), radius = 3mm }).sweep(global_xz_plane(), vec3(0cm, 1cm, 0cm))" - ) - .unwrap() - .1)), - ), - Ok(Value::Solid(_)) - )); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert!(matches!( + dbg!(run_expression( + context, + &Expression::parse( + "new_sketch(Circle { center = vec2(1mm, 2mm), radius = 3mm, surface = global_xy_plane() }).sweep(global_xz_plane(), vec3(0cm, 1cm, 0cm))" + ) + .unwrap() + .1, + )), + Ok(Value::Solid(_)) + )); + }); } // TODO validation failure test (Fornjot failure validation should result in a Failure type when constructing an invalid region) diff --git a/src/script/execution/types/fornjot/solid.rs b/src/script/execution/types/modeling/solid.rs similarity index 82% rename from src/script/execution/types/fornjot/solid.rs rename to src/script/execution/types/modeling/solid.rs index d3f8c85..eba9e58 100644 --- a/src/script/execution/types/fornjot/solid.rs +++ b/src/script/execution/types/modeling/solid.rs @@ -26,7 +26,7 @@ use fj_core::{ use crate::script::{ execution::{ - types::{fornjot::shell::Shell, function::AutoCall, List, Object, OperatorResult, Value}, + types::{function::AutoCall, List, Object, OperatorResult, Value}, ExecutionContext, Failure, }, logging::RuntimeLog, @@ -34,7 +34,7 @@ use crate::script::{ Span, }; -use super::{handle_wrapper, object_set::check_for_duplicates}; +use super::{handle_wrapper, object_set::check_for_duplicates, shell::Shell}; pub fn register_globals(_context: &mut ExecutionContext<'_, S>) {} @@ -43,9 +43,14 @@ pub struct Solid { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Solid { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Sketch) +impl Object for Solid { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Sketch)) } fn attribute( @@ -53,26 +58,26 @@ impl<'a, S: Span> Object<'a, S> for Solid { _log: &mut dyn RuntimeLog, _span: &S, attribute: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "shells" => Ok(self.handle.shells().into()), + "shells" => Ok(Value::from_object_set(self.handle.shells()).into()), _ => Err(Failure::UnknownAttribute(attribute.clone())), } } fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, spans: &[crate::script::parsing::Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "update_shell" => |context: &mut ExecutionContext<'a, S>, + "update_shell" => |context: &mut ExecutionContext, span: &S, shell: Shell, - update: Value<'a, S>| + update: Value| -> OperatorResult> { // Update shell will panic if the shell isn't found in the solid, so check that it's in there. if !self.handle.deref().shells().contains(&shell.handle) { @@ -83,7 +88,7 @@ impl<'a, S: Span> Object<'a, S> for Solid { // the update function. let new_shells = update.call(context, span, vec![shell.clone().into()], &[])?; let new_shells = new_shells.downcast::>(span)?; - let num_shells = new_shells.len(); + let num_shells = new_shells.len(span)?; let new_shells = new_shells .unpack_dynamic_length::(span)? .map(|shell| shell.handle); @@ -105,11 +110,11 @@ impl<'a, S: Span> Object<'a, S> for Solid { } .auto_call(context, span, arguments, spans), "add_shells" => { - |context: &mut ExecutionContext<'a, S>, + |context: &mut ExecutionContext, span: &S, - new_shells: List<'a, S>| + new_shells: List| -> OperatorResult> { - let num_shells = new_shells.len(); + let num_shells = new_shells.len(span)?; let new_shells = new_shells .unpack_dynamic_length::(span)? .map(|shell| shell.handle); diff --git a/src/script/execution/types/modeling/structs.rs b/src/script/execution/types/modeling/structs.rs new file mode 100644 index 0000000..934993d --- /dev/null +++ b/src/script/execution/types/modeling/structs.rs @@ -0,0 +1,313 @@ +/* + * Copyright 2024 James Carl + * AGPL-3.0-only or AGPL-3.0-or-later + * + * This file is part of Command Cad. + * + * Command CAD is free software: you can redistribute it and/or modify it under the terms of + * the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License along with this + * program. If not, see . + */ + +use std::rc::Rc; + +use bezier_rs::{Bezier, BezierHandles, TValueType}; +use common_data_types::Float; +use fj_math::Point; +use glam::f64::DVec2; +use macros::Struct; +use parsing::Span; + +use crate::script::{ + execution::{ + types::{ + math::{Angle, ConvertUnit}, + Length, LengthVector2, List, NamedObject, Object, OperatorResult, StructDefinition, + Structure, Vector2, + }, + ExecutionContext, + }, + parsing::{self, MemberVariable, MemberVariableType}, + Failure, +}; + +use super::surface::Surface; + +pub fn register_globals(context: &mut ExecutionContext<'_, S>) { + Circle::define_struct(context); + Polygon::define_struct(context); + + Segments::define_struct(context); + CenterArc::define_struct(context); + Line::define_struct(context); + QuadraticBezier::define_struct(context); + CubicBezier::define_struct(context); +} + +/// A single, perfectly round, and closed circle. +#[derive(Debug, Struct)] +pub struct Circle { + pub center: LengthVector2, + pub radius: Length, + pub surface: Surface, +} + +/// A list of straight segments that may or may not be closed. +/// Some functions expect this to be closed and will give an error if it is not. +#[derive(Debug, Struct)] +pub struct Polygon { + pub points: List, + pub surface: Surface, +} + +impl Polygon { + pub fn points( + &self, + context: &ExecutionContext, + span: &S, + ) -> OperatorResult>> { + let mut fornjot_points = Vec::with_capacity(self.points.len(span)?); + for point in self.points.clone().unpack_dynamic_length::(span)? { + let point = LengthVector2::try_from(point).map_err(|point| { + Failure::ExpectedGot( + span.clone(), + LengthVector2::static_type_name().into(), + >::type_name(&point), + ) + })?; + let point = point.as_fornjot_point(context); + + fornjot_points.push(point); + } + + Ok(fornjot_points) + } +} + +/// Defines a region made of complex segments, such as lines, arcs, and bezier curves. +#[derive(Debug, Struct)] +pub struct Segments { + pub start: LengthVector2, + pub segments: List, + #[default = "1mm"] + pub distance_between_verticies: Length, + pub surface: Surface, +} + +impl Segments { + pub fn as_polygon( + &self, + context: &ExecutionContext, + span: &S, + ) -> OperatorResult>> { + let mut last_point = self.start.clone(); + let mut points = vec![last_point.as_fornjot_point(context)]; + let distance_per_step = self.distance_between_verticies; + + for edge in self.segments.iter(span)? { + let structure = edge.downcast::>(span)?; + + match structure.name() { + "CenterArc" => { + let arc = CenterArc::unpack_struct(span, structure)?; + let direction = if arc.clockwise { + ArcDirection::Clockwise + } else { + ArcDirection::CounterClockwise + }; + let end = arc_to_points(context, distance_per_step, last_point, arc.center, arc.angle, direction, &mut points); + last_point = end; + } + "Line" => { + let line = Line::unpack_struct(span, structure)?; + last_point = line.end; + points.push(last_point.as_fornjot_point(context)); + }, + "QuadraticBezier" => { + let bezier = QuadraticBezier::unpack_struct(span, structure)?; + let start = last_point.value; + let end = bezier.end.value; + last_point = bezier.end.clone(); + let handle = bezier.handle.value; + let bezier = Bezier { + start: DVec2::new(start.x, start.y), + end: DVec2::new(end.x, end.y), + handles: BezierHandles::Quadratic { + handle: DVec2::new(handle.x, handle.y), + }, + }; + beizer_to_points(context, &bezier, distance_per_step, &mut points); + } + "CubicBezier" => { + let bezier = CubicBezier::unpack_struct(span, structure)?; + + let start = last_point.value; + let start_handle = bezier.start_handle.value; + + let end = bezier.end.value; + let end_handle = bezier.end_handle.value; + last_point = bezier.end.clone(); + let bezier = Bezier { + start: DVec2::new(start.x, start.y), + end: DVec2::new(end.x, end.y), + handles: BezierHandles::Cubic { + handle_start: DVec2::new(start_handle.x, start_handle.y), + handle_end: DVec2::new(end_handle.x, end_handle.y) + }, + }; + beizer_to_points(context, &bezier, distance_per_step, &mut points); + } + name => { + return Err(Failure::ExpectedGot( + span.clone(), + "A Circle, Polygon, CenterArc, EndsArc, LengthArc, LinearBezier, QuadraticBezier, or a CubicBezier".into(), + name.to_string().into(), + )) + } + } + } + + Ok(points) + } +} + +fn beizer_to_points( + context: &ExecutionContext, + beizer: &Bezier, + distance_per_step: Length, + points: &mut Vec>, +) { + let length = beizer.length(None); + let steps = (length / distance_per_step.value.into_inner()).ceil() as usize; + + let lookup_table = beizer.compute_lookup_table(Some(steps), Some(TValueType::Euclidean)); + + for vertex in &lookup_table[1..] { + let x = context + .global_resources + .fornjot_unit_conversion_factor + .convert_from_base_unit(Float::new(vertex.x).unwrap()) + .into_inner(); + let y = context + .global_resources + .fornjot_unit_conversion_factor + .convert_from_base_unit(Float::new(vertex.y).unwrap()) + .into_inner(); + + points.push(fj_math::Point::<2> { + coords: fj_math::Vector::<2> { + components: [x.into(), y.into()], + }, + }); + } +} + +#[derive(Debug, Clone, Copy)] +enum ArcDirection { + Clockwise, + CounterClockwise, +} + +fn arc_to_points( + context: &ExecutionContext, + distance_per_step: Length, + start: LengthVector2, + center: LengthVector2, + angle: Angle, + direction: ArcDirection, + points: &mut Vec>, +) -> LengthVector2 { + let distance_per_step = distance_per_step + .as_fornjot_scale_float(context) + .into_inner(); + let start = start.as_fornjot_scale_nalgebra_vector::(context); + let center = center.as_fornjot_scale_nalgebra_vector::(context); + + let center_to_start = start - center; + let radius = center_to_start.norm(); + + let starting_angle = (start.y - center.y).atan2(start.x - center.x); + let angle = angle.value.into_inner(); + + let (sin, cos) = (starting_angle + angle).sin_cos(); + let end = center + nalgebra::Vector2::new(cos, sin) * radius; + + let arch_length = angle * radius; + let steps = (arch_length / distance_per_step).ceil(); + + let angle_direction = if matches!(direction, ArcDirection::Clockwise) { + -1.0 + } else { + 1.0 + }; + + let angle_step = (angle / steps) * angle_direction; + + let steps = steps as usize; + + // We skip the first step because that's already represented with the starting point. + for step_index in 1..steps { + let angle = starting_angle + angle_step * step_index as f64; + + let (sin, cos) = angle.sin_cos(); + let offset = nalgebra::Vector2::new(cos, sin) * radius; + + let new_position = center + offset; + + points.push(fj_math::Point::<2> { + coords: fj_math::Vector::<2> { + components: [new_position.x.into(), new_position.y.into()], + }, + }) + } + + points.push(fj_math::Point::<2> { + coords: fj_math::Vector::<2> { + components: [end.x.into(), end.y.into()], + }, + }); + + LengthVector2 { value: end } +} + +/// An arc defined by a senter point and a radius. +/// The radius is calulated by using the distance from the center point to the starting point/ +/// The starting point is the previous end point. +#[derive(Debug, Struct)] +pub struct CenterArc { + pub center: LengthVector2, + pub angle: Angle, + #[default = "true"] + pub clockwise: bool, +} + +/// A linear line segment. +/// The start point is assumed by the previous end point. +#[derive(Debug, Struct)] +pub struct Line { + pub end: LengthVector2, +} + +/// A quadratic Bezier curve. +/// The start point is assumed by the previous end point. +#[derive(Debug, Struct)] +pub struct QuadraticBezier { + pub end: LengthVector2, + pub handle: LengthVector2, +} + +/// A cubic Bezier curve. +/// The start point is assumed by the previous end point. +#[derive(Debug, Struct)] +pub struct CubicBezier { + pub start_handle: LengthVector2, + pub end: LengthVector2, + pub end_handle: LengthVector2, +} diff --git a/src/script/execution/types/fornjot/surface.rs b/src/script/execution/types/modeling/surface.rs similarity index 68% rename from src/script/execution/types/fornjot/surface.rs rename to src/script/execution/types/modeling/surface.rs index 486182c..dd70705 100644 --- a/src/script/execution/types/fornjot/surface.rs +++ b/src/script/execution/types/modeling/surface.rs @@ -23,16 +23,35 @@ use crate::script::{ types::{function::IntoBuiltinFunction, Object, OperatorResult, Value}, ExecutionContext, }, + logging::RuntimeLog, parsing::VariableType, Span, }; use super::handle_wrapper; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { + context.stack.new_variable_str( + "sketch_plane", + (|context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(Surface::from( + context + .global_resources + .fornjot_core + .layers + .topology + .surfaces + .space_2d(), + ) + .into()) + }) + .into_builtin_function() + .into(), + ); + context.stack.new_variable_str( "global_xy_plane", - (|context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + (|context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Surface::from( context .global_resources @@ -50,7 +69,7 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "global_xz_plane", - (|context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + (|context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Surface::from( context .global_resources @@ -68,7 +87,7 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "global_yz_plane", - (|context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { + (|context: &mut ExecutionContext, _span: &S| -> OperatorResult> { Ok(Surface::from( context .global_resources @@ -92,9 +111,14 @@ pub struct Surface { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Surface { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Surface) +impl Object for Surface { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Surface)) } } diff --git a/src/script/execution/types/fornjot/vertex.rs b/src/script/execution/types/modeling/vertex.rs similarity index 76% rename from src/script/execution/types/fornjot/vertex.rs rename to src/script/execution/types/modeling/vertex.rs index c7be8a5..24392db 100644 --- a/src/script/execution/types/fornjot/vertex.rs +++ b/src/script/execution/types/modeling/vertex.rs @@ -19,7 +19,11 @@ use fj_core::{storage::Handle, topology::Vertex as FornjotVertex}; use crate::script::{ - execution::{types::Object, ExecutionContext}, + execution::{ + types::{Object, OperatorResult}, + ExecutionContext, + }, + logging::RuntimeLog, parsing::VariableType, Span, }; @@ -35,9 +39,14 @@ pub struct Vertex { pub handle: Handle, } -impl<'a, S: Span> Object<'a, S> for Vertex { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Face) +impl Object for Vertex { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Face)) } } diff --git a/src/script/execution/types/none.rs b/src/script/execution/types/none.rs index 4703a79..653b8ad 100644 --- a/src/script/execution/types/none.rs +++ b/src/script/execution/types/none.rs @@ -16,16 +16,21 @@ * program. If not, see . */ -use crate::script::{parsing::VariableType, Span}; +use crate::script::{logging::RuntimeLog, parsing::VariableType, Span}; -use super::{NamedObject, Object}; +use super::{NamedObject, Object, OperatorResult}; #[derive(Debug, Clone, PartialEq)] pub struct NoneType; -impl Object<'_, S> for NoneType { - fn matches_type(&self, _ty: &VariableType) -> bool { - false +impl Object for NoneType { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(false) } } diff --git a/src/script/execution/types/number.rs b/src/script/execution/types/number.rs index 53acaf1..224c9dc 100644 --- a/src/script/execution/types/number.rs +++ b/src/script/execution/types/number.rs @@ -16,25 +16,25 @@ * program. If not, see . */ -use common_data_types::{FloatIsNan, Number}; +use common_data_types::{Float, FloatIsNan}; use crate::script::{execution::Failure, parsing, Span}; use super::{OperatorResult, Scalar, Value}; pub trait UnwrapNotNan: Sized { - fn unwrap_not_nan(self, span: &S) -> OperatorResult; + fn unwrap_not_nan(self, span: &S) -> OperatorResult; } -pub fn unwrap_float(span: S, number: &parsing::Number) -> OperatorResult { - match number.to_float::() { +pub fn unwrap_float(span: S, number: &parsing::Number) -> OperatorResult { + match number.to_float::() { Ok(number) => Ok(number), Err(error) => Err(Failure::NumberConversion(span, error)), } } -impl UnwrapNotNan for std::result::Result { - fn unwrap_not_nan(self, span: &S) -> OperatorResult { +impl UnwrapNotNan for std::result::Result { + fn unwrap_not_nan(self, span: &S) -> OperatorResult { match self { Ok(number) => Ok(number), Err(_float_is_nan) => Err(Failure::ResultIsNan(span.clone())), @@ -42,8 +42,8 @@ impl UnwrapNotNan for std::result::Result { } } -impl<'a, S: Span> From for Value<'a, S> { - fn from(value: Number) -> Self { +impl From for Value { + fn from(value: Float) -> Self { let measurement: Scalar = value.into(); measurement.into() } diff --git a/src/script/execution/types/range.rs b/src/script/execution/types/range.rs index 6131c7a..516ddae 100644 --- a/src/script/execution/types/range.rs +++ b/src/script/execution/types/range.rs @@ -16,7 +16,7 @@ * program. If not, see . */ -use common_data_types::Number; +use common_data_types::Float; use crate::script::{ execution::{expressions::run_trailer, ExecutionContext, Failure}, @@ -25,25 +25,30 @@ use crate::script::{ Span, }; -use super::{NamedObject, Object, OperatorResult, Scalar, Value}; +use super::{math::Number, NamedObject, Object, OperatorResult, Value}; #[derive(Debug, Clone, PartialEq)] pub struct Range { - pub lower_bound: Option, + pub lower_bound: Option, pub upper_bound_is_inclusive: bool, - pub upper_bound: Option, + pub upper_bound: Option, } -impl<'a, S: Span> Object<'a, S> for Range { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::Range) +impl Object for Range { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::Range)) } fn iterate( &self, _log: &mut dyn RuntimeLog, span: &S, - ) -> OperatorResult> + '_>> { + ) -> OperatorResult>>> { match ( self.lower_bound.as_ref(), self.upper_bound.as_ref(), @@ -70,18 +75,17 @@ impl<'a, S: Span> Object<'a, S> for Range { "iterator".into(), )), (Some(lower_bound), Some(upper_bound), false) => { - let lower_bound = lower_bound.to_index(span)?; - let upper_bound = upper_bound.to_index(span)?; + let lower_bound = lower_bound.to_index(); + let upper_bound = upper_bound.to_index(); Ok(Box::new( - (lower_bound..upper_bound).map(|index| Number::new(index as _).unwrap().into()), + (lower_bound..upper_bound).map(|index| Float::new(index as _).unwrap().into()), )) } (Some(lower_bound), Some(upper_bound), true) => { - let lower_bound = lower_bound.to_index(span)?; - let upper_bound = upper_bound.to_index(span)?; + let lower_bound = lower_bound.to_index(); + let upper_bound = upper_bound.to_index(); Ok(Box::new( - (lower_bound..=upper_bound) - .map(|index| Number::new(index as _).unwrap().into()), + (lower_bound..=upper_bound).map(|index| Float::new(index as _).unwrap().into()), )) } (_, None, true) => unreachable!(), // Inclusive ranges without an upper bound are illegal to construct. @@ -90,9 +94,9 @@ impl<'a, S: Span> Object<'a, S> for Range { } impl Range { - pub fn from_parsed<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - range: &'a parsing::Range, + pub fn from_parsed( + context: &mut ExecutionContext, + range: &parsing::Range, ) -> OperatorResult { let lower_bound = if let Some(lower_bound) = &range.lower_bound { let span = lower_bound.get_span(); @@ -131,81 +135,73 @@ impl NamedObject for Range { #[cfg(test)] mod test { + use crate::script::Runtime; + use super::*; #[test] fn iterate() { - let mut context = ExecutionContext::default(); - - assert!(Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("..").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .is_err()); - - assert!(Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("1..").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .is_err()); - - assert!(Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("..1").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .is_err()); - assert!(Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("..=1").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .is_err()); - assert!(Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("..=1").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .is_err()); - assert_eq!( - Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("1..5").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .unwrap() - .collect::>(), - [ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), - Number::new(3.0).unwrap().into(), - Number::new(4.0).unwrap().into(), - ] - ); - assert_eq!( - Range::from_parsed( - &mut context, - Box::leak(Box::new(parsing::Range::parse("1..=5").unwrap().1)) - ) - .unwrap() - .iterate(context.log, &"span") - .unwrap() - .collect::>(), - [ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), - Number::new(3.0).unwrap().into(), - Number::new(4.0).unwrap().into(), - Number::new(5.0).unwrap().into(), - ] - ); + let mut runtime = Runtime::default(); + ExecutionContext::new(&mut runtime, |context| { + assert!( + Range::from_parsed(context, &parsing::Range::parse("..").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .is_err() + ); + + assert!( + Range::from_parsed(context, &parsing::Range::parse("1..").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .is_err() + ); + + assert!( + Range::from_parsed(context, &parsing::Range::parse("..1").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .is_err() + ); + assert!( + Range::from_parsed(context, &parsing::Range::parse("..=1").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .is_err() + ); + assert!( + Range::from_parsed(context, &parsing::Range::parse("..=1").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .is_err() + ); + assert_eq!( + Range::from_parsed(context, &parsing::Range::parse("1..5").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .unwrap() + .collect::>(), + [ + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), + Float::new(3.0).unwrap().into(), + Float::new(4.0).unwrap().into(), + ] + ); + assert_eq!( + Range::from_parsed(context, &parsing::Range::parse("1..=5").unwrap().1) + .unwrap() + .iterate(context.log, &"span") + .unwrap() + .collect::>(), + [ + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), + Float::new(3.0).unwrap().into(), + Float::new(4.0).unwrap().into(), + Float::new(5.0).unwrap().into(), + ] + ); + }); } } diff --git a/src/script/execution/types/serializable.rs b/src/script/execution/types/serializable.rs index 5c5770c..5f7561e 100644 --- a/src/script/execution/types/serializable.rs +++ b/src/script/execution/types/serializable.rs @@ -21,15 +21,13 @@ use std::{borrow::Cow, collections::HashMap}; use serde::{Deserialize, Serialize}; use crate::script::{ - execution::{types::StructDefinition, ExecutionContext, Failure}, + execution::{types::StructDefinition, validate_assignment_type, ExecutionContext, Failure}, + logging::RuntimeLog, parsing::VariableType, Span, }; -use super::{ - structures::validate_assignment_type, DefaultValue, List, Object, OperatorResult, SString, - Scalar, Structure, Value, -}; +use super::{DefaultValue, List, Object, OperatorResult, SString, Scalar, Structure, Value}; #[derive(Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] @@ -53,11 +51,11 @@ pub enum SerializableValue { } impl SerializableValue { - pub fn into_value_without_type_check<'a, S: Span>( + pub fn into_value_without_type_check( self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { match self { Self::Default => Ok(DefaultValue.into()), Self::Boolean(value) => Ok((value).into()), @@ -68,8 +66,9 @@ impl SerializableValue { let initalizer = context .stack .get_variable_str(span, ty.as_ref())? - .downcast_ref::>(span)? - .definition; + .downcast_ref::>(span)? + .definition + .clone(); let mut failures = Vec::new(); let mut table = HashMap::with_capacity(initalizer.members.len()); @@ -78,7 +77,7 @@ impl SerializableValue { if let Some(value) = values.remove(member.name.as_str()) { match value.into_value(context, span, &member.ty.ty) { Ok(value) => { - match validate_assignment_type(context, member, span, value) { + match validate_assignment_type(context, member, span, value, span) { Ok(value) => { table.insert(member.name.to_string(), value); } @@ -104,7 +103,7 @@ impl SerializableValue { } } Self::List(values) => { - let mut collected_values: Vec> = Vec::with_capacity(values.len()); + let mut collected_values: Vec> = Vec::with_capacity(values.len()); for value in values { let value = value.into_value_without_type_check(context, span)?; @@ -118,13 +117,13 @@ impl SerializableValue { } } - pub fn into_value<'a, S: Span>( + pub fn into_value( self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, ty: &VariableType, - ) -> OperatorResult> { - if self.matches_type(ty) { + ) -> OperatorResult> { + if self.matches_type(ty, context.log, span)? { self.into_value_without_type_check(context, span) } else { Err(Failure::CannotConvertFromTo( @@ -135,16 +134,23 @@ impl SerializableValue { } } - fn matches_type(&self, ty: &VariableType) -> bool { - match (self, ty) { + fn matches_type( + &self, + ty: &VariableType, + log: &mut dyn RuntimeLog, + variable_name_span: &S, + ) -> OperatorResult { + Ok(match (self, ty) { (Self::Boolean(_), VariableType::Boolean) => true, (Self::Struct { ty: s_ty, .. }, VariableType::Struct(v_ty)) => v_ty.as_str() == s_ty, (Self::List(_), VariableType::List) => true, (Self::String(_), VariableType::String) => true, - (Self::Scalar(measurement), ty) => measurement.matches_type(ty), + (Self::Scalar(measurement), ty) => { + measurement.matches_type(ty, log, variable_name_span)? + } (Self::Default, _) => true, _ => false, - } + }) } fn type_name(&self) -> Cow<'static, str> { @@ -163,70 +169,71 @@ impl SerializableValue { #[cfg(test)] mod test { - use common_data_types::Number; + use common_data_types::Float; use uom::si::{f64::Length, length::millimeter}; use crate::script::{ execution::{ expressions::run_expression, types::{Object, SString, Scalar}, - Module, ModuleScope, + Module, }, parsing::Expression, + Runtime, }; use super::*; #[test] fn deserialize_boolean() { - let mut context = ExecutionContext::default(); - - assert_eq!( - serde_yaml::from_str::("true") - .unwrap() - .into_value(&mut context, &"", &VariableType::Boolean), - Ok(true.into()) - ); - assert_eq!( - serde_yaml::from_str::("false") - .unwrap() - .into_value(&mut context, &"", &VariableType::Boolean), - Ok(false.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + serde_yaml::from_str::("true") + .unwrap() + .into_value(context, &"", &VariableType::Boolean), + Ok(true.into()) + ); + assert_eq!( + serde_yaml::from_str::("false") + .unwrap() + .into_value(context, &"", &VariableType::Boolean), + Ok(false.into()) + ); + }); } #[test] fn serialize_boolean() { - let context = ExecutionContext::default(); - - let boolean: Value<&'static str> = true.into(); - assert_eq!( - boolean.export(context.log, &""), - Ok(SerializableValue::Boolean(true)) - ); - - let boolean: Value<&'static str> = false.into(); - assert_eq!( - boolean.export(context.log, &""), - Ok(SerializableValue::Boolean(false)) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + let boolean: Value<&'static str> = true.into(); + assert_eq!( + boolean.export(context.log, &""), + Ok(SerializableValue::Boolean(true)) + ); + + let boolean: Value<&'static str> = false.into(); + assert_eq!( + boolean.export(context.log, &""), + Ok(SerializableValue::Boolean(false)) + ); + }); } #[test] fn deserialize_number() { - let mut context = ExecutionContext::default(); - - assert_eq!( - serde_yaml::from_str::("42") - .unwrap() - .into_value(&mut context, &"", &VariableType::Scalar("Number")), - Ok(Number::new(42.0).unwrap().into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + serde_yaml::from_str::("42") + .unwrap() + .into_value(context, &"", &VariableType::Scalar("Number")), + Ok(Float::new(42.0).unwrap().into()) + ); + }); } #[test] fn serialize_number() { - let value = SerializableValue::Scalar(Scalar::from(Number::new(42.0).unwrap())); + let value = SerializableValue::Scalar(Scalar::from(Float::new(42.0).unwrap())); assert_eq!(serde_yaml::to_string(&value).unwrap(), "42.0\n"); } @@ -244,71 +251,66 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - let mut context = ExecutionContext::new(module_scope); - - let struct_def = r#" + ExecutionContext::new(&mut Runtime::from(module), |context| { + let struct_def = r#" type: MyStruct members: value: 42"#; - let structure = serde_yaml::from_str::(struct_def) - .unwrap() - .into_value(&mut context, &"", &VariableType::Struct("MyStruct")); - - assert_eq!( - structure.unwrap(), - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("MyStruct { value = 42 }").unwrap().1 - )) - ) - .unwrap() - ); + let structure = serde_yaml::from_str::(struct_def) + .unwrap() + .into_value(context, &"", &VariableType::Struct("MyStruct")); + + assert_eq!( + structure.unwrap(), + run_expression( + context, + &Expression::parse("MyStruct { value = 42 }").unwrap().1 + ) + .unwrap() + ); - let struct_def = r#" + let struct_def = r#" type: MyStruct members: value: default"#; - let structure = serde_yaml::from_str::(struct_def) - .unwrap() - .into_value(&mut context, &"", &VariableType::Struct("MyStruct")); - - assert_eq!( - structure.unwrap(), - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("MyStruct { ..default }").unwrap().1 - )) - ) - .unwrap() - ); + let structure = serde_yaml::from_str::(struct_def) + .unwrap() + .into_value(context, &"", &VariableType::Struct("MyStruct")); + + assert_eq!( + structure.unwrap(), + run_expression( + context, + &Expression::parse("MyStruct { ..default }").unwrap().1 + ) + .unwrap() + ); - assert!(serde_yaml::from_str::(struct_def) - .unwrap() - .into_value(&mut context, &"", &VariableType::Struct("OtherStruct")) - .is_err()); + assert!(serde_yaml::from_str::(struct_def) + .unwrap() + .into_value(context, &"", &VariableType::Struct("OtherStruct")) + .is_err()); - let struct_def = r#" + let struct_def = r#" type: MyStruct members: wrong_value: 42"#; - assert!(serde_yaml::from_str::(struct_def) - .unwrap() - .into_value(&mut context, &"", &VariableType::Struct("MyStruct")) - .is_err()); + assert!(serde_yaml::from_str::(struct_def) + .unwrap() + .into_value(context, &"", &VariableType::Struct("MyStruct")) + .is_err()); - let struct_def = r#" + let struct_def = r#" type: MyStruct members: value: true"#; - assert!(serde_yaml::from_str::(struct_def) - .unwrap() - .into_value(&mut context, &"", &VariableType::Struct("MyStruct")) - .is_err()); + assert!(serde_yaml::from_str::(struct_def) + .unwrap() + .into_value(context, &"", &VariableType::Struct("MyStruct")) + .is_err()); + }); } #[test] @@ -324,106 +326,101 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - let mut context = ExecutionContext::new(module_scope); - - let value: Value<&'static str> = run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("MyStruct { value = 42 }").unwrap().1, - )), - ) - .unwrap(); - - assert_eq!( - value.export(context.log, &""), - Ok(SerializableValue::Struct { - ty: "MyStruct".to_string(), - members: HashMap::from([( - "value".to_string(), - SerializableValue::Scalar(Scalar::from(Number::new(42.0).unwrap())) - )]) - }) - ); + ExecutionContext::new(&mut Runtime::from(module), |context| { + let value: Value<&'static str> = run_expression( + context, + &Expression::parse("MyStruct { value = 42 }").unwrap().1, + ) + .unwrap(); + + assert_eq!( + value.export(context.log, &""), + Ok(SerializableValue::Struct { + ty: "MyStruct".to_string(), + members: HashMap::from([( + "value".to_string(), + SerializableValue::Scalar(Scalar::from(Float::new(42.0).unwrap())) + )]) + }) + ); + }); } #[test] fn deserialize_list() { let list_def = r#"[1, true, "some text"]"#; - let mut context = ExecutionContext::default(); - - let list = serde_yaml::from_str::(list_def).unwrap(); + ExecutionContext::new(&mut Runtime::default(), |context| { + let list = serde_yaml::from_str::(list_def).unwrap(); - let list = list.into_value(&mut context, &"", &VariableType::List); + let list = list.into_value(context, &"", &VariableType::List); - assert_eq!( - list.unwrap(), - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("[1, true, \"some text\"]").unwrap().1 - )) - ) - .unwrap() - ); + assert_eq!( + list.unwrap(), + run_expression( + context, + &Expression::parse("[1, true, \"some text\"]").unwrap().1 + ) + .unwrap() + ); + }); } #[test] fn serialize_list() { - let context = ExecutionContext::default(); - - let value: Value<&'static str> = List::from([ - Number::new(1.0).unwrap().into(), - true.into(), - SString::from("some text".to_string()).into(), - ]) - .into(); - assert_eq!( - value.export(context.log, &""), - Ok(SerializableValue::List(vec![ - SerializableValue::Scalar(Scalar::from(Number::new(1.0).unwrap())), - SerializableValue::Boolean(true), - SerializableValue::String("some text".to_string()) - ])) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + let value: Value<&'static str> = List::from([ + Float::new(1.0).unwrap().into(), + true.into(), + SString::from("some text".to_string()).into(), + ]) + .into(); + assert_eq!( + value.export(context.log, &""), + Ok(SerializableValue::List(vec![ + SerializableValue::Scalar(Scalar::from(Float::new(1.0).unwrap())), + SerializableValue::Boolean(true), + SerializableValue::String("some text".to_string()) + ])) + ); + }); } #[test] fn deserialize_string() { - let mut context = ExecutionContext::default(); - - assert_eq!( - serde_yaml::from_str::("text") - .unwrap() - .into_value(&mut context, &"", &VariableType::String), - Ok(SString::from("text").into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + serde_yaml::from_str::("text") + .unwrap() + .into_value(context, &"", &VariableType::String), + Ok(SString::from("text").into()) + ); + }); } #[test] fn serialize_string() { - let context = ExecutionContext::default(); - - let value: Value<&'static str> = SString::from("This is a test".to_string()).into(); - assert_eq!( - value.export(context.log, &""), - Ok(SerializableValue::String("This is a test".to_string())) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + let value: Value<&'static str> = SString::from("This is a test".to_string()).into(); + assert_eq!( + value.export(context.log, &""), + Ok(SerializableValue::String("This is a test".to_string())) + ); + }); } #[test] fn deserialize_measurement() { - let mut context = ExecutionContext::default(); - - assert_eq!( - serde_yaml::from_str::("42mm") - .unwrap() - .into_value(&mut context, &"", &VariableType::Scalar("Length")), - Ok(Scalar::try_from(Length::new::(42.0)) - .unwrap() - .into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + serde_yaml::from_str::("42mm") + .unwrap() + .into_value(context, &"", &VariableType::Scalar("Length")), + Ok(Scalar::try_from(Length::new::(42.0)) + .unwrap() + .into()) + ); + }); } #[test] @@ -436,14 +433,14 @@ mod test { #[test] fn deserialize_default() { - let mut context = ExecutionContext::default(); - - assert_eq!( - serde_yaml::from_str::("default") - .unwrap() - .into_value(&mut context, &"", &VariableType::Scalar("Length")), - Ok(DefaultValue.into()) - ); + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + serde_yaml::from_str::("default") + .unwrap() + .into_value(context, &"", &VariableType::Scalar("Length")), + Ok(DefaultValue.into()) + ); + }); } #[test] diff --git a/src/script/execution/types/string/formatting.rs b/src/script/execution/types/string/formatting.rs index fbf65ea..4ac14a7 100644 --- a/src/script/execution/types/string/formatting.rs +++ b/src/script/execution/types/string/formatting.rs @@ -31,7 +31,9 @@ use nom::{ use crate::script::{ execution::{ - types::{unsupported_operation_message, Object, OperatorResult, Value}, + types::{ + math::Number, unsupported_operation_message, NamedObject, Object, OperatorResult, Value, + }, Failure, }, logging::RuntimeLog, @@ -52,7 +54,7 @@ pub enum Style { } impl Style { - fn parse(input: S) -> VResult { + fn parse(input: &str) -> VResult<&str, Self> { alt(( value(Self::Debug, nom_char('?')), value(Self::Octal, nom_char('o')), @@ -65,7 +67,7 @@ impl Style { } impl UnsupportedMessage for Style { - fn unsupported_message<'a, S: Span, O: Object<'a, S>>( + fn unsupported_message>( &self, object: &O, span: &S, @@ -110,7 +112,7 @@ enum Precision { } impl Precision { - fn parse(input: S) -> VResult { + fn parse(input: &str) -> VResult<&str, Self> { preceded( nom_char('.'), alt(( @@ -124,7 +126,7 @@ impl Precision { // We don't directly pass the precision information to objects when formatting, rather // we dereference it (when applicable) before hand and pass them the final result. impl UnsupportedMessage for Option { - fn unsupported_message<'a, S: Span, O: Object<'a, S>>( + fn unsupported_message>( &self, object: &O, span: &S, @@ -150,7 +152,7 @@ struct Parameter { } impl Parameter { - fn parse(input: S) -> VResult { + fn parse(input: &str) -> VResult<&str, Self> { delimited( nom_char('{'), cut(map( @@ -185,19 +187,17 @@ enum Component { } impl Component { - fn parse(input: S) -> VResult { + fn parse(input: &str) -> VResult<&str, Self> { alt((Self::parse_litteral, map(Parameter::parse, Self::Parameter)))(input) } - fn parse_litteral(input: S) -> VResult { + fn parse_litteral(input: &str) -> VResult<&str, Self> { map( verify( fold_many0( alt((take_while1(|c| c != '{'), tag("{{"), tag("}}"))), String::default, - |mut accum, item: S| { - let item = item.as_str(); - + |mut accum, item: &str| { match item { "{{" => accum.push('{'), "}}" => accum.push('}'), @@ -222,11 +222,10 @@ pub struct Format { } impl Format { - pub fn parse(input: S) -> VResult { - map( - all_consuming(many0(|input: S| Component::parse(input))), - |components| Self { components }, - )(input) + pub fn parse(input: &str) -> VResult<&str, Self> { + map(all_consuming(many0(Component::parse)), |components| Self { + components, + })(input) } pub fn format( @@ -234,7 +233,7 @@ impl Format { log: &mut dyn RuntimeLog, span: &S, f: &mut dyn Write, - arguments: &[Value<'_, S>], + arguments: &[Value], ) -> OperatorResult { let mut next_argument_index = 0; @@ -242,7 +241,7 @@ impl Format { span: &S, precision: &Precision, - arguments: &[Value<'_, S>], + arguments: &[Value], ) -> OperatorResult> { match precision { Precision::Default => Ok(None), @@ -250,7 +249,14 @@ impl Format { Precision::Referenced(index) => { if let Some(argument) = arguments.get(*index as usize) { let precision = argument.downcast_ref::(span)?; - let precision = precision.to_index(span)?; + let precision = Number::try_from(precision).map_err(|_| { + Failure::ExpectedGot( + span.clone(), + Number::static_type_name().into(), + >::type_name(&precision), + ) + })?; + let precision = precision.to_index(); if precision.is_positive() { Ok(Some(precision as u8)) @@ -314,9 +320,9 @@ impl Format { } } -fn number(input: S) -> VResult { - map(take_while1(|c| "0123456789".contains(c)), |digits: S| { - digits.as_str().parse::().unwrap() +fn number(input: &str) -> VResult<&str, u8> { + map(take_while1(|c| "0123456789".contains(c)), |digits: &str| { + digits.parse::().unwrap() })(input) } @@ -334,7 +340,7 @@ impl UnwrapFormattingResult for std::result::Result { } pub trait UnsupportedMessage { - fn unsupported_message<'a, S: Span, O: Object<'a, S>>( + fn unsupported_message>( &self, object: &O, span: &S, @@ -344,7 +350,7 @@ pub trait UnsupportedMessage { #[cfg(test)] mod test { use crate::script::logging::StandardLog; - use common_data_types::Number; + use common_data_types::Float; use super::*; @@ -504,7 +510,7 @@ mod test { &mut log, &"scope", &mut formatted, - &[Number::new(42.24).unwrap().into()], + &[Float::new(42.24).unwrap().into()], ) .unwrap(); assert_eq!(formatted, "Test 42.24"); @@ -518,8 +524,8 @@ mod test { &"scope", &mut formatted, &[ - Number::new(1.0).unwrap().into(), - Number::new(2.0).unwrap().into(), + Float::new(1.0).unwrap().into(), + Float::new(2.0).unwrap().into(), ], ) .unwrap(); diff --git a/src/script/execution/types/string/mod.rs b/src/script/execution/types/string/mod.rs index 9dc1311..19a0992 100644 --- a/src/script/execution/types/string/mod.rs +++ b/src/script/execution/types/string/mod.rs @@ -16,8 +16,9 @@ * program. If not, see . */ -use common_data_types::Number; -use std::{cmp::Ordering, fmt::Write, rc::Rc}; +use common_data_types::Float; +use imstr::ImString; +use std::{cell::RefCell, cmp::Ordering, fmt::Write}; use crate::script::{ execution::{ExecutionContext, Failure}, @@ -27,8 +28,8 @@ use crate::script::{ }; use super::{ - function::AutoCall, number::UnwrapNotNan, serializable::SerializableValue, NamedObject, Object, - OperatorResult, Range, Scalar, Value, + function::AutoCall, math::Number, number::UnwrapNotNan, serializable::SerializableValue, + NamedObject, NoneType, Object, OperatorResult, Range, UnwrapBorrowFailure, Value, }; pub mod formatting; @@ -38,12 +39,17 @@ static ESCAPE_SEQUENCES: &[(&str, &str)] = &[("\\\"", "\""), ("\\n", "\n"), ("\\ #[derive(Debug, Clone, PartialEq)] pub struct SString { - string: Rc, + string: RefCell, } -impl<'a, S: Span> Object<'a, S> for SString { - fn matches_type(&self, ty: &VariableType) -> bool { - matches!(ty, VariableType::String) +impl Object for SString { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(matches!(ty, VariableType::String)) } fn format( @@ -54,13 +60,15 @@ impl<'a, S: Span> Object<'a, S> for SString { style: Style, precision: Option, ) -> OperatorResult { + let string = self.string.try_borrow().unwrap_borrow_failure(span)?; + match (style, precision) { - (Style::Default, None) => write!(f, "{}", self.string).unwrap_formatting_result(span), + (Style::Default, None) => write!(f, "{}", string).unwrap_formatting_result(span), (Style::Debug, None) => { let mut sequence_iter = ESCAPE_SEQUENCES.iter(); let (replace, find) = sequence_iter.next().unwrap(); // Should never fail since we static initalized that array. - let mut to_print = self.string.replace(find, replace); + let mut to_print = string.replace(find, replace); for (replace, find) in sequence_iter { to_print = to_print.replace(find, replace); @@ -81,9 +89,10 @@ impl<'a, S: Span> Object<'a, S> for SString { &self, _log: &mut dyn RuntimeLog, span: &S, - index: Value<'a, S>, - ) -> OperatorResult> { + index: Value, + ) -> OperatorResult> { let range = index.downcast::(span)?; + let string = self.string.try_borrow().unwrap_borrow_failure(span)?; // TODO could we keep an immutable reference to the original string to avoid a copy? let slice = match ( @@ -91,43 +100,43 @@ impl<'a, S: Span> Object<'a, S> for SString { range.upper_bound, range.upper_bound_is_inclusive, ) { - (None, None, false) => self.string.get(..).ok_or((None, None)), + (None, None, false) => string.get(..).ok_or((None, None)), (Some(lower_bound), None, false) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - self.string + string .get(lower_bound..) .ok_or((Some(signed_lower_bound), None)) } (None, Some(upper_bound), false) => { - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.string + string .get(..upper_bound) .ok_or((None, Some(signed_upper_bound))) } (None, Some(upper_bound), true) => { - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.string + string .get(..=upper_bound) .ok_or((None, Some(signed_upper_bound))) } (Some(lower_bound), Some(upper_bound), false) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.string + string .get(lower_bound..upper_bound) .ok_or((Some(signed_lower_bound), Some(signed_upper_bound))) } (Some(lower_bound), Some(upper_bound), true) => { - let signed_lower_bound = lower_bound.to_index(span)?; + let signed_lower_bound = lower_bound.to_index(); let lower_bound = self.internalize_index(span, signed_lower_bound)?; - let signed_upper_bound = upper_bound.to_index(span)?; + let signed_upper_bound = upper_bound.to_index(); let upper_bound = self.internalize_index(span, signed_upper_bound)?; - self.string + string .get(lower_bound..=upper_bound) .ok_or((Some(signed_lower_bound), Some(signed_upper_bound))) } @@ -152,7 +161,7 @@ impl<'a, S: Span> Object<'a, S> for SString { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, + rhs: &Value, ) -> OperatorResult { let rhs = rhs.downcast_ref::(span)?; @@ -163,20 +172,24 @@ impl<'a, S: Span> Object<'a, S> for SString { &self, _log: &mut dyn RuntimeLog, span: &S, - rhs: &Value<'a, S>, - ) -> OperatorResult> { + rhs: &Value, + ) -> OperatorResult> { + let mut string = self + .string + .try_borrow() + .unwrap_borrow_failure(span)? + .clone() + .into_std_string(); + match rhs { Value::String(rhs) => { - let mut string = self.unwrap_or_clone(); - - string.push_str(rhs.as_str()); + string.push_str(&rhs.as_str(span)?); Ok(Self::from(string).into()) } Value::Scalar(rhs) => { // convert numbers to strings. let rhs = rhs.to_number(span)?; - let mut string = self.unwrap_or_clone(); string += &format!("{}", rhs.into_inner()); @@ -192,43 +205,50 @@ impl<'a, S: Span> Object<'a, S> for SString { fn method_call( &self, - context: &mut ExecutionContext<'a, S>, + context: &mut ExecutionContext, span: &S, attribute: &S, - arguments: Vec>, + arguments: Vec>, expressions: &[Expression], - ) -> OperatorResult> { + ) -> OperatorResult> { match attribute.as_str() { - "insert" => |_context: &mut ExecutionContext<'a, S>, + "insert" => |_context: &mut ExecutionContext, span: &S, - index: Scalar, + index: Number, text: SString| -> OperatorResult> { - let mut string = self.unwrap_or_clone(); - - let index = index.to_index(span)?; + let index = index.to_index(); let index = self.internalize_index(span, index)?; - string.insert_str(index, text.as_str()); - Ok(Self::from(string).into()) + self.string + .try_borrow_mut() + .unwrap_borrow_failure(span)? + .insert_str(index, &text.as_str(span)?); + Ok(NoneType.into()) } .auto_call(context, span, arguments, expressions), // insert_str "is_empty" => { - |_context: &mut ExecutionContext<'a, S>, _span: &S| -> OperatorResult> { - Ok(self.string.is_empty().into()) + |_context: &mut ExecutionContext, _span: &S| -> OperatorResult> { + Ok(self + .string + .try_borrow() + .unwrap_borrow_failure(span)? + .is_empty() + .into()) } .auto_call(context, span, arguments, expressions) } "len" => { - |_context: &mut ExecutionContext<'a, S>, span: &S| -> OperatorResult> { - Number::new(self.string.len() as f64) + |_context: &mut ExecutionContext, span: &S| -> OperatorResult> { + Float::new(self.string.try_borrow().unwrap_borrow_failure(span)?.len() as f64) .unwrap_not_nan(span) .map(|n| n.into()) } .auto_call(context, span, arguments, expressions) } "format" => { - match formatting::Format::parse((*self.string).as_ref()) { + let string = self.string.try_borrow().unwrap_borrow_failure(span)?; + match formatting::Format::parse(string.as_str()) { Ok((_, format)) => { let mut output = String::new(); format.format(context.log, span, &mut output, &arguments)?; @@ -249,16 +269,27 @@ impl<'a, S: Span> Object<'a, S> for SString { fn export( &self, _log: &mut dyn RuntimeLog, - _span: &S, + span: &S, ) -> OperatorResult { - Ok(SerializableValue::String(String::clone(&self.string))) + let string = self.to_string(span)?; + Ok(SerializableValue::String(string)) + } +} + +pub struct StrRef<'a> { + reference: std::cell::Ref<'a, ImString>, +} + +impl<'a> std::ops::Deref for StrRef<'a> { + type Target = str; + + fn deref(&self) -> &Self::Target { + self.reference.as_str() } } impl SString { - pub fn from_parsed<'a, S: Span>( - parsed: &parsing::PString, - ) -> OperatorResult> { + pub fn from_parsed(parsed: &parsing::PString) -> OperatorResult> { let mut sequence_iter = ESCAPE_SEQUENCES.iter(); let (find, replace) = sequence_iter.next().unwrap(); // Should never fail since we static initalized that array. @@ -268,39 +299,42 @@ impl SString { string = string.replace(find, replace); } - Ok(Self { - string: Rc::new(string), - } - .into()) + let string = RefCell::new(string.into()); + Ok(Self { string }.into()) } - fn unwrap_or_clone(&self) -> String { - // FIXME we should be consuming self, rather than cloaning string. - Rc::try_unwrap(self.string.clone()).unwrap_or_else(|string| String::clone(&string)) - } + pub fn as_str<'a, S: Span>(&'a self, span: &S) -> OperatorResult> { + let reference = self.string.try_borrow().unwrap_borrow_failure(span)?; + let string_reference = StrRef { reference }; - pub fn as_str(&self) -> &str { - self.string.as_ref() + Ok(string_reference) } - pub fn into_string(self) -> String { - self.unwrap_or_clone() + pub fn to_string(&self, span: &S) -> OperatorResult { + Ok(self + .string + .try_borrow() + .unwrap_borrow_failure(span)? + .clone() + .into_std_string()) } fn internalize_index(&self, span: &S, index: isize) -> OperatorResult { + let string = self.string.try_borrow().unwrap_borrow_failure(span)?; + let new_index = if index >= 0 { Ok(index as usize) - } else if let Some(index) = self.string.len().checked_sub(index.unsigned_abs()) { + } else if let Some(index) = string.len().checked_sub(index.unsigned_abs()) { Ok(index) } else { Err(Failure::IndexOutOfRange(span.clone(), index)) }?; - if new_index >= self.string.len() { + if new_index >= string.len() { Err(Failure::IndexOutOfRange(span.clone(), index)) - } else if self.string.is_char_boundary(new_index) { + } else if string.is_char_boundary(new_index) { Ok(new_index) - } else if new_index < self.string.len() { + } else if new_index < string.len() { Err(Failure::InvalidCharIndex(span.clone(), new_index as isize)) } else { Err(Failure::IndexOutOfRange(span.clone(), new_index as isize)) @@ -314,50 +348,46 @@ impl NamedObject for SString { } } -impl From for SString { - fn from(value: String) -> Self { +impl From for SString +where + S: Into, +{ + fn from(value: S) -> Self { Self { - string: Rc::new(value), + string: RefCell::new(value.into()), } } } -impl<'a> From<&'a str> for SString { - fn from(value: &'a str) -> Self { - Self::from(String::from(value)) - } -} - #[cfg(test)] mod test { - use crate::script::execution::{expressions::run_expression, ExecutionContext}; + use crate::script::{ + execution::{expressions::run_expression, ExecutionContext}, + Runtime, + }; use super::*; #[test] fn string_concat() { - let mut context = ExecutionContext::default(); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("\"test\" + \"test\" == \"testtest\"") + ExecutionContext::new(&mut Runtime::default(), |context| { + assert_eq!( + run_expression( + context, + &Expression::parse("\"test\" + \"test\" == \"testtest\"") .unwrap() .1 - )) - ), - Ok(true.into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("\"test\" + 5 == \"test5\"").unwrap().1 - )) - ), - Ok(true.into()) - ); + ), + Ok(true.into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse("\"test\" + 5 == \"test5\"").unwrap().1 + ), + Ok(true.into()) + ); + }); } } diff --git a/src/script/execution/types/structures.rs b/src/script/execution/types/structures.rs index a711039..5f5b5b9 100644 --- a/src/script/execution/types/structures.rs +++ b/src/script/execution/types/structures.rs @@ -21,34 +21,39 @@ use std::{collections::HashMap, rc::Rc}; use crate::script::{ execution::{ expressions::{run_expression, run_trailer}, - ExecutionContext, Failure, + validate_assignment_type, ExecutionContext, Failure, }, logging::RuntimeLog, - parsing::{self, MemberVariable, StructInitialization, Trailer, VariableType}, + parsing::{self, StructInitialization, Trailer, VariableType}, Span, }; use super::{serializable::SerializableValue, NamedObject, Object, OperatorResult, Value}; -#[derive(Debug, Clone, PartialEq)] -pub struct Structure<'a, S: Span> { - ty: &'a parsing::StructDefinition, - pub members: Rc>>, +#[derive(Debug, PartialEq, Clone)] +pub struct Structure { + ty: Rc>, + pub members: Rc>>, } -impl<'a, S: Span> Structure<'a, S> { +impl Structure { pub fn name(&self) -> &str { self.ty.name.as_str() } } -impl<'a, S: Span> Object<'a, S> for Structure<'a, S> { - fn matches_type(&self, ty: &VariableType) -> bool { - if let VariableType::Struct(type_name) = ty { +impl Object for Structure { + fn matches_type( + &self, + ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + Ok(if let VariableType::Struct(type_name) = ty { type_name.as_str() == self.ty.name.as_str() } else { false - } + }) } fn attribute( @@ -56,7 +61,7 @@ impl<'a, S: Span> Object<'a, S> for Structure<'a, S> { _log: &mut dyn RuntimeLog, _span: &S, name: &S, - ) -> OperatorResult> { + ) -> OperatorResult> { let key = name.as_str(); if let Some(value) = self.members.get(key) { @@ -85,47 +90,14 @@ impl<'a, S: Span> Object<'a, S> for Structure<'a, S> { } } -impl<'a, S: Span> NamedObject for Structure<'a, S> { +impl NamedObject for Structure { fn static_type_name() -> &'static str { "struct" } } -pub fn validate_assignment_type<'a, S: Span>( - context: &mut ExecutionContext<'a, S>, - member: &'a MemberVariable, - variable_assignment: &S, - value: Value<'a, S>, -) -> OperatorResult> { - match value { - Value::Default(_) => { - // They want to use a default value. - if let Some(default) = member.ty.default_value.as_ref() { - Value::from_litteral(context, default) - } else { - Err(Failure::NoDefault( - variable_assignment.clone(), - variable_assignment.clone(), - )) - } - } - // No request for default. Check the type. - value => { - if value.matches_type(&member.ty.ty) { - Ok(value) - } else { - Err(Failure::ExpectedGot( - variable_assignment.clone(), - member.ty.ty.name(), - value.type_name(), - )) - } - } - } -} - -impl<'a, S: Span> Structure<'a, S> { - pub fn new(ty: &'a parsing::StructDefinition, table: HashMap>) -> Self { +impl Structure { + pub fn new(ty: Rc>, table: HashMap>) -> Self { Self { ty, members: Rc::new(table), @@ -134,8 +106,8 @@ impl<'a, S: Span> Structure<'a, S> { #[cfg(test)] pub fn from_array( - ty: &'a parsing::StructDefinition, - values: [(String, Value<'a, S>); N], + ty: Rc>, + values: [(String, Value); N], ) -> Self { Self { ty, @@ -144,39 +116,161 @@ impl<'a, S: Span> Structure<'a, S> { } pub fn initalization( - context: &mut ExecutionContext<'a, S>, - struct_source: &'a Trailer, - initalization: &'a StructInitialization, - ) -> OperatorResult> { + context: &mut ExecutionContext, + struct_definition: &Trailer, + initalization: &StructInitialization, + ) -> OperatorResult> { enum Inheritance<'a, S: Span> { - Structure(Structure<'a, S>), + Structure(&'a Structure), Default, + None, } - let struct_source = run_trailer(context, struct_source)? - .downcast::>(struct_source.get_span())? - .definition; + fn build_struct( + context: &mut ExecutionContext, + struct_definition: &Rc>, + initalization: &StructInitialization, + inheritance: Inheritance, + ) -> OperatorResult> { + // We're going to run through this whole struct and collect all the errors at once. + let mut failures = Vec::new(); + + let mut members = HashMap::with_capacity(struct_definition.members.len()); + + for member in struct_definition.members.iter() { + let name = member.name.as_str(); + + let assignment = + initalization + .assignments + .iter() + .find_map(|(assignment_name, assignment)| { + if assignment_name.as_str() == name { + Some(assignment) + } else { + None + } + }); + + let value = if let Some(expression) = assignment { + match run_expression(context, expression) { + Ok(value) => match validate_assignment_type( + context, + member, + expression.get_span(), + value, + expression.get_span(), + ) { + Ok(value) => value, + Err(failure) => { + failures.push(failure); + continue; + } + }, + Err(failure) => { + failures.push(failure); + continue; + } + } + } else { + match inheritance { + Inheritance::Structure(inheritance) => { + if let Some(value) = inheritance.members.get(member.name.as_str()) { + value.clone() + } else { + failures.push(Failure::StructMissingAssignment( + initalization.get_span().clone(), + member.name.clone(), + )); + continue; + } + } + Inheritance::Default => { + if let Some(default) = &member.ty.default_value { + match Value::from_litteral(context, default) { + Ok(value) => value, + Err(failure) => { + failures.push(failure); + continue; + } + } + } else { + failures.push(Failure::NoDefault( + initalization.get_span().clone(), + member.name.clone(), + )); + continue; + } + } + Inheritance::None => { + failures.push(Failure::StructMissingAssignment( + initalization.get_span().clone(), + member.name.clone(), + )); + continue; + } + } + }; + + members.insert(member.name.to_string(), value); + } + + // Make sure there aren't extra assignments. + for (name, _expression) in initalization.assignments.iter() { + if !struct_definition + .members + .iter() + .any(|member| member.name.as_str() == name.as_str()) + { + failures.push(Failure::StructExcessAssignment(name.clone())); + } + } + + if failures.is_empty() { + Ok(Structure { + ty: Rc::clone(struct_definition), + members: Rc::new(members), + } + .into()) + } else { + Err(Failure::StructConstruction( + initalization.get_span().clone(), + failures, + )) + } + } - // We're going to run through this whole struct and collect all the errors at once. - let mut failures = Vec::new(); + let struct_evaluated_definition = run_trailer(context, struct_definition)? + .downcast::>(struct_definition.get_span())? + .definition; // Figure out our inheritance, if any. - let inheritance = if let Some(trailer) = &initalization.inheritance { + if let Some(trailer) = &initalization.inheritance { let trailer_result = run_trailer(context, trailer)?; match trailer_result { Value::Structure(structure) => { - if structure.ty == struct_source { - Some(Inheritance::Structure(structure)) + if structure.ty == struct_evaluated_definition { + build_struct( + context, + &struct_evaluated_definition, + initalization, + Inheritance::Structure(&structure), + ) } else { return Err(Failure::StructWrongInheritanceType( trailer.get_span().clone(), - struct_source.name.clone(), + struct_evaluated_definition.name.clone(), structure.ty.name.clone(), )); } } - Value::Default(_span) => Some(Inheritance::Default), + Value::Default(_span) => build_struct( + context, + &struct_evaluated_definition, + initalization, + Inheritance::Default, + ), _ => { return Err(Failure::ExpectedGot( trailer.get_span().clone(), @@ -186,137 +280,46 @@ impl<'a, S: Span> Structure<'a, S> { } } } else { - None - }; - - let mut members = HashMap::with_capacity(struct_source.members.len()); - - for member in struct_source.members.iter() { - let name = member.name.as_str(); - - let assignment = - initalization - .assignments - .iter() - .find_map(|(assignment_name, assignment)| { - if assignment_name.as_str() == name { - Some(assignment) - } else { - None - } - }); - - let value = if let Some(expression) = assignment { - match run_expression(context, expression) { - Ok(value) => match validate_assignment_type( - context, - member, - expression.get_span(), - value, - ) { - Ok(value) => value, - Err(failure) => { - failures.push(failure); - continue; - } - }, - Err(failure) => { - failures.push(failure); - continue; - } - } - } else if let Some(inheritance) = inheritance.as_ref() { - match inheritance { - Inheritance::Structure(inheritance) => { - if let Some(value) = inheritance.members.get(member.name.as_str()) { - value.clone() - } else { - failures.push(Failure::StructMissingAssignment( - initalization.get_span().clone(), - member.name.clone(), - )); - continue; - } - } - Inheritance::Default => { - if let Some(default) = &member.ty.default_value { - match Value::from_litteral(context, default) { - Ok(value) => value, - Err(failure) => { - failures.push(failure); - continue; - } - } - } else { - failures.push(Failure::NoDefault( - initalization.get_span().clone(), - member.name.clone(), - )); - continue; - } - } - } - } else { - failures.push(Failure::StructMissingAssignment( - initalization.get_span().clone(), - member.name.clone(), - )); - continue; - }; - - members.insert(member.name.to_string(), value); - } - - // Make sure there aren't extra assignments. - for (name, _expression) in initalization.assignments.iter() { - if !struct_source - .members - .iter() - .any(|member| member.name.as_str() == name.as_str()) - { - failures.push(Failure::StructExcessAssignment(name.clone())); - } - } - - if failures.is_empty() { - Ok(Structure { - ty: struct_source, - members: Rc::new(members), - } - .into()) - } else { - Err(Failure::StructConstruction( - initalization.get_span().clone(), - failures, - )) + build_struct( + context, + &struct_evaluated_definition, + initalization, + Inheritance::None, + ) } } } #[derive(Clone)] -pub struct StructDefinition<'a, S: Span> { - pub definition: &'a parsing::StructDefinition, +pub struct StructDefinition { + pub definition: Rc>, } -impl<'a, S: Span> Object<'a, S> for StructDefinition<'a, S> { - fn matches_type(&self, _ty: &VariableType) -> bool { - false +impl Object for StructDefinition { + fn matches_type( + &self, + _ty: &VariableType, + _log: &mut dyn RuntimeLog, + _variable_name_span: &S, + ) -> OperatorResult { + // You cannot assign struct definitions to variables or pass them between functions. + Ok(false) } } -impl<'a, S: Span> std::fmt::Debug for StructDefinition<'a, S> { +impl std::fmt::Debug for StructDefinition { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("StructDefinition").finish() } } -impl<'a, S: Span> PartialEq for StructDefinition<'a, S> { +impl PartialEq for StructDefinition { fn eq(&self, _other: &Self) -> bool { false } } -impl<'a, S: Span> NamedObject for StructDefinition<'a, S> { +impl NamedObject for StructDefinition { fn static_type_name() -> &'static str { "StructDefinition" } @@ -325,10 +328,11 @@ impl<'a, S: Span> NamedObject for StructDefinition<'a, S> { #[cfg(test)] mod test { use crate::script::{ - execution::{expressions::run_expression, ExecutionContext, Module, ModuleScope}, + execution::{expressions::run_expression, ExecutionContext, Module}, parsing::Expression, + Runtime, }; - use common_data_types::Number; + use common_data_types::Float; use super::*; @@ -347,206 +351,186 @@ mod test { assert!(log.is_empty()); - let module_scope = ModuleScope::new(&module); - let mut context = ExecutionContext::new(module_scope); - - let two_part_struct = context - .stack - .get_variable(&"TwoPartStruct") - .unwrap() - .downcast_ref::>(&"") - .unwrap() - .definition; - let empty_struct = context - .stack - .get_variable(&"EmptyStruct") - .unwrap() - .downcast_ref::>(&"") - .unwrap() - .definition; - let default_struct = context - .stack - .get_variable(&"DefaultStruct") - .unwrap() - .downcast_ref::>(&"") - .unwrap() - .definition; - - context.stack.new_variable( - &"two_part_struct", - Structure::from_array( - two_part_struct, - [ - ("value".into(), Number::new(3.0).unwrap().into()), - ("other".into(), Number::new(4.0).unwrap().into()), - ], - ) - .into(), - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new(Expression::parse("EmptyStruct {}").unwrap().1)) - ), - Ok(Structure::from_array(empty_struct, []).into()) - ); - - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("DefaultStruct { value = 24 }").unwrap().1 - )) - ), - Ok(Structure::from_array( - default_struct, - [("value".into(), Number::new(24.0).unwrap().into())] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("DefaultStruct { ..default }").unwrap().1 - )) - ), - Ok(Structure::from_array( - default_struct, - [("value".into(), Number::new(42.0).unwrap().into())] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("DefaultStruct { value = default }") + let mut runtime = Runtime::from(module); + ExecutionContext::new(&mut runtime, |context| { + let two_part_struct = context + .stack + .get_variable(&"TwoPartStruct") + .unwrap() + .downcast_ref::>(&"") + .unwrap() + .definition + .clone(); + let empty_struct = context + .stack + .get_variable(&"EmptyStruct") + .unwrap() + .downcast_ref::>(&"") + .unwrap() + .definition + .clone(); + let default_struct = context + .stack + .get_variable(&"DefaultStruct") + .unwrap() + .downcast_ref::>(&"") + .unwrap() + .definition + .clone(); + + context.stack.new_variable( + &"two_part_struct", + Structure::from_array( + two_part_struct.clone(), + [ + ("value".into(), Float::new(3.0).unwrap().into()), + ("other".into(), Float::new(4.0).unwrap().into()), + ], + ) + .into(), + ); + + assert_eq!( + run_expression(context, &Expression::parse("EmptyStruct {}").unwrap().1), + Ok(Structure::from_array(empty_struct, []).into()) + ); + + assert_eq!( + run_expression( + context, + &Expression::parse("DefaultStruct { value = 24 }").unwrap().1 + ), + Ok(Structure::from_array( + default_struct.clone(), + [("value".into(), Float::new(24.0).unwrap().into())] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("DefaultStruct { ..default }").unwrap().1 + ), + Ok(Structure::from_array( + default_struct.clone(), + [("value".into(), Float::new(42.0).unwrap().into())] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("DefaultStruct { value = default }") .unwrap() .1 - )) - ), - Ok(Structure::from_array( - default_struct, - [("value".into(), Number::new(42.0).unwrap().into())] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("TwoPartStruct { ..default }").unwrap().1 - )) - ), - Ok(Structure::from_array( - two_part_struct, - [ - ("value".into(), Number::new(1.0).unwrap().into()), - ("other".into(), Number::new(2.0).unwrap().into()) - ] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("TwoPartStruct { value = 3, ..default }") + ), + Ok(Structure::from_array( + default_struct, + [("value".into(), Float::new(42.0).unwrap().into())] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("TwoPartStruct { ..default }").unwrap().1 + ), + Ok(Structure::from_array( + two_part_struct.clone(), + [ + ("value".into(), Float::new(1.0).unwrap().into()), + ("other".into(), Float::new(2.0).unwrap().into()) + ] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("TwoPartStruct { value = 3, ..default }") .unwrap() .1 - )) - ), - Ok(Structure::from_array( - two_part_struct, - [ - ("value".into(), Number::new(3.0).unwrap().into()), - ("other".into(), Number::new(2.0).unwrap().into()) - ] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("TwoPartStruct { ..two_part_struct }") + ), + Ok(Structure::from_array( + two_part_struct.clone(), + [ + ("value".into(), Float::new(3.0).unwrap().into()), + ("other".into(), Float::new(2.0).unwrap().into()) + ] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("TwoPartStruct { ..two_part_struct }") .unwrap() .1 - )) - ), - Ok(Structure::from_array( - two_part_struct, - [ - ("value".into(), Number::new(3.0).unwrap().into()), - ("other".into(), Number::new(4.0).unwrap().into()) - ] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("TwoPartStruct { value = 5, ..two_part_struct }") + ), + Ok(Structure::from_array( + two_part_struct.clone(), + [ + ("value".into(), Float::new(3.0).unwrap().into()), + ("other".into(), Float::new(4.0).unwrap().into()) + ] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("TwoPartStruct { value = 5, ..two_part_struct }") .unwrap() .1 - )) - ), - Ok(Structure::from_array( - two_part_struct, - [ - ("value".into(), Number::new(5.0).unwrap().into()), - ("other".into(), Number::new(4.0).unwrap().into()) - ] - ) - .into()) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("TwoPartStruct { ..EmptyStruct {} }") + ), + Ok(Structure::from_array( + two_part_struct, + [ + ("value".into(), Float::new(5.0).unwrap().into()), + ("other".into(), Float::new(4.0).unwrap().into()) + ] + ) + .into()) + ); + assert_eq!( + run_expression( + context, + &Expression::parse("TwoPartStruct { ..EmptyStruct {} }") .unwrap() .1 + ), + Err(Failure::StructWrongInheritanceType( + "EmptyStruct", + "TwoPartStruct", + "EmptyStruct" )) - ), - Err(Failure::StructWrongInheritanceType( - "EmptyStruct", - "TwoPartStruct", - "EmptyStruct" - )) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("EmptyStruct { bogus = 24 }").unwrap().1 + ); + assert_eq!( + run_expression( + context, + &Expression::parse("EmptyStruct { bogus = 24 }").unwrap().1 + ), + Err(Failure::StructConstruction( + "{", + vec![Failure::StructExcessAssignment("bogus")] )) - ), - Err(Failure::StructConstruction( - "{", - vec![Failure::StructExcessAssignment("bogus")] - )) - ); - assert_eq!( - run_expression( - &mut context, - Box::leak(Box::new( - Expression::parse("DefaultStruct { value = false }") + ); + assert_eq!( + run_expression( + context, + &Expression::parse("DefaultStruct { value = false }") .unwrap() .1 - )) - ), - Err(Failure::StructConstruction( - "{", - vec![Failure::ExpectedGot( - "false", - "Number".into(), - "Boolean".into() - )] - )), - ); + ), + Err(Failure::StructConstruction( + "{", + vec![Failure::ExpectedGot( + "false", + "Number".into(), + "Boolean".into() + )] + )), + ); + }); } } diff --git a/src/script/logging.rs b/src/script/logging.rs index 942d77e..070f37f 100644 --- a/src/script/logging.rs +++ b/src/script/logging.rs @@ -16,7 +16,7 @@ * program. If not, see . */ -use std::{borrow::Cow, error::Error}; +use std::error::Error; use fj_core::{validation::ValidationError, Core}; @@ -28,17 +28,17 @@ use super::{ Span, }; -pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { +pub fn register_globals(context: &mut ExecutionContext) { context.stack.new_variable_str( "print", - (|context: &mut ExecutionContext<'a, S>, + (|context: &mut ExecutionContext, span: &S, text: SString| - -> OperatorResult> { - let text = text.into_string(); + -> OperatorResult> { + let text = text.to_string(span)?; context .log - .push(LogMessage::UserMessage(span.clone(), text.into())); + .push(LogMessage::UserMessage(span.clone(), text)); Ok(NoneType.into()) }) @@ -48,14 +48,14 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "warn", - (|context: &mut ExecutionContext<'a, S>, + (|context: &mut ExecutionContext, span: &S, text: SString| - -> OperatorResult> { - let text = text.into_string(); + -> OperatorResult> { + let text = text.to_string(span)?; context .log - .push(LogMessage::UserWarning(span.clone(), text.into())); + .push(LogMessage::UserWarning(span.clone(), text)); Ok(NoneType.into()) }) @@ -65,11 +65,11 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { context.stack.new_variable_str( "error", - (|_context: &mut ExecutionContext<'a, S>, + (|_context: &mut ExecutionContext, span: &S, text: SString| - -> OperatorResult> { - let text = text.into_string(); + -> OperatorResult> { + let text = text.to_string(span)?; Err(Failure::User(span.clone(), text)) }) @@ -78,19 +78,19 @@ pub fn register_globals<'a, S: Span>(context: &mut ExecutionContext<'a, S>) { ); } -pub trait RuntimeLog<'a, S: Span> { - fn push(&mut self, message: LogMessage<'a, S>); +pub trait RuntimeLog { + fn push(&mut self, message: LogMessage); } #[derive(Debug)] -pub enum LogMessage<'a, S: Span> { - UserMessage(S, Cow<'a, str>), - UserWarning(S, Cow<'a, str>), +pub enum LogMessage { + UserMessage(S, String), + UserWarning(S, String), FormatIntegerPrecision(S), ModelValidation(S, Vec), } -impl<'a, S: Span> LogMessage<'a, S> { +impl LogMessage { pub fn log_level(&self) -> LogLevel { match self { Self::UserMessage(_, _) => LogLevel::Info, @@ -101,7 +101,7 @@ impl<'a, S: Span> LogMessage<'a, S> { } } -impl<'a, S: Span> std::fmt::Display for LogMessage<'a, S> { +impl std::fmt::Display for LogMessage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::UserMessage(span, message) => write!(f, "{}: {}", span.format_span(), message), @@ -168,8 +168,8 @@ impl StandardLog { } } -impl<'a, S: Span> RuntimeLog<'a, S> for StandardLog { - fn push(&mut self, message: LogMessage<'a, S>) { +impl<'a, S: Span> RuntimeLog for StandardLog { + fn push(&mut self, message: LogMessage) { match message.log_level() { LogLevel::Info => log::info!("{}", message), LogLevel::Warning => log::warn!("{}", message), diff --git a/src/script/mod.rs b/src/script/mod.rs index 3d0dfb1..1bea910 100644 --- a/src/script/mod.rs +++ b/src/script/mod.rs @@ -19,9 +19,6 @@ use anyhow::{bail, Result}; mod parsing; -use imstr::ImString; -use nom_locate::LocatedSpan; -use ouroboros::self_referencing; pub use parsing::Span; use crate::script::{ @@ -35,83 +32,76 @@ use crate::script::{ pub use crate::script::execution::types::{Scalar, SerializableValue}; mod execution; -pub use execution::print_all_supported_units; -use execution::{types::Object, types::Sketch, ExecutionContext, GlobalResources, ModuleScope}; +pub use execution::{print_all_supported_units, Failure}; +use execution::{ + types::{Object, Sketch}, + GlobalResources, +}; -pub mod logging; +use self::execution::{ExecutionContext, Stack}; -type RuntimeSpan = LocatedSpan; -pub type Failure = self::execution::Failure; +pub mod logging; -#[self_referencing] -pub struct Runtime { - code: RuntimeSpan, - module: Module, - #[borrows(module)] - #[not_covariant] - context: ExecutionContext<'this, RuntimeSpan>, +#[derive(Default)] +pub struct Runtime { + pub global_resources: GlobalResources, + pub stack: Stack, + pub root_span: S, } -impl Runtime { - pub fn global_resources_mut(&mut self, f: impl FnOnce(&mut GlobalResources) -> R) -> R { - self.with_context_mut(|context| f(&mut context.global_resources)) - } +impl From> for Runtime { + fn from(module: Module) -> Self { + let root_span = module.get_span().clone(); + let stack = Stack::new(module); - pub fn global_resources(&self, f: impl FnOnce(&GlobalResources) -> R) -> R { - self.with_context(|context| f(&context.global_resources)) + Runtime { + global_resources: GlobalResources::default(), + stack, + root_span, + } } +} - pub fn load(module: (impl Into, impl Into)) -> Result { - let mut log = Vec::new(); +impl Runtime { + pub fn load(file_name: impl Into, code: S) -> Result { + let mut validation_log = Vec::new(); - let file_name = module.0.into(); - let code = LocatedSpan::new(module.1.into()); - let module = Module::load(&mut log, file_name, code.clone())?; + let file_name = file_name.into(); + let module = Module::load(&mut validation_log, file_name, code)?; - if !log.is_empty() { + if !validation_log.is_empty() { // TODO there's got to be a better way to present validation errors. - bail!("Module failed validation: {:?}", log); + bail!("Module failed validation: {:?}", validation_log); } - Ok(RuntimeBuilder { - code, - module, - context_builder: |module| { - let module_scope = ModuleScope::new(module); - - ExecutionContext::new(module_scope) - }, - } - .build()) + Ok(Self::from(module)) } pub fn run_sketch( &mut self, name: &str, arguments: Vec, - ) -> std::result::Result<(), Failure> { - self.with_mut(|runtime| { + ) -> std::result::Result<(), Failure> { + let root_span = self.root_span.clone(); + ExecutionContext::new(self, |context| { let mut argument_values = Vec::with_capacity(arguments.len()); for argument in arguments { - let value = - argument.into_value_without_type_check(runtime.context, runtime.code)?; + let value = argument.into_value_without_type_check(context, &root_span)?; argument_values.push(value); } - let sketch = runtime.context.stack.get_variable_str(runtime.code, name)?; + let sketch = context.stack.get_variable_str(&root_span, name)?; - let sketch = sketch - .downcast_ref::>(runtime.code)? - .clone(); + let sketch = sketch.downcast_ref::>(&root_span)?.clone(); if matches!( - *sketch.signature, + sketch.source.signature, FunctionSignature::Sketch { arguments: _ } ) { // TODO attaching a span to a user function would be useful for debug purposes. - let result = sketch.call(runtime.context, runtime.code, argument_values, &[])?; + let result = sketch.call(context, &root_span, argument_values, &[])?; - result.downcast::(runtime.code)?; + result.downcast::(&root_span)?; log::warn!( "Sketches currently cannot be serialized, so no output will be provied." @@ -120,9 +110,9 @@ impl Runtime { Ok(()) } else { Err(Failure::ExpectedGot( - runtime.code.clone(), + root_span.clone(), "sketch".into(), - sketch.signature.to_string().into(), + sketch.source.signature.to_string().into(), )) } }) @@ -132,33 +122,33 @@ impl Runtime { &mut self, name: &str, arguments: Vec, - ) -> std::result::Result { - self.with_mut(|runtime| { + ) -> std::result::Result> { + let root_span = self.root_span.clone(); + ExecutionContext::new(self, |context| { let mut argument_values = Vec::with_capacity(arguments.len()); for argument in arguments { - let value = - argument.into_value_without_type_check(runtime.context, runtime.code)?; + let value = argument.into_value_without_type_check(context, &root_span)?; argument_values.push(value); } - let solid = runtime.context.stack.get_variable_str(runtime.code, name)?; + let solid = context.stack.get_variable_str(&root_span, name)?; - let solid = solid - .downcast_ref::>(runtime.code)? - .clone(); + let solid = solid.downcast_ref::>(&root_span)?.clone(); - if matches!(*solid.signature, FunctionSignature::Solid { arguments: _ }) { + if matches!( + solid.source.signature, + FunctionSignature::Solid { arguments: _ } + ) { // TODO attaching a span to a user function would be useful for debug purposes. - let result = solid.call(runtime.context, runtime.code, argument_values, &[])?; - - let solid = result.downcast::(runtime.code)?; + let result = solid.call(context, &root_span, argument_values, &[])?; + let solid = result.downcast::(&root_span)?; Ok(solid) } else { Err(Failure::ExpectedGot( - runtime.code.clone(), + root_span.clone(), "solid".into(), - solid.signature.to_string().into(), + solid.source.signature.to_string().into(), )) } }) @@ -168,39 +158,37 @@ impl Runtime { &mut self, name: &str, arguments: Vec, - ) -> std::result::Result { - self.with_mut(|runtime| { + ) -> std::result::Result> { + let root_span = self.root_span.clone(); + ExecutionContext::new(self, |context| { let mut argument_values = Vec::with_capacity(arguments.len()); for argument in arguments { - let value = - argument.into_value_without_type_check(runtime.context, runtime.code)?; + let value = argument.into_value_without_type_check(context, &root_span)?; argument_values.push(value); } - let task = runtime.context.stack.get_variable_str(runtime.code, name)?; + let task = context.stack.get_variable_str(&root_span, name)?; - let task = task - .downcast_ref::>(runtime.code)? - .clone(); + let task = task.downcast_ref::>(&root_span)?.clone(); if matches!( - *task.signature, + task.source.signature, FunctionSignature::Task { return_type: _, arguments: _ } ) { // TODO attaching a span to a user function would be useful for debug purposes. - let result = task.call(runtime.context, runtime.code, argument_values, &[])?; + let result = task.call(context, &root_span, argument_values, &[])?; - let result = result.export(runtime.context.log, runtime.code)?; + let result = result.export(context.log, &root_span)?; Ok(result) } else { Err(Failure::ExpectedGot( - runtime.code.clone(), + root_span.clone(), "task".into(), - task.signature.to_string().into(), + task.source.signature.to_string().into(), )) } }) @@ -211,7 +199,7 @@ impl Runtime { mod test { use std::borrow::Cow; - use common_data_types::Number; + use common_data_types::Float; use uom::si::{ f64::Length, length::{meter, millimeter}, @@ -223,10 +211,10 @@ mod test { #[test] fn run_sketch() { - let mut runtime = Runtime::load(( + let mut runtime = Runtime::load( "root_module", - "sketch my_sketch(input: Length = 50m) { new_sketch([]) }", - )) + "sketch my_sketch(input: Length = 50m) { new_sketch(global_xy_plane(), []) }", + ) .unwrap(); assert!(matches!( @@ -248,7 +236,7 @@ mod test { .unwrap(); let mut runtime = - Runtime::load(("root_module", "function my_sketch() -> Number { 2 }")).unwrap(); + Runtime::load("root_module", "function my_sketch() -> Number { 2 }").unwrap(); assert!(matches!( runtime.run_sketch("my_sketch", vec![]), @@ -262,10 +250,10 @@ mod test { #[test] fn run_solid() { - let mut runtime = Runtime::load(( + let mut runtime = Runtime::load( "root_module", - "solid my_solid(input: Length = 1cm) { new_sketch(Circle { center = vec2(0m, 0m), radius = input }).sweep(global_xy_plane(), vec3(0cm, 0cm, 1cm)) }", - )) + "solid my_solid(input: Length = 1cm) { new_sketch(Circle { center = vec2(0m, 0m), radius = input, surface = global_xy_plane() }).sweep(global_xy_plane(), vec3(0cm, 0cm, 1cm)) }", + ) .unwrap(); assert!(matches!( @@ -287,7 +275,7 @@ mod test { .unwrap(); let mut runtime = - Runtime::load(("root_module", "function my_solid() -> Number { 2 }")).unwrap(); + Runtime::load("root_module", "function my_solid() -> Number { 2 }").unwrap(); assert!(matches!( runtime.run_solid("my_solid", vec![]), @@ -301,10 +289,10 @@ mod test { #[test] fn run_task() { - let mut runtime = Runtime::load(( + let mut runtime = Runtime::load( "root_module", "task my_task(input: Number = 50) -> Number { input }", - )) + ) .unwrap(); assert!(matches!( @@ -314,19 +302,19 @@ mod test { assert_eq!( runtime.run_task("my_task", vec![SerializableValue::Default]), - Ok(SerializableValue::Scalar(Number::new(50.0).unwrap().into())) + Ok(SerializableValue::Scalar(Float::new(50.0).unwrap().into())) ); assert_eq!( runtime.run_task( "my_task", - vec![SerializableValue::Scalar(Number::new(22.0).unwrap().into())] + vec![SerializableValue::Scalar(Float::new(22.0).unwrap().into())] ), - Ok(SerializableValue::Scalar(Number::new(22.0).unwrap().into())) + Ok(SerializableValue::Scalar(Float::new(22.0).unwrap().into())) ); let mut runtime = - Runtime::load(("root_module", "sketch my_sketch() { new_sketch([]) }")).unwrap(); + Runtime::load("root_module", "sketch my_sketch() { new_sketch([]) }").unwrap(); assert!(matches!( runtime.run_task("my_sketch", vec![]), diff --git a/src/script/parsing/closure.rs b/src/script/parsing/closure.rs index 440b3af..b39bef2 100644 --- a/src/script/parsing/closure.rs +++ b/src/script/parsing/closure.rs @@ -16,8 +16,6 @@ * program. If not, see . */ -use std::rc::Rc; - use nom::{ branch::alt, bytes::complete::tag, @@ -47,12 +45,12 @@ impl CapturedVariable { } } -#[derive(Debug, Eq, PartialEq, Clone)] +#[derive(Debug, Eq, PartialEq)] pub struct Closure { pub starting_span: S, pub captured_variables: Vec>, - pub callable: Rc>, - pub signature: Rc>, + pub callable: CallableBlock, + pub signature: FunctionSignature, } impl Closure { @@ -72,13 +70,13 @@ impl Closure { CallableBlock::parse_with_return_type, ), |((starting_span, captured_variables), (callable, return_type))| Self { - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { return_type: Box::new(return_type), arguments: callable.parameters.iter().map(|p| p.ty.clone()).collect(), - }), + }, starting_span, captured_variables, - callable: Rc::new(callable), + callable, }, )(input) } @@ -115,15 +113,15 @@ mod test { Closure { starting_span: "[", captured_variables: vec![], - callable: Rc::new(CallableBlock { + callable: CallableBlock { parameter_span: "(", parameters: vec![], block: Block { statements: vec![] } - }), - signature: Rc::new(FunctionSignature::Function { + }, + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Number")), arguments: vec![] - }) + } } )) ); @@ -135,15 +133,15 @@ mod test { Closure { starting_span: "[", captured_variables: vec![CapturedVariable::Copy("a")], - callable: Rc::new(CallableBlock { + callable: CallableBlock { parameter_span: "(", parameters: vec![], block: Block { statements: vec![] } - }), - signature: Rc::new(FunctionSignature::Function { + }, + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Number")), arguments: vec![] - }) + } } )) ); @@ -158,15 +156,15 @@ mod test { CapturedVariable::Copy("a"), CapturedVariable::Reference("b") ], - callable: Rc::new(CallableBlock { + callable: CallableBlock { parameter_span: "(", parameters: vec![], block: Block { statements: vec![] } - }), - signature: Rc::new(FunctionSignature::Function { + }, + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Number")), arguments: vec![] - }) + } } )) ); diff --git a/src/script/parsing/function.rs b/src/script/parsing/function.rs index a52ba48..7bbef10 100644 --- a/src/script/parsing/function.rs +++ b/src/script/parsing/function.rs @@ -16,8 +16,6 @@ * program. If not, see . */ -use std::rc::Rc; - use nom::{ combinator::{cut, map}, sequence::{pair, terminated}, @@ -29,11 +27,11 @@ use super::{space1, take_keyword, FunctionSignature, NamedBlock, Span, VResult}; pub struct Function { pub starting_span: S, pub named_block: NamedBlock, - pub signature: Rc>, + pub signature: FunctionSignature, } impl Function { - pub fn parse(input: S) -> VResult { + pub fn parse_as_function(input: S) -> VResult { map( pair( terminated(take_keyword("function"), space1), @@ -41,7 +39,71 @@ impl Function { ), |(starting_span, (named_block, return_type))| Self { starting_span, - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { + return_type: Box::new(return_type), + arguments: named_block + .callable + .parameters + .iter() + .map(|p| p.ty.clone()) + .collect(), + }, + named_block, + }, + )(input) + } + + pub fn parse_as_sketch(input: S) -> VResult { + map( + pair( + terminated(take_keyword("sketch"), space1), + cut(NamedBlock::parse), + ), + |(starting_span, named_block)| Self { + starting_span, + signature: FunctionSignature::Sketch { + arguments: named_block + .callable + .parameters + .iter() + .map(|p| p.ty.clone()) + .collect(), + }, + named_block, + }, + )(input) + } + + pub fn parse_as_solid(input: S) -> VResult { + map( + pair( + terminated(take_keyword("solid"), space1), + cut(NamedBlock::parse), + ), + |(starting_span, named_block)| Self { + starting_span, + signature: FunctionSignature::Solid { + arguments: named_block + .callable + .parameters + .iter() + .map(|p| p.ty.clone()) + .collect(), + }, + named_block, + }, + )(input) + } + + pub fn parse_as_task(input: S) -> VResult { + map( + pair( + terminated(take_keyword("task"), space1), + cut(NamedBlock::parse_with_return_type), + ), + |(starting_span, (named_block, return_type))| Self { + starting_span, + signature: FunctionSignature::Task { return_type: Box::new(return_type), arguments: named_block .callable @@ -49,7 +111,7 @@ impl Function { .iter() .map(|p| p.ty.clone()) .collect(), - }), + }, named_block, }, )(input) @@ -68,9 +130,9 @@ mod test { #[test] fn function() { - assert!(Function::parse("function my_function() {}").is_err()); + assert!(Function::parse_as_function("function my_function() {}").is_err()); assert_eq!( - Function::parse("function my_function() -> Length {}"), + Function::parse_as_function("function my_function() -> Length {}"), Ok(( "", Function { @@ -83,10 +145,10 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Length")), arguments: vec![], - }) + } } )) ); diff --git a/src/script/parsing/litteral.rs b/src/script/parsing/litteral.rs index 0599228..b8b8fbc 100644 --- a/src/script/parsing/litteral.rs +++ b/src/script/parsing/litteral.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + /* * Copyright 2024 James Carl * AGPL-3.0-only or AGPL-3.0-or-later @@ -26,7 +28,7 @@ pub enum Litteral { List(List), Boolean(S, bool), Default(S), - Closure(Closure), + Closure(Rc>), } impl Litteral { @@ -34,7 +36,7 @@ impl Litteral { alt(( map(Scalar::parse, Self::Scalar), map(PString::parse, Self::String), - map(Closure::parse, Self::Closure), + map(Closure::parse, |closure| Self::Closure(Rc::new(closure))), map(List::parse, Self::List), map(take_keyword("true"), |span| Self::Boolean(span, true)), map(take_keyword("false"), |span| Self::Boolean(span, false)), @@ -135,19 +137,19 @@ mod test { Litteral::parse("[]() -> Number {}"), Ok(( "", - Litteral::Closure(Closure { + Litteral::Closure(Rc::new(Closure { starting_span: "[", captured_variables: vec![], - callable: Rc::new(CallableBlock { + callable: CallableBlock { parameter_span: "(", parameters: vec![], block: Block { statements: vec![] } - }), - signature: Rc::new(FunctionSignature::Function { + }, + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Number")), arguments: vec![] - }) - }) + } + })) )) ) } diff --git a/src/script/parsing/mod.rs b/src/script/parsing/mod.rs index f21f1ea..5677899 100644 --- a/src/script/parsing/mod.rs +++ b/src/script/parsing/mod.rs @@ -39,7 +39,7 @@ mod span; pub use span::Span; mod root; -pub use root::{FileAST, Import, RootElement, Sketch, Solid, Task}; +pub use root::{FileAST, Import, RootElement}; mod pstruct; pub use pstruct::StructDefinition; diff --git a/src/script/parsing/pstruct.rs b/src/script/parsing/pstruct.rs index 1b0e6f0..73bd29a 100644 --- a/src/script/parsing/pstruct.rs +++ b/src/script/parsing/pstruct.rs @@ -25,7 +25,7 @@ use nom::{ use super::{parse_name, space0, take_keyword, MemberVariable, Span, VResult}; -#[derive(Debug, Eq, PartialEq, Clone)] +#[derive(Debug, Eq, PartialEq)] pub struct StructDefinition { pub name: S, pub members: Vec>, diff --git a/src/script/parsing/root/mod.rs b/src/script/parsing/root/mod.rs index 3a1bafa..ebfc055 100644 --- a/src/script/parsing/root/mod.rs +++ b/src/script/parsing/root/mod.rs @@ -23,14 +23,11 @@ use nom::{ sequence::delimited, }; -pub use self::{import::Import, sketch::Sketch, solid::Solid, task::Task}; +pub use self::import::Import; use super::{space0, Function, Span, StructDefinition, VResult}; mod import; -mod sketch; -mod solid; -mod task; #[derive(Debug, Eq, PartialEq)] pub struct FileAST { @@ -50,9 +47,6 @@ impl FileAST { pub enum RootElement { Import(Import), Struct(StructDefinition), - Sketch(Sketch), - Solid(Solid), - Task(Task), Function(Function), } @@ -61,10 +55,10 @@ impl RootElement { alt(( map(Import::parse, Self::Import), map(StructDefinition::parse, Self::Struct), - map(Sketch::parse, Self::Sketch), - map(Solid::parse, Self::Solid), - map(Task::parse, Self::Task), - map(Function::parse, Self::Function), + map(Function::parse_as_sketch, Self::Function), + map(Function::parse_as_solid, Self::Function), + map(Function::parse_as_task, Self::Function), + map(Function::parse_as_function, Self::Function), ))(input) } } @@ -72,8 +66,6 @@ impl RootElement { #[cfg(test)] mod test { - use std::rc::Rc; - use crate::script::parsing::{ blocks::CallableBlock, Block, FunctionSignature, NamedBlock, VariableType, }; @@ -111,7 +103,7 @@ mod test { RootElement::parse("sketch my_sketch() {}"), Ok(( "", - RootElement::Sketch(Sketch { + RootElement::Function(Function { starting_span: "sketch", named_block: NamedBlock { name: "my_sketch", @@ -121,7 +113,7 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Sketch { arguments: vec![] }), + signature: FunctionSignature::Sketch { arguments: vec![] }, }) )) ); @@ -131,7 +123,7 @@ mod test { RootElement::parse("solid my_solid() {}"), Ok(( "", - RootElement::Solid(Solid { + RootElement::Function(Function { starting_span: "solid", named_block: NamedBlock { name: "my_solid", @@ -141,7 +133,7 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Solid { arguments: vec![] }), + signature: FunctionSignature::Solid { arguments: vec![] }, }) )) ); @@ -161,10 +153,10 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Length")), arguments: vec![] - }), + }, }) )) ); @@ -217,7 +209,7 @@ mod test { name: "MyStruct", members: vec![] }), - RootElement::Sketch(Sketch { + RootElement::Function(Function { starting_span: "sketch", named_block: NamedBlock { name: "my_sketch", @@ -227,9 +219,9 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Sketch { arguments: vec![] }), + signature: FunctionSignature::Sketch { arguments: vec![] }, }), - RootElement::Solid(Solid { + RootElement::Function(Function { starting_span: "solid", named_block: NamedBlock { name: "my_solid", @@ -239,7 +231,7 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Solid { arguments: vec![] }), + signature: FunctionSignature::Solid { arguments: vec![] }, }), RootElement::Function(Function { starting_span: "function", @@ -251,12 +243,12 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Function { + signature: FunctionSignature::Function { return_type: Box::new(VariableType::Scalar("Length")), arguments: vec![] - }), + }, }), - RootElement::Task(Task { + RootElement::Function(Function { starting_span: "task", named_block: NamedBlock { name: "my_task", @@ -266,10 +258,10 @@ mod test { block: Block { statements: vec![] } } }, - signature: Rc::new(FunctionSignature::Task { + signature: FunctionSignature::Task { return_type: Box::new(VariableType::Scalar("Length")), arguments: vec![] - }), + }, }), ] } diff --git a/src/script/parsing/root/sketch.rs b/src/script/parsing/root/sketch.rs deleted file mode 100644 index e4ab449..0000000 --- a/src/script/parsing/root/sketch.rs +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2024 James Carl - * AGPL-3.0-only or AGPL-3.0-or-later - * - * This file is part of Command Cad. - * - * Command CAD is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this - * program. If not, see . - */ - -use std::rc::Rc; - -use nom::{ - combinator::{cut, map}, - sequence::{pair, terminated}, -}; - -use crate::script::{ - parsing::{space1, take_keyword, FunctionSignature, NamedBlock, VResult}, - Span, -}; - -#[derive(Debug, Eq, PartialEq)] -pub struct Sketch { - pub starting_span: S, - pub named_block: NamedBlock, - pub signature: Rc>, -} - -impl Sketch { - pub fn parse(input: S) -> VResult { - map( - pair( - terminated(take_keyword("sketch"), space1), - cut(NamedBlock::parse), - ), - |(starting_span, named_block)| Self { - starting_span, - signature: Rc::new(FunctionSignature::Sketch { - arguments: named_block - .callable - .parameters - .iter() - .map(|p| p.ty.clone()) - .collect(), - }), - named_block, - }, - )(input) - } -} - -#[cfg(test)] -mod test { - use crate::script::parsing::{blocks::CallableBlock, Block}; - - use super::*; - - #[test] - fn sketch() { - assert!(Sketch::parse("sketch my_sketch() -> Length {}").is_err()); - assert_eq!( - Sketch::parse("sketch my_sketch() {}"), - Ok(( - "", - Sketch { - starting_span: "sketch", - named_block: NamedBlock { - name: "my_sketch", - callable: CallableBlock { - parameter_span: "(", - parameters: vec![], - block: Block { statements: vec![] } - } - }, - signature: Rc::new(FunctionSignature::Sketch { arguments: vec![] }) - } - )) - ); - } -} diff --git a/src/script/parsing/root/solid.rs b/src/script/parsing/root/solid.rs deleted file mode 100644 index 6b081db..0000000 --- a/src/script/parsing/root/solid.rs +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2024 James Carl - * AGPL-3.0-only or AGPL-3.0-or-later - * - * This file is part of Command Cad. - * - * Command CAD is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this - * program. If not, see . - */ - -use std::rc::Rc; - -use nom::{ - combinator::{cut, map}, - sequence::{pair, terminated}, -}; - -use crate::script::{ - parsing::{space1, take_keyword, FunctionSignature, NamedBlock, VResult}, - Span, -}; - -#[derive(Debug, Eq, PartialEq)] -pub struct Solid { - pub starting_span: S, - pub named_block: NamedBlock, - pub signature: Rc>, -} - -impl Solid { - pub fn parse(input: S) -> VResult { - map( - pair( - terminated(take_keyword("solid"), space1), - cut(NamedBlock::parse), - ), - |(starting_span, named_block)| Self { - starting_span, - signature: Rc::new(FunctionSignature::Solid { - arguments: named_block - .callable - .parameters - .iter() - .map(|p| p.ty.clone()) - .collect(), - }), - named_block, - }, - )(input) - } -} - -#[cfg(test)] -mod test { - use crate::script::parsing::{blocks::CallableBlock, Block}; - - use super::*; - - #[test] - fn solid() { - assert!(Solid::parse("solid my_solid() -> Length {}").is_err()); - assert_eq!( - Solid::parse("solid my_solid() {}"), - Ok(( - "", - Solid { - starting_span: "solid", - named_block: NamedBlock { - name: "my_solid", - callable: CallableBlock { - parameter_span: "(", - parameters: vec![], - block: Block { statements: vec![] } - } - }, - signature: Rc::new(FunctionSignature::Solid { arguments: vec![] }) - } - )) - ); - } -} diff --git a/src/script/parsing/root/task.rs b/src/script/parsing/root/task.rs deleted file mode 100644 index 236aaa0..0000000 --- a/src/script/parsing/root/task.rs +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2024 James Carl - * AGPL-3.0-only or AGPL-3.0-or-later - * - * This file is part of Command Cad. - * - * Command CAD is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this - * program. If not, see . - */ - -use std::rc::Rc; - -use nom::{ - combinator::{cut, map}, - sequence::{pair, terminated}, -}; - -use crate::script::{ - parsing::{space1, take_keyword, FunctionSignature, NamedBlock, VResult}, - Span, -}; - -#[derive(Debug, Eq, PartialEq)] -pub struct Task { - pub starting_span: S, - pub named_block: NamedBlock, - pub signature: Rc>, -} - -impl Task { - pub fn parse(input: S) -> VResult { - map( - pair( - terminated(take_keyword("task"), space1), - cut(NamedBlock::parse_with_return_type), - ), - |(starting_span, (named_block, return_type))| Self { - starting_span, - signature: Rc::new(FunctionSignature::Task { - return_type: Box::new(return_type), - arguments: named_block - .callable - .parameters - .iter() - .map(|p| p.ty.clone()) - .collect(), - }), - named_block, - }, - )(input) - } -} - -#[cfg(test)] -mod test { - use crate::script::parsing::{blocks::CallableBlock, Block, VariableType}; - - use super::*; - - #[test] - fn task() { - assert!(Task::parse("task my_task() {}").is_err()); - assert_eq!( - Task::parse("task my_task() -> Length {}"), - Ok(( - "", - Task { - starting_span: "task", - named_block: NamedBlock { - name: "my_task", - callable: CallableBlock { - parameter_span: "(", - parameters: vec![], - block: Block { statements: vec![] } - } - }, - signature: Rc::new(FunctionSignature::Task { - return_type: Box::new(VariableType::Scalar("Length")), - arguments: vec![], - }) - } - )) - ); - } -} diff --git a/src/script/parsing/span.rs b/src/script/parsing/span.rs index 1f487af..c9a8e8c 100644 --- a/src/script/parsing/span.rs +++ b/src/script/parsing/span.rs @@ -39,6 +39,7 @@ pub trait Span: + AsStr + FromStr + FormatSpan + + 'static { fn chars(&self) -> impl Iterator; } @@ -51,25 +52,25 @@ pub trait FromStr { fn from_str(string: &'static str) -> Self; } -impl<'a> AsStr for &'a str { +impl AsStr for &'static str { fn as_str(&self) -> &str { self } } -impl<'a> FromStr for &'a str { +impl FromStr for &'static str { fn from_str(string: &'static str) -> Self { string } } -impl<'a> AsStr for LocatedSpan<&'a str> { +impl AsStr for LocatedSpan<&'static str> { fn as_str(&self) -> &str { self.fragment() } } -impl<'a> FromStr for LocatedSpan<&'a str> { +impl FromStr for LocatedSpan<&'static str> { fn from_str(string: &'static str) -> Self { LocatedSpan::new(string) } @@ -99,12 +100,12 @@ impl FromStr for LocatedSpan { } } -impl<'a> Span for &'a str { +impl Span for &'static str { fn chars(&self) -> impl Iterator { str::chars(self) } } -impl<'a> Span for LocatedSpan<&'a str> { +impl Span for LocatedSpan<&'static str> { fn chars(&self) -> impl Iterator { self.fragment().chars() } diff --git a/src/script/parsing/statements/mod.rs b/src/script/parsing/statements/mod.rs index ee8b103..d3c3798 100644 --- a/src/script/parsing/statements/mod.rs +++ b/src/script/parsing/statements/mod.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + /* * Copyright 2024 James Carl * AGPL-3.0-only or AGPL-3.0-or-later @@ -55,8 +57,8 @@ pub enum Statement { Loop(Loop), Break(Break), Continue(Continue), - DefineFunction(Function), - DefineStruct(StructDefinition), + DefineFunction(Rc>), + DefineStruct(Rc>), } impl Statement { @@ -73,8 +75,12 @@ impl Statement { map(Loop::parse, Self::Loop), map(Break::parse, Self::Break), map(Continue::parse, Self::Continue), - map(Function::parse, Self::DefineFunction), - map(StructDefinition::parse, Self::DefineStruct), + map(Function::parse_as_function, |function| { + Self::DefineFunction(Rc::new(function)) + }), + map(StructDefinition::parse, |structure| { + Self::DefineStruct(Rc::new(structure)) + }), map(Expression::parse, Self::Expression), )), )(input) @@ -218,21 +224,24 @@ mod test { Statement::parse("function my_function() -> Number {}"), Ok(( "", - Statement::DefineFunction(Function { - starting_span: "function", - named_block: NamedBlock { - name: "my_function", - callable: CallableBlock { - parameter_span: "(", - parameters: vec![], - block: Block { statements: vec![] } + Statement::DefineFunction( + Function { + starting_span: "function", + named_block: NamedBlock { + name: "my_function", + callable: CallableBlock { + parameter_span: "(", + parameters: vec![], + block: Block { statements: vec![] } + } + }, + signature: FunctionSignature::Function { + return_type: Box::new(VariableType::Scalar("Number")), + arguments: vec![] } - }, - signature: Rc::new(FunctionSignature::Function { - return_type: Box::new(VariableType::Scalar("Number")), - arguments: vec![] - }) - }) + } + .into() + ) )) ); @@ -240,10 +249,10 @@ mod test { Statement::parse("struct MyStruct {}"), Ok(( "", - Statement::DefineStruct(StructDefinition { + Statement::DefineStruct(Rc::new(StructDefinition { name: "MyStruct", members: vec![] - }) + })) )) ); } diff --git a/src/script/parsing/variable_type.rs b/src/script/parsing/variable_type.rs index f56e71a..28af6c2 100644 --- a/src/script/parsing/variable_type.rs +++ b/src/script/parsing/variable_type.rs @@ -170,6 +170,9 @@ pub enum VariableType { Solid, Shell, Face, + Curve, + HalfEdge, + Vertex, Function(FunctionSignature), } @@ -178,17 +181,22 @@ impl VariableType { context( "Invalid type", alt(( - map(tag("String"), |_| Self::String), - map(tag("List"), |_| Self::List), - map(tag("Boolean"), |_| Self::Boolean), - map(tag("Range"), |_| Self::Range), - map(tag("Cycle"), |_| Self::Cycle), - map(tag("Region"), |_| Self::Region), - map(tag("Sketch"), |_| Self::Sketch), - map(tag("Surface"), |_| Self::Surface), - map(tag("Solid"), |_| Self::Solid), - map(tag("Shell"), |_| Self::Shell), - map(tag("Face"), |_| Self::Face), + alt(( + map(tag("String"), |_| Self::String), + map(tag("List"), |_| Self::List), + map(tag("Boolean"), |_| Self::Boolean), + map(tag("Range"), |_| Self::Range), + map(tag("Cycle"), |_| Self::Cycle), + map(tag("Region"), |_| Self::Region), + map(tag("Sketch"), |_| Self::Sketch), + map(tag("Surface"), |_| Self::Surface), + map(tag("Solid"), |_| Self::Solid), + map(tag("Shell"), |_| Self::Shell), + map(tag("Face"), |_| Self::Face), + map(tag("Curve"), |_| Self::Curve), + map(tag("HalfEdge"), |_| Self::HalfEdge), + map(tag("Vertex"), |_| Self::Vertex), + )), map( preceded(pair(take_keyword("struct"), space0), parse_name), Self::Struct, @@ -257,6 +265,9 @@ impl VariableType { Self::Solid => "Solid".into(), Self::Shell => "Shell".into(), Self::Face => "Face".into(), + Self::Curve => "Curve".into(), + Self::HalfEdge => "HalfEdge".into(), + Self::Vertex => "Vertex".into(), Self::Function(function) => format!("{}", function).into(), } } @@ -285,6 +296,9 @@ impl Display for VariableType { Self::Solid => write!(f, "Solid"), Self::Shell => write!(f, "Shell"), Self::Face => write!(f, "Face"), + Self::Curve => write!(f, "Curve"), + Self::HalfEdge => write!(f, "HalfEdge"), + Self::Vertex => write!(f, "Vertex"), Self::Function(function) => write!(f, "{}", function), } }