Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file not shown.
62 changes: 62 additions & 0 deletions scripts/kipp_zonen_shadow_ring_sliding_bar_setting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
"""Script for generating slide bar settings for Kipp & Zonen shadow ring."""

import numpy as np
import pandas as pd
import pvlib

# Information has been taken from the Kipp & Zonen CM 121 shadow ring
# instruction manual.

# Note that the correction factors are based on the assumption of a horizontal
# pyranometer installation and uniform diffuse sky irradiance.

# The sliding bar has two scales; a higher and a lower one. At
# positive solar declinations (between 21 Mar. and 23 Sep.) the part of the
# scale that is oriented south must be read. In the northern hemisphere this is
# the lower part.
Comment on lines +15 to +16
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can't really see the lower part of the scale, given where the shadow ring is installed... maybe the "smart" thing to do would be to convert the values to the "upper scale"?


# The sliding bar adjustment can be derived with the formula
# L = abs(297 tan (D)), in which D is the declination of the sun.


def calculate_sliding_bar_setting(declination):
"""
Determine Kipp & Zonen shadow ring sliding bar setting.

Parameters
----------
declination : numeric
Declination angle [degrees].

Returns
-------
numeric
Sliding bar setting [cm].

"""
sliding_bar_mm = 297 * np.tan(np.deg2rad(np.abs(declination)))
sliding_bar_cm = np.round(sliding_bar_mm / 10, 1)
return sliding_bar_cm


times = pd.date_range(start='2025-01-01', end='2025-12-31', freq='1d')

declination = \
np.rad2deg(pvlib.solarposition.declination_spencer71(times.dayofyear))

slide_bar = calculate_sliding_bar_setting(declination)

df = pd.DataFrame(
data={
'Slide bar setting': slide_bar,
},
index=[times.strftime('%m %b'), times.day]
)

df = df.unstack(0)['Slide bar setting']

df = df.fillna('')

df.columns = [c.split(' ')[-1] for c in df.columns]

df.to_excel('../metadata/kipp_zonen_shadow_ring_slide_bar_setting.xlsx')