Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a simple transformer effficiency model to pvlib #2053

Merged
merged 55 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
43234fc
wrote a simple transformer efficiency model
kurt-rhee May 12, 2024
f18ef77
edited documentation to include latex, unsure if it will compile corr…
kurt-rhee May 17, 2024
aafebe8
removed "if __main__"
kurt-rhee May 17, 2024
ee4210e
removed "if __main__"
kurt-rhee May 17, 2024
f688078
changed whatsnew rst
kurt-rhee May 17, 2024
907efd3
updated to be in compliance with Flake8
kurt-rhee May 20, 2024
a80bd7f
Update pvlib/transformer.py
kurt-rhee May 20, 2024
1072053
Update pvlib/transformer.py
kurt-rhee May 20, 2024
d8381fe
Update pvlib/transformer.py
kurt-rhee May 20, 2024
349604f
+ added transformer to index.rst
kurt-rhee May 20, 2024
af63760
Update docs/sphinx/source/reference/transformer.rst
kurt-rhee May 20, 2024
3bb1364
Update pvlib/transformer.py
kurt-rhee May 20, 2024
1571fdd
updated names of loss values and changed to [unitless]
kurt-rhee May 20, 2024
77efdde
Update pvlib/transformer.py
kurt-rhee May 20, 2024
b029b9e
Update pvlib/transformer.py
kurt-rhee May 20, 2024
06efabe
Update pvlib/transformer.py
kurt-rhee May 20, 2024
9361419
Update pvlib/transformer.py
kurt-rhee May 20, 2024
aeeb23b
Update pvlib/transformer.py
kurt-rhee May 20, 2024
3e0751c
Update pvlib/transformer.py
kurt-rhee May 20, 2024
0b18c43
Update pvlib/transformer.py
kurt-rhee May 20, 2024
8ab1001
Update pvlib/transformer.py
kurt-rhee May 20, 2024
aa31498
forgot to update arguments in test function
kurt-rhee May 20, 2024
865bfdf
updated formatting of docstring
kurt-rhee May 20, 2024
eb70aeb
Update pvlib/transformer.py
kurt-rhee May 21, 2024
35f122f
Update pvlib/transformer.py
kurt-rhee May 21, 2024
5592bc2
Update pvlib/transformer.py
kurt-rhee May 21, 2024
63649c8
Update pvlib/transformer.py
kurt-rhee May 21, 2024
d49fee5
Update pvlib/transformer.py
kurt-rhee May 21, 2024
7539402
adding space between equations in docstring
kurt-rhee May 21, 2024
d5a862c
fixing flake8 linting
kurt-rhee May 21, 2024
9fe05f8
removing whitespace
kurt-rhee May 21, 2024
99ab409
Update docs/sphinx/source/reference/transformer.rst
kurt-rhee May 21, 2024
feb2c30
Update pvlib/transformer.py
kurt-rhee May 21, 2024
e1522be
Update pvlib/transformer.py
kurt-rhee May 21, 2024
ae378c9
Update pvlib/transformer.py
kurt-rhee May 21, 2024
84ddbf2
Update pvlib/transformer.py
kurt-rhee May 21, 2024
9a7dbc6
Update pvlib/transformer.py
kurt-rhee May 21, 2024
288161b
Update docs/sphinx/source/whatsnew/v0.11.0.rst
kurt-rhee May 21, 2024
d080cc0
Update pvlib/transformer.py
kurt-rhee May 21, 2024
53934ec
Update pvlib/tests/test_transformer.py
kurt-rhee May 21, 2024
32b1aa0
Update pvlib/transformer.py
kurt-rhee May 21, 2024
477699d
Update pvlib/transformer.py
kurt-rhee May 22, 2024
d488cda
Update pvlib/transformer.py
kurt-rhee May 22, 2024
0318bfa
Merge branch 'main' into main
kurt-rhee May 23, 2024
8ed3c65
Update docs/sphinx/source/whatsnew/v0.11.0.rst
kurt-rhee May 28, 2024
90d3a61
Merge branch 'main' into main
cwhanse Jun 16, 2024
482e3b4
Update pvlib/transformer.py
kurt-rhee Jun 17, 2024
59657b8
Update pvlib/transformer.py
kurt-rhee Jun 17, 2024
c8ebe38
clean up derivation and docstring
kandersolar Jun 18, 2024
9164c67
change code calculations to match docstring
kandersolar Jun 18, 2024
816fe2a
test recovery of no-load and full-load values
kandersolar Jun 18, 2024
be62da6
bit more cleanup
kandersolar Jun 19, 2024
21abcde
typo
kandersolar Jun 19, 2024
db18c42
Apply suggestions from code review
kandersolar Jun 19, 2024
52a2593
Apply suggestions from code review
kandersolar Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/sphinx/source/reference/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ API reference
bifacial
scaling
location
transformer
11 changes: 11 additions & 0 deletions docs/sphinx/source/reference/transformer.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.. currentmodule:: pvlib

Transformer losses
==================

Methods to account for losses in transformers

.. autosummary::
:toctree: generated/

transformer.simple_efficiency
5 changes: 4 additions & 1 deletion docs/sphinx/source/whatsnew/v0.11.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ Deprecations

Enhancements
~~~~~~~~~~~~

* Add a simple transformer efficiency model :py:func:`pvlib.transformer.simple_efficiency`
(:issue:`1269`, :pull:`2053`)


Bug fixes
~~~~~~~~~
Expand All @@ -36,3 +38,4 @@ Requirements
Contributors
~~~~~~~~~~~~
* Cliff Hansen (:ghuser:`cwhanse`)
* Kurt Rhee (:ghuser:`kurt-rhee`)
40 changes: 40 additions & 0 deletions pvlib/tests/test_transformer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import pandas as pd

from numpy.testing import assert_allclose

from pvlib import transformer


def test_simple_efficiency():

# define test inputs
input_power = pd.Series([
-800.0,
436016.609823837,
1511820.16603752,
1580687.44677249,
1616441.79660171
])
no_load_loss = 0.002
load_loss = 0.007
transformer_rating = 2750000

# define expected test results
expected_output_power = pd.Series([
-6300.10103234071,
430045.854892526,
1500588.39919874,
1568921.77089526,
1604389.62839879
])

# run test function with test inputs
calculated_output_power = transformer.simple_efficiency(
input_power=input_power,
no_load_loss=no_load_loss,
load_loss=load_loss,
transformer_rating=transformer_rating
)

# determine if expected results are obtained
assert_allclose(calculated_output_power, expected_output_power)
126 changes: 126 additions & 0 deletions pvlib/transformer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
"""
This module contains functions for transformer modeling.

Transformer models calculate AC power output and losses at a given input power.
"""

import numpy as np


def simple_efficiency(
input_power, no_load_loss, load_loss, transformer_rating
):
r'''
Calculate the energy at the output terminal of the transformer
after taking into account efficiency using a simple calculation.

The equation used in this function can be derived from [1]_.


Parameters
----------
input_power : numeric
The real power input to the transformer. [W]

no_load_loss : numeric
The constant losses experienced by a transformer, even
when the transformer is not under load. Fraction of transformer rating,
value from 0 to 1. [unitless]

load_loss: numeric
The load dependent losses experienced by the transformer.
Fraction of transformer rating, value from 0 to 1. [unitless]

transformer_rating: numeric
The nominal output power of the transformer. [VA]

Returns
-------
output_power : numeric
Real power output. [W]

Notes
-------
First, assume that the load loss is proportional to the square of output
power.

.. math::

L_{load}(P_{out}) &= L_{load}(P_{rated}) \times P^2_{out}

L_{load}(P_{out}) &= L_{full, load} \times P^2_{out}

Total loss is the variable load loss, plus a constant no-load loss:

.. math::

L_{total}(P_{out}) &= L_{no, load} + L_{load}(P_{out})

L_{total}(P_{out}) &= L_{no, load} + L_{full, load} \times P^2_{out}


Conservation of energy:

.. math::

P_{in} &= P_{out} + L_{total}(P_{out})

P_{in} &= P_{out} + L_{no, load} + L_{full, load} \times P^2_{out}

Now use quadratic formula to solve for :math:`P_{out}` as a function of
:math:`P_{in}`.

.. math::

P_{out} &= \frac{-b +- \sqrt{b^2 - 4ac}}{2a}

a &= L_{full, load}

b &= 1

c &= L_{no, load} - P_{in}

Therefore:

.. math::

P_{out} = \frac{-1 \pm \sqrt{1 - 4 L_{full, load}

\times L_{no, load} - P_{in}}}{2 L_{full, load}}

Note that the positive root must be the correct one if the output power is
positive.


References
----------
.. [1] Central Station Engineers of the Westinghouse Electric Corporation,
"Electrical Transmission and Distribution Reference Book" 4th Edition.
pg. 101.

'''

# calculate the load loss in terms of VA instead of percent
loss_at_full_load = (
(no_load_loss + load_loss) * transformer_rating
)
no_load_loss = no_load_loss * transformer_rating
load_loss = loss_at_full_load - no_load_loss

# calculate how much power is lost
combined_loss = (
(1 / (2 * load_loss)) *
(
(transformer_rating ** 2) +
(2 * load_loss * input_power) -
(transformer_rating * np.sqrt(
(transformer_rating ** 2) +
(4 * load_loss) * (input_power - no_load_loss)
))
)
)

# calculate final output power given calculated losses
output_power = input_power - combined_loss

return output_power
Loading