From d7306875aaa268e81921b7e02df1e0edcfa0a482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Wed, 13 Sep 2023 18:58:58 +0200 Subject: [PATCH 01/10] Update dependencies --- .pre-commit-config.yaml | 8 +- poetry.lock | 361 ++++++++++++++++++++-------------------- pyproject.toml | 4 +- 3 files changed, 184 insertions(+), 189 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 80f04937..5914a31b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,11 +17,11 @@ repos: hooks: - id: poetry-check - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.7.0 # keep in sync with pyproject.toml + rev: 23.9.1 # keep in sync with pyproject.toml hooks: - id: black-jupyter - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.286 # keep in sync with pyproject.toml + rev: v0.0.289 # keep in sync with pyproject.toml hooks: - id: ruff types_or: [python, pyi, jupyter] @@ -32,9 +32,9 @@ repos: - id: blacken-docs entry: bash -c "blacken-docs -l 90 $(find doc/ -name '*.md')" args: [-l 90] - additional_dependencies: [black==23.7.0] # keep in sync with black above + additional_dependencies: [black==23.9.1] # keep in sync with black above - repo: https://github.com/pre-commit/mirrors-prettier - rev: v3.0.2 + rev: v3.0.3 hooks: - id: prettier args: ["--print-width", "120"] diff --git a/poetry.lock b/poetry.lock index e6021b73..bd95107b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -54,17 +54,17 @@ wrapt = [ [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.0" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, + {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] test = ["astroid", "pytest"] @@ -129,33 +129,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "23.7.0" +version = "23.9.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, - {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, - {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, - {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, - {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, - {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, - {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, - {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, - {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, - {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, - {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, ] [package.dependencies] @@ -167,7 +167,7 @@ pathspec = ">=0.9.0" platformdirs = ">=2" tokenize-rt = {version = ">=3.2.0", optional = true, markers = "extra == \"jupyter\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -342,63 +342,63 @@ files = [ [[package]] name = "coverage" -version = "7.3.0" +version = "7.3.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, - {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, - {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, - {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, - {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, - {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, - {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, - {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, - {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, - {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, - {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, - {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, - {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, - {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, - {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, - {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, - {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, - {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, - {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, - {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, - {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, - {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, - {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, - {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, - {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, - {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, - {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, - {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, + {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, + {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, + {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, + {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, + {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, + {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, + {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, + {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, + {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, + {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, + {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, + {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, ] [package.dependencies] @@ -546,13 +546,13 @@ test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] [[package]] name = "furo" -version = "2023.8.19" +version = "2023.9.10" description = "A clean customisable Sphinx documentation theme." optional = false python-versions = ">=3.8" files = [ - {file = "furo-2023.8.19-py3-none-any.whl", hash = "sha256:12f99f87a1873b6746228cfde18f77244e6c1ffb85d7fed95e638aae70d80590"}, - {file = "furo-2023.8.19.tar.gz", hash = "sha256:e671ee638ab3f1b472f4033b0167f502ab407830e0db0f843b1c1028119c9cd1"}, + {file = "furo-2023.9.10-py3-none-any.whl", hash = "sha256:513092538537dc5c596691da06e3c370714ec99bc438680edc1debffb73e5bfc"}, + {file = "furo-2023.9.10.tar.gz", hash = "sha256:5707530a476d2a63b8cad83b4f961f3739a69f4b058bcf38a03a39fa537195b2"}, ] [package.dependencies] @@ -581,13 +581,13 @@ shapely = ">=1.7.1" [[package]] name = "identify" -version = "2.5.27" +version = "2.5.28" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.27-py2.py3-none-any.whl", hash = "sha256:fdb527b2dfe24602809b2201e033c2a113d7bdf716db3ca8e3243f735dcecaba"}, - {file = "identify-2.5.27.tar.gz", hash = "sha256:287b75b04a0e22d727bc9a41f0d4f3c1bcada97490fa6eabb5b28f0e9097e733"}, + {file = "identify-2.5.28-py2.py3-none-any.whl", hash = "sha256:87816de144bf46d161bd5b3e8f5596b16cade3b80be537087334b26bc5c177f3"}, + {file = "identify-2.5.28.tar.gz", hash = "sha256:94bb59643083ebd60dc996d043497479ee554381fbc5307763915cda49b0e78f"}, ] [package.extras] @@ -647,13 +647,13 @@ files = [ [[package]] name = "ipython" -version = "8.14.0" +version = "8.15.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, - {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, + {file = "ipython-8.15.0-py3-none-any.whl", hash = "sha256:45a2c3a529296870a97b7de34eda4a31bee16bc7bf954e07d39abe49caf8f887"}, + {file = "ipython-8.15.0.tar.gz", hash = "sha256:2baeb5be6949eeebf532150f81746f8333e2ccce02de1c7eedde3f23ed5e9f1e"}, ] [package.dependencies] @@ -661,6 +661,7 @@ appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} @@ -672,9 +673,9 @@ traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] @@ -1004,70 +1005,64 @@ files = [ [[package]] name = "pandas" -version = "2.0.3" +version = "2.1.0" description = "Powerful data structures for data analysis, time series, and statistics" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, - {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, - {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, - {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, - {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, - {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, - {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, - {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, - {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, - {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, - {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, + {file = "pandas-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:40dd20439ff94f1b2ed55b393ecee9cb6f3b08104c2c40b0cb7186a2f0046242"}, + {file = "pandas-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4f38e4fedeba580285eaac7ede4f686c6701a9e618d8a857b138a126d067f2f"}, + {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6a0fe052cf27ceb29be9429428b4918f3740e37ff185658f40d8702f0b3e09"}, + {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d81e1813191070440d4c7a413cb673052b3b4a984ffd86b8dd468c45742d3cc"}, + {file = "pandas-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb20252720b1cc1b7d0b2879ffc7e0542dd568f24d7c4b2347cb035206936421"}, + {file = "pandas-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:38f74ef7ebc0ffb43b3d633e23d74882bce7e27bfa09607f3c5d3e03ffd9a4a5"}, + {file = "pandas-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cda72cc8c4761c8f1d97b169661f23a86b16fdb240bdc341173aee17e4d6cedd"}, + {file = "pandas-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d97daeac0db8c993420b10da4f5f5b39b01fc9ca689a17844e07c0a35ac96b4b"}, + {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c58b1113892e0c8078f006a167cc210a92bdae23322bb4614f2f0b7a4b510f"}, + {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:629124923bcf798965b054a540f9ccdfd60f71361255c81fa1ecd94a904b9dd3"}, + {file = "pandas-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:70cf866af3ab346a10debba8ea78077cf3a8cd14bd5e4bed3d41555a3280041c"}, + {file = "pandas-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d53c8c1001f6a192ff1de1efe03b31a423d0eee2e9e855e69d004308e046e694"}, + {file = "pandas-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86f100b3876b8c6d1a2c66207288ead435dc71041ee4aea789e55ef0e06408cb"}, + {file = "pandas-2.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28f330845ad21c11db51e02d8d69acc9035edfd1116926ff7245c7215db57957"}, + {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a6ccf0963db88f9b12df6720e55f337447aea217f426a22d71f4213a3099a6"}, + {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99e678180bc59b0c9443314297bddce4ad35727a1a2656dbe585fd78710b3b9"}, + {file = "pandas-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644"}, + {file = "pandas-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437"}, + {file = "pandas-2.1.0.tar.gz", hash = "sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918"}, ] [package.dependencies] numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] [[package]] name = "parso" @@ -1176,13 +1171,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.3.3" +version = "3.4.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, - {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, + {file = "pre_commit-3.4.0-py2.py3-none-any.whl", hash = "sha256:96d529a951f8b677f730a7212442027e8ba53f9b04d217c4c67dc56c393ad945"}, + {file = "pre_commit-3.4.0.tar.gz", hash = "sha256:6bbd5129a64cad4c0dfaeeb12cd8f7ea7e15b77028d985341478c8af3c759522"}, ] [package.dependencies] @@ -1318,13 +1313,13 @@ certifi = "*" [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] [package.dependencies] @@ -1392,13 +1387,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] @@ -1607,45 +1602,45 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.0.286" +version = "0.0.289" description = "An extremely fast Python linter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.286-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:8e22cb557e7395893490e7f9cfea1073d19a5b1dd337f44fd81359b2767da4e9"}, - {file = "ruff-0.0.286-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:68ed8c99c883ae79a9133cb1a86d7130feee0397fdf5ba385abf2d53e178d3fa"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8301f0bb4ec1a5b29cfaf15b83565136c47abefb771603241af9d6038f8981e8"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acc4598f810bbc465ce0ed84417ac687e392c993a84c7eaf3abf97638701c1ec"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88c8e358b445eb66d47164fa38541cfcc267847d1e7a92dd186dddb1a0a9a17f"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0433683d0c5dbcf6162a4beb2356e820a593243f1fa714072fec15e2e4f4c939"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddb61a0c4454cbe4623f4a07fef03c5ae921fe04fede8d15c6e36703c0a73b07"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47549c7c0be24c8ae9f2bce6f1c49fbafea83bca80142d118306f08ec7414041"}, - {file = "ruff-0.0.286-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:559aa793149ac23dc4310f94f2c83209eedb16908a0343663be19bec42233d25"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d73cfb1c3352e7aa0ce6fb2321f36fa1d4a2c48d2ceac694cb03611ddf0e4db6"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3dad93b1f973c6d1db4b6a5da8690c5625a3fa32bdf38e543a6936e634b83dc3"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26afc0851f4fc3738afcf30f5f8b8612a31ac3455cb76e611deea80f5c0bf3ce"}, - {file = "ruff-0.0.286-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9b6b116d1c4000de1b9bf027131dbc3b8a70507788f794c6b09509d28952c512"}, - {file = "ruff-0.0.286-py3-none-win32.whl", hash = "sha256:556e965ac07c1e8c1c2d759ac512e526ecff62c00fde1a046acb088d3cbc1a6c"}, - {file = "ruff-0.0.286-py3-none-win_amd64.whl", hash = "sha256:5d295c758961376c84aaa92d16e643d110be32add7465e197bfdaec5a431a107"}, - {file = "ruff-0.0.286-py3-none-win_arm64.whl", hash = "sha256:1d6142d53ab7f164204b3133d053c4958d4d11ec3a39abf23a40b13b0784e3f0"}, - {file = "ruff-0.0.286.tar.gz", hash = "sha256:f1e9d169cce81a384a26ee5bb8c919fe9ae88255f39a1a69fd1ebab233a85ed2"}, + {file = "ruff-0.0.289-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:c9a89d748e90c840bac9c37afe90cf13a5bfd460ca02ea93dad9d7bee3af03b4"}, + {file = "ruff-0.0.289-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:7f7396c6ea01ba332a6ad9d47642bac25d16bd2076aaa595b001f58b2f32ff05"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7180de86c8ecd39624dec1699136f941c07e723201b4ce979bec9e7c67b40ad2"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73f37c65508203dd01a539926375a10243769c20d4fcab3fa6359cd3fbfc54b7"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c14abcd7563b5c80be2dd809eeab20e4aa716bf849860b60a22d87ddf19eb88"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:91b6d63b6b46d4707916472c91baa87aa0592e73f62a80ff55efdf6c0668cfd6"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6479b8c4be3c36046c6c92054762b276fa0fddb03f6b9a310fbbf4c4951267fd"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5424318c254bcb091cb67e140ec9b9f7122074e100b06236f252923fb41e767"}, + {file = "ruff-0.0.289-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4daa90865796aedcedf0d8897fdd4cd09bf0ddd3504529a4ccf211edcaff3c7d"}, + {file = "ruff-0.0.289-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8057e8ab0016c13b9419bad119e854f881e687bd96bc5e2d52c8baac0f278a44"}, + {file = "ruff-0.0.289-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7eebfab2e6a6991908ff1bf82f2dc1e5095fc7e316848e62124526837b445f4d"}, + {file = "ruff-0.0.289-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ebc7af550018001a7fb39ca22cdce20e1a0de4388ea4a007eb5c822f6188c297"}, + {file = "ruff-0.0.289-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e4e6eccb753efe760ba354fc8e9f783f6bba71aa9f592756f5bd0d78db898ed"}, + {file = "ruff-0.0.289-py3-none-win32.whl", hash = "sha256:bbb3044f931c09cf17dbe5b339896eece0d6ac10c9a86e172540fcdb1974f2b7"}, + {file = "ruff-0.0.289-py3-none-win_amd64.whl", hash = "sha256:6d043c5456b792be2615a52f16056c3cf6c40506ce1f2d6f9d3083cfcb9eeab6"}, + {file = "ruff-0.0.289-py3-none-win_arm64.whl", hash = "sha256:04a720bcca5e987426bb14ad8b9c6f55e259ea774da1cbeafe71569744cfd20a"}, + {file = "ruff-0.0.289.tar.gz", hash = "sha256:2513f853b0fc42f0339b7ab0d2751b63ce7a50a0032d2689b54b2931b3b866d7"}, ] [[package]] name = "setuptools" -version = "68.1.2" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, - {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "shapely" @@ -1725,24 +1720,24 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] name = "sphinx" -version = "7.2.4" +version = "7.2.5" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.2.4-py3-none-any.whl", hash = "sha256:9b3aa23254ffc5be468646810543e491653bf5a67f3f23e4ccd4e515b0bd0b9c"}, - {file = "sphinx-7.2.4.tar.gz", hash = "sha256:1aeec862bf1edff4374012ac38082e0d1daa066c9e327841a846401164797988"}, + {file = "sphinx-7.2.5-py3-none-any.whl", hash = "sha256:9269f9ed2821c9ebd30e4204f5c2339f5d4980e377bc89cb2cb6f9b17409c20a"}, + {file = "sphinx-7.2.5.tar.gz", hash = "sha256:1a9290001b75c497fd087e92b0334f1bbfa1a1ae7fddc084990c4b7bd1130b88"}, ] [package.dependencies] @@ -2092,13 +2087,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.3" +version = "20.24.5" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, ] [package.dependencies] @@ -2107,7 +2102,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] @@ -2223,4 +2218,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "337b546c564d8a2ac0cf8b133bb9a74d4d0525a98d396ad0f293f2013635ee69" +content-hash = "c7346fba55321b4af5fd5c892d8c89687ddbf7dbafdc75c6cd88fb486e1d4fe4" diff --git a/pyproject.toml b/pyproject.toml index 7cd97a26..28afcca8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,8 +56,8 @@ coverage = { version = "^7.0.5", extras = ["toml"] } [tool.poetry.group.dev.dependencies] pre-commit = "^3.0.0" -black = { version = "==23.7.0", extras = ["jupyter"] } # keep in sync with .pre-commit-config.yaml -ruff = "==0.0.286" # keep in sync with .pre-commit-config.yaml +black = { version = "==23.9.1", extras = ["jupyter"] } # keep in sync with .pre-commit-config.yaml +ruff = "==0.0.289" # keep in sync with .pre-commit-config.yaml [tool.poetry.group.doc.dependencies] sphinx = "^7.0.1" From f8fc7c8d3eed81a5b9adf7729dd792bfcc613377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Wed, 13 Sep 2023 18:59:44 +0200 Subject: [PATCH 02/10] Small bug --- roseau/load_flow/models/loads/loads.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/roseau/load_flow/models/loads/loads.py b/roseau/load_flow/models/loads/loads.py index 685a68cd..7247c344 100644 --- a/roseau/load_flow/models/loads/loads.py +++ b/roseau/load_flow/models/loads/loads.py @@ -286,19 +286,19 @@ def powers(self, value: Sequence[complex]) -> None: if fp.control_p.type == "constant" and fp.control_q.type == "constant": continue # No checks for this case if abs(power) > fp.s_max.m_as("VA"): - msg = f"The power is greater than the parameter s_max for flexible load {id!r}" + msg = f"The power is greater than the parameter s_max for flexible load {self.id!r}" logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_S_VALUE) if fp.control_p.type == "p_max_u_production" and power.real > 0: - msg = f"There is a production control but a positive power for flexible load {id!r}" + msg = f"There is a production control but a positive power for flexible load {self.id!r}" logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_S_VALUE) if fp.control_p.type == "p_max_u_consumption" and power.real < 0: - msg = f"There is a consumption control but a negative power for flexible load {id!r}" + msg = f"There is a consumption control but a negative power for flexible load {self.id!r}" logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_S_VALUE) if fp.control_p.type != "constant" and power.real == 0: - msg = f"There is a P control but a null active power for flexible load {id!r}" + msg = f"There is a P control but a null active power for flexible load {self.id!r}" logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_S_VALUE) self._powers = value From ce2868b8e450d5352284e1ab30c3623322660315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 15:06:14 +0200 Subject: [PATCH 03/10] Improvement of the documentation --- doc/_static/Control_Trajectory_PmaxU_QU.svg | 25138 ---------------- doc/_static/Domain_PmaxU_QU.svg | 2267 -- .../FlexibleLoad}/Constant_P_Projection.svg | 0 .../FlexibleLoad}/Constant_Q_Projection.svg | 0 .../FlexibleLoad}/Control_PU_Cons.svg | 0 .../FlexibleLoad}/Control_PU_Prod.svg | 0 .../{ => Load/FlexibleLoad}/Control_QU.svg | 0 .../FlexibleLoad}/Domain_Pconst_QU_Eucl.svg | 40 +- .../FlexibleLoad}/Domain_Pconst_QU_P.svg | 36 +- .../FlexibleLoad}/Domain_Pconst_QU_Q.svg | 38 +- .../FlexibleLoad}/Domain_Pconst_Qconst.svg | 34 +- .../Load/FlexibleLoad/Domain_PmaxU_QU.svg | 3587 +++ .../FlexibleLoad}/Domain_PmaxU_Qconst.svg | 36 +- .../FlexibleLoad}/Euclidean_Projection.svg | 0 .../Pconst_QU_Eucl_Control_Curve_Example.svg | 587 + .../Pconst_QU_Eucl_Trajectory_Example.svg | 782 + .../Pconst_QU_P_Control_Curve_Example.svg | 587 + .../Pconst_QU_P_Trajectory_Example.svg | 782 + .../Pconst_QU_Q_Control_Curve_Example.svg | 587 + .../Pconst_QU_Q_Trajectory_Example.svg | 782 + ...axU_QU_Sequential_1_Trajectory_Example.svg | 811 + ...axU_QU_Sequential_2_Trajectory_Example.svg | 811 + ...U_QU_Simultaneous_2_Trajectory_Example.svg | 819 + ...axU_QU_Simultaneous_Trajectory_Example.svg | 811 + .../PmaxU_Qconst_Control_Curve_Example.svg | 544 + .../PmaxU_Qconst_Trajectory_Example.svg | 733 + doc/images/Constant_P_Projection.tex | 75 - doc/images/Constant_Q_Projection.tex | 75 - doc/images/Control_PU_Cons.tex | 107 - doc/images/Control_PU_Prod.tex | 107 - doc/images/Control_QU.tex | 116 - doc/images/Control_Trajectory_PmaxU_QU.tex | 119 - doc/images/Domain_Pconst_QU_Eucl.tex | 27 - doc/images/Domain_Pconst_QU_P.tex | 25 - doc/images/Domain_Pconst_QU_Q.tex | 26 - doc/images/Domain_Pconst_Qconst.tex | 22 - doc/images/Domain_PmaxU_QU.tex | 26 - doc/images/Domain_PmaxU_Qconst.tex | 24 - doc/images/Euclidean_Projection.tex | 73 - .../FlexibleLoad/Constant_P_Projection.tex | 75 + .../FlexibleLoad/Constant_Q_Projection.tex | 75 + .../Load/FlexibleLoad/Control_PU_Cons.tex | 108 + .../Load/FlexibleLoad/Control_PU_Prod.tex | 108 + doc/images/Load/FlexibleLoad/Control_QU.tex | 117 + .../FlexibleLoad}/Domain_Common.tikz | 4 +- .../FlexibleLoad/Domain_Pconst_QU_Eucl.tex | 30 + .../Load/FlexibleLoad/Domain_Pconst_QU_P.tex | 25 + .../Load/FlexibleLoad/Domain_Pconst_QU_Q.tex | 26 + .../FlexibleLoad/Domain_Pconst_Qconst.tex | 22 + .../Load/FlexibleLoad/Domain_PmaxU_QU.tex | 26 + .../Load/FlexibleLoad/Domain_PmaxU_Qconst.tex | 24 + .../FlexibleLoad/Euclidean_Projection.tex | 73 + .../Pconst_QU_Eucl_Control_Curve_Example.tex | 81 + .../FlexibleLoad/Pconst_QU_Eucl_Example.csv | 52 + .../Pconst_QU_Eucl_Trajectory_Example.tex | 94 + .../Pconst_QU_P_Control_Curve_Example.tex | 81 + .../Load/FlexibleLoad/Pconst_QU_P_Example.csv | 52 + .../Pconst_QU_P_Trajectory_Example.tex | 94 + .../Pconst_QU_Q_Control_Curve_Example.tex | 81 + .../Load/FlexibleLoad/Pconst_QU_Q_Example.csv | 52 + .../Pconst_QU_Q_Trajectory_Example.tex | 94 + .../PmaxU_QU_Sequential_1_Example.csv | 52 + ...axU_QU_Sequential_1_Trajectory_Example.tex | 102 + .../PmaxU_QU_Sequential_2_Example.csv | 52 + ...axU_QU_Sequential_2_Trajectory_Example.tex | 104 + .../PmaxU_QU_Simultaneous_2_Example.csv | 52 + ...U_QU_Simultaneous_2_Trajectory_Example.tex | 113 + .../PmaxU_QU_Simultaneous_Example.csv | 52 + ...axU_QU_Simultaneous_Trajectory_Example.tex | 102 + .../PmaxU_Qconst_Control_Curve_Example.tex | 78 + .../FlexibleLoad/PmaxU_Qconst_Example.csv | 52 + .../PmaxU_Qconst_Trajectory_Example.tex | 96 + doc/images/Makefile | 31 +- doc/models/Load/FlexibleLoad.md | 430 - doc/models/Load/FlexibleLoad/Control.md | 131 + .../Load/FlexibleLoad/FeasibleDomain.md | 828 + .../Load/FlexibleLoad/FlexibleParameter.md | 167 + doc/models/Load/FlexibleLoad/Projection.md | 84 + doc/models/Load/FlexibleLoad/index.md | 57 + doc/models/Load/index.md | 4 +- doc/usage/Flexible_Loads.md | 10 +- 81 files changed, 15852 insertions(+), 28773 deletions(-) delete mode 100644 doc/_static/Control_Trajectory_PmaxU_QU.svg delete mode 100644 doc/_static/Domain_PmaxU_QU.svg rename doc/_static/{ => Load/FlexibleLoad}/Constant_P_Projection.svg (100%) rename doc/_static/{ => Load/FlexibleLoad}/Constant_Q_Projection.svg (100%) rename doc/_static/{ => Load/FlexibleLoad}/Control_PU_Cons.svg (100%) rename doc/_static/{ => Load/FlexibleLoad}/Control_PU_Prod.svg (100%) rename doc/_static/{ => Load/FlexibleLoad}/Control_QU.svg (100%) rename doc/_static/{ => Load/FlexibleLoad}/Domain_Pconst_QU_Eucl.svg (77%) rename doc/_static/{ => Load/FlexibleLoad}/Domain_Pconst_QU_P.svg (81%) rename doc/_static/{ => Load/FlexibleLoad}/Domain_Pconst_QU_Q.svg (80%) rename doc/_static/{ => Load/FlexibleLoad}/Domain_Pconst_Qconst.svg (82%) create mode 100644 doc/_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg rename doc/_static/{ => Load/FlexibleLoad}/Domain_PmaxU_Qconst.svg (81%) rename doc/_static/{ => Load/FlexibleLoad}/Euclidean_Projection.svg (100%) create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg create mode 100644 doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg delete mode 100644 doc/images/Constant_P_Projection.tex delete mode 100644 doc/images/Constant_Q_Projection.tex delete mode 100644 doc/images/Control_PU_Cons.tex delete mode 100644 doc/images/Control_PU_Prod.tex delete mode 100644 doc/images/Control_QU.tex delete mode 100644 doc/images/Control_Trajectory_PmaxU_QU.tex delete mode 100644 doc/images/Domain_Pconst_QU_Eucl.tex delete mode 100644 doc/images/Domain_Pconst_QU_P.tex delete mode 100644 doc/images/Domain_Pconst_QU_Q.tex delete mode 100644 doc/images/Domain_Pconst_Qconst.tex delete mode 100644 doc/images/Domain_PmaxU_QU.tex delete mode 100644 doc/images/Domain_PmaxU_Qconst.tex delete mode 100644 doc/images/Euclidean_Projection.tex create mode 100644 doc/images/Load/FlexibleLoad/Constant_P_Projection.tex create mode 100644 doc/images/Load/FlexibleLoad/Constant_Q_Projection.tex create mode 100644 doc/images/Load/FlexibleLoad/Control_PU_Cons.tex create mode 100644 doc/images/Load/FlexibleLoad/Control_PU_Prod.tex create mode 100644 doc/images/Load/FlexibleLoad/Control_QU.tex rename doc/images/{ => Load/FlexibleLoad}/Domain_Common.tikz (95%) create mode 100644 doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.tex create mode 100644 doc/images/Load/FlexibleLoad/Domain_Pconst_QU_P.tex create mode 100644 doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Q.tex create mode 100644 doc/images/Load/FlexibleLoad/Domain_Pconst_Qconst.tex create mode 100644 doc/images/Load/FlexibleLoad/Domain_PmaxU_QU.tex create mode 100644 doc/images/Load/FlexibleLoad/Domain_PmaxU_Qconst.tex create mode 100644 doc/images/Load/FlexibleLoad/Euclidean_Projection.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_P_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Q_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_Qconst_Example.csv create mode 100644 doc/images/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.tex delete mode 100644 doc/models/Load/FlexibleLoad.md create mode 100644 doc/models/Load/FlexibleLoad/Control.md create mode 100644 doc/models/Load/FlexibleLoad/FeasibleDomain.md create mode 100644 doc/models/Load/FlexibleLoad/FlexibleParameter.md create mode 100644 doc/models/Load/FlexibleLoad/Projection.md create mode 100644 doc/models/Load/FlexibleLoad/index.md diff --git a/doc/_static/Control_Trajectory_PmaxU_QU.svg b/doc/_static/Control_Trajectory_PmaxU_QU.svg deleted file mode 100644 index 24045244..00000000 --- a/doc/_static/Control_Trajectory_PmaxU_QU.svg +++ /dev/null @@ -1,25138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/_static/Domain_PmaxU_QU.svg b/doc/_static/Domain_PmaxU_QU.svg deleted file mode 100644 index d6bebf95..00000000 --- a/doc/_static/Domain_PmaxU_QU.svg +++ /dev/null @@ -1,2267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/_static/Constant_P_Projection.svg b/doc/_static/Load/FlexibleLoad/Constant_P_Projection.svg similarity index 100% rename from doc/_static/Constant_P_Projection.svg rename to doc/_static/Load/FlexibleLoad/Constant_P_Projection.svg diff --git a/doc/_static/Constant_Q_Projection.svg b/doc/_static/Load/FlexibleLoad/Constant_Q_Projection.svg similarity index 100% rename from doc/_static/Constant_Q_Projection.svg rename to doc/_static/Load/FlexibleLoad/Constant_Q_Projection.svg diff --git a/doc/_static/Control_PU_Cons.svg b/doc/_static/Load/FlexibleLoad/Control_PU_Cons.svg similarity index 100% rename from doc/_static/Control_PU_Cons.svg rename to doc/_static/Load/FlexibleLoad/Control_PU_Cons.svg diff --git a/doc/_static/Control_PU_Prod.svg b/doc/_static/Load/FlexibleLoad/Control_PU_Prod.svg similarity index 100% rename from doc/_static/Control_PU_Prod.svg rename to doc/_static/Load/FlexibleLoad/Control_PU_Prod.svg diff --git a/doc/_static/Control_QU.svg b/doc/_static/Load/FlexibleLoad/Control_QU.svg similarity index 100% rename from doc/_static/Control_QU.svg rename to doc/_static/Load/FlexibleLoad/Control_QU.svg diff --git a/doc/_static/Domain_Pconst_QU_Eucl.svg b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.svg similarity index 77% rename from doc/_static/Domain_Pconst_QU_Eucl.svg rename to doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.svg index 88a97d14..7f60ad40 100644 --- a/doc/_static/Domain_Pconst_QU_Eucl.svg +++ b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.svg @@ -1,5 +1,5 @@ - + @@ -28,40 +28,42 @@ - + - + - - - - + + + + - + - + - + - + - + - - - + + + - - + + - + - + + + diff --git a/doc/_static/Domain_Pconst_QU_P.svg b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_P.svg similarity index 81% rename from doc/_static/Domain_Pconst_QU_P.svg rename to doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_P.svg index fd6f0a61..c103b187 100644 --- a/doc/_static/Domain_Pconst_QU_P.svg +++ b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_P.svg @@ -1,5 +1,5 @@ - + @@ -28,35 +28,35 @@ - + - - - - + + + + - + - + - + - + - + - - - + + + - - - - + + + + diff --git a/doc/_static/Domain_Pconst_QU_Q.svg b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Q.svg similarity index 80% rename from doc/_static/Domain_Pconst_QU_Q.svg rename to doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Q.svg index e7238144..803fe96b 100644 --- a/doc/_static/Domain_Pconst_QU_Q.svg +++ b/doc/_static/Load/FlexibleLoad/Domain_Pconst_QU_Q.svg @@ -1,5 +1,5 @@ - + @@ -28,40 +28,40 @@ - + - + - - - - + + + + - + - + - + - + - + - - - + + + - - + + - + - + diff --git a/doc/_static/Domain_Pconst_Qconst.svg b/doc/_static/Load/FlexibleLoad/Domain_Pconst_Qconst.svg similarity index 82% rename from doc/_static/Domain_Pconst_Qconst.svg rename to doc/_static/Load/FlexibleLoad/Domain_Pconst_Qconst.svg index eeb01cf0..b2f13d7f 100644 --- a/doc/_static/Domain_Pconst_Qconst.svg +++ b/doc/_static/Load/FlexibleLoad/Domain_Pconst_Qconst.svg @@ -1,5 +1,5 @@ - + @@ -28,34 +28,34 @@ - + - - - - + + + + - + - + - + - + - + - - - + + + - - - + + + diff --git a/doc/_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg b/doc/_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg new file mode 100644 index 00000000..17136493 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg @@ -0,0 +1,3587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Domain_PmaxU_Qconst.svg b/doc/_static/Load/FlexibleLoad/Domain_PmaxU_Qconst.svg similarity index 81% rename from doc/_static/Domain_PmaxU_Qconst.svg rename to doc/_static/Load/FlexibleLoad/Domain_PmaxU_Qconst.svg index 6ae5ce94..19a8ae38 100644 --- a/doc/_static/Domain_PmaxU_Qconst.svg +++ b/doc/_static/Load/FlexibleLoad/Domain_PmaxU_Qconst.svg @@ -1,5 +1,5 @@ - + @@ -28,35 +28,35 @@ - + - - - - + + + + - + - + - + - + - + - - - + + + - - - - + + + + diff --git a/doc/_static/Euclidean_Projection.svg b/doc/_static/Load/FlexibleLoad/Euclidean_Projection.svg similarity index 100% rename from doc/_static/Euclidean_Projection.svg rename to doc/_static/Load/FlexibleLoad/Euclidean_Projection.svg diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg new file mode 100644 index 00000000..61255866 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg new file mode 100644 index 00000000..ffa9650e --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg new file mode 100644 index 00000000..50485eed --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg new file mode 100644 index 00000000..406aa583 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg new file mode 100644 index 00000000..32685db8 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg new file mode 100644 index 00000000..9ca66dec --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg new file mode 100644 index 00000000..c74aa94c --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg new file mode 100644 index 00000000..c66562d7 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg new file mode 100644 index 00000000..b7719f51 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg new file mode 100644 index 00000000..dbe4d207 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg new file mode 100644 index 00000000..ce22094e --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg new file mode 100644 index 00000000..76c8ecd0 --- /dev/null +++ b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg @@ -0,0 +1,733 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/Constant_P_Projection.tex b/doc/images/Constant_P_Projection.tex deleted file mode 100644 index 60d609e6..00000000 --- a/doc/images/Constant_P_Projection.tex +++ /dev/null @@ -1,75 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % Styles - \tikzset{fleche/.style={->, -{Latex}}}% - \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% - \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% - - % Parameters - \pgfmathsetmacro{\r}{3.5}% - \pgfmathsetmacro{\R}{1.1 * \r}% - \pgfmathsetmacro{\pth}{0.8 * \r}% - \pgfmathsetmacro{\angth}{acos(\pth/\r)}% - \pgfmathsetmacro{\qth}{\r * sin(\angth)}% - \pgfmathsetmacro{\startangle}{-10}% - \pgfmathsetmacro{\endangle}{90-\startangle}% - - % Axes - \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% - \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% - - % Circle - \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% - \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% - \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, - end angle=90, radius=\r];% - \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% - - % Rectangle - \draw (0,\r) -- (\r,\r) -- (\r,0);% - - % Theoretical power - \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- - (\pth,\tmp);% - - % Point P^{\theo} - \path (\pth,0) pic[pic type=point];% - - % Point outside the circle - \pgfmathsetmacro{\rayon}{1.15*\r}% - \pgfmathsetmacro{\anglevaleur}{55}% - \coordinate (S) at (\anglevaleur:\rayon);% - - \node[right] at (S) {$\underline{S}$};% - \path (S) pic[pic type=point];% - - % Projection - \pgfmathsetmacro{\tmp}{\rayon*cos(\anglevaleur)};% - \pgfmathsetmacro{\tmpdeux}{sqrt(pow(\r,2)-pow(\tmp,2))};% - \coordinate (S correct) at (\tmp,\tmpdeux);% - \draw[fleche, blue] (S) -- (S correct);% - \path (S correct) pic {point=blue};% - \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Constant_Q_Projection.tex b/doc/images/Constant_Q_Projection.tex deleted file mode 100644 index 8e437c69..00000000 --- a/doc/images/Constant_Q_Projection.tex +++ /dev/null @@ -1,75 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % Styles - \tikzset{fleche/.style={->, -{Latex}}}% - \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% - \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% - - % Paramètres - \pgfmathsetmacro{\r}{3.5}% - \pgfmathsetmacro{\R}{1.1 * \r}% - \pgfmathsetmacro{\pth}{0.8 * \r}% - \pgfmathsetmacro{\angth}{acos(\pth/\r)}% - \pgfmathsetmacro{\qth}{\r * sin(\angth)}% - \pgfmathsetmacro{\startangle}{-10}% - \pgfmathsetmacro{\endangle}{90-\startangle}% - - % Axes - \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% - \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% - - % Cercle - \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% - \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% - \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, - end angle=90, radius=\r];% - \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% - - % Rectangle - \draw (0,\r) -- (\r,\r) -- (\r,0);% - - % Puissance théorique - \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- - (\pth,\tmp);% - - % Point noir sur P^{\theo} - \path (\pth,0) pic[pic type=point];% - - % Point en dehors du cercle - \pgfmathsetmacro{\rayon}{1.15*\r}% - \pgfmathsetmacro{\anglevaleur}{55}% - \coordinate (S) at (\anglevaleur:\rayon);% - - \node[right] at (S) {$\underline{S}$};% - \path (S) pic[pic type=point];% - - % Projection - \pgfmathsetmacro{\tmp}{\rayon*sin(\anglevaleur)};% - \pgfmathsetmacro{\tmpdeux}{sqrt(pow(\r,2)-pow(\tmp,2))};% - \coordinate (S correct) at (\tmpdeux,\tmp);% - \draw[fleche, blue] (S) -- (S correct);% - \path (S correct) pic {point=blue};% - \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Control_PU_Cons.tex b/doc/images/Control_PU_Cons.tex deleted file mode 100644 index d8466032..00000000 --- a/doc/images/Control_PU_Cons.tex +++ /dev/null @@ -1,107 +0,0 @@ -\input{Preambule}% - -\usepackage{pgfplots}% -\pgfplotsset{compat=newest}% -\usepgfplotslibrary{groupplots, colorbrewer}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % - % Common parameters - % - \pgfmathsetmacro{\uminvaleur}{210.0}% - \pgfmathsetmacro{\uminnormvaleur}{1.0}% - \pgfmathsetmacro{\udownvaleur}{220.0}% - \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\uminvaleur}% - \pgfmathsetmacro{\uupvaleur}{240.0}% - \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\uminvaleur}% - \pgfmathsetmacro{\umaxvaleur}{250.0}% - \pgfmathsetmacro{\umaxnormvaleur}{\umaxvaleur/\uminvaleur}% - \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% - \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\uminvaleur}% - \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% - \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\uminvaleur}% - \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% - \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\uminvaleur}% - - \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% - \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\uminvaleur}% - \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% - \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\uminvaleur}% - - \pgfmathsetmacro{\yminnormvaleur}{0}% - \pgfmathsetmacro{\ymaxnormvaleur}{1}% - - % - % Style - % - \tikzset{lisse/.style={line width=0.3mm, - domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, mark=none}}% - \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% - - \begin{axis}[% - height=7cm,% - width=0.9\textwidth,% - enlarge y limits,% - grid=major,% - xlabel={$|V_{p_1}-V_{p_2}|$},% - xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% - xticklabels={% - $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% - },% - y tick label style={/pgf/number format/.cd,% - set thousands separator={},% - fixed,% - % fixed zerofill,% - precision=1,% - use comma% - },% - xmin=\xminnormvaleur,% - xmax=\xmaxnormvaleur,% - ymin=\yminnormvaleur,% - ymax=\ymaxnormvaleur,% - legend columns=2,% - legend style={% - at={(0.5,-0.25)},% - anchor=north,% - nodes={text width=4cm}% - },% - cycle list/YlOrRd-5, % initialize YlOrRd-5 - cycle list name=YlOrRd-5% - ] - - % Piecewise linear function - \addplot[non lisse, red] coordinates {% - (\xminnormvaleur,0)% - (\uminnormvaleur,0)% - (\udownnormvaleur,1)% - (\xmaxnormvaleur,1)% - };% - \addlegendentry{Non-smooth control};% - - - % Soft clipping functions - \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 - \foreach \alphavaleur in {50,100,200,300,400} {% - \addplot+[lisse] expression {% - 1.0/(\alphavaleur*(\udownnormvaleur-\uminnormvaleur)) * - ln((1+exp(\alphavaleur*(x-\uminnormvaleur)))/(1+exp(\alphavaleur*(x-\udownnormvaleur)))) - };% - \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% - };% - \end{axis} -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Control_PU_Prod.tex b/doc/images/Control_PU_Prod.tex deleted file mode 100644 index 421ecb4b..00000000 --- a/doc/images/Control_PU_Prod.tex +++ /dev/null @@ -1,107 +0,0 @@ -\input{Preambule}% - -\usepackage{pgfplots}% -\pgfplotsset{compat=newest}% -\usepgfplotslibrary{groupplots, colorbrewer}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % - % Common parameters - % - \pgfmathsetmacro{\umaxvaleur}{250.0}% - \pgfmathsetmacro{\umaxnormvaleur}{1.0}% - \pgfmathsetmacro{\uupvaleur}{240.0}% - \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\umaxvaleur}% - \pgfmathsetmacro{\udownvaleur}{220.0}% - \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\umaxvaleur}% - \pgfmathsetmacro{\uminvaleur}{210.0}% - \pgfmathsetmacro{\uminnormvaleur}{\uminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% - \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\umaxvaleur}% - \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% - \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% - \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\umaxvaleur}% - - \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% - \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% - \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\umaxvaleur}% - - \pgfmathsetmacro{\yminnormvaleur}{0}% - \pgfmathsetmacro{\ymaxnormvaleur}{1}% - - % - % Style - % - \tikzset{lisse/.style={line width=0.3mm, domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, - mark=none}}% - \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% - - \begin{axis}[% - height=7cm,% - width=0.9\textwidth,% - enlarge y limits,% - grid=major,% - xlabel={$|V_{p_1}-V_{p_2}|$},% - xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% - xticklabels={% - $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% - },% - y tick label style={/pgf/number format/.cd,% - set thousands separator={},% - fixed,% - % fixed zerofill,% - precision=1,% - use comma% - },% - xmin=\xminnormvaleur,% - xmax=\xmaxnormvaleur,% - ymin=\yminnormvaleur,% - ymax=\ymaxnormvaleur,% - legend columns=2,% - legend style={% - at={(0.5,-0.25)},% - anchor=north,% - nodes={text width=4cm}% - },% - cycle list/YlOrRd-5, % initialize YlOrRd-5 - cycle list name=YlOrRd-5% - ] - - % Piecewise linear function - \addplot[non lisse, red] coordinates {% - (\xminnormvaleur,1)% - (\uupnormvaleur,1)% - (\umaxnormvaleur,0)% - (\xmaxnormvaleur,0)% - };% - \addlegendentry{Non-smooth control};% - - - % Soft clipping functions - \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 - \foreach \alphavaleur in {50,100,200,300,400} {% - \addplot+[lisse] expression {% - 1.0 + 1.0/(\alphavaleur*(\umaxnormvaleur-\uupnormvaleur)) * - ln((1+exp(\alphavaleur*(x-\umaxnormvaleur)))/(1+exp(\alphavaleur*(x-\uupnormvaleur)))) - };% - \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% - };% - \end{axis} -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Control_QU.tex b/doc/images/Control_QU.tex deleted file mode 100644 index b8947919..00000000 --- a/doc/images/Control_QU.tex +++ /dev/null @@ -1,116 +0,0 @@ -\input{Preambule}% - -\usepackage{pgfplots}% -\pgfplotsset{compat=newest}% -\usepgfplotslibrary{groupplots, colorbrewer}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % - % Common parameters - % - \pgfmathsetmacro{\umaxvaleur}{250.0}% - \pgfmathsetmacro{\umaxnormvaleur}{1.0}% - \pgfmathsetmacro{\uupvaleur}{240.0}% - \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\umaxvaleur}% - \pgfmathsetmacro{\udownvaleur}{220.0}% - \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\umaxvaleur}% - \pgfmathsetmacro{\uminvaleur}{210.0}% - \pgfmathsetmacro{\uminnormvaleur}{\uminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% - \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\umaxvaleur}% - \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% - \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% - \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\umaxvaleur}% - - \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% - \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\umaxvaleur}% - \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% - \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\umaxvaleur}% - - \pgfmathsetmacro{\yminnormvaleur}{-1}% - \pgfmathsetmacro{\ymaxnormvaleur}{1}% - - \pgfmathsetmacro{\qthnormvaleur}{0.30}% - - % - % Style - % - \tikzset{lisse/.style={line width=0.3mm, domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, - mark=none}}% - \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% - - \begin{axis}[% - height=7cm,% - width=0.9\textwidth,% - enlarge y limits,% - grid=major,% - xlabel={$|V_{p_1}-V_{p_2}|$},% - xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% - xticklabels={% - $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% - },% - y tick label style={/pgf/number format/.cd,% - set thousands separator={},% - fixed,% - fixed zerofill,% - precision=1,% - use comma% - },% - ytick={\yminnormvaleur,0,\qthnormvaleur,\ymaxnormvaleur},% - yticklabels={-1,0,$\dfrac{Q^{\theo}_{p_1p_2}}{\smax_{p_1p_2}}$,1},% - xmin=\xminnormvaleur,% - xmax=\xmaxnormvaleur,% - ymin=\yminnormvaleur,% - ymax=\ymaxnormvaleur,% - % ylabel={$\alpha\left(|V_{p}|\right)$},% - % legend entries={Contrôles non lisses,Contrôles lisses},% - legend columns=2,% - legend style={% - at={(0.5,-0.25)},% - anchor=north,% - nodes={text width=4cm}% - },% - cycle list/YlOrRd-5, % initialize YlOrRd-5 - cycle list name=YlOrRd-5% - ] - - % Fonction linéaire par morceaux - \addplot[non lisse, red] coordinates {% - (\xminnormvaleur,-1)% - (\uminnormvaleur,-1)% - (\udownnormvaleur,\qthnormvaleur)% - (\uupnormvaleur,\qthnormvaleur)% - (\umaxnormvaleur,1)% - (\xmaxnormvaleur,1)% - };% - \addlegendentry{Non-smooth control};% - - % Soft clipping functions - \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 - \foreach \alphavaleur in {50,100,200,300,400} {% - \addplot+[lisse] expression {% - \qthnormvaleur + ( 1.0/(\alphavaleur*(\uminnormvaleur-\udownnormvaleur)) * - ln((1+exp(\alphavaleur*(x-\udownnormvaleur)))/(1+exp(\alphavaleur*(x-\uminnormvaleur))))-1.0 - )*(1+\qthnormvaleur) + ( 1.0/(\alphavaleur*(\umaxnormvaleur-\uupnormvaleur)) * - ln((1+exp(\alphavaleur*(x-\uupnormvaleur)))/(1+exp(\alphavaleur*(x-\umaxnormvaleur)))) - )*(1-\qthnormvaleur) };% - \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% - };% - \end{axis} -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Control_Trajectory_PmaxU_QU.tex b/doc/images/Control_Trajectory_PmaxU_QU.tex deleted file mode 100644 index 62ca29bc..00000000 --- a/doc/images/Control_Trajectory_PmaxU_QU.tex +++ /dev/null @@ -1,119 +0,0 @@ -\input{Preambule}% - -\usepackage{pgfplots}% -\pgfplotsset{compat=newest}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % - % Common parameters - % - % Control of P - \pgfmathsetmacro{\umaxpvaleur}{250}% - \pgfmathsetmacro{\umaxpnormvaleur}{1.0}% - \pgfmathsetmacro{\uuppvaleur}{240}% - \pgfmathsetmacro{\uuppnormvaleur}{\uuppvaleur/\umaxpvaleur}% - \pgfmathsetmacro{\alphapvaleur}{400}% - - % Control of Q - \pgfmathsetmacro{\umaxqvaleur}{240}% - \pgfmathsetmacro{\umaxqnormvaleur}{1}% - \pgfmathsetmacro{\uupqvaleur}{235}% - \pgfmathsetmacro{\uupqnormvaleur}{\uupqvaleur/\umaxqvaleur}% - \pgfmathsetmacro{\udownqvaleur}{220}% - \pgfmathsetmacro{\udownqnormvaleur}{\udownqvaleur/\umaxqvaleur}% - \pgfmathsetmacro{\uminqvaleur}{210}% - \pgfmathsetmacro{\uminqnormvaleur}{\uminqvaleur/\umaxqvaleur}% - \pgfmathsetmacro{\alphaqvaleur}{400}% - - - % User-defined values - \pgfmathsetmacro{\smaxvaleur}{5000}% - \pgfmathsetmacro{\smaxnormvaleur}{1}% - \pgfmathsetmacro{\pthvaleur}{3750}% - \pgfmathsetmacro{\pthnormvaleur}{\pthvaleur/\smaxvaleur}% - \pgfmathsetmacro{\angthvaleur}{acos(\pthvaleur/\smaxvaleur)}% - \pgfmathsetmacro{\qthvaleur}{\smaxvaleur * sin(\angthvaleur)}% - \pgfmathsetmacro{\qthnormvaleur}{\qthvaleur/\smaxvaleur}% - - % - % Style - % - \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% - - \begin{axis}[% - height=9cm,% - % width=0.9\textwidth,% - axis equal=true,% - enlarge y limits,% - enlarge x limits,% - grid=major,% - xmin=-\smaxnormvaleur,% - xmax=\smaxnormvaleur,% - ymin=-\smaxnormvaleur,% - ymax=\smaxnormvaleur,% - xlabel=$P$,% - ylabel=$Q$,% - xtick={-\smaxnormvaleur,-\pthnormvaleur,0,\smaxnormvaleur},% - xticklabels={$-\smax$,$P^{\theo}$,0,$\smax$},% - ytick={-\smaxnormvaleur,0,\smaxnormvaleur},% - yticklabels={$-\smax$,0,$\smax$},% - declare function={% - fp(\t)=1.0+1.0/(\alphapvaleur*(\umaxpnormvaleur-\uuppnormvaleur)) * - ln((1+exp(\alphapvaleur*(\t-\umaxpnormvaleur)))/(1+exp(\alphapvaleur*(\t-\uuppnormvaleur))));% - p(\t)=-fp(\t/\umaxpvaleur)*\pthnormvaleur;% - fq(\t)= 1.0/(\alphaqvaleur*(\uminqnormvaleur-\udownqnormvaleur)) * - ln((1+exp(\alphaqvaleur*(\t-\udownqnormvaleur)))/(1+exp(\alphaqvaleur*(\t-\uminqnormvaleur))))-1.0;% - gq(\t)=1.0/(\alphaqvaleur*(\umaxqnormvaleur-\uupqnormvaleur)) * - ln((1+exp(\alphaqvaleur*(\t-\uupqnormvaleur)))/(1+exp(\alphaqvaleur*(\t-\umaxqnormvaleur))));% - q(\t)=\qthnormvaleur + - fq(\t/\umaxqvaleur)*(\smaxnormvaleur+\qthnormvaleur)+gq(\t/\umaxqvaleur)*(\smaxnormvaleur-\qthnormvaleur);% - pclip(\t)=p(\t);% - qclip(\t)=sign(q(\t))*sqrt(min(q(\t)^2,\smaxnormvaleur^2-p(\t)^2));% - },% - ] - % Points - \addplot+ [samples at={210,211,...,250}] ({pclip(\x)},{qclip(\x)});% - - % Cercle - \draw (axis cs:0,0) circle[radius=\smaxnormvaleur];% - - % Axes - \draw (axis cs:0,\pgfkeysvalueof{/pgfplots/ymin}) -- (axis - cs:0,\pgfkeysvalueof{/pgfplots/ymax});% - \draw (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0) -- (axis - cs:\pgfkeysvalueof{/pgfplots/xmax},0);% - - % Remplissage - \fill[interdit] (axis cs:0,-\smaxnormvaleur) -- (axis cs:0,\smaxnormvaleur) arc[start - angle=90, delta angle=-180, radius=\smaxnormvaleur];% - \fill[interdit] (axis cs:-\pthnormvaleur,\qthnormvaleur) arc[start angle=180-\angthvaleur, - delta angle=2*\angthvaleur, radius=\smaxnormvaleur];% - - % Notes - \node[pin={[pin distance=1mm] right:\SI{210}{\volt}}] at ({pclip(210)},{qclip(210)}) {};% - \node[pin={[pin distance=1mm] right:\SI{215}{\volt}}] at ({pclip(215)},{qclip(215)}) {};% - \node[pin={[pin distance=1mm] below right:\SI{220}{\volt}} ] at ({pclip(220)},{qclip(220)}) - {};% - \node[pin={[pin distance=1mm] left:\SI{230}{\volt}} ] at ({pclip(230)},{qclip(230)}) {};% - \node[pin={[pin distance=1mm] right:\SI{240}{\volt}}] at ({pclip(240)},{qclip(240)}) {};% - \node[pin={[pin distance=1mm] above left:\SI{245}{\volt}}] at ({pclip(245)},{qclip(245)}) - {};% - \node[pin={[pin distance=1mm] above right:\SI{250}{\volt}}] at ({pclip(250)},{qclip(250)}) - {};% - \end{axis} -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_Pconst_QU_Eucl.tex b/doc/images/Domain_Pconst_QU_Eucl.tex deleted file mode 100644 index 2529f943..00000000 --- a/doc/images/Domain_Pconst_QU_Eucl.tex +++ /dev/null @@ -1,27 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is a segment with two arc circle - \draw[domaine] (-\angeuclthvaleur:\r) arc[start angle=-\angeuclthvaleur, end - angle=-\angthvaleur, radius=\r] -- (\pthvaleur,\qthmaxvaleur) arc [start angle=\angthvaleur, end - angle=\angeuclthvaleur, radius=\r];% - - \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_Pconst_QU_P.tex b/doc/images/Domain_Pconst_QU_P.tex deleted file mode 100644 index cb528ed5..00000000 --- a/doc/images/Domain_Pconst_QU_P.tex +++ /dev/null @@ -1,25 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is a segment - \draw[domaine] (\pthvaleur,-\qthmaxvaleur) -- (\pthvaleur,\qthmaxvaleur);% - - \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_Pconst_QU_Q.tex b/doc/images/Domain_Pconst_QU_Q.tex deleted file mode 100644 index 7b1275c5..00000000 --- a/doc/images/Domain_Pconst_QU_Q.tex +++ /dev/null @@ -1,26 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is a segment with two portions of circle arc - \draw[domaine] (0,-\r) arc[start angle=-90, end angle=-\angthvaleur, radius=\r] -- - (\pthvaleur,\qthmaxvaleur) arc [start angle=\angthvaleur, end angle=90, radius=\r];% - - \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_Pconst_Qconst.tex b/doc/images/Domain_Pconst_Qconst.tex deleted file mode 100644 index 698b4d3f..00000000 --- a/doc/images/Domain_Pconst_Qconst.tex +++ /dev/null @@ -1,22 +0,0 @@ -\input{Preambule}% -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is limited to a point - \pic[domaine] at (\pthvaleur,\qthvaleur) {point}; -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_PmaxU_QU.tex b/doc/images/Domain_PmaxU_QU.tex deleted file mode 100644 index 452040ab..00000000 --- a/doc/images/Domain_PmaxU_QU.tex +++ /dev/null @@ -1,26 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is a prtion of the circle - \filldraw[domaine hache] (0,-\r) arc[start angle=-90, end angle=-\angthvaleur, radius=\r] -- - (\pthvaleur, \qthmaxvaleur) arc[start angle=\angthvaleur, end angle=90, radius=\r] --cycle;% - - \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Domain_PmaxU_Qconst.tex b/doc/images/Domain_PmaxU_Qconst.tex deleted file mode 100644 index 7434c790..00000000 --- a/doc/images/Domain_PmaxU_Qconst.tex +++ /dev/null @@ -1,24 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - \input{Domain_Common.tikz}% - - % The domain is a segment - \draw[domaine] (0,\qthvaleur) -- (\pthvaleur,\qthvaleur);% - \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Euclidean_Projection.tex b/doc/images/Euclidean_Projection.tex deleted file mode 100644 index c774d8ba..00000000 --- a/doc/images/Euclidean_Projection.tex +++ /dev/null @@ -1,73 +0,0 @@ -\input{Preambule}% - -\begin{document} -\begin{tikzpicture}[% - show background rectangle,% - tight background,% - background rectangle/.style={fill=white}% - ] - % Styles - \tikzset{fleche/.style={->, -{Latex}}}% - \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% - \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% - - % Paramètres - \pgfmathsetmacro{\r}{3.5}% - \pgfmathsetmacro{\R}{1.1 * \r}% - \pgfmathsetmacro{\pth}{0.8 * \r}% - \pgfmathsetmacro{\angth}{acos(\pth/\r)}% - \pgfmathsetmacro{\qth}{\r * sin(\angth)}% - \pgfmathsetmacro{\startangle}{-10}% - \pgfmathsetmacro{\endangle}{90-\startangle}% - - % Axes - \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% - \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% - - % Circle - \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% - \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% - \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, - end angle=90, radius=\r];% - \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% - - % Rectangle - \draw (0,\r) -- (\r,\r) -- (\r,0);% - - % Theoretical power - \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% - \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% - \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- - (\pth,\tmp);% - - % Point P^{\theo} - \path (\pth,0) pic[pic type=point];% - - % Point outside of the circle - \pgfmathsetmacro{\rayon}{1.15*\r}% - \pgfmathsetmacro{\anglevaleur}{55}% - \coordinate (S) at (\anglevaleur:\rayon);% - - \node[right] at (S) {$\underline{S}$};% - \path (S) pic[pic type=point];% - - % Projection - \coordinate (S correct) at (\anglevaleur:\r);% - \draw[fleche, blue] (S) -- (S correct);% - \path (S correct) pic {point=blue};% - \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% -\end{tikzpicture} -\end{document} -% Local Variables: -% mode: latex -% TeX-engine: luatex -% TeX-source-correlate-method-active: synctex -% ispell-local-dictionary: "british" -% coding: utf-8 -% LaTeX-indent-level: 4 -% fill-column: 100 -% End: diff --git a/doc/images/Load/FlexibleLoad/Constant_P_Projection.tex b/doc/images/Load/FlexibleLoad/Constant_P_Projection.tex new file mode 100644 index 00000000..a213d2de --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Constant_P_Projection.tex @@ -0,0 +1,75 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % Styles + \tikzset{fleche/.style={->, -{Latex}}}% + \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% + \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% + + % Parameters + \pgfmathsetmacro{\r}{3.5}% + \pgfmathsetmacro{\R}{1.1 * \r}% + \pgfmathsetmacro{\pth}{0.8 * \r}% + \pgfmathsetmacro{\angth}{acos(\pth/\r)}% + \pgfmathsetmacro{\qth}{\r * sin(\angth)}% + \pgfmathsetmacro{\startangle}{-10}% + \pgfmathsetmacro{\endangle}{90-\startangle}% + + % Axes + \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% + \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% + + % Circle + \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% + \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% + \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, + end angle=90, radius=\r];% + \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% + + % Rectangle + \draw (0,\r) -- (\r,\r) -- (\r,0);% + + % Theoretical power + \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- + (\pth,\tmp);% + + % Point P^{\theo} + \path (\pth,0) pic[pic type=point];% + + % Point outside the circle + \pgfmathsetmacro{\rayon}{1.15*\r}% + \pgfmathsetmacro{\anglevaleur}{55}% + \coordinate (S) at (\anglevaleur:\rayon);% + + \node[right] at (S) {$\underline{S}$};% + \path (S) pic[pic type=point];% + + % Projection + \pgfmathsetmacro{\tmp}{\rayon*cos(\anglevaleur)};% + \pgfmathsetmacro{\tmpdeux}{sqrt(pow(\r,2)-pow(\tmp,2))};% + \coordinate (S correct) at (\tmp,\tmpdeux);% + \draw[fleche, blue] (S) -- (S correct);% + \path (S correct) pic {point=blue};% + \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Constant_Q_Projection.tex b/doc/images/Load/FlexibleLoad/Constant_Q_Projection.tex new file mode 100644 index 00000000..08746307 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Constant_Q_Projection.tex @@ -0,0 +1,75 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % Styles + \tikzset{fleche/.style={->, -{Latex}}}% + \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% + \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% + + % Paramètres + \pgfmathsetmacro{\r}{3.5}% + \pgfmathsetmacro{\R}{1.1 * \r}% + \pgfmathsetmacro{\pth}{0.8 * \r}% + \pgfmathsetmacro{\angth}{acos(\pth/\r)}% + \pgfmathsetmacro{\qth}{\r * sin(\angth)}% + \pgfmathsetmacro{\startangle}{-10}% + \pgfmathsetmacro{\endangle}{90-\startangle}% + + % Axes + \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% + \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% + + % Cercle + \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% + \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% + \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, + end angle=90, radius=\r];% + \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% + + % Rectangle + \draw (0,\r) -- (\r,\r) -- (\r,0);% + + % Puissance théorique + \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- + (\pth,\tmp);% + + % Point noir sur P^{\theo} + \path (\pth,0) pic[pic type=point];% + + % Point en dehors du cercle + \pgfmathsetmacro{\rayon}{1.15*\r}% + \pgfmathsetmacro{\anglevaleur}{55}% + \coordinate (S) at (\anglevaleur:\rayon);% + + \node[right] at (S) {$\underline{S}$};% + \path (S) pic[pic type=point];% + + % Projection + \pgfmathsetmacro{\tmp}{\rayon*sin(\anglevaleur)};% + \pgfmathsetmacro{\tmpdeux}{sqrt(pow(\r,2)-pow(\tmp,2))};% + \coordinate (S correct) at (\tmpdeux,\tmp);% + \draw[fleche, blue] (S) -- (S correct);% + \path (S correct) pic {point=blue};% + \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Control_PU_Cons.tex b/doc/images/Load/FlexibleLoad/Control_PU_Cons.tex new file mode 100644 index 00000000..702afdd4 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Control_PU_Cons.tex @@ -0,0 +1,108 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% +\usepgfplotslibrary{groupplots, colorbrewer}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % + % Common parameters + % + \pgfmathsetmacro{\uminvaleur}{210.0}% + \pgfmathsetmacro{\uminnormvaleur}{1.0}% + \pgfmathsetmacro{\udownvaleur}{220.0}% + \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\uminvaleur}% + \pgfmathsetmacro{\uupvaleur}{240.0}% + \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\uminvaleur}% + \pgfmathsetmacro{\umaxvaleur}{250.0}% + \pgfmathsetmacro{\umaxnormvaleur}{\umaxvaleur/\uminvaleur}% + \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% + \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\uminvaleur}% + \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% + \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\uminvaleur}% + \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% + \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\uminvaleur}% + + \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% + \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\uminvaleur}% + \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% + \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\uminvaleur}% + + \pgfmathsetmacro{\yminnormvaleur}{0}% + \pgfmathsetmacro{\ymaxnormvaleur}{1}% + + % + % Style + % + \tikzset{lisse/.style={line width=0.3mm, + domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, mark=none}}% + \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% + + \begin{axis} + [% + height=7cm,% + width=0.9\textwidth,% + enlarge y limits,% + grid=major,% + xlabel={$|V_{p_1}-V_{p_2}|$},% + xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% + xticklabels={% + $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% + },% + y tick label style={/pgf/number format/.cd,% + set thousands separator={},% + fixed,% + % fixed zerofill,% + precision=1,% + use comma% + },% + xmin=\xminnormvaleur,% + xmax=\xmaxnormvaleur,% + ymin=\yminnormvaleur,% + ymax=\ymaxnormvaleur,% + legend columns=2,% + legend style={% + at={(0.5,-0.25)},% + anchor=north,% + nodes={text width=4cm}% + },% + cycle list/YlOrRd-5, % initialize YlOrRd-5 + cycle list name=YlOrRd-5% + ] + + % Piecewise linear function + \addplot[non lisse, red] coordinates {% + (\xminnormvaleur,0)% + (\uminnormvaleur,0)% + (\udownnormvaleur,1)% + (\xmaxnormvaleur,1)% + };% + \addlegendentry{Non-smooth control};% + + + % Soft clipping functions + \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 + \foreach \alphavaleur in {50,100,200,300,400} {% + \addplot+[lisse] expression {% + 1.0/(\alphavaleur*(\udownnormvaleur-\uminnormvaleur)) * + ln((1+exp(\alphavaleur*(x-\uminnormvaleur)))/(1+exp(\alphavaleur*(x-\udownnormvaleur)))) + };% + \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% + };% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Control_PU_Prod.tex b/doc/images/Load/FlexibleLoad/Control_PU_Prod.tex new file mode 100644 index 00000000..cdc28a40 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Control_PU_Prod.tex @@ -0,0 +1,108 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% +\usepgfplotslibrary{groupplots, colorbrewer}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % + % Common parameters + % + \pgfmathsetmacro{\umaxvaleur}{250.0}% + \pgfmathsetmacro{\umaxnormvaleur}{1.0}% + \pgfmathsetmacro{\uupvaleur}{240.0}% + \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\umaxvaleur}% + \pgfmathsetmacro{\udownvaleur}{220.0}% + \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\umaxvaleur}% + \pgfmathsetmacro{\uminvaleur}{210.0}% + \pgfmathsetmacro{\uminnormvaleur}{\uminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% + \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\umaxvaleur}% + \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% + \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% + \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\umaxvaleur}% + + \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% + \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% + \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\umaxvaleur}% + + \pgfmathsetmacro{\yminnormvaleur}{0}% + \pgfmathsetmacro{\ymaxnormvaleur}{1}% + + % + % Style + % + \tikzset{lisse/.style={line width=0.3mm, domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, + mark=none}}% + \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% + + \begin{axis} + [% + height=7cm,% + width=0.9\textwidth,% + enlarge y limits,% + grid=major,% + xlabel={$|V_{p_1}-V_{p_2}|$},% + xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% + xticklabels={% + $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% + },% + y tick label style={/pgf/number format/.cd,% + set thousands separator={},% + fixed,% + % fixed zerofill,% + precision=1,% + use comma% + },% + xmin=\xminnormvaleur,% + xmax=\xmaxnormvaleur,% + ymin=\yminnormvaleur,% + ymax=\ymaxnormvaleur,% + legend columns=2,% + legend style={% + at={(0.5,-0.25)},% + anchor=north,% + nodes={text width=4cm}% + },% + cycle list/YlOrRd-5, % initialize YlOrRd-5 + cycle list name=YlOrRd-5% + ] + + % Piecewise linear function + \addplot[non lisse, red] coordinates {% + (\xminnormvaleur,1)% + (\uupnormvaleur,1)% + (\umaxnormvaleur,0)% + (\xmaxnormvaleur,0)% + };% + \addlegendentry{Non-smooth control};% + + + % Soft clipping functions + \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 + \foreach \alphavaleur in {50,100,200,300,400} {% + \addplot+[lisse] expression {% + 1.0 + 1.0/(\alphavaleur*(\umaxnormvaleur-\uupnormvaleur)) * + ln((1+exp(\alphavaleur*(x-\umaxnormvaleur)))/(1+exp(\alphavaleur*(x-\uupnormvaleur)))) + };% + \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% + };% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Control_QU.tex b/doc/images/Load/FlexibleLoad/Control_QU.tex new file mode 100644 index 00000000..1c944ad1 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Control_QU.tex @@ -0,0 +1,117 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% +\usepgfplotslibrary{groupplots, colorbrewer}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % + % Common parameters + % + \pgfmathsetmacro{\umaxvaleur}{250.0}% + \pgfmathsetmacro{\umaxnormvaleur}{1.0}% + \pgfmathsetmacro{\uupvaleur}{240.0}% + \pgfmathsetmacro{\uupnormvaleur}{\uupvaleur/\umaxvaleur}% + \pgfmathsetmacro{\udownvaleur}{220.0}% + \pgfmathsetmacro{\udownnormvaleur}{\udownvaleur/\umaxvaleur}% + \pgfmathsetmacro{\uminvaleur}{210.0}% + \pgfmathsetmacro{\uminnormvaleur}{\uminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\unomvaleur}{(\udownvaleur+\uupvaleur)/2.0}% + \pgfmathsetmacro{\unomnormvaleur}{\unomvaleur/\umaxvaleur}% + \pgfmathsetmacro{\umidminvaleur}{(\udownvaleur+\uminvaleur)/2.0}% + \pgfmathsetmacro{\umidminnormvaleur}{\umidminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\umidmaxvaleur}{(\uupvaleur+\umaxvaleur)/2.0}% + \pgfmathsetmacro{\umidmaxnormvaleur}{\umidmaxvaleur/\umaxvaleur}% + + \pgfmathsetmacro{\xminvaleur}{\uminvaleur - 2.5}% + \pgfmathsetmacro{\xminnormvaleur}{\xminvaleur/\umaxvaleur}% + \pgfmathsetmacro{\xmaxvaleur}{\umaxvaleur + 2.5}% + \pgfmathsetmacro{\xmaxnormvaleur}{\xmaxvaleur/\umaxvaleur}% + + \pgfmathsetmacro{\yminnormvaleur}{-1}% + \pgfmathsetmacro{\ymaxnormvaleur}{1}% + + \pgfmathsetmacro{\qthnormvaleur}{0.30}% + + % + % Style + % + \tikzset{lisse/.style={line width=0.3mm, domain=\xminnormvaleur:\xmaxnormvaleur, samples=75, + mark=none}}% + \tikzset{non lisse/.style={line width=0.3mm, mark=*}}% + + \begin{axis} + [% + height=7cm,% + width=0.9\textwidth,% + enlarge y limits,% + grid=major,% + xlabel={$|V_{p_1}-V_{p_2}|$},% + xtick={\uminnormvaleur,\umidminnormvaleur,\udownnormvaleur,\unomnormvaleur,\uupnormvaleur,\umidmaxnormvaleur,\umaxnormvaleur},% + xticklabels={% + $\uminnorm$,,$\udownnorm$,$\unomnorm$,$\uupnorm$,,$\umaxnorm$% + },% + y tick label style={/pgf/number format/.cd,% + set thousands separator={},% + fixed,% + fixed zerofill,% + precision=1,% + use comma% + },% + ytick={\yminnormvaleur,0,\qthnormvaleur,\ymaxnormvaleur},% + yticklabels={-1,0,$\dfrac{Q^{\theo}_{p_1p_2}}{\smax_{p_1p_2}}$,1},% + xmin=\xminnormvaleur,% + xmax=\xmaxnormvaleur,% + ymin=\yminnormvaleur,% + ymax=\ymaxnormvaleur,% + % ylabel={$\alpha\left(|V_{p}|\right)$},% + % legend entries={Contrôles non lisses,Contrôles lisses},% + legend columns=2,% + legend style={% + at={(0.5,-0.25)},% + anchor=north,% + nodes={text width=4cm}% + },% + cycle list/YlOrRd-5, % initialize YlOrRd-5 + cycle list name=YlOrRd-5% + ] + + % Fonction linéaire par morceaux + \addplot[non lisse, red] coordinates {% + (\xminnormvaleur,-1)% + (\uminnormvaleur,-1)% + (\udownnormvaleur,\qthnormvaleur)% + (\uupnormvaleur,\qthnormvaleur)% + (\umaxnormvaleur,1)% + (\xmaxnormvaleur,1)% + };% + \addlegendentry{Non-smooth control};% + + % Soft clipping functions + \pgfplotsset{cycle list shift=-1}% Reset cycle to 0 + \foreach \alphavaleur in {50,100,200,300,400} {% + \addplot+[lisse] expression {% + \qthnormvaleur + ( 1.0/(\alphavaleur*(\uminnormvaleur-\udownnormvaleur)) * + ln((1+exp(\alphavaleur*(x-\udownnormvaleur)))/(1+exp(\alphavaleur*(x-\uminnormvaleur))))-1.0 + )*(1+\qthnormvaleur) + ( 1.0/(\alphavaleur*(\umaxnormvaleur-\uupnormvaleur)) * + ln((1+exp(\alphavaleur*(x-\uupnormvaleur)))/(1+exp(\alphavaleur*(x-\umaxnormvaleur)))) + )*(1-\qthnormvaleur) };% + \addlegendentryexpanded{Soft clipping ($\alpha=\num{\alphavaleur}$)};% + };% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Domain_Common.tikz b/doc/images/Load/FlexibleLoad/Domain_Common.tikz similarity index 95% rename from doc/images/Domain_Common.tikz rename to doc/images/Load/FlexibleLoad/Domain_Common.tikz index d6164e22..63f2cf06 100644 --- a/doc/images/Domain_Common.tikz +++ b/doc/images/Load/FlexibleLoad/Domain_Common.tikz @@ -10,8 +10,8 @@ % % Macros % -\pgfmathsetmacro{\r}{1.2};% -\pgfmathsetmacro{\R}{1.5};% +\pgfmathsetmacro{\r}{1.6};% +\pgfmathsetmacro{\R}{2};% \pgfmathsetmacro{\pthvaleur}{-0.55*\r};% \pgfmathsetmacro{\qthvaleur}{0.6*\r};% \pgfmathsetmacro{\angthvaleur}{acos(\pthvaleur/\r)}% diff --git a/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.tex b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.tex new file mode 100644 index 00000000..b2aff101 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.tex @@ -0,0 +1,30 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is a segment with two arc circle + \draw[domaine] (-\angeuclthvaleur:\r) arc[start angle=-\angeuclthvaleur, end + angle=-\angthvaleur, radius=\r] -- (\pthvaleur,\qthmaxvaleur) arc [start angle=\angthvaleur, end + angle=\angeuclthvaleur, radius=\r];% + + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + + \draw[dashed] (0,0) -- (\pthvaleur,\r);% + \draw[dashed] (0,0) -- (\pthvaleur,-\r);% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_P.tex b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_P.tex new file mode 100644 index 00000000..67cf5b91 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_P.tex @@ -0,0 +1,25 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is a segment + \draw[domaine] (\pthvaleur,-\qthmaxvaleur) -- (\pthvaleur,\qthmaxvaleur);% + + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Q.tex b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Q.tex new file mode 100644 index 00000000..9b58de00 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_Pconst_QU_Q.tex @@ -0,0 +1,26 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is a segment with two portions of circle arc + \draw[domaine] (0,-\r) arc[start angle=-90, end angle=-\angthvaleur, radius=\r] -- + (\pthvaleur,\qthmaxvaleur) arc [start angle=\angthvaleur, end angle=90, radius=\r];% + + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Domain_Pconst_Qconst.tex b/doc/images/Load/FlexibleLoad/Domain_Pconst_Qconst.tex new file mode 100644 index 00000000..93829aeb --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_Pconst_Qconst.tex @@ -0,0 +1,22 @@ +\input{Preambule}% +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is limited to a point + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Domain_PmaxU_QU.tex b/doc/images/Load/FlexibleLoad/Domain_PmaxU_QU.tex new file mode 100644 index 00000000..8b8cbe7c --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_PmaxU_QU.tex @@ -0,0 +1,26 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is a prtion of the circle + \filldraw[domaine hache] (0,-\r) arc[start angle=-90, end angle=-\angthvaleur, radius=\r] -- + (\pthvaleur, \qthmaxvaleur) arc[start angle=\angthvaleur, end angle=90, radius=\r] --cycle;% + + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Domain_PmaxU_Qconst.tex b/doc/images/Load/FlexibleLoad/Domain_PmaxU_Qconst.tex new file mode 100644 index 00000000..cf85c1fe --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Domain_PmaxU_Qconst.tex @@ -0,0 +1,24 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \input{Load/FlexibleLoad/Domain_Common.tikz}% + + % The domain is a segment + \draw[domaine] (0,\qthvaleur) -- (\pthvaleur,\qthvaleur);% + \pic[domaine] at (\pthvaleur,\qthvaleur) {point};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Euclidean_Projection.tex b/doc/images/Load/FlexibleLoad/Euclidean_Projection.tex new file mode 100644 index 00000000..bc08f74b --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Euclidean_Projection.tex @@ -0,0 +1,73 @@ +\input{Preambule}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + % Styles + \tikzset{fleche/.style={->, -{Latex}}}% + \tikzset{interdit/.style={pattern=north east lines, pattern color=red}}% + \tikzset{point/.pic={\filldraw[#1] (0,0) circle[radius=0.05];}, point/.default=black}% + + % Paramètres + \pgfmathsetmacro{\r}{3.5}% + \pgfmathsetmacro{\R}{1.1 * \r}% + \pgfmathsetmacro{\pth}{0.8 * \r}% + \pgfmathsetmacro{\angth}{acos(\pth/\r)}% + \pgfmathsetmacro{\qth}{\r * sin(\angth)}% + \pgfmathsetmacro{\startangle}{-10}% + \pgfmathsetmacro{\endangle}{90-\startangle}% + + % Axes + \pgfmathsetmacro{\tmp}{\r*cos(90-\startangle)};% + \draw[fleche] (\tmp,0) -- (\R,0) node[below right] {$P$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \draw[fleche] (0,\tmp) -- (0,\R) node[above right] {$Q$};% + + % Circle + \draw (\startangle:\r) arc[start angle=\startangle, end angle=\endangle, radius=\r];% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \pgfmathsetmacro{\tmpdeux}{\r*cos(\endangle)};% + \pgfmathsetmacro{\tmptrois}{\r*sin(\endangle)};% + \fill[interdit] (0,\tmp) -- (\tmpdeux,\tmp) -- (\tmpdeux,\tmptrois) arc[start angle=\endangle, + end angle=90, radius=\r];% + \draw[fleche] (0,0) -- (20:\r) node[above, midway, sloped] {$\smax$};% + + % Rectangle + \draw (0,\r) -- (\r,\r) -- (\r,0);% + + % Theoretical power + \draw (\pth,0) -- (\pth,\r) node[below left] at (\pth,0) {$P^{\theo}$};% + \pgfmathsetmacro{\tmp}{\r*sin(\startangle)};% + \fill[interdit] (\pth,\qth) arc[start angle=\angth, end angle=\startangle, radius=\r] -- + (\pth,\tmp);% + + % Point P^{\theo} + \path (\pth,0) pic[pic type=point];% + + % Point outside of the circle + \pgfmathsetmacro{\rayon}{1.15*\r}% + \pgfmathsetmacro{\anglevaleur}{55}% + \coordinate (S) at (\anglevaleur:\rayon);% + + \node[right] at (S) {$\underline{S}$};% + \path (S) pic[pic type=point];% + + % Projection + \coordinate (S correct) at (\anglevaleur:\r);% + \draw[fleche, blue] (S) -- (S correct);% + \path (S correct) pic {point=blue};% + \node[below left] at (S correct) {$\underline{S^{\text{proj.}}}$};% + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex new file mode 100644 index 00000000..f7e33c4d --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex @@ -0,0 +1,81 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \begin{axis} + [% + xlabel={Voltages (V)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% + grid=both,% + legend entries={Effective power,Non-smooth theoretical control},% + legend style={% + legend cell align=left,% + legend pos=north west,% + },% + sharp plot,% + mark size=0.5mm,% + height=9cm,% + width=16cm,% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==210}{% + "\\$\umin$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==220}{% + "\\$\udown$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==240}{% + "\\$\uup$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==250}{% + "\\$\umax$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + ] + \addplot+[only marks] table[x=v, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv};% + \addplot+ coordinates {(205,-5000) (210,-5000) (220,0) (240,0) (250,5000) (255,5000)};% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv new file mode 100644 index 00000000..81db670f --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2236.0679775919675,-4472.135954953491 +206.0,-2236.067982532515,-4472.135952483217 +207.0,-2236.068252276505,-4472.135817611212 +208.0,-2236.082977416831,-4472.128455009614 +209.0,-2236.879924830704,-4471.729889191584 +210.0,-2267.4462214926693,-4456.308745210392 +211.0,-2429.150449642832,-4370.266364078971 +212.0,-2500.0,-3999.9580742033895 +213.0,-2500.0,-3499.999231975902 +214.0,-2500.0,-2999.999985937823 +215.0,-2500.0,-2500.0 +216.0,-2500.0,-2000.0000140621771 +217.0,-2500.0,-1500.0007680240985 +218.0,-2500.0,-1000.0419257966104 +219.0,-2500.0,-502.26874098972695 +220.0,-2500.0,-86.64339756999372 +221.0,-2500.0,-2.268740989725404 +222.0,-2500.0,-0.041925796612218846 +223.0,-2500.0,-0.0007680241859153725 +224.0,-2500.0,-1.4066895981379446e-05 +225.0,-2500.0,-2.5764390620963695e-07 +226.0,-2500.0,-4.719002966169228e-09 +227.0,-2500.0,-8.715250743307479e-11 +228.0,-2500.0,-2.7755575615628914e-12 +229.0,-2500.0,1.1102230246251565e-12 +230.0,-2500.0,0.0 +231.0,-2500.0,-1.0824674490095276e-12 +232.0,-2500.0,2.692290834715993e-12 +233.0,-2500.0,8.754108549166365e-11 +234.0,-2500.0,4.7189196993533036e-09 +235.0,-2500.0,2.576431010324217e-07 +236.0,-2500.0,1.4066897160515013e-05 +237.0,-2500.0,0.0007680241858286514 +238.0,-2500.0,0.041925796610847534 +239.0,-2500.0,2.26874098972511 +240.0,-2500.0,86.64339756999419 +241.0,-2500.0,502.26874098972735 +242.0,-2500.0,1000.0419257966093 +243.0,-2500.0,1500.000768024097 +244.0,-2500.0,2000.000014062176 +245.0,-2500.0,2499.999999999999 +246.0,-2500.0,2999.999985937824 +247.0,-2500.0,3499.9992319759026 +248.0,-2500.0,3999.9580742033904 +249.0,-2429.150449642832,4370.266364078971 +250.0,-2267.44622149267,4456.308745210391 +251.0,-2236.879924830704,4471.729889191584 +252.0,-2236.0829774168315,4472.128455009614 +253.0,-2236.0682522765055,4472.135817611211 +254.0,-2236.067982532515,4472.135952483217 +255.0,-2236.0679775919666,4472.135954953491 diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.tex new file mode 100644 index 00000000..98a6791d --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.tex @@ -0,0 +1,94 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] below:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] above:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_Eucl_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex new file mode 100644 index 00000000..3a046575 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex @@ -0,0 +1,81 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \begin{axis} + [% + xlabel={Voltages (V)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% + grid=both,% + legend entries={Effective power,Non-smooth theoretical control},% + legend style={% + legend cell align=left,% + legend pos=north west,% + },% + sharp plot,% + mark size=0.5mm,% + height=9cm,% + width=16cm,% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==210}{% + "\\$\umin$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==220}{% + "\\$\udown$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==240}{% + "\\$\uup$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==250}{% + "\\$\umax$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + ] + \addplot+[only marks] table[x=v, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_P_Example.csv};% + \addplot+ coordinates {(205,-5000) (210,-5000) (220,0) (240,0) (250,5000) (255,5000)};% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_P_Example.csv b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Example.csv new file mode 100644 index 00000000..5094743d --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2500.0,-4330.127018922193 +206.0,-2500.0,-4330.127018922193 +207.0,-2500.0,-4330.127018922193 +208.0,-2500.0,-4330.127018922193 +209.0,-2500.0,-4330.127018922193 +210.0,-2500.0,-4330.127018922199 +211.0,-2500.0,-4330.150847081422 +212.0,-2500.0,-3999.958097622331 +213.0,-2500.0,-3499.999231975902 +214.0,-2500.0,-2999.999985937823 +215.0,-2500.0,-2500.0 +216.0,-2500.0,-2000.0000140621771 +217.0,-2500.0,-1500.0007680240985 +218.0,-2500.0,-1000.0419257966104 +219.0,-2500.0,-502.26874098972695 +220.0,-2500.0,-86.64339756999357 +221.0,-2500.0,-0.9641585416943067 +222.0,-2500.0,-0.004192533096206056 +223.0,-2500.0,-7.680241798760731e-05 +224.0,-2500.0,-1.4066895981342335e-06 +225.0,-2500.0,-2.5764390620963675e-08 +226.0,-2500.0,-4.719002966169228e-10 +227.0,-2500.0,-8.715250743307479e-12 +228.0,-2500.0,-2.7755575615628914e-13 +229.0,-2500.0,1.1102230246251565e-13 +230.0,-2500.0,0.0 +231.0,-2500.0,-1.0824674490095276e-13 +232.0,-2500.0,2.692290834715993e-13 +233.0,-2500.0,8.754108549166364e-12 +234.0,-2500.0,4.718919699353304e-10 +235.0,-2500.0,2.5764310103242154e-08 +236.0,-2500.0,1.4066897160477902e-06 +237.0,-2500.0,7.680241797893518e-05 +238.0,-2500.0,0.004192533096068925 +239.0,-2500.0,0.9641585416940721 +240.0,-2500.0,86.64339756999404 +241.0,-2500.0,502.26874098972735 +242.0,-2500.0,1000.0419257966093 +243.0,-2500.0,1500.000768024097 +244.0,-2500.0,2000.000014062176 +245.0,-2500.0,2499.999999999999 +246.0,-2500.0,2999.999985937824 +247.0,-2500.0,3499.9992319759026 +248.0,-2500.0,3999.9580976223315 +249.0,-2500.0,4330.150847081422 +250.0,-2500.0,4330.127018922199 +251.0,-2500.0,4330.127018922193 +252.0,-2500.0,4330.127018922193 +253.0,-2500.0,4330.127018922193 +254.0,-2500.0,4330.127018922193 +255.0,-2500.0,4330.127018922193 diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.tex new file mode 100644 index 00000000..072bbab7 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.tex @@ -0,0 +1,94 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] below left:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] above left:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_P_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex new file mode 100644 index 00000000..f6782305 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex @@ -0,0 +1,81 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \begin{axis} + [% + xlabel={Voltages (V)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% + grid=both,% + legend entries={Effective power,Non-smooth theoretical control},% + legend style={% + legend cell align=left,% + legend pos=north west,% + },% + sharp plot,% + mark size=0.5mm,% + height=9cm,% + width=16cm,% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==210}{% + "\\$\umin$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==220}{% + "\\$\udown$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==240}{% + "\\$\uup$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==250}{% + "\\$\umax$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + ] + \addplot+[only marks] table[x=v, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_Q_Example.csv};% + \addplot+ coordinates {(205,-5000) (210,-5000) (220,0) (240,0) (250,5000) (255,5000)};% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Example.csv b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Example.csv new file mode 100644 index 00000000..95733389 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-0.5000132304722589,-4999.999999742356 +206.0,-0.532061670101206,-4999.999985933104 +207.0,-2.771324820863182,-4999.999231975815 +208.0,-20.475746832553064,-4999.958074203388 +209.0,-150.60631697104301,-4997.731259010274 +210.0,-926.7830907809562,-4913.356602430007 +211.0,-2184.1748739974582,-4497.731259010274 +212.0,-2500.0000374699125,-3999.9580742033895 +213.0,-2500.0,-3499.999231975902 +214.0,-2500.0,-2999.999985937823 +215.0,-2500.0,-2500.0 +216.0,-2500.0,-2000.0000140621771 +217.0,-2500.0,-1500.0007680240985 +218.0,-2500.0,-1000.0419257966104 +219.0,-2500.0,-502.26874098972695 +220.0,-2500.0,-86.64339756999372 +221.0,-2500.0,-2.268740989725404 +222.0,-2500.0,-0.041925796612218846 +223.0,-2500.0,-0.0007680241859153725 +224.0,-2500.0,-1.4066895981379446e-05 +225.0,-2500.0,-2.5764390620963695e-07 +226.0,-2500.0,-4.719002966169228e-09 +227.0,-2500.0,-8.715250743307479e-11 +228.0,-2500.0,-2.7755575615628914e-12 +229.0,-2500.0,1.1102230246251565e-12 +230.0,-2500.0,0.0 +231.0,-2500.0,-1.0824674490095276e-12 +232.0,-2500.0,2.692290834715993e-12 +233.0,-2500.0,8.754108549166365e-11 +234.0,-2500.0,4.7189196993533036e-09 +235.0,-2500.0,2.576431010324217e-07 +236.0,-2500.0,1.4066897160515013e-05 +237.0,-2500.0,0.0007680241858286514 +238.0,-2500.0,0.041925796610847534 +239.0,-2500.0,2.26874098972511 +240.0,-2500.0,86.64339756999419 +241.0,-2500.0,502.26874098972735 +242.0,-2500.0,1000.0419257966093 +243.0,-2500.0,1500.000768024097 +244.0,-2500.0,2000.000014062176 +245.0,-2500.0,2499.999999999999 +246.0,-2500.0,2999.999985937824 +247.0,-2500.0,3499.9992319759026 +248.0,-2500.0000374699125,3999.9580742033904 +249.0,-2184.1748739974582,4497.731259010274 +250.0,-926.7830907809681,4913.356602430005 +251.0,-150.60631697104301,4997.731259010274 +252.0,-20.475746832824168,4999.958074203387 +253.0,-2.7713248238677637,4999.999231975813 +254.0,-0.5320616633668144,4999.999985933106 +255.0,-0.500013230187694,4999.999999742358 diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.tex new file mode 100644 index 00000000..aa1d2038 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.tex @@ -0,0 +1,94 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1, + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] below right:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] above right:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/Pconst_QU_Q_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Example.csv b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Example.csv new file mode 100644 index 00000000..69b85579 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2236.0679775382478,-4472.135954980351 +206.0,-2236.067979980322,-4472.135953759313 +207.0,-2236.068137494058,-4472.135875002441 +208.0,-2236.0782959651738,-4472.1307957520075 +209.0,-2236.7286604177757,-4471.805552533081 +210.0,-2266.1763700890097,-4456.954639622239 +211.0,-2428.9761116929394,-4370.36326279922 +212.0,-2500.0,-3999.9711591289265 +213.0,-2500.0,-3499.9995528024824 +214.0,-2500.0,-2999.9999930683607 +215.0,-2500.0,-2499.999999999993 +216.0,-2500.0,-2000.0000069316266 +217.0,-2500.0,-1500.0004471975176 +218.0,-2500.0,-1000.0288408710728 +219.0,-2500.0,-501.84618761732133 +220.0,-2500.0,-83.17766166719365 +221.0,-2500.0,-1.8461876173236913 +222.0,-2500.0,-0.028840871076507568 +223.0,-2500.0,-0.00044719752148036923 +224.0,-2500.0,-6.931630709416948e-06 +225.0,-2500.0,-6.222063389793264e-14 +226.0,-2500.0,6.93163158381857e-06 +227.0,-2500.0,0.000447197520726527 +228.0,-2500.0,0.0288408710766433 +229.0,-2500.0,1.846187617322751 +230.0,-2500.0,83.1776616671935 +231.0,-2500.0,501.8461876173226 +232.0,-2500.0,1000.0288408710736 +233.0,-2500.0,1500.0004471975176 +234.0,-2500.0,2000.0000069316252 +235.0,-2500.0,2499.999999999993 +236.0,-2500.0,2999.9999930683603 +237.0,-2500.0,3499.9995528024824 +238.0,-2500.0,3999.9711591289274 +239.0,-2428.9761116929385,4370.36326279922 +240.0,-2266.176370088993,4456.954639622248 +241.0,-2236.728660416862,4471.805552533539 +242.0,-2236.0782959152757,4472.130795776957 +243.0,-2236.0681347697605,4472.13587636459 +244.0,-2236.0678312387536,4472.136028130094 +245.0,-2236.059856693918,4472.140015393299 +246.0,-2235.625100721815,4472.357365978548 +247.0,-2213.2770547707137,4483.459008268669 +248.0,-1831.53905946031,4652.4686644480735 +249.0,-984.2745173321633,4902.16316277061 +250.0,-173.0958262224784,4994.816946155494 +251.0,-4.534130344163855,4996.535636675593 +252.0,-0.08378970712469609,4996.536664347264 +253.0,-0.0015349147105347424,4996.536664698182 +254.0,-2.8113029017036173e-05,4996.536664698299 +255.0,-5.149078683543149e-07,4996.536664698299 diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.tex new file mode 100644 index 00000000..f233c667 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.tex @@ -0,0 +1,102 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1,% + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] right:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] below:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/PmaxU_QU_Sequential_1_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Example.csv b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Example.csv new file mode 100644 index 00000000..b85b7aad --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2236.0679775919675,-4472.135954953491 +206.0,-2236.067982532515,-4472.135952483217 +207.0,-2236.068252276505,-4472.135817611212 +208.0,-2236.082977416831,-4472.128455009614 +209.0,-2236.879924830704,-4471.729889191584 +210.0,-2267.4462214926693,-4456.308745210392 +211.0,-2429.150449642832,-4370.266364078971 +212.0,-2500.0,-3999.9580742033895 +213.0,-2500.0,-3499.999231975902 +214.0,-2500.0,-2999.999985937823 +215.0,-2500.0,-2500.0 +216.0,-2500.0,-2000.0000140621771 +217.0,-2500.0,-1500.0007680240985 +218.0,-2500.0,-1000.0419257966104 +219.0,-2500.0,-502.26874098972695 +220.0,-2500.0,-86.64339756999372 +221.0,-2500.0,-2.268740989725404 +222.0,-2500.0,-0.041925796612218846 +223.0,-2500.0,-0.0007680241859153725 +224.0,-2500.0,-1.4066895981379446e-05 +225.0,-2500.0,-2.5764390620963695e-07 +226.0,-2500.0,-4.719002966169228e-09 +227.0,-2499.9999999999995,-8.715250743307479e-11 +228.0,-2499.999999999974,-2.7755575615628914e-12 +229.0,-2499.9999999983334,1.1102230246251565e-12 +230.0,-2499.9999998925073,0.0 +231.0,-2499.999993066702,-1.1102230246251565e-12 +232.0,-2499.999552802453,1.1102230246251565e-12 +233.0,-2499.9711591289492,1.1102230246251565e-12 +234.0,-2498.153812384344,0.0 +235.0,-2416.8223384402995,-1.1102230246251565e-12 +236.0,-1998.1538193159781,1.1657341758564144e-12 +237.0,-1499.971606326463,4.27435864480683e-12 +238.0,-1000.0283936735241,1.7175150190945182e-10 +239.0,-501.84618068402244,9.436729175681982e-09 +240.0,-83.17766155970074,5.152895327339173e-07 +241.0,-1.8461876156564139,2.813379315529586e-05 +242.0,-0.028840871050817007,0.0015360483651625176 +243.0,-0.00044719754704880543,0.08385159304994605 +244.0,-6.9332981023073614e-06,4.53748197001349 +245.0,-1.0749290346723228e-07,173.28679462469663 +246.0,-1.6669998714746725e-09,1004.5374538456617 +247.0,-2.609024107869118e-11,2000.0823155448559 +248.0,-5.551115123125783e-13,2999.917684455146 +249.0,-0.0,3995.46254615434 +250.0,-0.0,4826.713205375302 +251.0,-8.323850959092303e-13,4993.769666036564 +252.0,-0.0,4996.494563038826 +253.0,-0.0,4996.535896615463 +254.0,-8.320905096191371e-13,4996.536650631391 +255.0,-0.0,4996.536664440657 diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.tex new file mode 100644 index 00000000..6ed3e43a --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.tex @@ -0,0 +1,104 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1,% + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] below:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] below left:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {% + Load/FlexibleLoad/PmaxU_QU_Sequential_2_Example.csv% + };% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Example.csv b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Example.csv new file mode 100644 index 00000000..d8630953 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-3123.4752378702615,-3904.34404713664 +206.0,-3123.4752431303655,-3904.344042928556 +207.0,-3123.4755303214724,-3904.3438131756525 +208.0,-3123.4912078505167,-3904.3312710988703 +209.0,-3124.3395901559534,-3903.6524083714385 +210.0,-3156.7159632002063,-3877.517804946483 +211.0,-3322.7549000972035,-3736.2146450491878 +212.0,-3535.552434740721,-3535.5153770276493 +213.0,-3762.883831585663,-3292.52263014109 +214.0,-3997.2293351288868,-2997.921987294228 +215.0,-4000.0,-2500.0 +216.0,-4000.0,-2000.0000140621771 +217.0,-4000.0,-1500.0007680240985 +218.0,-4000.0,-1000.0419257966104 +219.0,-4000.0,-502.26874098972695 +220.0,-4000.0,-86.64339756999372 +221.0,-4000.0,-2.268740989725404 +222.0,-4000.0,-0.041925796612218846 +223.0,-4000.0,-0.0007680241859153725 +224.0,-4000.0,-1.4066895981379446e-05 +225.0,-4000.0,-2.5764390620963695e-07 +226.0,-4000.0,-4.719002966169228e-09 +227.0,-4000.0,-8.715250743307479e-11 +228.0,-4000.0,-2.7755575615628914e-12 +229.0,-4000.0,1.1102230246251565e-12 +230.0,-4000.0,0.0 +231.0,-4000.0,-1.0824674490095276e-12 +232.0,-4000.0,2.692290834715993e-12 +233.0,-4000.0,8.754108549166365e-11 +234.0,-3999.999999999998,4.7189196993533036e-09 +235.0,-3999.9999999999136,2.576431010324217e-07 +236.0,-3999.999999995281,1.4066897160515013e-05 +237.0,-3999.9999997423565,0.0007680241858286514 +238.0,-3999.9999859331037,0.041925796610847534 +239.0,-3999.9992319758153,2.26874098972511 +240.0,-3999.958074203388,86.64339756999419 +241.0,-3997.731259010274,502.26874098972735 +242.0,-3913.356602430009,1000.0419257966093 +243.0,-3497.73125901036,1500.000768024097 +244.0,-2999.9580742081066,2000.000014062176 +245.0,-2499.999232233459,2499.999999999999 +246.0,-2000.0,2999.999985937824 +247.0,-1500.0007677665405,3499.9992319759026 +248.0,-1000.041925791893,3999.9580742033904 +249.0,-502.2687409896398,4497.731259010274 +250.0,-86.64339756698323,4913.356602259406 +251.0,-2.2676257006015934,4995.274427072589 +252.0,-0.04189693115933036,4996.515657751498 +253.0,-0.0007674922580982291,4996.536280671605 +254.0,-1.4057152436597654e-05,4996.536657664851 +255.0,-2.5746611044154283e-07,4996.536664569479 diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.tex new file mode 100644 index 00000000..daf3208a --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.tex @@ -0,0 +1,113 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + extra x ticks={-4000},% + minor tick num=1,% + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-4}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + extra x tick label={% + \pgfmathparse{\tick/1000}% + $\pgfmathprintnumber{\pgfmathresult}$ + \pgfmathifthenelse{\tick==-4000}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] right:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] below right:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {% + Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Example.csv% + };% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Example.csv b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Example.csv new file mode 100644 index 00000000..14dacb5f --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2236.0679775919675,-4472.135954953491 +206.0,-2236.067982532515,-4472.135952483217 +207.0,-2236.068252276505,-4472.135817611212 +208.0,-2236.082977416831,-4472.128455009614 +209.0,-2236.879924830704,-4471.729889191584 +210.0,-2267.4462214926693,-4456.308745210392 +211.0,-2429.150449642832,-4370.266364078971 +212.0,-2500.0,-3999.9580742033895 +213.0,-2500.0,-3499.999231975902 +214.0,-2500.0,-2999.999985937823 +215.0,-2500.0,-2500.0 +216.0,-2500.0,-2000.0000140621771 +217.0,-2500.0,-1500.0007680240985 +218.0,-2500.0,-1000.0419257966104 +219.0,-2500.0,-502.26874098972695 +220.0,-2500.0,-86.64339756999372 +221.0,-2500.0,-2.268740989725404 +222.0,-2500.0,-0.041925796612218846 +223.0,-2500.0,-0.0007680241859153725 +224.0,-2500.0,-1.4066895981379446e-05 +225.0,-2500.0,-2.5764390620963695e-07 +226.0,-2500.0,-4.719002966169228e-09 +227.0,-2500.0,-8.715250743307479e-11 +228.0,-2500.0,-2.7755575615628914e-12 +229.0,-2500.0,1.1102230246251565e-12 +230.0,-2500.0,0.0 +231.0,-2500.0,-1.0824674490095276e-12 +232.0,-2500.0,2.692290834715993e-12 +233.0,-2500.0,8.754108549166365e-11 +234.0,-2500.0,4.7189196993533036e-09 +235.0,-2500.0,2.576431010324217e-07 +236.0,-2500.0,1.4066897160515013e-05 +237.0,-2499.999999999998,0.0007680241858286514 +238.0,-2499.9999999999136,0.041925796610847534 +239.0,-2499.999999995281,2.26874098972511 +240.0,-2499.9999997423556,86.64339756999419 +241.0,-2499.999985933104,502.26874098972735 +242.0,-2499.9992319758167,1000.0419257966093 +243.0,-2499.9580742034746,1500.000768024097 +244.0,-2497.7312590149927,2000.000014062176 +245.0,-2413.356602687651,2499.999999999999 +246.0,-1997.7312730771698,2999.999985937824 +247.0,-1499.9588422275729,3499.9992319759026 +248.0,-1000.0411577724275,3999.9580742033904 +249.0,-502.2687269228301,4497.731259010274 +250.0,-86.64339730934032,4913.356602259406 +251.0,-2.2676256958850214,4995.274427072589 +252.0,-0.041896931073236374,4996.515657751498 +253.0,-0.0007674922572661384,4996.536280671605 +254.0,-1.4057152880379259e-05,4996.536657664851 +255.0,-2.5746572213263946e-07,4996.536664569479 diff --git a/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.tex new file mode 100644 index 00000000..9d346a6c --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.tex @@ -0,0 +1,102 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + minor tick num=1,% + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==0}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5}{% + "$-S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==5}{% + "$S^{\max}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% + coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] right:{\mylabel}}},% + coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] above left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] above right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] below right:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/PmaxU_QU_Simultaneous_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex new file mode 100644 index 00000000..0051175c --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex @@ -0,0 +1,78 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \begin{axis} + [% + xlabel={Voltages (V)},% + x label style={at={(axis description cs:0.5,-0.15)},anchor=north},% + ylabel={Active power (W)},% + y label style={at={(axis description cs:-0.15,0.5)},anchor=south},% + grid=both,% + legend entries={Effective power,Non-smooth theoretical control},% + legend style={% + legend cell align=left,% + legend pos=north west,% + },% + sharp plot,% + mark size=0.5mm,% + height=9cm,% + width=16cm,% + ytick={-5000,-4000,-3000,-2000,-1000,0},% + extra y ticks={-2500},% + minor tick num=1,% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==240}{% + "\\$\uup$"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==250}{% + "\\$\umax$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + yticklabel={% + \pgfmathifthenelse{\tick==-5}{% + "$-\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + $\pgfmathprintnumber{\tick}$ + },% + extra y tick label={% + \pgfmathifthenelse{\tick==-2500}{% + "$P^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathifthenelse{\tick==-5000}{% + "$-\smax$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathparse{\tick/1000}% + $\pgfmathprintnumber{\pgfmathresult}$ + },% + ] + \addplot+[only marks] table[x=v, y=p, col sep=comma] {Load/FlexibleLoad/PmaxU_Qconst_Example.csv};% + \addplot+ coordinates {(205,-5000) (240,-5000) (250,0) (255,0)};% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Example.csv b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Example.csv new file mode 100644 index 00000000..d4a5f236 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Example.csv @@ -0,0 +1,52 @@ +v,p,q +205.0,-2500.0,1000.0 +206.0,-2500.0,1000.0 +207.0,-2500.0,1000.0 +208.0,-2500.0,1000.0 +209.0,-2500.0,1000.0 +210.0,-2500.0,1000.0 +211.0,-2500.0,1000.0 +212.0,-2500.0,1000.0 +213.0,-2500.0,1000.0 +214.0,-2500.0,1000.0 +215.0,-2500.0,1000.0 +216.0,-2500.0,1000.0 +217.0,-2500.0,1000.0 +218.0,-2500.0,1000.0 +219.0,-2500.0,1000.0 +220.0,-2500.0,1000.0 +221.0,-2500.0,1000.0 +222.0,-2500.0,1000.0 +223.0,-2500.0,1000.0 +224.0,-2500.0,1000.0 +225.0,-2500.0,1000.0 +226.0,-2500.0,1000.0 +227.0,-2500.0,1000.0 +228.0,-2500.0,1000.0 +229.0,-2500.0,1000.0 +230.0,-2500.0,1000.0 +231.0,-2500.0,1000.0 +232.0,-2500.0,1000.0 +233.0,-2500.0,1000.0 +234.0,-2500.0,1000.0 +235.0,-2500.0,1000.0 +236.0,-2500.0,1000.0 +237.0,-2499.999999999998,1000.0 +238.0,-2499.9999999999136,1000.0 +239.0,-2499.999999995281,1000.0 +240.0,-2499.9999997423556,1000.0 +241.0,-2499.999985933104,1000.0 +242.0,-2499.9992319758167,1000.0 +243.0,-2499.9580742034746,1000.0 +244.0,-2497.7312590149927,1000.0 +245.0,-2413.356602687651,1000.0 +246.0,-1997.7312730771698,1000.0 +247.0,-1499.9588422275729,1000.0 +248.0,-1000.0411577724275,1000.0 +249.0,-502.2687269228301,1000.0 +250.0,-86.64339731234871,1000.0 +251.0,-2.2687409850075113,1000.0 +252.0,-0.04192579652562145,1000.0 +253.0,-0.0007680241834173707,1000.0 +254.0,-1.4066896536490958e-05,1000.0 +255.0,-2.576441837653931e-07,1000.0 diff --git a/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.tex new file mode 100644 index 00000000..e00fbb87 --- /dev/null +++ b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.tex @@ -0,0 +1,96 @@ +\input{Preambule}% + +\usepackage{pgfplots}% +\pgfplotsset{compat=newest}% + +\begin{document} + \begin{tikzpicture}[% + show background rectangle,% + tight background,% + background rectangle/.style={fill=white}% + ] + \tikzset{% + pin style/.style={pin distance=1mm},% + }% + + \begin{axis} + [% + xlabel={Active power (W)},% + x label style={at={(axis description cs:0.5,-0.1)},anchor=north},% + ylabel={Reactive power (VAr)},% + y label style={at={(axis description cs:-0.2,0.5)},anchor=south},% + grid=both,% + scatter,% + only marks,% + mark size=0.5mm,% + height=9cm,% + width=9cm,% + axis equal=true,% + enlarge y limits,% + enlarge x limits,% + xmin=-5000,% + xmax=5000,% + ymin=-5000,% + ymax=5000,% + xtick={-5000,-2500,0,2500,5000},% + ytick={-5000,-2500,0,2500,5000},% + extra y ticks={1000},% + minor tick num=1,% + scaled x ticks=base 10:-3,% + every x tick scale label/.style={at={(axis description cs:1,-0.05)}},% + scaled y ticks=base 10:-3,% + xticklabel style={align=center},% + xticklabel={% + $\pgfmathprintnumber{\tick}$ + \pgfmathifthenelse{\tick==-2.5}{% + "\\$P^{\theo}$"% + }{""}% + \pgfmathresult% + },% + yticklabel style={align=center},% + extra y tick label={% + \pgfmathifthenelse{\tick==1000}{% + "$Q^{\theo}$\hspace{3mm}"% + }{""}% + \pgfmathresult% + \pgfmathparse{\tick/1000}% + $\pgfmathprintnumber{\pgfmathresult}$ + },% + colorbar,% + colorbar style={% + ylabel=Voltage (V),% + },% + nodes near coords*={},% By default, nothing + nodes near coords style={% + anchor=center,% + },% +% coordinate style/.condition={\thisrow{v}==205}{pin={[pin style] below right:{\mylabel}}},% +% coordinate style/.condition={\thisrow{v}==210}{pin={[pin style] below:\mylabel}},% +% coordinate style/.condition={\thisrow{v}==215}{pin={[pin style] right:\mylabel}},% +% coordinate style/.condition={\thisrow{v}==220}{pin={[pin style] below left:\mylabel}},% +% coordinate style/.condition={\thisrow{v}==225}{pin={[pin style] below right:\mylabel}},% +% coordinate style/.condition={\thisrow{v}==230}{pin={[pin style] right:\mylabel}},% + coordinate style/.condition={\thisrow{v}==235}{pin={[pin style] below:\mylabel}},% + coordinate style/.condition={\thisrow{v}==240}{pin={[pin style] left:\mylabel}},% + coordinate style/.condition={\thisrow{v}==245}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==250}{pin={[pin style] above:\mylabel}},% + coordinate style/.condition={\thisrow{v}==255}{pin={[pin style] below:\mylabel}},% + visualization depends on={\thisrow{v} \as \myvalue},% Required to use the "v" column for two usages + visualization depends on={% + value $\qty[parse-numbers=false]{\pgfmathprintnumber{\thisrow{v}}}{V}$\as\mylabel% + },% + ] + \addplot[point meta={\thisrow{v}}] table[x=p, y=q, col sep=comma] {Load/FlexibleLoad/PmaxU_Qconst_Example.csv};% + \draw[black] (axis cs:0,0) circle[radius=5000];% + \end{axis} + \end{tikzpicture} +\end{document} +% Local Variables: +% mode: latex +% TeX-engine: luatex +% TeX-source-correlate-method-active: synctex +% ispell-local-dictionary: "british" +% coding: utf-8 +% LaTeX-indent-level: 4 +% fill-column: 100 +% End: diff --git a/doc/images/Makefile b/doc/images/Makefile index 382627c3..3a293459 100644 --- a/doc/images/Makefile +++ b/doc/images/Makefile @@ -6,43 +6,42 @@ LUALATEX:=$(shell which lualatex) PDF2SVG:=$(shell which pdf2svg) # Folders +INPUT_FOLDER:=$(shell realpath .) OUTPUT_FOLDER:=$(shell realpath ../_static/) # Files -TEX_FILES:=$(filter-out Preambule.tex, $(wildcard *.tex) $(wildcard **/*.tex)) +TEX_FILES:=$(filter-out Preambule.tex, $(shell find . -name '*.tex' -type f | sed -r 's/^\.\///')) PDF_FILES:=$(TEX_FILES:%.tex=%.pdf) SVG_FILES:=$(TEX_FILES:%.tex=$(OUTPUT_FOLDER)/%.svg) -AUX_FILES:=$(TEX_FILES:%.tex=%.aux) $(wildcard $(OUTPUT_FOLDER)/*.aux) $(wildcard $(OUTPUT_FOLDER)/**/*.aux) -LOG_FILES:=$(TEX_FILES:%.tex=%.log) $(wildcard $(OUTPUT_FOLDER)/*.log) $(wildcard $(OUTPUT_FOLDER)/**/*.log) +AUX_FILES:=$(shell find $(OUTPUT_FOLDER) -name '*.aux' -type f | sed -r 's/^\.\///') +LOG_FILES:=$(shell find $(OUTPUT_FOLDER) -name '*.log' -type f | sed -r 's/^\.\///') # Rules -all: | checks $(SVG_FILES) .PHONY: clean cleanall checks -$(OUTPUT_FOLDER)/Domain_%.svg: Domain_%.tex Domain_Common.tikz Preambule.tex - @$(LUALATEX) --jobname=$(basename $<) --file-line-error --interaction=nonstopmode \ - --shell-escape --output-directory=$(OUTPUT_FOLDER) $< - -$(OUTPUT_FOLDER)/Transformer/Winding%.svg: Transformer/Winding%.tex Transformer/Windings_Common.tikz Preambule.tex - @$(LUALATEX) --jobname=$(basename $<) --file-line-error --interaction=nonstopmode \ - --shell-escape --output-directory=$(OUTPUT_FOLDER) $< +all: | checks $(SVG_FILES) +$(OUTPUT_FOLDER)/Domain_%.svg: $(INPUT_FOLDER)/Load/FlexibleLoad/Domain_%.tex $(INPUT_FOLDER)/Load/FlexibleLoad/Domain_Common.tikz Preambule.tex +$(OUTPUT_FOLDER)/Transformer/Winding%.svg: $(INPUT_FOLDER)/Transformer/Winding%.tex $(INPUT_FOLDER)/Transformer/Windings_Common.tikz Preambule.tex +$(OUTPUT_FOLDER)/Load/FlexibleLoad/%_Control_Curve_Example.svg: $(INPUT_FOLDER)/Load/FlexibleLoad/%_Control_Curve_Example.tex $(INPUT_FOLDER)/Load/FlexibleLoad/%_Example.csv Preambule.tex +$(OUTPUT_FOLDER)/Load/FlexibleLoad/%_Trajectory_Example.svg: $(INPUT_FOLDER)/Load/FlexibleLoad/%_Trajectory_Example.tex $(INPUT_FOLDER)/Load/FlexibleLoad/%_Example.csv Preambule.tex $(OUTPUT_FOLDER)/%.svg: %.tex Preambule.tex @$(LUALATEX) --jobname=$(basename $<) --file-line-error --interaction=nonstopmode \ --shell-escape --output-directory=$(OUTPUT_FOLDER) $< - clean: @rm -f $(AUX_FILES) $(LOG_FILES) $(PDF_FILES) *~ - @$(LATEXMK) -c -output-directory=$(OUTPUT_FOLDER) - @$(LATEXMK) -c + @for dir in $$(find $(INPUT_FOLDER) -type d); do \ + cd $$dir && $(LATEXMK) -c -output-directory=$(OUTPUT_FOLDER) && $(LATEXMK) -c && cd -; \ + done; cleanall: clean @rm -f $(SVG_FILES) - @$(LATEXMK) -C -output-directory=$(OUTPUT_FOLDER) - @$(LATEXMK) -C + @for dir in $$(find $(INPUT_FOLDER) -type d); do \ + cd $$dir && $(LATEXMK) -C -output-directory=$(OUTPUT_FOLDER) && $(LATEXMK) -C && cd -; \ + done; checks: @if [ -z "$(PDF2SVG)" ]; then \ diff --git a/doc/models/Load/FlexibleLoad.md b/doc/models/Load/FlexibleLoad.md deleted file mode 100644 index c25ceaf7..00000000 --- a/doc/models/Load/FlexibleLoad.md +++ /dev/null @@ -1,430 +0,0 @@ -# Flexible loads - -They are a special case of power loads: instead of being constant, the power will depend on the -voltage measured at the load and the control applied to the load. - -## Equations - -The equations are the following (star loads): - -```{math} -\left\{ - \begin{aligned} - \underline{I_{\mathrm{abc}}} &= \left(\frac{ - \underline{S_{\mathrm{abc}}}(\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}) - }{\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}}\right)^{\star} \\ - \underline{I_{\mathrm{n}}} &= -\sum_{p\in\{\mathrm{a},\mathrm{b},\mathrm{c}\}}\underline{I_{p}} - \end{aligned} -\right. -``` - -And the following (delta loads): - -```{math} -\left\{ - \begin{aligned} - \underline{I_{\mathrm{ab}}} &= \left(\frac{\underline{S_{\mathrm{ab}}}(\underline{V_{\mathrm{a}}}-\underline - {V_{\mathrm{b}}})}{\underline{V_{\mathrm{a}}}-\underline{V_{\mathrm{b}}}}\right)^{\star} \\ - \underline{I_{\mathrm{bc}}} &= \left(\frac{\underline{S_{\mathrm{bc}}}(\underline{V_{\mathrm{b}}}-\underline - {V_{\mathrm{c}}})}{\underline{V_{\mathrm{b}}}-\underline{V_{\mathrm{c}}}}\right)^{\star} \\ - \underline{I_{\mathrm{ca}}} &= \left(\frac{\underline{S_{\mathrm{ca}}}(\underline{V_{\mathrm{c}}}-\underline - {V_{\mathrm{a}}})}{\underline{V_{\mathrm{c}}}-\underline{V_{\mathrm{a}}}}\right)^{\star} - \end{aligned} -\right. -``` - -The expression $\underline{S}(U)$ depends on four parameters: - -- The theoretical power $\underline{S^{\mathrm{th.}}}$ that the load would have if no control is applied. -- The maximal power $S^{\max}$ that can be injected/consumed by the load. For a PV installation, this is - usually the rated power of the inverter. -- The type of control (see below). -- The type of projection (see below). - -(models-flexible_load-controls)= - -## Controls - -There are four available types of control. - -### Constant control - -No control is applied, this is equivalent to a classical power load. The constant control can be -built like this: - -```python -from roseau.load_flow import Control - -# Use the constructor. Note that the voltages are not important in this case. -control = Control(type="constant", u_min=0.0, u_down=0.0, u_up=0.0, u_max=0.0) - -# Or prefer using the shortcut -control = Control.constant() -``` - -(models-flexible_load-p_u_control)= - -### P(U) control - -Control the maximum active power of a load (often a PV inverter) based on the voltage $P^{\max}(U)$. - -```{note} -The functions $s_{\alpha}$ used for the P(U) controls are derived from the *soft clipping function* of -{cite:p}`Klimek_2020`. -``` - -#### Production - -With this control, the following soft clipping family of functions $s_{\alpha}(U)$ is used. The -default value of `alpha` is 1000. - -```{image} /_static/Control_PU_Prod.svg -:alt: P(U) production control -:width: 600 -:align: center -``` - -The final $P$ is then $P(U) = \max(s_{\alpha}(U) \times S^{\max}, P^{\mathrm{th.}})$ - -```python -from roseau.load_flow import Control, Q_ - -# Use the constructor. Note that u_min and u_down are useless with the production control -production_control = Control( - type="p_max_u_production", u_min=0, u_down=0, u_up=Q_(240, "V"), u_max=Q_(250, "V") -) - -# Or prefer the shortcut -production_control = Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")) -``` - -#### Consumption - -With this control, the following soft clipping family of functions $s_{\alpha}(U)$ is used. The -default value of `alpha` is 1000. - -```{image} /_static/Control_PU_Cons.svg -:alt: P(U) consumption control -:width: 600 -:align: center -``` - -The final $P$ is then $P(U) = \min(s_{\alpha}(U) \times S^{\max}, P^{\mathrm{th.}})$ - -```python -from roseau.load_flow import Control, Q_ - -# Use the constructor. Note that u_max and u_up are useless with the consumption control -consumption_control = Control( - type="p_max_u_consumption", u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=0, u_max=0 -) - -# Or prefer the shortcut -consumption_control = Control.p_max_u_consumption(u_min=Q_(210, "V"), u_down=Q_(220, "V")) -``` - -(models-flexible_load-q_u_control)= - -### Q(U) control - -Control the reactive power based on the voltage $Q(U)$. With this control, the following soft -clipping family of functions $s_{\alpha}(U)$ is used. The default value of `alpha` is 1000. - -```{image} /_static/Control_QU.svg -:alt: Q(U) control -:width: 600 -:align: center -``` - -The final $Q$ is then $Q(U) = s_{\alpha}(U) \times S^{\max}$ - -```{note} -The function $s_{\alpha}$ used for the Q(U) control is derived from the *soft clipping function* of -{cite:p}`Klimek_2020`. -``` - -```python -from roseau.load_flow import Control, Q_ - -# Use the constructor. Note that all the voltages are important. -control = Control( - type="q_u", - u_min=Q_(210, "V"), - u_down=Q_(220, "V"), - u_up=Q_(240, "V"), - u_max=Q_(250, "V"), -) - -# Or prefer the shortcut -control = Control.q_u( - u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") -) -``` - -(models-flexible_load-projection)= - -## Projection - -The different controls may produce values for $P$ and $Q$ that are not feasible. The feasibility -domain in the $(P, Q)$ space is a part of the circle of radius $S^{\max}$. In these cases, the -solution found by the control algorithm has to be projected on the feasible domain. That's why we -need to define how the projection is done. There are three available projection types: the -_Euclidean_ projection, the projection at _Constant $P$_ and the projection at _Constant $Q$_. - -The projection accepts two approximation parameters: `alpha` and `epsilon`. - -- `alpha` is used to compute soft sign function and soft projection function. The higher `alpha` - is, the better the approximations are. -- `epsilon` is used to approximate a smooth square root function: - ```{math} - \sqrt{S} = \sqrt{\varepsilon \times \exp\left(\frac{-{|S|}^2}{\varepsilon}\right) + {|S|}^2} - ``` - The lower `epsilon` is, the better the approximations are. - -### Euclidean projection - -A Euclidean projection on the feasible domain. This is the default value for projections when it is -not specified. - -```{image} /_static/Euclidean_Projection.svg -:width: 300 -:align: center -``` - -```python -from roseau.load_flow import Projection - -projection = Projection(type="euclidean") # alpha and epsilon can be provided -``` - -### Constant $P$ - -Keep the value of $P$ computed by the control and project $Q$ on the feasible domain. - -```{image} /_static/Constant_P_Projection.svg -:width: 300 -:align: center -``` - -```python -from roseau.load_flow import Projection - -projection = Projection(type="keep_p") # alpha and epsilon can be provided -``` - -### Constant $Q$ - -Keep the value of $Q$ computed by the control and project $P$ on the feasible domain. - -```{image} /_static/Constant_Q_Projection.svg -:width: 300 -:align: center -``` - -```python -from roseau.load_flow import Projection - -projection = Projection(type="keep_q") # alpha and epsilon can be provided -``` - -(models-flexible_load-flexible_parameters)= - -## Flexible parameters - -A flexible parameter is a combination of a control on the active power, a control on the reactive -power, a projection and a maximal apparent power for one phase. - -### Example - -Here, we define a flexible parameter with: - -- a constant control on $P$ (meaning, no control), -- a control $Q(U)$ on $Q$, -- a projection which keeps $P$ constant, -- an $S^{\max}$ of 5 kVA. - -```python -from roseau.load_flow import FlexibleParameter, Control, Projection, Q_ - -fp = FlexibleParameter( - control_p=Control.constant(), - control_q=Control.q_u( - u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") - ), - projection=Projection(type="keep_p"), - s_max=Q_(5, "kVA"), -) -``` - -### Usage - -To create a flexible load, create a `PowerLoad` passing it a list of `FlexibleParameter` objects -using the `flexible_params` parameter, one for each phase of the load. - -#### Scenario 1: Same $Q(U)$ control on all phases - -In this scenario, we apply the same $Q(U)$ control on the three phases of a load. We define a -flexible parameter with constant $P$ control and use it three times in the load constructor. - -```python -import numpy as np - -from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus - -bus = Bus(id="bus", phases="abcn") - -# Create a flexible parameter object -fp = FlexibleParameter( - control_p=Control.constant(), - control_q=Control.q_u( - u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") - ), - projection=Projection(type="keep_p"), - s_max=Q_(5, "kVA"), -) - -# Use it for the three phases of the load -load = PowerLoad( - id="load", - bus=bus, - powers=Q_(np.array([1000, 1000, 1000]) * (1 - 0.3j), "VA"), - flexible_params=[fp, fp, fp], # <- this makes the load "flexible" -) -``` - -The created load is a three-phase star-connected load as the phases inherited from the bus include -`"n"`. The `powers` parameter of the `PowerLoad` constructor represents the theoretical powers of -the three phases of the load. The load is flexible on its three phases with the same flexible -parameters. - -#### Scenario 2: Different controls on different phases - -In this scenario, we create a load with only two phases and a neutral connected to a three-phase -bus with a neutral. Two different controls are applied by the load on the two phases. - -```python -import numpy as np - -from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus - -bus = Bus(id="bus", phases="abcn") - -# Create a first flexible parameter (Q(U) control) -fp1 = FlexibleParameter( - control_p=Control.constant(), - control_q=Control.q_u( - u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") - ), - projection=Projection(type="keep_p"), - s_max=Q_(5, "kVA"), -) - -# Create a second flexible parameter (P(U) control) -fp2 = FlexibleParameter( - control_p=Control.p_max_u_consumption(u_min=Q_(210, "V"), u_down=Q_(220, "V")), - control_q=Control.constant(), - projection=Projection(type="euclidean"), - s_max=Q_(3, "kVA"), -) - -# Use them in a load -load = PowerLoad( - id="load", - bus=bus, - phases="abn", - powers=Q_(np.array([1000, 1000]) * (1 - 0.3j), "VA"), - flexible_params=[fp1, fp2], -) -``` - -The first element of the load is connected between phase "a" and "n" of the bus. Its control is a -$Q(U)$ control with a projection at constant $P$ and an $S^{\max}$ of 5 kVA. - -The second element of the load is connected between phase "b" and "n" of the bus. Its control is a -$P(U)$ control with an Euclidean projection and an $S^{\max}$ of 3 kVA. - -#### Scenario 3: PQ(U) control - -Finally, it is possible to combine $P(U)$ and $Q(U)$ controls, for example by first using all -available reactive power before reducing the active power in order to limit the impact for the -client. - -```python -import numpy as np - -from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus - -bus = Bus(id="bus", phases="abc") - -# Create a flexible parameter -fp = FlexibleParameter( - control_p=Control.p_max_u_production(u_up=Q_(245, "V"), u_max=Q_(250, "V")), - control_q=Control.q_u( - u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(245, "V") - ), - projection=Projection(type="euclidean"), - s_max=Q_(5, "kVA"), -) - -# Or using the shortcut -fp = FlexibleParameter.pq_u_production( - up_up=Q_(245, "V"), - up_max=Q_(250, "V"), - uq_min=Q_(210, "V"), - uq_down=Q_(220, "V"), - uq_up=Q_(240, "V"), - uq_max=Q_(245, "V"), - s_max=Q_(5, "kVA"), -) - -# Use it in a load -load = PowerLoad( - id="load", - bus=bus, - powers=Q_(-np.array([1000, 1000, 1000]), "VA"), - flexible_params=[fp, fp, fp], -) -``` - -In this example, the same flexible parameter is used to control all phases of the three-phase -delta-connected load. In the flexible parameter, one can remark that the $Q(U)$ control on high -voltages triggers at 240 V (production) and reaches its maximum at 245 V. The $P(U)$ control -however triggers at 245 V and is maxed out at 250 V. - -Using this configuration, a _sequential PQ(U) control_ has been created for this load. A -_simultaneous PQ(U) control_ could have been defined by using the same voltage thresholds for both -controls. - -## Feasible domains - -Depending on the mix of controls and projection used through this class, the feasible domains in -the $(P, Q)$ space changes. Here is an illustration with a theoretical production power -($P^{\mathrm{th.}} < 0$). - -```{list-table} -:class: borderless -:header-rows: 1 -:widths: 20 20 20 20 20 - -* - - - $Q^{\mathrm{const.}}$ - - $Q(U)$ with an Euclidean projection - - $Q(U)$ with a constant P projection - - $Q(U)$ with a constant Q projection -* - $P^{\mathrm{const.}}$ - - ![image](/_static/Domain_Pconst_Qconst.svg) - - ![image](/_static/Domain_Pconst_QU_Eucl.svg) - - ![image](/_static/Domain_Pconst_QU_P.svg) - - ![image](/_static/Domain_Pconst_QU_Q.svg) -* - $P^{\max}(U)$ - - ![image](/_static/Domain_PmaxU_Qconst.svg) - - ![image](/_static/Domain_PmaxU_QU.svg) - - ![image](/_static/Domain_PmaxU_QU.svg) - - ![image](/_static/Domain_PmaxU_QU.svg) -``` - -## Bibliography - -```{bibliography} -:filter: docname in docnames -``` diff --git a/doc/models/Load/FlexibleLoad/Control.md b/doc/models/Load/FlexibleLoad/Control.md new file mode 100644 index 00000000..e8d2d99d --- /dev/null +++ b/doc/models/Load/FlexibleLoad/Control.md @@ -0,0 +1,131 @@ +(models-flexible_load-controls)= + +# Controls + +There are four available types of control. + +## Constant control + +No control is applied, this is equivalent to a classical power load. The constant control can be +built like this: + +```python +from roseau.load_flow import Control + +# Use the constructor. Note that the voltages are not important in this case. +control = Control(type="constant", u_min=0.0, u_down=0.0, u_up=0.0, u_max=0.0) + +# Or prefer using the shortcut +control = Control.constant() +``` + +(models-flexible_load-p_u_control)= + +## $P(U)$ control + +Control the maximum active power of a load (often a PV inverter) based on the voltage $P^{\max}(U)$. + +```{note} +The functions $s_{\alpha}$ used for the $P(U)$ controls are derived from the *soft clipping function* of +{cite:p}`Klimek_2020`. +``` + +### Production + +With this control, the following soft clipping family of functions $s_{\alpha}(U)$ is used. The default value of +`alpha` is 1000. + +```{image} /_static/Load/FlexibleLoad/Control_PU_Prod.svg +:alt: P(U) production control +:width: 600 +:align: center +``` + +The final $P$ is then $P(U) = \max(s_{\alpha}(U) \times S^{\max}, P^{\mathrm{th.}})$. Note that this final +$\underline{S(U)}$ point may lie outside the disc of radius $S^{\max}$ in the $(P, Q)$ plane. See the +[Projection page](models-flexible_load-projections) for more details about this case. + +```python +from roseau.load_flow import Control, Q_ + +# Use the constructor. Note that u_min and u_down are useless with the production control +production_control = Control( + type="p_max_u_production", u_min=0, u_down=0, u_up=Q_(240, "V"), u_max=Q_(250, "V") +) + +# Or prefer the shortcut +production_control = Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")) +``` + +### Consumption + +With this control, the following soft clipping family of functions $s_{\alpha}(U)$ is used. The default value of +`alpha` is 1000. + +```{image} /_static/Load/FlexibleLoad/Control_PU_Cons.svg +:alt: P(U) consumption control +:width: 600 +:align: center +``` + +The final $P$ is then $P(U) = \min(s_{\alpha}(U) \times S^{\max}, P^{\mathrm{th.}})$. Note that this final +$\underline{S(U)}$ point may lie outside the disc of radius $S^{\max}$ in the $(P, Q)$ plane. See the +[Projection page](models-flexible_load-projections) for more details about this case. + +```python +from roseau.load_flow import Control, Q_ + +# Use the constructor. Note that u_max and u_up are useless with the consumption control +consumption_control = Control( + type="p_max_u_consumption", u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=0, u_max=0 +) + +# Or prefer the shortcut +consumption_control = Control.p_max_u_consumption(u_min=Q_(210, "V"), u_down=Q_(220, "V")) +``` + +(models-flexible_load-q_u_control)= + +## $Q(U)$ control + +Control the reactive power based on the voltage $Q(U)$. With this control, the following soft clipping family of +functions $s_{\alpha}(U)$ is used. The default value of `alpha` is 1000. + +```{image} /_static/Load/FlexibleLoad/Control_QU.svg +:alt: Q(U) control +:width: 600 +:align: center +``` + +The final $Q$ is then $Q(U) = s_{\alpha}(U) \times S^{\max}$. Note that this final $\underline{S(U)}$ point +may lie outside the disc of radius $S^{\max}$ in the $(P, Q)$ plane. See the +[Projection page](models-flexible_load-projections) for more details about this case. + +```{note} +The function $s_{\alpha}$ used for the $Q(U)$ control is derived from the *soft clipping function* of +{cite:p}`Klimek_2020`. +``` + +```python +from roseau.load_flow import Control, Q_ + +# Use the constructor. Note that all the voltages are important. +control = Control( + type="q_u", + u_min=Q_(210, "V"), + u_down=Q_(220, "V"), + u_up=Q_(240, "V"), + u_max=Q_(250, "V"), +) + +# Or prefer the shortcut +control = Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") +) +``` + +## Bibliography + +```{bibliography} +:filter: docname in docnames +``` diff --git a/doc/models/Load/FlexibleLoad/FeasibleDomain.md b/doc/models/Load/FlexibleLoad/FeasibleDomain.md new file mode 100644 index 00000000..dc612498 --- /dev/null +++ b/doc/models/Load/FlexibleLoad/FeasibleDomain.md @@ -0,0 +1,828 @@ +(models-flexible_load-feasible_domains)= + +# Feasible domains + +Depending on the mix of controls and projection used through the class `FlexibleParameter`, the feasible domains in +the $(P, Q)$ space changes. + +```{note} +On this page, all the images are drawn for a producer so $P^{\text{th.}}\leqslant0$. +``` + +## Everything constant + +If there is no control at all, i.e. the `flexible_params` argument is **not** given to the `PowerLoad` constructor or +`constant` control used for both active and reactive powers, the consumed (or produced) power will be the one +provided by the user, noted $\underline{S^{\mathrm{th.}}}=P^{\mathrm{th.}}+jQ^{\mathrm{th.}}$. The feasible domain +is reduced to a single point as depicted in the figure below. + +```{image} /_static/Load/FlexibleLoad/Domain_Pconst_Qconst.svg +:width: 300 +:align: center +``` + +Here is a small example of usage of the constant control for active and reactive powers. + +```python +import numpy as np + +from roseau.load_flow import ( + PowerLoad, + Bus, + Q_, + FlexibleParameter, + Control, + Projection, + VoltageSource, + ElectricalNetwork, + PotentialRef, +) + +# A voltage source +bus = Bus(id="bus", phases="abcn") +un = 400 / np.sqrt(3) +voltages = Q_(un * np.exp([0, -2j * np.pi / 3, 2j * np.pi / 3]), "V") +vs = VoltageSource(id="source", bus=bus, voltages=voltages) + +# A potential ref +pref = PotentialRef("pref", element=bus, phase="n") + +# No flexible params +load = PowerLoad( + id="load", + bus=bus, + powers=Q_(np.array([1000, 1000, 1000]), "VA"), +) + +# Build a network and solve a load flow +en = ElectricalNetwork.from_element(bus) +auth = ("username", "password") +en.solve_load_flow(auth=auth) + +# The voltage source provided 1 kVA per phase for the load +vs.res_powers +# array( +# [-1000.-0.00000000e+00j, -1000.+1.93045819e-14j, -1000.-1.93045819e-14j, 0.+0.00000000e+00j] +# ) + +# Disconnect the load +load.disconnect() + +# Constant flexible params +# The projection is useless as there are only constant controls +# The s_max is useless as there are only constant controls +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.constant(), + projection=Projection(type="euclidean"), + s_max=Q_(5, "kVA"), +) + +# For each phase, the provided `powers` are lower than 5 kVA. +load = PowerLoad( + id="load", + bus=bus, + powers=Q_(np.array([1000, 1000, 1000]), "VA"), + flexible_params=[fp, fp, fp], +) +en.solve_load_flow(auth=auth) + +# Again the voltage source provided 1 kVA per phase +vs.res_powers +# array( +# [-1000.-0.00000000e+00j, -1000.+1.93045819e-14j, -1000.-1.93045819e-14j, 0.+0.00000000e+00j] +# ) + +# Disconnect the load +load.disconnect() + +# For some phases, the provided `powers` are greater than 5 kVA. The projection is still useless. +load = PowerLoad( + id="load", + bus=bus, + powers=Q_(np.array([6, 4.5, 6]), "kVA"), # Above 5 kVA -> also OK! + flexible_params=[fp, fp, fp], +) +en.solve_load_flow(auth=auth) + +# The load provides exactly the power consumed by the load even if it is greater than s_max +vs.res_powers +# array( +# [-6000.-0.00000000e+00j, -4500.-3.01980663e-14j, -6000.-2.18385501e-13j, 0.+0.00000000e+00j] +# ) +``` + +## Active power control only + +When the reactive power is constant, only the active power may be modulated by the local voltage. Thus, the active +power may vary between 0 and $P^{\mathrm{th.}}$ (if the load is a consumer i.e. $P^{\mathrm{th.}}\geqslant 0$) or +between $P^{\mathrm{th.}}$ and 0 (if the load is a producer i.e. $P^{\mathrm{th.}}\leqslant0$). + +When a control is activated for a load, the theoretical power can not be outside the disc of radius $S^{\max}$. Here +is a small example of such error: + +```python +import numpy as np + +from roseau.load_flow import PowerLoad, Bus, Q_, FlexibleParameter, Control, Projection + +bus = Bus(id="bus", phases="an") + +# Flexible load +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")), + control_q=Control.constant(), + projection=Projection(type="keep_p"), + s_max=Q_(5, "kVA"), +) + +# Raises an error! +load = PowerLoad( + id="load", + bus=bus, + powers=Q_( + np.array([-5 + 5j], dtype=complex), "kVA" + ), # Point outside the circle of radius s_max + flexible_params=[fp], +) +# RoseauLoadFlowException: The power is greater than the parameter s_max +# for flexible load "load" [bad_s_value] +``` + +Thus, the given $\underline{S^{\text{th.}}}=P^{\text{th.}}+jQ^{\text{th.}}$ lies in the disk of radius $S^{\max}$. +The resulting flexible power is the minimum absolute value between, on the one hand, the active power control function +(which takes values between 0 and 1) multiplied by $S^{\max}$ and, on the other hand, $P^{\mathrm{th.}}$. +As a consequence, the resulting power lies in the segment between the points $(0, Q^{\text{th.}})$ and +$(P^{\text{th.}}, Q^{\text{th.}})$. + +```{important} +The projection is useless when there is only an active power control as no point can lie outside the disc of radius +$S^{\max}$. +``` + +This domain of feasible points is depicted in the figure below: + +```{image} /_static/Load/FlexibleLoad/Domain_PmaxU_Qconst.svg +:width: 300 +:align: center +``` + +In the `FlexibleParameter` class, there is a method `compute_powers` which allows to compute the resulting voltages +powers + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# A flexible parameter +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")), + control_q=Control.constant(), + projection=Projection(type="keep_p"), # <----- No consequence + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5 + 1j, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +Plotting the control curve $P(U)$ using the variables `voltages` and `res_flexible_powers` of the script above leads to +the following plot: + +```{image} /_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg +:width: 700 +:align: center +``` + +The non-smooth theoretical control function is the control function applied to $S^{\max}$. The effective power has been +plotted using the powers really produced by the load. Below 240 V, there is no variation in the produced power which is +expected. Between 240 V and approximately 245 V, there is no reduction of the produced power because the curtailment +factor (computed from the voltage) times $S^{\max}$ is lower than $P^{\mathrm{th.}}$. As a consequence, +$P^{\mathrm{th.}}$ is produced. Starting at approximately 245 V, the comparison changes and the really produced +power starts to decrease. It reaches 0 W above 250 V. + +The same plot can be obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax, res_flexible_powers = fp.plot_control_p( + auth=auth, voltages=voltages, power=power, res_flexible_powers=res_flexible_powers +) +plt.show() +``` + +In the above example, `res_flexible_powers` is provided as input. It could have been forgotten, and the flexible +powers would have been computed by requesting the server. The computed values are retrieved with the axis on which +the plot was drawn. + +`````{tip} +To install matplotlib along side with roseau-load-flow, you can type + +````{tab} Linux +```console +$ python -m pip install roseau-load-flow[plot] +``` +```` + +````{tab} Windows +Matplotlib is always installed when `conda` is used. +```` + +````` + +If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg +:width: 700 +:align: center +``` + +All the points have been plotted (1 per volt between 205 V and 255 V). A lot of points are overlapping. + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [240, 250]), + ax=ax, +) +plt.show() +``` + +## Reactive power control only + +When the active power is constant, only the reactive power may be modulated by the local voltage. Thus, the reactive +power may vary between $-S^{\max}$ and $+S^{\max}$. In this segment, there are points outside the disc of radius +$S^{\max}$ (when $P^{\mathrm{th.}}\neq 0$). Those points are projected on the circle of radius $S^{\max}$ and +depending on the projection, the feasible domains change. + +### Constant $P$ + +If the _constant $P$_ (`keep_p`) projection is chosen, the feasible domain is limited to a segment as defined below. + +```{image} /_static/Load/FlexibleLoad/Domain_Pconst_QU_P.svg +:width: 300 +:align: center +``` + +Here is an example of a reactive power control (without active power control) flexible parameter creation: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="keep_p"), # <---- Keep P + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +the flexible load for the voltages stored in the variable named `voltages`. + +Plotting the control curve $Q(U)$ lead to the following plot: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg +:width: 700 +:align: center +``` + +One can remark that, even with a voltage lower than $U^{\min}$ or greater than $U^{\max}$ the available reactive +power (by default taken in the interval $[-S^{\max}, S^{\max}]$) was never totally used because of the choice of the +projection. + +The same plot can be obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_control_q( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + ax=ax, +) +plt.show() +``` + +If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg +:width: 700 +:align: center +``` + +As in the previous plot, there is one point per volt from 205 V to 255 V. Several remarks on this plot: + +1. All the points are aligned on the straight line $P=-2.5$ kVA because it was the power provided to the flexible + load and because the projection used was at _Constant P_. +2. One can remark that several points are overlapping for low and high voltages. For these extremities, the + theoretical control curves would have forced the point of operation to be outside the disc of radius $S^{\max}$ (5 + kVA in the example). + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +### Constant $Q$ + +If the _constant $Q$_ (`keep_q`) projection is chosen, the feasible domain is limited to a segment with two arcs as +defined below. + +```{image} /_static/Load/FlexibleLoad/Domain_Pconst_QU_Q.svg +:width: 300 +:align: center +``` + +```{warning} +Note that using this projection with a constant active power may result in a final active power lower than the one +provided (even 0 W in the worst cases)! +``` + +Here is an example the creattion of such control with a constant $Q$ projection: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="keep_q"), # <---- Keep Q + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +the flexible load for the voltages stored in the variable named `voltages`. + +Plotting the control curve $Q(U)$ leads to the following plot: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg +:width: 700 +:align: center +``` + +Here, the complete possible range of reactive power was used. Nevertheless, it was achieved with some active power +reduction because of the projection. + +The same plot can be obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_control_q( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + ax=ax, +) +plt.show() +``` + +If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg +:width: 700 +:align: center +``` + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +One can remark that when the voltages were too low or too high, the projection at constant $Q$ forces us to reduce +the produced active power to ensure a feasible point i.e. a point which is in the disc of radius $S^{\max}$. As +before, there is one point per volt. Several points of operation are overlapping near the coordinates (0,5 kVA) and +(0, -5 kVA). + +### Euclidean projection + +If the _Euclidean_ (`euclidean`) projection is chosen, the feasible domain is limited to a segment with two +small arcs as defined below. + +```{image} /_static/Load/FlexibleLoad/Domain_Pconst_QU_Eucl.svg +:width: 300 +:align: center +``` + +```{warning} +Note that using this projection with a constant active power may result in a final active power lower than the one +provided! +``` + +Here is an example of this usage with a single phase network limited to a single bus: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="euclidean"), # <---- Euclidean + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +the flexible load for the voltages stored in the variable named `voltages`. + +Plotting the control curve $Q(U)$ lead to the following plot: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg +:width: 700 +:align: center +``` + +Here, again the complete reactive power range is not fully used. + +The same plot can be obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_control_q( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + ax=ax, +) +plt.show() +``` + +If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg +:width: 700 +:align: center +``` + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +One can remark that when the voltages were too low or too high, the Euclidean projection forces us to +reduce the produced active power and the (produced and consumed) reactive power to ensure a feasible point i.e. a point +which is in the disc of radius $S^{\max}$. As before, there is one point per volt thus one can remark that several +points of operation are overlapping. + +## Both active and reactive powers control + +When both active and reactive powers are activated, the feasible domains is the following: + +```{image} /_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg +:width: 300 +:align: center +``` + +Every point whose abscissa is between $P^{\mathrm{th.}}$ and 0, whose ordinate is between $-S^{\max}$ and $+S^{\max}$ +and which lies in the disc of radius $S^{\max}$ is reachable. Let's look at two examples: in the first one, the +controls are activated sequentially (reactive power first and then active power) and, in the other example, there +are used together. + +### Sequentially activated controls + +Let's play with the voltage thresholds of the control in order to fully activate a first control and then starts to +activate the second. + +#### Reactive power control first + +In this section, the reactive power control is activated at 230 V and fully used above 240 V. Then, at 245 V, the +active control power starts and is fully activated at 250 V. + +In the following script such control is used on a network with a single-phase load connected to a single bus: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(245, "V"), u_max=Q_(250, "V")), # <---- + control_q=Control.q_u( + u_min=Q_(210, "V"), + u_down=Q_(220, "V"), + u_up=Q_(230, "V"), # <---- + u_max=Q_(240, "V"), # <---- + ), + projection=Projection(type="euclidean"), # <---- Euclidean + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg +:width: 700 +:align: center +``` + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as +depicted in the previous dedicated section and the choice of the projection may change the operation points for the +lowest voltages. + +When the voltage is high, there are two phases: + +1. Between 230 V and 240 V, only the reactive power decreases to reach the symmetrical point (with respect to the + x-axis) of the 205 V operation point. +2. Between 245 V and 250 V, the active power control reduces the active power to reach 0 W above 250 V. + +#### Active power control first + +In this section, the active power control is activated at 240 V and fully used above 245 V. Then, at 245 V, the +reactive control power starts and is fully activated at 250 V. + +In the following script such control is used on a network with a single-phase load connected to a single bus: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(230, "V"), u_max=Q_(240, "V")), # <---- + control_q=Control.q_u( + u_min=Q_(210, "V"), + u_down=Q_(220, "V"), + u_up=Q_(245, "V"), # <---- + u_max=Q_(250, "V"), # <---- + ), + projection=Projection(type="euclidean"), # <---- Euclidean + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg +:width: 700 +:align: center +``` + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as +depicted in the previous dedicated section and the choice of the projection may change the operation points for the +lowest voltages. + +When the voltage is high, there are two phases: + +1. Between 230 V and 240 V, only the active power decreases to reach a production of nearly 0 W. +2. Between 245 V and 250 V, the reactive power control increased the consumed the reactive power at 250 V. + +### Simultaneously activated controls + +In this second subsection, the active and the reactive powers controls are activated at 240 V and reach their full +effect at 250 V. + +Here is a small single phase network limited to a single bus to model the behaviour of the flexible load: + +```python +import numpy as np + +from roseau.load_flow import Q_, FlexibleParameter, Control, Projection + +# Flexible parameter +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")), # <---- + control_q=Control.q_u( + u_min=Q_(210, "V"), + u_down=Q_(220, "V"), + u_up=Q_(240, "V"), # <---- + u_max=Q_(250, "V"), # <---- + ), + projection=Projection(type="euclidean"), # <---- Euclidean + s_max=Q_(5, "kVA"), +) + +# We want to get the res_flexible_powers for a set of voltages norms +voltages = np.array(range(205, 256, 1), dtype=float) + +# and when the theoretical power is the following +power = Q_(-2.5, "kVA") + +# Get the resulting flexible powers for the given theoretical power and voltages list. +auth = ("username", "password") +res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) +``` + +If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: + +```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg +:width: 700 +:align: center +``` + +The same plot could have been obtained using the following command: + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as +depicted in the previous dedicated section and the choice of the projection may change the operation points for the +lowest voltages. + +When the voltage is high, there are two phases: + +1. Between 240 V and 245 V, the active power control doesn't modify the value of the produced active power while the + reactive power control starts to increase the consumed reactive power. +2. Between 245 V and 250 V, the active power control starts to have effects on the produced active power. The + consumed reactive power continues to increase. +3. Above 250 V, no active power is produced. + +If now, the theoretical power is changed to 4 kVA of production. + +```python +from matplotlib import pyplot as plt + +ax = plt.subplot() # New axes +ax, res_flexible_powers = fp.plot_pq( + auth=auth, + voltages=voltages, + power=Q_(-4, "kVA"), # <------ New power + # res_flexible_powers=res_flexible_powers, # Must be computed again! + voltages_labels_mask=np.isin(voltages, [210, 215, 230, 245, 250]), + ax=ax, +) +plt.show() +``` + +The following result is obtained: + +```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg +:width: 700 +:align: center +``` diff --git a/doc/models/Load/FlexibleLoad/FlexibleParameter.md b/doc/models/Load/FlexibleLoad/FlexibleParameter.md new file mode 100644 index 00000000..be3c5c3c --- /dev/null +++ b/doc/models/Load/FlexibleLoad/FlexibleParameter.md @@ -0,0 +1,167 @@ +(models-flexible_load-flexible_parameters)= + +# Flexible parameters + +A flexible parameter is a combination of a control on the active power, a control on the reactive +power, a projection and a maximal apparent power for one phase. + +## Example + +Here, we define a flexible parameter with: + +- a constant control on $P$ (meaning, no control), +- a control $Q(U)$ on $Q$, +- a projection which keeps $P$ constant, +- an $S^{\max}$ of 5 kVA. + +```python +from roseau.load_flow import FlexibleParameter, Control, Projection, Q_ + +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="keep_p"), + s_max=Q_(5, "kVA"), +) +``` + +## Usage + +To create a flexible load, create a `PowerLoad` passing it a list of `FlexibleParameter` objects +using the `flexible_params` parameter, one for each phase of the load. + +### Scenario 1: Same $Q(U)$ control on all phases + +In this scenario, we apply the same $Q(U)$ control on the three phases of a load. We define a +flexible parameter with constant $P$ control and use it three times in the load constructor. + +```python +import numpy as np + +from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus + +bus = Bus(id="bus", phases="abcn") + +# Create a flexible parameter object +fp = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="keep_p"), + s_max=Q_(5, "kVA"), +) + +# Use it for the three phases of the load +load = PowerLoad( + id="load", + bus=bus, + powers=Q_(np.array([1000, 1000, 1000]) * (1 - 0.3j), "VA"), + flexible_params=[fp, fp, fp], # <- this makes the load "flexible" +) +``` + +The created load is a three-phase star-connected load as the phases inherited from the bus include +`"n"`. The `powers` parameter of the `PowerLoad` constructor represents the theoretical powers of +the three phases of the load. The load is flexible on its three phases with the same flexible +parameters. + +### Scenario 2: Different controls on different phases + +In this scenario, we create a load with only two phases and a neutral connected to a three-phase +bus with a neutral. Two different controls are applied by the load on the two phases. + +```python +import numpy as np + +from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus + +bus = Bus(id="bus", phases="abcn") + +# Create a first flexible parameter (Q(U) control) +fp1 = FlexibleParameter( + control_p=Control.constant(), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V") + ), + projection=Projection(type="keep_p"), + s_max=Q_(5, "kVA"), +) + +# Create a second flexible parameter (P(U) control) +fp2 = FlexibleParameter( + control_p=Control.p_max_u_consumption(u_min=Q_(210, "V"), u_down=Q_(220, "V")), + control_q=Control.constant(), + projection=Projection(type="euclidean"), + s_max=Q_(3, "kVA"), +) + +# Use them in a load +load = PowerLoad( + id="load", + bus=bus, + phases="abn", + powers=Q_(np.array([1000, 1000]) * (1 - 0.3j), "VA"), + flexible_params=[fp1, fp2], +) +``` + +The first element of the load is connected between phase "a" and "n" of the bus. Its control is a +$Q(U)$ control with a projection at constant $P$ and an $S^{\max}$ of 5 kVA. + +The second element of the load is connected between phase "b" and "n" of the bus. Its control is a +$P(U)$ control with a Euclidean projection and an $S^{\max}$ of 3 kVA. + +### Scenario 3: $PQ(U)$ control + +Finally, it is possible to combine $P(U)$ and $Q(U)$ controls, for example by first using all +available reactive power before reducing the active power in order to limit the impact for the +client. + +```python +import numpy as np + +from roseau.load_flow import FlexibleParameter, Control, Projection, Q_, PowerLoad, Bus + +bus = Bus(id="bus", phases="abc") + +# Create a flexible parameter +fp = FlexibleParameter( + control_p=Control.p_max_u_production(u_up=Q_(245, "V"), u_max=Q_(250, "V")), + control_q=Control.q_u( + u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(245, "V") + ), + projection=Projection(type="euclidean"), + s_max=Q_(5, "kVA"), +) + +# Or using the shortcut +fp = FlexibleParameter.pq_u_production( + up_up=Q_(245, "V"), + up_max=Q_(250, "V"), + uq_min=Q_(210, "V"), + uq_down=Q_(220, "V"), + uq_up=Q_(240, "V"), + uq_max=Q_(245, "V"), + s_max=Q_(5, "kVA"), +) + +# Use it in a load +load = PowerLoad( + id="load", + bus=bus, + powers=Q_(-np.array([1000, 1000, 1000]), "VA"), + flexible_params=[fp, fp, fp], +) +``` + +In this example, the same flexible parameter is used to control all phases of the three-phase +delta-connected load. In the flexible parameter, one can remark that the $Q(U)$ control on high +voltages triggers at 240 V (production) and reaches its maximum at 245 V. The $P(U)$ control +however triggers at 245 V and is maxed out at 250 V. + +Using this configuration, a _sequential $PQ(U)$ control_ has been created for this load. A +_simultaneous $PQ(U)$ control_ could have been defined by using the same voltage thresholds for both +controls. diff --git a/doc/models/Load/FlexibleLoad/Projection.md b/doc/models/Load/FlexibleLoad/Projection.md new file mode 100644 index 00000000..be7bf81e --- /dev/null +++ b/doc/models/Load/FlexibleLoad/Projection.md @@ -0,0 +1,84 @@ +(models-flexible_load-projections)= + +# Projections + +The different controls may produce values for $P$ and $Q$ that are not feasible. The feasibility +domain in the $(P, Q)$ space is a part of the disc of radius $S^{\max}$. In these cases, the +solution found by the control algorithm has to be projected on the feasible domain. That's why we +need to define how the projection is done. There are three available projection types: the +_Euclidean_ projection, the projection at _Constant $P$_ and the projection at _Constant $Q$_. + +The projection accepts two approximation parameters: `alpha` and `epsilon`. + +- `alpha` is used to compute soft sign function and soft projection function. The higher `alpha` + is, the better the approximations are. +- `epsilon` is used to approximate a smooth square root function: + ```{math} + \sqrt{S} \approx \sqrt{\varepsilon \times \exp\left(\frac{-{|S|}^2}{\varepsilon}\right) + {|S|}^2} + ``` + The lower `epsilon` is, the better the approximations are. + +```{important} +Please note that no projection is performed in the final $\underline{S(U)}$ point lies in the disc of radius $S^{\max}$. +``` + +## Euclidean projection + +A Euclidean projection on the feasible domain. This is the default value for projections when it is +not specified. + +```{image} /_static/Load/FlexibleLoad/Euclidean_Projection.svg +:width: 300 +:align: center +``` + +```python +from roseau.load_flow import Projection + +projection = Projection(type="euclidean") # alpha and epsilon can be provided +``` + +```{important} +Please note that using the Euclidean projection may reduce the provided $P^{\mathrm{th.}}$ and $Q^{\mathrm{th.}}$ of +the load. See the [Feasible Domain page](models-flexible_load-feasible_domains) for more details. +``` + +## Constant $P$ + +Keep the value of $P$ computed by the control and project $Q$ on the feasible domain. + +```{image} /_static/Load/FlexibleLoad/Constant_P_Projection.svg +:width: 300 +:align: center +``` + +```python +from roseau.load_flow import Projection + +projection = Projection(type="keep_p") # alpha and epsilon can be provided +``` + +```{important} +Please note that using the _Constant $P$_ projection may reduce the provided $Q^{\mathrm{th.}}$ of the load. See the +[Feasible Domain page](models-flexible_load-feasible_domains) for more details. +``` + +## Constant $Q$ + +Keep the value of $Q$ computed by the control and project $P$ on the feasible domain. + +```{image} /_static/Load/FlexibleLoad/Constant_Q_Projection.svg +:width: 300 +:align: center +``` + +```python +from roseau.load_flow import Projection + +projection = Projection(type="keep_q") # alpha and epsilon can be provided +``` + +```{important} +Please note that using the _Constant $Q$_ may reduce the provided $P^{\mathrm{th.}}$ of the load. See the [Feasible +Domain page](models-flexible_load-feasible_domains) for more details. +``` diff --git a/doc/models/Load/FlexibleLoad/index.md b/doc/models/Load/FlexibleLoad/index.md new file mode 100644 index 00000000..7fdb7f41 --- /dev/null +++ b/doc/models/Load/FlexibleLoad/index.md @@ -0,0 +1,57 @@ +# Flexible loads + +They are a special case of power loads: instead of being constant, the power will depend on the +voltage measured at the load and the control applied to the load. + +## Equations + +The equations are the following (star loads): + +```{math} +\left\{ + \begin{aligned} + \underline{I_{\mathrm{abc}}} &= \left(\frac{ + \underline{S_{\mathrm{abc}}}(\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}) + }{\underline{V_{\mathrm{abc}}}-\underline{V_{\mathrm{n}}}}\right)^{\star} \\ + \underline{I_{\mathrm{n}}} &= -\sum_{p\in\{\mathrm{a},\mathrm{b},\mathrm{c}\}}\underline{I_{p}} + \end{aligned} +\right. +``` + +And the following (delta loads): + +```{math} +\left\{ + \begin{aligned} + \underline{I_{\mathrm{ab}}} &= \left(\frac{\underline{S_{\mathrm{ab}}}(\underline{V_{\mathrm{a}}}-\underline + {V_{\mathrm{b}}})}{\underline{V_{\mathrm{a}}}-\underline{V_{\mathrm{b}}}}\right)^{\star} \\ + \underline{I_{\mathrm{bc}}} &= \left(\frac{\underline{S_{\mathrm{bc}}}(\underline{V_{\mathrm{b}}}-\underline + {V_{\mathrm{c}}})}{\underline{V_{\mathrm{b}}}-\underline{V_{\mathrm{c}}}}\right)^{\star} \\ + \underline{I_{\mathrm{ca}}} &= \left(\frac{\underline{S_{\mathrm{ca}}}(\underline{V_{\mathrm{c}}}-\underline + {V_{\mathrm{a}}})}{\underline{V_{\mathrm{c}}}-\underline{V_{\mathrm{a}}}}\right)^{\star} + \end{aligned} +\right. +``` + +The expression $\underline{S}(U)$ depends on four parameters: + +- The theoretical power $\underline{S^{\mathrm{th.}}}$ that the load would have if no control is applied. +- The maximal power $S^{\max}$ that can be injected/consumed by the load. For a PV installation, this is + usually the rated power of the inverter. +- The type of control (see [here](models-flexible_load-controls)). +- The type of projection (see [here](models-flexible_load-projections)). + +## Detailed pages + +All these elements are detailed in the following sections: + +```{toctree} +--- +maxdepth: 2 +caption: Flexible loads +--- +Control +Projection +FlexibleParameter +FeasibleDomain +``` diff --git a/doc/models/Load/index.md b/doc/models/Load/index.md index fe8ce74b..5e4decf0 100644 --- a/doc/models/Load/index.md +++ b/doc/models/Load/index.md @@ -68,11 +68,11 @@ The following load models are available in _Roseau Load Flow_: ```{toctree} --- -maxdepth: 2 +maxdepth: 3 caption: Loads --- ImpedanceLoad CurrentLoad PowerLoad -FlexibleLoad +FlexibleLoad/index ``` diff --git a/doc/usage/Flexible_Loads.md b/doc/usage/Flexible_Loads.md index 5891c0f7..40291107 100644 --- a/doc/usage/Flexible_Loads.md +++ b/doc/usage/Flexible_Loads.md @@ -202,12 +202,12 @@ flexible load implementing a $PQ(U)$ control instead. As before, we first create a `FlexibleParameter` but this time, we will use the `pq_u_production` class method. It requires several arguments: -- `up_up` and `up_max`: the voltages defining the interval of the `P(U)` control activation. +- `up_up` and `up_max`: the voltages defining the interval of the $P(U)$ control activation. Below `up_up`, no control is applied and above `u_max`, the production is totally shut down. -- `uq_min`, `uq_down`, `uq_up` and `uq_max` which are the voltages defining the `Q(U)` control +- `uq_min`, `uq_down`, `uq_up` and `uq_max` which are the voltages defining the $Q(U)$ control activation. - Below `uq_min`, the power plant produces the maximum possible reactive power. - - Between `uq_down` and `uq_up`, there is no `Q(U)` control. + - Between `uq_down` and `uq_up`, there is no $Q(U)$ control. - Above `uq_max`, the power plant consumes the maximum possible reactive power. In the example below, as the new load is a production load, only the `up_up`, `up_max`, `uq_up` @@ -216,7 +216,7 @@ exhausted at 240 V. After that, the $P(U)$ is activated and is exhausted at 250 production is totally shut down. ```pycon ->>> # Let's try with pq(u) control, by injecting reactive power before reducing active power +>>> # Let's try with PQ(u) control, by injecting reactive power before reducing active power ... en.loads["load3"].disconnect() ... fp = FlexibleParameter.pq_u_production( ... up_up=240, up_max=250, uq_min=200, uq_down=210, uq_up=235, uq_max=240, s_max=4000 # V and VA @@ -244,4 +244,4 @@ array([-2566.23768012+3068.29336425j, 0.+0.j, 0.+0.j]) One can note that this time, the phase `'a'` consumes reactive power to limit the voltage rise in the network. Moreover, the magnitude of the power on phase `'a'` is approximately $4 kVA$ which is the maximum allowed apparent power for `load3`. In order to maintain this maximum, a -[Euclidean projection](models-flexible_load-projection) has been used. +[Euclidean projection](models-flexible_load-projections) has been used. From d1e367f872713607f12f802f7fe3c665533dd08d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 15:11:55 +0200 Subject: [PATCH 04/10] Add plot methods --- conda/environment.yml | 3 +- conda/meta.yaml | 1 + doc/Installation.md | 7 + poetry.lock | 554 ++++++++++++++++-- pyproject.toml | 3 + roseau/load_flow/exceptions.py | 3 + .../models/loads/flexible_parameters.py | 481 ++++++++++++++- roseau/load_flow/network.py | 5 +- roseau/load_flow/typing.py | 8 +- 9 files changed, 1003 insertions(+), 62 deletions(-) diff --git a/conda/environment.yml b/conda/environment.yml index a6e1ff7f..640acd57 100644 --- a/conda/environment.yml +++ b/conda/environment.yml @@ -12,4 +12,5 @@ dependencies: - pint >=0.21.0 - requests >=2.28.1 - typing-extensions >=4.6.2 - - rich >=13.5.2 + - rich >=13.5.1 + - matplotlib >=3.7.2 diff --git a/conda/meta.yaml b/conda/meta.yaml index 7d15d74e..8cc7e50b 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -35,6 +35,7 @@ requirements: - requests >=2.28.1 - typing-extensions >=4.6.2 - rich >=13.5.1 + - matplotlib >=3.7.2 test: imports: diff --git a/doc/Installation.md b/doc/Installation.md index e8b7fec4..5e86a8e7 100644 --- a/doc/Installation.md +++ b/doc/Installation.md @@ -50,6 +50,13 @@ To upgrade to the latest version (recommended), use: $ python -m pip install --upgrade roseau-load-flow ``` +Moreover, using the `pip` installation, some plot functions requires additional dependencies that are not installed by +default. If you need these functions, you can install the `plot` extra using + +```console +$ python -m pip install roseau-load-flow[plot] +``` + ## Using `conda` `roseau-load-flow` is also available on [conda-forge](https://anaconda.org/conda-forge/roseau-load-flow). diff --git a/poetry.lock b/poetry.lock index bd95107b..ab748975 100644 --- a/poetry.lock +++ b/poetry.lock @@ -340,6 +340,135 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.1.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, + {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, + {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, + {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, + {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, + {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, + {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, + {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, + {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, + {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, + {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, + {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, + {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, + {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, + {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, + {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" version = "7.3.1" @@ -407,6 +536,17 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + [[package]] name = "decorator" version = "5.1.1" @@ -484,21 +624,19 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "filelock" -version = "3.12.3" +version = "3.12.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"}, - {file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"}, + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""} - [package.extras] docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "fiona" @@ -544,6 +682,63 @@ calc = ["shapely"] s3 = ["boto3 (>=1.3.1)"] test = ["Fiona[s3]", "pytest (>=7)", "pytest-cov", "pytz"] +[[package]] +name = "fonttools" +version = "4.42.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c"}, + {file = "fonttools-4.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b"}, + {file = "fonttools-4.42.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff"}, + {file = "fonttools-4.42.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd"}, + {file = "fonttools-4.42.1-cp310-cp310-win32.whl", hash = "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca"}, + {file = "fonttools-4.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5"}, + {file = "fonttools-4.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e"}, + {file = "fonttools-4.42.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35"}, + {file = "fonttools-4.42.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861"}, + {file = "fonttools-4.42.1-cp311-cp311-win32.whl", hash = "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a"}, + {file = "fonttools-4.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b"}, + {file = "fonttools-4.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868"}, + {file = "fonttools-4.42.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d"}, + {file = "fonttools-4.42.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4"}, + {file = "fonttools-4.42.1-cp38-cp38-win32.whl", hash = "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d"}, + {file = "fonttools-4.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec"}, + {file = "fonttools-4.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360"}, + {file = "fonttools-4.42.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249"}, + {file = "fonttools-4.42.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967"}, + {file = "fonttools-4.42.1-cp39-cp39-win32.whl", hash = "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64"}, + {file = "fonttools-4.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b"}, + {file = "fonttools-4.42.1-py3-none-any.whl", hash = "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853"}, + {file = "fonttools-4.42.1.tar.gz", hash = "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + [[package]] name = "furo" version = "2023.9.10" @@ -563,31 +758,31 @@ sphinx-basic-ng = "*" [[package]] name = "geopandas" -version = "0.13.2" +version = "0.14.0" description = "Geographic pandas extensions" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "geopandas-0.13.2-py3-none-any.whl", hash = "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9"}, - {file = "geopandas-0.13.2.tar.gz", hash = "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968"}, + {file = "geopandas-0.14.0-py3-none-any.whl", hash = "sha256:a402a565e727642cb44a500c911f226eea26c1b1247c6586827031e3d7a9403a"}, + {file = "geopandas-0.14.0.tar.gz", hash = "sha256:ea6c031889e1e1888aecaa6e182ca620d78f63551c49b3002a998bcbb280531f"}, ] [package.dependencies] -fiona = ">=1.8.19" +fiona = ">=1.8.21" packaging = "*" -pandas = ">=1.1.0" -pyproj = ">=3.0.1" -shapely = ">=1.7.1" +pandas = ">=1.4.0" +pyproj = ">=3.3.0" +shapely = ">=1.8.0" [[package]] name = "identify" -version = "2.5.28" +version = "2.5.29" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.28-py2.py3-none-any.whl", hash = "sha256:87816de144bf46d161bd5b3e8f5596b16cade3b80be537087334b26bc5c177f3"}, - {file = "identify-2.5.28.tar.gz", hash = "sha256:94bb59643083ebd60dc996d043497479ee554381fbc5307763915cda49b0e78f"}, + {file = "identify-2.5.29-py2.py3-none-any.whl", hash = "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b"}, + {file = "identify-2.5.29.tar.gz", hash = "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5"}, ] [package.extras] @@ -634,6 +829,24 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +[[package]] +name = "importlib-resources" +version = "6.0.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, + {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -721,6 +934,119 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + [[package]] name = "latexcodec" version = "2.0.1" @@ -863,6 +1189,56 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "matplotlib" +version = "3.8.0" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c4940bad88a932ddc69734274f6fb047207e008389489f2b6f77d9ca485f0e7a"}, + {file = "matplotlib-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a33bd3045c7452ca1fa65676d88ba940867880e13e2546abb143035fa9072a9d"}, + {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea6886e93401c22e534bbfd39201ce8931b75502895cfb115cbdbbe2d31f287"}, + {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d670b9348e712ec176de225d425f150dc8e37b13010d85233c539b547da0be39"}, + {file = "matplotlib-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b37b74f00c4cb6af908cb9a00779d97d294e89fd2145ad43f0cdc23f635760c"}, + {file = "matplotlib-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:0e723f5b96f3cd4aad99103dc93e9e3cdc4f18afdcc76951f4857b46f8e39d2d"}, + {file = "matplotlib-3.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5dc945a9cb2deb7d197ba23eb4c210e591d52d77bf0ba27c35fc82dec9fa78d4"}, + {file = "matplotlib-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b5a1bf27d078453aa7b5b27f52580e16360d02df6d3dc9504f3d2ce11f6309"}, + {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f25ffb6ad972cdffa7df8e5be4b1e3cadd2f8d43fc72085feb1518006178394"}, + {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee482731c8c17d86d9ddb5194d38621f9b0f0d53c99006275a12523ab021732"}, + {file = "matplotlib-3.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36eafe2128772195b373e1242df28d1b7ec6c04c15b090b8d9e335d55a323900"}, + {file = "matplotlib-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:061ee58facb3580cd2d046a6d227fb77e9295599c5ec6ad069f06b5821ad1cfc"}, + {file = "matplotlib-3.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3cc3776836d0f4f22654a7f2d2ec2004618d5cf86b7185318381f73b80fd8a2d"}, + {file = "matplotlib-3.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c49a2bd6981264bddcb8c317b6bd25febcece9e2ebfcbc34e7f4c0c867c09dc"}, + {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ed11654fc83cd6cfdf6170b453e437674a050a452133a064d47f2f1371f8d3"}, + {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae97fdd6996b3a25da8ee43e3fc734fff502f396801063c6b76c20b56683196"}, + {file = "matplotlib-3.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:87df75f528020a6299f76a1d986c0ed4406e3b2bd44bc5e306e46bca7d45e53e"}, + {file = "matplotlib-3.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:90d74a95fe055f73a6cd737beecc1b81c26f2893b7a3751d52b53ff06ca53f36"}, + {file = "matplotlib-3.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c3499c312f5def8f362a2bf761d04fa2d452b333f3a9a3f58805273719bf20d9"}, + {file = "matplotlib-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31e793c8bd4ea268cc5d3a695c27b30650ec35238626961d73085d5e94b6ab68"}, + {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5ee602ef517a89d1f2c508ca189cfc395dd0b4a08284fb1b97a78eec354644"}, + {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5de39dc61ca35342cf409e031f70f18219f2c48380d3886c1cf5ad9f17898e06"}, + {file = "matplotlib-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dd386c80a98b5f51571b9484bf6c6976de383cd2a8cd972b6a9562d85c6d2087"}, + {file = "matplotlib-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f691b4ef47c7384d0936b2e8ebdeb5d526c81d004ad9403dfb9d4c76b9979a93"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b11f354aae62a2aa53ec5bb09946f5f06fc41793e351a04ff60223ea9162955"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f54b9fb87ca5acbcdd0f286021bedc162e1425fa5555ebf3b3dfc167b955ad9"}, + {file = "matplotlib-3.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:60a6e04dfd77c0d3bcfee61c3cd335fff1b917c2f303b32524cd1235e194ef99"}, + {file = "matplotlib-3.8.0.tar.gz", hash = "sha256:df8505e1c19d5c2c26aff3497a7cbd3ccfc2e97043d1e4db3e76afa399164b69"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" +setuptools_scm = ">=7" + [[package]] name = "matplotlib-inline" version = "0.1.6" @@ -1115,6 +1491,73 @@ files = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] +[[package]] +name = "pillow" +version = "10.0.1" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "pint" version = "0.22" @@ -1274,6 +1717,20 @@ files = [ [package.extras] plugins = ["importlib-metadata"] +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyproj" version = "3.6.0" @@ -1584,13 +2041,13 @@ test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "tes [[package]] name = "rich" -version = "13.5.2" +version = "13.5.3" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.5.2-py3-none-any.whl", hash = "sha256:146a90b3b6b47cac4a73c12866a499e9817426423f57c5a66949c086191a8808"}, - {file = "rich-13.5.2.tar.gz", hash = "sha256:fb9d6c0a0f643c99eed3875b5377a184132ba9be4d61516a55273d3554d75a39"}, + {file = "rich-13.5.3-py3-none-any.whl", hash = "sha256:9257b468badc3d347e146a4faa268ff229039d4c2d176ab0cffb4c4fbc73d5d9"}, + {file = "rich-13.5.3.tar.gz", hash = "sha256:87b43e0543149efa1253f485cd845bb7ee54df16c9617b8a893650ab84b4acb6"}, ] [package.dependencies] @@ -1642,6 +2099,27 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "setuptools-scm" +version = "7.1.0" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, + {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, +] + +[package.dependencies] +packaging = ">=20.0" +setuptools = "*" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] + [[package]] name = "shapely" version = "2.0.1" @@ -1731,13 +2209,13 @@ files = [ [[package]] name = "sphinx" -version = "7.2.5" +version = "7.2.6" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.2.5-py3-none-any.whl", hash = "sha256:9269f9ed2821c9ebd30e4204f5c2339f5d4980e377bc89cb2cb6f9b17409c20a"}, - {file = "sphinx-7.2.5.tar.gz", hash = "sha256:1a9290001b75c497fd087e92b0334f1bbfa1a1ae7fddc084990c4b7bd1130b88"}, + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, ] [package.dependencies] @@ -2033,28 +2511,28 @@ files = [ [[package]] name = "traitlets" -version = "5.9.0" +version = "5.10.0" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.10.0-py3-none-any.whl", hash = "sha256:417745a96681fbb358e723d5346a547521f36e9bd0d50ba7ab368fff5d67aa54"}, + {file = "traitlets-5.10.0.tar.gz", hash = "sha256:f584ea209240466e66e91f3c81aa7d004ba4cf794990b0c775938a1544217cd1"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] [[package]] @@ -2202,20 +2680,20 @@ files = [ [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "c7346fba55321b4af5fd5c892d8c89687ddbf7dbafdc75c6cd88fb486e1d4fe4" +content-hash = "de4181680060f36444109dc1ffd00f53fb6c40d7da4833a301c99c1c1e9d4c9d" diff --git a/pyproject.toml b/pyproject.toml index 28afcca8..e58039c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,9 @@ pint = ">=0.21.0" typing-extensions = ">=4.6.2" rich = ">=13.5.1" +# Plot Extra +matplotlib = { version = "^3.7.2", extras = ["plot"] } + [tool.poetry.group.test.dependencies] pytest = "^7.1.2" pytest-cov = "^4.0.0" diff --git a/roseau/load_flow/exceptions.py b/roseau/load_flow/exceptions.py index f843e31c..7806f209 100644 --- a/roseau/load_flow/exceptions.py +++ b/roseau/load_flow/exceptions.py @@ -107,6 +107,9 @@ class RoseauLoadFlowExceptionCode(Enum): CATALOGUE_NOT_FOUND = auto() CATALOGUE_SEVERAL_FOUND = auto() + # Import Error + IMPORT_ERROR = auto() + @classmethod def package_name(cls) -> str: return "roseau.load_flow" diff --git a/roseau/load_flow/models/loads/flexible_parameters.py b/roseau/load_flow/models/loads/flexible_parameters.py index 712c9904..fae73aa4 100644 --- a/roseau/load_flow/models/loads/flexible_parameters.py +++ b/roseau/load_flow/models/loads/flexible_parameters.py @@ -1,17 +1,20 @@ import logging import warnings -from typing import NoReturn +from typing import TYPE_CHECKING, NoReturn, Optional import numpy as np from typing_extensions import Self from roseau.load_flow.exceptions import RoseauLoadFlowException, RoseauLoadFlowExceptionCode -from roseau.load_flow.typing import ControlType, JsonDict, ProjectionType +from roseau.load_flow.typing import Authentication, ControlType, JsonDict, ProjectionType from roseau.load_flow.units import Q_, ureg_wraps from roseau.load_flow.utils import JsonMixin logger = logging.getLogger(__name__) +if TYPE_CHECKING: + from matplotlib import Axes + class Control(JsonMixin): """Control class for flexible loads. @@ -332,16 +335,17 @@ class Projection(JsonMixin): """This class defines the projection on the feasible circle for a flexible load. The three possible projection types are: - * ``"euclidean"``: for an Euclidean projection on the feasible space; + * ``"euclidean"``: for a Euclidean projection on the feasible space; * ``"keep_p"``: for maintaining a constant P; * ``"keep_q"``: for maintaining a constant Q. See Also: - :ref:`Projection documentation ` + :ref:`Projection documentation ` """ _DEFAULT_ALPHA: float = 1000.0 _DEFAULT_EPSILON: float = 1e-8 + _DEFAULT_TYPE: ProjectionType = "euclidean" def __init__(self, type: ProjectionType, alpha: float = _DEFAULT_ALPHA, epsilon: float = _DEFAULT_EPSILON) -> None: """Projection constructor. @@ -485,24 +489,24 @@ def constant(cls) -> Self: """Build flexible parameters for a constant control with a Euclidean projection. Returns: - A constant control i.e. no control at all. It is an equivalent of the constant power - load. + A constant control i.e. no control at all. It is an equivalent of the constant power load. """ return cls( control_p=cls._control_class.constant(), control_q=cls._control_class.constant(), - projection=cls._projection_class(type="euclidean"), + projection=cls._projection_class(type=cls._projection_class.DEFAULT_TYPE), s_max=1.0, ) @classmethod - @ureg_wraps(None, (None, "V", "V", "VA", None, None, None), strict=False) + @ureg_wraps(None, (None, "V", "V", "VA", None, None, None, None), strict=False) def p_max_u_production( cls, u_up: float, u_max: float, s_max: float, alpha_control: float = Control._DEFAULT_ALPHA, + type_proj: ProjectionType = Projection._DEFAULT_TYPE, alpha_proj: float = Projection._DEFAULT_ALPHA, epsilon_proj: float = Projection._DEFAULT_EPSILON, ) -> Self: @@ -528,6 +532,9 @@ def p_max_u_production( An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function. + type_proj: + The type of the projection to use. + alpha_proj: This value is used to make soft sign function and to build a soft projection function (see the diagram above). @@ -543,18 +550,19 @@ def p_max_u_production( return cls( control_p=control_p, control_q=cls._control_class.constant(), - projection=cls._projection_class(type="euclidean", alpha=alpha_proj, epsilon=epsilon_proj), + projection=cls._projection_class(type=type_proj, alpha=alpha_proj, epsilon=epsilon_proj), s_max=s_max, ) @classmethod - @ureg_wraps(None, (None, "V", "V", "VA", None, None, None), strict=False) + @ureg_wraps(None, (None, "V", "V", "VA", None, None, None, None), strict=False) def p_max_u_consumption( cls, u_min: float, u_down: float, s_max: float, alpha_control: float = Control._DEFAULT_ALPHA, + type_proj: ProjectionType = Projection._DEFAULT_TYPE, alpha_proj: float = Projection._DEFAULT_ALPHA, epsilon_proj: float = Projection._DEFAULT_EPSILON, ) -> Self: @@ -577,6 +585,9 @@ def p_max_u_consumption( An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function. + type_proj: + The type of the projection to use. + alpha_proj: This value is used to make soft sign function and to build a soft projection function. @@ -592,12 +603,12 @@ def p_max_u_consumption( return cls( control_p=control_p, control_q=cls._control_class.constant(), - projection=cls._projection_class("euclidean", alpha=alpha_proj, epsilon=epsilon_proj), + projection=cls._projection_class(type=type_proj, alpha=alpha_proj, epsilon=epsilon_proj), s_max=s_max, ) @classmethod - @ureg_wraps(None, (None, "V", "V", "V", "V", "VA", None, None, None), strict=False) + @ureg_wraps(None, (None, "V", "V", "V", "V", "VA", None, None, None, None), strict=False) def q_u( cls, u_min: float, @@ -606,6 +617,7 @@ def q_u( u_max: float, s_max: float, alpha_control: float = Control._DEFAULT_ALPHA, + type_proj: ProjectionType = Projection._DEFAULT_TYPE, alpha_proj: float = Projection._DEFAULT_ALPHA, epsilon_proj: float = Projection._DEFAULT_EPSILON, ) -> Self: @@ -635,6 +647,9 @@ def q_u( An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function. + type_proj: + The type of the projection to use. + alpha_proj: This value is used to make soft sign function and to build a soft projection function. @@ -650,12 +665,12 @@ def q_u( return cls( control_p=cls._control_class.constant(), control_q=control_q, - projection=cls._projection_class(type="euclidean", alpha=alpha_proj, epsilon=epsilon_proj), + projection=cls._projection_class(type=type_proj, alpha=alpha_proj, epsilon=epsilon_proj), s_max=s_max, ) @classmethod - @ureg_wraps(None, (None, "V", "V", "V", "V", "V", "V", "VA", None, None, None), strict=False) + @ureg_wraps(None, (None, "V", "V", "V", "V", "V", "V", "VA", None, None, None, None), strict=False) def pq_u_production( cls, up_up: float, @@ -666,6 +681,7 @@ def pq_u_production( uq_max: float, s_max: float, alpha_control=Control._DEFAULT_ALPHA, + type_proj: ProjectionType = Projection._DEFAULT_TYPE, alpha_proj=Projection._DEFAULT_ALPHA, epsilon_proj=Projection._DEFAULT_EPSILON, ) -> Self: @@ -702,6 +718,9 @@ def pq_u_production( An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function. + type_proj: + The type of the projection to use. + alpha_proj: This value is used to make soft sign function and to build a soft projection function. @@ -713,7 +732,7 @@ def pq_u_production( Returns: A flexible parameter which performs "p_max_u_production" control and a "q_u" control. - .. seealso:: + See Also: :meth:`p_max_u_production` and :meth:`q_u` for more details. """ control_p = cls._control_class.p_max_u_production(u_up=up_up, u_max=up_max, alpha=alpha_control) @@ -721,12 +740,12 @@ def pq_u_production( return cls( control_p=control_p, control_q=control_q, - projection=cls._projection_class(type="euclidean", alpha=alpha_proj, epsilon=epsilon_proj), + projection=cls._projection_class(type=type_proj, alpha=alpha_proj, epsilon=epsilon_proj), s_max=s_max, ) @classmethod - @ureg_wraps(None, (None, "V", "V", "V", "V", "V", "V", "VA", None, None, None), strict=False) + @ureg_wraps(None, (None, "V", "V", "V", "V", "V", "V", "VA", None, None, None, None), strict=False) def pq_u_consumption( cls, up_min: float, @@ -737,6 +756,7 @@ def pq_u_consumption( uq_max: float, s_max: float, alpha_control: float = Control._DEFAULT_ALPHA, + type_proj: ProjectionType = Projection._DEFAULT_TYPE, alpha_proj: float = Projection._DEFAULT_ALPHA, epsilon_proj: float = Projection._DEFAULT_EPSILON, ) -> Self: @@ -773,6 +793,9 @@ def pq_u_consumption( An approximation factor used by the family function (soft clip). The greater, the closer the function are from the non-differentiable function. + type_proj: + The type of the projection to use. + alpha_proj: This value is used to make soft sign function and to build a soft projection function. @@ -784,7 +807,7 @@ def pq_u_consumption( Returns: A flexible parameter which performs "p_max_u_consumption" control and "q_u" control. - .. seealso:: + See Also: :meth:`p_max_u_consumption` and :meth:`q_u` for more details. """ control_p = cls._control_class.p_max_u_consumption(u_min=up_min, u_down=up_down, alpha=alpha_control) @@ -792,7 +815,7 @@ def pq_u_consumption( return cls( control_p=control_p, control_q=control_q, - projection=cls._projection_class(type="euclidean", alpha=alpha_proj, epsilon=epsilon_proj), + projection=cls._projection_class(type=type_proj, alpha=alpha_proj, epsilon=epsilon_proj), s_max=s_max, ) @@ -823,3 +846,423 @@ def results_from_dict(self, data: JsonDict) -> NoReturn: msg = f"The {type(self).__name__} has no results to import." logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.JSON_NO_RESULTS) + + # + # Equivalent Python method + # + @ureg_wraps("VA", (None, None, "V", "VA", None), strict=False) + def compute_powers( + self, auth: Authentication, voltages: np.ndarray[float], power: complex, solve_kwargs: Optional[JsonDict] = None + ) -> Q_[np.ndarray[complex]]: + """Compute the effective powers for different voltages (norms) + + Args: + auth: + The login and password for the roseau load flow api. + + voltages: + The array of voltage norms to test with this flexible parameter. + + power: + The input theoretical power of the load. + + solve_kwargs: + The keywords arguments of the :meth:`solve_load_flow` method. + + Returns: + The flexible powers really consumed taking into account the control. One value per provided voltage norm. + """ + return self._compute_powers(auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs) + + def _compute_powers( + self, auth: Authentication, voltages: np.ndarray[float], power: complex, solve_kwargs: Optional[JsonDict] + ) -> np.ndarray[complex]: + from roseau.load_flow import Bus, ElectricalNetwork, PotentialRef, PowerLoad, VoltageSource + + # Format the input + if solve_kwargs is None: + solve_kwargs = {} + voltages = np.array(np.abs(voltages), dtype=float) + + # Simple network + bus = Bus(id="bus", phases="an") + vs = VoltageSource(id="source", bus=bus, voltages=[voltages[0]]) + PotentialRef(id="pref", element=bus, phase="n") + fp = FlexibleParameter.from_dict(data=self.to_dict(include_geometry=False)) + load = PowerLoad(id="load", bus=bus, powers=[power], flexible_params=[fp]) + en = ElectricalNetwork.from_element(bus) + + # Iterate over the provided voltages to get the associated flexible powers + res_flexible_powers = [] + for v in voltages: + vs.voltages = [v] + en.solve_load_flow(auth=auth, **solve_kwargs) + res_flexible_powers.append(load.res_flexible_powers.m_as("VA")[0]) + + return np.array(res_flexible_powers, dtype=complex) + + @ureg_wraps(None, (None, None, "V", "VA", None, None, None, "VA"), strict=False) + def plot_pq( + self, + auth: Authentication, + voltages: np.ndarray[float], + power: complex, + ax: Optional["Axes"] = None, + solve_kwargs: Optional[JsonDict] = None, + voltages_labels_mask: Optional[np.ndarray[bool]] = None, + res_flexible_powers: Optional[np.ndarray[complex]] = None, + ) -> tuple["Axes", np.ndarray[complex]]: + """Plot the "trajectory" of the flexible powers (in the (P, Q) plane) for the provided voltages and theoretical + power. + + Args: + auth: + The login and password for the roseau load flow api. + + voltages: + The array of voltage norms to test with this flexible parameter. + + power: + The input theoretical power of the load. + + ax: + The optional axis to use for the plot. The current axis is used by default. + + solve_kwargs: + The keywords arguments of the :meth:`solve_load_flow` method. + + voltages_labels_mask: + A mask to activate the plot of voltages labels. By default, no voltages annotations. + + res_flexible_powers: + If None, is provided, the `res_flexible_powers` are computed. Other + + Returns: + The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else + the computed values). + """ + try: + from matplotlib import colormaps, patheffects + from matplotlib import pyplot as plt + from matplotlib.pyplot import Axes + except ImportError: + msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + + # Get the axes + if ax is None: + ax: Axes = plt.gca() + + # Initialise some variables + if voltages_labels_mask is None: + voltages_labels_mask = np.zeros_like(voltages, dtype=bool) + else: + voltages_labels_mask = np.array(voltages_labels_mask, dtype=bool) + s_max = self._s_max + v_min = voltages.min() + v_max = voltages.max() + + # Compute the powers for the voltages norms + if res_flexible_powers is None: + res_flexible_powers = self._compute_powers( + auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs + ) + + # Draw a circle + circle = plt.Circle((0, 0), radius=s_max, color="black", fill=False) + ax.add_artist(circle) + + # Draw the powers + cm = colormaps.get_cmap("Spectral_r") + sc = ax.scatter( + x=res_flexible_powers.real, + y=res_flexible_powers.imag, + c=voltages, + cmap=cm, + vmin=v_min, + vmax=v_max, + marker=".", + s=50, + zorder=4, + ) + for m, v, x, y in zip(voltages_labels_mask, voltages, res_flexible_powers.real, res_flexible_powers.imag): + if not m: + continue + ax.annotate( + text=f"{v:.1f} V", + xy=(x, y), + xycoords="data", + path_effects=[patheffects.withStroke(linewidth=2, foreground="w")], + xytext=(4, 4), + textcoords="offset points", + ) + + # Draw the theoretical power + ax.axhline(y=power.imag, c="red", zorder=1.9) + ax.axvline(x=power.real, c="red", zorder=1.9) + ax.scatter(x=power.real, y=power.imag, marker=".", c="red", zorder=3) + ax.annotate( + xy=(power.real, power.imag), + text=r"$S^{\mathrm{th.}}$", + path_effects=[patheffects.withStroke(linewidth=2, foreground="w")], + ha="right", + ) + + # Refine the axes + ax.grid(visible=True) + plt.colorbar(sc, ax=ax) + ax.set_xlim(-s_max * 1.05, s_max * 1.05) + ax.set_ylim(-s_max * 1.05, s_max * 1.05) + ax.set_aspect("equal") + ax.set_xlabel("Active power (W)") + ax.set_ylabel("Reactive power (VAr)") + + return ax, res_flexible_powers + + @ureg_wraps(None, (None, None, "V", "VA", None, None, "VA"), strict=False) + def plot_control_p( + self, + auth: Authentication, + voltages: np.ndarray[float], + power: complex, + ax: Optional["Axes"] = None, + solve_kwargs: Optional[JsonDict] = None, + res_flexible_powers: Optional[np.ndarray[complex]] = None, + ) -> tuple["Axes", np.ndarray[complex]]: + """Plot the effective active power consumed (or produced) for the provided voltages and theoretical power. + + Args: + auth: + The login and password for the roseau load flow api. + + voltages: + The array of voltage norms to test with this flexible parameter. + + power: + The input theoretical power of the load. + + ax: + The optional axis to use for the plot. The current axis is used by default. + + solve_kwargs: + The keywords arguments of the :meth:`solve_load_flow` method. + + res_flexible_powers: + If None, is provided, the `res_flexible_powers` are computed. Other + + Returns: + The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else + the computed values). + """ + try: + from matplotlib import pyplot as plt + from matplotlib.pyplot import Axes + except ImportError: + msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + + # Get the axes + if ax is None: + ax: Axes = plt.gca() + + # Depending on the type of the control, several options + x, y, x_ticks = self._theoretical_control_data( + control=self.control_p, v_min=voltages.min(), v_max=voltages.max(), power=power.real, s_max=self._s_max + ) + + # Compute the powers for the voltages norms + if res_flexible_powers is None: + res_flexible_powers = self._compute_powers( + auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs + ) + ax.scatter(voltages, res_flexible_powers.real, marker=".", c="blue", zorder=2, label="Effective power") + + # Add the theoretical non-smooth curve + ax.plot(x, y, marker="s", c="red", zorder=1.9, label="Non-smooth theoretical control") + + # Refine the axis + ax.grid(visible=True) + ax.set_xticks(x, x_ticks) + ax.set_xlabel("Voltage (V)") + ax.set_ylabel("Active power (W)") + ax.legend() + ax.figure.tight_layout() + + return ax, res_flexible_powers + + @ureg_wraps(None, (None, None, "V", "VA", None, None, "VA"), strict=False) + def plot_control_q( + self, + auth: Authentication, + voltages: np.ndarray[float], + power: complex, + ax: Optional["Axes"] = None, + solve_kwargs: Optional[JsonDict] = None, + res_flexible_powers: Optional[np.ndarray[complex]] = None, + ) -> tuple["Axes", np.ndarray[complex]]: + """Plot the effective reactive power consumed (or produced) for the provided voltages and theoretical power. + + Args: + auth: + The login and password for the roseau load flow api. + + voltages: + The array of voltage norms to test with this flexible parameter. + + power: + The input theoretical power of the load. + + ax: + The optional axis to use for the plot. The current axis is used by default. + + solve_kwargs: + The keywords arguments of the :meth:`solve_load_flow` method + + res_flexible_powers: + If None, is provided, the `res_flexible_powers` are computed. Other + + Returns: + The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else + the computed values). + """ + try: + from matplotlib import pyplot as plt + from matplotlib.pyplot import Axes + except ImportError: + msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + + # Get the axes + if ax is None: + ax: Axes = plt.gca() + + # Depending on the type of the control, several options + x, y, x_ticks = self._theoretical_control_data( + control=self.control_q, v_min=voltages.min(), v_max=voltages.max(), power=power.imag, s_max=self._s_max + ) + + # Compute the powers for the voltages norms + if res_flexible_powers is None: + res_flexible_powers = self._compute_powers( + auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs + ) + ax.scatter(voltages, res_flexible_powers.imag, marker=".", c="blue", zorder=2, label="Effective power") + + # Add the theoretical non-smooth curve + ax.plot(x, y, marker="s", c="red", zorder=1.9, label="Non-smooth theoretical control") + + # Refine the axis + ax.grid(visible=True) + ax.set_xticks(x, x_ticks) + ax.set_xlabel("Voltage (V)") + ax.set_ylabel("Reactive power (VAr)") + ax.legend() + ax.figure.tight_layout() + + return ax, res_flexible_powers + + # + # Helpers + # + @staticmethod + def _theoretical_control_data( + control: Control, v_min: float, v_max: float, power: float, s_max: float + ) -> tuple[np.ndarray[float], np.ndarray[float], np.ndarray[object]]: + """Helper to get data for the different plots of the class. It provides the theoretical control curve + abscissas and ordinates values. It also provides ticks for the abscissa axis. + + Args: + control: + The control to extract the theoretical value. + + v_min: + The minimum voltage norm provided by the user in the `voltages` array. + + v_max: + The maximum voltage norm provided by the user in the `voltages` array. + + power: + The active (or reactive, depending on the provided control) to use in the constant control. + + s_max: + The `s_max` parameter to scale the control functions. + + Returns: + The x- and y-values of the theoretical control function with x tixks to use for the plot. + """ + # Depending on the type of the control, several options + if control.type == "constant": + x = np.array([v_min, v_max], dtype=float) + y = np.array([power, power], dtype=float) + x_ticks = np.array([f"{v_min:.1f}", f"{v_max:.1f}"], dtype=object) + elif control.type == "p_max_u_production": + u_up = control._u_up + u_max = control._u_max + x = np.array([u_up, u_max, v_min, v_max], dtype=float) + y = np.zeros_like(x, dtype=float) + y[x < u_up] = -s_max + mask = np.logical_and(u_up <= x, x < u_max) + y[mask] = -s_max * (x[mask] - u_max) / (u_up - u_max) + y[x >= u_max] = 0 + x_ticks = np.array( + [f"{u_up:.1f}\n$U^{{\\mathrm{{up}}}}$", f"{u_max:.1f}\n$U^{{\\max}}$", f"{v_min:.1f}", f"{v_max:.1f}"], + dtype=object, + ) + elif control.type == "p_max_u_consumption": + u_min = control._u_min + u_down = control._u_down + x = np.array([u_min, u_down, v_min, v_max], dtype=float) + y = np.zeros_like(x, dtype=float) + y[x < u_min] = 0 + y[x >= u_down] = s_max + mask = np.logical_and(u_min <= x, x < u_down) + y[mask] = s_max * (x[mask] - u_min) / (u_down - u_min) + x_ticks = np.array( + [ + f"{u_min:.1f}\n$U^{{\\min}}$", + f"{u_down:.1f}\n$U^{{\\mathrm{{down}}}}$", + f"{v_min:.1f}", + f"{v_max:.1f}", + ], + dtype=object, + ) + elif control.type == "q_u": + u_min = control._u_min + u_down = control._u_down + u_up = control._u_up + u_max = control._u_max + x = np.array([u_min, u_down, u_up, u_max, v_min, v_max], dtype=float) + y = np.zeros_like(x, dtype=float) + y[x < u_min] = -s_max + mask = np.logical_and(u_min <= x, x < u_down) + y[mask] = -s_max * (x[mask] - u_down) / (u_min - u_down) + y[np.logical_and(u_down <= x, x < u_up)] = 0 + mask = np.logical_and(u_up <= x, x < u_max) + y[mask] = s_max * (x[mask] - u_up) / (u_max - u_up) + y[x >= u_max] = s_max + x_ticks = np.array( + [ + f"{u_min:.1f}\n$U^{{\\min}}$", + f"{u_down:.1f}\n$U^{{\\mathrm{{down}}}}$", + f"{u_up:.1f}\n$U^{{\\mathrm{{up}}}}$", + f"{u_max:.1f}\n$U^{{\\max}}$", + f"{v_min:.1f}", + f"{v_max:.1f}", + ], + dtype=object, + ) + else: # pragma: no-cover + msg = f"Unsupported control type {control.type!r}" + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_CONTROL_TYPE) + + # Sort everything according to the voltages + sort_index = np.argsort(x) + x = x[sort_index] + y = y[sort_index] + x_ticks = x_ticks[sort_index] + + return x, y, x_ticks diff --git a/roseau/load_flow/network.py b/roseau/load_flow/network.py index babd5714..4f953da1 100644 --- a/roseau/load_flow/network.py +++ b/roseau/load_flow/network.py @@ -17,7 +17,6 @@ import requests from pyproj import CRS from requests import Response -from requests.auth import HTTPBasicAuth from rich.table import Table from typing_extensions import Self @@ -37,7 +36,7 @@ VoltageSource, ) from roseau.load_flow.solvers import check_solver_params -from roseau.load_flow.typing import Id, JsonDict, Solver, StrPath +from roseau.load_flow.typing import Authentication, Id, JsonDict, Solver, StrPath from roseau.load_flow.utils import CatalogueMixin, JsonMixin, console logger = logging.getLogger(__name__) @@ -357,7 +356,7 @@ def short_circuits_frame(self) -> pd.DataFrame: # def solve_load_flow( self, - auth: Union[tuple[str, str], HTTPBasicAuth], + auth: Authentication, base_url: str = _DEFAULT_BASE_URL, max_iterations: int = _DEFAULT_MAX_ITERATIONS, tolerance: float = _DEFAULT_TOLERANCE, diff --git a/roseau/load_flow/typing.py b/roseau/load_flow/typing.py index 52c8a293..0c0e5c11 100644 --- a/roseau/load_flow/typing.py +++ b/roseau/load_flow/typing.py @@ -24,10 +24,15 @@ .. class:: Solver Available solvers for the load flow computation. + +.. class:: Authentication + + Valid authentication objects """ import os from typing import Any, Literal, Union +from requests.auth import HTTPBasicAuth from typing_extensions import TypeAlias Id: TypeAlias = Union[int, str] @@ -36,6 +41,7 @@ ControlType: TypeAlias = Literal["constant", "p_max_u_production", "p_max_u_consumption", "q_u"] ProjectionType: TypeAlias = Literal["euclidean", "keep_p", "keep_q"] Solver: TypeAlias = Literal["newton", "newton_goldstein"] +Authentication: TypeAlias = Union[tuple[str, str], HTTPBasicAuth] -__all__ = ["Id", "JsonDict", "StrPath", "ControlType", "ProjectionType", "Solver"] +__all__ = ["Id", "JsonDict", "StrPath", "ControlType", "ProjectionType", "Solver", "Authentication"] From 369e9ed0938dd7cb72c0bc6353831948560e045c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 17:16:34 +0200 Subject: [PATCH 05/10] Add tests --- poetry.lock | 2 +- pyproject.toml | 1 + .../models/loads/flexible_parameters.py | 6 +- .../models/tests/test_flexible_parameters.py | 115 ++++++++++++++++++ 4 files changed, 120 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index ab748975..e0dcea74 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2696,4 +2696,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "de4181680060f36444109dc1ffd00f53fb6c40d7da4833a301c99c1c1e9d4c9d" +content-hash = "000f170e994a7fbd25ff959cbe475b07ef87ecb11d904d2461f8a4648561a25c" diff --git a/pyproject.toml b/pyproject.toml index e58039c5..b05938c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,7 @@ pytest-cov = "^4.0.0" pytest-xdist = "^3.1.0" requests-mock = "^1.9.3" coverage = { version = "^7.0.5", extras = ["toml"] } +matplotlib = "^3.7.2" [tool.poetry.group.dev.dependencies] pre-commit = "^3.0.0" diff --git a/roseau/load_flow/models/loads/flexible_parameters.py b/roseau/load_flow/models/loads/flexible_parameters.py index fae73aa4..fbc3fc53 100644 --- a/roseau/load_flow/models/loads/flexible_parameters.py +++ b/roseau/load_flow/models/loads/flexible_parameters.py @@ -901,7 +901,7 @@ def _compute_powers( return np.array(res_flexible_powers, dtype=complex) - @ureg_wraps(None, (None, None, "V", "VA", None, None, None, "VA"), strict=False) + @ureg_wraps((None, "VA"), (None, None, "V", "VA", None, None, None, "VA"), strict=False) def plot_pq( self, auth: Authentication, @@ -1020,7 +1020,7 @@ def plot_pq( return ax, res_flexible_powers - @ureg_wraps(None, (None, None, "V", "VA", None, None, "VA"), strict=False) + @ureg_wraps((None, "VA"), (None, None, "V", "VA", None, None, "VA"), strict=False) def plot_control_p( self, auth: Authentication, @@ -1092,7 +1092,7 @@ def plot_control_p( return ax, res_flexible_powers - @ureg_wraps(None, (None, None, "V", "VA", None, None, "VA"), strict=False) + @ureg_wraps((None, "VA"), (None, None, "V", "VA", None, None, "VA"), strict=False) def plot_control_q( self, auth: Authentication, diff --git a/roseau/load_flow/models/tests/test_flexible_parameters.py b/roseau/load_flow/models/tests/test_flexible_parameters.py index 61f3df91..8b82bb97 100644 --- a/roseau/load_flow/models/tests/test_flexible_parameters.py +++ b/roseau/load_flow/models/tests/test_flexible_parameters.py @@ -1,11 +1,17 @@ import warnings +from contextlib import contextmanager +import numpy as np +import numpy.testing as npt import pytest +from matplotlib import pyplot as plt from roseau.load_flow import ( Q_, Control, + ElectricalNetwork, FlexibleParameter, + PowerLoad, Projection, RoseauLoadFlowException, RoseauLoadFlowExceptionCode, @@ -195,3 +201,112 @@ def test_flexible_parameter(): ) assert e.value.msg == "'s_max' must be greater than 0 but -1.0 MVA was provided." assert e.value.code == RoseauLoadFlowExceptionCode.BAD_SMAX_VALUE + + +@pytest.fixture(params=["constant", "p_max_u_production", "p_max_u_consumption"]) +def control_p(request) -> Control: + if request.param == "constant": + return Control.constant() + elif request.param == "p_max_u_production": + return Control.p_max_u_production(u_up=Q_(240, "V"), u_max=Q_(250, "V")) + elif request.param == "p_max_u_consumption": + return Control.p_max_u_production(u_up=Q_(210, "V"), u_max=Q_(220, "V")) + raise NotImplementedError(request.param) + + +@pytest.fixture(params=["constant", "q_u"]) +def control_q(request) -> Control: + if request.param == "constant": + return Control.constant() + elif request.param == "q_u": + return Control.q_u(u_min=Q_(210, "V"), u_down=Q_(220, "V"), u_up=Q_(240, "V"), u_max=Q_(250, "V")) + raise NotImplementedError(request.param) + + +@pytest.fixture(params=["keep_p", "keep_q", "euclidean"]) +def projection(request) -> Projection: + return Projection(type=request.param) + + +@pytest.fixture() +def flexible_parameter(control_p, control_q, projection): + return FlexibleParameter(control_p=control_p, control_q=control_q, projection=projection, s_max=Q_(5, "kVA")) + + +@pytest.fixture() +def monkeypatch_flexible_parameter_compute_powers(rg): + @contextmanager + def inner(): + with pytest.MonkeyPatch.context() as m: + m.setattr(target=ElectricalNetwork, name="solve_load_flow", value=lambda *args, **kwargs: 2) + m.setattr( + target=PowerLoad, + name="res_flexible_powers", + value=property( + lambda x: Q_([rg.normal(loc=-2500, scale=1000) + 1j * rg.normal(loc=0, scale=2500)], "VA") + ), + ) + yield m + + return inner + + +def test_plot(flexible_parameter, monkeypatch_flexible_parameter_compute_powers): + voltages = np.array(range(205, 256, 1), dtype=float) + power = Q_(-2.5 + 1j, "kVA") + auth = ("username", "password") + + # + # Test compute powers + # + with monkeypatch_flexible_parameter_compute_powers(): + res_flexible_powers = flexible_parameter.compute_powers(auth=auth, voltages=voltages, power=power) + + # + # Plot control P + # + fig, ax = plt.subplots() + ax, res_flexible_powers_1 = flexible_parameter.plot_control_p( + auth=auth, voltages=voltages, power=power, res_flexible_powers=res_flexible_powers, ax=ax + ) + npt.assert_allclose(res_flexible_powers, res_flexible_powers_1) + + # The same but do not provide the res_flexible_powers + fig, ax = plt.subplots() + with monkeypatch_flexible_parameter_compute_powers(): + ax, res_flexible_powers_2 = flexible_parameter.plot_control_p(auth=auth, voltages=voltages, power=power, ax=ax) + assert not np.allclose(res_flexible_powers, res_flexible_powers_2) + + # Plot control Q + ax, res_flexible_powers = flexible_parameter.plot_control_q( + auth=auth, voltages=voltages, power=power, res_flexible_powers=res_flexible_powers, ax=ax + ) + + # The same but do not provide the res_flexible_powers + fig, ax = plt.subplots() + with monkeypatch_flexible_parameter_compute_powers(): + ax, res_flexible_powers_3 = flexible_parameter.plot_control_q(auth=auth, voltages=voltages, power=power, ax=ax) + assert not np.allclose(res_flexible_powers, res_flexible_powers_3) + + # Plot trajectory in the (P, Q) plane + fig, ax = plt.subplots() + ax, res_flexible_powers_4 = flexible_parameter.plot_pq( + auth=auth, + voltages=voltages, + power=power, + res_flexible_powers=res_flexible_powers, + voltages_labels_mask=np.isin(voltages, [240, 250]), + ax=ax, + ) + npt.assert_allclose(res_flexible_powers, res_flexible_powers_4) + + # The same but do not provide the res_flexible_powers + fig, ax = plt.subplots() # Create a new ax that is not used directly in the following function call + with monkeypatch_flexible_parameter_compute_powers(): + ax, res_flexible_powers_5 = flexible_parameter.plot_pq( + auth=auth, + voltages=voltages, + power=power, + voltages_labels_mask=np.isin(voltages, [240, 250]), + ) + assert not np.allclose(res_flexible_powers, res_flexible_powers_5) From 41e45c92299298b27837467137f05780d667fe91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 17:29:54 +0200 Subject: [PATCH 06/10] Fill the changelog --- .pre-commit-config.yaml | 2 +- doc/Changelog.md | 7 +++++++ poetry.lock | 38 +++++++++++++++++++------------------- pyproject.toml | 2 +- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5914a31b..7273267c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: hooks: - id: black-jupyter - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.289 # keep in sync with pyproject.toml + rev: v0.0.290 # keep in sync with pyproject.toml hooks: - id: ruff types_or: [python, pyi, jupyter] diff --git a/doc/Changelog.md b/doc/Changelog.md index 1ad7d719..7e40b632 100644 --- a/doc/Changelog.md +++ b/doc/Changelog.md @@ -4,6 +4,13 @@ **In development** +- {gh-pr}`131` {gh-issue}`127` Improve the documentation of the flexible loads. + - Add the method `compute_powers` method to the `FlexibleParameter` class to compute the resulting flexible powers + for a given theoretical power and a list of voltage norms. + - Add the `plot_control_p`, `plot_control_q` and `plot_pq` methods to the `FlexibleParameter` class to plot the + control curves and control trajectories. + - Add the extra `plot` to install `matplotlib` alongside `roseau-load-flow`. +- {gh-pr}`131` Correction of a bug in the error message of the powers setter method. - {gh-pr}`130` Mark some internal attributes as private, they were previously marked as public. - {gh-pr}`128` Add the properties `z_line`, `y_shunt` and `with_shunt` to the `Line` class. - {gh-pr}`125` Speed-up build of conda workflow using mamba. diff --git a/poetry.lock b/poetry.lock index e0dcea74..f0bef53e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2059,28 +2059,28 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.0.289" +version = "0.0.290" description = "An extremely fast Python linter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.0.289-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:c9a89d748e90c840bac9c37afe90cf13a5bfd460ca02ea93dad9d7bee3af03b4"}, - {file = "ruff-0.0.289-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:7f7396c6ea01ba332a6ad9d47642bac25d16bd2076aaa595b001f58b2f32ff05"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7180de86c8ecd39624dec1699136f941c07e723201b4ce979bec9e7c67b40ad2"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73f37c65508203dd01a539926375a10243769c20d4fcab3fa6359cd3fbfc54b7"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c14abcd7563b5c80be2dd809eeab20e4aa716bf849860b60a22d87ddf19eb88"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:91b6d63b6b46d4707916472c91baa87aa0592e73f62a80ff55efdf6c0668cfd6"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6479b8c4be3c36046c6c92054762b276fa0fddb03f6b9a310fbbf4c4951267fd"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5424318c254bcb091cb67e140ec9b9f7122074e100b06236f252923fb41e767"}, - {file = "ruff-0.0.289-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4daa90865796aedcedf0d8897fdd4cd09bf0ddd3504529a4ccf211edcaff3c7d"}, - {file = "ruff-0.0.289-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8057e8ab0016c13b9419bad119e854f881e687bd96bc5e2d52c8baac0f278a44"}, - {file = "ruff-0.0.289-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7eebfab2e6a6991908ff1bf82f2dc1e5095fc7e316848e62124526837b445f4d"}, - {file = "ruff-0.0.289-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ebc7af550018001a7fb39ca22cdce20e1a0de4388ea4a007eb5c822f6188c297"}, - {file = "ruff-0.0.289-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e4e6eccb753efe760ba354fc8e9f783f6bba71aa9f592756f5bd0d78db898ed"}, - {file = "ruff-0.0.289-py3-none-win32.whl", hash = "sha256:bbb3044f931c09cf17dbe5b339896eece0d6ac10c9a86e172540fcdb1974f2b7"}, - {file = "ruff-0.0.289-py3-none-win_amd64.whl", hash = "sha256:6d043c5456b792be2615a52f16056c3cf6c40506ce1f2d6f9d3083cfcb9eeab6"}, - {file = "ruff-0.0.289-py3-none-win_arm64.whl", hash = "sha256:04a720bcca5e987426bb14ad8b9c6f55e259ea774da1cbeafe71569744cfd20a"}, - {file = "ruff-0.0.289.tar.gz", hash = "sha256:2513f853b0fc42f0339b7ab0d2751b63ce7a50a0032d2689b54b2931b3b866d7"}, + {file = "ruff-0.0.290-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:0e2b09ac4213b11a3520221083866a5816616f3ae9da123037b8ab275066fbac"}, + {file = "ruff-0.0.290-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4ca6285aa77b3d966be32c9a3cd531655b3d4a0171e1f9bf26d66d0372186767"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35e3550d1d9f2157b0fcc77670f7bb59154f223bff281766e61bdd1dd854e0c5"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d748c8bd97874f5751aed73e8dde379ce32d16338123d07c18b25c9a2796574a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:982af5ec67cecd099e2ef5e238650407fb40d56304910102d054c109f390bf3c"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bbd37352cea4ee007c48a44c9bc45a21f7ba70a57edfe46842e346651e2b995a"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d9be6351b7889462912e0b8185a260c0219c35dfd920fb490c7f256f1d8313e"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75cdc7fe32dcf33b7cec306707552dda54632ac29402775b9e212a3c16aad5e6"}, + {file = "ruff-0.0.290-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb07f37f7aecdbbc91d759c0c09870ce0fb3eed4025eebedf9c4b98c69abd527"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2ab41bc0ba359d3f715fc7b705bdeef19c0461351306b70a4e247f836b9350ed"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:150bf8050214cea5b990945b66433bf9a5e0cef395c9bc0f50569e7de7540c86"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_i686.whl", hash = "sha256:75386ebc15fe5467248c039f5bf6a0cfe7bfc619ffbb8cd62406cd8811815fca"}, + {file = "ruff-0.0.290-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ac93eadf07bc4ab4c48d8bb4e427bf0f58f3a9c578862eb85d99d704669f5da0"}, + {file = "ruff-0.0.290-py3-none-win32.whl", hash = "sha256:461fbd1fb9ca806d4e3d5c745a30e185f7cf3ca77293cdc17abb2f2a990ad3f7"}, + {file = "ruff-0.0.290-py3-none-win_amd64.whl", hash = "sha256:f1f49f5ec967fd5778813780b12a5650ab0ebcb9ddcca28d642c689b36920796"}, + {file = "ruff-0.0.290-py3-none-win_arm64.whl", hash = "sha256:ae5a92dfbdf1f0c689433c223f8dac0782c2b2584bd502dfdbc76475669f1ba1"}, + {file = "ruff-0.0.290.tar.gz", hash = "sha256:949fecbc5467bb11b8db810a7fa53c7e02633856ee6bd1302b2f43adcd71b88d"}, ] [[package]] @@ -2696,4 +2696,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "000f170e994a7fbd25ff959cbe475b07ef87ecb11d904d2461f8a4648561a25c" +content-hash = "7463ecbe37dbd7a88a8ef0615336f51b2f3e29f898e0e3820b595483115ee5f3" diff --git a/pyproject.toml b/pyproject.toml index b05938c2..b6c13df2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,7 @@ matplotlib = "^3.7.2" [tool.poetry.group.dev.dependencies] pre-commit = "^3.0.0" black = { version = "==23.9.1", extras = ["jupyter"] } # keep in sync with .pre-commit-config.yaml -ruff = "==0.0.289" # keep in sync with .pre-commit-config.yaml +ruff = "==0.0.290" # keep in sync with .pre-commit-config.yaml [tool.poetry.group.doc.dependencies] sphinx = "^7.0.1" From ecab3e2ac8f2ff6131e3f1282c585a2537668b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 17:50:34 +0200 Subject: [PATCH 07/10] Correction of the tests --- roseau/load_flow/models/loads/flexible_parameters.py | 2 +- roseau/load_flow/models/tests/test_flexible_parameters.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/roseau/load_flow/models/loads/flexible_parameters.py b/roseau/load_flow/models/loads/flexible_parameters.py index fbc3fc53..e630a0cd 100644 --- a/roseau/load_flow/models/loads/flexible_parameters.py +++ b/roseau/load_flow/models/loads/flexible_parameters.py @@ -494,7 +494,7 @@ def constant(cls) -> Self: return cls( control_p=cls._control_class.constant(), control_q=cls._control_class.constant(), - projection=cls._projection_class(type=cls._projection_class.DEFAULT_TYPE), + projection=cls._projection_class(type=cls._projection_class._DEFAULT_TYPE), s_max=1.0, ) diff --git a/roseau/load_flow/models/tests/test_flexible_parameters.py b/roseau/load_flow/models/tests/test_flexible_parameters.py index 8b82bb97..e2a5ada4 100644 --- a/roseau/load_flow/models/tests/test_flexible_parameters.py +++ b/roseau/load_flow/models/tests/test_flexible_parameters.py @@ -234,10 +234,11 @@ def flexible_parameter(control_p, control_q, projection): @pytest.fixture() -def monkeypatch_flexible_parameter_compute_powers(rg): +def monkeypatch_flexible_parameter_compute_powers(monkeypatch, rg): @contextmanager def inner(): - with pytest.MonkeyPatch.context() as m: + nonlocal monkeypatch + with monkeypatch.context() as m: m.setattr(target=ElectricalNetwork, name="solve_load_flow", value=lambda *args, **kwargs: 2) m.setattr( target=PowerLoad, From 48eb36def17770bf26eb898e9e14bd7003e82b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Vinot?= Date: Tue, 19 Sep 2023 18:09:45 +0200 Subject: [PATCH 08/10] Typo --- roseau/load_flow/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roseau/load_flow/network.py b/roseau/load_flow/network.py index 4f953da1..dfde9152 100644 --- a/roseau/load_flow/network.py +++ b/roseau/load_flow/network.py @@ -669,7 +669,7 @@ def res_branches(self) -> pd.DataFrame: @property def res_lines(self) -> pd.DataFrame: - """The load flow results of the the network lines. + """The load flow results of the network lines. This is similar to the :attr:`res_branches` property but provides more information that only apply to lines. This includes currents and complex power losses in the series From e019e23c418c1df787121aff617037d8dc7a40ee Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Wed, 20 Sep 2023 09:57:37 +0200 Subject: [PATCH 09/10] Better missing matplotlib message, pint warnings, matplotlib warnings --- .../models/loads/flexible_parameters.py | 49 +++++++++---------- .../models/tests/test_flexible_parameters.py | 17 ++++--- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/roseau/load_flow/models/loads/flexible_parameters.py b/roseau/load_flow/models/loads/flexible_parameters.py index e630a0cd..b8d784bd 100644 --- a/roseau/load_flow/models/loads/flexible_parameters.py +++ b/roseau/load_flow/models/loads/flexible_parameters.py @@ -13,7 +13,20 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from matplotlib import Axes + from matplotlib.axes import Axes + + +def _import_matplotlib_pyplot(): + try: + import matplotlib.pyplot + except ImportError as e: + msg = ( + 'matplotlib is required for plotting. Install it with the "plot" extra using ' + '`pip install -U "roseau-load-flow[plot]"`' + ) + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from e + return matplotlib.pyplot class Control(JsonMixin): @@ -941,18 +954,12 @@ def plot_pq( The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else the computed values). """ - try: - from matplotlib import colormaps, patheffects - from matplotlib import pyplot as plt - from matplotlib.pyplot import Axes - except ImportError: - msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' - logger.error(msg) - raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + plt = _import_matplotlib_pyplot() # this line first for better error handling + from matplotlib import colormaps, patheffects # Get the axes if ax is None: - ax: Axes = plt.gca() + ax: "Axes" = plt.gca() # Initialise some variables if voltages_labels_mask is None: @@ -1055,17 +1062,11 @@ def plot_control_p( The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else the computed values). """ - try: - from matplotlib import pyplot as plt - from matplotlib.pyplot import Axes - except ImportError: - msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' - logger.error(msg) - raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + plt = _import_matplotlib_pyplot() # Get the axes if ax is None: - ax: Axes = plt.gca() + ax: "Axes" = plt.gca() # Depending on the type of the control, several options x, y, x_ticks = self._theoretical_control_data( @@ -1127,17 +1128,11 @@ def plot_control_q( The axis on which the plot has been drawn and the resulting flexible powers (the input if not `None` else the computed values). """ - try: - from matplotlib import pyplot as plt - from matplotlib.pyplot import Axes - except ImportError: - msg = 'The extra dependency "plot" is required. Please use `pip install -U roseau-load-flow[plot]`.' - logger.error(msg) - raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.IMPORT_ERROR) from None + plt = _import_matplotlib_pyplot() # Get the axes if ax is None: - ax: Axes = plt.gca() + ax: "Axes" = plt.gca() # Depending on the type of the control, several options x, y, x_ticks = self._theoretical_control_data( @@ -1191,7 +1186,7 @@ def _theoretical_control_data( The `s_max` parameter to scale the control functions. Returns: - The x- and y-values of the theoretical control function with x tixks to use for the plot. + The x- and y-values of the theoretical control function with x-ticks to use for the plot. """ # Depending on the type of the control, several options if control.type == "constant": diff --git a/roseau/load_flow/models/tests/test_flexible_parameters.py b/roseau/load_flow/models/tests/test_flexible_parameters.py index e2a5ada4..5d91abd4 100644 --- a/roseau/load_flow/models/tests/test_flexible_parameters.py +++ b/roseau/load_flow/models/tests/test_flexible_parameters.py @@ -229,7 +229,7 @@ def projection(request) -> Projection: @pytest.fixture() -def flexible_parameter(control_p, control_q, projection): +def flexible_parameter(control_p, control_q, projection) -> FlexibleParameter: return FlexibleParameter(control_p=control_p, control_q=control_q, projection=projection, s_max=Q_(5, "kVA")) @@ -270,13 +270,15 @@ def test_plot(flexible_parameter, monkeypatch_flexible_parameter_compute_powers) ax, res_flexible_powers_1 = flexible_parameter.plot_control_p( auth=auth, voltages=voltages, power=power, res_flexible_powers=res_flexible_powers, ax=ax ) - npt.assert_allclose(res_flexible_powers, res_flexible_powers_1) + npt.assert_allclose(res_flexible_powers.m_as("VA"), res_flexible_powers_1.m_as("VA")) + plt.close(fig) # The same but do not provide the res_flexible_powers fig, ax = plt.subplots() with monkeypatch_flexible_parameter_compute_powers(): ax, res_flexible_powers_2 = flexible_parameter.plot_control_p(auth=auth, voltages=voltages, power=power, ax=ax) - assert not np.allclose(res_flexible_powers, res_flexible_powers_2) + assert not np.allclose(res_flexible_powers.m_as("VA"), res_flexible_powers_2.m_as("VA")) + plt.close(fig) # Plot control Q ax, res_flexible_powers = flexible_parameter.plot_control_q( @@ -287,7 +289,8 @@ def test_plot(flexible_parameter, monkeypatch_flexible_parameter_compute_powers) fig, ax = plt.subplots() with monkeypatch_flexible_parameter_compute_powers(): ax, res_flexible_powers_3 = flexible_parameter.plot_control_q(auth=auth, voltages=voltages, power=power, ax=ax) - assert not np.allclose(res_flexible_powers, res_flexible_powers_3) + assert not np.allclose(res_flexible_powers.m_as("VA"), res_flexible_powers_3.m_as("VA")) + plt.close(fig) # Plot trajectory in the (P, Q) plane fig, ax = plt.subplots() @@ -299,7 +302,8 @@ def test_plot(flexible_parameter, monkeypatch_flexible_parameter_compute_powers) voltages_labels_mask=np.isin(voltages, [240, 250]), ax=ax, ) - npt.assert_allclose(res_flexible_powers, res_flexible_powers_4) + npt.assert_allclose(res_flexible_powers.m_as("VA"), res_flexible_powers_4.m_as("VA")) + plt.close(fig) # The same but do not provide the res_flexible_powers fig, ax = plt.subplots() # Create a new ax that is not used directly in the following function call @@ -310,4 +314,5 @@ def test_plot(flexible_parameter, monkeypatch_flexible_parameter_compute_powers) power=power, voltages_labels_mask=np.isin(voltages, [240, 250]), ) - assert not np.allclose(res_flexible_powers, res_flexible_powers_5) + assert not np.allclose(res_flexible_powers.m_as("VA"), res_flexible_powers_5.m_as("VA")) + plt.close(fig) From 1abae9f3325dd7230cf990e96ffaee9b08551d06 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Wed, 20 Sep 2023 17:09:40 +0200 Subject: [PATCH 10/10] Some minor improvements * Replace the term "effective power" by "actual power" * A few grammatical changes * Fix some dead links in the flexible parameter docstring --- .../Pconst_QU_Eucl_Control_Curve_Example.svg | 119 ++++---- .../Pconst_QU_P_Control_Curve_Example.svg | 119 ++++---- .../Pconst_QU_Q_Control_Curve_Example.svg | 119 ++++---- .../PmaxU_Qconst_Control_Curve_Example.svg | 119 ++++---- .../Pconst_QU_Eucl_Control_Curve_Example.tex | 2 +- .../Pconst_QU_P_Control_Curve_Example.tex | 2 +- .../Pconst_QU_Q_Control_Curve_Example.tex | 2 +- .../PmaxU_Qconst_Control_Curve_Example.tex | 2 +- .../Load/FlexibleLoad/FeasibleDomain.md | 277 +++++++++--------- .../Load/FlexibleLoad/FlexibleParameter.md | 2 +- doc/models/Load/FlexibleLoad/Projection.md | 18 +- doc/models/Load/FlexibleLoad/index.md | 2 +- .../models/loads/flexible_parameters.py | 18 +- roseau/load_flow/typing.py | 2 +- 14 files changed, 386 insertions(+), 417 deletions(-) diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg index 61255866..93e9ed0c 100644 --- a/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg @@ -132,43 +132,40 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + @@ -504,84 +501,78 @@ - - - - - - - - + + - - - - - + - + + + + + - - + + - + - - + + - - + + - + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + - + - - + + - - + + - - + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg index 50485eed..b7f741e7 100644 --- a/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg @@ -132,43 +132,40 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + @@ -504,84 +501,78 @@ - - - - - - - - + + - - - - - + - + + + + + - - + + - + - - + + - - + + - + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + - + - - + + - - + + - - + + diff --git a/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg index 32685db8..f0c87749 100644 --- a/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg +++ b/doc/_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg @@ -132,43 +132,40 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + @@ -504,84 +501,78 @@ - - - - - - - - + + - - - - - + - + + + + + - - + + - + - - + + - - + + - + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + - + - - + + - - + + - - + + diff --git a/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg index ce22094e..e2bdb5e5 100644 --- a/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg +++ b/doc/_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg @@ -114,43 +114,40 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - + @@ -461,84 +458,78 @@ - - - - - - - - + + - - - - - + - + + + + + - - + + - + - - + + - - + + - + - - - - - - - + + + + + + + - - + + - - - - - + + + + + - + - - - - - + + + + + - + - - + + - - + + - - + + diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex index f7e33c4d..de060c90 100644 --- a/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.tex @@ -16,7 +16,7 @@ ylabel={Reactive power (VAr)},% y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% grid=both,% - legend entries={Effective power,Non-smooth theoretical control},% + legend entries={Actual power,Non-smooth theoretical control},% legend style={% legend cell align=left,% legend pos=north west,% diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex index 3a046575..598814a0 100644 --- a/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.tex @@ -16,7 +16,7 @@ ylabel={Reactive power (VAr)},% y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% grid=both,% - legend entries={Effective power,Non-smooth theoretical control},% + legend entries={Actual power,Non-smooth theoretical control},% legend style={% legend cell align=left,% legend pos=north west,% diff --git a/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex index f6782305..ebd3d188 100644 --- a/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex +++ b/doc/images/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.tex @@ -16,7 +16,7 @@ ylabel={Reactive power (VAr)},% y label style={at={(axis description cs:-0.1,0.5)},anchor=south},% grid=both,% - legend entries={Effective power,Non-smooth theoretical control},% + legend entries={Actual power,Non-smooth theoretical control},% legend style={% legend cell align=left,% legend pos=north west,% diff --git a/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex index 0051175c..21e5b922 100644 --- a/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex +++ b/doc/images/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.tex @@ -16,7 +16,7 @@ ylabel={Active power (W)},% y label style={at={(axis description cs:-0.15,0.5)},anchor=south},% grid=both,% - legend entries={Effective power,Non-smooth theoretical control},% + legend entries={Actual power,Non-smooth theoretical control},% legend style={% legend cell align=left,% legend pos=north west,% diff --git a/doc/models/Load/FlexibleLoad/FeasibleDomain.md b/doc/models/Load/FlexibleLoad/FeasibleDomain.md index dc612498..f7f69666 100644 --- a/doc/models/Load/FlexibleLoad/FeasibleDomain.md +++ b/doc/models/Load/FlexibleLoad/FeasibleDomain.md @@ -2,7 +2,7 @@ # Feasible domains -Depending on the mix of controls and projection used through the class `FlexibleParameter`, the feasible domains in +Depending on the mix of controls and projection used through the class `FlexibleParameter`, the feasible domain in the $(P, Q)$ space changes. ```{note} @@ -13,7 +13,7 @@ On this page, all the images are drawn for a producer so $P^{\text{th.}}\leqslan If there is no control at all, i.e. the `flexible_params` argument is **not** given to the `PowerLoad` constructor or `constant` control used for both active and reactive powers, the consumed (or produced) power will be the one -provided by the user, noted $\underline{S^{\mathrm{th.}}}=P^{\mathrm{th.}}+jQ^{\mathrm{th.}}$. The feasible domain +provided to the load, noted $\underline{S^{\mathrm{th.}}}=P^{\mathrm{th.}}+jQ^{\mathrm{th.}}$. The feasible domain is reduced to a single point as depicted in the figure below. ```{image} /_static/Load/FlexibleLoad/Domain_Pconst_Qconst.svg @@ -114,12 +114,11 @@ vs.res_powers ## Active power control only -When the reactive power is constant, only the active power may be modulated by the local voltage. Thus, the active -power may vary between 0 and $P^{\mathrm{th.}}$ (if the load is a consumer i.e. $P^{\mathrm{th.}}\geqslant 0$) or -between $P^{\mathrm{th.}}$ and 0 (if the load is a producer i.e. $P^{\mathrm{th.}}\leqslant0$). +When the reactive power is constant, only the active power changes as a function of the local +voltage. Thus, the active power may vary between 0 and $P^{\mathrm{th.}}$. -When a control is activated for a load, the theoretical power can not be outside the disc of radius $S^{\max}$. Here -is a small example of such error: +When a control is activated, the load's "theoretical" power **must** always be inside the disc of +radius $S^{\max}$, otherwise an error is thrown: ```python import numpy as np @@ -140,23 +139,20 @@ fp = FlexibleParameter( load = PowerLoad( id="load", bus=bus, - powers=Q_( - np.array([-5 + 5j], dtype=complex), "kVA" - ), # Point outside the circle of radius s_max + powers=Q_(np.array([-5 + 5j], dtype=complex), "kVA"), # > s_max flexible_params=[fp], ) # RoseauLoadFlowException: The power is greater than the parameter s_max # for flexible load "load" [bad_s_value] ``` -Thus, the given $\underline{S^{\text{th.}}}=P^{\text{th.}}+jQ^{\text{th.}}$ lies in the disk of radius $S^{\max}$. -The resulting flexible power is the minimum absolute value between, on the one hand, the active power control function -(which takes values between 0 and 1) multiplied by $S^{\max}$ and, on the other hand, $P^{\mathrm{th.}}$. -As a consequence, the resulting power lies in the segment between the points $(0, Q^{\text{th.}})$ and -$(P^{\text{th.}}, Q^{\text{th.}})$. +The active power control algorithm produces a factor between 0 and 1 that gets multiplied by $S^{\max}$. +The resulting flexible power is the minimum absolute value between this result and $P^{\mathrm{th.}}$. +As a consequence, the resulting power lies on the horizontal segment between the points +$(0, Q^{\text{th.}})$ and $(P^{\text{th.}}, Q^{\text{th.}})$. ```{important} -The projection is useless when there is only an active power control as no point can lie outside the disc of radius +The projection is useless when only active power control is applied as no point can lie outside the disc of radius $S^{\max}$. ``` @@ -167,8 +163,13 @@ This domain of feasible points is depicted in the figure below: :align: center ``` -In the `FlexibleParameter` class, there is a method `compute_powers` which allows to compute the resulting voltages -powers +The `FlexibleParameter` class has a method {meth}`~roseau.load_flow.FlexibleParameter.compute_powers` +that allows to compute the resulting powers of the control at different voltage levels for a given +theoretical power. + +In the following example, we define a flexible parameter with a $P(U)$ control, a constant $P$ +projection, and a $5kVA$ maximum power. We want to know what would the control produce for all +voltages between 205 V and 255 V if given a theoretical power of $-2.5 + j$ kVA. ```python import numpy as np @@ -184,7 +185,7 @@ fp = FlexibleParameter( ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5 + 1j, "kVA") @@ -194,22 +195,29 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -Plotting the control curve $P(U)$ using the variables `voltages` and `res_flexible_powers` of the script above leads to -the following plot: +Plotting the control curve $P(U)$ using the variables `voltages` and `res_flexible_powers` of the +example above produces the following plot: ```{image} /_static/Load/FlexibleLoad/PmaxU_Qconst_Control_Curve_Example.svg :width: 700 :align: center ``` -The non-smooth theoretical control function is the control function applied to $S^{\max}$. The effective power has been -plotted using the powers really produced by the load. Below 240 V, there is no variation in the produced power which is -expected. Between 240 V and approximately 245 V, there is no reduction of the produced power because the curtailment +```{note} +Using `compute_powers` actually requests the solver to solve a load flow for each voltage in the list. +It needs an internet connection to access the server and may take some time (similar to the +{meth}`roseau.load_flow.ElectricalNetwork.solve_load_flow` method). +``` + +The non-smooth theoretical control function is the control function applied to $S^{\max}$. The +"Actual power" plotted is the power actually produced by the load for each voltage. Below 240 V, +there is no variation in the produced power which is expected. Between 240 V and approximately +245 V, there is no reduction of the produced power because the curtailment factor (computed from the voltage) times $S^{\max}$ is lower than $P^{\mathrm{th.}}$. As a consequence, -$P^{\mathrm{th.}}$ is produced. Starting at approximately 245 V, the comparison changes and the really produced -power starts to decrease. It reaches 0 W above 250 V. +$P^{\mathrm{th.}}$ is produced. Starting at approximately 245 V, the comparison changes and the +actually produced power starts to decrease until it reaches 0 W at 250 V. -The same plot can be obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -220,35 +228,39 @@ ax, res_flexible_powers = fp.plot_control_p( plt.show() ``` -In the above example, `res_flexible_powers` is provided as input. It could have been forgotten, and the flexible -powers would have been computed by requesting the server. The computed values are retrieved with the axis on which -the plot was drawn. +Note that in this example, `res_flexible_powers` is provided as input to the plotting function. If +it was not provided, the powers would have been computed by requesting the server (using the +`compute_powers()` method above). The method returns a 2-tuple with the _matplotlib axis_ of the +plot and the computed powers. `````{tip} -To install matplotlib along side with roseau-load-flow, you can type +To install _matplotlib_ along side _roseau-load-flow_, you can use the `plot` extra: -````{tab} Linux +````{tab} Linux/MacOS ```console -$ python -m pip install roseau-load-flow[plot] +$ python -m pip install "roseau-load-flow[plot]" ``` ```` ````{tab} Windows -Matplotlib is always installed when `conda` is used. +```doscon +C:> py -m pip install "roseau-load-flow[plot]" +``` ```` +Matplotlib is always installed when `conda` is used. ````` -If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/PmaxU_Qconst_Trajectory_Example.svg :width: 700 :align: center ``` -All the points have been plotted (1 per volt between 205 V and 255 V). A lot of points are overlapping. +All the points have been plotted (1 per volt between 205 V and 255 V). Many points overlap. -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -267,21 +279,24 @@ plt.show() ## Reactive power control only -When the active power is constant, only the reactive power may be modulated by the local voltage. Thus, the reactive -power may vary between $-S^{\max}$ and $+S^{\max}$. In this segment, there are points outside the disc of radius -$S^{\max}$ (when $P^{\mathrm{th.}}\neq 0$). Those points are projected on the circle of radius $S^{\max}$ and -depending on the projection, the feasible domains change. +When the active power is constant (no $P$ control), only the reactive power changes as a function +of the local voltage. Thus, the reactive power may vary between $-S^{\max}$ and $+S^{\max}$. When +$P^{\mathrm{th.}}\neq 0$, the point $(P, Q) produced by the control might lie outside the disc of +radius $S^{\max}$ (when $P^{\mathrm{th.}}\neq 0$). Those points are projected on the circle of +radius $S^{\max}$ and depending on the projection, the feasible domains change. ### Constant $P$ -If the _constant $P$_ (`keep_p`) projection is chosen, the feasible domain is limited to a segment as defined below. +If the _constant $P$_ (`keep_p`) projection is chosen, the feasible domain is limited to a vertical +segment as shown below. ```{image} /_static/Load/FlexibleLoad/Domain_Pconst_QU_P.svg :width: 300 :align: center ``` -Here is an example of a reactive power control (without active power control) flexible parameter creation: +Here is an example of a flexible parameter with a reactive power control and without active power +control: ```python import numpy as np @@ -299,7 +314,7 @@ fp = FlexibleParameter( ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -309,21 +324,21 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +The variable `res_flexible_powers` contains the powers that have been actually produced by the flexible load for the voltages stored in the variable named `voltages`. -Plotting the control curve $Q(U)$ lead to the following plot: +Plotting the control curve $Q(U)$ gives: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_P_Control_Curve_Example.svg :width: 700 :align: center ``` -One can remark that, even with a voltage lower than $U^{\min}$ or greater than $U^{\max}$ the available reactive -power (by default taken in the interval $[-S^{\max}, S^{\max}]$) was never totally used because of the choice of the +Notice that, even with a voltage lower than $U^{\min}$ or greater than $U^{\max}$, the available reactive +power (by default taken in the interval $[-S^{\max}, S^{\max}]$) was never fully used because of the choice of the projection. -The same plot can be obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -339,7 +354,7 @@ ax, res_flexible_powers = fp.plot_control_q( plt.show() ``` -If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_P_Trajectory_Example.svg :width: 700 @@ -350,11 +365,11 @@ As in the previous plot, there is one point per volt from 205 V to 255 V. Severa 1. All the points are aligned on the straight line $P=-2.5$ kVA because it was the power provided to the flexible load and because the projection used was at _Constant P_. -2. One can remark that several points are overlapping for low and high voltages. For these extremities, the +2. Several points are overlapping for low and high voltages. For these extremities, the theoretical control curves would have forced the point of operation to be outside the disc of radius $S^{\max}$ (5 - kVA in the example). + kVA in this example). -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -382,11 +397,11 @@ defined below. ``` ```{warning} -Note that using this projection with a constant active power may result in a final active power lower than the one -provided (even 0 W in the worst cases)! +Note that using this projection with a constant active power may result in a final active power +lower than the one provided (could reach 0 W in the worst-case)! ``` -Here is an example the creattion of such control with a constant $Q$ projection: +Here is an example the creation of such control with a constant $Q$ projection: ```python import numpy as np @@ -404,7 +419,7 @@ fp = FlexibleParameter( ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -414,20 +429,20 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +The variable `res_flexible_powers` contains the powers that have been actually produced by the flexible load for the voltages stored in the variable named `voltages`. -Plotting the control curve $Q(U)$ leads to the following plot: +Plotting the control curve $Q(U)$ gives: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_Q_Control_Curve_Example.svg :width: 700 :align: center ``` -Here, the complete possible range of reactive power was used. Nevertheless, it was achieved with some active power -reduction because of the projection. +Here, the complete possible range of reactive power is used. When the control finds an infeasible +solution, it reduces the active power because the projection type is _Constant Q_. -The same plot can be obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -443,14 +458,14 @@ ax, res_flexible_powers = fp.plot_control_q( plt.show() ``` -If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_Q_Trajectory_Example.svg :width: 700 :align: center ``` -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -467,9 +482,9 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -One can remark that when the voltages were too low or too high, the projection at constant $Q$ forces us to reduce -the produced active power to ensure a feasible point i.e. a point which is in the disc of radius $S^{\max}$. As -before, there is one point per volt. Several points of operation are overlapping near the coordinates (0,5 kVA) and +Notice that when the voltages were too low or too high, the projection at constant $Q$ forces the +reduction of the produced active power to ensure a feasible solution. Like before, there is one +point per volt. Several points overlap at the extremities near the coordinates (0,5 kVA) and (0, -5 kVA). ### Euclidean projection @@ -487,8 +502,6 @@ Note that using this projection with a constant active power may result in a fin provided! ``` -Here is an example of this usage with a single phase network limited to a single bus: - ```python import numpy as np @@ -505,7 +518,7 @@ fp = FlexibleParameter( ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -515,10 +528,10 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -At the end of the script, the variable `res_flexible_powers` contains the powers that has been really produced by +The variable `res_flexible_powers` contains the powers that have been really produced by the flexible load for the voltages stored in the variable named `voltages`. -Plotting the control curve $Q(U)$ lead to the following plot: +Plotting the control curve $Q(U)$ gives: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_Eucl_Control_Curve_Example.svg :width: 700 @@ -527,7 +540,7 @@ Plotting the control curve $Q(U)$ lead to the following plot: Here, again the complete reactive power range is not fully used. -The same plot can be obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -543,14 +556,14 @@ ax, res_flexible_powers = fp.plot_control_q( plt.show() ``` -If now, we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/Pconst_QU_Eucl_Trajectory_Example.svg :width: 700 :align: center ``` -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -567,36 +580,32 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -One can remark that when the voltages were too low or too high, the Euclidean projection forces us to -reduce the produced active power and the (produced and consumed) reactive power to ensure a feasible point i.e. a point -which is in the disc of radius $S^{\max}$. As before, there is one point per volt thus one can remark that several -points of operation are overlapping. +Notice that when the voltages were too low or too high, the Euclidean projection forces the +reduction of the produced active power and the (produced and consumed) reactive power to ensure a +feasible solution. Like before, there is one point per volt and several points overlap. ## Both active and reactive powers control -When both active and reactive powers are activated, the feasible domains is the following: +When both active and reactive power controls are activated, the feasible domain is the following: ```{image} /_static/Load/FlexibleLoad/Domain_PmaxU_QU.svg :width: 300 :align: center ``` -Every point whose abscissa is between $P^{\mathrm{th.}}$ and 0, whose ordinate is between $-S^{\max}$ and $+S^{\max}$ -and which lies in the disc of radius $S^{\max}$ is reachable. Let's look at two examples: in the first one, the -controls are activated sequentially (reactive power first and then active power) and, in the other example, there -are used together. +Every point whose abscissa is between $P^{\mathrm{th.}}$ and 0, whose ordinate is between $-S^{\max}$ +and $+S^{\max}$ and which lies in the disc of radius $S^{\max}$ (blue shaded area) is reachable. +Let's look at two examples: in the first one, the controls are activated sequentially (reactive power +first and then active power) and, in the other example, they are used together. ### Sequentially activated controls -Let's play with the voltage thresholds of the control in order to fully activate a first control and then starts to -activate the second. +Let's define different voltage thresholds for each control so that one triggers before the other. #### Reactive power control first -In this section, the reactive power control is activated at 230 V and fully used above 240 V. Then, at 245 V, the -active control power starts and is fully activated at 250 V. - -In the following script such control is used on a network with a single-phase load connected to a single bus: +Here, the reactive power control is activated at 230 V and fully used above 240 V. Then, at 245 V, the +active power control starts and is fully used at 250 V: ```python import numpy as np @@ -609,15 +618,15 @@ fp = FlexibleParameter( control_q=Control.q_u( u_min=Q_(210, "V"), u_down=Q_(220, "V"), - u_up=Q_(230, "V"), # <---- - u_max=Q_(240, "V"), # <---- + u_up=Q_(230, "V"), # <---- lower than U_up of the P(U) control + u_max=Q_(240, "V"), # <---- lower than U_up of the P(U) control ), projection=Projection(type="euclidean"), # <---- Euclidean s_max=Q_(5, "kVA"), ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -627,14 +636,14 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Sequential_1_Trajectory_Example.svg :width: 700 :align: center ``` -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -651,44 +660,41 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as -depicted in the previous dedicated section and the choice of the projection may change the operation points for the -lowest voltages. +When the voltage is low, only the reactive power control is activated (vertical segment at +$P^{\mathrm{th.}}$); similar to what we saw in the $Q(U)$ control section. -When the voltage is high, there are two phases: +When the voltage is high, there are two stages: -1. Between 230 V and 240 V, only the reactive power decreases to reach the symmetrical point (with respect to the - x-axis) of the 205 V operation point. -2. Between 245 V and 250 V, the active power control reduces the active power to reach 0 W above 250 V. +1. Between 230 V and 240 V, only the reactive power changes: It increases on the vertical segment + to reach the perimeter of the disk. +2. Between 245 V and 250 V, the active power control starts reducing the active power until it + reaches 0 W at 250 V. #### Active power control first -In this section, the active power control is activated at 240 V and fully used above 245 V. Then, at 245 V, the -reactive control power starts and is fully activated at 250 V. - -In the following script such control is used on a network with a single-phase load connected to a single bus: +Here, the active power control is activated at 240 V and fully used above 245 V. Then, at 245 V, the +reactive power control starts and is fully activated at 250 V. ```python import numpy as np from roseau.load_flow import Q_, FlexibleParameter, Control, Projection - # Flexible parameter fp = FlexibleParameter( control_p=Control.p_max_u_production(u_up=Q_(230, "V"), u_max=Q_(240, "V")), # <---- control_q=Control.q_u( u_min=Q_(210, "V"), u_down=Q_(220, "V"), - u_up=Q_(245, "V"), # <---- - u_max=Q_(250, "V"), # <---- + u_up=Q_(245, "V"), # <---- higher than U_max of the P(U) control + u_max=Q_(250, "V"), # <---- higher than U_max of the P(U) control ), projection=Projection(type="euclidean"), # <---- Euclidean s_max=Q_(5, "kVA"), ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -698,14 +704,14 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Sequential_2_Trajectory_Example.svg :width: 700 :align: center ``` -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -722,22 +728,20 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as -depicted in the previous dedicated section and the choice of the projection may change the operation points for the -lowest voltages. +When the voltage is low, only the reactive power control is activated (vertical segment at +$P^{\mathrm{th.}}$); similar to what we saw in the $Q(U)$ control section. -When the voltage is high, there are two phases: +When the voltage is high, there are two stages: -1. Between 230 V and 240 V, only the active power decreases to reach a production of nearly 0 W. -2. Between 245 V and 250 V, the reactive power control increased the consumed the reactive power at 250 V. +1. Between 230 V and 240 V, only the active power changes. It decreases to about 0 W. +2. Between 245 V and 250 V, the reactive power control increases the reactive power until it + reaches $S^{max}$ at 250 V. ### Simultaneously activated controls -In this second subsection, the active and the reactive powers controls are activated at 240 V and reach their full +Here, the active and the reactive powers controls are both activated at 240 V and reach their full effect at 250 V. -Here is a small single phase network limited to a single bus to model the behaviour of the flexible load: - ```python import numpy as np @@ -749,15 +753,15 @@ fp = FlexibleParameter( control_q=Control.q_u( u_min=Q_(210, "V"), u_down=Q_(220, "V"), - u_up=Q_(240, "V"), # <---- - u_max=Q_(250, "V"), # <---- + u_up=Q_(240, "V"), # <---- same as U_up of the P(U) control + u_max=Q_(250, "V"), # <---- same as U_max of the P(U) control ), projection=Projection(type="euclidean"), # <---- Euclidean s_max=Q_(5, "kVA"), ) # We want to get the res_flexible_powers for a set of voltages norms -voltages = np.array(range(205, 256, 1), dtype=float) +voltages = np.arange(205, 256, dtype=float) # and when the theoretical power is the following power = Q_(-2.5, "kVA") @@ -767,14 +771,14 @@ auth = ("username", "password") res_flexible_powers = fp.compute_powers(auth=auth, voltages=voltages, power=power) ``` -If we plot the trajectory of the control in the $(P, Q)$ space, the following result is obtained: +If we plot the trajectory of the control in the $(P, Q)$ space, we get: ```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_Trajectory_Example.svg :width: 700 :align: center ``` -The same plot could have been obtained using the following command: +The same plot can be obtained with: ```python from matplotlib import pyplot as plt @@ -791,19 +795,18 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -When the voltage is low, there is only a reactive power control which is activated. Thus, everything works as -depicted in the previous dedicated section and the choice of the projection may change the operation points for the -lowest voltages. +When the voltage is low, only the reactive power control is activated (vertical segment at +$P^{\mathrm{th.}}$); similar to what we saw in the $Q(U)$ control section. -When the voltage is high, there are two phases: +When the voltage is high, there are two stages: -1. Between 240 V and 245 V, the active power control doesn't modify the value of the produced active power while the - reactive power control starts to increase the consumed reactive power. -2. Between 245 V and 250 V, the active power control starts to have effects on the produced active power. The - consumed reactive power continues to increase. -3. Above 250 V, no active power is produced. +1. Between 240 V and 245 V, the active power control does not modify the produced active power + while the reactive power control starts to increase the reactive power. +2. Between 245 V and 250 V, the active power control starts decreasing the active power while the + reactive power continues to increase. +3. Above 250 V, active power is reduced to 0 W and the reactive power is set to $S^{max}$. -If now, the theoretical power is changed to 4 kVA of production. +If we change the theoretical power to 4 kVA. ```python from matplotlib import pyplot as plt @@ -820,7 +823,7 @@ ax, res_flexible_powers = fp.plot_pq( plt.show() ``` -The following result is obtained: +Now we get a different result: ```{image} /_static/Load/FlexibleLoad/PmaxU_QU_Simultaneous_2_Trajectory_Example.svg :width: 700 diff --git a/doc/models/Load/FlexibleLoad/FlexibleParameter.md b/doc/models/Load/FlexibleLoad/FlexibleParameter.md index be3c5c3c..2a6f1823 100644 --- a/doc/models/Load/FlexibleLoad/FlexibleParameter.md +++ b/doc/models/Load/FlexibleLoad/FlexibleParameter.md @@ -152,7 +152,7 @@ fp = FlexibleParameter.pq_u_production( load = PowerLoad( id="load", bus=bus, - powers=Q_(-np.array([1000, 1000, 1000]), "VA"), + powers=Q_(-np.array([1000, 1000, 1000]), "VA"), # <- negative powers (generator) flexible_params=[fp, fp, fp], ) ``` diff --git a/doc/models/Load/FlexibleLoad/Projection.md b/doc/models/Load/FlexibleLoad/Projection.md index be7bf81e..beacd1f2 100644 --- a/doc/models/Load/FlexibleLoad/Projection.md +++ b/doc/models/Load/FlexibleLoad/Projection.md @@ -2,11 +2,13 @@ # Projections -The different controls may produce values for $P$ and $Q$ that are not feasible. The feasibility -domain in the $(P, Q)$ space is a part of the disc of radius $S^{\max}$. In these cases, the -solution found by the control algorithm has to be projected on the feasible domain. That's why we -need to define how the projection is done. There are three available projection types: the -_Euclidean_ projection, the projection at _Constant $P$_ and the projection at _Constant $Q$_. +When the control algorithm is trying to find the best control for given voltage constraints, it +could find a solution that is not "feasible" by the load. This means that the active and reactive +powers $P$ and $Q$ that constitute the solution lie outside the feasible domain defined by a part +of the disc of radius $S^{\max}$ in the $(P, Q)$ space. In these cases, the solution has to be +projected into the feasible domain. We can choose how the projection is performed using three +available projection types: +the _Euclidean_ projection, the projection at _Constant $P$_ and the projection at _Constant $Q$_. The projection accepts two approximation parameters: `alpha` and `epsilon`. @@ -19,7 +21,7 @@ The projection accepts two approximation parameters: `alpha` and `epsilon`. The lower `epsilon` is, the better the approximations are. ```{important} -Please note that no projection is performed in the final $\underline{S(U)}$ point lies in the disc of radius $S^{\max}$. +Please note that no projection is performed if the final $\underline{S(U)}$ point lies in the disc of radius $S^{\max}$. ``` ## Euclidean projection @@ -79,6 +81,6 @@ projection = Projection(type="keep_q") # alpha and epsilon can be provided ``` ```{important} -Please note that using the _Constant $Q$_ may reduce the provided $P^{\mathrm{th.}}$ of the load. See the [Feasible -Domain page](models-flexible_load-feasible_domains) for more details. +Please note that using the _Constant $Q$_ projection may reduce the provided $P^{\mathrm{th.}}$ of +the load. See the [Feasible Domain page](models-flexible_load-feasible_domains) for more details. ``` diff --git a/doc/models/Load/FlexibleLoad/index.md b/doc/models/Load/FlexibleLoad/index.md index 7fdb7f41..9dcb9a30 100644 --- a/doc/models/Load/FlexibleLoad/index.md +++ b/doc/models/Load/FlexibleLoad/index.md @@ -1,6 +1,6 @@ # Flexible loads -They are a special case of power loads: instead of being constant, the power will depend on the +They are a special type of power loads: instead of being constant, the power will depend on the voltage measured at the load and the control applied to the load. ## Equations diff --git a/roseau/load_flow/models/loads/flexible_parameters.py b/roseau/load_flow/models/loads/flexible_parameters.py index b8d784bd..0cb16913 100644 --- a/roseau/load_flow/models/loads/flexible_parameters.py +++ b/roseau/load_flow/models/loads/flexible_parameters.py @@ -867,7 +867,7 @@ def results_from_dict(self, data: JsonDict) -> NoReturn: def compute_powers( self, auth: Authentication, voltages: np.ndarray[float], power: complex, solve_kwargs: Optional[JsonDict] = None ) -> Q_[np.ndarray[complex]]: - """Compute the effective powers for different voltages (norms) + """Compute the flexible powers for different voltages (norms) Args: auth: @@ -880,7 +880,7 @@ def compute_powers( The input theoretical power of the load. solve_kwargs: - The keywords arguments of the :meth:`solve_load_flow` method. + Keywords arguments passed to the :meth:`~roseau.load_flow.ElectricalNetwork.solve_load_flow` method. Returns: The flexible powers really consumed taking into account the control. One value per provided voltage norm. @@ -942,7 +942,7 @@ def plot_pq( The optional axis to use for the plot. The current axis is used by default. solve_kwargs: - The keywords arguments of the :meth:`solve_load_flow` method. + The keywords arguments of the :meth:`~roseau.load_flow.ElectricalNetwork.solve_load_flow` method. voltages_labels_mask: A mask to activate the plot of voltages labels. By default, no voltages annotations. @@ -1037,7 +1037,7 @@ def plot_control_p( solve_kwargs: Optional[JsonDict] = None, res_flexible_powers: Optional[np.ndarray[complex]] = None, ) -> tuple["Axes", np.ndarray[complex]]: - """Plot the effective active power consumed (or produced) for the provided voltages and theoretical power. + """Plot the flexible active power consumed (or produced) for the provided voltages and theoretical power. Args: auth: @@ -1053,7 +1053,7 @@ def plot_control_p( The optional axis to use for the plot. The current axis is used by default. solve_kwargs: - The keywords arguments of the :meth:`solve_load_flow` method. + The keywords arguments of the :meth:`~roseau.load_flow.ElectricalNetwork.solve_load_flow` method. res_flexible_powers: If None, is provided, the `res_flexible_powers` are computed. Other @@ -1078,7 +1078,7 @@ def plot_control_p( res_flexible_powers = self._compute_powers( auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs ) - ax.scatter(voltages, res_flexible_powers.real, marker=".", c="blue", zorder=2, label="Effective power") + ax.scatter(voltages, res_flexible_powers.real, marker=".", c="blue", zorder=2, label="Actual power") # Add the theoretical non-smooth curve ax.plot(x, y, marker="s", c="red", zorder=1.9, label="Non-smooth theoretical control") @@ -1103,7 +1103,7 @@ def plot_control_q( solve_kwargs: Optional[JsonDict] = None, res_flexible_powers: Optional[np.ndarray[complex]] = None, ) -> tuple["Axes", np.ndarray[complex]]: - """Plot the effective reactive power consumed (or produced) for the provided voltages and theoretical power. + """Plot the flexible reactive power consumed (or produced) for the provided voltages and theoretical power. Args: auth: @@ -1119,7 +1119,7 @@ def plot_control_q( The optional axis to use for the plot. The current axis is used by default. solve_kwargs: - The keywords arguments of the :meth:`solve_load_flow` method + The keywords arguments of the :meth:`~roseau.load_flow.ElectricalNetwork.solve_load_flow` method res_flexible_powers: If None, is provided, the `res_flexible_powers` are computed. Other @@ -1144,7 +1144,7 @@ def plot_control_q( res_flexible_powers = self._compute_powers( auth=auth, voltages=voltages, power=power, solve_kwargs=solve_kwargs ) - ax.scatter(voltages, res_flexible_powers.imag, marker=".", c="blue", zorder=2, label="Effective power") + ax.scatter(voltages, res_flexible_powers.imag, marker=".", c="blue", zorder=2, label="Actual power") # Add the theoretical non-smooth curve ax.plot(x, y, marker="s", c="red", zorder=1.9, label="Non-smooth theoretical control") diff --git a/roseau/load_flow/typing.py b/roseau/load_flow/typing.py index 0c0e5c11..1e3f97a3 100644 --- a/roseau/load_flow/typing.py +++ b/roseau/load_flow/typing.py @@ -27,7 +27,7 @@ .. class:: Authentication - Valid authentication objects + Valid authentication types. """ import os from typing import Any, Literal, Union