{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# Standard Units\n",
    "\n",
    "[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/chaobrain/brainunit/blob/master/docs/physical_units/standard_units.ipynb)\n",
    "[![Open in Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/chaobrain/brainunit/blob/master/docs/physical_units/standard_units.ipynb)"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "Standard units are defined in the `brainunit` package as object instances.\n",
    "\n",
    "All units are defined in terms of basic \"irreducible\" units. The irreducible units include:"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "- Length (meter)\n",
    "- Mass (kilogram)\n",
    "- Time (second)\n",
    "- Current (ampere)\n",
    "- Temperature (Kelvin)\n",
    "- Amount of substance (mole)\n",
    "- Luminous intensity (candela)"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "from brainunit import Unit, get_or_create_dimension\n",
    "\n",
    "metre = Unit.create(get_or_create_dimension(m=1), \"meter\", \"m\")\n",
    "\n",
    "kilogram = Unit.create(get_or_create_dimension(kg=1), \"kilogram\", \"kg\")\n",
    "\n",
    "second = Unit.create(get_or_create_dimension(s=1), \"second\", \"s\")\n",
    "\n",
    "ampere = Unit.create(get_or_create_dimension(A=1), \"ampere\", \"A\")\n",
    "\n",
    "kelvin = Unit.create(get_or_create_dimension(K=1), \"kelvin\", \"K\")\n",
    "\n",
    "mole = Unit.create(get_or_create_dimension(mol=1), \"mole\", \"mol\")\n",
    "\n",
    "candle = Unit.create(get_or_create_dimension(candle=1), \"candle\", \"cd\")"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "The underlying units in brainunit are implemented based on the International System of Units (SI), which is a globally recognized standard for measuring physical quantities. These units are defined using seven fundamental dimensions."
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "metre.dim._dims, kilogram.dim._dims, second.dim._dims, ampere.dim._dims, kelvin.dim._dims, mole.dim._dims, candle.dim._dims",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "By combining these fundamental dimensions, brainunit allows for the creation and manipulation of various derived units to represent different physical quantities accurately.\n",
    "\n",
    "There's some combining units shown below:"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "newton = Unit.create(get_or_create_dimension(m=1, kg=1, s=-2), \"newton\", \"N\")\n",
    "pascal = Unit.create(get_or_create_dimension(m=-1, kg=1, s=-2), \"pascal\", \"Pa\")\n",
    "joule = Unit.create(get_or_create_dimension(m=2, kg=1, s=-2), \"joule\", \"J\")\n",
    "watt = Unit.create(get_or_create_dimension(m=2, kg=1, s=-3), \"watt\", \"W\")\n",
    "coulomb = Unit.create(get_or_create_dimension(s=1, A=1), \"coulomb\", \"C\")\n",
    "volt = Unit.create(get_or_create_dimension(m=2, kg=1, s=-3, A=-1), \"volt\", \"V\")\n",
    "farad = Unit.create(get_or_create_dimension(m=-2, kg=-1, s=4, A=2), \"farad\", \"F\")\n",
    "ohm = Unit.create(get_or_create_dimension(m=2, kg=1, s=-3, A=-2), \"ohm\", \"ohm\")\n",
    "siemens = Unit.create(get_or_create_dimension(m=-2, kg=-1, s=3, A=2), \"siemens\", \"S\")\n",
    "weber = Unit.create(get_or_create_dimension(m=2, kg=1, s=-2, A=-1), \"weber\", \"Wb\")\n",
    "tesla = Unit.create(get_or_create_dimension(kg=1, s=-2, A=-1), \"tesla\", \"T\")\n",
    "henry = Unit.create(get_or_create_dimension(m=2, kg=1, s=-2, A=-2), \"henry\", \"H\")\n",
    "lux = Unit.create(get_or_create_dimension(m=-2, cd=1), \"lux\", \"lx\")\n",
    "gray = Unit.create(get_or_create_dimension(m=2, s=-2), \"gray\", \"Gy\")\n",
    "sievert = Unit.create(get_or_create_dimension(m=2, s=-2), \"sievert\", \"Sv\")\n",
    "katal = Unit.create(get_or_create_dimension(s=-1, mol=1), \"katal\", \"kat\")"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## Prefixs"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Most units can be used with prefixes, with both the standard [SI](https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-EN.pdf) prefixes supported"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "| Symbol |    Prefix   | Value |\n",
    "|--------|-------------|-------|\n",
    "|    Y   |    yotta-   |  1e24 |\n",
    "|    Z   |    zetta-   |  1e21 |\n",
    "|    E   |     exa-    |  1e18 |\n",
    "|    P   |    peta-    |  1e15 |\n",
    "|    T   |    tera-    |  1e12 |\n",
    "|    G   |    giga-    |  1e9  |\n",
    "|    M   |    mega-    |  1e6  |\n",
    "|    k   |    kilo-    |  1e3  |\n",
    "|    h   |    hecto-   |  1e2  |\n",
    "|   da   | deka-, deca |  1e1  |\n",
    "|    d   |    deci-    |  1e-1 |\n",
    "|    c   |    centi-   |  1e-2 |\n",
    "|    m   |    milli-   |  1e-3 |\n",
    "|    u   |    micro-   |  1e-6 |\n",
    "|    n   |    nano-    |  1e-9 |\n",
    "|    p   |    pico-    | 1e-12 |\n",
    "|    f   |    femto-   | 1e-15 |\n",
    "|    a   |    atto-    | 1e-18 |\n",
    "|    z   |    zepto-   | 1e-21 |\n",
    "|    y   |    yocto-   | 1e-24 |"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "For example, metre can be used with prefixes to represent different lengths:"
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "Ymetre = Unit.create_scaled_unit(metre, \"Y\")\n",
    "Zmetre = Unit.create_scaled_unit(metre, \"Z\")\n",
    "Emetre = Unit.create_scaled_unit(metre, \"E\")\n",
    "Pmetre = Unit.create_scaled_unit(metre, \"P\")\n",
    "Tmetre = Unit.create_scaled_unit(metre, \"T\")\n",
    "Gmetre = Unit.create_scaled_unit(metre, \"G\")\n",
    "Mmetre = Unit.create_scaled_unit(metre, \"M\")\n",
    "kmetre = Unit.create_scaled_unit(metre, \"k\")\n",
    "hmetre = Unit.create_scaled_unit(metre, \"h\")\n",
    "dametre = Unit.create_scaled_unit(metre, \"da\")\n",
    "dmetre = Unit.create_scaled_unit(metre, \"d\")\n",
    "cmetre = Unit.create_scaled_unit(metre, \"c\")\n",
    "mmetre = Unit.create_scaled_unit(metre, \"m\")\n",
    "umetre = Unit.create_scaled_unit(metre, \"u\")\n",
    "nmetre = Unit.create_scaled_unit(metre, \"n\")\n",
    "pmetre = Unit.create_scaled_unit(metre, \"p\")\n",
    "fmetre = Unit.create_scaled_unit(metre, \"f\")\n",
    "ametre = Unit.create_scaled_unit(metre, \"a\")\n",
    "zmetre = Unit.create_scaled_unit(metre, \"z\")\n",
    "ymetre = Unit.create_scaled_unit(metre, \"y\")"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "Ymetre.scale, Zmetre.scale, Emetre.scale, Pmetre.scale, Tmetre.scale, Gmetre.scale, Mmetre.scale, kmetre.scale, hmetre.scale, dametre.scale, dmetre.scale, cmetre.scale, mmetre.scale, umetre.scale, nmetre.scale, pmetre.scale, fmetre.scale, ametre.scale, zmetre.scale, ymetre.scale",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "brainunit provides almost all the units with prefixes, and you can use them directly."
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "brainpy-dev",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
