Commit bf911fca authored by steffen.schotthoefer's avatar steffen.schotthoefer
Browse files

Merge branch 'develop' into 'master'

Develop

See merge request !39
parents cf7f8e3a 765aa5a4
Pipeline #135520 passed with stage
in 18 minutes and 5 seconds
......@@ -7,17 +7,17 @@ unit_tests:
stage: unit_tests
script:
- git submodule update --init --recursive
- cd code/build/release
- cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -Dbuild_tests=ON ../../
- cd code/build/debug
- cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON ../../
- ninja
- OMP_NUM_THREADS=1 ./unit_tests -r junit > unit_tests_report.xml
- gcovr -e ../../ext/ -e ../../tests/ -r ../../
artifacts:
when: always
paths:
- code/build/release/unit_tests_report.xml
- code/build/debug/unit_tests_report.xml
reports:
junit: code/build/release/unit_tests_report.xml
junit: code/build/debug/unit_tests_report.xml
timeout: 4h
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "develop"
......
......@@ -10,3 +10,6 @@
[submodule "code/ext/parmetis"]
path = code/ext/parmetis
url = https://github.com/slydex/parmetis.git
[submodule "code/ext/neuralEntropy"]
path = code/ext/neuralEntropy
url = https://github.com/ScSteffen/neuralEntropy.git
FROM ubuntu:20.04
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" \
PYTHONPATH=/usr/local/gmsh/lib:$PYTHONPATH \
PATH=/opt/conda/bin:/usr/local/gmsh/bin:$PATH
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -qq \
gcc \
g++ \
libopenmpi-dev \
openmpi-bin \
libblas-dev \
liblapack-dev \
git \
make \
ninja-build \
cmake \
wget \
ssh \
libssl-dev \
libxt-dev \
libgl1-mesa-dev \
libglu1 \
libxrender1 \
libxcursor-dev \
libxft-dev \
libxinerama-dev\
python3\
python3-pip\
vim
RUN pip3 install tensorflow==2.2.2\
pygmsh==6.1.1 Pillow pydicom gcovr \
matplotlib\
scipy
RUN cd /usr/local \
&& wget -nc --quiet http://gmsh.info/bin/Linux/gmsh-4.7.0-Linux64-sdk.tgz \
&& tar xzf gmsh-4.7.0-Linux64-sdk.tgz \
&& mv gmsh-4.7.0-Linux64-sdk gmsh \
&& rm gmsh-4.7.0-Linux64-sdk.tgz
RUN wget -nc --no-check-certificate --quiet https://www.vtk.org/files/release/8.2/VTK-8.2.0.tar.gz \
&& tar xzf VTK-8.2.0.tar.gz \
&& mkdir VTK-8.2.0/build \
&& cd VTK-8.2.0/build \
&& cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_DOCUMENTATION=OFF -DBUILD_TESTING=OFF ../ \
&& ninja \
&& ninja install > /dev/null \
&& cd - \
&& rm -rf VTK-*
RUN apt-get clean \
&& apt-get autoremove --purge \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /home
......@@ -20,6 +20,11 @@ TBD
- VTK
- git
- ninja or make
- gmsh
### Python dependencies
- pygmsh version 6.1.1 'pip install pygmsh==6.1.1' (note that newer versions are not yet supported)
### Obtain submodules
Note that an **active internet connection is required for the first build** in order to download the latest versions of the required submodules!
......
......@@ -2,7 +2,8 @@ cmake_minimum_required( VERSION 3.12.4 )
project( KiT-RT VERSION 0.1.0 LANGUAGES CXX )
### OPTIONS #####################################
option( build_tests "enables compiling of unit_tests" OFF )
option( BUILD_TESTS "builds all available unit tests" OFF )
option( BUILD_GUI "additionally builds a user interface" OFF )
#################################################
### COMPILER ####################################
......@@ -27,7 +28,7 @@ include_directories( ${LAPACK_INCLUDE_DIR} )
find_package( BLAS )
find_package( VTK REQUIRED COMPONENTS vtkIOGeometry vtkFiltersCore )
find_package( VTK COMPONENTS vtkIOGeometry vtkFiltersCore REQUIRED )
find_package( Python3 COMPONENTS Interpreter Development NumPy REQUIRED )
include_directories( ${Python3_INCLUDE_DIRS} ${Python3_NumPy_INCLUDE_DIRS} )
......@@ -73,6 +74,13 @@ add_compile_definitions( GIT_HASH="${GIT_HASH}" )
### BUILD KIT-RT ################################
file( GLOB_RECURSE SRCS RELATIVE ${CMAKE_SOURCE_DIR} "src/*.cpp" "include/*.h" )
set( EXCLUDE_DIR "/gui/" )
foreach( TMP_PATH ${SRCS} )
string( FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND )
if( NOT ${EXCLUDE_DIR_FOUND} EQUAL -1 )
list( REMOVE_ITEM SRCS ${TMP_PATH} )
endif()
endforeach( TMP_PATH )
include_directories( ${CMAKE_SOURCE_DIR}/include )
add_executable( ${CMAKE_PROJECT_NAME} ${SRCS} ${EXT_SRCS} )
target_link_libraries( ${CMAKE_PROJECT_NAME} ${CORE_LIBRARIES} )
......@@ -84,18 +92,18 @@ target_compile_options( ${CMAKE_PROJECT_NAME} PUBLIC "$<$<CONFIG:RELEASE>:${KITR
### BUILD UNIT TESTS ############################
if( build_tests )
if( BUILD_TESTS )
include( CTest )
set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/ext/Catch2/contrib ${CMAKE_MODULE_PATH} )
include( Catch )
set( CATCH_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/ext/Catch2/single_include/catch2 )
add_compile_definitions( BUILD_TESTING )
add_compile_definitions( TESTS_PATH="${CMAKE_SOURCE_DIR}/tests/" )
add_library( Catch INTERFACE )
target_include_directories( Catch INTERFACE ${CATCH_INCLUDE_DIR} )
file( GLOB_RECURSE TEST_SRCS RELATIVE ${CMAKE_SOURCE_DIR} "tests/*.cpp" )
list( REMOVE_ITEM SRCS "src/main.cpp" )
add_executable( unit_tests ${TEST_SRCS} ${SRCS} ${EXT_SRCS} )
target_compile_definitions( unit_tests PUBLIC BUILD_TESTING )
target_compile_definitions( unit_tests PUBLIC TESTS_PATH="${CMAKE_SOURCE_DIR}/tests/" )
target_link_libraries( unit_tests Catch ${CORE_LIBRARIES} )
target_compile_options( unit_tests PUBLIC "$<$<CONFIG:DEBUG>:${KITRT_DEBUG_OPTIONS}>" )
if( CMAKE_COMPILER_IS_GNUCXX )
......@@ -108,3 +116,25 @@ if( build_tests )
catch_discover_tests( unit_tests )
endif()
#################################################
### BUILD GUI ###################################
if( BUILD_GUI )
find_package( Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED )
find_package( VTK COMPONENTS vtkGUISupportQt vtkInteractionStyle vtkInteractionWidgets vtkRenderingAnnotation vtkRenderingCore vtkRenderingFreeType vtkRenderingOpenGL2 REQUIRED )
include_directories( ${CMAKE_SOURCE_DIR}/include/gui )
file( GLOB_RECURSE GUI_SRCS RELATIVE ${CMAKE_SOURCE_DIR} "src/gui/*" )
file( GLOB_RECURSE GUI_INCL RELATIVE ${CMAKE_SOURCE_DIR} "include/gui/*" )
add_executable( ${CMAKE_PROJECT_NAME}_gui ${SRCS} ${EXT_SRCS} ${GUI_SRCS} ${GUI_INCL})
target_compile_definitions( ${CMAKE_PROJECT_NAME}_gui PUBLIC BUILD_GUI )
set_target_properties( ${CMAKE_PROJECT_NAME}_gui PROPERTIES AUTOMOC ON )
set_target_properties( ${CMAKE_PROJECT_NAME}_gui PROPERTIES AUTOUIC ON )
set_target_properties( ${CMAKE_PROJECT_NAME}_gui PROPERTIES AUTORCC ON )
set( GUI_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Gui Qt5::OpenGL ${VTK_LIBRARIES} )
target_link_libraries( ${CMAKE_PROJECT_NAME}_gui ${CORE_LIBRARIES} ${GUI_LIBRARIES} )
set_target_properties( ${CMAKE_PROJECT_NAME}_gui PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin" )
target_compile_options( ${CMAKE_PROJECT_NAME}_gui PUBLIC "$<$<CONFIG:DEBUG>:${KITRT_DEBUG_OPTIONS}>" )
target_compile_options( ${CMAKE_PROJECT_NAME}_gui PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:${KITRT_RELWITHDEBINFO_OPTIONS}>" )
target_compile_options( ${CMAKE_PROJECT_NAME}_gui PUBLIC "$<$<CONFIG:RELEASE>:${KITRT_RELEASE_OPTIONS}>" )
endif()
#################################################
Subproject commit 54f38c0a6154004efa2f8cad4737d127f6dcde59
......@@ -4,8 +4,6 @@
* DO NOT CREATE SETTERS FOR THIS CLASS! ALL OPTIONS ARE CONSTANT (after SetPostprocessing).
*
* @author S. Schotthöfer
*
* Disclaimer: This class structure was copied and (heavily) modifed with open source permission from SU2 v7.0.3 https://su2code.github.io/
*/
#ifndef CONFIG_H
......@@ -50,7 +48,17 @@ class Config
unsigned _nQuadPoints;
// Mesh
unsigned _nCells;
unsigned _nCells; /*!< @brief: Number of cells in the mesh */
unsigned short _dim; /*!< @brief: spatial dimensionality of the mesh/test case */
// Boundary Conditions
/*!< @brief List of all Pairs (marker, BOUNDARY_TYPE), e.g. (farfield,DIRICHLET).
Each Boundary Conditions must have an entry in enum BOUNDARY_TYPE*/
std::vector<std::pair<std::string, BOUNDARY_TYPE>> _boundaries;
unsigned short _nMarkerDirichlet; /*!< @brief Number of Dirichlet BC markers. Enum entry: DIRICHLET */
unsigned short _nMarkerNeumann; /*!< @brief Number of Neumann BC markers. Enum entry: Neumann */
std::vector<std::string> _MarkerDirichlet; /*!< @brief Dirichlet BC markers. */
std::vector<std::string> _MarkerNeumann; /*!< @brief Neumann BC markers. */
// Solver
double _CFL; /*!< @brief CFL Number for Solver*/
......@@ -61,26 +69,23 @@ class Config
unsigned short _maxMomentDegree; /*!< @brief Maximal Order of Moments for PN and MN Solver */
unsigned short _reconsOrder; /*!< @brief Spatial Order of Accuracy for Solver */
// Linesource
double _sigmaS; /*!< @brief Scattering coeffient for Linesource test case */
/*!< @brief If true, very low entries (10^-10 or smaller) of the flux matrices will be set to zero,
* to improve floating point accuracy */
bool _cleanFluxMat;
bool _allGaussPts; /*!< @brief If true, the SN Solver uses all Gauss pts in the quadrature */
bool _csd; /*!< @brief If true, continuous slowing down approximation will be used */
bool _csd; // LEGACY! /*!< @brief If true, continuous slowing down approximation will be used */
std::string _hydrogenFile; /*!< @brief Name of hydrogen cross section file */
std::string _oxygenFile; /*!< @brief Name of oxygen cross section file */
// --- Problems ---
// Boundary Conditions
/*!< @brief List of all Pairs (marker, BOUNDARY_TYPE), e.g. (farfield,DIRICHLET).
Each Boundary Conditions must have an entry in enum BOUNDARY_TYPE*/
std::vector<std::pair<std::string, BOUNDARY_TYPE>> _boundaries;
unsigned short _nMarkerDirichlet; /*!< @brief Number of Dirichlet BC markers. Enum entry: DIRICHLET */
unsigned short _nMarkerNeumann; /*!< @brief Number of Neumann BC markers. Enum entry: Neumann */
std::vector<std::string> _MarkerDirichlet; /*!< @brief Dirichlet BC markers. */
std::vector<std::string> _MarkerNeumann; /*!< @brief Neumann BC markers. */
// Linesource
double _sigmaS; /*!< @brief Scattering coeffient for Linesource test case */
// Database ICRU
std::string _dataDir; /*!< @brief material directory */
// ElectronRT
std::string _hydrogenFile; /*!< @brief Name of hydrogen cross section file path*/
std::string _oxygenFile; /*!< @brief Name of oxygen cross section file path */
std::string _stoppingPowerFile; /*!< @brief Name of stopping power file path */
// Scattering Kernel
KERNEL_NAME _kernelName; /*!< @brief Scattering Kernel Name*/
......@@ -96,6 +101,8 @@ class Config
unsigned long _newtonLineSearchIter; /*!< @brief Maximal Number of line search iterations for newton optimizer */
bool _newtonFastMode; /*!< @brief If true, we skip the NewtonOptimizer for quadratic entropy and assign alpha = u */
// NeuralModel
unsigned short _neuralModel; /*!< @brief: Version number of the employed neural model */
// Output Options
unsigned short _nVolumeOutput; /*!< @brief Number of volume outputs */
std::vector<VOLUME_OUTPUT> _volumeOutput; /*!< @brief Output groups for volume output*/
......@@ -235,13 +242,18 @@ class Config
*/
// File structure
std::string inline GetCTFile() const { return std::filesystem::path( _ctFile ).lexically_normal(); }
std::string inline GetHydrogenFile() const { return std::filesystem::path( _hydrogenFile ).lexically_normal(); }
std::string inline GetLogDir() const { return std::filesystem::path( _logDir ).lexically_normal(); }
std::string inline GetLogFile() const { return std::filesystem::path( _logFileName ).lexically_normal(); }
std::string inline GetMeshFile() const { return std::filesystem::path( _meshFile ).lexically_normal(); }
std::string inline GetOutputDir() const { return std::filesystem::path( _outputDir ).lexically_normal(); }
std::string inline GetOutputFile() const { return std::filesystem::path( _outputFile ).lexically_normal(); }
// Problem Files
std::string inline GetHydrogenFile() const { return std::filesystem::path( _hydrogenFile ).lexically_normal(); }
std::string inline GetOxygenFile() const { return std::filesystem::path( _oxygenFile ).lexically_normal(); }
std::string inline GetStoppingPowerFile() const { return std::filesystem::path( _stoppingPowerFile ).lexically_normal(); }
std::string inline GetDataDir() const { return std::filesystem::path( _dataDir ).lexically_normal(); }
// Quadrature Structure
unsigned GetNQuadPoints() { return _nQuadPoints; }
......@@ -250,6 +262,7 @@ class Config
// Mesh Structure
unsigned GetNCells() { return _nCells; }
unsigned short GetDim() { return _dim; }
// Solver Structure
double inline GetCFL() const { return _CFL; }
......@@ -274,6 +287,9 @@ class Config
bool inline GetNewtonFastMode() const { return _newtonFastMode; }
OPTIMIZER_NAME inline GetOptimizerName() const { return _entropyOptimizerName; }
// Neural Closure
unsigned short inline GetNeuralModel() { return _neuralModel; }
// Boundary Conditions
BOUNDARY_TYPE GetBoundaryType( std::string nameMarker ) const; /*! @brief Get Boundary Type of given marker */
......@@ -308,6 +324,8 @@ class Config
void SetQuadName( QUAD_NAME quadName ) { _quadName = quadName; } /*! @brief Never change the quadName! This is only for the test framework. */
void SetQuadOrder( unsigned quadOrder ) { _quadOrder = quadOrder; } /*! @brief Never change the quadOrder! This is only for the test framework. */
void SetSNAllGaussPts( bool useall ) { _allGaussPts = useall; } /*! @brief Never change the this! This is only for the test framework. */
// Mesh Structure
void SetNCells( unsigned nCells ) { _nCells = nCells; }
};
#endif // CONFIG_H
/*!
/*!
* \file GlobalConstants.h
* \brief All global defined (physical) constants, enums etc
* \author <blank>
......@@ -55,7 +55,16 @@ enum BOUNDARY_TYPE { DIRICHLET, NEUMANN, NONE, INVALID };
/*! @brief Enum for all currently available quadratures in rtsn.
* Option enums are written in capital letters with underscores as spaces (e.g option "time integration" has option enum "TIME_INTEGRATION")
*/
enum QUAD_NAME { QUAD_MonteCarlo, QUAD_GaussLegendreTensorized, QUAD_GaussLegendre1D, QUAD_LevelSymmetric, QUAD_Lebedev, QUAD_LDFESA, QUAD_Product };
enum QUAD_NAME {
QUAD_MonteCarlo,
QUAD_GaussLegendreTensorized,
QUAD_GaussLegendre1D,
QUAD_LevelSymmetric,
QUAD_Lebedev,
QUAD_LDFESA,
QUAD_Product,
QUAD_GaussChebyshev1D
};
/*! @brief Conversion Map String to enum
*/
......@@ -77,7 +86,8 @@ enum PROBLEM_NAME {
PROBLEM_LineSource_Pseudo_1D_Physics,
PROBLEM_AirCavity,
PROBLEM_MuscleBoneLung,
PROBLEM_Phantom2D
PROBLEM_Phantom2D,
PROBLEM_IsotropicSource_2D
};
inline std::map<std::string, PROBLEM_NAME> Problem_Map{ { "LINESOURCE", PROBLEM_LineSource },
......@@ -87,6 +97,7 @@ inline std::map<std::string, PROBLEM_NAME> Problem_Map{ { "LINESOURCE", PROBLEM_
{ "AIRCAVITY", PROBLEM_AirCavity },
{ "MUSCLEBONELUNG", PROBLEM_MuscleBoneLung },
{ "PHANTOM2D", PROBLEM_Phantom2D },
{ "ISOTROPICPOINTSOURCE2D", PROBLEM_IsotropicSource_2D },
{ "LINESOURCE_PSEUDO_1D", PROBLEM_LineSource_Pseudo_1D },
{ "LINESOURCE_PSEUDO_1D_PHYSICS", PROBLEM_LineSource_Pseudo_1D_Physics } };
......@@ -130,10 +141,10 @@ enum OPTIMIZER_NAME { NEWTON, ML };
inline std::map<std::string, OPTIMIZER_NAME> Optimizer_Map{ { "NEWTON", NEWTON }, { "ML", ML } };
// Volume output
enum VOLUME_OUTPUT { ANALYTIC, MINIMAL, MOMENTS, DUAL_MOMENTS, DOSE };
enum VOLUME_OUTPUT { ANALYTIC, MINIMAL, MOMENTS, DUAL_MOMENTS, MEDICAL };
inline std::map<std::string, VOLUME_OUTPUT> VolOutput_Map{
{ "ANALYTIC", ANALYTIC }, { "MINIMAL", MINIMAL }, { "MOMENTS", MOMENTS }, { "DUAL_MOMENTS", DUAL_MOMENTS }, { "DOSE", DOSE } };
{ "ANALYTIC", ANALYTIC }, { "MINIMAL", MINIMAL }, { "MOMENTS", MOMENTS }, { "DUAL_MOMENTS", DUAL_MOMENTS }, { "MEDICAL", MEDICAL } };
// Scalar output
enum SCALAR_OUTPUT { ITER, MASS, RMS_FLUX, VTK_OUTPUT, CSV_OUTPUT };
......
#ifndef CMAP_H
#define CMAP_H
#include "common/typedef.h"
const Matrix viridis{ { 0.0, 0.267004, 0.004874, 0.329415 },
{ 0.00392156862745098, 0.26851, 0.009605, 0.335427 },
{ 0.00784313725490196, 0.269944, 0.014625, 0.341379 },
{ 0.011764705882352941, 0.271305, 0.019942, 0.347269 },
{ 0.01568627450980392, 0.272594, 0.025563, 0.353093 },
{ 0.0196078431372549, 0.273809, 0.031497, 0.358853 },
{ 0.023529411764705882, 0.274952, 0.037752, 0.364543 },
{ 0.027450980392156862, 0.276022, 0.044167, 0.370164 },
{ 0.03137254901960784, 0.277018, 0.050344, 0.375715 },
{ 0.03529411764705882, 0.277941, 0.056324, 0.381191 },
{ 0.0392156862745098, 0.278791, 0.062145, 0.386592 },
{ 0.043137254901960784, 0.279566, 0.067836, 0.391917 },
{ 0.047058823529411764, 0.280267, 0.073417, 0.397163 },
{ 0.050980392156862744, 0.280894, 0.078907, 0.402329 },
{ 0.054901960784313725, 0.281446, 0.08432, 0.407414 },
{ 0.058823529411764705, 0.281924, 0.089666, 0.412415 },
{ 0.06274509803921569, 0.282327, 0.094955, 0.417331 },
{ 0.06666666666666667, 0.282656, 0.100196, 0.42216 },
{ 0.07058823529411765, 0.28291, 0.105393, 0.426902 },
{ 0.07450980392156863, 0.283091, 0.110553, 0.431554 },
{ 0.0784313725490196, 0.283197, 0.11568, 0.436115 },
{ 0.08235294117647059, 0.283229, 0.120777, 0.440584 },
{ 0.08627450980392157, 0.283187, 0.125848, 0.44496 },
{ 0.09019607843137255, 0.283072, 0.130895, 0.449241 },
{ 0.09411764705882353, 0.282884, 0.13592, 0.453427 },
{ 0.09803921568627451, 0.282623, 0.140926, 0.457517 },
{ 0.10196078431372549, 0.28229, 0.145912, 0.46151 },
{ 0.10588235294117647, 0.281887, 0.150881, 0.465405 },
{ 0.10980392156862745, 0.281412, 0.155834, 0.469201 },
{ 0.11372549019607843, 0.280868, 0.160771, 0.472899 },
{ 0.11764705882352941, 0.280255, 0.165693, 0.476498 },
{ 0.12156862745098039, 0.279574, 0.170599, 0.479997 },
{ 0.12549019607843137, 0.278826, 0.17549, 0.483397 },
{ 0.12941176470588237, 0.278012, 0.180367, 0.486697 },
{ 0.13333333333333333, 0.277134, 0.185228, 0.489898 },
{ 0.13725490196078433, 0.276194, 0.190074, 0.493001 },
{ 0.1411764705882353, 0.275191, 0.194905, 0.496005 },
{ 0.1450980392156863, 0.274128, 0.199721, 0.498911 },
{ 0.14901960784313725, 0.273006, 0.20452, 0.501721 },
{ 0.15294117647058825, 0.271828, 0.209303, 0.504434 },
{ 0.1568627450980392, 0.270595, 0.214069, 0.507052 },
{ 0.1607843137254902, 0.269308, 0.218818, 0.509577 },
{ 0.16470588235294117, 0.267968, 0.223549, 0.512008 },
{ 0.16862745098039217, 0.26658, 0.228262, 0.514349 },
{ 0.17254901960784313, 0.265145, 0.232956, 0.516599 },
{ 0.17647058823529413, 0.263663, 0.237631, 0.518762 },
{ 0.1803921568627451, 0.262138, 0.242286, 0.520837 },
{ 0.1843137254901961, 0.260571, 0.246922, 0.522828 },
{ 0.18823529411764706, 0.258965, 0.251537, 0.524736 },
{ 0.19215686274509805, 0.257322, 0.25613, 0.526563 },
{ 0.19607843137254902, 0.255645, 0.260703, 0.528312 },
{ 0.2, 0.253935, 0.265254, 0.529983 },
{ 0.20392156862745098, 0.252194, 0.269783, 0.531579 },
{ 0.20784313725490197, 0.250425, 0.27429, 0.533103 },
{ 0.21176470588235294, 0.248629, 0.278775, 0.534556 },
{ 0.21568627450980393, 0.246811, 0.283237, 0.535941 },
{ 0.2196078431372549, 0.244972, 0.287675, 0.53726 },
{ 0.2235294117647059, 0.243113, 0.292092, 0.538516 },
{ 0.22745098039215686, 0.241237, 0.296485, 0.539709 },
{ 0.23137254901960785, 0.239346, 0.300855, 0.540844 },
{ 0.23529411764705882, 0.237441, 0.305202, 0.541921 },
{ 0.23921568627450981, 0.235526, 0.309527, 0.542944 },
{ 0.24313725490196078, 0.233603, 0.313828, 0.543914 },
{ 0.24705882352941178, 0.231674, 0.318106, 0.544834 },
{ 0.25098039215686274, 0.229739, 0.322361, 0.545706 },
{ 0.2549019607843137, 0.227802, 0.326594, 0.546532 },
{ 0.25882352941176473, 0.225863, 0.330805, 0.547314 },
{ 0.2627450980392157, 0.223925, 0.334994, 0.548053 },
{ 0.26666666666666666, 0.221989, 0.339161, 0.548752 },
{ 0.27058823529411763, 0.220057, 0.343307, 0.549413 },
{ 0.27450980392156865, 0.21813, 0.347432, 0.550038 },
{ 0.2784313725490196, 0.21621, 0.351535, 0.550627 },
{ 0.2823529411764706, 0.214298, 0.355619, 0.551184 },
{ 0.28627450980392155, 0.212395, 0.359683, 0.55171 },
{ 0.2901960784313726, 0.210503, 0.363727, 0.552206 },
{ 0.29411764705882354, 0.208623, 0.367752, 0.552675 },
{ 0.2980392156862745, 0.206756, 0.371758, 0.553117 },
{ 0.30196078431372547, 0.204903, 0.375746, 0.553533 },
{ 0.3058823529411765, 0.203063, 0.379716, 0.553925 },
{ 0.30980392156862746, 0.201239, 0.38367, 0.554294 },
{ 0.3137254901960784, 0.19943, 0.387607, 0.554642 },
{ 0.3176470588235294, 0.197636, 0.391528, 0.554969 },
{ 0.3215686274509804, 0.19586, 0.395433, 0.555276 },
{ 0.3254901960784314, 0.1941, 0.399323, 0.555565 },
{ 0.32941176470588235, 0.192357, 0.403199, 0.555836 },
{ 0.3333333333333333, 0.190631, 0.407061, 0.556089 },
{ 0.33725490196078434, 0.188923, 0.41091, 0.556326 },
{ 0.3411764705882353, 0.187231, 0.414746, 0.556547 },
{ 0.34509803921568627, 0.185556, 0.41857, 0.556753 },
{ 0.34901960784313724, 0.183898, 0.422383, 0.556944 },
{ 0.35294117647058826, 0.182256, 0.426184, 0.55712 },
{ 0.3568627450980392, 0.180629, 0.429975, 0.557282 },
{ 0.3607843137254902, 0.179019, 0.433756, 0.55743 },
{ 0.36470588235294116, 0.177423, 0.437527, 0.557565 },
{ 0.3686274509803922, 0.175841, 0.44129, 0.557685 },
{ 0.37254901960784315, 0.174274, 0.445044, 0.557792 },
{ 0.3764705882352941, 0.172719, 0.448791, 0.557885 },
{ 0.3803921568627451, 0.171176, 0.45253, 0.557965 },
{ 0.3843137254901961, 0.169646, 0.456262, 0.55803 },
{ 0.38823529411764707, 0.168126, 0.459988, 0.558082 },
{ 0.39215686274509803, 0.166617, 0.463708, 0.558119 },
{ 0.396078431372549, 0.165117, 0.467423, 0.558141 },
{ 0.4, 0.163625, 0.471133, 0.558148 },
{ 0.403921568627451, 0.162142, 0.474838, 0.55814 },
{ 0.40784313725490196, 0.160665, 0.47854, 0.558115 },
{ 0.4117647058823529, 0.159194, 0.482237, 0.558073 },
{ 0.41568627450980394, 0.157729, 0.485932, 0.558013 },
{ 0.4196078431372549, 0.15627, 0.489624, 0.557936 },
{ 0.4235294117647059, 0.154815, 0.493313, 0.55784 },
{ 0.42745098039215684, 0.153364, 0.497, 0.557724 },
{ 0.43137254901960786, 0.151918, 0.500685, 0.557587 },
{ 0.43529411764705883, 0.150476, 0.504369, 0.55743 },
{ 0.4392156862745098, 0.149039, 0.508051, 0.55725 },
{ 0.44313725490196076, 0.147607, 0.511733, 0.557049 },
{ 0.4470588235294118, 0.14618, 0.515413, 0.556823 },
{ 0.45098039215686275, 0.144759, 0.519093, 0.556572 },
{ 0.4549019607843137, 0.143343, 0.522773, 0.556295 },
{ 0.4588235294117647, 0.141935, 0.526453, 0.555991 },
{ 0.4627450980392157, 0.140536, 0.530132, 0.555659 },
{ 0.4666666666666667, 0.139147, 0.533812, 0.555298 },
{ 0.47058823529411764, 0.13777, 0.537492, 0.554906 },
{ 0.4745098039215686, 0.136408, 0.541173, 0.554483 },
{ 0.47843137254901963, 0.135066, 0.544853, 0.554029 },
{ 0.4823529411764706, 0.133743, 0.548535, 0.553541 },
{ 0.48627450980392156, 0.132444, 0.552216, 0.553018 },
{ 0.49019607843137253, 0.131172, 0.555899, 0.552459 },
{ 0.49411764705882355, 0.129933, 0.559582, 0.551864 },
{ 0.4980392156862745, 0.128729, 0.563265, 0.551229 },
{ 0.5019607843137255, 0.127568, 0.566949, 0.550556 },
{ 0.5058823529411764, 0.126453, 0.570633, 0.549841 },
{ 0.5098039215686274, 0.125394, 0.574318, 0.549086 },
{ 0.5137254901960784, 0.124395, 0.578002, 0.548287 },
{ 0.5176470588235295, 0.123463, 0.581687, 0.547445 },
{ 0.5215686274509804, 0.122606, 0.585371, 0.546557 },
{ 0.5254901960784314, 0.121831, 0.589055, 0.545623 },
{ 0.5294117647058824, 0.121148, 0.592739, 0.544641 },
{ 0.5333333333333333, 0.120565, 0.596422, 0.543611 },
{ 0.5372549019607843, 0.120092, 0.600104, 0.54253 },
{ 0.5411764705882353, 0.119738, 0.603785, 0.5414 },
{ 0.5450980392156862, 0.119512, 0.607464, 0.540218 },
{ 0.5490196078431373, 0.119423, 0.611141, 0.538982 },
{ 0.5529411764705883, 0.119483, 0.614817, 0.537692 },
{ 0.5568627450980392, 0.119699, 0.61849, 0.536347 },
{ 0.5607843137254902, 0.120081, 0.622161, 0.534946 },
{ 0.5647058823529412, 0.120638, 0.625828, 0.533488 },
{ 0.5686274509803921, 0.12138, 0.629492, 0.531973 },
{ 0.5725490196078431, 0.122312, 0.633153, 0.530398 },
{ 0.5764705882352941, 0.123444, 0.636809, 0.528763 },
{ 0.5803921568627451, 0.12478, 0.640461, 0.527068 },
{ 0.5843137254901961, 0.126326, 0.644107, 0.525311 },
{ 0.5882352941176471, 0.128087, 0.647749, 0.523491 },
{ 0.592156862745098, 0.130067, 0.651384, 0.521608 },
{ 0.596078431372549, 0.132268, 0.655014, 0.519661 },
{ 0.6, 0.134692, 0.658636, 0.517649 },
{ 0.6039215686274509, 0.137339, 0.662252, 0.515571 },
{ 0.6078431372549019, 0.14021, 0.665859, 0.513427 },
{ 0.611764705882353, 0.143303, 0.669459, 0.511215 },
{ 0.615686274509804, 0.146616, 0.67305, 0.508936 },
{ 0.6196078431372549, 0.150148, 0.676631, 0.506589 },
{ 0.6235294117647059, 0.153894, 0.680203, 0.504172 },
{ 0.6274509803921569, 0.157851, 0.683765, 0.501686 },
{ 0.6313725490196078, 0.162016, 0.687316, 0.499129 },
{ 0.6352941176470588, 0.166383, 0.690856, 0.496502 },
{ 0.6392156862745098, 0.170948, 0.694384, 0.493803 },
{ 0.6431372549019608, 0.175707, 0.6979, 0.491033 },
{ 0.6470588235294118, 0.180653, 0.701402, 0.488189 },
{ 0.6509803921568628, 0.185783, 0.704891, 0.485273 },
{ 0.6549019607843137, 0.19109, 0.708366, 0.482284 },
{ 0.6588235294117647, 0.196571, 0.711827, 0.479221 },
{ 0.6627450980392157, 0.202219, 0.715272, 0.476084 },
{ 0.6666666666666666, 0.20803, 0.718701, 0.472873 },
{ 0.6705882352941176, 0.214, 0.722114, 0.469588 },
{ 0.6745098039215687, 0.220124, 0.725509, 0.466226 },
{ 0.6784313725490196, 0.226397, 0.728888, 0.462789 },
{ 0.6823529411764706, 0.232815, 0.732247, 0.459277 },
{ 0.6862745098039216, 0.239374, 0.735588, 0.455688 },
{ 0.6901960784313725, 0.24607, 0.73891, 0.452024 },
{ 0.6941176470588235, 0.252899, 0.742211, 0.448284 },
{ 0.6980392156862745, 0.259857, 0.745492, 0.444467 },
{ 0.7019607843137254, 0.266941, 0.748751, 0.440573 },
{ 0.7058823529411765, 0.274149, 0.751988, 0.436601 },
{ 0.7098039215686275, 0.281477, 0.755203, 0.432552 },
{ 0.7137254901960784, 0.288921, 0.758394, 0.428426 },
{ 0.7176470588235294, 0.296479, 0.761561, 0.424223 },
{ 0.7215686274509804, 0.304148, 0.764704, 0.419943 },
{ 0.7254901960784313, 0.311925, 0.767822, 0.415586 },
{ 0.7294117647058823, 0.319809, 0.770914, 0.411152 },
{ 0.7333333333333333, 0.327796, 0.77398, 0.40664 },
{ 0.7372549019607844, 0.335885, 0.777018, 0.402049 },
{ 0.7411764705882353, 0.344074, 0.780029, 0.397381 },
{ 0.7450980392156863, 0.35236, 0.783011, 0.392636 },
{ 0.7490196078431373, 0.360741, 0.785964, 0.387814 },
{ 0.7529411764705882, 0.369214, 0.788888, 0.382914 },
{ 0.7568627450980392, 0.377779, 0.791781, 0.377939 },
{ 0.7607843137254902, 0.386433, 0.794644, 0.372886 },
{ 0.7647058823529411, 0.395174, 0.797475, 0.367757 },
{ 0.7686274509803922, 0.404001, 0.800275, 0.362552 },
{ 0.7725490196078432, 0.412913, 0.803041, 0.357269 },
{ 0.7764705882352941, 0.421908, 0.805774, 0.35191 },
{ 0.7803921568627451, 0.430983, 0.808473, 0.346476 },
{ 0.7843137254901961, 0.440137, 0.811138, 0.340967 },
{ 0.788235294117647, 0.449368, 0.813768, 0.335384 },
{ 0.792156862745098, 0.458674, 0.816363, 0.329727 },
{ 0.796078431372549, 0.468053, 0.818921, 0.323998 },
{ 0.8, 0.477504, 0.821444, 0.318195 },
{ 0.803921568627451, 0.487026, 0.823929, 0.312321 },