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:
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: ¶bol
- - 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 © 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 */