solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit f44afb5ecaa3e627112ec895f827a0266180a0f3
parent 569b918122248322ae9741c8870f7548413a1b05
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 24 May 2017 10:18:31 +0200

Merge branch 'feature_man' into develop

Diffstat:
Mcmake/CMakeLists.txt | 21++++++++++++++++++++-
Acmake/doc/CMakeLists.txt | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ddoc/cli | 82-------------------------------------------------------------------------------
Ddoc/input | 389-------------------------------------------------------------------------------
Ddoc/output | 171-------------------------------------------------------------------------------
Ddoc/receiver | 19-------------------
Adoc/solstice-input.5.txt | 976+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/solstice-man.css | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/solstice-output.5.txt | 483+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/solstice-receiver.5.txt | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/solstice.1.txt.in | 234+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/solstice_dump.c | 4++--
Msrc/solstice_solve.c | 2+-
Msrc/solstice_sun.c | 4++--
Msrc/solstice_sun_spectrum.c | 1124++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/solstice_sun_spectrum.h | 4++--
16 files changed, 2819 insertions(+), 1045 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -16,8 +16,23 @@ cmake_minimum_required(VERSION 2.8) project(solstice C) enable_testing() + option(NO_TEST "Do not build tests" OFF) +if(CMAKE_HOST_UNIX) + set(SOLSTICE_DOC "TROFF & HTML" CACHE STRING + "Type of documentation to generate and install.") +else() + set(SOLSTICE_DOC "HTML" CACHE STRING + "Type of documentation to generate and install.") +endif() + +set_property(CACHE SOLSTICE_DOC PROPERTY STRINGS + "HTML" + "TROFF" + "TROFF & HTML" + "NONE") + set(SOLSTICE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../src/) ################################################################################ @@ -57,6 +72,9 @@ include_directories( ################################################################################ # Build subprojects ################################################################################ +if(NOT SOLSTICE_DOC STREQUAL "NONE") + add_subdirectory(doc) +endif() add_subdirectory(parser) add_subdirectory(receivers) @@ -74,6 +92,8 @@ set(SOLSTICE_ARGS_DEFAULT_IMG_SPP "1") configure_file(${SOLSTICE_SOURCE_DIR}/solstice_args.h.in ${CMAKE_CURRENT_BINARY_DIR}/solstice_args.h @ONLY) +configure_file(${SOLSTICE_SOURCE_DIR}/../doc/solstice.1.txt.in + ${CMAKE_CURRENT_BINARY_DIR}/doc/solstice.1.txt @ONLY) ################################################################################ # Configure and define targets @@ -172,5 +192,4 @@ install(TARGETS solstice ARCHIVE DESTINATION bin LIBRARY DESTINATION lib RUNTIME DESTINATION bin) -install(FILES ${SOLSTICE_FILES_DOC} DESTINATION share/doc/solstice) diff --git a/cmake/doc/CMakeLists.txt b/cmake/doc/CMakeLists.txt @@ -0,0 +1,150 @@ +# Copyright (C) CNRS 2016-2017 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cmake_minimum_required(VERSION 2.8) + +string(REGEX MATCH ".*HTML.*" _html ${SOLSTICE_DOC}) +string(REGEX MATCH ".*TROFF.*" _troff ${SOLSTICE_DOC}) + +set(SOLSTICE_DOC_DIR ${PROJECT_SOURCE_DIR}/../doc) + +################################################################################ +# Look for asciidoc and a2x programs +################################################################################ +if(_html) + find_program(ASCIIDOC asciidoc) + if(NOT ASCIIDOC) + unset(_html) + message(WARNING + "The `asciidoc' program is missing. " + "The solstice HTML documentation cannot be generated.") + endif() +endif() + +if(_troff) + find_program(A2X a2x) + if(NOT A2X) + unset(_troff) + message(WARNING + "The `a2x' program is missing. " + "The solstice man pages cannot be generated.") + endif() +endif() + +################################################################################ +# Copy doc files +################################################################################ +set(MAN_NAMES + solstice-input.5 + solstice-output.5 + solstice-receiver.5) + +if(_troff OR _html) + set(MAN_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_src ${SOLSTICE_DOC_DIR}/${_name}.txt) + set(_dst ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + add_custom_command( + OUTPUT ${_dst} + COMMAND ${CMAKE_COMMAND} -E copy ${_src} ${_dst} + DEPENDS ${_src} + COMMENT "Copy the asciidoc ${_src}" + VERBATIM) + list(APPEND MAN_FILES ${_dst}) + endforeach() + add_custom_target(man-copy ALL DEPENDS ${MAN_FILES}) +endif() + +list(APPEND MAN_NAMES solstice.1) + +################################################################################ +# TROFF man pages +################################################################################ +if(_troff) + set(A2X_OPTS -dmanpage -fmanpage) + set(MAN_FILES) + set(MAN5_FILES) + set(MAN1_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_man ${CMAKE_CURRENT_BINARY_DIR}/${_name}) + set(_txt ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + + add_custom_command( + OUTPUT ${_man} + COMMAND ${A2X} ${A2X_OPTS} ${_txt} + DEPENDS man-copy ${_txt} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Build TROFF man page ${_man}" + VERBATIM) + list(APPEND MAN_FILES ${_man}) + + string(REGEX MATCH "^.*.5$" _man5 ${_man}) + string(REGEX MATCH "^.*.1$" _man1 ${_man}) + if(_man1) + list(APPEND MAN1_FILES ${_man1}) + elseif(_man5) + list(APPEND MAN5_FILES ${_man5}) + else() + message(FATAL_ERROR "Unexpected man type") + endif() + endforeach() + add_custom_target(man-troff ALL DEPENDS ${MAN_FILES}) + + install(FILES ${MAN1_FILES} DESTINATION share/man/man1) + install(FILES ${MAN5_FILES} DESTINATION share/man/man5) +endif() + +################################################################################ +# HTML documentation +################################################################################ +if(_html) + set(ASCIIDOC_OPTS + -bxhtml11 + -dmanpage + --attribute themedir=${SOLSTICE_DOC_DIR} + --theme=solstice-man) + + set(MAN_FILES) + set(MAN5_FILES) + set(MAN1_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_man ${CMAKE_CURRENT_BINARY_DIR}/${_name}.html) + set(_txt ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + + add_custom_command( + OUTPUT ${_man} + COMMAND ${ASCIIDOC} ${ASCIIDOC_OPTS} ${_txt} + DEPENDS man-copy ${_txt} ${SOLSTICE_DOC_DIR}/solstice-man.css + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Build HTML man page ${_man}" + VERBATIM) + list(APPEND MAN_FILES ${_man}) + + string(REGEX MATCH "^.*.5.html$" _man5 ${_man}) + string(REGEX MATCH "^.*.1.html$" _man1 ${_man}) + if(_man1) + list(APPEND MAN1_FILES ${_man1}) + elseif(_man5) + list(APPEND MAN5_FILES ${_man5}) + else() + message(FATAL_ERROR "Unexpected man type") + endif() + endforeach() + add_custom_target(man-html ALL DEPENDS ${MAN_FILES}) + + install(FILES ${MAN1_FILES} DESTINATION share/man/man1) + install(FILES ${MAN5_FILES} DESTINATION share/man/man5) +endif() + diff --git a/doc/cli b/doc/cli @@ -1,82 +0,0 @@ -solstice - -b # Output binary per receiver hits - -D <sun-dir-list> - -f # Force output overwrite - -h # Short help and exit - -g <dump> # Switch in dump geometry - -o OUTPUT # defaulting to stdout if not defined - -p <dump-radiative-path> # Switch in dump radiative paths mode - -q # don't print a message if no INPUT is submitted - -n INTEGER # Realisations count - -r <rendering> # Switch in rendering mode - -R FILE # receivers - -t INTEGER # Threads count - INPUT # Input scene in YAML - -solstice -r img=1280x720:pos=0,100,0:tgt=0,0,0:up=0,1,0:fov=70:spp=1 -solstice -g format=obj:split-group=1 - --g, -p and -r are exclusives - -<sun-dir-list> ::= - <sun-dir>:[ ... ] - -<sun-dir> ::= - REAL,REAL # azimuth:elevation - -<pos-on-earth> ::= - REAL:REAL:REAL # longititude:latitude:altitude - -<rendering> ::= - <rendering-option>[:<rendering-option> ... ] - -<rendering-option> ::= - <fov> | <img> | <position> | <render-mode> | <samples-per-pixel> | <target> | <up> -<dump> ::= - format=<dump-format>[:split=<split-mode>] - -<dump-radiative-path> ::= - <dump-path-option>[:<dump-path-option> ... ] - -<dump-path-option> ::= - <sun-ray-len> | <inf-ray-len> | default - -<sun-ray-len> ::= # Length of the ray starting from the sun - srlen=REAL - -<inf-ray-len> ::= # Length of the rays going to infinite - irlen=REAL - -<dump-format> ::= - obj - -<split-mode> ::= - geometry | object | none - -<fov> ::= # Horizontal field of view in degree - fov=REAL - -<img> ::= # Image resolution - img=INTEGERxINTEGER - -<position> ::= # Camera position - pos=<real3> - -<render-mode> ::= - rmode=<render-algorithm> - -<render-algorithm> ::= - draft | pt # path tracing - -<samples-per-pixel> ::= - spp=<INTEGER> - -<target> ::= # Camera target - tgt=<real3> - -<up> ::= # Camera up vector - up=<real3> - -<real3> ::= - REAL,REAL,REAL - diff --git a/doc/input b/doc/input @@ -1,389 +0,0 @@ -#-------------------------------------------------------------------------------- -# 1/ Example -#-------------------------------------------------------------------------------- -# Declare materials -- material: &lambertian - matte: - reflectivity: 1 -- material: &mirror - mirror: { reflectivity: 1, roughness: 0 } - -# Declare geometries -- geometry: &cylinders - - cylinder: { height: 5, radius: 0.5 } - material: *lambertian - transform: { rotation: [0, 90, 0] } - - cylinder: { height: 5, radius: 0.5 } - material: *lambertian - -- geometry: &parabol - - material: *mirror - parabol: - focal: 1 - clip: - - operation: SUB - vertices: [ [1, 2], [3, 4], [6, 7] ] - -# Create the solar factory -- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] } -- entity: - name: "entity0" - primary: 0 - transform: { rotation: [0, 90, 0] } - anchors: - - name: "anchor0" - position: [1, 2, 3] - - name: "anchor2" - position: [3, 4, 5] - geometry: - - stl: { path: "house.stl" } - transform: { translation: [0, 1, 2] } - material: *lambertian - - cylinder: { height: 5, radius: 0.5 } - material: *mirror - -- template: &composition - name: "composition" - primary: 1 - transform: { translation: [1, 2, 3 ] } - geometry: - - cylinder: { height: 5, radius: 0.5 } - material: *mirror - children: - - name: "hop" - primary: 1 - transform: { translation: [1, 2, 3 ] } - geometry: *cylinders - - name: "hop2" - primary: 1 - geometry: *parabol - children: - - name: "child 1" - transform: { rotation: [0, 0, 0] } - x_pivot: - target: { position: [0, 0, 0] } -- entity: - name: "entity2" - transform: { translation: [4, 5, 6] } - children: [ *composition ] - -- entity: - name: "entity3" - transform: { translation: [7, 8, 9] } - children: [ *composition ] - -- entity: - name: "entity4" - transform: { translation: [10, 11, 12] } - children: [ *composition ] - -#-------------------------------------------------------------------------------- -# 2/ Grammar -#-------------------------------------------------------------------------------- -<solar-factory> ::= - <sun> - <items> -[ <atmosphere> ] - -<items> ::= - - <item> -[ - <item> ... ] - -<item> ::= - <entity> - | <geometry> - | <material> - | <medium> - | <spectrum> - | <template> - -#---------------------------------------- -<geometry> ::= - geometry: - - <object> -[ - <object> ... ] - -<object> ::= - <shape> - <material> -[ <transform> ] - -<x_pivot> ::= - x_pivot: -[ ref_point: <real3>. Default 0,0,0 ] - <target> - -<zx_pivot> ::= - zx_pivot: -[ spacing: REAL # in [0, INF). Default 0 ] -[ ref_point: <real3>. Default 0,0,0 ] - <target> - -<target> ::= - target: - anchor: <anchor-identifier> - | direction: <real3> - | position: <real3> - | <sun> - -#---------------------------------------- -<shape> ::= - <cuboid> - | <cylinder> - | <obj> - | <parabol> - | <parabolic-cylinder> - | <hyperbol> - | <hemisphere> - | <plane> - | <sphere> - | <stl> - -<cuboid> ::= - cuboid: - size: <real3*+> - -<cylinder> ::= - cylinder: - height: REAL # in ]0, INF) - radius: REAL # in ]0, INF) -[ slices: INTEGER # in [4, 4096]. Default 16 ] -[ stacks: INTEGER # in [1, 4096]. Default 1 ] - -<obj> ::= - obj: - path: PATH - -# x^2 + y^2 - 4*focal*z = 0 -<parabol> ::= - parabol: - focal: REAL # in ]0, INF) - clip: <polyclip-list> - # By default slices is automatically computed with respect to the parabol - # curvature -[ slices: INTEGER # in [4, 4096) ] - -<parabolic-cylinder> ::= - parabolic-cylinder: # y^2 - 4*focal*z = 0 - focal: REAL # in ]0, INF) - clip: <polyclip-list> - # By default slices is automatically computed with respect to the hyperbol - # curvature -[ slices: INTEGER # in [4, 4096) ] - -# (x^2 + y^2) / a^2 - (z + z0 - g/2)^2 / b^2 + 1 = 0 -# with g = img_focal + real_focal; f = real_focal / g; -# a^2 = g^2(f - f^2); b = g(f - 1/2); z0 = |b| + g/2 -<hyperbol> ::= - hyperbol: - focals: <hyperboloid_focals> - clip: <polyclip-list> - # By default slices is automatically compute with respect to the hyperbol - # curvature -[ slices: INTEGER # in [4, 4096) ] - -<hyperboloid_focals> ::= - real: REAL # in ]0, INF) - image: REAL # in ]0, INF) - -# x^2 + y^2 + (z - radius)^2 - radius^2 = 0 -<hemisphere> ::= - hemisphere: - radius: REAL # in ]0, INF) -[ clip: <polyclip-list> ] - # By default slices is automatically compute with respect to the hemisphere - # extension -[ slices: INTEGER # in [4, 4096) ] - -<plane> ::= - plane: - clip: <polyclip-list> -[ slices: INTEGER # in [1, 4096). Default 1 ] - -<sphere> ::= - sphere: - radius: REAL # in ]0, INF) -[ slices: INTEGER # in [4, 4096). Default 16 ] -[ stacks: INTEGER # in [2, 4096]. Default slices/2 ] - -<stl> ::= - stl: - path: PATH - -#---------------------------------------- -<polyclip-list> ::= - - <polyclip> -[ - <polyclip> ... ] - -<polyclip> ::= - operation: <AND|SUB> - <contour-descriptor> - -<contour-descriptor> ::= - <vertices-descriptor> - | <circle-descriptor> - -<vertices-descriptor> ::= - vertices: <vertices-list> - -<circle-descriptor> ::= - circle: - radius: REAL # in ]0, INF) -[ center: <real2>. Default 0,0 ] -[ segments: INTEGER # in [3, 4096). Default 64 ] - -<vertices-list> ::= - - <real2> - - <real2> - - <real2> -[ - <real2> ... ] - -#---------------------------------------- -<material> ::= - material: <material-descriptor> | <double-sided-material> - -<double-sided-material> ::= - front: <material-descriptor> - back: <material-descriptor> - -<material-descriptor> ::= - <dielectric> | <matte> | <mirror> | thin-dielectric> | <virtual> - -<dielectric> ::= - dielectric: - medium_i: <medium-descriptor> - medium_t: <medium-descriptor> -[ <normal-map> ] - -<matte> ::= - matte: - reflectivity: <mtl-data> # in [0, 1] -[ <normal-map> ] - -<mirror> ::= - mirror: - reflectivity: <mtl-data> # in [0, 1] - roughness: <mtl-data> # in [0, 1] -[ <normal-map> ] - -<virtual> ::= - virtual: EMPTY-STRING - -<thin-dielectric> ::= - thin_dielectric: - thickness: REAL # in [0, INF) - medium_i: <medium-descriptor> - medium_t: <medium-descriptor> -[ <normal-map> ] - -<normal-map> ::= - normal_map: { path: PATH } - -#---------------------------------------- -<medium> ::= - medium: <medium-descriptor> - -<medium-descriptor> ::= - refractive_index: <mtl-data> # value in ]0, INF) - absorptivity: <mtl-data> # value in [0, INF) - -#---------------------------------------- -<entity> ::= - entity: - <entity-data> - -<template> ::= - template: - <entity-data> - -<entity-data> ::= - name: STRING # except "self" -[ <geometry-data> | <x_pivot> | <zx_pivot> ] -[ <anchors> ] -[ <transform> ] -[ <children> ] - -<geometry-data> ::= - primary: INTEGER # in [0, 1] - <geometry> - -<children> ::= - children: - - <entity-data> -[ - <entity-data> ... ] - -<anchors> ::= - anchors: - - <anchor-data> -[ - <anchor-data> ... ] - -<anchor-data> ::= - name: STRING - <position-description> - -<position-description> ::= - position: <real3> | hyperboloid_image_focals: <hyperboloid_focals> - -# "self" references the first level entity -<entity-identifier> ::= - <self|STRING>[.STRING ... ] - -<anchor-identifier> ::= - <entity-identifier>.STRING - -#---------------------------------------- -<sun> ::= - sun: - dni: REAL # Direct Normal Irradiance in ]0, INF) -[ <spectrum> ] # If not defined use the smarts295 spectrum -[ <radial-angular-distribution> ] - -<radial-angular-distribution> ::= - <pillbox> | <buie> - -<buie> ::= - buie: - csr: REAL # in [1e-6, 0.849] - -<pillbox> ::= - pillbox: - aperture: REAL # in ]0, 90] - -#---------------------------------------- -<atmosphere> ::= - atmosphere: - absorption: <mtl-data> # in [0, 1] - -#---------------------------------------- -<mtl-data> ::= - REAL | <spectrum-data-list> - -<transform> ::= - transform: - translation: <real3> - rotation: <real3> - -<real2> ::= - - REAL - - REAL - -<real3> ::= - - REAL - - REAL - - REAL - -<real3*+> ::= - - REAL # in ]0, inf) - - REAL # in ]0, inf) - - REAL # in ]0, inf) - -<spectrum> ::= - spectrum: <spectrum-data-list> - -<spectrum-data-list> ::= - - <spectrum-data> -[ - <spectrum-data> ... ] - -<spectrum-data> ::= - wavelength: REAL # in [0, INF) - data: REAL # in [0, INF) diff --git a/doc/output b/doc/output @@ -1,171 +0,0 @@ -<output> ::= - <simulation-output> - | <geometry-dump-output> - | <pathes-dump-output> - | <rendering-output> - | <hits-on-receivers-output> - - - -<simulation-output> ::= - <sun-direction> - <counts> - <global-results> -[ <mc-receiver-result-list> ] -[ <mc-primary-result-list> ] -[ <mc-receiverXprimary-result-list> ] - -<sun-direction> ::= - #--- Sun direction: <azimuth> <elevation> (<dirX> <dirY> <dirZ>) - -<counts> ::= - <global-results-count> <receivers-count> <primaries-count> <sample-count> <failed-sample-count> - -<global-results> ::= - <potential-irradiance> - <absorbed-irradiance> - <cos-factor> - <shadow-loss> - <missing-loss> - <absorptivity-loss> - <reflectivity-loss> - -<mc-receiver-result-list> ::= - <mc-receiver-result> -[ <mc-receiver-result-list> ] - -<mc-primary-result-list> ::= - <mc-primary-result> -[ <mc-primary-result-list> ] - -<mc-receiverXprimary-result-list> ::= - <mc-receiverXprimary-result> -[ <mc-receiverXprimary-result-list> ] - -<mc-receiver-result> ::= - <receiver-name> <receiver-id> <area> <mc-front-receiver-results> <mc-back-receiver-results> - -<mc-front-receiver-results> ::= -<mc-back-receiver-results> ::= - <absorbed-irradiance> <irradiance> <reflectivity-loss> <absorptivity-loss> <efficiency> - -<mc-primary-result> ::= - <primary-name> <primary-id> <area> <sample-count> <cos-factor> <shadow-loss> - -<mc-receiverXprimary-result> ::= - <receiver-id> <primary-id> <mc-front-receiverXprimary-results> <mc-back-receiverXprimary-results> - -<mc-front-receiverXprimary-results> ::= -<mc-back-receiverXprimary-results> ::= - <absorbed-irradiance> <irradiance> <reflectivity-loss> <absorptivity-loss> - -<azimuth> ::= - REAL # degrees in [0 360 ] - -<elevation> ::= - REAL # degrees in [0 90 ] - -<dirX> ::= -<dirY> ::= -<dirZ> ::= - REAL - -<global-results-count> ::= - 7 - -<receivers-count> ::= -<primaries-count> ::= -<sample-count> ::= -<failed-sample-count> ::= - INTEGER # in [0 inf) - -<receiver-name> ::= - STRING - -<receiver-id> ::= -<primary-id> ::= - INTEGER - -<area> ::= - REAL # in ]0 inf) - -<potential-irradiance> ::= -<absorbed-irradiance> ::= -<irradiance> ::= -<shadow-loss> ::= -<missing-loss> ::= -<absorptivity-loss> ::= -<reflectivity-loss> ::= -<cos-factor> ::= -<efficiency> ::= - <estimation> - -<estimation> ::= - REAL REAL # Expected value and standard error - - - -<geometry-dump-output> ::= - <sun-direction> - <obj-ascii-output> # ascii description of a geometry according to OBJ format -[ <geometry-dump-output> ] - - - -<pathes-dump-output> ::= - <sun-direction> - <vtk-pathes-output> # ascii description of pathes according to VTK compatible format -[ <pathes-dump-output> ] - - - -<rendering-output> ::= - <sun-direction> - <vtk-pathes-output> # ascii image description according to PPM format -[ <rendering-output> ] - - -<hits-on-receivers-output> ::= - <simulation-output> - <hits-binary-output> # binary description of receiver's hits -[ <hits-on-receivers-output> ] - -<hits-binary-output> ::= - <hit-binary-output> -[ <hits-binary-output>] - -<hit-binary-output> ::= - <sample-id> <date> <segment-id> <receiver-id> <wavelength> <pos> <in-dir> <normal> <mc-weight> <uv> - -<sample-id> ::= - INTEGER # int64_t - -<date> ::= - INTEGER # int64_t - -<segment-id> ::= - INTEGER # int32_t - -<receiver-id> ::= - INTEGER # int32_t - -<wavelength> ::= - REAL # float - -<pos> ::= - REAL[3] # float - -<in-dir> ::= - REAL[3] # float - -<normal> ::= - REAL[3] # float - -<mc-weight> ::= - REAL # double - -<uv> ::= - REAL[2] # float - - - diff --git a/doc/receiver b/doc/receiver @@ -1,19 +0,0 @@ -- { name: "entity.mirror", side: BACK } -- { name: "entity2.mirror0, side: FRONT } -- { name: "entity2.mirror1, side: FRONT_AND_BACK } - --------------------------------------------------------------------------------- -2/ Grammar --------------------------------------------------------------------------------- -<receivers> ::= - - <receiver> -[ - <receiver> ... ] - -<receiver> ::= - name: <entity-identifier> - side: <BACK|FRONT|FRONT_AND_BACK> -[ per_primitive: INTEGER ] # in [0, 1] - -<entity-identifier> - STRING[.STRING ... ] - diff --git a/doc/solstice-input.5.txt b/doc/solstice-input.5.txt @@ -0,0 +1,976 @@ +// Copyright (C) CNRS 2016-2017 +// +// This is free documentation: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This manual is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +:toc: + +solstice-input(5) +================= + +NAME +---- +solstice-input - solar plant description for solstice(1) + +DESCRIPTION +----------- +The *solstice-input* is the format used by the *solstice*(1) program to +represent a solar plant. It relies on the YAML 1.1 data serialization standard +[1]; assuming that the file is compatible with the *solstice-input* semantic, a +solar plant can be described by using the whole YAML 1.1 functionalities +including compact notation and data tagging. + +A solar plant is composed of a *sun*, an optional *atmosphere* and a collection +of *geometries*, i.e. *shapes* with their associated *material*. Beside the raw +description of the aforementioned data, the *solstice-input* format provides +the *entity* item to efficiently structure the geometries in the scene. An +entity is a node in a tree data structure where the position of each child +entity is relative to the position of its parent. An entity can either +encapsulate a *geometry* or a *pivot* that controls the dynamic positioning of +its child entities with respect to the pivot constraints and the sun direction +submitted to the *solstice*(1) program. + +GRAMMAR +------- + +[verse] +_______ +<solar-plant> ::= - <sun> + - <item> + [ - <item> ... ] + [ - <atmosphere> ] + +<item> ::= <entity> + | <geometry> + | <material> + | <medium> + | <spectrum> + | <template> + +------------------------------------- + +<geometry> ::= geometry: + - <object> + [ - <object> ... ] + +<object> ::= <shape> + <material> + [ <transform> ] + +<x_pivot> ::= x_pivot: + <target> + [ ref_point: <real3> ] # Default is [0,0,0] + +<zx_pivot> ::= zx_pivot: + <target> + [ spacing: REAL ] # in [0, INF). Default 0 + [ ref_point: <real3> ] # Default is [0,0,0] + +<target> ::= target: + anchor: <anchor-identifier> + | direction: <real3> + | position: <real3> + | <sun> + +------------------------------------- + +<shape> ::= <cuboid> + | <cylinder> + | <hemisphere> + | <hyperbol> + | <parabol> + | <parabolic-cylinder> + | <plane> + | <sphere> + | <stl> + +<cuboid> ::= cuboid: + size: <real3> # in ]0, INF]^3 + +<cylinder> ::= cylinder: + height: REAL # in ]0, INF) + radius: REAL # in ]0, INF) + [ slices: INTEGER ] # in [4, 4096]. Default is 16 + [ stacks: INTEGER ] # in [1, 4096]. Default is 1 + +<hemisphere> ::= hemisphere: + radius: REAL # in ]0, INF) + [ clip: <polyclip-list> ] + [ slices: INTEGER ] # in [4, 4096] + +<hyperbol> ::= hyperbol: + focals: <hyperboloid-focals> + clip: <polyclip-list> + [ slices: INTEGER ] # in [4, 4096] + +<parabol> ::= parabol: + focal: REAL # in ]0, INF) + clip: <polyclip-list> + [ slices: INTEGER ] # in [4, 4096] + +<parabolic-cylinder> ::= parabolic-cylinder: + focal: REAL # in ]0, INF) + clip: <polyclip-list> + [ slices: INTEGER ] # in [4, 4096] + +<plane> ::= plane: + clip: <polyclip-list> + [ slices: INTEGER ] # in [1, 4096]. Default is 1 + +<sphere> ::= sphere: + radius: REAL # in ]0, INF) + [ slices: INTEGER ] # in [4, 4096]. Default is 16 + [ stacks: INTEGER ] # in [2, 4096]. Default is slices/2 + +<stl> ::= stl: + path: PATH + +<hyperboloid-focals> ::= real: REAL # in ]0, INF) + image: REAL # in ]0, INF) + +---------------------------------------- + +<polyclip-list> ::= - <polyclip> + [ - <polyclip> ... ] + +<polyclip> ::= operation: <AND|SUB> + <contour-descriptor> + +<contour-descriptor> ::= <circle-descriptor> + | <vertices-descriptor> + +<vertices-descriptor> ::= vertices: <vertices-list> + +<circle-descriptor> ::= circle: + radius: REAL # in ]0, INF) + [ center: <real2> ] # Default is 0,0 + [ segments: INTEGER ] # in [3, 4096]. Default is 64 + +<vertices-list> ::= - <real2> + - <real2> + - <real2> + [ - <real2> ... ] + +---------------------------------------- + +<material> ::= material: + <material-descriptor> + | <double-sided-mtl> + +<double-sided-mtl> ::= front: <material-descriptor> + back: <material-descriptor> + +<material-descriptor> ::= <dielectric> + | <matte> + | <mirror> + | <thin-dielectric> + | <virtual> + +<dielectric> ::= dielectric: + medium_i: <medium-descriptor> + medium_t: <medium-descriptor> + [ <normal-map> ] + +<matte> ::= matte: + reflectivity: <mtl-data> # in [0, 1] + [ <normal-map> ] + +<mirror> ::= mirror: + reflectivity: <mtl-data> # in [0, 1] + roughness: <mtl-data> # in [0, 1] + [ <normal-map> ] + +<virtual> ::= virtual: EMPTY-STRING + +<thin-dielectric> ::= thin_dielectric: + thickness: REAL # in [0, INF) + medium_i: <medium-descriptor> + medium_t: <medium-descriptor> + [ <normal-map> ] + +<normal-map> ::= normal_map: + path: PATH + +---------------------------------------- + +<medium> ::= medium: <medium-descriptor> + +<medium-descriptor> ::= refractive_index: <mtl-data> # in ]0, INF) + absorptivity: <mtl-data> # in [0, INF) + +---------------------------------------- + +<entity> ::= entity: <entity-data> + +<template> ::= template: <entity-data> + +<entity-data> ::= name: STRING + [ <geometry-data> | <x_pivot> | <zx_pivot> ] + [ <anchors> ] + [ <transform> ] + [ <children> ] + +<geometry-data> ::= primary: INTEGER # in [0, 1] + <geometry> + +<children> ::= children: + - <entity-data> + [ - <entity-data> ... ] + +<anchors> ::= anchors: + - <anchor-data> + [ - <anchor-data> ... ] + +<anchor-data> ::= name: STRING + <position-descriptor> + +<position-descriptor> ::= position: <real3> + | hyperboloid_image_focals: <hyperboloid_focals> + +<entity-identifier> ::= <self|STRING>[.STRING ... ] + +<anchor-identifier> ::= <entity-identifier>.STRING + +---------------------------------------- + +<sun> ::= sun: + dni: REAL # Direct Normal Irradiance in ]0, INF) + [ <spectrum> ] # Default is the smarts295 spectrum + [ <sun-shape> ] + +<sun-shape> ::= <pillbox> | <buie> + +<buie> ::= buie: + csr: REAL # in [1e-6, 0.849] + +<pillbox> ::= pillbox: + aperture: REAL # in ]0, 90] + +---------------------------------------- + +<atmosphere> ::= atmosphere: + absorption: <mtl-data> # in [0, 1] + +---------------------------------------- + +<mtl-data> ::= REAL + | <spectrum-data-list> + +<transform> ::= transform: + translation: <real3> + rotation: <real3> + +<real2> ::= - REAL + - REAL + +<real3> ::= - REAL + - REAL + - REAL + +<spectrum> ::= spectrum: <spectrum-data-list> + +<spectrum-data-list> ::= - <spectrum-data> + [ - <spectrum-data> ... ] + +<spectrum-data> ::= wavelength: REAL # in [0, INF) + data: REAL # in [0, INF) +_______ + +SUN +--- + +The *sun* describes the source of the solar-plant. Its direction is not defined +into the *solstice-input*(5) file but is provided by the *solstice*(1) command. +This allows to use the same unmodified *solstice-input*(5) file for several +simulations with different sun directions. + +The main *sun* property is its direct normal irradiance, or *dni* in W.m\^-2. +Its value is a scalar defining the direct irradiance received on a plane +perpendicular to the main sun direction. The optional *spectrum* parameter +describes the per wavelength distribution of the sun *dni*. Note that this +distribution is automatically normalized by *solstice*(1). If the *spectrum* +attribute is not defined, *solstice*(1) uses a default spectrum computed with +the SMARTS software [2] between 0.28 and 4 micro-meters. The total *dni* +(integrated over the spectral range) was set to 1000 W.m^-2. The standard +Mid-Latitude-Summer atmosphere was used with most of gases concentration set +as default (the CO2 concentration was assumed 400ppmv in the atmosphere +column). + +Even if an atmosphere is provided, the atmospheric effects from the top of the +atmosphere to ground level are not computed using the atmosphere description. +As a result, the sun description (*dni* and optional *spectrum*) is expected to +include all the atmospheric effects (sun irradiance available at ground +level). + +The *sun-shape* parameter controls the angular distribution of the sun light +intensity across the sun's disk. If not defined, the distribution is assumed to +be a dirac distribution (infinite directional source). The available sun +shapes are: + +*pillbox*:: + The *pillbox* distribution defines an uniform intensity over the sun's disk. + Its single *aperture* parameter is the sun's disk half-angle in degrees, that + is linked to the apparent size of the sun. A typical aperture is 0.2664. + +*buie*:: + The *buie* distribution, as first discribed in [3]. Its single *csr* + parameter is the ratio between the circumsolar irradiance and the sum of + the circumsolar and sun's disk irradiance. An analysis on typical *csr* + values can be found in [4]. + +ATMOSPHERE +---------- + +The *atmosphere*, when provided, describes the medium surrounding the +solar-plant. Its only parameter is its absorption coefficient in m^-1, that +can either be a scalar if the *absorption* is constant over the spectrum, or +can be spectrally described. The absorption along light paths is only computed +after the first reflector, as sun description must include all the atmospheric +effects before the first reflector (see sun description for more details). + +If no atmosphere is provided, atmospheric absorption after the first reflector +is not taken into account. + +MATERIAL +-------- + +A *material* describes the properties of an interface. These properties can be +the same for the two sides of the interface or may be differentiated with a +*double-sided-mtl*. The material comportment is controlled by a +*material-descriptor* that specifies the physical properties of the interface +as well as its optional normal perturbation. Note that the physical properties +can be either scalars or spectral data. + +Material descriptors +~~~~~~~~~~~~~~~~~~~~ + +The available material descriptors are: + +*dielectric*:: +Interface between 2 dielectric media. Its *medium_i* parameter defines the +current medium, i.e. the medium the ray travels in, while *medium_t* +represents the opposite medium. Incoming rays are either specularly reflected +or refracted according to a Fresnel term computed with respect to the +refractive indices of the 2 media as: ++ +....... +Fr = 1/2 * (Rs^2 + Rp^2) +....... ++ +with Rs and Rp the reflectance for the light polarized with its electric +field perpendicular or parallel to the plane of incidence, respectively. ++ +....... +Rs = (n1 * |wi.N| - n2 * |wt.N|) / (n1 * |wi.N| + n2 * |wt.N|) +Rp = (n2 * |wi.N| - n1 * |wt.N|) / (n2 * |wi.N| + n1 * |wt.N|) +....... ++ +with n1 and n2 the indices of refraction of the incident and transmitted +media, and wi and wt the incident and transmitted direction. Note that the +*solstice-input*(5) file must ensure that the description of the scene media +is consistent; a ray travelling in a medium _A_ can only encounter a medium +interface whose *medium_i* attribute is _A_. The default medium is assumed to +be the vacuum, i.e. its refractive index is 1 and its absorptivity is 0. + +*matte*:: +Diffuse surface. Reflects the same intensity in all directions independently +of the incoming direction. + +*mirror*:: +Specular or glossy reflection whether the *roughness* parameter is 0 or not, +respectively. Glossy reflections are controlled by a microfacet BRDF with the +Beckmann normal distribution defined as: ++ +....... +D(wh) = exp(-tan^2(a) / m^2) / (PI * m^2 * cos^4(a)) +....... ++ +with a = arccos(wh.N) and m the *roughness* in ]0,1] of the interface. + +*thin-dielectric*:: +The interface is assumed to be a thin slab of a dielectric material. The +*medium_i* parameter defines the outside dielectric medium while *medium_t* +is the medium of the thin slab. Incoming rays are either specularly reflected +or transmitted (without deviation) according to a Fresnel term computed with +respect to the refractive indices of the 2 media as: ++ +....... +Fr = 1/2 * (Rs^2 + Rp^2) +....... ++ +with Rs and Rp the reflectance for the light polarized with its electric +field perpendicular or parallel to the plane of incidence, respectively. ++ +....... +Rs = (n1 * |wi.N| - n2 * |wt.N|) / (n1 * |wi.N| + n2 * |wt.N|) +Rp = (n2 * |wi.N| - n1 * |wt.N|) / (n2 * |wi.N| + n1 * |wt.N|) +....... ++ +with n1 and n2 the indices of refraction of the incident and transmitted +media, and wi and wt the incident and transmitted direction. Note that the +underlying scattering function correctly handles the multiple refraction +effects into the thin slab. + +*virtual*:: +Fully transparent interface. + +Normal map +~~~~~~~~~~ + +All the material descriptors, excepted the *virtual*, provide an optional +*normal-map* attribute that defines a path toward a Portable PixMap image [5] +whose pixels store a normal expressed in the tangent space of the interface. By +default the unperturbed tangent space normal is {0,0,1}. The PPM image can +be encoded on 8 or 16-bits per component either in ASCII or binary. The +parameterization of this 2D image onto the shape surfaces depends on the type +of the shape. For the *hemisphere*, *hyperbol*, *parabol*, *plane* and +*parabolic-cylinder* shapes, the image is mapped in the {X,Y} plane. The other +shapes are not parameterized and consequently, applying a normal-mapped +material on these shapes leads to undefined behaviors. + +SHAPE +----- + +A *shape* describes a geometric model. It is defined in its local space, i.e. +in a coordinate system whose origin is proper to the shape. No space +transformation can be introduced through the declaration of a shape: it should +be transformed externally through an *object* and/or *entities*. +*solstice-input*(1) provides 2 types of shape: quadric and mesh. The former is +used to declare parametric surfaces, while the latter describes triangulated +surfaces. + +Quadric +~~~~~~~ + +A quadric shape is defined from a quadric equation and a set of 2D clipping +operations performed in their {X,Y} plane. By convention, the front side of the +quadric surface looks toward the positive Z axis. Internally, the clipped +quadric surface is discretized in a triangular mesh with respect to the +discretisation parameters of the quadric. This mesh is used by *solstice*(1) +as a "proxy" to speed up the access toward the quadric shape: the quadric +position and its associated normal are in fine computed from the quadric +equation. + +The quadric surface is parameterized in the {X,Y} plane. Its parameterization +domain is defined from the bounds of its clipped mesh in the {X,Y} plane: + + u = (x - lowerX) / (upperX-lowerX) + v = (y - lowerY) / (upperY-lowerY) + +with *u* and *v* the mapped 2D coordinates from a 3D position {*x*,*y*,*z*} +onto the quadric, and *lower*<**X**|**Y**> and *upper*<**X**|**Y**> the lower +and upper bounds of the clipped quadric along the X and Y axis. The available +quadrics are: + +*hemisphere*:: +Hemispheric shape whose up direction is along the negative Z axis and its +polar coordinate is positioned at the origin. The *slices* parameter controls +the number of divisions along the Z axis. ++ +....... +x^2 + y^2 + (z-radius)^2 = radius^2 +....... + +*hyperbol*:: +Hyperbolic quadric defined along the Z axis whose minimum is positioned at +the origin. The *slices* parameter controls the discretisation of the +hyperbol. If not defined, it is automatically computed with respect to the +hyperbol curvature. ++ +....... +(x^2 + y^2) / a^2 - (z + z0 - g/2)^2 / b^2 + 1 = 0 + +a^2 = g^2(f - f^2) +b = g(f - 1/2) +z0 = |b| + g/2 +g = focals.real + focals.image +f = focals.real / g +....... + +*parabol*:: +Parabolic quadric defined along the Z axis whose minimum is positioned at the +origin. The *slices* parameter controls the discretisation of the parabol. If +not defined, it is automatically computed with respect to the parabol +curvature. ++ +....... +x^2 + y^2 - 4 * focal * z = 0 +....... + +*parabolic-cylinder*:: +Parabolic cylinder oriented along the Z axis whose main axis is along the X +axis and minimum is positioned at the origin. The *slices* parameter +controls the discretisation of the parabolic cylinder. If not defined, it is +automatically computed with respect to the parabolic cylinder curvature. ++ +....... +y^2 - 4 * focal * z = 0 +....... + +*plane*:: +Plane whose normal points along the positive Z axis. The *slices* attribute +controls the discretisation of the clipped plane. + +Clipping +~~~~~~~~ + +A clipping operation, or *polyclip*, is used to remove some parts of the +quadric surface. It is defined by a 2D *contour-descriptor* expressed in the +{X,Y} plane and a clipping *operation*. The *AND* and *SUB* clip operands, +remove the quadric surface that intersects or does not intersect the +*contour-descriptor*, respectively. The available *countour-descriptors* are: + +*circle-descriptor*:: +Circular contour whose size is defined by the *radius* parameter. Actually, +*solstice*(1) discretized the circular contour with respect to the *segments* +attribute that defines the overall number of segments used to approximate the +circle. + +*vertices-descriptor*:: +Polygonal contour describes by a list of 2D vertices. The polygon edges are +defined by connecting each vertex to its previous one. To ensure that the +polygon is closed, an additional edge is automatically created between the +first and the last vertex. Note that *solstice*(1) assumes that the defined +polygon does not overlap itself, i.e. their non consecutive edges are not +intersecting. + +The *clip* parameter of the quadrics lists a set of the aforementioned 2D +*polyclips*. Each of these clipping operation is successively applied on the +remaining quadric surface, in the order on which they are declared. For +instance, the following example uses 5 clipping operations on a plane to build +a rectangle with a circular hole at each of its corner. The first *polyclip* +limits the infinite plane to a rectangle centered in 0 whose size in X and Y is +8 and 4, respectively. The 4 subsequent *polyclips* drill the +rectangle near of its corner with circles whose radius is 0.5: + +....... +plane: + clip: + - {operation: AND, vertices: [[-4,-2],[-4,2],[4,2],[4,-2]]} + - {operation: SUB, circle: {radius: 0.5, center: [-3,-1]}} + - {operation: SUB, circle: {radius: 0.5, center: [-3, 1]}} + - {operation: SUB, circle: {radius: 0.5, center: [ 3,-1]}} + - {operation: SUB, circle: {radius: 0.5, center: [ 3, 1]}} +....... + +Triangular mesh +~~~~~~~~~~~~~~~ + +Triangular meshes are generated by *solstice*(1) from a shape description or +loaded from a CAO file. Their normals are defined per triangle and are thus +discontinuous even for smooth shapes as spheres. The triangular meshes are not +parameterized, i.e. they do not provide a mapping from a 3D position onto its +surface to a 2D coordinates. Applying a normal-mapped material to a triangular +meshes will thus produce undefined behaviors. + +The available triangular meshes are: + +*cuboid*:: + Axis aligned cuboid centered in 0 whose corner positions and dimensions along + the 3 axis are defined by the *size* parameter. The front side of the cuboid + surface looks outside the cuboid. + +*cylinder*:: + Cylinder centered in 0 whose *height* is along the positive Z axis. The top + and the bottom of the cylinder is capped. The *stacks* and *slices* + parameters control the discretisation, i.e. the number of divisions, along or + around the Z axis, respectively. The front side of the cylinder surface looks + outside the cylinder. + +*sphere*:: + Triangulated sphere centered in 0. The *stacks* and *slices* parameters + control the discretisation, i.e. the number of divisions, along or around the + Z axis, respectively. The front side of the sphere surface looks outside the + sphere. + +*stl*:: + Path toward an external mesh file defined with respect to the **ST**ereo + **L**ithography file format. The front side of the loaded triangles is + defined with respect to their vertex ordering into the STL file: a triangle + is front facing when their vertices are clock wise ordered. + +ENTITY +------ + +An *entity* is used to declare and position shapes into the solar plant. +Actually, the entity is the only item that effectively spawns a *geometry* into +the solar plant: if a geometry is declared but not referenced by an entity, it +is ignored by *solstice*(1). An entity is a hierarchical data structure that +can have child entities whose transformation is relative to their parent. If +not defined, the *transform* parameter of an entity is assumed to be the +identity, i.e. its *rotation* and *translation* are nulls. + +Each entity has a *name* which must be unique per hierarchy level: 2 root +entities (i.e. entities without parent) cannot have the same name as well as +the children of a same parent entity. A child entity is identified into the +solar plant by successively concatenating, with the \'.' character, the name of +its ancestors with its own name. This naming convention is used in the +*solstice-receiver*(5) format to define the entities to track during the +*solstice*(1) computations. For instance, in the following example, the +*entity-identifier* of the child entity named *level2* is +*level0.level1.level2*: +....... +entity: + name: level0 + child: + - name: level1 + child: + - name: level2 +....... + +An entity encapsulates either a *geometry* or a *pivot*. The former is a +collection of *objects*, i.e. *shapes* with their associated *material* and an +optional *transformation*. The latter is used to control the dynamic +positioning of the child entities with respect to some constraints defined by +the pivot type, and the sun directions submitted by *solstice*(1). Each entity +can also have a list of *anchors*. An anchor is used to define a position +relative to the entity into which it is declared. + +For a geometric entity one have to define if the encapsulated geometry is a +*primary* geometry, i.e. a geometry directly lit by the sun and used to +concentrate the solar flux (e.g. a primary mirror). One can define all the +solar plant geometric entities as primaries but a well designed solar plant +with correctly tagged primary geometries will drastically improve the +convergence speed of the *solstice*(1) simulations. + +Template +~~~~~~~~ + +A *template* is a first level entity with no existence into the solar plant. It +is used to pre-declare an entity hierarchy that can then be instantiated +several times in the solar plant by referencing it through common entities with +YAML data tagging. In the following example, the templated entity *my-template* +is instantiated 3 times into the scene: +....... +- template: &my-template + name: bar + primary: 1 + geometry: ... +- entity: + name: foo0 + transform: {translation: [-10.5, 0, 0]} + children: [*my-template] +- entity: + name: foo1 + transform: {translation: [0, 0, 0]} + children: [*my-template] +- entity: + name: foo2 + transform: {translation: [10.5, 0, 0]} + children: [*my-template] +....... + +Pivot +~~~~~ + +A *pivot* is a special kind of node that can be used in the tree data +structure describing an entity to automatically point its child geometry +according to the sun position and to the pivot parameters. It is supposed (but +not mandatory) that the children of a pivot includes a reflector, that, +once pivoted, will reflect the sun light towards a *target*. You should note +that a pivot cannot be the child of another pivot. + +The most noticeable pivot parameter is its *target*. Four different types of +targets are available: + +*position*:: + Define the target as being an absolute point in world coordinates. + +*anchor*:: + Define the target as being a position relative to an entity (see the + *anchor* section). + +*sun*:: + Define the target as being the center of the sun. + +*direction*:: + The pivot reflects light in the given direction, specified in world + coordinates. + +Pivots can also have a *ref_point* optional parameter defining a 3D point in +the coordinate system the pivot children that will be used by the pointing algorithm. +If not provided, it is set to the origin. + +Two different flavours of *pivots* are available: *x_pivot* and *zx_pivot*, +each with its own set of parameters and behaviour. + +*x_pivot*:: + Pivot with a single rotation axis: the +X axis in its local coordinate + system. It has a *target* and can have a *ref_point*. Its pointing algorithm + considers an incoming ray of light from the center of the sun and rotates + its children so that a specular reflection at *ref_point* using +Z as + local normal will hit the target point of the pivot, or will have the + specified direction (depending of the kind of target). + +*zx_pivot*:: + Pivot with two rotation axis: the +Z axis in its local coordinate system, + then the +X axis in the coordinate system resulting of the Z rotation. + It has a *target* and can have a *ref_point* and a *spacing* that defines + the translation along the +Y axis after the first rotation. If not + defined, *spacing* is 0. The *zx_pivot* pointing algorithm considers an + incoming ray of light from the center of the sun and rotates the pivot's + children of the pivot so that a specular reflection at *ref_point* using + +Y as local normal will hit the target point of the pivot, or will have + the specified direction (depending of the kind of target). + +Anchor +~~~~~~ + +An *anchor* defines a relative position into the entity hierarchy. They are +particularly useful for pivots and hyperbolic shapes that may have to reference +a position relative to an entity whose transformations may also depends of its +ancestor. An anchor has a *name* that must be unique for the whole sets of per +entity anchors. An anchor is identified into the solar plant by concatenating, +with the \'.' character, its name to the *entity-identifier* of the entity into +which it is declared. For instance, in the following example, the +*anchor-identifier* of the anchor named *anchor0* is *level0.level1.anchor0*: +....... +entity: + name: level0 + child: + - name: level1 + anchor: + - {name: anchor0, position: [0, 0, 0]} + - {name: anchor1, position: [1, 2, 3]} +....... + +In some situations, the *anchor-identifier* cannot be fully determined. Let a +templated entity with a descendant referencing an anchor of one of its +ancestors. On its declaration, the template is still not instantiated through a +parent entity and consequently the name of the root entity is unknown. +Moreover, the name of the root entity cannot be fixed since it changes for each +instance of the template. To handle these cases, the *self* reserved keyword +allows to reference the unknown root entity of the currently declared +hierarchy. In the following example, the entities *entity0.level0.level1* and +*entity1.level0.level1* encapsulate a pivot that references the anchor +*anchor0* defined in their respective parent *entity0.level0* and +*entity1.level0*: +....... +- template: &my-template + name: level0 + anchor: [{name: anchor0, position: [1, 2, 3]}] + child: + - name: level1 + pivot: + x_pivot: + ref_point: {0, 0, 0} + target: {anchor: self.level0.anchor0} + +- entity: {name: entity0, child: [*my-template]} +- entity: {name: entity1, child: [*my-template]} +....... + +Transform +~~~~~~~~~ + +A *transform* is used to move an *object* or an *entity* in space. The +*rotation* parameter list 3 angles in degrees defining the rotation to perform +around the X, Y and Z axis. The *translation* attribute describes the offsets +to apply along the X, Y and Z axis. Let the local repair *p* of an object, *p* +is transformed in *p'* with respect to its associated *transform* as follow: + + p' = Rx * Ry * Rz * (T + p) + +with *T* the translation vector and *Rx*, *Ry* and *Rz* the rotation matrices +around the X, Y and Z axis defined as: + + | 1 0 0 | | cY 0 sY | | cZ -sZ 0 | + Rx = | 0 cX -sX |; Ry = | 0 1 0 |; Rz = | sZ cZ 0 | + | 0 sX cX | |-sY 0 cY | | 0 0 1 | + +where *c*<**X**|**Y**|**Z**> and *s*<**X**|**Y**|**Z**> are the cosine and the +sinus, respectively, of the rotation angles around the X, Y and Z axis. + +EXAMPLES +-------- + +Declare 2 entities and a point source sun. The first entity is a purely +specular square of size 10, whose center is at the origin. The second entity +is a purely transparent square used as a receiver of the solar flux. Its size +is 1 and its center is positioned at {0,0,2}: +....... +- sun: {dni: 1000} + +- entity: + name: reflector + primary: 1 + geometry: + - material: + mirror: + reflectivity: 1 + roughness: 0 + plane: + clip: + - operation: AND + vertices: + - [-5.0,-5.0] + - [-5.0, 5.0] + - [ 5.0, 5.0] + - [ 5.0,-5.0] + +- entity: + name: receiver + primary: 0 + transform: + translation: [0, 0, 2] + geometry: + - material: + virtual: # No attrib + plane: + clip: + - operation: AND + vertices: + - [-0.5,-0.5] + - [-0.5, 0.5] + - [ 0.5, 0.5] + - [ 0.5,-0.5] +....... + +Define a circular diffuse reflector surrounded by a virtual sphere and a +pillbox-shaped sun whose aperture is 0.1 degree. Use anchors and tags of the +YAML format to reference into the entities a pre-declared geometry. Rely on +the YAML compact notation to reduce the number of lines requires to describe +the scene: +....... +- sun: {dni: 1000, pillbox: {aperture: 0.1}} + +- geometry: &small-circle + - material: {matte: {reflectivity: 1}} + plane: {clip: [{operation: AND, circle: {radius: 0.5}}]} + +- geometry: &big-sphere + - material: {?virtual} + sphere: {radius: 2, slices: 128} + +- entity: {name: reflector, primary: 1, geometry: *small-square} +- entity: {name: receiver, primary: 0, geometry: *big-sphere} +....... + +Declare 2 parabolic reflectors from a *templated* parabola whose orientation is +controlled by a *zx_pivot*. This pivot ensures that the reflector points toward +the receiver, independently of its position, by targeting an *anchor* whose +position is defined relatively to the receiver: +....... +- sun: {dni: 1000} + +- entity: # Receiver + name: square_receiver + primary: 0 + transform: { rotation: [0,90,0], translation: [100,0,10] } + anchors: [{name: anchor0, position: [0,0,0]}] + geometry: + - material: {?virtual} + plane: + clip: + - operation: AND + vertices: [[-.5,-.5],[-.5,.5],[.5,.5],[.5,-.5]] + +- template: &self_oriented_parabol # Reflector + name: pivot + transform: {translation: [0, 0, 4], rotation: [0, 0, 90]} + zx_pivot: {target: {anchor: square_receiver.anchor0}} + children: + - name: parabol + transform: {rotation: [-90, 0, 0]} + primary: 1 + geometry: + - material: {mirror: {reflectivity: 1, roughness: 0}} + parabol: + focal: 100 + clip: + - operation: AND + vertices: [[-5,-5],[-5,5],[5,5],[5,-5]] + +# Instantiate the reflector template +- entity: + name: reflector1 + transform: {translation: [0,0,0]} + children: [*self_oriented_parabol] +- entity: + name: reflector2 + transform: {translation: [10,43.6,0]} + children: [*self_oriented_parabol] +....... + +Declare a solar furnace with 9 heliostats instantiated from the same +*template*. Their position is controlled by a *zx_pivot* to ensure that the +incoming sun rays are reflected toward the negative X axis. Reflected rays are +then concentrated by a parabola toward a purely absorptive receiver. The +heliostats and the parabola share the same material: the front faces are +purely specular while the back faces are diffuse: +....... +- sun: {dni: 1000} + +- material: &specular + front: {mirror: {reflectivity: 1, roughness: 0}} + back: {matte: {reflectivity: 1}} + +- template: &H # Template of an heliostat + name: heliostat + transform: {translation: [0,0,5.5]} + zx_pivot: {target: {direction: [-1,0,0]}} + children: + - name: reflector + transform: {rotation: [-90,0,0]} + primary: 1 + geometry: + - material: *specular + plane: + clip: [{operation: AND, vertices: [[-5,-5],[-5,5],[5,5],[5,-5]]}] + +- entity: # Receiver entity + name: receiver + primary: 0 + transform: {translation: [18,0,20], rotation: [0,90,0]} + geometry: + - material: {matte: {reflectivity: 0}} + plane: + clip: + - operation: AND + vertices: [[-.5,-.5],[-.5,.5],[.5,.5],[.5,-.5]] + +- entity: # Great parabola + name: parabola + primary: 0 + transform: {translation: [0,0,20], rotation: [0,90,90]} + geometry: + - material: *specular + parabol: + focal: 18 + clip: [{operation: AND, vertices: [[-30,-20],[-30,20],[30,20],[30,-20]]}] + +# Instantiate the heliostat template +- entity: {name: H1, children: [*H], transform: {translation: [40,-20, 0]}} +- entity: {name: H2, children: [*H], transform: {translation: [40, 0, 0]}} +- entity: {name: H3, children: [*H], transform: {translation: [40, 20, 0]}} +- entity: {name: H4, children: [*H], transform: {translation: [60,-20,10]}} +- entity: {name: H5, children: [*H], transform: {translation: [60, 0,10]}} +- entity: {name: H6, children: [*H], transform: {translation: [60, 20,10]}} +- entity: {name: H7, children: [*H], transform: {translation: [80,-20,20]}} +- entity: {name: H8, children: [*H], transform: {translation: [80, 0, 20]}} +- entity: {name: H9, children: [*H], transform: {translation: [80, 20,20]}} +....... + +NOTES +----- +1. YAML Ain't Markup Language - <http://yaml.org> +2. SMARTS, Simple Model of the Atmospheric Radiative Transfer of Sunshine - + <http://www.nrel.gov/rredc/smarts/> +3. D. Buie, A.G. Monger, C.J. Dey. "Sunshape distributions for + terrestrial solar simulations". Solar Energy, 2003, 74, pp. 113-122. +4. D. Buie, C.J. Dey, S. Bosi. "The effective size of the solar cone for + solar concentrating systems". Solar Energy, 2003, 74, pp. 417-427. +5. Portable PixMap - <http://netpbm.sourceforge.net/doc/ppm.html> + +SEE ALSO +-------- +*solstice*(1), *solstice-receiver*(5) diff --git a/doc/solstice-man.css b/doc/solstice-man.css @@ -0,0 +1,87 @@ +/* Copyright (C) CNRS 2016-2017 + * + * This is free style sheet: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This CSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. */ + +body.manpage { + font-family:monospace; + font-size:2ex; + text-align: justify; + max-width: 55em; + margin: 1em; + background: #ffffff +} + +body.manpage .monospaced, .literalblock { + margin: 2em; + color: #636261 +} + +body.manpage em { + color: #660000 +} + +body.manpage div.verseblock > pre.content { + font-family: inherit; +} + +body.manpage h1 { + padding-bottom: 0.5em; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; +} + +body.manpage #footer { display: none; } + +body.manpage div#toctitle { display: none; } + +body.manpage div#toc { + display.block ! important; + position:fixed; + top:0; + left:60em; + height:100%; + width: 100%; + padding:3em 0 0 0; + border-left:1px solid #dbdbdb; + background: #eeeeee +} + +body.manpage div#toc a, div#toc a:link, div#toc a:visited { + margin:0; + padding-left: 2em; + color:#999999; + text-decoration:none; +} + +body.manpage div.toclevel1 { + line-height: 1.5em; +} + +body.manpage div.toclevel2 { + margin-left: 2em; + +} + +body.manpage div#toc a:hover { + color:#666666; +} + +@media print { + body.manpage div#toc { display: none; } +} + diff --git a/doc/solstice-output.5.txt b/doc/solstice-output.5.txt @@ -0,0 +1,483 @@ +// Copyright (C) CNRS 2016-2017 +// +// This is free documentation: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This manual is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +:toc: + +solstice-output(5) +================== + +NAME +---- +solstice-output - output format of solstice(1) results + +DESCRIPTION +----------- +The *solstice-output* describes the output format of the *solstice*(1) program. +All the data generated by a *solstice*(1) invocation are written in a single +file or on the standard output whether an _output_ file is defined through the +*-o* option or not, respectively. Note that submitting several sun directions +to *solstice*(1), through the *-D* option, will produce as many outputs as sun +directions. In other words, invoking *solstice*(1) with _N_ sun directions +looks like calling *solstice*(1) _N_ times and concatenating their associated +output. + +The type of the data that are generated depends on the mode in which +*solstice*(1) is invoked. By default, *solstice*(1) evaluates the power +collected by the submitted solar plant. When invoked with the *-g* option, +*solstice*(1) converts the solar plant geometries in a list of CAO files. The +*-p* option is used to track the sampled radiative paths while, finally, the +*-r* option allows to render an image of the solar facility. + +GRAMMAR +------- +The output values are mainly ASCII data formatted line by line. By convention, +in the following grammar the line data are listed between quote marks. The +grammar may use new lines for formatting constraints, but data are actually on +the same line while a closed quote mark is not defined. + +[verse] +_______ +<output> ::= <simulation-output> + | <dump-geometry-output> # -g option + | <dump-radiative-paths-output> # -p option + | <rendering-output> # -r option + +<simulation-output> ::= <sun-direction> + <counts> + <global> + [ <receivers-list> ] + [ <primaries-list> ] + [ <rcvXprims-list> ] + [ <receiver-maps> ] + [ <simulation-output> ... ] + +<dump-geometry-output> + ::= <sun-direction> + <geometry-data> + [ <dump-geometry-output> ... ] + +<dump-radiative-paths-output> + ::= <sun-direction> + VTK-RADIATIVE-PATHS + [ <dump-radiative-paths-output> ... ] + +<rendering-output> ::= <sun-direction> + PPM-FILE # ASCII PPM with 8-bits per component [1] + [ <rendering-output> ... ] + +------------------------------------- + +<sun-direction> ::= "#--- Sun direction: <azimuth> <elevation> (<real3>)" + +<counts> ::= "<#globals> <#receivers> <#primaries> + <#samples> <#failed>" + +<#globals> ::= 7 +<#receivers> ::= INTEGER # in [0, INF) +<#primaries> ::= INTEGER # in [0, INF) +<#samples> ::= INTEGER # in [0, INF) +<#failed> ::= INTEGER # in [0, INF) + +<global> ::= <potential-irradiance> + <absorbed-irradiance> + <cos-factor> + <shadow-loss> + <missing-loss> + <reflectivity-loss> + <absorptivity-loss> + +------------------------------------- + +<receivers-list> ::= <receiver> + [ <receiver> ... ] + +<receiver> ::= "<receiver-name> <receiver-id> <area> + <front> <back>" + +<receiver-name> ::= <entity-identifier> + +<receiver-id> ::= INTEGER + +<front> ::= <side> +<back> ::= <side> + +<side> ::= "<absorbed-irradiance> <irradiance> + <reflectivity-loss> <absorptivity-loss> + <efficiency>" + +------------------------------------- + +<primaries-list> ::= <primary> + [ <primary> ... ] + +<primary> ::= "<primary-name> <primary-id> <area> <#samples> + <cos-factor> <shadow-loss>" + +<primary-name> ::= <entity-identifier> + +<primary-id> ::= INTEGER + +------------------------------------- + +<rcvXprims-list> ::= <rcvXprim> + [ <rcvXprim> ... ] + +<rcvXprim> ::= "<receiver-id> <primary-id> + <rcvXprim-front> <rcvXprim-back>" + +<rcvXprim-front> ::= <rcvXprim-side> +<rcvXprim-back> ::= <rcvXprim-side> + +<rcvXprim-side> ::= "<absorbed-irradiance> <irradiance> + <reflectivity-loss> <absorptivity-loss>" + +------------------------------------- + +<receiver-maps> ::= VTK-RECEIVER-MAP + [ <receiver-maps> ... ] + +<geometry-data> ::= OBJ-FILE + [ --- + <geometry-data> ... ] + +------------------------------------- + +<area> ::= REAL # in ]0, INF) + +<real3> ::= REAL REAL REAL + +<azimuth> ::= REAL # Degrees in [0, 360[ +<elevation> ::= REAL # Degrees in [0, 90] + +<potential-irradiance>::= <estimate> +<absorbed-irradiance> ::= <estimate> +<absorptivity-loss> ::= <estimate> +<cos-factor> ::= <estimate> +<irradiance> ::= <estimate> +<missing-loss> ::= <estimate> +<reflectivity-loss> ::= <estimate> +<shadow-loss> ::= <estimate> + +<estimate> ::= <expected-value> <standard-error> +<expected-value> ::= REAL +<standard-error> ::= REAL # in [0, INF) + +<entity-identifier> # Defined in *solstice-input*(1) +_______ + +SIMULATION +---------- + +A *simulation-output* begins with two header lines. The first one reports the +sun direction used in the simulation (azimuth and elevation angles, in +degrees), and the second one lists the numbers of global, per receiver and per +primary results as well as the overall number of Monte-Carlo experiments used +by the simulation and the number of experiments that failed due to unforeseen +errors as numerical imprecisions. + +Global results +~~~~~~~~~~~~~~ + +After the 2 header lines, the output includes various global-result lines, the +exact number of lines being part of the headers. Currently this number is 7. +Each global result is a pair of real numbers: the expected value and its +standard error. The global results are, in this order: + +- *potential-irradiance*: maximum irradiance that all the primary + geometries could intercept if properly oriented; +- *absorbed-irradiance*: absorbed part of the irradiance reaching any + receiver geometry. At most equal to potential irradiance; +- *cos-factor*: fraction of incoming irradiance not intercepted by the + primary geometries due to their orientation; +- *shadow-loss*: irradiance lost before reaching primary geometries due to the + shadow of another geometry; +- *missing-loss*: irradiance that reaches a primary geometry, but not + absorbed by a receiver; this irradiance could have been blocked along its + path, can have missed the receivers, or can have reach a receiver but + without being absorbed; +- *reflectivity-loss*: additional irradiance that could have been absorbed + by receivers if reflections had occurred on materials with reflectivity 1.0; +- *absorptivity-loss*: irradiance that could have been absorbed by + receivers if atmospheric absorption had not been taken into account. + +Per receiver results +~~~~~~~~~~~~~~~~~~~~ + +After the global results, the output includes various per-receiver lines, one +line per receiver, the exact number of lines being part of the headers. Each +line contains the following data: + +- *receiver-name*: name of the receiver, i.e. *entity-identifier* of the + entity in which the receiving geometry is defined (see the + *solstice-input*(5) format); +- *receiver-id*: unique integer identifying the receiver; +- *area*: area of the receiver; +- *front*: estimated results for the front side of the receiver; +- *back*: estimated results for the back side of the receiver. + +The estimates of the *front* and *back* sides are listed bellow. Note that +each of the following estimates is actually a pair of real numbers: the +expected value and its standard error. + +- *absorbed-irradiance*: irradiance absorbed by the receiver side; +- *irradiance*: irradiance that reaches the receiver side; +- *reflectivity-loss*: irradiance that could have been absorbed by the + receiver side if reflections had occurred on materials with reflectivity 1.0; +- *absorptivity-loss*: irradiance that could have been absorbed by the + receiver side if atmospheric absorption had not been taken into account; +- *efficiency*: fraction of incoming irradiance absorbed by the receiver side. + +Both *front* and *back* side estimates are output, even if the receiver has +only a single receiving side. In this case, the results of the non-receiving +side are meaningless (invalid -1 value). + +Per primary results +~~~~~~~~~~~~~~~~~~~ + +After the per-receiver results, the output includes various per-primary result +lines, one line per primary geometry, the exact number of lines being part of +the headers. Each line contains: + +- *primary-name*: name of the primary geometry, i.e. *entity-identifier* of + the entity in in which the primary geometry is defined (see the + *solstice-input*(5) format); +- *primary-id*: unique integer identifying the primary geometry; +- *area*: area of the primary geometry; +- *#sample*: number of Monte-Carlo experiments sampled on the primary + geometry; +- *cos-factor*: expected value and standard error of the fraction of incoming + irradiance not intercepted by the primary geometry due to its orientation; +- *shadow-loss*: expected value and standard error of the irradiance lost + before reaching the primary geometry due to the shadow of another geometry. + +Per receiver and per primary results +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +After the per-primary results, the output includes various result lines, each +describing the contribution of a primary geometry to a given receiver. The +total number of such lines is the number of receivers times the number of +primary geometries. Each line contains: + +- *receiver-id*: identifier of the involved receiver; +- *primary-id*: identifier of the involved primary geometry; +- *rcvXprim-front*: estimated results for the receiver front side; +- *rcvXprim-back*: estimated results for the receiver back side; + +The estimated values of *rcvXprim-front* and *rcvXprim-back* are listed +bellow. Each of these estimates is actually a pair of real numbers: the +expected value and its standard error. + +- *absorbed-irradiance*: irradiance absorbed by the receiver side coming + from the primary geometry; +- *irradiance*: irradiance reaching the receiver side coming from the primary + geometry; +- *reflectivity-loss*: irradiance that could have been absorbed by the + receiver side coming from the primary geometry if reflections had occurred + on materials with reflectivity 1.0; +- *absorptivity-loss*: irradiance that could have been absorbed by + the receiver side coming from the primary geometry if atmospheric + absorption had not been taken into account. + +Both front and back side estimates are output, even if the receiver has only a +single receiving side. In this case, the results of the non-receiving side are +meaningless (invalid -1 value). + +Receiver map +~~~~~~~~~~~~ + +A receiver defined in the submitted *solstice-receiver*(5) file, can have a +per-primitive irradiance estimate if its *per_primitive* flag is active. In +this case, *solstice*(1) generates a *receiver-map* that is actually an ASCII +VTK file [2] that stores the triangular mesh of the receiver and, for each +triangle, the estimate of its associated irradiance. The "definition" of the +receiver map is thus controlled by the discretisation of the receiver's shape, +as described in the *solstice-input*(5) file. Note that to obtain a good +estimate of the per-triangle irradiance, one have to ensure that the number +of per-triangle experiments is sufficient regarding the targeted accuracy. +Since only a small fraction of the overall sampled radiative paths reach a +given triangle, the total number of experiments required through the *-n* +option of *solstice*(1) should be increased significantly, as 1 or 2 order of +magnitude. + +If only the front or the back side of the receiver is active, then only one set +of per triangle irradiance estimate is written. If the *side* attribute of +the receiver is set to *FRONT_AND_BACK*, the irradiance estimate for the +front facing triangles are written before to the estimate of the back facing +ones. The following grammar gives a brief description of the formatting of a +*VTK-RECEIVER-MAP*. Please refer to the VTK format specification [2] for more +informations on the VTK file format. + +[verse] +_______ +VTK-RECEIVER-MAP ::= # vtk DataFile Version 2.0 + <receiver-name> + ASCII + DATASET POLYDATA + POINTS <#vertices> float + <map-vertices> + POLYGONS <#triangles> <#triangles*4> + <map-triangles> + CELL_DATA <#triangles> + <map-triangle-data> + +<map-vertices> ::= <real3> + [ <real3> ... ] # up to <#vertices> + +<map-triangles> ::= 3 <triangle-indices> + [ 3 <triangle-indices> ... ] # up to <#triangles> + +<map-triangle-data> ::= <map-front-data> + | <map-back-data> + | <map-front-data> <map-back-data> + +<map-front-data> ::= <map-side-data> +<map-back-data> ::= <map-side-data> + +<map-side-data> ::= CELL_DATA <#triangles> + SCALARS <side-name> float 2 + LOOKUP_TABLE default + <irradiance> + [ <irradiance> ... ] + +<map-side-name> ::= Front_faces | Back_faces + +<#triangles> ::= INTEGER +<#vertices> ::= INTEGER +<triangle-indices> ::= INTEGER INTEGER INTEGER +_______ + +DUMP GEOMETRY +------------- + +A *dump-geometry-output* is generated when *solstice*(1) is invoked with the +*-g* option. In this mode, for each submitted sun direction, *solstice*(1) +converts the geometry of the submitted *solstice-input*(5) file in triangular +meshes that are then written to the output with respect to the format provided +by the *format* parameter of the *-g* option. The only format currently +supported by *solstice*(1) is the Alias Wavefront OBJ [3] format. With no more +sub-option, *solstice*(1) will thus generate one OBJ file containing the whole +mesh of the solar plant. However, the *split* parameter of the *-g* option +allows to generate several OBJ files: one description is generated per +*geometry* or per *object*, as defined in the *solstice-input*(5) format, +whether the *split* sub-option is set to *geometry* or *object*. In this +situation, each OBJ description is followed by a line with 3 minus characters +in order to identify the end of the current OBJ. + +Independently of the *split* strategy, each *solstice-input*(1) geometry is an +OBJ group whose name is the *entity-identifier* of the entity in which it is +encapsulated. Finally, the *dump-geometry-output* uses the *usemtl* directive +of the OBJ format to associate to a mesh the name of its material type. The +following grammar succinctly describes the formatting of an *OBJ-FILE*. Please +refer to the OBJ format specification [3] for more informations on the OBJ file +format. + +[verse] +_______ +OBJ-FILE ::= g <entity-identifier> + <obj-mesh> + [ <obj-mesh> ... ] + +<obj-mesh> ::= usemtl <material-type> + <obj-vertices> + <obj-faces> + +<obj-vertices> ::= v <real3> + [ v <real3> ... ] + +<obj-indices> ::= f <triangle-indices> + [ f <triangle-indices> ... ] + +<material-type> ::= dielectric + | matte + | mirror + | thin_dielectric + | virtual +_______ + +DUMP RADIATIVE PATHS +-------------------- + +For each sun direction, the *dump-radiative-paths-output* lists the geometric +data of the radiative paths sampled during a simulation. Each path is colored +with respect to its trajectory: the path is blue or yellow whether it reaches +or not a receiver, respectively. A path can be red if its first segment, i.e. +the ray starting from the sun toward a primary geometry, is occluded by a non +virtual object. The following grammar describes the formatting of a +*VTK-RADIATIVE-PATHS* file. Refer to the VTK format specification [2] for more +informations on the VTK file format. + +[verse] +_______ +VTK-RADIATIVE-PATHS ::= # vtk DataFile Version 2.0 + Radiative paths + ASCII + DATASET POLYDATA + POINTS <#vertices> float + <paths-vertices> + LINES <#paths> <#paths+#vertices> + <paths-lists> + CELL_DATA <#paths> + SCALAR Radiative_path_type float 1 + LOOKUP_TABLE path_type + <paths-type> + LOOKUP_TABLE path_type 3 + <color-occlude> + <color-success> + <color-missing> + +<paths-vertices> ::= <real3> + [ <real3> ... ] # up to <#vertices> + +<paths-lists> ::= <radiative-path> + [ <radiative-path> ... ] # up to <#path> + +<radiative-path> ::= <#path-segments> <path-vertex-id> ... + +<paths-type> ::= <color-id> + [ <color-id> ... ] # up to <#paths> + +<color-id> ::= 0.0 # occlude + | 0.5 # success + | 1.0 # missing + +<color-occlude> ::= 1.0 0.0 0.0 1.0 +<color-success> ::= 0.0 0.0 1.0 1.0 +<color-missing> ::= 1.0 1.0 0.0 1.0 + +<#paths> ::= INTEGER +<#path-segments> ::= INTEGER +<path-vertex-id> ::= INTEGER +_______ + +RENDERING +--------- +When invoked with the *-r* option, *solstice*(1) generates an image of the +solar facility for each submitted sun direction. Each image is preceded by its +associated sun direction and is saved with respect to the ASCII PPM file +format [1]. The output images are actually greyscale images whose pixels store +the average normalized radiance that reaches them. + +NOTES +----- +1. Portable PixMap - <http://netpbm.sourceforge.net/doc/ppm.html> +2. VTK file format - + <http://www.vtk.org/wp-content/uploads/2015/04/file-formats.pdf> +3. OBJ file format - + <http://www.martinreddy.net/gfx/3d/OBJ.spec> + +SEE ALSO +-------- +*solstice*(1), +*solstice-input*(5), +*solstice-receiver*(5) diff --git a/doc/solstice-receiver.5.txt b/doc/solstice-receiver.5.txt @@ -0,0 +1,114 @@ +// Copyright (C) CNRS 2016-2017 +// +// This is free documentation: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This manual is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +:toc: + +solstice-receiver(5) +==================== + +NAME +---- +solstice-receiver - declare the solar-plant receivers for solstice(1) + + +DESCRIPTION +----------- + +The *solstice-receiver* format is used by *solstice*(1) to declare which +geometric entities defined in a *solstice-input*(5) file are receivers. For +each receiver, *solstice*(1) computes its overall intercepted power, its +associated losses as well as its efficiency. Refer to the *solstice-output*(5) +format for informations on the per receiver data generated by *solstice*(1). +Declaring the receivers separately of the solar plant, allows to use the same +*solstice-input*(5) file for several simulations using different receivers. For +instance, one can define a specific *solstice-receiver* file that declares some +primary reflectors as receivers in order to track an unforeseen comportment +observed during a previous simulation. + +The *solstice-receiver* format uses the YAML 1.1 data serialization standard +[1]; assuming that the file is compatible with the *solstice-receiver* +semantic, the YAML compact notation can thus be used. + +A receiver is identified by its *name* that must be a valid *entity-identifier* +as defined in the *solstice-input*(5) format. This identifier must reference a +geometric entity and not a pivot or an empty entity. The side of the geometry +that is tracked is defined by the *side* attribute of the receiver. Note that +the front and the back side of a geometry can be both considered if the *side* +attribute is set to *FRONT_AND_BACK*. Refer to the *solstice-input*(5) +specification for informations on which side of the geometry is front facing or +back facing. Finally, if the optional *per_primitive* flag is set to *1*, +*solstice*(1) will estimate the irradiance for each triangle of the receiver +and use these data to generate a receiver map as described in +*solstice-output*(5). + +GRAMMAR +------- + +[verse] +_______ +<receivers-list> ::= - <receiver> + [ - <receiver> ... ] + +<receiver> ::= name: <entity-identifier> + side: <side-identifier> + [ per_primitive: INTEGER ] # in [0, 1] + +<side-identifier> ::= FRONT + | BACK + | FRONT_AND_BACK + +<entity-identifier> # Defined in *solstice-input*(1) +_______ + +EXAMPLES +-------- + +Define that the front and back side of the entity *small_square* are +receivers. For each side, enable the computation of per triangle irradiance. + +....... +- name: small_square + side: FRONT_AND_BACK + per_primitive: 1 +....... + +Declare that the front side of 3 reflectors are receivers. Use the YAML +compact notation to reduce the number of lines: + +...... +- {name: H1.heliostat.reflector, side: FRONT} +- {name: H4.heliostat.reflector, side: FRONT} +- {name: H7.heliostat.reflector, side: FRONT} +...... + +Declare that the back side of *receiver* is effectively a receiver and enable +the estimation of its associated irradiance map. Make a receiver from the front +side of the reflector named *LFR0.pivot.reflector*: + +....... +- {name: receiver, side: BACK, per_primitive: 1} +- {name: LFR0.pivot.reflector, side: FRONT} +....... + +NOTES +----- + +1. YAML Ain't Markup Language - <http://yaml.org> + +SEE ALSO +-------- +*solstice*(1), +*solstice-input*(5), +*solstice-output*(5) + diff --git a/doc/solstice.1.txt.in b/doc/solstice.1.txt.in @@ -0,0 +1,234 @@ +// Copyright (C) CNRS 2016-2017 +// +// This is free documentation: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This manual is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +:toc: + +solstice(1) +=========== + +NAME +---- +solstice - compute the power collected by a concentrated solar plant + +SYNOPSIS +-------- +[verse] +*solstice* +*solstice* [_option_]... [_file_] +*solstice* *-g* <__sub-option__[:...]> [_option_]... [_file_] +*solstice* *-p* <__sub-option__[:...]> [_option_]... [_file_] +*solstice* *-r* <__sub-option__[:...]> [_option_]... [_file_] + +DESCRIPTION +----------- +*solstice* computes the total power collected by a concentrated solar plant, as +described in the *solstice-input*(5) _file_. If the _file_ argument is not +provided, the solar plant is read from standard input. To evaluate various +efficiencies for each primary reflector, it computes losses due to cosine +effect, shadowing and masking, orientation and surface irregularities, +reflectivity and atmospheric transmission. The efficiency for each one of these +effects is subsequently computed for each reflector. + +The entities on which computations must be performed are listed in the +*solstice-receiver*(5) file submitted through the *-R* option. The estimated +results follow the *solstice-output*(5) format and are written to the _output_ +file or to the standard output whether the *-o* _output_ option is defined or +not, respectively. Note that the *solstice* algorithm is based on the +Monte-Carlo method, which means that every result is provided with its +numerical accuracy. + +*solstice* is designed to efficiently handle complex solar facilities: several +reflectors can be specified (planes, conics, cylindro-parabolic, etc.) and +positioned in 3D space, with a possibility for 1-axis and 2-axis +auto-orientation. Multiple materials can be used, as long as the relevant +physical properties are provided. Spectral effects are also taken into account: +it is possible to define the spectral distribution of any physical property, +including the input solar spectrum and the transmissivity of the atmosphere, at +any spectral resolution. Refer to *solstice-input*(5) for more informations. + +In addition of the aforementioned computations, *solstice* provides three +other functionalities. The *-g* option can be used to convert the +*solstice-input*(5) geometries in CAO files. The *-p* option saves the sampled +radiative paths used by the estimates, allowing to visualise them externally +which may be a great help to identify a design issue. Finally, the *-r* option +is used to render an image of the submitted solar facility. Note that these +three options are mutually exclusives, and once defined, they replace the +default *solstice* behaviour. + +OPTIONS +------- +*-D* <__azimuth__,__elevation__[:...]>:: + List of sun directions. A direction is defined by its _azimuthal_ and + _elevation_ angles in degrees, with _azimuth_ in [0, 360[ and _elevation_ in + [0, 90]. Each sun direction triggers a new computation whose results are + concatenated to the _output_ file. + +*-f*:: + Force overwrite of the _output_ file. + +*-h*:: + List short help and exit. + +*-g* <__sub-option__:...>:: + Generate the shape of the geometry defined in the submitted _file_ and store + it in _output_. Available sub-options are: + + *format=obj*;; + Define the file format in which the meshes are stored. Currently, only the + Alias Wavefront OBJ file format is supported. + + *split=*<**geometry**|*object*|*none*>;; + Define how the output mesh is split in sub meshes. A sub mesh can be + generated for each *geometry* or for each *object* as defined in the + *solstice-input*(5) file format. The *none* option means that only one + mesh is generated for the whole solar facility. By default, the *split* + option is set to *none*. + +*-o* _output_:: + Write results to _output_ with respect to the *solstice-output*(5) format. If + not defined, write results to standard output. + +*-p* <__sub-option__:...>:: + Register the sampled radiative paths for each sun direction and write them to + _output_. Available sub-options are: + + *default*;; + Use default sub-options. + + **irlen=**_length_;; + Length of the radiative path segments going to the infinity. By default, it + is computed relatively to the scene size. + + **srlen=**_length_;; + Length of the radiative path segments coming from the sun. By default, it + is computed relatively to the scene size. + +*-q*:: + Do not print the helper message when no _file_ is submitted. + +*-n* _experiments-count_:: + Number of Monte-Carlo experiments used to estimate the solar flux. By + default _experiments-count_ is set to @SOLSTICE_ARGS_DEFAULT_NREALISATIONS@. + +*-r* <__sub-option__:...>:: + Render an image of the scene through a pinhole camera, for each submitted + sun direction. Write the resulting images to _output_. Available sub-options + are: + + **fov=**_angle_;; + Horizontal field of view of the camera in [30, 120] degrees. By default + _angle_ is @SOLSTICE_ARGS_DEFAULT_CAMERA_FOV@ degrees. + + **img=**_width_**x**_height_;; + Definition of the rendered image in pixels. By default the image definition + is @SOLSTICE_ARGS_DEFAULT_IMG_WIDTH@x@SOLSTICE_ARGS_DEFAULT_IMG_HEIGHT@. + + **pos=**_x_**,**_y_**,**_z_;; + Position of the camera. By default it is set to + {@SOLSTICE_ARGS_DEFAULT_CAMERA_POS@} or it is automatically computed to + ensure that the whole scene is visible, whether *tgt* is set or not, + respectively. + + **rmode=**<**draft**|**pt**>;; + Rendering mode. In *draft* mode, images are computed by ray-casting; all + materials are lambertian, the sun is ignored and the only light source is + positioned at the camera position. In *pt* mode, the scene is rendered with + the un-biased path-tracing Monte-Carlo algorithm; the materials described + in the committed _file_ as well as the submitted sun directions are + correctly handled and an uniform skydome is added to simulate the diffuse + infinite lighting. By default *rmode* is set to *draft*. + + **spp=**_samples-count_;; + Number of samples per pixel. If *rmode* is *draft*, the samples position + into a pixel are the same for all pixels. With *rmode=pt* the pixel + samples are generated independently for each pixel. By default, use 1 + sample per pixel. + + **tgt=**_x_**,**_y_**,**_z_;; + Position targeted by the camera. By default, it is set to + {@SOLSTICE_ARGS_DEFAULT_CAMERA_TGT@} or it is automatically computed to + ensure that the whole scene is visible, whether *pos* is set or not, + respectively. + + **up=**_x_**,**_y_**,**_z_;; + Up vector of the camera. If *rmode* is *pt*, this vector also defines the + direction toward the top of the skydome. By default, *up* is set to + {@SOLSTICE_ARGS_DEFAULT_CAMERA_UP@}. + +*-R* _receivers_:: + *solstice-receiver*(5) file defining the scene receivers, i.e. the solar + plant entities for which *solstice* computes Monte-Carlo estimates. + +EXAMPLES +-------- + +Launch two simulations for sun directions whose azimuthal and elevation angles +are {*45*,*70*} and {*50*,*75*}. The solar facility is described in +*input.yaml* and the receivers on which the integrations must be performed are +declared in the *rcvs.yaml* file. *10000* experiments are used by the +Monte-Carlo estimates and the results are written to *output* even though this +file already exists: + + $ solstice -D45,70:50,75 -R rcvs.yaml -n 10000 -f -o output input.yaml + +Generate a mesh for each geometry described in *input.yaml*, and save them in +the *output* file with respect to the Alias Wavefront OBJ format. The meshes +are positioned according to their orientation constraints, with respect to the +sun direction whose azimuthal and elevation angles are {*30*,*60*}. Use the +*csplit*(1) Unix command to generate an Alias Wavefront OBJ file per geometry +stored in *output*. The name of the generated Alias Wavefront OBJ files are +*geom*<__NUM__>**.obj** with __NUM__ in [0, N-1] where N is the number of +geometries described in *input.yaml*. Refer to *solstice-output*(5) for +informations on the regular expression *^---$* used to split the output file: + + $ solstice -D30,60 -g format=obj:split=geometry -f -o output input.yaml + $ csplit -f geom -b %02d.obj -z --suppress-matched output /^---$/ {*} + +Trace 100 radiative paths into the solar plant described in *input.yaml*, with +respect to the sun direction whose azimuthal and elevations angles are *0* and +*90* degrees, respectively. Write the *solstice-output*(5) result to the +standard output and postprocess it with the *sed*(1) Unix command to remove the +first line that stores the sun direction from which the radiative paths comes +from. The remaining data that lists the radiative paths geometry are redirected +into the *paths.vtk* file: + + $ solstice -n 100 -D0,90 -R rcvs.yaml -p default input.yaml | sed '1d' > paths.vtk + +Use the path-tracing rendering algorithm to draw the solar plant +*solplant.yaml* with respect to the sun direction whose azimuthal and elevation +angles are *180* and *45* degrees, respectively. Use *64* samples per pixel to +estimate the per-pixel radiance and fix the up camera vector to {*0*,*0*,*1*}. +Write the *solstice-output*(5) result to standard output and use the *sed*(1) +Unix command to remove the first line which stores the sun direction used to +draw the image. Finally, visualise the rendered picture by redirecting the +remaining data to the *feh*(1) image viewer. + + $ solstice -D180,45 -r up=0,0,1:rmode=pt:spp=64 solplant.yaml | sed '1d' | feh - + +COPYRIGHT +--------- +*solstice* is copyright &copy; CNRS 2016-2017. License GPLv3+: GNU GPL version +3 or later <http://gnu.org/licenses/gpl.html>. This is a free software. You are +free to change and redistribute it. There is NO WARRANTY, to the extent +permitted by law. + +SEE ALSO +-------- +*csplit*(1), +*feh*(1), +*sed*(1), +*solstice-input*(5), +*solstice-output*(5), +*solstice-receivers*(5) + diff --git a/src/solstice_dump.c b/src/solstice_dump.c @@ -36,11 +36,11 @@ dump_instantiated_shaded_shape SSOL(material_get_type(sshape->mtl_front, &type)); switch(type) { + case SSOL_MATERIAL_DIELECTRIC: mtl = "dielectric"; break; case SSOL_MATERIAL_MATTE: mtl = "matte"; break; case SSOL_MATERIAL_MIRROR: mtl = "mirror"; break; - case SSOL_MATERIAL_VIRTUAL: mtl = "virtual"; break; - case SSOL_MATERIAL_DIELECTRIC: mtl = "dielectric"; break; case SSOL_MATERIAL_THIN_DIELECTRIC: mtl = "thin_dielectric"; break; + case SSOL_MATERIAL_VIRTUAL: mtl = "virtual"; break; default: FATAL("Unexpected Solstice Solver material type.\n"); break; } diff --git a/src/solstice_solve.c b/src/solstice_solve.c @@ -59,8 +59,8 @@ write_mc_global(struct solstice* solstice, struct ssol_estimator* estimator) PRINT_MC_GLOBAL(cos_factor); PRINT_MC_GLOBAL(shadowed); PRINT_MC_GLOBAL(missing); - PRINT_MC_GLOBAL(atmosphere); PRINT_MC_GLOBAL(reflectivity); + PRINT_MC_GLOBAL(atmosphere); #undef PRINT_MC_GLOBAL /* Receivers' data */ diff --git a/src/solstice_sun.c b/src/solstice_sun.c @@ -154,8 +154,8 @@ create_default_sun_spectrum } if(solparser_has_spectrum(solstice->parser)) { - data = solstice_sun_spectrum_smarts295; - size = solstice_sun_spectrum_smarts295_size; + data = solstice_sun_spectrum_smarts; + size = solstice_sun_spectrum_smarts_size; } else { data = solstice_sun_spectrum_dummy; size = solstice_sun_spectrum_dummy_size; diff --git a/src/solstice_sun_spectrum.c b/src/solstice_sun_spectrum.c @@ -18,383 +18,755 @@ const double solstice_sun_spectrum_dummy[] = { 1, 1 }; const size_t solstice_sun_spectrum_dummy_size = 1; -const double solstice_sun_spectrum_smarts295[] = { - 0.2800e+03, 0.3230e-25, - 0.2900e+03, 0.9925e-09, - 0.3000e+03, 0.6135e-03, - 0.3100e+03, 0.2614e-01, - 0.3200e+03, 0.1525e+00, - 0.3300e+03, 0.3587e+00, - 0.3400e+03, 0.4319e+00, - 0.3500e+03, 0.3749e+00, - 0.3600e+03, 0.5612e+00, - 0.3700e+03, 0.6070e+00, - 0.3800e+03, 0.4707e+00, - 0.3900e+03, 0.7168e+00, - 0.4000e+03, 0.8937e+00, - 0.4100e+03, 0.8838e+00, - 0.4200e+03, 0.8786e+00, - 0.4300e+03, 0.7032e+00, - 0.4400e+03, 0.1130e+01, - 0.4500e+03, 0.1341e+01, - 0.4600e+03, 0.1355e+01, - 0.4700e+03, 0.1414e+01, - 0.4800e+03, 0.1458e+01, - 0.4900e+03, 0.1502e+01, - 0.5000e+03, 0.1381e+01, - 0.5100e+03, 0.1422e+01, - 0.5200e+03, 0.1364e+01, - 0.5300e+03, 0.1386e+01, - 0.5400e+03, 0.1397e+01, - 0.5500e+03, 0.1408e+01, - 0.5600e+03, 0.1362e+01, - 0.5700e+03, 0.1384e+01, - 0.5800e+03, 0.1416e+01, - 0.5900e+03, 0.1287e+01, - 0.6000e+03, 0.1376e+01, - 0.6100e+03, 0.1357e+01, - 0.6200e+03, 0.1364e+01, - 0.6300e+03, 0.1281e+01, - 0.6400e+03, 0.1316e+01, - 0.6500e+03, 0.1240e+01, - 0.6600e+03, 0.1293e+01, - 0.6700e+03, 0.1312e+01, - 0.6800e+03, 0.1291e+01, - 0.6900e+03, 0.1127e+01, - 0.7000e+03, 0.1214e+01, - 0.7100e+03, 0.1230e+01, - 0.7200e+03, 0.9898e+00, - 0.7300e+03, 0.1089e+01, - 0.7400e+03, 0.1143e+01, - 0.7500e+03, 0.1133e+01, - 0.7600e+03, 0.3196e+00, - 0.7700e+03, 0.1081e+01, - 0.7800e+03, 0.1083e+01, - 0.7900e+03, 0.1034e+01, - 0.8000e+03, 0.1009e+01, - 0.8100e+03, 0.9829e+00, - 0.8200e+03, 0.8306e+00, - 0.8300e+03, 0.8917e+00, - 0.8400e+03, 0.9480e+00, - 0.8500e+03, 0.8229e+00, - 0.8600e+03, 0.9096e+00, - 0.8700e+03, 0.8980e+00, - 0.8800e+03, 0.8812e+00, - 0.8900e+03, 0.8665e+00, - 0.9000e+03, 0.7211e+00, - 0.9100e+03, 0.6374e+00, - 0.9200e+03, 0.7189e+00, - 0.9300e+03, 0.4862e+00, - 0.9400e+03, 0.5180e+00, - 0.9500e+03, 0.2243e+00, - 0.9600e+03, 0.4673e+00, - 0.9700e+03, 0.6353e+00, - 0.9800e+03, 0.6048e+00, - 0.9900e+03, 0.6883e+00, - 0.1000e+04, 0.6908e+00, - 0.1010e+04, 0.6779e+00, - 0.1020e+04, 0.6610e+00, - 0.1030e+04, 0.6559e+00, - 0.1040e+04, 0.6359e+00, - 0.1050e+04, 0.6251e+00, - 0.1060e+04, 0.6070e+00, - 0.1070e+04, 0.5804e+00, - 0.1080e+04, 0.5766e+00, - 0.1090e+04, 0.5442e+00, - 0.1100e+04, 0.4877e+00, - 0.1110e+04, 0.4891e+00, - 0.1120e+04, 0.2037e+00, - 0.1130e+04, 0.1307e+00, - 0.1140e+04, 0.2996e+00, - 0.1150e+04, 0.1741e+00, - 0.1160e+04, 0.3212e+00, - 0.1170e+04, 0.4473e+00, - 0.1180e+04, 0.4358e+00, - 0.1190e+04, 0.4467e+00, - 0.1200e+04, 0.4311e+00, - 0.1210e+04, 0.4322e+00, - 0.1220e+04, 0.4389e+00, - 0.1230e+04, 0.4385e+00, - 0.1240e+04, 0.4370e+00, - 0.1250e+04, 0.4323e+00, - 0.1260e+04, 0.4106e+00, - 0.1270e+04, 0.3752e+00, - 0.1280e+04, 0.3960e+00, - 0.1290e+04, 0.3951e+00, - 0.1300e+04, 0.3522e+00, - 0.1310e+04, 0.3159e+00, - 0.1320e+04, 0.2767e+00, - 0.1330e+04, 0.2623e+00, - 0.1340e+04, 0.1978e+00, - 0.1350e+04, 0.4197e-01, - 0.1360e+04, 0.1392e-03, - 0.1370e+04, 0.4692e-04, - 0.1380e+04, 0.1344e-02, - 0.1390e+04, 0.5292e-02, - 0.1400e+04, 0.2461e-05, - 0.1410e+04, 0.4293e-02, - 0.1420e+04, 0.2556e-01, - 0.1430e+04, 0.9898e-01, - 0.1440e+04, 0.6925e-01, - 0.1450e+04, 0.5774e-01, - 0.1460e+04, 0.1172e+00, - 0.1470e+04, 0.9169e-01, - 0.1480e+04, 0.9248e-01, - 0.1490e+04, 0.1937e+00, - 0.1500e+04, 0.2546e+00, - 0.1510e+04, 0.2677e+00, - 0.1520e+04, 0.2616e+00, - 0.1530e+04, 0.2574e+00, - 0.1540e+04, 0.2609e+00, - 0.1550e+04, 0.2627e+00, - 0.1560e+04, 0.2593e+00, - 0.1570e+04, 0.2379e+00, - 0.1580e+04, 0.2372e+00, - 0.1590e+04, 0.2287e+00, - 0.1600e+04, 0.2302e+00, - 0.1610e+04, 0.2170e+00, - 0.1620e+04, 0.2292e+00, - 0.1630e+04, 0.2322e+00, - 0.1640e+04, 0.2095e+00, - 0.1650e+04, 0.2183e+00, - 0.1660e+04, 0.2189e+00, - 0.1670e+04, 0.2154e+00, - 0.1680e+04, 0.1991e+00, - 0.1690e+04, 0.2022e+00, - 0.1700e+04, 0.1975e+00, - 0.1710e+04, 0.1864e+00, - 0.1720e+04, 0.1854e+00, - 0.1730e+04, 0.1752e+00, - 0.1740e+04, 0.1665e+00, - 0.1750e+04, 0.1670e+00, - 0.1760e+04, 0.1622e+00, - 0.1770e+04, 0.1504e+00, - 0.1780e+04, 0.1161e+00, - 0.1790e+04, 0.1068e+00, - 0.1800e+04, 0.4541e-01, - 0.1810e+04, 0.2518e-01, - 0.1820e+04, 0.5525e-02, - 0.1830e+04, 0.1963e-03, - 0.1840e+04, 0.9461e-05, - 0.1850e+04, 0.1700e-03, - 0.1860e+04, 0.2765e-03, - 0.1870e+04, 0.2355e-06, - 0.1880e+04, 0.1055e-02, - 0.1890e+04, 0.2512e-02, - 0.1900e+04, 0.4552e-04, - 0.1910e+04, 0.5519e-03, - 0.1920e+04, 0.3288e-02, - 0.1930e+04, 0.3281e-02, - 0.1940e+04, 0.1028e-01, - 0.1950e+04, 0.2698e-01, - 0.1960e+04, 0.3215e-01, - 0.1970e+04, 0.5907e-01, - 0.1980e+04, 0.8290e-01, - 0.1990e+04, 0.9252e-01, - 0.2000e+04, 0.4630e-01, - 0.2010e+04, 0.4664e-01, - 0.2020e+04, 0.5210e-01, - 0.2030e+04, 0.8816e-01, - 0.2040e+04, 0.9206e-01, - 0.2050e+04, 0.7283e-01, - 0.2060e+04, 0.7413e-01, - 0.2070e+04, 0.7092e-01, - 0.2080e+04, 0.8925e-01, - 0.2090e+04, 0.9080e-01, - 0.2100e+04, 0.8882e-01, - 0.2110e+04, 0.9074e-01, - 0.2120e+04, 0.8870e-01, - 0.2130e+04, 0.8978e-01, - 0.2140e+04, 0.9009e-01, - 0.2150e+04, 0.8515e-01, - 0.2160e+04, 0.8391e-01, - 0.2170e+04, 0.8109e-01, - 0.2180e+04, 0.8133e-01, - 0.2190e+04, 0.7937e-01, - 0.2200e+04, 0.7252e-01, - 0.2210e+04, 0.7862e-01, - 0.2220e+04, 0.7717e-01, - 0.2230e+04, 0.7534e-01, - 0.2240e+04, 0.7312e-01, - 0.2250e+04, 0.7211e-01, - 0.2260e+04, 0.6775e-01, - 0.2270e+04, 0.6582e-01, - 0.2280e+04, 0.6686e-01, - 0.2290e+04, 0.6381e-01, - 0.2300e+04, 0.5990e-01, - 0.2310e+04, 0.6448e-01, - 0.2320e+04, 0.5400e-01, - 0.2330e+04, 0.5834e-01, - 0.2340e+04, 0.4959e-01, - 0.2350e+04, 0.4533e-01, - 0.2360e+04, 0.5260e-01, - 0.2370e+04, 0.3567e-01, - 0.2380e+04, 0.4674e-01, - 0.2390e+04, 0.4126e-01, - 0.2400e+04, 0.4726e-01, - 0.2410e+04, 0.3924e-01, - 0.2420e+04, 0.3166e-01, - 0.2430e+04, 0.4852e-01, - 0.2440e+04, 0.4739e-01, - 0.2450e+04, 0.1931e-01, - 0.2460e+04, 0.3885e-01, - 0.2470e+04, 0.2266e-01, - 0.2480e+04, 0.1475e-01, - 0.2490e+04, 0.8442e-02, - 0.2500e+04, 0.1466e-01, - 0.2510e+04, 0.6496e-02, - 0.2520e+04, 0.2256e-02, - 0.2530e+04, 0.3021e-04, - 0.2540e+04, 0.2730e-04, - 0.2550e+04, 0.2779e-07, - 0.2560e+04, 0.4655e-06, - 0.2570e+04, 0.9511e-12, - 0.2580e+04, 0.5296e-13, - 0.2590e+04, 0.4757e-18, - 0.2600e+04, 0.1390e-16, - 0.2610e+04, 0.8284e-20, - 0.2620e+04, 0.1685e-15, - 0.2630e+04, 0.3664e-26, - 0.2640e+04, 0.4018e-10, - 0.2650e+04, 0.1219e-11, - 0.2660e+04, 0.2993e-14, - 0.2670e+04, 0.2406e-36, - 0.2680e+04, 0.0000e+00, - 0.2690e+04, 0.1286e-20, - 0.2700e+04, 0.2953e-41, - 0.2710e+04, 0.1743e-22, - 0.2720e+04, 0.4345e-27, - 0.2730e+04, 0.7687e-13, - 0.2740e+04, 0.5702e-15, - 0.2750e+04, 0.2985e-19, - 0.2760e+04, 0.1944e-35, - 0.2770e+04, 0.9937e-16, - 0.2780e+04, 0.3978e-25, - 0.2790e+04, 0.1796e-11, - 0.2800e+04, 0.1818e-08, - 0.2810e+04, 0.1790e-06, - 0.2820e+04, 0.1349e-07, - 0.2830e+04, 0.8420e-04, - 0.2840e+04, 0.9419e-05, - 0.2850e+04, 0.3244e-04, - 0.2860e+04, 0.2736e-03, - 0.2870e+04, 0.1159e-03, - 0.2880e+04, 0.1253e-02, - 0.2890e+04, 0.8788e-03, - 0.2900e+04, 0.2641e-02, - 0.2910e+04, 0.3721e-02, - 0.2920e+04, 0.6130e-02, - 0.2930e+04, 0.1064e-01, - 0.2940e+04, 0.3998e-02, - 0.2950e+04, 0.9301e-02, - 0.2960e+04, 0.8467e-02, - 0.2970e+04, 0.1220e-02, - 0.2980e+04, 0.3444e-02, - 0.2990e+04, 0.1462e-01, - 0.3000e+04, 0.1173e-01, - 0.3010e+04, 0.1033e-01, - 0.3020e+04, 0.2158e-02, - 0.3030e+04, 0.9299e-02, - 0.3040e+04, 0.4684e-02, - 0.3050e+04, 0.3120e-02, - 0.3060e+04, 0.9647e-02, - 0.3070e+04, 0.4417e-02, - 0.3080e+04, 0.6574e-02, - 0.3090e+04, 0.5481e-02, - 0.3100e+04, 0.7460e-02, - 0.3110e+04, 0.2883e-02, - 0.3120e+04, 0.1381e-01, - 0.3130e+04, 0.8512e-02, - 0.3140e+04, 0.5643e-02, - 0.3150e+04, 0.1019e-01, - 0.3160e+04, 0.1242e-01, - 0.3170e+04, 0.1546e-01, - 0.3180e+04, 0.1328e-01, - 0.3190e+04, 0.6653e-02, - 0.3200e+04, 0.1455e-02, - 0.3210e+04, 0.7609e-03, - 0.3220e+04, 0.3527e-02, - 0.3230e+04, 0.1212e-02, - 0.3240e+04, 0.5960e-02, - 0.3250e+04, 0.4193e-02, - 0.3260e+04, 0.2581e-02, - 0.3270e+04, 0.2590e-02, - 0.3280e+04, 0.4574e-02, - 0.3290e+04, 0.1112e-01, - 0.3300e+04, 0.3168e-02, - 0.3310e+04, 0.5679e-02, - 0.3320e+04, 0.2343e-03, - 0.3330e+04, 0.6243e-02, - 0.3340e+04, 0.5467e-02, - 0.3350e+04, 0.1045e-01, - 0.3360e+04, 0.7264e-02, - 0.3370e+04, 0.5567e-02, - 0.3380e+04, 0.6825e-02, - 0.3390e+04, 0.1132e-01, - 0.3400e+04, 0.1382e-01, - 0.3410e+04, 0.8955e-02, - 0.3420e+04, 0.1426e-01, - 0.3430e+04, 0.9903e-02, - 0.3440e+04, 0.9415e-02, - 0.3450e+04, 0.1221e-01, - 0.3460e+04, 0.1359e-01, - 0.3470e+04, 0.1326e-01, - 0.3480e+04, 0.1223e-01, - 0.3490e+04, 0.1153e-01, - 0.3500e+04, 0.1288e-01, - 0.3510e+04, 0.1292e-01, - 0.3520e+04, 0.1303e-01, - 0.3530e+04, 0.1211e-01, - 0.3540e+04, 0.1022e-01, - 0.3550e+04, 0.1153e-01, - 0.3560e+04, 0.1179e-01, - 0.3570e+04, 0.9701e-02, - 0.3580e+04, 0.1103e-01, - 0.3590e+04, 0.1057e-01, - 0.3600e+04, 0.1116e-01, - 0.3610e+04, 0.1051e-01, - 0.3620e+04, 0.1209e-01, - 0.3630e+04, 0.1081e-01, - 0.3640e+04, 0.1190e-01, - 0.3650e+04, 0.1077e-01, - 0.3660e+04, 0.1142e-01, - 0.3670e+04, 0.9043e-02, - 0.3680e+04, 0.9377e-02, - 0.3690e+04, 0.1037e-01, - 0.3700e+04, 0.1114e-01, - 0.3710e+04, 0.9977e-02, - 0.3720e+04, 0.1080e-01, - 0.3730e+04, 0.9894e-02, - 0.3740e+04, 0.9411e-02, - 0.3750e+04, 0.9769e-02, - 0.3760e+04, 0.9590e-02, - 0.3770e+04, 0.9703e-02, - 0.3780e+04, 0.9985e-02, - 0.3790e+04, 0.8581e-02, - 0.3800e+04, 0.1012e-01, - 0.3810e+04, 0.8925e-02, - 0.3820e+04, 0.9938e-02, - 0.3830e+04, 0.9884e-02, - 0.3840e+04, 0.9376e-02, - 0.3850e+04, 0.9185e-02, - 0.3860e+04, 0.8506e-02, - 0.3870e+04, 0.7832e-02, - 0.3880e+04, 0.7082e-02, - 0.3890e+04, 0.7347e-02, - 0.3900e+04, 0.8324e-02, - 0.3910e+04, 0.7550e-02, - 0.3920e+04, 0.7389e-02, - 0.3930e+04, 0.7457e-02, - 0.3940e+04, 0.7786e-02, - 0.3950e+04, 0.7975e-02, - 0.3960e+04, 0.8089e-02, - 0.3970e+04, 0.8058e-02, - 0.3980e+04, 0.7779e-02, - 0.3990e+04, 0.7693e-02, - 0.4000e+04, 0.7504e-02 +const double solstice_sun_spectrum_smarts[] = { + 2.800000e-01, 1.755832e-22, + 2.850000e-01, 3.294496e-13, + 2.900000e-01, 9.825730e-07, + 2.950000e-01, 4.867814e-03, + 3.000000e-01, 5.930555e-01, + 3.050000e-01, 1.009141e+01, + 3.100000e-01, 3.418097e+01, + 3.150000e-01, 8.042174e+01, + 3.200000e-01, 1.269513e+02, + 3.250000e-01, 1.755832e+02, + 3.300000e-01, 2.802401e+02, + 3.350000e-01, 2.853227e+02, + 3.400000e-01, 3.165119e+02, + 3.450000e-01, 3.021880e+02, + 3.500000e-01, 3.613318e+02, + 3.550000e-01, 4.239411e+02, + 3.600000e-01, 4.052276e+02, + 3.650000e-01, 4.730351e+02, + 3.700000e-01, 5.417667e+02, + 3.750000e-01, 4.694541e+02, + 3.800000e-01, 5.618663e+02, + 3.850000e-01, 5.083828e+02, + 3.900000e-01, 6.487338e+02, + 3.950000e-01, 6.482718e+02, + 4.000000e-01, 9.550803e+02, + 4.050000e-01, 9.825730e+02, + 4.100000e-01, 9.814178e+02, + 4.150000e-01, 1.076949e+03, + 4.200000e-01, 1.098781e+03, + 4.250000e-01, 1.125350e+03, + 4.300000e-01, 8.677508e+02, + 4.350000e-01, 1.148568e+03, + 4.400000e-01, 1.220997e+03, + 4.450000e-01, 1.329581e+03, + 4.500000e-01, 1.492457e+03, + 4.550000e-01, 1.458958e+03, + 4.600000e-01, 1.491302e+03, + 4.650000e-01, 1.502854e+03, + 4.700000e-01, 1.461268e+03, + 4.750000e-01, 1.546750e+03, + 4.800000e-01, 1.581404e+03, + 4.850000e-01, 1.485527e+03, + 4.900000e-01, 1.568698e+03, + 4.950000e-01, 1.591801e+03, + 5.000000e-01, 1.539819e+03, + 5.050000e-01, 1.549060e+03, + 5.100000e-01, 1.569853e+03, + 5.150000e-01, 1.554836e+03, + 5.200000e-01, 1.516716e+03, + 5.250000e-01, 1.613748e+03, + 5.300000e-01, 1.609128e+03, + 5.350000e-01, 1.610283e+03, + 5.400000e-01, 1.515560e+03, + 5.450000e-01, 1.592956e+03, + 5.500000e-01, 1.595266e+03, + 5.550000e-01, 1.618369e+03, + 5.600000e-01, 1.557146e+03, + 5.650000e-01, 1.554836e+03, + 5.700000e-01, 1.515560e+03, + 5.750000e-01, 1.542129e+03, + 5.800000e-01, 1.561767e+03, + 5.850000e-01, 1.582559e+03, + 5.900000e-01, 1.363080e+03, + 5.950000e-01, 1.440476e+03, + 6.000000e-01, 1.523647e+03, + 6.050000e-01, 1.558301e+03, + 6.100000e-01, 1.539819e+03, + 6.150000e-01, 1.543284e+03, + 6.200000e-01, 1.555991e+03, + 6.250000e-01, 1.473975e+03, + 6.300000e-01, 1.460113e+03, + 6.350000e-01, 1.519026e+03, + 6.400000e-01, 1.524802e+03, + 6.450000e-01, 1.524802e+03, + 6.500000e-01, 1.461268e+03, + 6.550000e-01, 1.398890e+03, + 6.600000e-01, 1.465889e+03, + 6.650000e-01, 1.490147e+03, + 6.700000e-01, 1.493613e+03, + 6.750000e-01, 1.482061e+03, + 6.800000e-01, 1.473975e+03, + 6.850000e-01, 1.438165e+03, + 6.900000e-01, 1.227927e+03, + 6.950000e-01, 1.281064e+03, + 7.000000e-01, 1.282220e+03, + 7.050000e-01, 1.331891e+03, + 7.100000e-01, 1.342288e+03, + 7.150000e-01, 1.306478e+03, + 7.200000e-01, 8.671732e+02, + 7.250000e-01, 9.532321e+02, + 7.300000e-01, 1.061239e+03, + 7.350000e-01, 1.217531e+03, + 7.400000e-01, 1.253341e+03, + 7.450000e-01, 1.311098e+03, + 7.500000e-01, 1.303012e+03, + 7.550000e-01, 1.293771e+03, + 7.600000e-01, 2.831280e+02, + 7.650000e-01, 7.233567e+02, + 7.700000e-01, 1.226772e+03, + 7.750000e-01, 1.236014e+03, + 7.800000e-01, 1.237169e+03, + 7.850000e-01, 1.229083e+03, + 7.900000e-01, 1.118765e+03, + 7.950000e-01, 1.164394e+03, + 8.000000e-01, 1.134014e+03, + 8.050000e-01, 1.121307e+03, + 8.100000e-01, 1.091042e+03, + 8.150000e-01, 8.507700e+02, + 8.200000e-01, 8.317100e+02, + 8.250000e-01, 1.000362e+03, + 8.300000e-01, 9.195016e+02, + 8.350000e-01, 1.049456e+03, + 8.400000e-01, 1.061354e+03, + 8.450000e-01, 1.078220e+03, + 8.500000e-01, 1.017921e+03, + 8.550000e-01, 9.829195e+02, + 8.600000e-01, 1.063665e+03, + 8.650000e-01, 1.007640e+03, + 8.700000e-01, 1.043219e+03, + 8.750000e-01, 1.036288e+03, + 8.800000e-01, 1.023003e+03, + 8.850000e-01, 1.012145e+03, + 8.900000e-01, 1.000016e+03, + 8.950000e-01, 8.095311e+02, + 9.000000e-01, 7.268221e+02, + 9.050000e-01, 8.257032e+02, + 9.100000e-01, 5.527406e+02, + 9.150000e-01, 6.158120e+02, + 9.200000e-01, 7.346772e+02, + 9.250000e-01, 6.600543e+02, + 9.300000e-01, 3.049603e+02, + 9.350000e-01, 1.475130e+02, + 9.400000e-01, 3.614473e+02, + 9.450000e-01, 2.581767e+02, + 9.500000e-01, 6.159275e+01, + 9.550000e-01, 2.303375e+02, + 9.600000e-01, 3.137395e+02, + 9.650000e-01, 4.293703e+02, + 9.700000e-01, 5.969830e+02, + 9.750000e-01, 5.647542e+02, + 9.800000e-01, 5.682197e+02, + 9.850000e-01, 6.823488e+02, + 9.900000e-01, 7.674835e+02, + 9.950000e-01, 8.192344e+02, + 1, 8.012140e+02, + 1.005000e+00, 7.822695e+02, + 1.010000e+00, 7.758006e+02, + 1.015000e+00, 7.794971e+02, + 1.020000e+00, 7.657508e+02, + 1.025000e+00, 7.675990e+02, + 1.030000e+00, 7.572027e+02, + 1.035000e+00, 7.464597e+02, + 1.040000e+00, 7.380271e+02, + 1.045000e+00, 7.256670e+02, + 1.050000e+00, 7.190826e+02, + 1.055000e+00, 7.090328e+02, + 1.060000e+00, 6.904348e+02, + 1.065000e+00, 6.854677e+02, + 1.070000e+00, 6.587836e+02, + 1.075000e+00, 6.438822e+02, + 1.080000e+00, 6.396081e+02, + 1.085000e+00, 6.422650e+02, + 1.090000e+00, 5.934020e+02, + 1.095000e+00, 5.304462e+02, + 1.100000e+00, 4.647180e+02, + 1.105000e+00, 4.916330e+02, + 1.110000e+00, 4.297168e+02, + 1.115000e+00, 1.782401e+02, + 1.120000e+00, 6.423805e+01, + 1.125000e+00, 6.967882e+01, + 1.130000e+00, 2.260634e+01, + 1.135000e+00, 4.263669e+00, + 1.140000e+00, 1.699230e+02, + 1.145000e+00, 6.558958e+01, + 1.150000e+00, 6.521993e+01, + 1.155000e+00, 2.327633e+02, + 1.160000e+00, 2.165912e+02, + 1.165000e+00, 3.331461e+02, + 1.170000e+00, 4.473907e+02, + 1.175000e+00, 4.572095e+02, + 1.180000e+00, 4.366478e+02, + 1.185000e+00, 3.854745e+02, + 1.190000e+00, 4.808901e+02, + 1.195000e+00, 4.510872e+02, + 1.200000e+00, 4.587112e+02, + 1.205000e+00, 4.491234e+02, + 1.210000e+00, 4.704937e+02, + 1.215000e+00, 4.268290e+02, + 1.220000e+00, 4.885141e+02, + 1.225000e+00, 4.982174e+02, + 1.230000e+00, 4.974088e+02, + 1.235000e+00, 5.173929e+02, + 1.240000e+00, 5.160068e+02, + 1.245000e+00, 5.130034e+02, + 1.250000e+00, 5.102310e+02, + 1.255000e+00, 5.015674e+02, + 1.260000e+00, 4.792729e+02, + 1.265000e+00, 4.427701e+02, + 1.270000e+00, 4.321427e+02, + 1.275000e+00, 4.596353e+02, + 1.280000e+00, 4.599818e+02, + 1.285000e+00, 4.644869e+02, + 1.290000e+00, 4.539751e+02, + 1.295000e+00, 4.331823e+02, + 1.300000e+00, 3.504734e+02, + 1.305000e+00, 4.007225e+02, + 1.310000e+00, 2.752729e+02, + 1.315000e+00, 2.498596e+02, + 1.320000e+00, 2.327633e+02, + 1.325000e+00, 3.078482e+02, + 1.330000e+00, 1.720023e+02, + 1.335000e+00, 1.822831e+02, + 1.340000e+00, 1.253341e+02, + 1.345000e+00, 5.043397e+01, + 1.350000e+00, 1.852865e+00, + 1.355000e+00, 1.421993e-06, + 1.360000e+00, 4.201291e-07, + 1.365000e+00, 2.019207e-16, + 1.370000e+00, 8.799954e-09, + 1.375000e+00, 7.149241e-04, + 1.380000e+00, 2.424666e-04, + 1.385000e+00, 1.434700e-06, + 1.390000e+00, 1.954519e-03, + 1.395000e+00, 2.606025e-07, + 1.400000e+00, 3.272548e-12, + 1.405000e+00, 6.190464e-08, + 1.410000e+00, 5.661404e-03, + 1.415000e+00, 1.804349e-03, + 1.420000e+00, 7.145775e-01, + 1.425000e+00, 4.718799e+00, + 1.430000e+00, 2.378460e+01, + 1.435000e+00, 3.674541e+00, + 1.440000e+00, 1.269513e+01, + 1.445000e+00, 1.381563e+01, + 1.450000e+00, 7.487701e+00, + 1.455000e+00, 3.016104e+01, + 1.460000e+00, 4.723420e+01, + 1.465000e+00, 5.845073e+01, + 1.470000e+00, 1.375787e+01, + 1.475000e+00, 1.321495e+02, + 1.480000e+00, 2.521699e+01, + 1.485000e+00, 8.132276e+01, + 1.490000e+00, 1.404666e+02, + 1.495000e+00, 1.506319e+02, + 1.500000e+00, 2.457010e+02, + 1.505000e+00, 1.679592e+02, + 1.510000e+00, 2.838210e+02, + 1.515000e+00, 2.803556e+02, + 1.520000e+00, 2.709988e+02, + 1.525000e+00, 2.742333e+02, + 1.530000e+00, 2.812797e+02, + 1.535000e+00, 2.921381e+02, + 1.540000e+00, 3.012639e+02, + 1.545000e+00, 3.099275e+02, + 1.550000e+00, 3.042673e+02, + 1.555000e+00, 3.003397e+02, + 1.560000e+00, 3.006863e+02, + 1.565000e+00, 2.990691e+02, + 1.570000e+00, 2.735402e+02, + 1.575000e+00, 2.793159e+02, + 1.580000e+00, 2.746953e+02, + 1.585000e+00, 2.874020e+02, + 1.590000e+00, 2.694972e+02, + 1.595000e+00, 2.856693e+02, + 1.600000e+00, 2.646455e+02, + 1.605000e+00, 2.668403e+02, + 1.610000e+00, 2.498596e+02, + 1.615000e+00, 2.667248e+02, + 1.620000e+00, 2.664938e+02, + 1.625000e+00, 2.700747e+02, + 1.630000e+00, 2.686885e+02, + 1.635000e+00, 2.596784e+02, + 1.640000e+00, 2.400408e+02, + 1.645000e+00, 2.470872e+02, + 1.650000e+00, 2.502061e+02, + 1.655000e+00, 2.505526e+02, + 1.660000e+00, 2.503216e+02, + 1.665000e+00, 2.378460e+02, + 1.670000e+00, 2.482423e+02, + 1.675000e+00, 2.396942e+02, + 1.680000e+00, 2.306840e+02, + 1.685000e+00, 2.391166e+02, + 1.690000e+00, 2.287203e+02, + 1.695000e+00, 2.350736e+02, + 1.700000e+00, 2.195945e+02, + 1.705000e+00, 2.177463e+02, + 1.710000e+00, 2.065413e+02, + 1.715000e+00, 2.040000e+02, + 1.720000e+00, 2.040000e+02, + 1.725000e+00, 1.882899e+02, + 1.730000e+00, 1.879434e+02, + 1.735000e+00, 1.700385e+02, + 1.740000e+00, 1.747746e+02, + 1.745000e+00, 1.594111e+02, + 1.750000e+00, 1.725798e+02, + 1.755000e+00, 1.523647e+02, + 1.760000e+00, 1.639162e+02, + 1.765000e+00, 1.238324e+02, + 1.770000e+00, 1.276444e+02, + 1.775000e+00, 9.467632e+01, + 1.780000e+00, 7.652887e+01, + 1.785000e+00, 4.875900e+01, + 1.790000e+00, 6.226274e+01, + 1.795000e+00, 1.964915e+01, + 1.800000e+00, 1.596421e+01, + 1.805000e+00, 2.681110e+00, + 1.810000e+00, 1.351529e+00, + 1.815000e+00, 1.782401e-01, + 1.820000e+00, 2.100068e-02, + 1.825000e+00, 2.950260e-02, + 1.830000e+00, 5.069966e-06, + 1.835000e+00, 3.109671e-06, + 1.840000e+00, 1.126390e-08, + 1.845000e+00, 7.945141e-07, + 1.850000e+00, 2.736557e-07, + 1.855000e+00, 5.976761e-08, + 1.860000e+00, 3.084258e-05, + 1.865000e+00, 2.344960e-05, + 1.870000e+00, 4.700317e-13, + 1.875000e+00, 1.053730e-12, + 1.880000e+00, 3.766953e-04, + 1.885000e+00, 1.557146e-04, + 1.890000e+00, 8.908538e-04, + 1.895000e+00, 8.015605e-04, + 1.900000e+00, 3.690713e-07, + 1.905000e+00, 3.564802e-07, + 1.910000e+00, 3.483941e-05, + 1.915000e+00, 8.942038e-05, + 1.920000e+00, 3.726523e-03, + 1.925000e+00, 2.120861e-02, + 1.930000e+00, 1.522491e-02, + 1.935000e+00, 3.087723e-01, + 1.940000e+00, 3.988743e-01, + 1.945000e+00, 2.781608e+00, + 1.950000e+00, 6.680249e+00, + 1.955000e+00, 2.853227e+00, + 1.960000e+00, 1.102131e+01, + 1.965000e+00, 1.737350e+01, + 1.970000e+00, 3.748471e+01, + 1.975000e+00, 5.294065e+01, + 1.980000e+00, 6.599388e+01, + 1.985000e+00, 7.625164e+01, + 1.990000e+00, 7.612457e+01, + 1.995000e+00, 7.584733e+01, + 2, 3.413477e+01, + 2.005000e+00, 1.133320e+01, + 2.010000e+00, 3.980657e+01, + 2.015000e+00, 2.313771e+01, + 2.020000e+00, 4.245187e+01, + 2.025000e+00, 7.589354e+01, + 2.030000e+00, 8.488063e+01, + 2.035000e+00, 1.036519e+02, + 2.040000e+00, 9.467632e+01, + 2.045000e+00, 9.695198e+01, + 2.050000e+00, 7.200067e+01, + 2.055000e+00, 5.648697e+01, + 2.060000e+00, 7.166568e+01, + 2.065000e+00, 6.471166e+01, + 2.070000e+00, 6.833884e+01, + 2.075000e+00, 8.371392e+01, + 2.080000e+00, 9.408720e+01, + 2.085000e+00, 9.265481e+01, + 2.090000e+00, 9.914677e+01, + 2.095000e+00, 9.885798e+01, + 2.100000e+00, 9.155741e+01, + 2.105000e+00, 1.043450e+02, + 2.110000e+00, 9.829195e+01, + 2.115000e+00, 1.024158e+02, + 2.120000e+00, 9.531166e+01, + 2.125000e+00, 9.782989e+01, + 2.130000e+00, 9.974745e+01, + 2.135000e+00, 1.005561e+02, + 2.140000e+00, 1.021848e+02, + 2.145000e+00, 1.008102e+02, + 2.150000e+00, 9.193861e+01, + 2.155000e+00, 9.273567e+01, + 2.160000e+00, 9.260860e+01, + 2.165000e+00, 8.261653e+01, + 2.170000e+00, 9.129173e+01, + 2.175000e+00, 8.697146e+01, + 2.180000e+00, 9.136104e+01, + 2.185000e+00, 7.770713e+01, + 2.190000e+00, 8.627836e+01, + 2.195000e+00, 8.574699e+01, + 2.200000e+00, 7.709490e+01, + 2.205000e+00, 8.019071e+01, + 2.210000e+00, 8.848471e+01, + 2.215000e+00, 8.380634e+01, + 2.220000e+00, 8.744507e+01, + 2.225000e+00, 8.378323e+01, + 2.230000e+00, 8.583941e+01, + 2.235000e+00, 8.345979e+01, + 2.240000e+00, 8.287066e+01, + 2.245000e+00, 7.990192e+01, + 2.250000e+00, 8.172706e+01, + 2.255000e+00, 7.652887e+01, + 2.260000e+00, 7.598595e+01, + 2.265000e+00, 7.731438e+01, + 2.270000e+00, 7.353703e+01, + 2.275000e+00, 7.257825e+01, + 2.280000e+00, 7.551234e+01, + 2.285000e+00, 7.141155e+01, + 2.290000e+00, 7.159637e+01, + 2.295000e+00, 6.921676e+01, + 2.300000e+00, 6.564733e+01, + 2.305000e+00, 6.586681e+01, + 2.310000e+00, 6.974813e+01, + 2.315000e+00, 6.378754e+01, + 2.320000e+00, 5.589784e+01, + 2.325000e+00, 5.843918e+01, + 2.330000e+00, 6.036829e+01, + 2.335000e+00, 6.296738e+01, + 2.340000e+00, 4.414994e+01, + 2.345000e+00, 5.389943e+01, + 2.350000e+00, 4.024552e+01, + 2.355000e+00, 4.850487e+01, + 2.360000e+00, 5.193567e+01, + 2.365000e+00, 4.863193e+01, + 2.370000e+00, 2.624507e+01, + 2.375000e+00, 4.312185e+01, + 2.380000e+00, 3.800453e+01, + 2.385000e+00, 2.428131e+01, + 2.390000e+00, 3.251755e+01, + 2.395000e+00, 3.768108e+01, + 2.400000e+00, 4.099637e+01, + 2.405000e+00, 2.709988e+01, + 2.410000e+00, 2.648765e+01, + 2.415000e+00, 1.916399e+01, + 2.420000e+00, 1.944122e+01, + 2.425000e+00, 2.625662e+01, + 2.430000e+00, 3.942537e+01, + 2.435000e+00, 8.307859e+00, + 2.440000e+00, 3.668765e+01, + 2.445000e+00, 1.312254e+01, + 2.450000e+00, 6.917055e+00, + 2.455000e+00, 1.529422e+01, + 2.460000e+00, 2.475492e+01, + 2.465000e+00, 1.468199e+01, + 2.470000e+00, 7.535062e+00, + 2.475000e+00, 7.232412e+00, + 2.480000e+00, 2.036534e+00, + 2.485000e+00, 1.159773e+00, + 2.490000e+00, 4.409218e-01, + 2.495000e+00, 3.889400e-01, + 2.500000e+00, 1.192118e+00, + 2.505000e+00, 1.178256e-01, + 2.510000e+00, 2.302220e-01, + 2.515000e+00, 2.307995e-02, + 2.520000e+00, 5.186636e-03, + 2.525000e+00, 8.529648e-05, + 2.530000e+00, 5.429218e-08, + 2.535000e+00, 2.571370e-09, + 2.540000e+00, 1.254496e-08, + 2.545000e+00, 7.580113e-14, + 2.550000e+00, 1.089194e-20, + 2.555000e+00, 1.036288e-12, + 2.560000e+00, 6.137327e-14, + 2.565000e+00, 1.341132e-19, + 2.570000e+00, 4.495855e-27, + 2.575000e+00, 2.722695e-43, + 2.580000e+00, 8.278980e-35, + 2.585000e+00, 5.818505e-56, + 2.590000e+00, 1.185187e-50, + 2.595000e+00, 2.414269e-47, + 2.600000e+00, 8.499614e-46, + 2.605000e+00, 3.937916e-52, + 2.610000e+00, 4.453114e-55, + 2.615000e+00, 1.024505e-60, + 2.620000e+00, 6.394926e-43, + 2.625000e+00, 7.158482e-47, + 2.630000e+00, 6.029898e-76, + 2.635000e+00, 8.243170e-23, + 2.640000e+00, 1.977622e-25, + 2.645000e+00, 3.870917e-28, + 2.650000e+00, 5.282514e-31, + 2.655000e+00, 2.154360e-44, + 2.660000e+00, 7.691007e-38, + 2.665000e+00, 4.388426e-57, + 2.670000e+00, 6.902038e-97, + 2.675000e+00, 1.127314e-72, + 2.680000e+00, 7.614767e-78, + 2.685000e+00, 2.016897e-93, + 2.690000e+00, 4.231325e-45, + 2.695000e+00, 5.160068e-46, + 2.700000e+00, 3.717282e-70, + 2.705000e+00, 5.757282e-56, + 2.710000e+00, 8.303238e-47, + 2.715000e+00, 9.111845e-41, + 2.720000e+00, 9.901970e-73, + 2.725000e+00, 1.520181e-30, + 2.730000e+00, 1.561767e-30, + 2.735000e+00, 7.793816e-32, + 2.740000e+00, 3.076172e-38, + 2.745000e+00, 1.721178e-37, + 2.750000e+00, 5.867021e-42, + 2.755000e+00, 6.732231e-56, + 2.760000e+00, 1.425459e-56, + 2.765000e+00, 2.810487e-38, + 2.770000e+00, 6.439977e-34, + 2.775000e+00, 3.742695e-48, + 2.780000e+00, 3.463148e-41, + 2.785000e+00, 1.364235e-36, + 2.790000e+00, 8.396806e-22, + 2.795000e+00, 9.365979e-23, + 2.800000e+00, 1.356149e-14, + 2.805000e+00, 2.779298e-16, + 2.810000e+00, 4.397667e-12, + 2.815000e+00, 3.218256e-12, + 2.820000e+00, 7.425322e-14, + 2.825000e+00, 1.903692e-08, + 2.830000e+00, 3.691868e-06, + 2.835000e+00, 4.135447e-13, + 2.840000e+00, 6.424960e-08, + 2.845000e+00, 2.679955e-04, + 2.850000e+00, 4.470441e-07, + 2.855000e+00, 3.652593e-07, + 2.860000e+00, 2.067724e-04, + 2.865000e+00, 3.345323e-03, + 2.870000e+00, 1.248720e-05, + 2.875000e+00, 1.402356e-02, + 2.880000e+00, 8.862332e-03, + 2.885000e+00, 1.924485e-02, + 2.890000e+00, 7.473839e-03, + 2.895000e+00, 4.261359e-01, + 2.900000e+00, 9.198482e-02, + 2.905000e+00, 2.128947e-03, + 2.910000e+00, 6.100362e-01, + 2.915000e+00, 1.715402e-01, + 2.920000e+00, 6.144258e-01, + 2.925000e+00, 2.073499e-01, + 2.930000e+00, 1.656489e+00, + 2.935000e+00, 2.313771e+00, + 2.940000e+00, 2.400408e-01, + 2.945000e+00, 1.966070e-01, + 2.950000e+00, 1.638007e+00, + 2.955000e+00, 7.849263e-01, + 2.960000e+00, 1.492457e+00, + 2.965000e+00, 3.734609e+00, + 2.970000e+00, 4.676059e-02, + 2.975000e+00, 1.094623e-01, + 2.980000e+00, 2.450079e-01, + 2.985000e+00, 3.056534e+00, + 2.990000e+00, 6.057621e+00, + 2.995000e+00, 1.480906e+00, + 3, 3.981812e+00, + 3.005000e+00, 9.241222e-01, + 3.010000e+00, 3.634111e+00, + 3.015000e+00, 2.126636e+00, + 3.020000e+00, 4.987950e-02, + 3.025000e+00, 3.859366e+00, + 3.030000e+00, 2.861314e+00, + 3.035000e+00, 7.404530e-01, + 3.040000e+00, 5.771143e-01, + 3.045000e+00, 1.351529e+00, + 3.050000e+00, 1.505164e-01, + 3.055000e+00, 2.044620e-02, + 3.060000e+00, 3.115447e+00, + 3.065000e+00, 8.756058e-01, + 3.070000e+00, 3.492027e-01, + 3.075000e+00, 2.830124e+00, + 3.080000e+00, 1.386183e+00, + 3.085000e+00, 3.766953e-01, + 3.090000e+00, 5.635991e-01, + 3.095000e+00, 7.939365e-02, + 3.100000e+00, 1.830917e+00, + 3.105000e+00, 2.093137e-01, + 3.110000e+00, 8.597802e-02, + 3.115000e+00, 5.444235e-01, + 3.120000e+00, 5.816194e+00, + 3.125000e+00, 1.196738e+00, + 3.130000e+00, 3.370736e+00, + 3.135000e+00, 7.649422e+00, + 3.140000e+00, 1.336512e+00, + 3.145000e+00, 1.344598e+00, + 3.150000e+00, 3.883624e+00, + 3.155000e+00, 3.158188e+00, + 3.160000e+00, 6.340634e+00, + 3.165000e+00, 1.286840e+01, + 3.170000e+00, 9.983986e+00, + 3.175000e+00, 7.336376e+00, + 3.180000e+00, 8.348289e+00, + 3.185000e+00, 5.731868e+00, + 3.190000e+00, 2.194790e+00, + 3.195000e+00, 8.751438e-01, + 3.200000e+00, 4.146999e-02, + 3.205000e+00, 2.004190e-02, + 3.210000e+00, 9.394858e-03, + 3.215000e+00, 4.889762e-02, + 3.220000e+00, 4.417304e-01, + 3.225000e+00, 2.447769e-02, + 3.230000e+00, 5.661404e-02, + 3.235000e+00, 4.230170e+00, + 3.240000e+00, 1.881744e+00, + 3.245000e+00, 1.957984e-01, + 3.250000e+00, 1.468199e+00, + 3.255000e+00, 6.918210e+00, + 3.260000e+00, 5.117327e-01, + 3.265000e+00, 7.144620e-01, + 3.270000e+00, 3.461993e-01, + 3.275000e+00, 3.131619e+00, + 3.280000e+00, 1.364235e+00, + 3.285000e+00, 8.155379e+00, + 3.290000e+00, 6.398391e+00, + 3.295000e+00, 3.224031e-01, + 3.300000e+00, 6.914745e-01, + 3.305000e+00, 1.679592e+00, + 3.310000e+00, 2.510147e+00, + 3.315000e+00, 1.062972e-02, + 3.320000e+00, 8.433771e-03, + 3.325000e+00, 2.253703e+00, + 3.330000e+00, 3.401925e+00, + 3.335000e+00, 7.758006e+00, + 3.340000e+00, 1.736195e+00, + 3.345000e+00, 2.252548e+00, + 3.350000e+00, 6.016036e+00, + 3.355000e+00, 2.031914e+00, + 3.360000e+00, 3.474700e+00, + 3.365000e+00, 5.899365e+00, + 3.370000e+00, 2.852072e+00, + 3.375000e+00, 6.880090e+00, + 3.380000e+00, 4.453114e+00, + 3.385000e+00, 6.382219e+00, + 3.390000e+00, 1.068632e+01, + 3.395000e+00, 9.365979e+00, + 3.400000e+00, 1.320340e+01, + 3.405000e+00, 3.969105e+00, + 3.410000e+00, 5.988312e+00, + 3.415000e+00, 7.733748e+00, + 3.420000e+00, 1.455493e+01, + 3.425000e+00, 1.114838e+01, + 3.430000e+00, 1.007986e+01, + 3.435000e+00, 1.171325e+01, + 3.440000e+00, 8.677508e+00, + 3.445000e+00, 1.164394e+01, + 3.450000e+00, 1.297237e+01, + 3.455000e+00, 8.471891e+00, + 3.460000e+00, 1.351529e+01, + 3.465000e+00, 1.125581e+01, + 3.470000e+00, 1.354994e+01, + 3.475000e+00, 1.190963e+01, + 3.480000e+00, 1.279909e+01, + 3.485000e+00, 1.338822e+01, + 3.490000e+00, 1.101785e+01, + 3.495000e+00, 1.378097e+01, + 3.500000e+00, 1.314564e+01, + 3.505000e+00, 1.318029e+01, + 3.510000e+00, 1.311098e+01, + 3.515000e+00, 1.164394e+01, + 3.520000e+00, 1.328426e+01, + 3.525000e+00, 1.208290e+01, + 3.530000e+00, 1.186342e+01, + 3.535000e+00, 9.635130e+00, + 3.540000e+00, 9.058708e+00, + 3.545000e+00, 9.734473e+00, + 3.550000e+00, 1.095316e+01, + 3.555000e+00, 8.415288e+00, + 3.560000e+00, 1.149146e+01, + 3.565000e+00, 1.214066e+01, + 3.570000e+00, 7.699093e+00, + 3.575000e+00, 8.362151e+00, + 3.580000e+00, 1.120383e+01, + 3.585000e+00, 9.255084e+00, + 3.590000e+00, 9.442219e+00, + 3.595000e+00, 9.932004e+00, + 3.600000e+00, 1.093930e+01, + 3.605000e+00, 1.156308e+01, + 3.610000e+00, 9.555424e+00, + 3.615000e+00, 9.627044e+00, + 3.620000e+00, 1.319185e+01, + 3.625000e+00, 1.099243e+01, + 3.630000e+00, 1.045760e+01, + 3.635000e+00, 1.072906e+01, + 3.640000e+00, 1.296081e+01, + 3.645000e+00, 1.189807e+01, + 3.650000e+00, 1.092312e+01, + 3.655000e+00, 1.193273e+01, + 3.660000e+00, 1.182876e+01, + 3.665000e+00, 1.105135e+01, + 3.670000e+00, 7.242808e+00, + 3.675000e+00, 2.920226e+00, + 3.680000e+00, 7.257825e+00, + 3.685000e+00, 9.436443e+00, + 3.690000e+00, 1.000940e+01, + 3.695000e+00, 1.061470e+01, + 3.700000e+00, 1.223307e+01, + 3.705000e+00, 1.205980e+01, + 3.710000e+00, 9.839592e+00, + 3.715000e+00, 9.526545e+00, + 3.720000e+00, 1.134938e+01, + 3.725000e+00, 1.208290e+01, + 3.730000e+00, 9.712525e+00, + 3.735000e+00, 8.408357e+00, + 3.740000e+00, 9.006726e+00, + 3.745000e+00, 1.160929e+01, + 3.750000e+00, 9.896194e+00, + 3.755000e+00, 9.294360e+00, + 3.760000e+00, 8.864643e+00, + 3.765000e+00, 8.670577e+00, + 3.770000e+00, 9.617802e+00, + 3.775000e+00, 9.493046e+00, + 3.780000e+00, 1.045991e+01, + 3.785000e+00, 8.957055e+00, + 3.790000e+00, 7.537372e+00, + 3.795000e+00, 9.389082e+00, + 3.800000e+00, 1.133089e+01, + 3.805000e+00, 1.009604e+01, + 3.810000e+00, 8.170396e+00, + 3.815000e+00, 7.491166e+00, + 3.820000e+00, 1.101207e+01, + 3.825000e+00, 1.056734e+01, + 3.830000e+00, 1.079721e+01, + 3.835000e+00, 7.306342e+00, + 3.840000e+00, 9.927383e+00, + 3.845000e+00, 9.710215e+00, + 3.850000e+00, 9.877712e+00, + 3.855000e+00, 9.170758e+00, + 3.860000e+00, 8.479977e+00, + 3.865000e+00, 9.136104e+00, + 3.870000e+00, 8.273204e+00, + 3.875000e+00, 7.294790e+00, + 3.880000e+00, 7.233567e+00, + 3.885000e+00, 7.671370e+00, + 3.890000e+00, 7.663284e+00, + 3.895000e+00, 8.552751e+00, + 3.900000e+00, 8.527338e+00, + 3.905000e+00, 9.039071e+00, + 3.910000e+00, 8.155379e+00, + 3.915000e+00, 7.950917e+00, + 3.920000e+00, 7.851574e+00, + 3.925000e+00, 7.636715e+00, + 3.930000e+00, 8.031777e+00, + 3.935000e+00, 8.475356e+00, + 3.940000e+00, 8.463805e+00, + 3.945000e+00, 8.571234e+00, + 3.950000e+00, 8.652095e+00, + 3.955000e+00, 8.907383e+00, + 3.960000e+00, 8.891211e+00, + 3.965000e+00, 8.962831e+00, + 3.970000e+00, 8.746817e+00, + 3.975000e+00, 8.585096e+00, + 3.980000e+00, 8.561993e+00, + 3.985000e+00, 8.552751e+00, + 3.990000e+00, 8.494994e+00, + 3.995000e+00, 8.284756e+00, + 4, 8.193499e+00 }; -const size_t solstice_sun_spectrum_smarts295_size = - sizeof(solstice_sun_spectrum_smarts295) / sizeof(double[2]); +const size_t solstice_sun_spectrum_smarts_size = + sizeof(solstice_sun_spectrum_smarts) / sizeof(double[2]); diff --git a/src/solstice_sun_spectrum.h b/src/solstice_sun_spectrum.h @@ -26,8 +26,8 @@ extern LOCAL_SYM const double solstice_sun_spectrum_dummy[]; extern LOCAL_SYM const size_t solstice_sun_spectrum_dummy_size; -extern LOCAL_SYM const double solstice_sun_spectrum_smarts295[]; -extern LOCAL_SYM const size_t solstice_sun_spectrum_smarts295_size; +extern LOCAL_SYM const double solstice_sun_spectrum_smarts[]; +extern LOCAL_SYM const size_t solstice_sun_spectrum_smarts_size; #endif /* SOLSTICE_SUN_SPECTRUM_H */