From a5e79e9b7a1494786796a87d653b63ec40ae8b69 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 23 Mar 2026 07:28:48 -0700 Subject: [PATCH 1/7] Add support of dynamic models for generators with negative PG --- .../dsf_components.cpp | 24 +++++++------------ .../model_classes/classical.cpp | 2 +- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/applications/modules/dynamic_simulation_full_y/dsf_components.cpp b/src/applications/modules/dynamic_simulation_full_y/dsf_components.cpp index 6abddbc6d..1e453e23c 100644 --- a/src/applications/modules/dynamic_simulation_full_y/dsf_components.cpp +++ b/src/applications/modules/dynamic_simulation_full_y/dsf_components.cpp @@ -226,8 +226,12 @@ bool gridpack::dynamic_simulation::DSFullBus::matrixDiagValues(ComplexType *valu if (p_ngen > 0) { for (int i = 0; i < p_ngen; i++) { if(!p_gstatus[i]) continue; - - if (p_pg[i] < 0) { + + // Only convert PG<0 generators to impedance load if they + // do NOT have a dynamic model. Generators with dynamic models + // (including motoring generators with PG<0) contribute via + // Norton current injection, not as impedance loads. + if (p_pg[i] < 0 && p_gen_nodynmodel[i]) { p_ybusr = p_ybusr+(-p_pg[i])/(p_voltage*p_voltage); p_ybusi = p_ybusi+p_qg[i]/(p_voltage*p_voltage); gridpack::ComplexType ret(p_ybusr, p_ybusi); @@ -241,14 +245,6 @@ bool gridpack::dynamic_simulation::DSFullBus::matrixDiagValues(ComplexType *valu gridpack::ComplexType u(p_ybusr, p_ybusi); values[0] = u; } - if (p_negngen > 0) { - for (int i = 0; i < p_negngen; i++) { - p_ybusr = p_ybusr+(-p_negpg[i])/(p_voltage*p_voltage); - p_ybusi = p_ybusi+p_negqg[i]/(p_voltage*p_voltage); - gridpack::ComplexType ret(p_ybusr, p_ybusi); - values[0] = ret; - } - } for (int i = 0; i < p_ngen; i++) { if(p_gen_nodynmodel[i]) { p_ybusr = p_ybusr+(-p_genpg_nodynmodel[i])/(p_voltage*p_voltage); @@ -978,7 +974,7 @@ void gridpack::dynamic_simulation::DSFullBus::load( p_gpmax.push_back(pmax); std::string model; - if (data->getValue(GENERATOR_MODEL, &model, i) && pg >= 0.0) { + if (data->getValue(GENERATOR_MODEL, &model, i)) { BaseGeneratorModel *generator = genFactory.createGeneratorModel(model); @@ -1127,7 +1123,7 @@ void gridpack::dynamic_simulation::DSFullBus::load( model.c_str(), idx); } - } else if (!data->getValue(GENERATOR_MODEL, &model, i) && pg >= 0.0){ + } else if (!data->getValue(GENERATOR_MODEL, &model, i)){ // handle the generators having no dynamic model, need to convert to negative load BaseGeneratorModel *generator = new gridpack::dynamic_simulation::BaseGeneratorModel; boost::shared_ptr basegen; @@ -1138,10 +1134,6 @@ void gridpack::dynamic_simulation::DSFullBus::load( p_genpg_nodynmodel[i] = pg; p_genqg_nodynmodel[i] = qg; p_ngen_nodynmodel++; - } else if (pg < 0.0) { - p_negpg.push_back(pg); - p_negqg.push_back(qg); - p_negngen++; } icnt++; } diff --git a/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp b/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp index 3a3b536d2..d48e285bc 100644 --- a/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp +++ b/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp @@ -163,7 +163,7 @@ void gridpack::dynamic_simulation::ClassicalGenerator::init(double mag, p_eqprime = gridpack::ComplexType(abs(p_eprime_s0),0.0); //printf("eqprime = %f\n", p_eqprime); // pmech - p_pmech = gridpack::ComplexType(abs(p_pelect),0.0); + p_pmech = gridpack::ComplexType(p_pelect,0.0); //printf("mech = %f\n", p_pmech); //printf("mva = %f\n", p_mva); //printf("d0 = %f\n", p_d0); From 1fbc1172798bc3a4d14be514c4a76e7b6efd0789 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 23 Mar 2026 09:00:45 -0700 Subject: [PATCH 2/7] fixed a type error --- .../dynamic_simulation_full_y/model_classes/classical.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp b/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp index d48e285bc..ce4725a25 100644 --- a/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp +++ b/src/applications/modules/dynamic_simulation_full_y/model_classes/classical.cpp @@ -163,7 +163,7 @@ void gridpack::dynamic_simulation::ClassicalGenerator::init(double mag, p_eqprime = gridpack::ComplexType(abs(p_eprime_s0),0.0); //printf("eqprime = %f\n", p_eqprime); // pmech - p_pmech = gridpack::ComplexType(p_pelect,0.0); + p_pmech = gridpack::ComplexType(real(p_pelect),0.0); //printf("mech = %f\n", p_pmech); //printf("mva = %f\n", p_mva); //printf("d0 = %f\n", p_d0); From fd44e78482cc27a2be343155ea6440b256d906ec Mon Sep 17 00:00:00 2001 From: Thom Williams Date: Tue, 24 Mar 2026 12:59:26 -0700 Subject: [PATCH 3/7] Fix semantic versioning with a tag based backup --- .github/workflows/docker-build.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 1b6411b16..7f54c8e36 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -74,9 +74,11 @@ jobs: images: pnnl/gridpack tags: | type=ref,event=branch - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest,enable={{is_default_branch}} + type=semver,pattern=v{{version}} + type=semver,pattern=v{{major}}.{{minor}} + type=semver,pattern=v{{major}} + type=ref,event=tag + type=raw,value=latest,enable=${{ github.event_name == 'release' || github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} type=raw,value=${{ inputs.tag || 'dev' }},enable=${{ github.event_name == 'workflow_dispatch' }} - name: Extract primary tag From f33231b9d3fdd4157d9f8158cfd19174ad4ddbb3 Mon Sep 17 00:00:00 2001 From: Thom Williams Date: Fri, 27 Mar 2026 08:32:29 -0700 Subject: [PATCH 4/7] Add github workflow to auto-update Docker hub description from README file --- .github/workflows/docker-readme.yml | 25 +++++++++++++++++++++++++ README.md | 7 +++++++ 2 files changed, 32 insertions(+) create mode 100644 .github/workflows/docker-readme.yml diff --git a/.github/workflows/docker-readme.yml b/.github/workflows/docker-readme.yml new file mode 100644 index 000000000..441903853 --- /dev/null +++ b/.github/workflows/docker-readme.yml @@ -0,0 +1,25 @@ +name: Sync Docker Hub README + +on: + push: + branches: [ develop ] + +jobs: + sync-readme: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Update Docker Hub repo description + uses: peter-evans/dockerhub-description@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + repository: pnnl/gridpack + readme-filepath: ./README.md \ No newline at end of file diff --git a/README.md b/README.md index 1b679023a..4a0b75a6e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,11 @@ # GridPACKTM--> # GridPACK: High-Performance Electric Grid Simulation +* Repo: https://github.com/gridoptics/gridpack +* Issues: https://github.com/GridOPTICS/GridPACK/issues +* Releases: https://github.com/GridOPTICS/GridPACK/releases +## About GridPACK is an open-source high-performance (HPC) package for simulation of large-scale electrical grids. Powered by distributed (parallel) computing and high-performance numerical solvers, GridPACK offers several applications forfast simulation of electrical transmission systems. GridPACK includes a number of prebuilt applications that can be directly used. The most commonly used and well-developed are: - AC Power Flow - Dynamics Simulation @@ -28,6 +32,9 @@ docker pull pnnl/gridpack:latest # Run with your files (container starts in /app/workspace) docker run -it --rm -v $(pwd):/app/workspace pnnl/gridpack:latest bash + +# Run a specific semantic version +docker run -it --rm -v $(pwd):/app/workspace pnnl/gridpack:v3.6 bash ``` The Docker image supports both AMD64 and ARM64 architectures. See the [Docker usage guide](https://gridpack.readthedocs.io/en/latest/Section2-Docker.html) for more examples. From ca6583c180e448ce3496f089cf1e8a35091f386e Mon Sep 17 00:00:00 2001 From: Thom Williams Date: Fri, 27 Mar 2026 08:42:45 -0700 Subject: [PATCH 5/7] Update README sync to Docker to use updated shared actions versions This avoids a deprecation warning from GitHub about using NodeJS 20 --- .github/workflows/docker-readme.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-readme.yml b/.github/workflows/docker-readme.yml index 441903853..4b116effd 100644 --- a/.github/workflows/docker-readme.yml +++ b/.github/workflows/docker-readme.yml @@ -8,10 +8,10 @@ jobs: sync-readme: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Login to Docker Hub - uses: docker/login-action@v4 + uses: docker/login-action@v5 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} From b1f9747bca6c69ea152b3fc83d31b292f886c41c Mon Sep 17 00:00:00 2001 From: Thom Williams Date: Fri, 27 Mar 2026 08:43:37 -0700 Subject: [PATCH 6/7] Fix broken versions --- .github/workflows/docker-readme.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-readme.yml b/.github/workflows/docker-readme.yml index 4b116effd..e9f72f349 100644 --- a/.github/workflows/docker-readme.yml +++ b/.github/workflows/docker-readme.yml @@ -11,13 +11,13 @@ jobs: - uses: actions/checkout@v5 - name: Login to Docker Hub - uses: docker/login-action@v5 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Update Docker Hub repo description - uses: peter-evans/dockerhub-description@v4 + uses: peter-evans/dockerhub-description@v5 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} From 1102d65a18921ad9ee77bf17cc2cd9f976289427 Mon Sep 17 00:00:00 2001 From: Thom Williams Date: Fri, 27 Mar 2026 08:49:06 -0700 Subject: [PATCH 7/7] Manually trigger the sync to prove it works --- .github/workflows/docker-readme.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-readme.yml b/.github/workflows/docker-readme.yml index e9f72f349..d91b615e9 100644 --- a/.github/workflows/docker-readme.yml +++ b/.github/workflows/docker-readme.yml @@ -22,4 +22,4 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} repository: pnnl/gridpack - readme-filepath: ./README.md \ No newline at end of file + readme-filepath: ./README.md