driftlet 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -76
- package/docs/device.md +61 -26
- package/docs/kit.md +71 -4
- package/docs/logo-dark.svg +3 -2
- package/docs/logo.svg +3 -2
- package/docs/reliability.md +60 -3
- package/docs/statistics.md +10 -0
- package/llms.txt +622 -391
- package/package.json +1 -1
- package/src/channels.js +27 -4
- package/src/checks.js +5 -1
- package/src/describe.js +1 -1
- package/src/device.js +112 -14
- package/src/index.js +6 -1
- package/src/kit.js +1 -0
- package/src/particles.js +331 -0
- package/src/solution.js +42 -4
- package/src/solver.js +181 -50
- package/src/stack.js +6 -4
- package/src/types.js +2 -1
- package/types/channels.d.ts +14 -3
- package/types/checks.d.ts +2 -1
- package/types/kit.d.ts +1 -0
- package/types/particles.d.ts +42 -0
- package/types/solution.d.ts +1 -0
- package/types/solver.d.ts +8 -2
- package/types/stack.d.ts +6 -5
- package/types/types.d.ts +5 -0
package/README.md
CHANGED
|
@@ -8,21 +8,33 @@
|
|
|
8
8
|
[](https://github.com/markblundeberg/driftlet/actions/workflows/test.yml)
|
|
9
9
|
[](https://www.npmjs.com/package/driftlet)
|
|
10
10
|
|
|
11
|
-
**driftlet
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
interfacial reactions, heterointerfaces, metals and external circuits, in steady state, in time
|
|
16
|
-
and as small-signal impedance. It's small enough to run in a web page: no dependencies,
|
|
17
|
-
millisecond solves.
|
|
11
|
+
**driftlet simulates charged species moving through one-dimensional devices**: semiconductor
|
|
12
|
+
junctions and solar cells, electrochemical cells and batteries, double layers, membranes and
|
|
13
|
+
nerves. It's a small JavaScript library with no dependencies, fast enough to solve live in a
|
|
14
|
+
web page as you drag a slider.
|
|
18
15
|
|
|
19
16
|
[Live demos](https://markblundeberg.github.io/driftlet/demos/) · [npm](https://www.npmjs.com/package/driftlet) ·
|
|
20
17
|
[reading level diagrams](docs/visualization.md) · [device reference](docs/device.md) ·
|
|
21
18
|
[agent guide](llms.txt)
|
|
22
19
|
|
|
20
|
+
**One kind of physics.** Those look like different subjects, but underneath they're the same
|
|
21
|
+
one. Each is a cast of species (electrons, holes, ions, neutral molecules) that drift and
|
|
22
|
+
diffuse, each down its own electrochemical potential; their charge sets the electric field,
|
|
23
|
+
reactions turn one into another, and at interfaces they pass from one material to the next or
|
|
24
|
+
are stopped. A pn junction is electrons and holes in silicon. A silver electrode is Ag⁺ and NO₃⁻
|
|
25
|
+
in water, with Ag⁺ trading places with the metal's electrons at its surface. A nerve is Na⁺ and
|
|
26
|
+
K⁺ on either side of a membrane, crossing it through channels that open with voltage, and the
|
|
27
|
+
impulse travels along the fibre on the current those same ions carry inside it. Even the levels
|
|
28
|
+
each field draws are one quantity: a quasi-Fermi level, an electrode potential and a Nernst
|
|
29
|
+
potential are each a species' electrochemical potential. driftlet solves that one problem, in
|
|
30
|
+
steady state, in time and as small-signal impedance, so a new field is mostly a new cast, and
|
|
31
|
+
the work that makes it reliable in one field makes it reliable in the others.
|
|
32
|
+
|
|
23
33
|
**Built to be relied on.** A drift–diffusion solver that handles a textbook pn junction is a
|
|
24
|
-
weekend's work; one that keeps working on the devices people actually build is not.
|
|
25
|
-
|
|
34
|
+
weekend's work; one that keeps working on the devices people actually build is not. In real
|
|
35
|
+
devices concentrations span 30 orders of magnitude and double layers are a millionth of the
|
|
36
|
+
device's length, and there a plain Newton solver fails or, worse, quietly converges to a wrong
|
|
37
|
+
answer. driftlet is tested two ways: every physics feature against an analytic result or an independent code, and
|
|
26
38
|
thousands of randomly generated devices (junctions, MOS capacitors, solar cells, electrolyte
|
|
27
39
|
cells, electrodes) put through cold solves, sweeps, transients and impedance, every result
|
|
28
40
|
checked. A solve that fails reports it, with what went wrong where it can tell.
|
|
@@ -44,7 +56,7 @@ import { bandDiagram } from 'driftlet/plot'; // a level diagram as an SVG str
|
|
|
44
56
|
```
|
|
45
57
|
|
|
46
58
|
Or straight from a CDN in a page, pinned to a version:
|
|
47
|
-
`https://cdn.jsdelivr.net/npm/driftlet@0.
|
|
59
|
+
`https://cdn.jsdelivr.net/npm/driftlet@0.14.0/src/index.js` (and `src/kit.js`, `src/plot.js`).
|
|
48
60
|
TypeScript declarations ship in the package. Writing a demo with an LLM agent? Point it at
|
|
49
61
|
[`llms.txt`](llms.txt).
|
|
50
62
|
|
|
@@ -149,19 +161,19 @@ them locally, serve the repository root (e.g. `python3 -m http.server`) and open
|
|
|
149
161
|
The same equations go by different names in different fields. If your problem is one-dimensional
|
|
150
162
|
(planar, or radial: spheres and cylinders, or any cross-section varying along x), it's probably here:
|
|
151
163
|
|
|
152
|
-
| If you work on | you may call it | start from |
|
|
153
|
-
|
|
154
|
-
| Semiconductor devices | drift–diffusion, van Roosbroeck, quasi-Fermi levels, Scharfetter–Gummel; pn, Schottky, MOS, heterojunctions
|
|
155
|
-
| Solar cells | photogeneration, radiative and SRH recombination | [solar](https://markblundeberg.github.io/driftlet/demos/solar.html) [organic
|
|
156
|
-
| Electrochemistry, corrosion | Nernst–Planck, concentration polarization, limiting current, Butler–Volmer, Warburg, cyclic voltammetry, salt bridges
|
|
157
|
-
| Batteries, intercalation | OCV, insertion hosts, chemical diffusion | [insertion
|
|
158
|
-
| Double layers, colloids | Poisson–Boltzmann, Gouy–Chapman–Stern, Debye screening, crowding (Bikerman) | [double-layer
|
|
159
|
-
| Membranes,
|
|
160
|
-
| Solid-state ionics | mixed ionic–electronic conduction, defect chemistry, mobile ions | [`statistics`](test/statistics.test.js)
|
|
161
|
-
|
|
|
162
|
-
|
|
163
|
-
The tests are worked setups, each with its analytic check, so they double as recipes
|
|
164
|
-
[validation table](#validation) lists them all.
|
|
164
|
+
| If you work on | you may call it | start from |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| Semiconductor devices | drift–diffusion, van Roosbroeck, quasi-Fermi levels, Scharfetter–Gummel; pn, Schottky, MOS, heterojunctions, thin-film transistors | the [first example](#a-semiconductor-junction); [pn](https://markblundeberg.github.io/driftlet/demos/pn.html), [MOS](https://markblundeberg.github.io/driftlet/demos/mos.html) and [transistor](https://markblundeberg.github.io/driftlet/demos/saturation.html#transistor) demos |
|
|
167
|
+
| Solar cells | photogeneration, Beer–Lambert, radiative and SRH recombination, excitons, mobile ions | [solar](https://markblundeberg.github.io/driftlet/demos/solar.html), [organic](https://markblundeberg.github.io/driftlet/demos/organic.html) and [perovskite](https://markblundeberg.github.io/driftlet/demos/perovskite.html) demos |
|
|
168
|
+
| Electrochemistry, corrosion | Nernst–Planck, concentration polarization, limiting current, Butler–Volmer, Warburg, cyclic voltammetry, salt bridges, liquid junctions, mixed potentials | the [second example](#an-electrochemical-cell); [cyclic voltammetry](https://markblundeberg.github.io/driftlet/demos/redox.html), [Daniell cell](https://markblundeberg.github.io/driftlet/demos/daniell.html), [limiting current](https://markblundeberg.github.io/driftlet/demos/saturation.html), [impedance](https://markblundeberg.github.io/driftlet/demos/impedance.html) and [liquid-junction](https://markblundeberg.github.io/driftlet/demos/junction.html) demos |
|
|
169
|
+
| Batteries, intercalation | OCV, insertion hosts, chemical diffusion | [insertion](https://markblundeberg.github.io/driftlet/demos/insertion.html) demo |
|
|
170
|
+
| Double layers, colloids | Poisson–Boltzmann, Gouy–Chapman–Stern, Debye screening, crowding (Bikerman) | [double-layer](https://markblundeberg.github.io/driftlet/demos/double-layer.html) demo |
|
|
171
|
+
| Membranes, nanofluidics | Donnan, ion exchange, Teorell–Meyer–Sievers, charged nanochannels and pores | [membrane](https://markblundeberg.github.io/driftlet/demos/membrane.html) and [nanochannel](https://markblundeberg.github.io/driftlet/demos/channel.html) demos |
|
|
172
|
+
| Solid-state ionics | mixed ionic–electronic conduction, defect chemistry, mobile ions | [`statistics`](test/statistics.test.js) and [`reactions`](test/reactions.test.js) tests |
|
|
173
|
+
| Cell physiology, neuroscience | resting potential, Nernst, Goldman–Hodgkin–Katz, the Na⁺/K⁺ pump, patch pipettes, Hodgkin–Huxley, action potentials, the cable equation, myelin | [resting-potential](https://markblundeberg.github.io/driftlet/demos/cell.html), [action-potential](https://markblundeberg.github.io/driftlet/demos/axon.html), [propagation](https://markblundeberg.github.io/driftlet/demos/propagation.html) and [myelin](https://markblundeberg.github.io/driftlet/demos/myelin.html) demos |
|
|
174
|
+
|
|
175
|
+
The tests are worked setups, each with its analytic check, so they double as recipes; the
|
|
176
|
+
[validation table](docs/reliability.md#the-validation-table) lists them all.
|
|
165
177
|
|
|
166
178
|
## How to think about it
|
|
167
179
|
|
|
@@ -180,10 +192,12 @@ driftlet insists on thermodynamically honest concepts ([conventions](docs/conven
|
|
|
180
192
|
- The species voltage `V_i = μ̄_i / (z_i F)` and standard level `V°_i` are available as views,
|
|
181
193
|
alongside redox levels: [reading level diagrams](docs/visualization.md) explains them.
|
|
182
194
|
|
|
195
|
+
## What it does
|
|
196
|
+
|
|
183
197
|
A device is a line of **regions** (each a **material** plus a length, fixed charge and
|
|
184
198
|
initial composition), joined at **interfaces**, with a **contact** at each end. The contacts
|
|
185
199
|
and any internal **ports** are its **terminals**, each held at a voltage or driven by a
|
|
186
|
-
current.
|
|
200
|
+
current. Within that:
|
|
187
201
|
|
|
188
202
|
- any mix of charged and neutral species; per-material diffusivities and standard potentials;
|
|
189
203
|
species absent from some materials;
|
|
@@ -196,11 +210,15 @@ current. Supported physics:
|
|
|
196
210
|
conductivity: Schottky and MOS gates as regions, electrodes with reactions at their faces,
|
|
197
211
|
bipolar electrodes;
|
|
198
212
|
- contacts as outside phases with known levels, joined by the same laws as internal faces:
|
|
199
|
-
ohmic contacts, reversible electrodes, baths, pinned barriers, conductance links,
|
|
213
|
+
ohmic contacts, reversible electrodes, baths, pinned barriers, conductance links, surface
|
|
214
|
+
velocities (thermionic emission over a Schottky barrier, surface recombination), gates and
|
|
200
215
|
Stern layers;
|
|
201
216
|
- interfaces with explicit alignment, blocking, interface resistance, and Butler–Volmer
|
|
202
217
|
reactions with participants on either side (electrode reactions, ion and electron transfer,
|
|
203
218
|
mixed potentials), and a choice of electrostatic law (pinned, neutral, Helmholtz);
|
|
219
|
+
- membranes as capacitive faces with ion permeabilities (Goldman–Hodgkin–Katz), pumps as
|
|
220
|
+
reactions on them and voltage-gated channels with Hodgkin–Huxley kinetics; or spread along a
|
|
221
|
+
region through a port, as an axon's wall;
|
|
204
222
|
- bulk reactions with thermodynamically consistent mass action (recombination, water
|
|
205
223
|
autoionisation, …);
|
|
206
224
|
- imposed flow (advection) and current-free eddy mixing;
|
|
@@ -235,57 +253,11 @@ How it works numerically is in [numerics](docs/numerics.md).
|
|
|
235
253
|
|
|
236
254
|
## Validation
|
|
237
255
|
|
|
238
|
-
Every physics feature
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
| Gouy–Chapman double layer | analytic charge and full nonlinear profile | 2e-3 |
|
|
244
|
-
| Debye screening (linear limit) | gate in series with `ε/λ_D` | 1e-3 |
|
|
245
|
-
| Donnan potential | analytic partition, between floating layers and real baths | 1e-8 |
|
|
246
|
-
| Heterointerfaces with unequal dipoles (A \| B \| A) | per-face analytic double-layer split | 3e-3 |
|
|
247
|
-
| Floating island | Gauss's law; conserved amounts through gate sweeps | 1e-12 |
|
|
248
|
-
| pn junction | exact built-in potential; depletion charge; short-diode J–V | 1e-12; 1%; 2e-3 |
|
|
249
|
-
| Long pn diode with recombination | Shockley J–V incl. depletion recombination | 2e-3 |
|
|
250
|
-
| Haynes–Shockley pulse | an injected hole packet's drift, spread and decay at the ambipolar μ*, D*, 1/τ*; nothing lost while it goes in | 2e-4; 1e-2; 2e-3 |
|
|
251
|
-
| A packet laid down as a `c0` profile | the same rates from a Gaussian at t = 0: μ*E t, σ₀² + 2D*t, e^(−t/τ*) | 3e-4; 1e-2; 1e-3 |
|
|
252
|
-
| Beer–Lambert photogeneration in an n⁺p cell | J_sc = qΦ∫αe^(−αx)η(x)dx with the emitter's, depletion layer's and base's collection, α from 1e3 to 1e7 /m on one coarse grid | 5e-4 (3e-3 in the emitter) |
|
|
253
|
-
| Organic bilayer: excitons | J_sc from excitons diffusing to the donor/acceptor interface (Beer–Lambert, a blocking anode, the splitting reaction's finite velocity); V_oc from charge-transfer detailed balance | 5e-4; 1e-6 V |
|
|
254
|
-
| SRH recombination | bulk: G = R_SRH(n, p) with n = N_D + p, midgap and shallow traps, low to high injection; at a face: zero in the dark, the law between the two edge nodes, every pair collected or recombined | 1e-6; 1e-9 |
|
|
255
|
-
| Perovskite J–V hysteresis, against IonMonger | an independent code (finite elements, Octave): mobile iodide vacancies, interface SRH, scans from 1 mV/s to 1 kV/s — hysteresis index, P_max, V_oc, the whole loop (as current where it's gentle, as a voltage offset near V_oc, where it falls at up to 1100 mA/cm² per volt) | 1.5e-3; 0.05 mW/cm²; 2 mV; 0.03 mA/cm² and 1 mV (0.010 and 0.31 mV found) |
|
|
256
|
-
| Illuminated long pn diode | `J_sc = qG(L_n + L_p + W)` from a cold start; superposition at low injection | 5e-3; 1e-2 |
|
|
257
|
-
| Schottky barrier (metal region \| n-Si) | surface density from the alignment; depletion charge | 5e-3; 2% |
|
|
258
|
-
| Charged pore or nanochannel (resolved Donnan layers at each mouth) | conductance against salt, down to its plateau, as Teorell–Meyer–Sievers in a long pore (short ones short by end layers ∝ 1/L); the zero-current voltage across a salt gradient; a symmetric pore's I–V odd, rectification with charge on one side or bipolar | 1%; 5e-3 to 1e-4; 1e-9 |
|
|
259
|
-
| Cell membrane (a capacitive face with permeabilities) | GHK resting potential (neutral or resolved solutions) and current–voltage curve; the same as a resolved 5 nm lipid layer; charging at I/C; with the Na⁺/K⁺ pump in a closed cell, Mullins–Noda, the static head 3Δμ̄_Na − 2Δμ̄_K = ΔG_ATP, and Donnan with the pump off | 1e-5 V; 3e-3; 2e-5 V; 1%; 1e-9 |
|
|
260
|
-
| Voltage-gated channels (Hodgkin–Huxley gates on a membrane face) | each gate at α/(α + β) under a voltage clamp, and relaxing at α + β after a step; a squid axon's action potential against the space-clamped HH equations with GHK currents; its impedance at rest (inductive, resonant) against the linearised equations | 1e-12; 2e-4; 1 mV; 5e-4 |
|
|
261
|
-
| A propagating action potential (a squid axon along x: gated membrane port, ions drifting in the axoplasm) | rest at HH's −65 mV and gate values; conduction velocity against the cable equation solved directly, and HH's 18.8 m/s; a myelinated axon's saltatory conduction, node by node, against a compartmental cable | 0.01 mV, 1e-4; 2e-3; 1%; 1 µs of ~25 per node |
|
|
262
|
-
| Liquid junctions in mixtures | Henderson's formula against JPCalc's published values; driftlet's steady junction against Planck by shooting and the stationary Nernst–Planck codes LJPcalc and JLJP, a patch pipette's K-gluconate among them; a free-diffusion junction constant in time, between the two | 0.015 mV; 2e-4 and 0.02 mV; 5e-3 mV |
|
|
263
|
-
| Liquid junction, open circuit | cell EMF 2t₊(RT/F) ln(c₁/c₂); Planck diffusion potential | 1e-4 |
|
|
264
|
-
| Salt diffusion mode from a `c0` profile | c̄ + a·sin(πx/2L) decaying at π²D/4L², D = 2D₊D₋/(D₊ + D₋) | 2e-5 |
|
|
265
|
-
| Concentration polarization | `i = i_lim tanh(V/4V_T)`, incl. galvanostatic and load modes | 2e-4 |
|
|
266
|
-
| Butler–Volmer electrode | Nernst equilibrium; mixed kinetic/diffusion closed form | 5e-4 |
|
|
267
|
-
| Redox couple between inert electrodes | Nernst level of Fe³⁺/Fe²⁺; the couple's total conserved at equilibrium and under current | 1e-9; 1e-10 |
|
|
268
|
-
| Interface conductance and ion transfer | series 1/G; BV rate law at the interface state | 1e-4; 1e-8 |
|
|
269
|
-
| Mass action | `c(H⁺)c(OH⁻) = K_w` from standard potentials; moiety conservation | 1e-9 |
|
|
270
|
-
| Second law | free energy in through the terminals (Σ N μ̄ over every species) equals the dissipation, every term ≥ 0: a pn diode, an open-circuit junction running on chemical input alone, electrodes with a bipolar plate, a port and a contact behind conductances | 1e-10 |
|
|
271
|
-
| Transients | RC charging of a gated island; water relaxation rate | 1%; 2e-3 |
|
|
272
|
-
| Time integration | BE first order, BDF2 second order; adaptive error control | ratios 2, 4 |
|
|
273
|
-
| Advection and eddy mixing | exact convection–diffusion profile; `D + D_mix`; junction EMF unchanged by mixing | 1e-12; 1e-12; 1e-5 |
|
|
274
|
-
| Metal regions | ohmic; Schottky face and MOS gate equal their contact forms; Ag \| AgNO₃ \| Ag with metal electrodes; bipolar electrode at V/2 | 1e-12; 1e-9; 1e-9; 1e-9 |
|
|
275
|
-
| Internal ports | transmission line σV tanh(L/λ)/λ (O(h²)); held level; MOS low-frequency C–V with a grounded channel, and without one the same equilibrium, and a gate step filling the inversion layer to it | 1e-4; 1e-9; 2e-3; 1e-6; 1e-3 |
|
|
276
|
-
| Cross-sections (spherical, cylindrical, any A(x)) | steady diffusion to a sphere and a cylinder (exact on any grid); Cottrell with the spherical term; uptake by a sphere filling from its surface; Debye–Hückel around a charged sphere, potential and charge | 1e-10; 3e-4; 2e-4; 1e-3, 3e-4 |
|
|
277
|
-
| A capacitance through a port | a thin-film transistor against the charge-sheet model (below threshold to saturation, second order); de Levie impedance; gate impedance against dQ/dV | 5e-4; 1e-3; 1e-6 |
|
|
278
|
-
| Electrode surfaces (coverage) | Langmuir isotherm against potential; the charge to fill a surface; the active–passive curve, blocking exactly (1 − θ) | 1e-9; 1e-3; 1e-9 |
|
|
279
|
-
| Electrodes spread through a port | transmission line with the reaction's linear kinetics as the conductance (O(h²)), rates along it; Wagner–Traud mixed potential of two Butler–Volmer couples, floating | 1e-4, 2e-3; 1e-6 V |
|
|
280
|
-
| Impedance | Macdonald blocking-electrode spectrum, 100 Hz–1 GHz; finite-length Warburg (Ag \| AgNO₃ \| Ag); DC limit = differential resistance; a p⁺n⁺ junction without recombination, Re Y → dI/dV and C = dQ/dV; a redox electrode against a bath at its open circuit, Re Y → dI/dV | 3e-4; 3e-5; 1e-6; 1e-4, 1e-6; 1e-4 |
|
|
281
|
-
| Conservation | per step, and against time-integrated contact fluxes | 1e-11 relative |
|
|
282
|
-
| Strictly neutral limit (ε = 0) | Planck EMF; polarization with no overlimiting; Donnan at neutral faces | 1e-5; 1e-4; 1e-9 |
|
|
283
|
-
| Fermi–Dirac statistics | `𝓕_{±1/2}` vs quadrature; degenerate bulk; accumulation charge via `𝓕_{3/2}` | 1e-13; 1e-12; 1e-3 |
|
|
284
|
-
| Crowded double layer (lattice gas) | Kilic–Bazant–Ajdari charge, up to `ψ = 40 V_T`; custom function reproduces it | 5e-4; 1e-10 |
|
|
285
|
-
| Non-ideal transport | steady flux −(D/L)ΔP of the grand potential (lattice exact, Redlich–Kister O(h²)) | 1e-12; 1e-4 |
|
|
286
|
-
| Debye–Hückel | junction EMF 2t₊(RT/F) ln(a₁/a₂) with activities | 1e-6 |
|
|
287
|
-
| Data library | ion μ° against the electrochemical series and `K_w`; D against limiting conductivities; band data against `n_i` | 10 mV; 0.5%; 15% |
|
|
288
|
-
| Intercalation host (OCV) | composition vs table and isotherm; chemical diffusion flux and relaxation rate | 1e-12; 1e-5; 1e-4 |
|
|
256
|
+
Every physics feature lands with a test against an analytic result, or against an independent
|
|
257
|
+
code where there isn't one: over 300 tests (`npm test`), from Shockley's diode equation and the
|
|
258
|
+
Gouy–Chapman double layer to Hodgkin and Huxley's conduction velocity, and against IonMonger,
|
|
259
|
+
JPCalc, LJPcalc and JLJP. [How far to trust it](docs/reliability.md) lists every check with its
|
|
260
|
+
tolerance, alongside the random-device stress tests and the known limits.
|
|
289
261
|
|
|
290
262
|
## Performance
|
|
291
263
|
|
package/docs/device.md
CHANGED
|
@@ -114,7 +114,10 @@ regions: [
|
|
|
114
114
|
injected hole packet); what the cold start leaves unbalanced settles within the first steps.
|
|
115
115
|
That fill-in is right in a quasi-neutral bulk (it's what dielectric relaxation would do), not
|
|
116
116
|
where the rest state carries charge: a packet laid into a junction starts with the junction
|
|
117
|
-
itself unformed.
|
|
117
|
+
itself unformed. The grid isn't refined to fit a profile: where it's steeper than the cells
|
|
118
|
+
under it, the start is the profile sampled at the nodes, something else, and every solution
|
|
119
|
+
warns of it with the cells that would resolve it (grade toward it, or put a region boundary
|
|
120
|
+
there).
|
|
118
121
|
For a spectator, the profile's integral is the amount it conserves. Where nothing else sets
|
|
119
122
|
$`\phi`$ at the start, a region beside an electrode starts with the electrode's first reaction at
|
|
120
123
|
equilibrium (the electrode at its open-circuit level); otherwise $`\phi`$ carries over from the
|
|
@@ -275,7 +278,9 @@ Na⁺/K⁺-ATPase between the outside (left) and the cytoplasm (right):
|
|
|
275
278
|
together). Membrane potentials are $`\phi`$ differences between the two solutions, $`\phi_{\mathrm{in}} - \phi_{\mathrm{out}}`$,
|
|
276
279
|
read from `sol.phi` (or a `'phi'` probe in a transient). A bath contact's terminal voltage is
|
|
277
280
|
its reference species' level instead, what an electrode reversible to that species would read,
|
|
278
|
-
so between two different solutions it differs from $`\Delta\phi`$ by that species' Nernst term
|
|
281
|
+
so between two different solutions it differs from $`\Delta\phi`$ by that species' Nernst term;
|
|
282
|
+
a bath given no reference has its $`\phi`$ as its terminal voltage, and between two of those the
|
|
283
|
+
terminals read $`\Delta\phi`$ itself.
|
|
279
284
|
|
|
280
285
|
### Voltage-gated channels
|
|
281
286
|
|
|
@@ -329,7 +334,12 @@ Two things differ from the textbook equations. The currents are GHK's, which rec
|
|
|
329
334
|
conductance depends on the voltage, so a permeability matches a conductance $`g`$ at one voltage
|
|
330
335
|
only (above, the chord conductances at rest, −65 mV, for Hodgkin and Huxley's 120, 36 and 0.3
|
|
331
336
|
mS/cm²; matched at the reversal potentials instead, the rest depolarises itself and the axon
|
|
332
|
-
fires on its own).
|
|
337
|
+
fires on its own). Their own linear channels are conductance links: $`G\,(V_{i,L} - V_{i,R})`$
|
|
338
|
+
toward +x is $`g\,(E_i - V)`$, with $`E_i`$ the Nernst potential at the edge concentrations, so
|
|
339
|
+
`{ type: 'conductance', G: 360, gates: { n: 4 } }` is their K⁺ channel exactly
|
|
340
|
+
(`hodgkinHuxley({ T, linear: true })` writes all three). Between two baths whose terminal
|
|
341
|
+
voltage is their $`\phi`$, a held step is their voltage clamp, and the K⁺ current at its end is
|
|
342
|
+
$`g_K n_\infty^4 (V - E_K)`$ to 2e-3. And a cell without a pump has no resting steady state: `solve()` finds its
|
|
333
343
|
Donnan equilibrium, every permeant ion level across the membrane, which the real cell reaches
|
|
334
344
|
only over hours. Start a transient from the concentrations given (it settles to rest within
|
|
335
345
|
milliseconds), or keep the gradients with the Na⁺/K⁺ pump on the same face. Started from the
|
|
@@ -447,13 +457,22 @@ contacts: {
|
|
|
447
457
|
at $`V + \mathtt{offset}`$, $`J = G \cdot (V_{\mathrm{out}} - V_i)`$, G in S/m².
|
|
448
458
|
- `{ type: 'exchange', k, mu }` (neutral species):
|
|
449
459
|
$`N_{\mathrm{in}} = k \cdot (\mu_{\mathrm{out}} - \mu)/RT`$, k in mol/(m²·s).
|
|
460
|
+
- `{ type: 'velocity', v, offset }` (or `mu`, for a neutral species): a surface velocity,
|
|
461
|
+
$`N_{\mathrm{in}} = v\,(c_{\mathrm{eq}} - c)`$ with v in m/s and $`c_{\mathrm{eq}}`$ the end node's
|
|
462
|
+
concentration in equilibrium with the outside level, i.e.
|
|
463
|
+
$`v\,c\,(e^{(\bar\mu_{\mathrm{out}} - \bar\mu)/RT} - 1)`$, which keeps the flux's sign that of the
|
|
464
|
+
level difference whatever the statistics. It lies between `'blocked'` (v → 0) and
|
|
465
|
+
`'equilibrium'` (v → ∞): a contact's surface recombination velocity, or thermionic emission
|
|
466
|
+
over a Schottky barrier (below).
|
|
450
467
|
- `'blocked'`: no flux.
|
|
451
468
|
|
|
452
469
|
**`bath`** (instead of `species` and `phi`): the outside phase is a neutral composition `c`
|
|
453
470
|
held in place by a charged `reference` species (as for a reversible reference electrode, e.g.
|
|
454
471
|
Cl⁻ for Ag/AgCl), which is the terminal. Every bath species is in equilibrium at the level its
|
|
455
472
|
composition implies, and the $`\phi`$ law is `'bulk'`. An optional `offset` places the reference
|
|
456
|
-
species relative to V.
|
|
473
|
+
species relative to V. Without a `reference`, V is the bath's own $`\phi`$: an ideal salt bridge
|
|
474
|
+
(no junction potential), the convention by which membrane potentials are $`\phi`$ differences.
|
|
475
|
+
Between two such baths, a held $`V_{\mathrm{right}} - V_{\mathrm{left}}`$ is a voltage clamp.
|
|
457
476
|
|
|
458
477
|
**`phi`**, required whenever any species or reaction connects at the contact (default
|
|
459
478
|
`'neutral'`):
|
|
@@ -471,6 +490,18 @@ species relative to V.
|
|
|
471
490
|
means. For example, a Schottky barrier $`\phi_B`$ on n-type material with
|
|
472
491
|
$`\mu^\circ_{\mathrm{e}^-} = 0`$ is `zeroCharge: φ_B`.
|
|
473
492
|
|
|
493
|
+
A Schottky contact is that pinned barrier with its carriers passing at their emission velocities:
|
|
494
|
+
`{ V, terminal: 'e-', species: { 'e-': { type: 'velocity', v }, 'h+': { type: 'velocity', v: vp, offset: 0 } }, phi: 'pinned', zeroCharge: φ_B }`,
|
|
495
|
+
with Bethe's thermionic-emission velocity $`v = A^* T^2/(F N_c)`$ ($`N_c`$ in mol/m³, the data
|
|
496
|
+
library's `cRef` for e⁻; about $`2 \times 10^4`$ m/s in n-Si with $`A^*`$ = 112 A/(cm²K²)). The
|
|
497
|
+
forward current is then thermionic emission's, $`J = A^* T^2 e^{-\phi_B/V_T}(e^{V/V_T} - 1)`$,
|
|
498
|
+
lowered where the drift–diffusion through the depletion region can't keep up (Crowell and Sze's
|
|
499
|
+
combination): 4–6% short of it for a 0.85 eV barrier on 1e16 cm⁻³ n-Si from 0.1 to 0.4 V
|
|
500
|
+
([`contacts`](../test/contacts.test.js) test). With `'equilibrium'` links instead (an infinite
|
|
501
|
+
velocity) the barrier passes whatever the semiconductor brings to it, which is the diffusion
|
|
502
|
+
theory of the Schottky diode: there, 17 to 27 times more current. Neither has image-force
|
|
503
|
+
lowering or tunnelling.
|
|
504
|
+
|
|
474
505
|
Like every alignment, `zeroCharge` is a property of that interface. To estimate it from vacuum
|
|
475
506
|
levels, `vacuumZeroCharge(def, W, inside)` from `driftlet/kit` takes the work function W of the
|
|
476
507
|
conductor at the terminal voltage and the inside material's anchor and offset (see the
|
|
@@ -688,22 +719,22 @@ its window, each gate is a fraction open with Hodgkin–Huxley kinetics in the v
|
|
|
688
719
|
port's capacitance there, $`V_m = \phi - (V - \mathtt{zeroCharge})`$, and its conductance links name
|
|
689
720
|
the gates that scale them (`G × m³h`). That's a membrane all along a region, between it and an
|
|
690
721
|
outside held by the port: an axon's, with x running along the axon. Per volume of axoplasm, a
|
|
691
|
-
cylinder of radius a has $`2/a`$ of membrane (`area`)
|
|
692
|
-
V is the outside's $`\phi
|
|
693
|
-
$`(\mu^\circ + RT\ln(c_{out}/c_{\mathrm{ref}}))/(zF)
|
|
694
|
-
|
|
695
|
-
|
|
722
|
+
cylinder of radius a has $`2/a`$ of membrane (`area`). Give the port the outside's composition as a
|
|
723
|
+
`bath`: its V is then the outside's $`\phi`$ (held at 0, with `zeroCharge: 0`), and each linked ion's
|
|
724
|
+
level there follows from the composition, $`(\mu^\circ + RT\ln(c_{out}/c_{\mathrm{ref}}))/(zF)`$ against
|
|
725
|
+
it, as an `offset` would give it. (Only the linked ions' levels are taken, so the bath needn't list
|
|
726
|
+
or balance the rest.) A conductance link's current is then $`G\,(V_{i,out} - V_i)`$, which is
|
|
727
|
+
$`g\,a_m (E_i - V_m)`$: Hodgkin and Huxley's linear channel, with $`E_i`$ the Nernst potential at the
|
|
728
|
+
inside's concentration there. The kit's `hodgkinHuxley({ T, area })` writes their links so:
|
|
696
729
|
|
|
697
730
|
```js nocheck
|
|
731
|
+
const hh = hodgkinHuxley({ T, area: 2 / 238e-6 }); // a squid giant axon, radius 238 µm
|
|
698
732
|
ports: [{
|
|
699
|
-
name: 'membrane', region: 'axon', V: 0,
|
|
733
|
+
name: 'membrane', region: 'axon', V: 0, area: 2 / 238e-6,
|
|
700
734
|
capacitance: { C: 0.01, zeroCharge: 0 },
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
'K+': { type: 'conductance', G: 360 * 2 / 238e-6, offset: offsetK, gates: { n: 4 } },
|
|
705
|
-
'Cl-': { type: 'conductance', G: 3 * 2 / 238e-6, offset: offsetCl }, // the leak
|
|
706
|
-
},
|
|
735
|
+
bath: { c: { 'Na+': 367, 'K+': 18.6, 'Cl-': 459 } }, // sea water, as far as the channels go
|
|
736
|
+
gates: hh.gates,
|
|
737
|
+
species: hh.species, // Na⁺ (G × m³h), K⁺ (G × n⁴), and the leak (Cl⁻), G = g × area
|
|
707
738
|
}]
|
|
708
739
|
```
|
|
709
740
|
|
|
@@ -841,12 +872,14 @@ const now = dev.solution(); // snapshot of the current state
|
|
|
841
872
|
- `solve()` finds the steady state from the current state without advancing time. If every
|
|
842
873
|
species is fed by a contact, it solves the steady equations directly. Otherwise conserved
|
|
843
874
|
amounts (blocked species, reactive moieties) are kept exactly. If a direct solve fails at a
|
|
844
|
-
bias
|
|
845
|
-
|
|
846
|
-
rates up from nearly nothing. A terminal driven by a current (open circuit,
|
|
847
|
-
voltage instead, the voltage marched until the current crosses its target,
|
|
848
|
-
there. If 20 V either way brings no crossing (a current beyond the limiting
|
|
849
|
-
|
|
875
|
+
bias, it ramps the contacts' voltages from where they were last solved (the left one first,
|
|
876
|
+
where it moved), or from level terminals on a cold start; with generation reactions (below),
|
|
877
|
+
it ramps their rates up from nearly nothing. A terminal driven by a current (open circuit,
|
|
878
|
+
say) is held at a voltage instead, the voltage marched until the current crosses its target,
|
|
879
|
+
and floated from there. If 20 V either way brings no crossing (a current beyond the limiting
|
|
880
|
+
one, or a device that only stores what comes in, which has no steady state at a current), the
|
|
881
|
+
solve fails with a warning giving the range of currents the held voltages passed. A solve that
|
|
882
|
+
fails reports the state it failed in, then leaves the device as it was before it.
|
|
850
883
|
- `step(dt, { method })` advances the transient by dt seconds, halving internally where Newton
|
|
851
884
|
needs it. `method` is `'be'` (backward Euler, the default) or `'bdf2'`.
|
|
852
885
|
- `advance(tEnd, opts)` integrates adaptively to `tEnd` with variable-step BDF2, controlling
|
|
@@ -920,17 +953,19 @@ console.log(`${run.steps} steps; I(0.01 s) ≈ ${run.trace.current[run.trace.t.f
|
|
|
920
953
|
| `phi` | bookkeeping $`\phi`$, V (`NaN` where undefined) |
|
|
921
954
|
| `c[name]`, `mu[name]`, `muStd[name]` | concentration, $`\bar\mu`$, standard level $`\mu^\circ + zF\phi`$ (`NaN` where absent) |
|
|
922
955
|
| `V[name]`, `Vstd[name]` | species voltage $`\bar\mu/(zF)`$ and standard level as a voltage (charged species) |
|
|
956
|
+
| `flux[name]` | flux toward +x across each segment, between nodes `g` and `g + 1` (a face's across its pair of nodes), mol/(m²·s) (mol/s through a cross-section): the fluxes the balances add up |
|
|
957
|
+
| `D[name]` | diffusivity at each node, m²/s (`NaN` where absent, or in a metal) |
|
|
923
958
|
| `current`, `terminalVoltage` | current toward +x through the device (A/m², or A through a [cross-section](#geometry)) and $`V_{\mathrm{right}} - V_{\mathrm{left}}`$ |
|
|
924
959
|
| `terminals[name]` | `{ V, current }` for each terminal (contacts and ports), current into the device |
|
|
925
|
-
| `contacts.left/right` | `{ V, flux: {name}, D, current }` at each contact |
|
|
960
|
+
| `contacts.left/right` | `{ V, flux: {name}, D, current, links: {name} }` at each contact; `links` names how each species that crosses it does (`'equilibrium'`, `'velocity'`, …) |
|
|
926
961
|
| `gates.left/right` | charge on a gate or Stern plate, where the contact is capacitive |
|
|
927
962
|
| `ports[k]` | `{ name, V, flux: {name}, current }`: what each internal port brings into the device; an electrode's rates, coverages and charge [as well](#what-a-solution-reports) |
|
|
928
|
-
| `interfaces[f]` | `{ left, right, dipole, sheetCharge, D, N: {name}, rates }`: the names of the regions the face joins, what crosses it by its links,
|
|
929
|
-
| `bulkReactions[k]` | `{ rate, regions, total }`: each bulk reaction's forward rate at every node (mol/(m³·s), `NaN` where it doesn't run), and integrated over each region and the device (mol/(m²·s)), as the balances count it: a charge-balance check is J = F(generation − recombination), which the kit's `check()` does for every species |
|
|
963
|
+
| `interfaces[f]` | `{ left, right, dipole, sheetCharge, D, N: {name}, rates, links: {name} }`: the names of the regions the face joins, what crosses it by its links, each face reaction's rate (mol/(m²·s)), and how each species that crosses it does; for those crossing by permeability, `oneWay: { name: [toward +x, toward −x] }`, the one-way fluxes whose difference is `N` (Ussing's unidirectional fluxes) |
|
|
964
|
+
| `bulkReactions[k]` | `{ rate, forward, nu, regions, total }`: each bulk reaction's net forward rate at every node (mol/(m³·s), `NaN` where it doesn't run), its one-way forward rate (the backward is `forward − rate`), what one forward reaction makes of each species (`nu`, negative for what it consumes), and integrated over each region and the device (mol/(m²·s)), as the balances count it: a charge-balance check is J = F(generation − recombination), which the kit's `check()` does for every species |
|
|
930
965
|
| `charge` | total charge in the device, C/m² (C through a cross-section) |
|
|
931
966
|
| `conservation` | per species stretch: amount, reference, intake through contacts, drift |
|
|
932
967
|
| `warnings` | e.g. unresolved double layers, conventions a statistics model relies on, and for a failed solve, where the system is nearly singular |
|
|
933
|
-
| `converged`, `iterations`, `steps`, `substeps`, `history`, `time` | solver bookkeeping |
|
|
968
|
+
| `converged`, `iterations`, `steps`, `substeps`, `history`, `time`, `T` | solver bookkeeping, and the temperature |
|
|
934
969
|
| `steady` | whether this is a converged steady state (from `solve()`), not a transient's: what `check()` in the kit decides its checks by |
|
|
935
970
|
| `done`, `rejected`, `trace` | from `advance()`: whether `tEnd` was reached; rejected steps; `{ t, current, voltage }` per accepted step |
|
|
936
971
|
|
package/docs/kit.md
CHANGED
|
@@ -57,8 +57,12 @@ console.log(`I = ${sol.current.toFixed(1)} A/m²`);
|
|
|
57
57
|
- **Contacts** are the first and last items. `ohmic(drive, carriers)` holds each carrier in
|
|
58
58
|
equilibrium with a metal at the terminal voltage (default `['e-', 'h+']`, an
|
|
59
59
|
infinite-recombination contact; `['e-']` alone is selective, and is the current collector on
|
|
60
|
-
a metal region). `bath(c, reference, drive, { offset })` is a bath
|
|
61
|
-
|
|
60
|
+
a metal region). `bath(c, reference, drive, { offset })` is a bath whose terminal voltage is
|
|
61
|
+
the level of its `reference` species, as an electrode reversible to it would read (`offset`
|
|
62
|
+
places that species relative to the terminal voltage, e.g. to read a solution's potentials
|
|
63
|
+
against SHE). `bath(c, drive)`, without a reference, is a bath whose terminal voltage is its
|
|
64
|
+
φ: an ideal salt bridge, the convention of membrane potentials, so that between two such baths
|
|
65
|
+
V_right − V_left is the φ difference a voltage clamp sets. A drive is a voltage, a waveform, or
|
|
62
66
|
`{ V }`, `{ I }`, `{ V, R }`.
|
|
63
67
|
- **`library`** takes pieces with `species` and `materials`, merged with any given directly
|
|
64
68
|
(`combine()` does the merging on its own). A species or material given twice must be given
|
|
@@ -144,7 +148,7 @@ which is the transport the full solve accounts for.
|
|
|
144
148
|
|
|
145
149
|
## Channels
|
|
146
150
|
|
|
147
|
-
**`hodgkinHuxley({ inside, outside, T, g, leak, leakZ, at, names })`**: Hodgkin and Huxley's
|
|
151
|
+
**`hodgkinHuxley({ inside, outside, T, g, leak, leakZ, at, names, linear, area })`**: Hodgkin and Huxley's
|
|
148
152
|
squid-axon channels for a [membrane face](device.md#voltage-gated-channels) with the outside on its
|
|
149
153
|
left: `{ gates, species }`, the face's `gates` (m, h and n, their 1952 rates at 6.3 °C scaled to
|
|
150
154
|
`T` by Q₁₀ = 3) and links for Na⁺ (P·m³h), K⁺ (P·n⁴) and the leak (one ion, `leak`, of charge
|
|
@@ -152,6 +156,13 @@ left: `{ gates, species }`, the face's `gates` (m, h and n, their 1952 rates at
|
|
|
152
156
|
whose chord conductance at `at` (−65 mV) is HH's `g` (120, 36 and 0.3 mS/cm²) at the
|
|
153
157
|
concentrations given. Spread it into the face beside its $`\phi`$ law, adding the other species'
|
|
154
158
|
links: `{ phi: { type: 'capacitive', C: 0.01 }, gates: hh.gates, species: { ...hh.species, 'A-': 'blocked' } }`.
|
|
159
|
+
With `linear: true` (and no concentrations) the face gets HH's own linear channels instead:
|
|
160
|
+
conductance links, `G` = g, gated the same, whose currents are g(V − E) with E each ion's Nernst
|
|
161
|
+
level at the concentrations either side; between two `bath`s without a reference species, that's
|
|
162
|
+
their voltage clamp. For a [membrane port](device.md#a-membrane-through-a-window-gated-channels) along a region (an axon
|
|
163
|
+
along x), give `area`, the membrane per volume (2/a for radius a), in place of `inside`, `outside`
|
|
164
|
+
and `at`: the links are then their linear conductances, `G` = g × area, gated the same, each ion's
|
|
165
|
+
reversal potential following from the port's `bath` and the concentrations inside.
|
|
155
166
|
`ghkCurrent(z, inside, outside, V, T)` is the GHK current (outward, A/m²) at unit permeability.
|
|
156
167
|
|
|
157
168
|
## Sources
|
|
@@ -421,7 +432,8 @@ page can show that its numbers hold up. Pass the solution `solve()` or `advance(
|
|
|
421
432
|
region's charge must agree to `tol` (relative; default 1e-2, about what a plot shows; a
|
|
422
433
|
benchmark wants 1e-3 or less). The discretisation is second order, so the change estimates
|
|
423
434
|
this grid's own error (about ¾ of it). It costs one more solve, so run it once, not on every
|
|
424
|
-
slider move.
|
|
435
|
+
slider move. In a transient it's `?`, not checked: the answer there depends on the whole run
|
|
436
|
+
(and on drives set along the way), so run it again yourself on a grid twice as fine.
|
|
425
437
|
|
|
426
438
|
It returns `{ ok, items, text }`: `ok` when nothing failed, an item per check
|
|
427
439
|
(`{ name, ok, summary, details }`, with `ok: null` for a prompt to look), and `text`, a line
|
|
@@ -497,6 +509,61 @@ const { solution, info } = await dev.set({ contacts: { right: { V: 0.5 } } });
|
|
|
497
509
|
console.log(`I(0.5 V) = ${solution.current.toFixed(1)} A/m², in ${info.ms.toFixed(1)} ms`);
|
|
498
510
|
```
|
|
499
511
|
|
|
512
|
+
## Particles
|
|
513
|
+
|
|
514
|
+
`particles(sol, opts)` draws a solution as dots, each a fixed amount of one species (`weight`,
|
|
515
|
+
mol/m²), hopping between the cells of a display lattice. The hops' one-way rates come from the
|
|
516
|
+
solution, so on average the dots fill each cell as its concentration does and cross each
|
|
517
|
+
boundary, net, at its flux: they're a sample of the solution, not a separate model. Dots are
|
|
518
|
+
made and unmade by the bulk reactions' one-way rates (so in equilibrium generation and
|
|
519
|
+
recombination both go on, in balance) and wherever else the flux diverges (ports, face
|
|
520
|
+
reactions), and enter and leave through the contacts and any metal.
|
|
521
|
+
|
|
522
|
+
- Across a boundary the one-way fluxes have the solution's flux as their difference and
|
|
523
|
+
Scharfetter–Gummel's exchange as their product, which gives a dot in a flat potential the
|
|
524
|
+
diffusivity D. A face crossed by permeability uses its own one-way fluxes (the solution's
|
|
525
|
+
`oneWay`), so the dots crossing each way are Ussing's unidirectional fluxes, as a tracer
|
|
526
|
+
experiment counts them.
|
|
527
|
+
- Concentrations span decades, so one weight can't draw them all. A cell that would hold more
|
|
528
|
+
than `cap` dots is a **sea** instead: drawn as shading, holding no dots, exchanging them with
|
|
529
|
+
its neighbours as a contact's reservoir does. A junction then shows its majority carriers as
|
|
530
|
+
seas and its minority carriers as dots. Crossings between two seas through a membrane are
|
|
531
|
+
`events`.
|
|
532
|
+
- `step(dt)` moves the dots on by dt of the device's time. `update(sol)` takes a new solution;
|
|
533
|
+
with `{ resample: true }` (a jump between steady states) each cell's dots are thinned or added
|
|
534
|
+
to by the change in what it should hold, which keeps them a Poisson sample while moving as few
|
|
535
|
+
as can be. Without it (a transient) they move on at the new rates.
|
|
536
|
+
- The swarm has `dots` (`{ species, cell, x }`), `cells` (`{ x0, x1, region }`), `sea[name]`
|
|
537
|
+
(1 per sea cell), `expected(name)` (dots per cell on average), `events` from the last step
|
|
538
|
+
(`{ species, kind, x, dir }`: `'in'`, `'out'`, `'made'`, `'unmade'`, `'cross'`) and
|
|
539
|
+
`crossed[name]` (`{ up, down }` at each boundary, counts you zero when you like).
|
|
540
|
+
|
|
541
|
+
```js
|
|
542
|
+
import { Device, GAS_CONSTANT } from 'driftlet';
|
|
543
|
+
import { particles } from 'driftlet/kit';
|
|
544
|
+
|
|
545
|
+
// A species diffusing through a gel slab between two baths: c falls from 1 to 0.1 mol/m³.
|
|
546
|
+
const RT = GAS_CONSTANT * 298.15;
|
|
547
|
+
const sol = new Device({
|
|
548
|
+
species: [{ name: 'X', z: 0 }],
|
|
549
|
+
materials: { gel: { epsr: 0, species: { X: { D: 1e-9, mu0: 0, cRef: 1 } } } },
|
|
550
|
+
regions: [{ material: 'gel', length: 1e-4 }],
|
|
551
|
+
contacts: {
|
|
552
|
+
left: { phi: 'neutral', species: { X: { type: 'equilibrium', mu: 0 } } },
|
|
553
|
+
right: { phi: 'neutral', species: { X: { type: 'equilibrium', mu: RT * Math.log(0.1) } } },
|
|
554
|
+
},
|
|
555
|
+
}).solve();
|
|
556
|
+
const swarm = particles(sol, { dots: 300, cells: 20 });
|
|
557
|
+
for (let i = 0; i < 100; i++) swarm.step(0.01); // 1 s of the slab's time
|
|
558
|
+
console.log(`${swarm.dots.length} dots, each ${swarm.weight.X.toExponential(1)} mol/m²`);
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
The dots are a friendly first picture for teaching. Pages that explain driftlet itself lead with
|
|
562
|
+
the fields, so the [pn demo](https://markblundeberg.github.io/driftlet/demos/pn.html) draws its
|
|
563
|
+
carriers this way at the bottom, on the band diagram, and the
|
|
564
|
+
[axon demo](https://markblundeberg.github.io/driftlet/demos/axon.html) the ions crossing its
|
|
565
|
+
membrane in each direction, both sides seas (`cap: 0`).
|
|
566
|
+
|
|
500
567
|
## Alignment from vacuum levels
|
|
501
568
|
|
|
502
569
|
`vacuumLevel`, `vacuumDipole` and `vacuumZeroCharge` turn vacuum-level estimates (electron
|
package/docs/logo-dark.svg
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 269 74" width="269" height="74" role="img" aria-label="driftlet">
|
|
2
2
|
<path d="M4 18 C 34 18, 46 20, 58 34 S 72 54, 80 54" fill="none" stroke="#e8584f" stroke-width="5" stroke-linecap="round"/>
|
|
3
3
|
<path d="M4 34 C 34 34, 46 36, 58 50 S 72 70, 80 70" fill="none" stroke="#e8584f" stroke-width="1.8" stroke-linecap="round" opacity="0.75"/>
|
|
4
4
|
<path d="M44.9 9.7 L38.9 6.1 M41.0 13.4 L32.8 8.5" stroke="#ffb3ab" stroke-width="1.8" stroke-linecap="round" opacity="0.6"/>
|
|
5
5
|
<circle cx="52.2" cy="17.1" r="6.2" fill="#ffb3ab"/>
|
|
6
|
-
|
|
6
|
+
<!-- "driftlet" in Recursive (Sans Casual, weight 700), as outlines -->
|
|
7
|
+
<path fill="#ece6da" d="M107.79 26.72Q109.2 26.72 110.37 27.22Q111.55 27.73 112.45 28.54Q113.34 29.35 113.84 30.31H114.79V34.87Q113.81 33.75 112.66 33.23Q111.5 32.71 109.91 32.71Q108.09 32.71 106.88 33.66Q105.68 34.62 105.09 36.5Q104.5 38.38 104.5 41.12V41.61Q104.5 42.92 104.55 43.82Q104.6 44.73 104.8 45.46Q105.07 45.69 105.35 45.78Q105.63 45.88 105.94 45.88Q107.82 45.88 109.38 45.05Q110.94 44.22 112.24 42.27Q113.54 40.32 114.56 37.08V45.16H113.8Q113.02 47.17 111.67 48.85Q110.33 50.53 108.66 51.54Q106.99 52.54 105.23 52.54Q103.84 52.54 102.55 51.8Q101.25 51.05 100.25 49.73Q99.24 48.41 98.66 46.69Q98.08 44.96 98.08 42.99V42.01Q98.08 37.95 98.9 35.04Q99.72 32.14 101.13 30.3Q102.54 28.46 104.27 27.59Q105.99 26.72 107.79 26.72ZM115.1 17.21Q116.47 17.21 117.66 17.87Q118.85 18.52 119.58 20.14Q120.31 21.76 120.31 24.65Q120.31 27.51 120.31 30.29Q120.31 33.07 120.31 35.8Q120.31 38.53 120.31 41.25Q120.31 43.97 120.31 46.71Q120.31 48.12 120.46 49.37Q120.61 50.62 121.05 51.97Q120.76 52.01 120.47 52.08Q120.18 52.14 119.92 52.2Q119.65 52.26 119.38 52.28Q119.11 52.3 118.78 52.3Q117.09 52.3 116.04 51.33Q114.99 50.36 114.54 48.77Q114.08 47.19 114.08 45.45Q114.08 42.04 114.08 39.14Q114.08 36.24 114.08 33.54Q114.08 30.83 114.08 28.01Q114.08 25.19 114.08 21.94Q114.08 20.72 113.89 19.52Q113.7 18.31 113.22 17.47Q113.47 17.42 113.7 17.38Q113.93 17.34 114.16 17.29Q114.39 17.25 114.62 17.23Q114.85 17.21 115.1 17.21Z M133.34 34.89H133.91Q134.64 32.17 135.54 30.26Q136.45 28.35 137.58 27.36Q138.72 26.37 140.11 26.37Q140.74 26.37 141.2 26.52Q141.66 26.66 142.05 27.05Q142.59 27.59 142.87 28.56Q143.16 29.54 143.16 31.32Q143.16 31.78 143.13 32.21Q143.11 32.65 143.07 33.09Q143.03 33.53 142.92 33.93Q142.82 34.33 142.68 34.7H142.41Q141.81 34.31 141.23 34.11Q140.65 33.91 139.81 33.91Q138.4 33.91 137.28 34.88Q136.17 35.84 135.21 37.9Q134.25 39.95 133.34 43.23ZM133.63 52.03Q133.27 52.07 132.98 52.11Q132.69 52.15 132.43 52.17Q132.16 52.19 131.83 52.19Q130.56 52.19 129.71 51.93Q128.85 51.67 128.34 51.16Q127.84 50.65 127.62 49.95Q127.4 49.26 127.4 48.38Q127.4 46.53 127.4 44.79Q127.4 43.05 127.4 41.37Q127.4 39.69 127.4 38.09Q127.4 36.49 127.4 34.89Q127.4 33.29 127.4 31.71Q127.4 30.49 127.21 29.28Q127.02 28.08 126.54 27.23Q126.88 27.15 127.19 27.11Q127.5 27.06 127.81 27.02Q128.13 26.98 128.42 26.98Q129.91 26.98 131.1 27.64Q132.29 28.3 132.96 29.92Q133.63 31.54 133.63 34.42Q133.63 36.23 133.63 38.09Q133.63 39.95 133.63 41.78Q133.63 43.6 133.63 45.37Q133.63 47.13 133.63 48.82Q133.63 50.5 133.63 52.03Z M150.21 46.91Q150.21 45.77 150.21 44.47Q150.21 43.17 150.21 41.8Q150.21 40.42 150.21 39.01Q150.21 37.6 150.21 36.22Q150.21 34.84 150.21 33.54L149.94 33.52Q149.74 33.66 149.51 33.8Q149.27 33.94 149.03 34.01Q148.8 34.09 148.52 34.14Q148.23 34.19 147.9 34.19Q146.88 34.19 146.31 33.22Q145.74 32.26 145.74 30.36Q145.74 29.54 145.85 28.73Q145.95 27.91 146.11 27.25Q146.59 27.16 147.03 27.09Q147.47 27.02 147.93 26.97Q148.38 26.93 148.85 26.88Q149.32 26.84 149.8 26.82Q150.28 26.79 150.78 26.79Q152.4 26.79 153.69 27.22Q154.98 27.65 155.71 28.54Q156.43 29.44 156.43 30.88Q156.43 32.63 156.43 34.54Q156.43 36.44 156.43 38.37Q156.43 40.3 156.43 42.17Q156.43 44.03 156.43 45.71Q156.43 46.92 156.5 47.86Q156.56 48.81 156.76 49.76Q156.96 50.72 157.31 52Q156.7 52.12 156.14 52.19Q155.59 52.25 154.93 52.25Q152.3 52.25 151.25 51.12Q150.21 49.98 150.21 46.91ZM148.77 17.37Q149.14 17.2 149.64 17.08Q150.13 16.96 150.67 16.86Q151.2 16.76 151.78 16.72Q152.36 16.68 152.9 16.68Q154.91 16.68 156.19 17.35Q157.48 18.02 157.48 19.74V22.92Q157.1 23.09 156.67 23.21Q156.23 23.33 155.76 23.43Q155.28 23.53 154.8 23.57Q154.32 23.61 153.82 23.61Q151.62 23.61 150.2 22.6Q148.77 21.6 148.77 19.92Z M160.64 27.25H172.57Q174.2 27.25 175.1 27.61Q176 27.96 176.38 28.76Q176.77 29.57 176.77 30.94Q176.77 31.62 176.69 32.29Q176.61 32.96 176.49 33.48H166.57Q164.21 33.48 162.91 32.97Q161.62 32.47 161.13 31.29Q160.64 30.11 160.64 28.07Q160.64 27.86 160.64 27.64Q160.64 27.42 160.64 27.25ZM170.59 48.26Q170.59 50.54 169.43 51.48Q168.27 52.42 166.04 52.42Q165.1 52.42 164.51 52.29Q163.93 52.16 163.51 52Q163.86 50.94 164.11 49.73Q164.36 48.53 164.36 47.11Q164.36 44.63 164.36 42.06Q164.36 39.49 164.36 36.92Q164.36 34.35 164.36 31.79Q164.36 29.22 164.36 26.73Q164.36 24.57 164.97 22.74Q165.59 20.91 166.76 19.56Q167.94 18.2 169.65 17.43Q171.37 16.66 173.57 16.66Q174.52 16.66 175.15 16.81Q175.79 16.95 176.2 17.21Q176.62 17.46 176.93 17.77Q177.51 18.31 177.72 19.19Q177.94 20.07 177.94 21.1Q177.94 21.64 177.88 22.24Q177.82 22.85 177.65 23.38H177.38Q176.92 23.16 176.23 22.98Q175.55 22.8 174.68 22.69Q173.81 22.57 172.78 22.57Q172.1 22.57 171.43 22.7Q170.76 22.83 170.07 23.04Q169.99 23.91 170.19 24.93Q170.39 25.96 170.59 26.97Q170.59 28.26 170.59 30.36Q170.59 32.47 170.59 34.97Q170.59 37.48 170.59 40Q170.59 42.52 170.59 44.69Q170.59 46.85 170.59 48.26Z M178.97 27.25H195.3Q197.05 27.25 197.69 28.06Q198.33 28.86 198.33 30.94Q198.33 31.38 198.29 31.84Q198.25 32.31 198.19 32.71Q198.13 33.11 198.06 33.48H185.93Q183.85 33.48 182.48 33.19Q181.11 32.89 180.3 32.27Q179.5 31.64 179.17 30.69Q178.85 29.73 178.85 28.38Q178.85 28.17 178.87 27.97Q178.89 27.76 178.91 27.57Q178.93 27.38 178.97 27.25ZM198.09 44.91Q198.19 45.33 198.23 45.74Q198.27 46.14 198.27 46.54Q198.27 48.08 197.95 49.2Q197.64 50.31 197.06 51.04Q196.74 51.44 196.28 51.74Q195.82 52.04 195.17 52.23Q194.51 52.42 193.69 52.51Q192.87 52.61 191.83 52.61Q190.1 52.61 188.6 52.04Q187.1 51.48 185.99 50.42Q184.87 49.36 184.26 47.9Q183.64 46.43 183.64 44.63Q183.64 42.07 183.64 39.51Q183.64 36.95 183.64 34.4Q183.64 31.86 183.64 29.3Q183.64 26.73 183.64 24.21Q183.64 23.1 183.54 22Q183.44 20.9 183.13 19.8Q183.86 19.59 184.57 19.49Q185.28 19.39 185.98 19.39Q187.06 19.39 187.94 19.84Q188.82 20.28 189.34 21.2Q189.87 22.12 189.87 23.55Q189.87 26.11 189.87 28.67Q189.87 31.22 189.87 33.77Q189.87 36.33 189.87 38.88Q189.87 41.43 189.87 44Q189.87 44.55 189.94 45.04Q190.01 45.53 190.16 45.96Q190.7 46.18 191.2 46.28Q191.71 46.38 192.51 46.38Q193.44 46.38 194.35 46.22Q195.26 46.07 196.13 45.74Q197 45.41 197.82 44.91Z M201.2 17.5Q201.73 17.41 202.28 17.32Q202.84 17.24 203.38 17.19Q203.93 17.14 204.43 17.11Q204.94 17.09 205.4 17.06Q205.86 17.04 206.27 17.04Q207.71 17.04 208.68 17.51Q209.64 17.97 210.13 18.87Q210.63 19.77 210.63 21.08Q210.63 23.24 210.63 25.36Q210.63 27.48 210.63 29.59Q210.63 31.69 210.63 33.81Q210.63 35.94 210.63 38.06Q210.63 40.18 210.63 42.34Q210.63 43.45 210.69 44.29Q210.75 45.12 210.95 45.78Q211.21 46 211.54 46.12Q211.88 46.23 212.4 46.23Q213.09 46.23 213.69 45.98Q214.29 45.72 214.74 45.21H215.02Q215.11 45.63 215.15 46.08Q215.19 46.53 215.19 47.24Q215.19 48.23 215.04 49.07Q214.89 49.91 214.63 50.52Q214.37 51.13 214.02 51.49Q213.67 51.85 213.15 52.08Q212.63 52.31 212.02 52.38Q211.42 52.46 210.75 52.46Q208.94 52.46 207.73 51.81Q206.52 51.16 205.78 50.07Q205.04 48.98 204.72 47.65Q204.4 46.33 204.4 44.98Q204.4 42.9 204.4 40.78Q204.4 38.67 204.4 36.52Q204.4 34.36 204.4 32.23Q204.4 30.09 204.4 27.96Q204.4 25.82 204.4 23.75L204.18 23.65Q203.96 23.83 203.65 23.98Q203.34 24.13 203.02 24.18Q202.71 24.24 202.48 24.24Q201.77 24.24 201.32 23.33Q200.87 22.42 200.87 20.17Q200.87 19.46 200.97 18.73Q201.08 18 201.2 17.5Z M230.77 26.56Q233.98 26.56 236.24 27.88Q238.5 29.2 239.72 31.52Q240.94 33.84 240.94 36.85V37.08Q240.94 38.86 240.72 39.77Q240.5 40.68 240.14 40.99Q239.77 41.29 239.31 41.29H229.03Q227.68 41.29 226.58 40.93Q225.49 40.56 224.83 39.95L223.86 40.4L224.07 37.57H234.66Q234.76 37.24 234.79 36.84Q234.83 36.44 234.83 36.13Q234.83 35.04 234.6 34.05Q234.37 33.07 233.78 32.25Q233.21 32.03 232.7 31.95Q232.19 31.87 231.24 31.87Q228.24 31.87 226.4 34.18Q224.56 36.49 224.56 41.22V41.45Q224.56 42.38 224.65 43.17Q224.73 43.96 224.94 44.65Q225.14 45.34 225.39 45.92Q226.51 46.48 227.9 46.73Q229.29 46.98 231.33 46.98Q232.86 46.98 234.28 46.77Q235.7 46.57 237.06 46.11Q238.42 45.65 239.65 44.94H239.92Q240.01 45.35 240.05 45.76Q240.09 46.16 240.09 46.57Q240.09 48.01 239.71 48.97Q239.32 49.93 238.6 50.65Q237.87 51.39 236.71 51.84Q235.56 52.29 234.18 52.49Q232.79 52.7 231.27 52.7Q228.42 52.7 226.04 51.81Q223.67 50.93 221.95 49.3Q220.23 47.67 219.28 45.35Q218.33 43.03 218.33 40.15V39.91Q218.33 36.96 219.25 34.53Q220.17 32.1 221.84 30.31Q223.51 28.52 225.79 27.54Q228.08 26.56 230.77 26.56Z M243.71 27.25H260.04Q261.79 27.25 262.43 28.06Q263.07 28.86 263.07 30.94Q263.07 31.38 263.03 31.84Q262.99 32.31 262.93 32.71Q262.87 33.11 262.8 33.48H250.67Q248.59 33.48 247.22 33.19Q245.85 32.89 245.04 32.27Q244.24 31.64 243.91 30.69Q243.59 29.73 243.59 28.38Q243.59 28.17 243.61 27.97Q243.63 27.76 243.65 27.57Q243.67 27.38 243.71 27.25ZM262.83 44.91Q262.93 45.33 262.97 45.74Q263.01 46.14 263.01 46.54Q263.01 48.08 262.69 49.2Q262.38 50.31 261.8 51.04Q261.48 51.44 261.02 51.74Q260.56 52.04 259.91 52.23Q259.25 52.42 258.43 52.51Q257.61 52.61 256.57 52.61Q254.84 52.61 253.34 52.04Q251.84 51.48 250.73 50.42Q249.61 49.36 249 47.9Q248.38 46.43 248.38 44.63Q248.38 42.07 248.38 39.51Q248.38 36.95 248.38 34.4Q248.38 31.86 248.38 29.3Q248.38 26.73 248.38 24.21Q248.38 23.1 248.28 22Q248.18 20.9 247.87 19.8Q248.6 19.59 249.31 19.49Q250.02 19.39 250.72 19.39Q251.8 19.39 252.68 19.84Q253.56 20.28 254.08 21.2Q254.61 22.12 254.61 23.55Q254.61 26.11 254.61 28.67Q254.61 31.22 254.61 33.77Q254.61 36.33 254.61 38.88Q254.61 41.43 254.61 44Q254.61 44.55 254.68 45.04Q254.75 45.53 254.9 45.96Q255.44 46.18 255.94 46.28Q256.45 46.38 257.25 46.38Q258.18 46.38 259.09 46.22Q260 46.07 260.87 45.74Q261.74 45.41 262.56 44.91Z"/>
|
|
7
8
|
</svg>
|
package/docs/logo.svg
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 269 74" width="269" height="74" role="img" aria-label="driftlet">
|
|
2
2
|
<path d="M4 18 C 34 18, 46 20, 58 34 S 72 54, 80 54" fill="none" stroke="#d1362f" stroke-width="5" stroke-linecap="round"/>
|
|
3
3
|
<path d="M4 34 C 34 34, 46 36, 58 50 S 72 70, 80 70" fill="none" stroke="#d1362f" stroke-width="1.8" stroke-linecap="round" opacity="0.75"/>
|
|
4
4
|
<path d="M44.9 9.7 L38.9 6.1 M41.0 13.4 L32.8 8.5" stroke="#8a1d18" stroke-width="1.8" stroke-linecap="round" opacity="0.6"/>
|
|
5
5
|
<circle cx="52.2" cy="17.1" r="6.2" fill="#8a1d18"/>
|
|
6
|
-
|
|
6
|
+
<!-- "driftlet" in Recursive (Sans Casual, weight 700), as outlines -->
|
|
7
|
+
<path fill="#1d2330" d="M107.79 26.72Q109.2 26.72 110.37 27.22Q111.55 27.73 112.45 28.54Q113.34 29.35 113.84 30.31H114.79V34.87Q113.81 33.75 112.66 33.23Q111.5 32.71 109.91 32.71Q108.09 32.71 106.88 33.66Q105.68 34.62 105.09 36.5Q104.5 38.38 104.5 41.12V41.61Q104.5 42.92 104.55 43.82Q104.6 44.73 104.8 45.46Q105.07 45.69 105.35 45.78Q105.63 45.88 105.94 45.88Q107.82 45.88 109.38 45.05Q110.94 44.22 112.24 42.27Q113.54 40.32 114.56 37.08V45.16H113.8Q113.02 47.17 111.67 48.85Q110.33 50.53 108.66 51.54Q106.99 52.54 105.23 52.54Q103.84 52.54 102.55 51.8Q101.25 51.05 100.25 49.73Q99.24 48.41 98.66 46.69Q98.08 44.96 98.08 42.99V42.01Q98.08 37.95 98.9 35.04Q99.72 32.14 101.13 30.3Q102.54 28.46 104.27 27.59Q105.99 26.72 107.79 26.72ZM115.1 17.21Q116.47 17.21 117.66 17.87Q118.85 18.52 119.58 20.14Q120.31 21.76 120.31 24.65Q120.31 27.51 120.31 30.29Q120.31 33.07 120.31 35.8Q120.31 38.53 120.31 41.25Q120.31 43.97 120.31 46.71Q120.31 48.12 120.46 49.37Q120.61 50.62 121.05 51.97Q120.76 52.01 120.47 52.08Q120.18 52.14 119.92 52.2Q119.65 52.26 119.38 52.28Q119.11 52.3 118.78 52.3Q117.09 52.3 116.04 51.33Q114.99 50.36 114.54 48.77Q114.08 47.19 114.08 45.45Q114.08 42.04 114.08 39.14Q114.08 36.24 114.08 33.54Q114.08 30.83 114.08 28.01Q114.08 25.19 114.08 21.94Q114.08 20.72 113.89 19.52Q113.7 18.31 113.22 17.47Q113.47 17.42 113.7 17.38Q113.93 17.34 114.16 17.29Q114.39 17.25 114.62 17.23Q114.85 17.21 115.1 17.21Z M133.34 34.89H133.91Q134.64 32.17 135.54 30.26Q136.45 28.35 137.58 27.36Q138.72 26.37 140.11 26.37Q140.74 26.37 141.2 26.52Q141.66 26.66 142.05 27.05Q142.59 27.59 142.87 28.56Q143.16 29.54 143.16 31.32Q143.16 31.78 143.13 32.21Q143.11 32.65 143.07 33.09Q143.03 33.53 142.92 33.93Q142.82 34.33 142.68 34.7H142.41Q141.81 34.31 141.23 34.11Q140.65 33.91 139.81 33.91Q138.4 33.91 137.28 34.88Q136.17 35.84 135.21 37.9Q134.25 39.95 133.34 43.23ZM133.63 52.03Q133.27 52.07 132.98 52.11Q132.69 52.15 132.43 52.17Q132.16 52.19 131.83 52.19Q130.56 52.19 129.71 51.93Q128.85 51.67 128.34 51.16Q127.84 50.65 127.62 49.95Q127.4 49.26 127.4 48.38Q127.4 46.53 127.4 44.79Q127.4 43.05 127.4 41.37Q127.4 39.69 127.4 38.09Q127.4 36.49 127.4 34.89Q127.4 33.29 127.4 31.71Q127.4 30.49 127.21 29.28Q127.02 28.08 126.54 27.23Q126.88 27.15 127.19 27.11Q127.5 27.06 127.81 27.02Q128.13 26.98 128.42 26.98Q129.91 26.98 131.1 27.64Q132.29 28.3 132.96 29.92Q133.63 31.54 133.63 34.42Q133.63 36.23 133.63 38.09Q133.63 39.95 133.63 41.78Q133.63 43.6 133.63 45.37Q133.63 47.13 133.63 48.82Q133.63 50.5 133.63 52.03Z M150.21 46.91Q150.21 45.77 150.21 44.47Q150.21 43.17 150.21 41.8Q150.21 40.42 150.21 39.01Q150.21 37.6 150.21 36.22Q150.21 34.84 150.21 33.54L149.94 33.52Q149.74 33.66 149.51 33.8Q149.27 33.94 149.03 34.01Q148.8 34.09 148.52 34.14Q148.23 34.19 147.9 34.19Q146.88 34.19 146.31 33.22Q145.74 32.26 145.74 30.36Q145.74 29.54 145.85 28.73Q145.95 27.91 146.11 27.25Q146.59 27.16 147.03 27.09Q147.47 27.02 147.93 26.97Q148.38 26.93 148.85 26.88Q149.32 26.84 149.8 26.82Q150.28 26.79 150.78 26.79Q152.4 26.79 153.69 27.22Q154.98 27.65 155.71 28.54Q156.43 29.44 156.43 30.88Q156.43 32.63 156.43 34.54Q156.43 36.44 156.43 38.37Q156.43 40.3 156.43 42.17Q156.43 44.03 156.43 45.71Q156.43 46.92 156.5 47.86Q156.56 48.81 156.76 49.76Q156.96 50.72 157.31 52Q156.7 52.12 156.14 52.19Q155.59 52.25 154.93 52.25Q152.3 52.25 151.25 51.12Q150.21 49.98 150.21 46.91ZM148.77 17.37Q149.14 17.2 149.64 17.08Q150.13 16.96 150.67 16.86Q151.2 16.76 151.78 16.72Q152.36 16.68 152.9 16.68Q154.91 16.68 156.19 17.35Q157.48 18.02 157.48 19.74V22.92Q157.1 23.09 156.67 23.21Q156.23 23.33 155.76 23.43Q155.28 23.53 154.8 23.57Q154.32 23.61 153.82 23.61Q151.62 23.61 150.2 22.6Q148.77 21.6 148.77 19.92Z M160.64 27.25H172.57Q174.2 27.25 175.1 27.61Q176 27.96 176.38 28.76Q176.77 29.57 176.77 30.94Q176.77 31.62 176.69 32.29Q176.61 32.96 176.49 33.48H166.57Q164.21 33.48 162.91 32.97Q161.62 32.47 161.13 31.29Q160.64 30.11 160.64 28.07Q160.64 27.86 160.64 27.64Q160.64 27.42 160.64 27.25ZM170.59 48.26Q170.59 50.54 169.43 51.48Q168.27 52.42 166.04 52.42Q165.1 52.42 164.51 52.29Q163.93 52.16 163.51 52Q163.86 50.94 164.11 49.73Q164.36 48.53 164.36 47.11Q164.36 44.63 164.36 42.06Q164.36 39.49 164.36 36.92Q164.36 34.35 164.36 31.79Q164.36 29.22 164.36 26.73Q164.36 24.57 164.97 22.74Q165.59 20.91 166.76 19.56Q167.94 18.2 169.65 17.43Q171.37 16.66 173.57 16.66Q174.52 16.66 175.15 16.81Q175.79 16.95 176.2 17.21Q176.62 17.46 176.93 17.77Q177.51 18.31 177.72 19.19Q177.94 20.07 177.94 21.1Q177.94 21.64 177.88 22.24Q177.82 22.85 177.65 23.38H177.38Q176.92 23.16 176.23 22.98Q175.55 22.8 174.68 22.69Q173.81 22.57 172.78 22.57Q172.1 22.57 171.43 22.7Q170.76 22.83 170.07 23.04Q169.99 23.91 170.19 24.93Q170.39 25.96 170.59 26.97Q170.59 28.26 170.59 30.36Q170.59 32.47 170.59 34.97Q170.59 37.48 170.59 40Q170.59 42.52 170.59 44.69Q170.59 46.85 170.59 48.26Z M178.97 27.25H195.3Q197.05 27.25 197.69 28.06Q198.33 28.86 198.33 30.94Q198.33 31.38 198.29 31.84Q198.25 32.31 198.19 32.71Q198.13 33.11 198.06 33.48H185.93Q183.85 33.48 182.48 33.19Q181.11 32.89 180.3 32.27Q179.5 31.64 179.17 30.69Q178.85 29.73 178.85 28.38Q178.85 28.17 178.87 27.97Q178.89 27.76 178.91 27.57Q178.93 27.38 178.97 27.25ZM198.09 44.91Q198.19 45.33 198.23 45.74Q198.27 46.14 198.27 46.54Q198.27 48.08 197.95 49.2Q197.64 50.31 197.06 51.04Q196.74 51.44 196.28 51.74Q195.82 52.04 195.17 52.23Q194.51 52.42 193.69 52.51Q192.87 52.61 191.83 52.61Q190.1 52.61 188.6 52.04Q187.1 51.48 185.99 50.42Q184.87 49.36 184.26 47.9Q183.64 46.43 183.64 44.63Q183.64 42.07 183.64 39.51Q183.64 36.95 183.64 34.4Q183.64 31.86 183.64 29.3Q183.64 26.73 183.64 24.21Q183.64 23.1 183.54 22Q183.44 20.9 183.13 19.8Q183.86 19.59 184.57 19.49Q185.28 19.39 185.98 19.39Q187.06 19.39 187.94 19.84Q188.82 20.28 189.34 21.2Q189.87 22.12 189.87 23.55Q189.87 26.11 189.87 28.67Q189.87 31.22 189.87 33.77Q189.87 36.33 189.87 38.88Q189.87 41.43 189.87 44Q189.87 44.55 189.94 45.04Q190.01 45.53 190.16 45.96Q190.7 46.18 191.2 46.28Q191.71 46.38 192.51 46.38Q193.44 46.38 194.35 46.22Q195.26 46.07 196.13 45.74Q197 45.41 197.82 44.91Z M201.2 17.5Q201.73 17.41 202.28 17.32Q202.84 17.24 203.38 17.19Q203.93 17.14 204.43 17.11Q204.94 17.09 205.4 17.06Q205.86 17.04 206.27 17.04Q207.71 17.04 208.68 17.51Q209.64 17.97 210.13 18.87Q210.63 19.77 210.63 21.08Q210.63 23.24 210.63 25.36Q210.63 27.48 210.63 29.59Q210.63 31.69 210.63 33.81Q210.63 35.94 210.63 38.06Q210.63 40.18 210.63 42.34Q210.63 43.45 210.69 44.29Q210.75 45.12 210.95 45.78Q211.21 46 211.54 46.12Q211.88 46.23 212.4 46.23Q213.09 46.23 213.69 45.98Q214.29 45.72 214.74 45.21H215.02Q215.11 45.63 215.15 46.08Q215.19 46.53 215.19 47.24Q215.19 48.23 215.04 49.07Q214.89 49.91 214.63 50.52Q214.37 51.13 214.02 51.49Q213.67 51.85 213.15 52.08Q212.63 52.31 212.02 52.38Q211.42 52.46 210.75 52.46Q208.94 52.46 207.73 51.81Q206.52 51.16 205.78 50.07Q205.04 48.98 204.72 47.65Q204.4 46.33 204.4 44.98Q204.4 42.9 204.4 40.78Q204.4 38.67 204.4 36.52Q204.4 34.36 204.4 32.23Q204.4 30.09 204.4 27.96Q204.4 25.82 204.4 23.75L204.18 23.65Q203.96 23.83 203.65 23.98Q203.34 24.13 203.02 24.18Q202.71 24.24 202.48 24.24Q201.77 24.24 201.32 23.33Q200.87 22.42 200.87 20.17Q200.87 19.46 200.97 18.73Q201.08 18 201.2 17.5Z M230.77 26.56Q233.98 26.56 236.24 27.88Q238.5 29.2 239.72 31.52Q240.94 33.84 240.94 36.85V37.08Q240.94 38.86 240.72 39.77Q240.5 40.68 240.14 40.99Q239.77 41.29 239.31 41.29H229.03Q227.68 41.29 226.58 40.93Q225.49 40.56 224.83 39.95L223.86 40.4L224.07 37.57H234.66Q234.76 37.24 234.79 36.84Q234.83 36.44 234.83 36.13Q234.83 35.04 234.6 34.05Q234.37 33.07 233.78 32.25Q233.21 32.03 232.7 31.95Q232.19 31.87 231.24 31.87Q228.24 31.87 226.4 34.18Q224.56 36.49 224.56 41.22V41.45Q224.56 42.38 224.65 43.17Q224.73 43.96 224.94 44.65Q225.14 45.34 225.39 45.92Q226.51 46.48 227.9 46.73Q229.29 46.98 231.33 46.98Q232.86 46.98 234.28 46.77Q235.7 46.57 237.06 46.11Q238.42 45.65 239.65 44.94H239.92Q240.01 45.35 240.05 45.76Q240.09 46.16 240.09 46.57Q240.09 48.01 239.71 48.97Q239.32 49.93 238.6 50.65Q237.87 51.39 236.71 51.84Q235.56 52.29 234.18 52.49Q232.79 52.7 231.27 52.7Q228.42 52.7 226.04 51.81Q223.67 50.93 221.95 49.3Q220.23 47.67 219.28 45.35Q218.33 43.03 218.33 40.15V39.91Q218.33 36.96 219.25 34.53Q220.17 32.1 221.84 30.31Q223.51 28.52 225.79 27.54Q228.08 26.56 230.77 26.56Z M243.71 27.25H260.04Q261.79 27.25 262.43 28.06Q263.07 28.86 263.07 30.94Q263.07 31.38 263.03 31.84Q262.99 32.31 262.93 32.71Q262.87 33.11 262.8 33.48H250.67Q248.59 33.48 247.22 33.19Q245.85 32.89 245.04 32.27Q244.24 31.64 243.91 30.69Q243.59 29.73 243.59 28.38Q243.59 28.17 243.61 27.97Q243.63 27.76 243.65 27.57Q243.67 27.38 243.71 27.25ZM262.83 44.91Q262.93 45.33 262.97 45.74Q263.01 46.14 263.01 46.54Q263.01 48.08 262.69 49.2Q262.38 50.31 261.8 51.04Q261.48 51.44 261.02 51.74Q260.56 52.04 259.91 52.23Q259.25 52.42 258.43 52.51Q257.61 52.61 256.57 52.61Q254.84 52.61 253.34 52.04Q251.84 51.48 250.73 50.42Q249.61 49.36 249 47.9Q248.38 46.43 248.38 44.63Q248.38 42.07 248.38 39.51Q248.38 36.95 248.38 34.4Q248.38 31.86 248.38 29.3Q248.38 26.73 248.38 24.21Q248.38 23.1 248.28 22Q248.18 20.9 247.87 19.8Q248.6 19.59 249.31 19.49Q250.02 19.39 250.72 19.39Q251.8 19.39 252.68 19.84Q253.56 20.28 254.08 21.2Q254.61 22.12 254.61 23.55Q254.61 26.11 254.61 28.67Q254.61 31.22 254.61 33.77Q254.61 36.33 254.61 38.88Q254.61 41.43 254.61 44Q254.61 44.55 254.68 45.04Q254.75 45.53 254.9 45.96Q255.44 46.18 255.94 46.28Q256.45 46.38 257.25 46.38Q258.18 46.38 259.09 46.22Q260 46.07 260.87 45.74Q261.74 45.41 262.56 44.91Z"/>
|
|
7
8
|
</svg>
|