From a3ea80f6fe9e3db5ad0c3600f94ee76b73598845 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 25 Aug 2025 00:17:01 -0400 Subject: [PATCH 01/12] Fix some doxygen warnings and add basic documentation pages. --- CMakeLists.txt | 1 + graph_c_binding/graph_c_binding.cpp | 2 +- graph_c_binding/graph_c_binding.h | 14 ++ graph_docs/compiling.dox | 213 ++++++++++++++++++ graph_docs/general.dox | 30 +++ graph_docs/main.dox | 28 +++ graph_driver/xrays.cpp | 2 + .../graph_fortran_binding.f90 | 11 +- graph_framework/commandline_parser.hpp | 2 +- graph_framework/cuda_context.hpp | 2 +- graph_framework/equilibrium.hpp | 16 +- graph_framework/jit.hpp | 12 +- graph_framework/node.hpp | 6 +- graph_framework/piecewise.hpp | 6 +- graph_framework/random.hpp | 2 + graph_framework/register.hpp | 7 +- graph_framework/solver.hpp | 12 +- graph_framework/special_functions.hpp | 4 +- graph_framework/timing.hpp | 5 +- graph_framework/trigonometry.hpp | 4 +- graph_tests/arithmetic_test.cpp | 2 +- graph_tests/backend_test.cpp | 2 +- graph_tests/c_binding_test.c | 2 +- graph_tests/dispersion_test.cpp | 9 +- graph_tests/efit_test.cpp | 2 +- graph_tests/erfi_test.cpp | 2 +- graph_tests/f_binding_test.f90 | 4 - graph_tests/jit_test.cpp | 5 +- graph_tests/math_test.cpp | 2 +- graph_tests/node_test.cpp | 2 +- graph_tests/physics_test.cpp | 2 +- graph_tests/piecewise_test.cpp | 2 +- graph_tests/random_test.cpp | 2 +- graph_tests/solver_test.cpp | 2 +- graph_tests/trigonometry_test.cpp | 2 +- graph_tests/vector_test.cpp | 2 +- utilities/bin.py | 6 +- utilities/fix_NaN.py | 6 +- utilities/get_includes.py | 6 +- 39 files changed, 377 insertions(+), 64 deletions(-) create mode 100644 graph_docs/compiling.dox create mode 100644 graph_docs/general.dox create mode 100644 graph_docs/main.dox diff --git a/CMakeLists.txt b/CMakeLists.txt index 27ba078..7cfabfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,6 +310,7 @@ if (DOXYGEN_FOUND) set (DOXYGEN_PROJECT_NAME "Graph Framework") set (DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/LLVM ${CMAKE_CURRENT_SOURCE_DIR}/build) set (DOXYGEN_GENERATE_TREEVIEW YES) + set (DOXYGEN_USE_MATHJAX YES) doxygen_add_docs (doc) endif () diff --git a/graph_c_binding/graph_c_binding.cpp b/graph_c_binding/graph_c_binding.cpp index 9f006a2..77ee4ca 100644 --- a/graph_c_binding/graph_c_binding.cpp +++ b/graph_c_binding/graph_c_binding.cpp @@ -1127,7 +1127,7 @@ extern "C" { /// /// @param[in] c The graph C context. /// @param[in] arg The left opperand. -/// @returns sin(arg) +/// @returns cos(arg) //------------------------------------------------------------------------------ graph_node graph_cos(STRUCT_TAG graph_c_context *c, graph_node arg) { diff --git a/graph_c_binding/graph_c_binding.h b/graph_c_binding/graph_c_binding.h index 6cfd258..5ed50aa 100644 --- a/graph_c_binding/graph_c_binding.h +++ b/graph_c_binding/graph_c_binding.h @@ -10,6 +10,16 @@ #include #include +//------------------------------------------------------------------------------ +/// @def START_GPU +/// Starts a Cocoa auto release pool when using the metal backend. No opt +/// otherwise. +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +/// @def END_GPU +/// Ends a Cocoa auto release pool when using the metal backend. No opt +/// otherwise. +//------------------------------------------------------------------------------ #ifdef USE_METAL #define START_GPU @autoreleasepool { #define END_GPU } @@ -18,6 +28,10 @@ #define END_GPU #endif +//------------------------------------------------------------------------------ +/// @def STRUCT_TAG +/// C++ mode needs to tag a graph_c_context as a struct. +//------------------------------------------------------------------------------ #ifdef __cplusplus extern "C" { #define STRUCT_TAG diff --git a/graph_docs/compiling.dox b/graph_docs/compiling.dox new file mode 100644 index 0000000..362f04d --- /dev/null +++ b/graph_docs/compiling.dox @@ -0,0 +1,213 @@ +/*! + * @page build_system Build System + * @brief Overview of the Cmake based build system for the graph_framework. + * @tableofcontents + * + * @section build_system_introduction Introduction + * This page details the cmake based build + * system. + * + * Documentation if divided into two parts. + * * User documention. + * * Developer documentation. + * + * @section build_system_user User Guide + * The following section is for users of framework. + * + * @subsection build_system_user_dependencies Dependencies + * The graph_framwork requires three requires external dependencies and one + * optional dependency. LLVM is another + * dependency that is used for generating CPU code. However this is + * automatically obtained via the build system. The graph_frame is written using + * the C++20 standard. The C interface using C17 and the fortran interface using + * Fortran 2008. + * + * @subsubsection build_system_user_dependencies_required Required + * * cmake version greater than 3.21. + * * NetCDF-C library. + * * Python 3 environment. + * + * @subsubsection build_system_user_dependencies_optional Optional + * * Doxygen for generating this documentation. + * + * @subsection build_system_clone Obtaining the code + * The framework code itself be obtained from the + * graph_framework + * Github repository. + * @code + git clone https://github.com/ORNL-Fusion/graph_framework.git + @endcode + * Source will be downloaded into a graph_framework directory + * unless a different directory is explicitly used. + * + * @subsection build_system_gen Generating the build system + * After the repository is cloned, create a build directory in the + * top level source directory and change into that directory. + * @code + mkdir build + cd build + @endcode + * There are two ways to run cmake. From the command line the build system can + * generated by using the cmake command with options set using the + * the -D option. As an exampole. + * @code + cmake -DOPTION_NAME=OPTION_VALUE ../ + @endcode + * Where ../ points to the source directory containing the top + * level CMakeLists.txt file. + * + * The recommended method is to use the interatice ccmake command + * instead. + * @code + ccmake ../ + @endcode + * Note options can still be set from the command line using the + * -D option. + * + * @subsubsection build_system_user_options Build system Options + * Initally, there will be no options. Along the botton, there are several + * command. Use the 'c' command to start the configuation process. Once + * configured several options will apear. During this process cmake is cloning + * the LLVM repository. So this step may take some time initally. Mode of the + * are various options for configuing LLVM and can be ignored. The important + * options are listed below. + * + * * CMAKE_BUILD_TYPE Switch between Release, Debug, MinSizeRel, RelWithDebInfo + * * USE_VERBOSE Show verbose information about compute kernels. + * * BUILD_C_BINDING Generate the C langauge interface. + * * BUILD_Fortran_BINDING Generate the Fortran language interface. + * * USE_METAL Enable the Metal backend (macOS only). + * * USE_CUDA Enable the Cuda backend (Linux only). + * * USE_HIP Enable the Hip backend (Linux only, Hip branch). + * * USE_SSH Use ssh for git instead of html. + * + * NOTE:macOS uses will need to change the default option for + * CMAKE_CXX_COMPILER to clang++. This is due to the way the + * build systems determines default include directories for system libraries. + * This can be accomplished using the advacned options using the t + * command or setting this via the command line. + * @code + cmake -DCMAKE_CXX_COMPILER=clang++ ../ + @endcode + * + * Every time an option is changed, or a new option is available, you need to + * use the configure c command for changes to take affect. Once all + * options are set, the a generate g options will appear. Using this + * option will build a make file. + * + * @subsubsection build_system_trouble_shooting Trouble Shooting. + * Some times, cmake will fail to locate the NetCDF library if it is not + * installed in a standard path. In these cases you can use the + * CMAKE_PREFIX_PATH to define the install location of the NetCDF + * library. For instance if the netcdf library is installed in + * /foo/bar/lib the prefix path should be set to /foo/bar. + * + * @subsection build_system_build Building the code. + * Once the build system is successfully generated a Makefile will appear. The + * code can be build using the + * @code + make + @endcode + * command. Note that due build system first starts by pulling the latest + * of LLVM. The build system then has to build LLVM first which can take a + * while. It is recommended to use a limited parallel build. + * @code + make -j10 + @endcode + * The -jnum_processes option determines number of parallel + * instances to run. The build products will be found in assocated build + * directories in the build directory. + * + * A list of individual components which can be build can be identified using + * @code + make -h + @endcode + * + * @subsection build_system_test Running unit tests. + * Units tests can be run using the command. + * @code + make test ARGS=-j10 + @endcode + * Like the parallel build the -jnum_processes option determines + * number of parallel instances to run. + * + * @section build_system_dev Developer Guide + * This section covers information for developers of the framework itself. + * + * @subsection build_system_macros Macro Definitions + * The build system defines some macros for defining targets, configuring debug + * options, and configuing external dependences. + * + * @subsubsection build_system_targets Tool targets. + * + *
+ * add_tool_target(target lang)\n\n + * Define a tool target.\n\n + * Parameters\n + * [in] target The name of the target.\n + * [in] lang File extention for the target (c, cpp, f90).\n\n + * Target assumes there is a source file defined as target.lang. For + * instance a C++ source file named foo.cpp is configures as + * @code + add_tool_target(foo cpp) + @endcode + * This will generate a build target called xfoo. + * + *
+ * add_test_target(target lang)\n\n + * Define a test target.\n\n + * Parameters\n + * [in] target The name of the target.\n + * [in] lang File extention for the target (c, cpp, f90).\n\n + * The aguments are the same as add_tool_target. This also adds the + * target as a unit test. + *
+ * + * @subsubsection build_system_sanitizer Sanatizer flags + * + *
+ * register_sanitizer_option(name)\n\n + * Register a sanitizer option.\n\n + * Parameters\n + * [in] name The name of the sanitizer flags.\n\n + * This add new for using the SANITIZE_NAME cmake option and + * add -fsanitize=name to the command line arguments. + *
+ * + * @subsubsection build_system_project Register an external project + * + *
+ * register_project(reg_name dir url default_tag sub_dir)\n\n + * Register an external project.\n\n + * Parameters\n + * [in] reg_name Name for the registered project.\n + * [in] dir Name directory to clone the project to.\n + * [in] url URL for the repository.\n + * [in] default_tag Default tag for to pull from.\n + * [in] sub_dir Subdirectory to locate the project source code.\n\n + * This function clones a external project into the directory defined by + * dir. This also adds a new build option for + * BUILD_TAG_DIR. The URL must have the format of + * @code + ${URL_PROTO}domain.com${URL_SEP}remining/url + @endcode + *
+ * + * @subsection build_system_debug Debugging + * In addition to the standard build options there are several debugging options + * that can be enabled. + * + * @subsubsection build_system_dev_options Build system Options + * * USE_PCH Use precomiled headers during computation. Most users should keep this on. + * * SAVE_KERNEL_SOURCE Option to dump the generated compute kernel source code to disk. + * * USE_INPUT_CACHE Option to cache registers for the kernel arguments. + * * USE_CONSTANT_CACHE Option to use registers to cache constant values otherwise constanst are inlined. + * * SHOW_USE_COUNT Generates information on the number of times a register is used. + * * USE_INDEX_CACHE Option to use registers to cache array indicies. + * * SANITIZE_ADDRESS Use address sanitizer debugging option. + * * SANITIZE_LEAK Use leak sanitizer debugging option. + * * SANITIZE_MEMORY Use memory sanitizer debugging option. + * * SANITIZE_THREAD Use thread sanitizer debugging option. + * * SANITIZE_UNDEFINED Use undefined sanitizer debugging option. + * * SANITIZE_FLOAT-DIVIDE-BY-ZERO Use float-divide-by-zero sanitizer debugging option. + */ diff --git a/graph_docs/general.dox b/graph_docs/general.dox new file mode 100644 index 0000000..85b0d97 --- /dev/null +++ b/graph_docs/general.dox @@ -0,0 +1,30 @@ +/*! + * @page general_concepts General Concepts + * @tableofcontents + * @section introduction Introduction + * This page documents general concepts of the graph_framework. + * + * @section general_concepts_definitions Definitions. + * * leaf_node A leaf on the graph. + * * graph A data stucture connecting leaf nodes. + * * reduce A tranformation of the graph to remove leaf_nodes. + * * auto differentiation A tranformation of the graph build derivatives. + * * compiler A tool for translating from one language to another. + * * JIT Just-in-time compile. + * * kernel A code function that runs on a batch of data. + * * pre_item A kernel to run before running the main kernels. + * * work_iten A instance of kernel. + * * converge_item A kernel that is run until a convergence test is met. + * * workflow A series of work items. + * * backend The device the kernel is run on. + * + * @section general_concepts_graph Graph + * The graph_framework operates by building tree structure of math operations. + * In tree form it is easy to traverse nodes in the graph. Take the example of + * equation of line. + * @f{equation}{y=mx + b@f} + * This equation consists of five leaf nodes. The ends of the tree are clasified + * as either variables @f$x@f$ or constants @f$m,b@f$. These leaf_nodes are + * connected by leaf nodes for multiply and additon operations. The ouptut + * @f$ y@f$ represents the entire graph of operations. + */ diff --git a/graph_docs/main.dox b/graph_docs/main.dox new file mode 100644 index 0000000..efdf8a2 --- /dev/null +++ b/graph_docs/main.dox @@ -0,0 +1,28 @@ +/*! + * @mainpage + * @tableofcontents + * @section introduction Introduction + * The graph_framework + * is a domain specific compiler for translating physics + * equations to optimized code that run a on a GPUs and CPUs. The domain + * specific aspect limits this to classes of problems where the same physics is + * applied to a ensemble. Eamples include RF Ray tracing, particle pushing, and + * field line following. In stead of + * + * Documentation is divided into three parts. + * * User documentation for the tools. + * * Framework user guides. + * * Frameowork developer guides. + * + * @section tools User guides for tools. + * + * @section framework_user Framework user guides. + * * @ref build_system "Compiling the framework." + * * @ref general_concepts "General concepts." + * * Tutorial + * + * @section framework_developer Framework developer quides. + * * @ref build_system "Build system." + * * Code structure + * * Adding new operations tutorial. + */ diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index ad2531e..6718c24 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -533,7 +533,9 @@ void trace_ray(const commandline::parser &cl, /// /// @tparam ABSORPTION_MODEL Absoption model to use. /// +/// @param[in] cl Parsed commandline. /// @param[in] kamp Wave number amplitude. +/// @param[in] omega Wave frequency. /// @param[in] kx Wave number in x direction. /// @param[in] ky Wave number in y direction. /// @param[in] kz Wave number in z direction. diff --git a/graph_fortran_binding/graph_fortran_binding.f90 b/graph_fortran_binding/graph_fortran_binding.f90 index bc539bc..4fa6423 100644 --- a/graph_fortran_binding/graph_fortran_binding.f90 +++ b/graph_fortran_binding/graph_fortran_binding.f90 @@ -994,6 +994,7 @@ !> @param[in,out] this @ref graph_context instance. !> @param[in] size Size of the data buffer. !> @param[in] symbol Symbol of the variable. +!> @returns A variable node. !------------------------------------------------------------------------------- FUNCTION graph_context_variable(this, size, symbol) @@ -1011,10 +1012,11 @@ END FUNCTION !------------------------------------------------------------------------------- -!> @brief Create variable node. +!> @brief Create a constant node. !> !> @param[in,out] this @ref graph_context instance. !> @param[in] value Size of the data buffer. +!> @returns A constant node. !------------------------------------------------------------------------------- FUNCTION graph_context_constant_real(this, value) @@ -1115,11 +1117,12 @@ END SUBROUTINE !------------------------------------------------------------------------------- -!> @brief Create variable node. +!> @brief Create constant node with complex values. !> !> @param[in,out] this @ref graph_context instance. !> @param[in] real_value The real component. !> @param[in] img_value The imaginary component. +!> @returns A constant node. !------------------------------------------------------------------------------- FUNCTION graph_context_constant_complex(this, real_value, img_value) @@ -1138,7 +1141,7 @@ END FUNCTION !------------------------------------------------------------------------------- -!> @brief Create variable node. +!> @brief Create pseudo variable node. !> !> @param[in,out] this @ref graph_context instance. !> @param[in] var The variable to set. @@ -1913,6 +1916,8 @@ !> @param[in] random_state Optional random state, can be NULL if not used. !> @param[in] name Name for the kernel. !> @param[in] num_particles Number of elements to operate on. +!> @param[in] tol Maximum tolarance to converge to. +!> @param[in] max_iter Maximum number of iterations for convergence. !------------------------------------------------------------------------------- SUBROUTINE graph_context_add_converge_item(this, inputs, outputs, & map_inputs, map_outputs, & diff --git a/graph_framework/commandline_parser.hpp b/graph_framework/commandline_parser.hpp index ed73c24..d400142 100644 --- a/graph_framework/commandline_parser.hpp +++ b/graph_framework/commandline_parser.hpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file commandline\_parser.hpp +/// @file commandline_parser.hpp /// @brief Parsing routines for the command line. //------------------------------------------------------------------------------ diff --git a/graph_framework/cuda_context.hpp b/graph_framework/cuda_context.hpp index e3c9ce0..63a1dd9 100644 --- a/graph_framework/cuda_context.hpp +++ b/graph_framework/cuda_context.hpp @@ -17,8 +17,8 @@ #include "random.hpp" +/// Maximum number of registers to use. #define MAX_REG 128 -#define MAX_CONSTANT_MEMORY namespace gpu { //------------------------------------------------------------------------------ diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index 9707d17..9929ad0 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -162,7 +162,7 @@ namespace equilibrium { /// /// The characteristic field is equilibrium dependent. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -376,7 +376,7 @@ namespace equilibrium { /// /// To avoid divide by zeros use the value of 1. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -500,7 +500,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -629,7 +629,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -757,7 +757,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -883,7 +883,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -1378,7 +1378,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf @@ -2151,7 +2151,7 @@ namespace equilibrium { /// /// Use the value at the y intercept. /// -/// @params[in] device_number Device to use. +/// @param[in] device_number Device to use. /// @returns The characteristic field. //------------------------------------------------------------------------------ virtual graph::shared_leaf diff --git a/graph_framework/jit.hpp b/graph_framework/jit.hpp index 410416a..10a2a99 100644 --- a/graph_framework/jit.hpp +++ b/graph_framework/jit.hpp @@ -19,6 +19,16 @@ #endif #include "cpu_context.hpp" +//------------------------------------------------------------------------------ +/// @def START_GPU +/// Starts a Cocoa auto release pool when using the metal backend. No opt +/// otherwise. +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +/// @def END_GPU +/// Ends a Cocoa auto release pool when using the metal backend. No opt +/// otherwise. +//------------------------------------------------------------------------------ #ifdef USE_METAL #define START_GPU @autoreleasepool { #define END_GPU } @@ -310,7 +320,7 @@ namespace jit { } //------------------------------------------------------------------------------ -/// @brief Get buffer frim the gpu\_context. +/// @brief Get buffer from the gpu_context. /// /// @param[in] node Node to get the gpu buffer for. //------------------------------------------------------------------------------ diff --git a/graph_framework/node.hpp b/graph_framework/node.hpp index 5b236d2..6c875ff 100644 --- a/graph_framework/node.hpp +++ b/graph_framework/node.hpp @@ -836,9 +836,9 @@ namespace graph { template class branch_node : public leaf_node { protected: -// Left branch of the tree. +/// Left branch of the tree. shared_leaf left; -// Right branch of the tree. +/// Right branch of the tree. shared_leaf right; public: @@ -960,7 +960,7 @@ namespace graph { template class triple_node : public branch_node { protected: -// Middle branch of the tree. +/// Middle branch of the tree. shared_leaf middle; public: diff --git a/graph_framework/piecewise.hpp b/graph_framework/piecewise.hpp index de735f4..7e44849 100644 --- a/graph_framework/piecewise.hpp +++ b/graph_framework/piecewise.hpp @@ -548,7 +548,7 @@ void compile_index(std::ostringstream &stream, }; //------------------------------------------------------------------------------ -/// @brief Define piecewise\_1D convience function. +/// @brief Define piecewise_1D convience function. /// /// @tparam T Base type of the calculation. /// @tparam SAFE_MATH Use safe math operations. @@ -557,7 +557,7 @@ void compile_index(std::ostringstream &stream, /// @param[in] x Argument. /// @param[in] scale Argument scale factor. /// @param[in] offset Argument offset factor. -/// @returns A reduced piecewise\_1D node. +/// @returns A reduced piecewise_1D node. //------------------------------------------------------------------------------ template shared_leaf piecewise_1D(const backend::buffer &d, @@ -1262,7 +1262,7 @@ void compile_index(std::ostringstream &stream, }; //------------------------------------------------------------------------------ -/// @brief Define piecewise\_2D convience function. +/// @brief Define piecewise_2D convience function. /// /// @tparam T Base type of the calculation. /// @tparam SAFE_MATH Use safe math operations. diff --git a/graph_framework/random.hpp b/graph_framework/random.hpp index 1d0cb88..41feb15 100644 --- a/graph_framework/random.hpp +++ b/graph_framework/random.hpp @@ -32,6 +32,7 @@ namespace graph { /// State index. uint16_t index; #ifdef USE_CUDA +/// Pading to aline the size of the struct for Cuda backends. uint16_t padding[3]; #endif }; @@ -39,6 +40,7 @@ namespace graph { //------------------------------------------------------------------------------ /// @brief Construct a constant node from a vector. /// +/// @param[in] size Number of random states. /// @param[in] seed Inital random seed. //------------------------------------------------------------------------------ random_state_node(const size_t size, diff --git a/graph_framework/register.hpp b/graph_framework/register.hpp index 2201451..8daaa20 100644 --- a/graph_framework/register.hpp +++ b/graph_framework/register.hpp @@ -227,17 +227,18 @@ namespace jit { } //------------------------------------------------------------------------------ -/// @brief Convert a leaf\_node pointer to a string. +/// @brief Convert a @ref graph::leaf_node pointer to a string. /// -/// This converts the point value into a string of format t\_######. Where t is +/// This converts the point value into a string of format t######. Where t is /// of type /// -# v Variable /// -# r Register +/// -# i Input /// /// @tparam NODE Node class type. /// /// @param[in] prefix Type prefix for the name. -/// @param[in] pointer Address of the @ref{leaf_node}. +/// @param[in] pointer Address of the @ref graph::leaf_node. /// @returns The pointer value as a string. //------------------------------------------------------------------------------ template diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index bc08407..de5210c 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -384,7 +384,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the x\_next. +/// @brief Print out the latex expression for the x_next. //------------------------------------------------------------------------------ void print_x_next() { x_next->to_latex(); @@ -392,7 +392,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the y\_next. +/// @brief Print out the latex expression for the y_next. //------------------------------------------------------------------------------ void print_y_next() { y_next->to_latex(); @@ -400,7 +400,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the z\_next. +/// @brief Print out the latex expression for the z_next. //------------------------------------------------------------------------------ void print_z_next() { z_next->to_latex(); @@ -408,7 +408,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the kx\_next. +/// @brief Print out the latex expression for the kx_next. //------------------------------------------------------------------------------ void print_kx_next() { kx_next->to_latex(); @@ -416,7 +416,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the ky\_next. +/// @brief Print out the latex expression for the ky_next. //------------------------------------------------------------------------------ void print_ky_next() { ky_next->to_latex(); @@ -424,7 +424,7 @@ namespace solver { } //------------------------------------------------------------------------------ -/// @brief Print out the latex expression for the kz\_next. +/// @brief Print out the latex expression for the kz_next. //------------------------------------------------------------------------------ void print_kz_next() { kz_next->to_latex(); diff --git a/graph_framework/special_functions.hpp b/graph_framework/special_functions.hpp index 72c0c86..318f9ae 100644 --- a/graph_framework/special_functions.hpp +++ b/graph_framework/special_functions.hpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file special\_functions.hpp +/// @file special_functions.hpp /// @brief Implimentations for special functions. /// /// Special functions are adapted from http://ab-initio.mit.edu/Faddeeva @@ -13,6 +13,7 @@ using namespace cuda::std; +/// Type alias for cuda complex types. template using complex_type = complex; @@ -26,6 +27,7 @@ using complex_type = complex; using namespace std; +/// Type alias for complex types. #if __cplusplus >= 202002L template #else diff --git a/graph_framework/timing.hpp b/graph_framework/timing.hpp index 565dad4..933a8a6 100644 --- a/graph_framework/timing.hpp +++ b/graph_framework/timing.hpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file tming.hpp +/// @file timing.hpp /// @brief Routines to time the ray execution. //------------------------------------------------------------------------------ @@ -60,6 +60,9 @@ namespace timeing { } }; +//------------------------------------------------------------------------------ +/// @brief A timing object that averages over multiple threads. +//------------------------------------------------------------------------------ class measure_diagnostic_threaded { private: /// Discription of what is being timed. diff --git a/graph_framework/trigonometry.hpp b/graph_framework/trigonometry.hpp index 74153b6..e68b8a7 100644 --- a/graph_framework/trigonometry.hpp +++ b/graph_framework/trigonometry.hpp @@ -36,7 +36,7 @@ namespace graph { public: //------------------------------------------------------------------------------ -/// @brief Construct a sine\_node node. +/// @brief Construct a sine_node node. /// /// @param[in] x Argument. //------------------------------------------------------------------------------ @@ -561,7 +561,7 @@ namespace graph { public: //------------------------------------------------------------------------------ -/// @brief Construct a arctan\_node node. +/// @brief Construct a arctan_node node. /// /// @param[in] x Argument. /// @param[in] y Argument. diff --git a/graph_tests/arithmetic_test.cpp b/graph_tests/arithmetic_test.cpp index 07278e7..422ea51 100644 --- a/graph_tests/arithmetic_test.cpp +++ b/graph_tests/arithmetic_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file arithmetic\_test.cpp +/// @file arithmetic_test.cpp /// @brief Tests for arithmetic nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/backend_test.cpp b/graph_tests/backend_test.cpp index 372c92f..50bbabd 100644 --- a/graph_tests/backend_test.cpp +++ b/graph_tests/backend_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file backend\_test.cpp +/// @file backend_test.cpp /// @brief Tests for the buffer backend. //------------------------------------------------------------------------------ diff --git a/graph_tests/c_binding_test.c b/graph_tests/c_binding_test.c index 56be54f..9af357f 100644 --- a/graph_tests/c_binding_test.c +++ b/graph_tests/c_binding_test.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file c_binding_test.cpp +/// @file c_binding_test.c /// @brief Tests for c bindings. //------------------------------------------------------------------------------ diff --git a/graph_tests/dispersion_test.cpp b/graph_tests/dispersion_test.cpp index 52fa7bc..eb8dde6 100644 --- a/graph_tests/dispersion_test.cpp +++ b/graph_tests/dispersion_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file dispersion\_test.cpp +/// @file dispersion_test.cpp /// @brief Tests for math nodes. //------------------------------------------------------------------------------ @@ -17,9 +17,10 @@ /// /// @tparam DISPERSION Class of dispersion function to use. /// -/// @param[in] tolarance Tolarance to solver the dispersion function to. -/// @param[in] omega Ray frequency. -/// @param[in] k_guess Inital guess for the wave number. +/// @param[in] tolarance Tolarance to solver the dispersion function to. +/// @param[in] omega Ray frequency. +/// @param[in] k_guess Inital guess for the wave number. +/// @param[in,out] eq The equilibrium. //------------------------------------------------------------------------------ template void test_solve(const typename DISPERSION::base tolarance, diff --git a/graph_tests/efit_test.cpp b/graph_tests/efit_test.cpp index 2b6d5c2..17fe05c 100644 --- a/graph_tests/efit_test.cpp +++ b/graph_tests/efit_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file efit\_test.cpp +/// @file efit_test.cpp /// @brief Tests for efit splines. //------------------------------------------------------------------------------ diff --git a/graph_tests/erfi_test.cpp b/graph_tests/erfi_test.cpp index 766091d..4cc5f9e 100644 --- a/graph_tests/erfi_test.cpp +++ b/graph_tests/erfi_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file erfi\_test.cpp +/// @file erfi_test.cpp /// @brief Tests for the buffer backend. //------------------------------------------------------------------------------ diff --git a/graph_tests/f_binding_test.f90 b/graph_tests/f_binding_test.f90 index 8fa992d..64f04ad 100644 --- a/graph_tests/f_binding_test.f90 +++ b/graph_tests/f_binding_test.f90 @@ -54,7 +54,6 @@ !------------------------------------------------------------------------------- !> @brief Run float tests. !> -!> @param[in] c_type Base type of the calculation. !> @param[in] use_safe_math Use safe math. !------------------------------------------------------------------------------- SUBROUTINE run_test_float(use_safe_math) @@ -227,7 +226,6 @@ !------------------------------------------------------------------------------- !> @brief Run double tests. !> -!> @param[in] c_type Base type of the calculation. !> @param[in] use_safe_math Use safe math. !------------------------------------------------------------------------------- SUBROUTINE run_test_double(use_safe_math) @@ -400,7 +398,6 @@ !------------------------------------------------------------------------------- !> @brief Run complex float tests. !> -!> @param[in] c_type Base type of the calculation. !> @param[in] use_safe_math Use safe math. !------------------------------------------------------------------------------- SUBROUTINE run_test_complex_float(use_safe_math) @@ -584,7 +581,6 @@ !------------------------------------------------------------------------------- !> @brief Run double tests. !> -!> @param[in] c_type Base type of the calculation. !> @param[in] use_safe_math Use safe math. !------------------------------------------------------------------------------- SUBROUTINE run_test_complex_double(use_safe_math) diff --git a/graph_tests/jit_test.cpp b/graph_tests/jit_test.cpp index 1f2eb2e..5d87822 100644 --- a/graph_tests/jit_test.cpp +++ b/graph_tests/jit_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file jit\_test.cpp +/// @file jit_test.cpp /// @brief Tests for the jit code. //------------------------------------------------------------------------------ @@ -329,7 +329,8 @@ template void run_math_tests() { /// /// @tparam DISPERSION_FUNCTION Class of dispersion function to use. /// -/// @param[in] eq Equilibrium for the dispersion function. +/// @param[in,out] eq Equilibrium for the dispersion function. +/// @param[in] tolarance The test tolarance for check results to. //------------------------------------------------------------------------------ template void run_dispersion_test(equilibrium::shared &eq, diff --git a/graph_tests/math_test.cpp b/graph_tests/math_test.cpp index c92272f..670423d 100644 --- a/graph_tests/math_test.cpp +++ b/graph_tests/math_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file math\_test.cpp +/// @file math_test.cpp /// @brief Tests for math nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/node_test.cpp b/graph_tests/node_test.cpp index 1d1470a..0a11aa9 100644 --- a/graph_tests/node_test.cpp +++ b/graph_tests/node_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file node\_test.cpp +/// @file node_test.cpp /// @brief Tests for the node interface. //------------------------------------------------------------------------------ diff --git a/graph_tests/physics_test.cpp b/graph_tests/physics_test.cpp index f8b6d55..3c6fe14 100644 --- a/graph_tests/physics_test.cpp +++ b/graph_tests/physics_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file physics\_test.cpp +/// @file physics_test.cpp /// @brief Tests for math nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/piecewise_test.cpp b/graph_tests/piecewise_test.cpp index d213a7f..a07e7ae 100644 --- a/graph_tests/piecewise_test.cpp +++ b/graph_tests/piecewise_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file piecewise\_test.cpp +/// @file piecewise_test.cpp /// @brief Tests for piecewise constants nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/random_test.cpp b/graph_tests/random_test.cpp index 346bc7b..e8ce1e8 100644 --- a/graph_tests/random_test.cpp +++ b/graph_tests/random_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file random\_test.cpp +/// @file random_test.cpp /// @brief Tests for random nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/solver_test.cpp b/graph_tests/solver_test.cpp index 9da2e4e..e213bbe 100644 --- a/graph_tests/solver_test.cpp +++ b/graph_tests/solver_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file solver\_test.cpp +/// @file solver_test.cpp /// @brief Tests for solvers. //------------------------------------------------------------------------------ diff --git a/graph_tests/trigonometry_test.cpp b/graph_tests/trigonometry_test.cpp index ca4d349..40ba93b 100644 --- a/graph_tests/trigonometry_test.cpp +++ b/graph_tests/trigonometry_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file trigonometry\_test.cpp +/// @file trigonometry_test.cpp /// @brief Tests for trig nodes. //------------------------------------------------------------------------------ diff --git a/graph_tests/vector_test.cpp b/graph_tests/vector_test.cpp index f116d76..184a28d 100644 --- a/graph_tests/vector_test.cpp +++ b/graph_tests/vector_test.cpp @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -/// @file vector\_test.cpp +/// @file vector_test.cpp /// @brief Tests for the vector interface. //------------------------------------------------------------------------------ diff --git a/utilities/bin.py b/utilities/bin.py index b0b0440..e339560 100644 --- a/utilities/bin.py +++ b/utilities/bin.py @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------- -## @file fix_NaN.py -## @brief Post processes result files. +## @file bin.py +## Post processes result files. #------------------------------------------------------------------------------- import netCDF4 @@ -13,7 +13,7 @@ import tensorflow ## Removes NaN's and noise spikes in the results. Also computes the power ## absorption and bins the power into a 2D grid. ## -## @param params[in] args Command line arguments. +## @param[in] args Command line arguments. #------------------------------------------------------------------------------- def main(**args): with netCDF4.Dataset('{}/bins.nc'.format(args['directory']), 'w') as bin_ref: diff --git a/utilities/fix_NaN.py b/utilities/fix_NaN.py index 01bd4b6..8206d86 100644 --- a/utilities/fix_NaN.py +++ b/utilities/fix_NaN.py @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------- ## @file fix_NaN.py -## @brief Post processes result files. +## Post processes result files to remove NaN values. #------------------------------------------------------------------------------- import netCDF4 @@ -13,7 +13,7 @@ import numpy ## Removes NaN's and noise spikes in the results. Also computes the power ## absorption and bins the power into a 2D grid. ## -## @param params[in] args Command line arguments. +## @param[in] args Command line arguments. #------------------------------------------------------------------------------- def main(**args): with netCDF4.Dataset('{}/bins.nc'.format(args['directory']), 'w') as bin_ref: @@ -68,6 +68,7 @@ def main(**args): ## * --max_z Maximum vertical bin. #------------------------------------------------------------------------------- if __name__ == '__main__': +## Argument parser object for command line arguments. command_line_parser = argparse.ArgumentParser() command_line_parser.add_argument('-d', @@ -134,6 +135,7 @@ if __name__ == '__main__': type=float, metavar='MAX_R') +## The parsed command line arguments. args = vars(command_line_parser.parse_args()) # Remove empty arguments diff --git a/utilities/get_includes.py b/utilities/get_includes.py index 25877ca..993183d 100644 --- a/utilities/get_includes.py +++ b/utilities/get_includes.py @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------- ## @file get_includes.py -## @brief Post processes result files. +## Get the needed include flags from the system compiler. #------------------------------------------------------------------------------- import argparse import subprocess @@ -8,7 +8,7 @@ import subprocess #------------------------------------------------------------------------------- ## @brief Parse the output to get the include directories. ## -## @param params[in] args Command line arguments. +## @param[in] args Command line arguments. #------------------------------------------------------------------------------- def main(**args): output = subprocess.run([args['compiler'], '-Wp,-v', '-x', 'c++', '/dev/null', '-fsyntax-only'], @@ -41,6 +41,7 @@ def main(**args): ## * --compiler Compiler command. #------------------------------------------------------------------------------- if __name__ == '__main__': +## Argument parser object for command line arguments. command_line_parser = argparse.ArgumentParser() command_line_parser.add_argument('-c', @@ -51,6 +52,7 @@ if __name__ == '__main__': help='Compiler command.', metavar='COMPILER') +## The parsed command line arguments. args = vars(command_line_parser.parse_args()) # Remove empty arguments -- GitLab From dd54fdaaf969d9d214bcb3f5b0e18849ece78d2c Mon Sep 17 00:00:00 2001 From: cianciosa Date: Tue, 26 Aug 2025 18:11:19 -0400 Subject: [PATCH 02/12] Add documentation for equilibria, dispersion functions, command line arguments, and a framework tutorial. --- CMakeLists.txt | 1 + graph_docs/Efit.png | Bin 0 -> 94560 bytes graph_docs/compiling.dox | 4 - graph_docs/general.dox | 96 +++++- graph_docs/line_graph.png | Bin 0 -> 9048 bytes graph_docs/line_graph_dydf1.png | Bin 0 -> 14655 bytes graph_docs/line_graph_dydf2.png | Bin 0 -> 17876 bytes graph_docs/line_graph_dydf_final.png | Bin 0 -> 26622 bytes graph_docs/line_graph_eval1.png | Bin 0 -> 10777 bytes graph_docs/line_graph_eval2.png | Bin 0 -> 10691 bytes graph_docs/line_graph_eval_final.png | Bin 0 -> 28717 bytes graph_docs/line_graph_reduce1.png | Bin 0 -> 7706 bytes graph_docs/line_graph_reduce_final.png | Bin 0 -> 23313 bytes graph_docs/main.dox | 20 +- graph_docs/tutorial.dox | 389 ++++++++++++++++++++++ graph_driver/xrays.cpp | 152 +++++++-- graph_framework.xcodeproj/project.pbxproj | 16 + graph_framework/absorption.hpp | 6 +- graph_framework/arithmetic.hpp | 78 ++--- graph_framework/cpu_context.hpp | 2 +- graph_framework/cuda_context.hpp | 2 +- graph_framework/dispersion.hpp | 113 +++++-- graph_framework/equilibrium.hpp | 184 +++++++++- graph_framework/jit.hpp | 2 +- graph_framework/math.hpp | 32 +- graph_framework/metal_context.hpp | 3 +- graph_framework/newton.hpp | 2 +- graph_framework/node.hpp | 42 +-- graph_framework/output.hpp | 6 +- graph_framework/piecewise.hpp | 12 +- graph_framework/random.hpp | 14 +- graph_framework/trigonometry.hpp | 24 +- graph_framework/vector.hpp | 30 +- graph_framework/workflow.hpp | 6 +- 34 files changed, 1019 insertions(+), 217 deletions(-) create mode 100755 graph_docs/Efit.png create mode 100644 graph_docs/line_graph.png create mode 100644 graph_docs/line_graph_dydf1.png create mode 100644 graph_docs/line_graph_dydf2.png create mode 100644 graph_docs/line_graph_dydf_final.png create mode 100644 graph_docs/line_graph_eval1.png create mode 100644 graph_docs/line_graph_eval2.png create mode 100644 graph_docs/line_graph_eval_final.png create mode 100644 graph_docs/line_graph_reduce1.png create mode 100644 graph_docs/line_graph_reduce_final.png create mode 100644 graph_docs/tutorial.dox diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cfabfa..58e67e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,6 +311,7 @@ if (DOXYGEN_FOUND) set (DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/LLVM ${CMAKE_CURRENT_SOURCE_DIR}/build) set (DOXYGEN_GENERATE_TREEVIEW YES) set (DOXYGEN_USE_MATHJAX YES) + set (DOXYGEN_IMAGE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/graph_docs) doxygen_add_docs (doc) endif () diff --git a/graph_docs/Efit.png b/graph_docs/Efit.png new file mode 100755 index 0000000000000000000000000000000000000000..f604af7258f22a95a28f2dd7c49b651a0119341e GIT binary patch literal 94560 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%0Dwy655D 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 ucmake based build * system. * - * Documentation if divided into two parts. - * * User documention. - * * Developer documentation. - * * @section build_system_user User Guide * The following section is for users of framework. * diff --git a/graph_docs/general.dox b/graph_docs/general.dox index 85b0d97..8e0d1b8 100644 --- a/graph_docs/general.dox +++ b/graph_docs/general.dox @@ -1,11 +1,11 @@ /*! * @page general_concepts General Concepts * @tableofcontents - * @section introduction Introduction + * @section general_concepts_introduction Introduction * This page documents general concepts of the graph_framework. * * @section general_concepts_definitions Definitions. - * * leaf_node A leaf on the graph. + * * node A leaf or branch on the graph tree. * * graph A data stucture connecting leaf nodes. * * reduce A tranformation of the graph to remove leaf_nodes. * * auto differentiation A tranformation of the graph build derivatives. @@ -17,14 +17,102 @@ * * converge_item A kernel that is run until a convergence test is met. * * workflow A series of work items. * * backend The device the kernel is run on. + * * recursion See definition of recursion. + * * safe math Run time checks to avoid off normal conditions. + * * API Application programming interface. + * * Host The place where kernels are launched from. + * * Device The device side where kernels are run. * * @section general_concepts_graph Graph * The graph_framework operates by building tree structure of math operations. * In tree form it is easy to traverse nodes in the graph. Take the example of - * equation of line. + * equation of a line. * @f{equation}{y=mx + b@f} * This equation consists of five leaf nodes. The ends of the tree are clasified * as either variables @f$x@f$ or constants @f$m,b@f$. These leaf_nodes are * connected by leaf nodes for multiply and additon operations. The ouptut - * @f$ y@f$ represents the entire graph of operations. + * @f$y@f$ represents the entire graph of operations. + * @image{} html line_graph.png "The graph stucture for y = mx + b." + * Evaluation of graphs start from the top most node in this case the @f$+@f$ + * operation. Evaluation of a node is not performed until all subnodes are + * evaluated starting with the left operand. Evaluation starts by recursively + * evaluating the left operands until the last leaf_node is reached @f$m@f$. + * @image{} html line_graph_eval1.png "" + * Once @f$m@f$ the result is returned ot the @f$+@f$ then the right operand is + * evaluated. + * @image{} html line_graph_eval2.png "" + * Evaluation is repeated until every node in the graph is evaluated. + * @image{} html line_graph_eval_final.png "" + * + * @section general_concepts_diff Auto Differentiation + * From the previous @ref general_concepts_graph "section", it was shown how + * graph can be evaluated. This same evaluation can be applied to build + * graphs of a function derivative. Lets say that we want to take the derivative + * of @f$\frac{\partial y}{\partial x}@f$. This is achieved by evaluating the + * until bottom left most leaf_node is reached. Then a new graph is build + * starting with @f$\frac{\partial m}{\partial x}=0@f$. Applying the first half + * of the chain rule we build a new graph for @f$0x@f$ + * @image{} html line_graph_dydf1.png "" + * Then we take the derivative of the right operand and apply the second half + * of the chain rule to build a new graph for @f$0x=0@f$. + * @image{} html line_graph_dydf2.png "" + * Evaluation is repeated recursively until the full graph has been evaluated. + * @image{} html line_graph_dydf_final.png "" + * + * @section general_concepts_reduction Reduction + * The final expression for @f$\frac{\partial y}{\partial x}@f$ contains many + * unnecessary nodes in the graph. Instead of building full graphs, we can + * simplify and eleminate node as we build them. For instance, when the + * expression @f$0x@f$ this create can be immediately reduced to a single node. + * @image{} html line_graph_reduce1.png "" + * Applying all possible reduction reduces the final expression to + * @f$\frac{\partial y}{\partial x}=m@f$. + * @image{} html line_graph_reduce_final.png "" + * By reducing graphs as they are build, we can eliminate nodes one by one. + * + * @section general_concepts_compile Compile + * Once graph expressions are build, they can be compiled to a compute kernel. + * Using the same recursive evaluation, we can visit each node of a graph and + * and create a line of kernel source code. There are three important parts for + * creating kernels, inputs, outputs, and maps. These three concepts define + * buffers on the compute device and how they are changed. Compute kernels can + * be genereted from multiple outputs and maps. + * + * @subsection general_concepts_compile_inputs Inputs + * Inputs are the varible nodes that define the graph. In the line example + * @f$\frac{\partial y}{\partial x}@f$, the input variable would be the node + * for @f$x@f$. Some graphs have no inputs. The graph for + * @f$\frac{\partial y}{\partial x}=m@f$ has eliminated all the variable nodes + * in the graph. + * + * @subsection general_concepts_compile_outputs Outputs + * Outputs are the ends of the nodes. These are the values we want to compute. + * Any node of a graph can be a potential output. For each out put a device + * buffer is generated to store the results of the evalutaion. For nodes that + * are not used as outputs, no buffers need to be created since those results + * are never stored. + * + * @subsection general_concepts_compile_maps Maps + * Maps enable the results of an output node to stored in an input node. This is + * use for a wide varity of steps. For instance take a gradient decent step. + * @f{equation}{y = y + \frac{\partial f}{\partial x}@f} + * In this case the output of the expression + * @f$y + \frac{\partial f}{\partial x}@f$ + * can be mapped to update @f$y@f$. + * + * @section general_concepts_workflow Workflows + * Sequences of kernels are evaluated in workflow. A workflow is defined from + * workitems which wrap a kernel call. + * + * @section general_concepts_safe_math Safe Math + * There are some conditions where mathematically, a graph should evaluate to + * normal number. However, when evaluted suing floating point precison, can lead + * to Inf or NaN. An example of this the + * @f$\exp\left(x\right)@f$ function. For large argument values, + * @f$\exp\left(x\right)@f$ overflows the maximum floating point precision and + * returns Inf. @f$\frac{1}{\exp\left(x\right)}@f$ should evaluate + * zero however, in floating point this becomes a NaN. Safe math avoids + * problems like this by checking for large argument values. But since these + * run time checks slow down kernel evaluation, most of the time safe math + * should be avoided. */ diff --git a/graph_docs/line_graph.png b/graph_docs/line_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f850d2c9a870541135d519c955b0b9567f24fc68 GIT binary patch literal 9048 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 A%m4rY literal 0 HcmV?d00001 diff --git a/graph_docs/line_graph_dydf2.png b/graph_docs/line_graph_dydf2.png new file mode 100644 index 0000000000000000000000000000000000000000..0f718a4eb3dbeab1f7fd6f31c39da6bc6f0047c7 GIT binary patch literal 17876 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 literal 0 HcmV?d00001 diff --git a/graph_docs/line_graph_dydf_final.png b/graph_docs/line_graph_dydf_final.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf1d52a26173b089a2094fc06c4fbfb38f080f4 GIT binary patch literal 26622 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

(P9QNKg=EZr*uqW;hN9xg4Y&`~D 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Ⓢb^TQ=n-6=R4`Xq1ZI~Lh=e3XC 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 literal 0 HcmV?d00001 diff --git a/graph_docs/line_graph_eval1.png b/graph_docs/line_graph_eval1.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ff29e7115267336a679b5b529b05e5a56fa4ab GIT binary patch literal 10777 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 literal 0 HcmV?d00001 diff --git a/graph_docs/line_graph_reduce_final.png b/graph_docs/line_graph_reduce_final.png new file mode 100644 index 0000000000000000000000000000000000000000..bec19e9907c31a0db97243d9e78eb48cc9c87f0d GIT binary patch literal 23313 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 + * directory. This playground is a preconfigured executable target which can be + * used to test out the API's of this framework. The playground starts with a + * blank main function. + * @code +#include "../graph_framework/jit.hpp" + +int main(int argc, const char * argv[]) { + START_GPU + (void)argc; + (void)argv; + +// Insert code here. No code should be commited to this file beyond this +// template. + + END_GPU +} + @endcode + * To start, create a template function above main and call that function from + * main. This will allow to play with different floating point types. For now we + * will start with a simple floating point type. + * @code +#include "../graph_framework/jit.hpp" + +template +void run_tutorial() { + +} + +int main(int argc, const char * argv[]) { + START_GPU + (void)argc; + (void)argv; + + run_tutorial (); + + END_GPU +} + @endcode + * Here @ref jit::float_scalar is a C++20 + * Concept for + * valid types of floating point types allowed by the framework. + * + * @section tutorial_basic Basic Nodes + * The graph_framework is built around applying the same equations to a large + * ensemble. Ensembles are defined from variables. All variables need to have + * same dimensionality. To create a variable we use one of the variable factory + * methods. For now we will build it without initalizing it. + * @code +template +void run_tutorial() { + auto x = graph::variable (1000, "x"); +} + @endcode + * Here we are creating a @ref graph::variable_node with the symbol @f$x@f$ + * which holds 1000 elements. The symbol is used to by the @f$\LaTeX@f$ renderer + * to use as a symbol place holder. Any graph can be rendered to latex by + * calling the @ref graph::leaf_node::to_latex method. + * @code +template +void run_tutorial() { + auto x = graph::variable (1000, "x"); + x->to_latex(); + std::cout << std::endl; +} + @endcode + * When compiling and running the code, this will print out the @f$\LaTeX@f$ + * code needed to generate the equation. By copy and pasting this into a + * @f$\LaTeX@f$ it produces the symbol @f$x@f$. Note that all nodes of a graph + * are wrapped in a + * std::shared_ptr. + * so all method are called using the -> operator. + * + * @subsection tutorial_constant Constant Nodes + * Next we want to define a constant. There are two method to define constants + * explicitly or implicitly. + * @code +template +void run_tutorial() { + auto x = graph::variable(1000, "x"); + +// Define explicit constant. + auto m = graph::constant (0.4); +// Define implicit constant. + const T b = 0.6; +} + @endcode + * An explicit @ref graph::constant_node is create for m while an + * impicit constant was defined for b. Node in the implicit case, the + * actual node for b is not created until we use it in an expression. + * + * @section tutorial_expression Basic Expressions + * Finally lets create our equation of a line @f$y=mx+b@f$ and generate the + * @f$\LaTeX@f$ expression for it. + * @code +template +void run_tutorial() { + auto x = graph::variable(1000, "x"); + +// Define explicit constant. + auto m = graph::constant (0.4); +// Define implicit constant. + const T b = 0.6; + +// Equation of a line + auto y = m*x + b; + y->to_latex(); + std::cout << std::endl; +} + @endcode + * Running this will generate the output \left(0.4 x+0.6\right) which + * renders to @f$\left(0.4 x+0.6\right)@f$. + * + * @subsection tutorial_derivatives Auto Differentiation + * Derivatives of nodes can be taken with respect to any explicit node or graph. + * As an example lets take the @f$\frac{\partial y}{\partial x}@f$ and render + * the expression to latex. + * @code +template +void run_tutorial() { + auto x = graph::variable(1000, "x"); + +// Define explicit constant. + auto m = graph::constant (0.4); +// Define implicit constant. + const T b = 0.6; + +// Equation of a line + auto y = m*x + b; + +// Auto differentiation. + auto dydx = y->df(x); + dydx->to_latex(); + std::cout << std::endl; +} + @endcode + * Here we take derivatives using the @ref graph::leaf_node::df method. We can + * also take several variation of this. + * @code +auto dydm = y->df(m); +auto dydy = y->df(y); +auto dydb = y->df(m*x); + @endcode + * The respective results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. + * + * @section tutorial_workflow Making workflow. + * In this section we will build workflow from these nodes we created. For + * simplicity we will decrease the number of elements in variable so we can set + * the values easier. First thing we do is create a @ref workflow::manager. + * @code +template +void run_tutorial() { + auto x = graph::variable(3, "x"); + +// Define explicit constant. + auto m = graph::constant (0.4); +// Define implicit constant. + const T b = 0.6; + +// Equation of a line + auto y = m*x + b; + +// Auto differentiation. + auto dydx = y->df(x); + +// Create a workflow manager. + workflow::manager work(0); +} + @endcode + * This creates a workflow for device 0. + * + * To create a kernal, we add a @ref workflow::work_item using the + * @ref workflow::manager::add_item method. + * @code +workflow::manager work(0); +work.add_item({ + graph::variable_cast(x) +}, { + y, dydx +}, {}, NULL, "my_first_kernel", 3); + @endcode + * Here we have created a kernel which computes the outputs of @f$y@f$ and + * @f$\frac{\partial y}{\partial x}@f$. The third and forth arguments are blank + * because there are no maps and we are not using random numbers. The last + * argument needs to match the dimensions of the inputs. Inputs need to be cast + * from generic @ref graph::leaf_nodes to the specific + * @ref graph::variable_node. + * + * To evaluate the kernel, we need to first compile it. Then set the values for + * @f$x@f$ and run the kernel. To see the results we can print the values of the + * nodes used. + * @code +x->set({1.0, 2.0, 3.0}); + +workflow::manager work(0); +work.add_item({ + graph::variable_cast(x) +}, { + y, dydx +}, {}, NULL, "my_first_kernel", 3); +work.compile(); + +work.run(); +work.print(0, {x, y, dydx}); +work.print(1, {x, y, dydx}); +work.print(2, {x, y, dydx}); + @endcode + * Running this we get the output + * @code +1 1 0.4 +2 1.4 0.4 +3 1.8 0.4 + @endcode + * + * At this point it's important to understand some things that need to be taken + * into account when working with devices. Note that we needed to set the value + * of @f$x@f$ before we create the kernel since that's when the device buffers + * are populated. If we move that to after the kernel is generated. + * @code +workflow::manager work(0); +work.add_item({ + graph::variable_cast(x) +}, { + y, dydx +}, {}, NULL, "my_first_kernel", 3); +work.compile(); + +x->set({1.0, 2.0, 3.0}); + +work.run(); +work.print(0, {x, y, dydx}); +work.print(1, {x, y, dydx}); +work.print(2, {x, y, dydx}); + @endcode + * We get the output + * @code +0 0.6 0.4 +0 0.6 0.4 +0 0.6 0.4 + @endcode + * showing that the device dose not have the updated values. To set values from + * the host. You need to explicity copy from a host buffer to a device buffer + * using the @ref workflow::manager::copy_to_device method. + * @code +work.copy_to_device(x, std::array ({1.0, 2.0, 3.0}).data()); + +work.run(); +work.print(0, {x, y, dydx}); +work.print(1, {x, y, dydx}); +work.print(2, {x, y, dydx}); + @endcode + * Restore the expected result. + * @code +1 1 0.4 +2 1.4 0.4 +3 1.8 0.4 + @endcode + * + * @subsection tutorial_workflow_iter Iteration + * In this section we are going to make use of maps to iterate a variable. I + * want to evaluate the value of @f$y@f$ and set it as the new value of @f$x@f$. + * We do this my modifying call to @ref workflow::manager::add_item to define + * a map. This generates a kernel where after @f$y@f$ is computed it is stored + * in the @f$x@f$ buffer. + * @code +x->set({1.0, 2.0, 3.0}); + +workflow::manager work(0); +work.add_item({ + graph::variable_cast(x) +}, {}, { + {y, graph::variable_cast(x)} +}, NULL, "iteration_kernel", 3); +work.compile(); + +for (size_t i = 0; i < 10; i++) { + work.run(); + work.print(1, {x}); +} + @endcode + * Running this code shows the value of x continously updating. + * @code +1.4 +1.16 +1.064 +1.0256 +1.01024 +1.0041 +1.00164 +1.00066 +1.00026 +1.0001 + @endcode + * + * @section tutorial_workflow_iter Newtons Method. + * In this tutorial we are going to show how we can put all these concepts + * together to impliment a newtons method. Newtons method if defined as + * @f{equation}{x = x - \frac{f\left(x\right)}{\frac{\partial}{\partial x}f\left(x\right)}@f} + * From the iteration example, it's step update can be handled by a simple map. + * However we need a measure for convergence. To do that we output the value of + * @f$f\left(x\right)@f$. Lets setup a test function. + * @code +template +void run_tutorial() { + auto x = graph::variable (3, "x"); + x->set({1.0, 2.0, 3.0}); + +// Define an objective function. + auto f = 0.2*x*x*x + 0.6*x*x + 0.4*x + 0.5; + +// Define a step update. + auto x_new = x - f/f->df(x); + +// Create a workflow manager. + workflow::manager work(0); + work.add_item({ + graph::variable_cast(x) + }, {f}, { + {x_new, graph::variable_cast(x)} + }, NULL, "newton_kernel", 3); + work.compile(); + + std::array result; + T max; + do { + work.run(); + work.copy_to_host(f, result.data()); + max = 0.0; + for (T &r : result) { + max = std::max(max, r*r); + } + std::cout << max << std::endl; + } while (max > 1.0E-10); + work.print(0, {x}); + work.print(1, {x}); + work.print(2, {x}); +} + @endcode + * Running shows the objective function and all three elements found the same + * root. + * @code +156.25 +14.2408 +1.47246 +... +5.30397e-06 +8.50397e-12 +3.03979e-15 +-2.6006 +-2.6006 +-2.6006 + @endcode + * + * However there are some things that are not optimial here. We are performing + * a reduction on the host side and transfer the entire array to the host. To + * improve this we can use a converge item instead. + * @code +// Create a workflow manager. +workflow::manager work(0); +work.add_converge_item({ + graph::variable_cast(x) +}, {f*f}, { + {x_new, graph::variable_cast(x)} +}, NULL, "newton_kernel", 3, 1.0E-14); +work.compile(); + +work.run(); +work.print(0, {x}); +work.print(1, {x}); +work.print(2, {x}); +} + @endcode + * We can achieve the same result in a single run call. The advantage here is + * the reduction is now performed on the device and only a scalar is copied to + * the host to test for convergence. + * @code +-2.6006 +-2.6006 +-2.6006 + @endcode + */ diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index 6718c24..b822a2b 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -45,7 +45,7 @@ std::normal_distribution> set_distribution(const std::complex /// @brief Initalize value. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] cl Parsed commandline. /// @param[in,out] var Variable to set. @@ -367,7 +367,7 @@ void run_dispersion(const commandline::parser &cl, /// @brief Make an equilibrum. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] cl Parsed commandline. //------------------------------------------------------------------------------ @@ -402,7 +402,7 @@ std::mt19937_64 make_engine(const commandline::parser &cl, /// @brief Trace the rays. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] cl Parsed commandline. /// @param[in] num_times Total number of time steps. @@ -588,7 +588,7 @@ void run_absorption(const commandline::parser &cl, /// @brief Calculate absorption. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] cl Parsed commandline. /// @param[in] num_times Total number of time steps. @@ -663,7 +663,7 @@ void calculate_power(const commandline::parser &cl, /// @brief Bin power. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] cl Parsed commandline. /// @param[in] num_times Total number of time steps. @@ -792,6 +792,90 @@ void bin_power(const commandline::parser &cl, total.print(); } +//------------------------------------------------------------------------------ +/// @page xrays_commandline xrays Command Line Arguments +/// @tableofcontents +/// +/// @section xrays_commandline_intro Introduction +/// This page documents the commandline arguments or the RF ray tracing code +/// xrays. All arguments take the form of +/// @code +/// xrays [--options] [--options=with_value] +/// @endcode +/// +/// @section xrays_commandline_args Command Options +/// +///
Command Values Discription +///
General Options +///
@code --help @endcode Display help text +///
@code --verbose @endcode Show verbose output about kernel information. +///
@code --print_expressions @endcode Render ray equations as @f$\LaTeX@f$ expressions. +///
@code --print @endcode Display a sample of ray progress to the screen. +///
@code --seed @endcode Use a fixed random seed. +///
Control Options +///
@code --num_times @endcode Positive Integer Total number of time steps to run. +///
@code --sub_steps @endcode Positive Integer Number of steps to run between outputs. +///
@code --num_rays @endcode Positive Integer Total number rays to run. +///
@code --endtime @endcode Positive Number Total time to trace the ray to. +///
Ray Initialization Options +///
@code --init_w_dist @endcode +/// * uniform +/// * normal Distribution function for wave frequency. +///
@code --init_w_mean @endcode Positive Number Mean value for the wave frequency distribution function. +///
@code --init_w_sigma @endcode Positive Number Standard deviation of for the wave frequency distribution function. +///
@code --init_kx_dist @endcode +/// * uniform +/// * normal Distribution function for wave number in the x direction. +///
@code --init_kx @endcode Solve for initial wave number in the x direction position. +///
@code --init_kx_mean @endcode Positive Number Mean value for the wave number in the x direction distribution function. +///
@code --init_kx_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. +///
@code --init_ky_dist @endcode +/// * uniform +/// * normal Distribution function for wave number in the y direction. +///
@code --init_ky @endcode Solve for initial wave number in the y direction position. +///
@code --init_ky_mean @endcode Positive Number Mean value for the wave number in the y direction distribution function. +///
@code --init_ky_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. +///
@code --init_kz_dist @endcode +/// * uniform +/// * normal Distribution function for wave number in the z direction. +///
@code --init_kz @endcode Solve for initial wave number in the z direction position. +///
@code --init_kz_mean @endcode Positive Number Mean value for the wave number in the z direction distribution function. +///
@code --init_kz_sigma @endcode Positive Number Standard deviation of for the wave number in the z direction distribution function. +///
@code --init_x_dist @endcode +/// * uniform +/// * normal Distribution function for ray x position. +///
@code --init_x_mean @endcode Positive Number Mean value for the ray x position distribution function. +///
@code --init_x_sigma @endcode Positive Number Standard deviation of for the ray x position distribution function. +///
@code --init_y_dist @endcode +/// * uniform +/// * normal Distribution function for ray y position. +///
@code --init_y_mean @endcode Positive Number Mean value for the ray y position distribution function. +///
@code --init_y_sigma @endcode Positive Number Standard deviation of for the ray y position distribution function. +///
@code --init_z_dist @endcode +/// * uniform +/// * normal Distribution function for ray z position. +///
@code --init_z_mean @endcode Positive Number Mean value for the ray z position distribution function. +///
@code --init_z_sigma @endcode Positive Number Standard deviation of for the ray z position distribution function. +///
@code --use_cyl_xy @endcode Use cylindical coordinates for x and y. +///
Ray Tracing Physics Options +///
@code --equilibrium @endcode +/// * efit +/// * vmec Equilibrium to use. +///
@code --dispersion @endcode +/// * simple +/// * bohm_gross +/// * ordinary_wave +/// * extra_ordinary_wave +/// * code_plasma Wave disperion function to trace rays from. +///
@code --absorption_model @endcode +/// * root_find +/// * weak_damping Power absoption model to use. +///
@code --solver @endcode +/// * split_simplextic +/// * rk2 +/// * rk4 +/// * adaptive_rk4 Method used to solve the equation. +///
//------------------------------------------------------------------------------ /// @brief Setup and parse commandline options. /// @@ -800,20 +884,20 @@ void bin_power(const commandline::parser &cl, //------------------------------------------------------------------------------ commandline::parser parse_commandline(int argc, const char * argv[]) { commandline::parser cl(argv[0]); - cl.add_option("verbose", false, "Show verbose output."); - cl.add_option("num_times", true, "Number of times."); - cl.add_option("sub_steps", true, "Number of substeps."); + cl.add_option("verbose", false, "Show verbose output about kernel information."); + cl.add_option("num_times", true, "Total number of time steps to run."); + cl.add_option("sub_steps", true, "Number of steps to run between outputs."); cl.add_option("num_rays", true, "Number of rays."); cl.add_option("endtime", true, "End time."); - cl.add_option("print_expressions", false, "Print out rays expressions."); + cl.add_option("print_expressions", false, "Render ray equations as LaTeX expressions."); cl.add_option("print", false, "Print sample rays to screen."); - cl.add_option("solver", true, "Solver method.", { + cl.add_option("solver", true, "Method used to solve the equation.", { "split_simplextic", "rk2", "rk4", "adaptive_rk4" }); - cl.add_option("dispersion", true, "Disperison method.", { + cl.add_option("dispersion", true, "Wave disperion function to trace rays from.", { "simple", "bohm_gross", "ordinary_wave", @@ -825,51 +909,51 @@ commandline::parser parse_commandline(int argc, const char * argv[]) { "vmec" }); cl.add_option("equilibrium_file", true, "File to read the equilibrum from."); - cl.add_option("init_w_dist", true, "Inital omega distribution.", { + cl.add_option("init_w_dist", true, "Distribution function for wave frequency.", { "uniform", "normal" }); - cl.add_option("init_w_mean", true, "Inital omega mean"); - cl.add_option("init_w_sigma", true, "Inital omega sigma"); - cl.add_option("init_kx_dist", true, "Inital kx distribution.", { + cl.add_option("init_w_mean", true, "Mean value for the wave frequency distribution function."); + cl.add_option("init_w_sigma", true, "Standard deviation of for the wave frequency distribution function."); + cl.add_option("init_kx_dist", true, "Distribution function for wave number in the x direction.", { "uniform", "normal" }); - cl.add_option("init_kx", false, "Initalize kx"); - cl.add_option("init_kx_mean", true, "Inital kx mean"); - cl.add_option("init_kx_sigma", true, "Inital kx sigma"); - cl.add_option("init_ky_dist", true, "Inital ky distribution.", { + cl.add_option("init_kx", false, "Solve for initial wave number in the x direction position."); + cl.add_option("init_kx_mean", true, "Mean value for the wave number in the x direction distribution function."); + cl.add_option("init_kx_sigma", true, "Standard deviation of for the wave number in the x direction distribution function."); + cl.add_option("init_ky_dist", true, "Distribution function for wave number in the y direction.", { "uniform", "normal" }); - cl.add_option("init_ky", false, "Initalize ky"); - cl.add_option("init_ky_mean", true, "Inital ky mean"); - cl.add_option("init_ky_sigma", true, "Inital ky sigma"); + cl.add_option("init_ky", false, "Solve for initial wave number in the y direction position."); + cl.add_option("init_ky_mean", true, "Mean value for the wave number in they direction distribution function."); + cl.add_option("init_ky_sigma", true, "Standard deviation of for the wave number in the y direction distribution function."); cl.add_option("init_kz_dist", true, "Inital kz distribution.", { "uniform", "normal" }); - cl.add_option("init_kz", false, "Initalize kz"); - cl.add_option("init_kz_mean", true, "Inital kz mean"); - cl.add_option("init_kz_sigma", true, "Inital kz sigma"); - cl.add_option("init_x_dist", true, "Inital x distribution.", { + cl.add_option("init_kz", false, "Distribution function for wave number in the z direction."); + cl.add_option("init_kz_mean", true, "Solve for initial wave number in the z direction position."); + cl.add_option("init_kz_sigma", true, "Standard deviation of for the wave number in the z direction distribution function."); + cl.add_option("init_x_dist", true, "Distribution function for ray x position.", { "uniform", "normal" }); - cl.add_option("init_x_mean", true, "Inital x mean"); - cl.add_option("init_x_sigma", true, "Inital x sigma"); - cl.add_option("init_y_dist", true, "Inital y distribution.", { + cl.add_option("init_x_mean", true, "Mean value for the ray x position distribution function."); + cl.add_option("init_x_sigma", true, "Standard deviation of for the ray x position distribution function."); + cl.add_option("init_y_dist", true, "Distribution function for ray y position.", { "uniform", "normal" }); - cl.add_option("init_y_mean", true, "Inital y mean"); - cl.add_option("init_y_sigma", true, "Inital y sigma"); - cl.add_option("init_z_dist", true, "Inital z distribution.", { + cl.add_option("init_y_mean", true, "Mean value for the ray y position distribution function."); + cl.add_option("init_y_sigma", true, "Standard deviation of for the ray y position distribution function."); + cl.add_option("init_z_dist", true, "Distribution function for ray z position.", { "uniform", "normal" }); - cl.add_option("init_z_mean", true, "Inital z mean"); - cl.add_option("init_z_sigma", true, "Inital z sigma"); + cl.add_option("init_z_mean", true, "Mean value for the ray z position distribution function."); + cl.add_option("init_z_sigma", true, "Standard deviation of for the ray z position distribution function."); cl.add_option("use_cyl_xy", false, "Use cylindical coordinates for x and y."); cl.add_option("absorption_model", true, "Power absoption model to use.", { "root_find", diff --git a/graph_framework.xcodeproj/project.pbxproj b/graph_framework.xcodeproj/project.pbxproj index 593bf91..7fc9d54 100644 --- a/graph_framework.xcodeproj/project.pbxproj +++ b/graph_framework.xcodeproj/project.pbxproj @@ -355,6 +355,10 @@ C73BBE7D29F816E60027BB7F /* piecewise_test.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; path = piecewise_test.cpp; sourceTree = ""; }; C73BBE9629F8669F0027BB7F /* newton.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = newton.hpp; sourceTree = ""; }; C74DF4572AA8BC7300319113 /* graph_benchmark */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = graph_benchmark; sourceTree = BUILT_PRODUCTS_DIR; }; + C75C42912E5CA60B00B0950B /* compiling.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = compiling.dox; sourceTree = ""; }; + C75C42922E5CA60B00B0950B /* general.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = general.dox; sourceTree = ""; }; + C75C42932E5CA60B00B0950B /* main.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.dox; sourceTree = ""; }; + C75C42952E5CC80B00B0950B /* tutorial.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = tutorial.dox; sourceTree = ""; }; C760B1AB2BC6D760001737A3 /* get_includes.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = get_includes.py; sourceTree = ""; }; C7678FBD2B45C2850025F37E /* bin.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = bin.py; sourceTree = ""; }; C77E6DF522DD64E700469621 /* trigonometry.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = trigonometry.hpp; sourceTree = ""; }; @@ -608,6 +612,17 @@ path = graph_benchmark; sourceTree = ""; }; + C75C42942E5CA60B00B0950B /* graph_docs */ = { + isa = PBXGroup; + children = ( + C75C42912E5CA60B00B0950B /* compiling.dox */, + C75C42922E5CA60B00B0950B /* general.dox */, + C75C42932E5CA60B00B0950B /* main.dox */, + C75C42952E5CC80B00B0950B /* tutorial.dox */, + ); + path = graph_docs; + sourceTree = ""; + }; C78F3D892DC122B1002E3D94 /* graph_korc */ = { isa = PBXGroup; children = ( @@ -629,6 +644,7 @@ C74DF4582AA8BC7300319113 /* graph_benchmark */, C736E6B02C9B52CA00AAE3C0 /* graph_playground */, C78F3D892DC122B1002E3D94 /* graph_korc */, + C75C42942E5CA60B00B0950B /* graph_docs */, C7167B212AC5CE8500E03131 /* utilities */, C717CB8C2A02E361008FBDD8 /* cmake */, C79141A722DA9BF200E0BA0D /* Products */, diff --git a/graph_framework/absorption.hpp b/graph_framework/absorption.hpp index bb9a416..5dca67d 100644 --- a/graph_framework/absorption.hpp +++ b/graph_framework/absorption.hpp @@ -21,7 +21,7 @@ namespace absorption { /// @brief Base class for absoption models. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class method { @@ -43,7 +43,7 @@ namespace absorption { /// @brief Class interface for the root finder. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class root_finder : public method { @@ -232,7 +232,7 @@ namespace absorption { /// @brief Class interface weak damping approximation. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class weak_damping : public method { diff --git a/graph_framework/arithmetic.hpp b/graph_framework/arithmetic.hpp index 51f0d90..7d0d6d3 100644 --- a/graph_framework/arithmetic.hpp +++ b/graph_framework/arithmetic.hpp @@ -15,7 +15,7 @@ namespace graph { /// @brief Check if nodes are constant combineable. /// /// @tparam T Base type of the nodes. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Opperand A /// @param[in] b Opperand B @@ -43,7 +43,7 @@ namespace graph { /// @brief Check if the constants are promotable. /// /// @tparam T Base type of the nodes. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Opperand A /// @param[in] b Opperand B @@ -65,7 +65,7 @@ namespace graph { /// @brief Check if the variable is combinable. /// /// @tparam T Base type of the nodes. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Opperand A /// @param[in] b Opperand B @@ -81,7 +81,7 @@ namespace graph { /// @brief Check if the variable is variable is promotable. /// /// @tparam T Base type of the nodes. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Opperand A /// @param[in] b Opperand B @@ -101,7 +101,7 @@ namespace graph { /// @brief Check if the exponent is greater than the other. /// /// @tparam T Base type of the nodes. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Opperand A /// @param[in] b Opperand B @@ -126,7 +126,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class add_node final : public branch_node { @@ -731,7 +731,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -765,7 +765,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -784,7 +784,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -803,7 +803,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -822,7 +822,7 @@ namespace graph { /// @brief Cast to a add node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -841,7 +841,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class subtract_node final : public branch_node { @@ -1553,7 +1553,7 @@ namespace graph { /// @brief Build subtract node from two leaves. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1588,7 +1588,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1608,7 +1608,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1628,7 +1628,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1647,7 +1647,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] a Argument to negate. /// @returns -1.0*a @@ -1665,7 +1665,7 @@ namespace graph { /// @brief Cast to a subtract node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -1682,7 +1682,7 @@ namespace graph { /// @brief A multiplcation node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class multiply_node final : public branch_node { @@ -2623,7 +2623,7 @@ namespace graph { /// @brief Build multiply node from two leaves. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -2657,7 +2657,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -2676,7 +2676,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -2695,7 +2695,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -2714,7 +2714,7 @@ namespace graph { /// @brief Cast to a multiply node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -2731,7 +2731,7 @@ namespace graph { /// @brief A division node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class divide_node final : public branch_node { @@ -3588,7 +3588,7 @@ namespace graph { /// @brief Build divide node from two leaves. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -3622,7 +3622,7 @@ namespace graph { /// classes. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -3641,7 +3641,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -3660,7 +3660,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -3679,7 +3679,7 @@ namespace graph { /// @brief Cast to a divide node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -3698,7 +3698,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class fma_node final : public triple_node { @@ -5192,7 +5192,7 @@ namespace graph { /// @brief Build fused multiply add node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5229,7 +5229,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5250,7 +5250,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam M Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5271,7 +5271,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5293,7 +5293,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. /// @tparam M Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5316,7 +5316,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam M Float type for the constant. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5339,7 +5339,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] m Middle branch. @@ -5361,7 +5361,7 @@ namespace graph { /// @brief Cast to a fma node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. diff --git a/graph_framework/cpu_context.hpp b/graph_framework/cpu_context.hpp index 37b0e29..05024f9 100644 --- a/graph_framework/cpu_context.hpp +++ b/graph_framework/cpu_context.hpp @@ -76,7 +76,7 @@ namespace gpu { /// @brief Class representing a cpu context. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class cpu_context { diff --git a/graph_framework/cuda_context.hpp b/graph_framework/cuda_context.hpp index 63a1dd9..e2f31ac 100644 --- a/graph_framework/cuda_context.hpp +++ b/graph_framework/cuda_context.hpp @@ -67,7 +67,7 @@ namespace gpu { /// @brief Class representing a cuda gpu context. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class cuda_context { diff --git a/graph_framework/dispersion.hpp b/graph_framework/dispersion.hpp index 40ecdab..c28ea4a 100644 --- a/graph_framework/dispersion.hpp +++ b/graph_framework/dispersion.hpp @@ -4,6 +4,81 @@ /// /// Defines a dispersion function. //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +/// @page dispersion_function Dispersion Functions +/// @tableofcontents +/// +/// @section dispersion_function_intro Introduction +/// This page documents the types of dispersion functions available. As an +/// a ray moves through the plasma it must remain a solution of these +/// functions. For a fixed wave frequency @f$\omega @f$, the dispersion +/// function dictates how the wave number @f$\vec{k}@f$ and ray trajectory +/// @f$\vec{x}@f$ interact. +/// +/// +///
Symbol definitions
Symbol Unit Description +///
@f$c @f$ @f$\frac{m}{s}@f$Speed of light. +///
@f$m_{e}@f$ @f$kg @f$ Electron mass +///
@f$t_{e}@f$ @f$K @f$ Electron temperature +///
@f$n_{e}@f$ @f$m^{-3}@f$ Electron Denisty +///
@f$q @f$ @f$C @f$ Fundamental Charge +///
@f$\vec{B}@f$ @f$T @f$ Magnetic field +///
@f$\epsilon_{0}@f$@f$\frac{F}{m}@f$Vacuum permittivity +///
@f$k_{B}@f$ @f$\frac{J}{K}@f$Boltzmann constant +///
@f$\omega_{pe}@f$ @f$s^{-1}@f$ Electron Plasma Frequency @f$\omega_{pe}=\frac{n_{e}q^{2}}{\epsilon_{0}m_{e}c}@f$ +///
@f$\omega_{ce}@f$ @f$s^{-1}@f$ Electron Cyclotron Frequency @f$\omega_{ce}=\frac{q\left|\vec{B}\right|}{m_{e}}@f$ +///
@f$\omega_{h} @f$s^{-1}@f$ Upper Hybrid Frequency @f$\omega_{h}^{s}=\omega_{pe}^{2}+\omega_{ce}^{2}@f$ +///
@f$v_{th}@f$ @f$\frac{m}{s}@f$Thermal velocity @f$v_{th}=\sqrt{\frac{k_{B}t_{e}}{m_{e}}}@f$ +///
@f$\vec{n}@f$ @f$1 @f$ @f$n=\frac{\vec{k}c}{\omega}@f$ +///
+/// +/// @section dispersion_function_normal Normalization +/// The dispersion functions use normalized quantities for frequncy @f$\omega @f$ and +/// time @f$t @f$. These are scaled to the speed of light @f$c @f$. +/// +/// +///
Disperion function units and normalizations
Symbol Real Unit Modified Modified UnitDescription +///
@f$\omega @f$ @f$s^{-1}@f$ @f$\omega'=\frac{\omega}{c}@f$ @f$m^{-1}@f$ Wave frequency +///
@f$\vec{k}@f$ @f$m^{-1}@f$ @f$\vec{k}@f$ @f$m^{-1}@f$ Wave number +///
@f$t @f$ @f$s @f$ @f$t'=tc @f$ @f$m @f$ Time +///
@f$\vec{x}@f$ @f$m @f$ @f$\vec{x}@f$ @f$m @f$ Postion +///
@f$v_{p}=\frac{\omega}{k}@f$ @f$\frac{m}{s}@f$@f$v'_{p}=\frac{\omega'}{k}@f$ @f$1 @f$ Phase velocity +///
@f$v_{g}=\frac{\partial\omega}{\partial k}@f$@f$\frac{m}{s}@f$@f$v'_{g}=\frac{\partial\omega'}{\partial k}@f$@f$1 @f$ Group velocity +///
+/// +/// @section dispersion_function_avail Available Dispersion Functions +/// The following dispersion functions are available in xrays. +/// +/// @subsection dispersion_function_simple Simple +/// This disperison function represents a wave in a vacuum. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\frac{\vec{k}\cdot\vec{k}}{\omega^{2}}-1\equiv 0 @f} +/// It has no resonances or cutoffs. +/// +/// @subsection dispersion_function_bohm_gross Bohm Gross +/// This dispersion function now accounts for how occilations in the plasma +/// propagate. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\omega_{pe}+\frac{3}{2}\vec{k}\cdot\vec{k}v^{2}_{th}-\omega^{2}\equiv 0 @f} +/// It has no resonances or cutoffs. But @f$v_{g}@f$ can never exceed @f$v_{th}@f$. +/// +/// @subsection dispersion_function_ordinary_wave Ordinary Wave +/// This disperison function represents a wave with a +/// @f$\vec{E}_{1}||\vec{B}_{0}@f$. That means the electric field occilates +/// parallel to the magnetic field. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega^{2}_{pe}}{\omega^{2}}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} +/// This wave is cut off below @f$\omega_{pe}@f$. +/// +/// @subsection dispersion_function_extra_ordinary_wave Extra Ordinary Wave +/// This disperison function represents a wave in a vaccume. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega_{pe}^2}{\omega^{2}}\frac{\omega^{2}-\omega_{pe}^2}{\omega^{2}-\omega_{h}^2}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} +/// This mode has +/// It has no resonances or cutoffs. +/// +/// @subsection dispersion_function_cold_plasma Cold Plasma +/// This disperison function represents a wave in a vaccume. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\equiv 0 @f} +/// It has no resonances or cutoffs. +/// +//------------------------------------------------------------------------------ #ifndef dispersion_h #define dispersion_h @@ -19,7 +94,7 @@ namespace dispersion { /// @brief Class interface to build dispersion relation functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class z_function { @@ -43,7 +118,7 @@ namespace dispersion { /// @brief Class interface to build dispersion relation functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class z_power_series final : public z_function { @@ -70,7 +145,7 @@ namespace dispersion { /// @brief Class interface to build dispersion relation functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class z_erfi final : public z_function { @@ -99,7 +174,7 @@ namespace dispersion { /// @brief Build plasma fequency expression. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] n Density. /// @param[in] q Species charge. @@ -122,7 +197,7 @@ namespace dispersion { /// @brief Build cyclotron fequency expression. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] q Species charge. /// @param[in] b Magnetic field. @@ -146,7 +221,7 @@ namespace dispersion { /// @brief Interface for dispersion functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class dispersion_function { @@ -185,7 +260,7 @@ namespace dispersion { /// @brief Stiff dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class stiff final : public dispersion_function { @@ -240,7 +315,7 @@ namespace dispersion { /// @brief Simple dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class simple final : public dispersion_function { @@ -282,7 +357,7 @@ namespace dispersion { /// @brief Physics /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class physics : public dispersion_function { @@ -304,7 +379,7 @@ namespace dispersion { /// @brief Bohm-Gross dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class bohm_gross final : public physics { @@ -374,7 +449,7 @@ namespace dispersion { /// @brief Light Wave dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class light_wave final : public physics { @@ -433,7 +508,7 @@ namespace dispersion { /// @brief Ion wave dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class acoustic_wave final : public physics { @@ -497,7 +572,7 @@ namespace dispersion { /// @brief Guassian Well dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class guassian_well final : public dispersion_function { @@ -539,7 +614,7 @@ namespace dispersion { /// @brief Electrostatic ion cyclotron wave dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class ion_cyclotron final : public physics { @@ -608,7 +683,7 @@ namespace dispersion { /// @brief Ordinary wave dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class ordinary_wave final : public physics { @@ -667,7 +742,7 @@ namespace dispersion { /// @brief Extra ordinary wave dispersion function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class extra_ordinary_wave final : public physics { @@ -739,7 +814,7 @@ namespace dispersion { /// @brief Cold Plasma Disperison function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class cold_plasma : public physics { @@ -859,7 +934,7 @@ namespace dispersion { /// @brief Cold Plasma expansion disperison function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class cold_plasma_expansion : public physics { @@ -1062,7 +1137,7 @@ namespace dispersion { /// /// @tparam T Base type of the calculation. /// @tparam Z Z function class. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class hot_plasma_expansion final : public physics { diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index 9929ad0..1419ab9 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -4,6 +4,154 @@ /// /// Defined the interfaces to access plasma equilibrium. //------------------------------------------------------------------------------ +/// @page equilibrum_models Equilibrium Models +/// @tableofcontents +/// +/// @section equilibrum_models_intro Introduction +/// This page documents the types and formatting of the equilibrium models. +/// xrays currently supports two equilibrium models. +/// * EFIT Are 2D axisymetric equilibria relevant to tokamak devices. +/// * VMEC Are 3D nested flux surface equulibria relevant for stellarator devices. +/// This documentation assumes the user has some familiarity with EFIT or VMEC +/// and focuses instead how quanties from these are formatted. +/// +/// @section equilibrum_splines Spline Formatting +/// The equilibrium models used in this section make use of Cubic and Bicubic +/// splines. +/// +/// @subsection equilibrum_splines_1D Cubic Splines +/// Cubic splines are 1D interpolation functions that consisting of 4 coeffient +/// arrays. They take the form of +/// @f{equation}{y\left(x\right)=C_{0} + C_{1}x + C_{2}x^2 + C_{3}x^2@f} +/// where @f$x@f$ is a normalized radial index. Cubic splines coefficients can +/// be calculated using +/// Linear Solvers +/// However, to avoid needing account for index offsets, index offsets are pre +/// computed into the spline coefficents. +/// @f{equation}{C'^{i}_{0}=C^{i}_{0} - C^{i}_{1}i + C^{i}_{2}i^2 - C^{i}_{3}i^3@f} +/// @f{equation}{C'^{i}_{1}=C^{i}_{1} -2C^{i}_{2}i + 3C^{i}_{3}i^2@f} +/// @f{equation}{C'^{i}_{2}=C^{i}_{2} - 3C^{i}_{3}i@f} +/// @f{equation}{C'^{i}_{3}=C^{i}_{3}@f} +/// Where @f$i@f$ is the index of the coeffient array. This allows to normalize +/// the spline argument @f$x@f$ so that it can both index the array and +/// evaluate the spline. +/// @f{equation}{x = \frac{x_{real} - x_{min}}{dx}@f} +/// Rounding down the value of @f$x@f$ gives the correct coefficient index. +/// +/// @subsection equilibrum_splines_2D Bicubic Splines +/// Bicubic Splines are computed in a simular way instead they consist of a +/// total of 16 coeffients. These represent 4 spline functions in one +/// dimension which interpolate 4 coeffient values for the other dimension. +/// Like the 1D splines, 2D spline coeffients are normalized to the spline +/// arguments can be used as normalized indices. +/// @f{equation}{C'^{ij}_{00}=C^{ij}_{00}-C^{ij}_{01}j+C^{ij}_{02}j^{2}-C^{ij}_{03}j^{3}-C^{ij}_{10}i+C^{ij}_{11}ij-C^{ij}_{12}ij^{2}+C^{ij}_{13}ij^{3}+C^{ij}_{20}i^{2}-C^{ij}_{21}i^{2}j+C^{ij}_{22}i^{2}j^{2}-C^{ij}_{23}i^{2}j^{3}-C^{ij}_{30}i^{3}+C^{ij}_{31}i^{3}j-C^{ij}_{32}i^{3}j^{2}+C^{ij}_{33}i^{3}j^{3}j@f} +/// @f{equation}{C'^{ij}_{01}=C^{ij}_{01}-2C^{ij}_{02}j+3C^{ij}_{03}j^{2}-C^{ij}_{11}i+2C^{ij}_{12}ij-3C^{ij}_{13}ij^{2}+C^{ij}_{21}i^{2}-2C^{ij}_{22}i^{2}j+3C^{ij}_{23}i^{2}j^{2}-C^{ij}_{31}i^{3}+2C^{ij}_{32}i^{3}j-3C^{ij}_{33}i^{3}j^{2}@f} +/// @f{equation}{C'^{ij}_{02}=C^{ij}_{02}-3C^{ij}_{03}j-C^{ij}_{12}i+3C^{ij}_{13}ij+C^{22}i^{2}-3C^{ij}_{23}i^{2}j-C^{ij}_{32}i^{3}+3C^{ij}i^{3}j @f} +/// @f{equation}{C'^{ij}_{03}=C^{ij}_{03}-C^{ij}_{13}i+C^{ij}_{23}i^{2}-C^{ij}_{33}i^{3}@f} +/// @f{equation}{C'^{ij}_{10}=C^{ij}_{10}-2C^{ij}_{11}j+C^{ij}_{12}j^{2}-C^{ij}_{13}j^{3}-2C^{ij}_{20}i+2C^{ij}_{21}ij-2C^{ij}_{22}ij^{2}+2C^{ij}_{23}ij^{3}j+3C^{ij}_{30}i^{2}-3C^{ij}_{31}i^{2}j+3C^{ij}_{32}i^{2}j^{2}-3C^{ij}_{33}i^{2}j^{3}@f} +/// @f{equation}{C'^{ij}_{11}=C^{ij}_{11}-2C^{ij}_{12}j+3C^{ij}_{13}j^{2}-2C^{ij}_{21}i+4C^{ij}_{22}ij-6C^{ij}_{23}ij^{2}+3C^{ij}_{31}i^{2}-6C^{ij}_{32}i^{2}j+9C^{ij}_{33}i^{2}j^{2}@f} +/// @f{equation}{C'^{ij}_{12}=C^{ij}_{12}-C^{ij}_{13}j-2C^{ij}_{22}i+6C^{ij}_{23}ij+3C^{ij}_{32}j-9C^{ij}_{33}i^{2}j @f} +/// @f{equation}{C'^{ij}_{13}=C^{ij}_{13}-2C^{ij}_{23}i+3C^{ij}_{33}i^{2}@f} +/// @f{equation}{C'^{ij}_{20}=C^{ij}_{20}-C^{ij}_{21}j+C^{ij}_{22}ij^{2}-C^{ij}_{23}j^{3}-3C^{30}i+3C^{ij}_{31}ij-3C^{ij}_{32}ij^{2}+3C^{ij}_{33}ij^{3}@f} +/// @f{equation}{C'^{ij}_{21}=C^{ij}_{21}-2C^{ij}_{22}j+3C^{ij}_{23}j^{2}-3C^{ij}_{31}i+6C^{32}ij-9C^{ij}_{33}ij^{2}@f} +/// @f{equation}{C'^{ij}_{22}=C^{ij}_{22}-3C^{ij}_{23}j-3C^{ij}_{32}i+9C^{ij}_{33}ij @f} +/// @f{equation}{C'^{ij}_{23}=C^{ij}_{23}-3C^{ij}_{33}i @f} +/// @f{equation}{C'^{ij}_{30}=C^{ij}_{30}-C^{ij}_{31}j+C^{ij}_{32}j^{2}-C^{ij}_{33}j^{3}@f} +/// @f{equation}{C'^{ij}_{31}=C^{ij}_{31}-2C^{ij}_{32}j+3C^{ij}_{32}j^{2}@f} +/// @f{equation}{C'^{ij}_{32}=C^{ij}_{32}-3C^{ij}_{33}j @f} +/// @f{equation}{C'^{ij}_{33}=C^{ij}_{33} @f} +/// Bicubic splines are computed by +/// @f{equation}{f\left(x,y\right)=\left(\begin{array}{cccc}1 & x & x^{2} & x^{3}\end{array}\right)\cdot\left(\left(\begin{array}{cccc}C_{00}&C_{01}&C_{02}&C_{03}\\C_{10}&C_{11}&C_{12}&C_{13}\\C_{20}&C_{21}&C_{22}&C_{23}\\C_{30}&C_{31}&C_{32}&C_{33}\end{array}\right)\cdot\left(\begin{array}{c}1\\y\\y^{2}\\y^{3}\end{array}\right)\right)@f} +/// Like the 1D splines @f$x@f$ and @f$y@f$ are normalized. +/// @f{equation}{x = \frac{x_{real} - x_{min}}{dx}@f} +/// @f{equation}{y = \frac{y_{real} - y_{min}}{dy}@f} +/// +/// @section equilibrum_efit EFIT +/// @image{} html Efit.png "Cross section of poloidal flux surfaces." +/// EFIT is an equilibium that comes from a solution of the +/// Grad–Shafranov equation. +/// The solution gives us a map of the poloidal flux @f$\psi@f$ on 2D grid and +/// a 1D flux function @f$f_{pol}@f$. 1D profiles of electrion density +/// @f$n_{e}\left(\psi\right)@f$, electron temperature +/// @f$t_{e}\left(\psi\right)@f$, and pressure @f$p\left(\psi\right)@f$ are +/// mapped as functions of the normalized flux. +/// +/// @subsection equilibrum_efit_format EFIT file format +/// Quantities are loaded into the ray tracer via a netcdf file. EFIT NetCDF +/// files must contain the following quantities. Spline quanities have a common +/// format of name_ci or name_cij. +/// +/// +///
Efit netcdf file quantities
Dimensions +///
Name Discription +///
numr Size of radial grid. +///
numz Size of vertical grid. +///
numpsi Size of arrays for @f$\psi@f$ mapped quantities. +///
Scalar Qantities +///
dpsi Step size of the @f$\psi@f$ grid. +///
dr Step size of the radial grid. +///
dz Step size of the vertial grid. +///
ne_scale Scale of the @f$n_{e}@f$ profile. +///
pres_scale Scale of the pressure profile. +///
psibry Value of @f$\psi@f$ at the boundary. +///
psimin Minimum @f$\psi@f$ value. +///
rmin Minimum radial value. +///
te_scale Scale of the electron temperature profile. +///
zmin Minimum vertial value. +///
1D Qantities +///
NameSize Discription +///
fpol_ci numpsi Flux function profile coefficents +///
ne_ci numpsi @f$n_{e}@f$ profile coefficents. +///
pressure_cinumpsi Pressure profile coefficents. +///
te_ci numpsi @f$t_{e}@f$ profile coefficents. +///
2D Qantities +///
NameSize Discription +///
psi_cij (numr,numz)@f$t_{e}@f$ profile coefficents. +///
+/// +/// @section equilibrum_vmec VMEC +/// @image{} html vmec.png "Cross section of 3D flux surfaces." +/// VMEC is an equilibium that comes from +/// minimizing mhd energy. +/// The solution gives us set of Fourier coefficents on a discrete radial grid. +/// 1D profiles of electrion density +/// @f$n_{e}\left(\psi\right)@f$, electron temperature +/// @f$t_{e}\left(\psi\right)@f$, and pressure @f$p\left(\psi\right)@f$ are +/// mapped as functions of the normalized flux. +/// +/// @subsection equilibrum_vmec_format VMEC file format +/// Quantities are loaded into the ray tracer via a netcdf file. VMEC NetCDF +/// files must contain the following quantities. Spline quanities have a common +/// format of name_ci. All radial quantities are splined accross +/// the magnetic axis to the opposite end. That is quantities extend from +/// @f$-s\rightarrow s @f$. Splines of fourier coeffients are one dimensional +/// splines stored in a 2D array. Radial quantities are store as a full or half +/// grid value. +/// +/// +///
VMEC netcdf file quantities
Dimensions +///
Name Discription +///
numsf Size of full radial grid. +///
numsh Size of half radial grid. +///
nummn Number of Fourier modes. +///
Scalar Qantities +///
dphi Step size toroidal flux. +///
ds Step size normalized toroidal flux. +///
signj Sign of the Jacobian. +///
sminf Minimum @f$s @f$ on the full grid. +///
sminh Minimum @f$s @f$ on the half grid. +///
1D Qantities +///
NameSize Discription +///
chi_ci numsf Poloidal flux profile. +///
xm nummn Poloidal modes. +///
xn nummn Toroidal modes. +///
2D Qantities +///
NameSize Discription +///
lmns_ci (numsh,nummn)@f$\lambda @f$ fourier coefficents. +///
rmnc_ci (numsf,nummn)@f$r @f$ fourier coefficents. +///
zmns_ci (numsf,nummn)@f$z @f$ fourier coefficents. +///
+//------------------------------------------------------------------------------ #ifndef equilibrium_h #define equilibrium_h @@ -30,7 +178,7 @@ namespace equilibrium { /// @brief Class representing a generic equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class generic { @@ -276,7 +424,7 @@ namespace equilibrium { /// @brief Uniform density with no magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class no_magnetic_field : public generic { @@ -389,7 +537,7 @@ namespace equilibrium { /// @brief Convenience function to build a no magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A constructed no magnetic field equilibrium. //------------------------------------------------------------------------------ @@ -405,7 +553,7 @@ namespace equilibrium { /// @brief Uniform density with varying magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class slab : public generic { @@ -513,7 +661,7 @@ namespace equilibrium { /// @brief Convenience function to build a slab equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A constructed slab equilibrium. //------------------------------------------------------------------------------ @@ -529,7 +677,7 @@ namespace equilibrium { /// @brief Vary density with uniform magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class slab_density : public generic { @@ -642,7 +790,7 @@ namespace equilibrium { /// @brief Convenience function to build a slab density equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A constructed slab density equilibrium. //------------------------------------------------------------------------------ @@ -658,7 +806,7 @@ namespace equilibrium { /// @brief Vary density with uniform magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class slab_field : public generic { @@ -770,7 +918,7 @@ namespace equilibrium { /// @brief Convenience function to build a slab density equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A constructed slab density equilibrium. //------------------------------------------------------------------------------ @@ -785,7 +933,7 @@ namespace equilibrium { /// @brief Guassian density with uniform magnetic field equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class guassian_density : public generic { @@ -896,7 +1044,7 @@ namespace equilibrium { /// @brief Convenience function to build a guassian density equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A constructed guassian density equilibrium. //------------------------------------------------------------------------------ @@ -909,7 +1057,7 @@ namespace equilibrium { /// @brief Build a 1D spline. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] c Array of spline coeffiecents. /// @param[in] x Spline argument. @@ -936,11 +1084,11 @@ namespace equilibrium { //------------------------------------------------------------------------------ /// @brief 2D EFIT equilibrium. /// -/// This takes a BiCublic spline representation of the psi and cubic splines for -/// ne, te, p, and fpol. +/// This takes a BiCublic spline representation of the psi and cubic splines +/// for ne, te, p, and fpol. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class efit final : public generic { @@ -1419,7 +1567,7 @@ namespace equilibrium { /// @brief Convenience function to build an EFIT equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] spline_file File name of contains the spline functions. /// @returns A constructed EFIT equilibrium. @@ -1662,7 +1810,7 @@ namespace equilibrium { /// This takes a Cublic spline interpolations of the vmec quantities. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class vmec final : public generic { @@ -2216,7 +2364,7 @@ namespace equilibrium { /// @brief Convenience function to build an VMEC equilibrium. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] spline_file File name of contains the spline functions. /// @returns A constructed VMEC equilibrium. diff --git a/graph_framework/jit.hpp b/graph_framework/jit.hpp index 10a2a99..e6a01d4 100644 --- a/graph_framework/jit.hpp +++ b/graph_framework/jit.hpp @@ -42,7 +42,7 @@ namespace jit { /// @brief Class for JIT compile of the GPU kernels. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class context { diff --git a/graph_framework/math.hpp b/graph_framework/math.hpp index 9568ca5..b7fae77 100644 --- a/graph_framework/math.hpp +++ b/graph_framework/math.hpp @@ -20,7 +20,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class sqrt_node final : public straight_node { @@ -270,7 +270,7 @@ namespace graph { /// @brief Define sqrt convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced sqrt node. @@ -304,7 +304,7 @@ namespace graph { /// @brief Cast to a sqrt node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -323,7 +323,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class exp_node final : public straight_node { @@ -535,7 +535,7 @@ namespace graph { /// @brief Define exp convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced exp node. @@ -569,7 +569,7 @@ namespace graph { /// @brief Cast to a exp node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -586,7 +586,7 @@ namespace graph { /// @brief A log node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// Note use templates here to defer this so it can use the operator functions. //------------------------------------------------------------------------------ @@ -778,7 +778,7 @@ namespace graph { /// @brief Define log convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced log node. @@ -811,7 +811,7 @@ namespace graph { /// @brief Cast to a exp node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -830,7 +830,7 @@ namespace graph { /// Note use templates here to defer this so it can use the operator functions. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class pow_node final : public branch_node { @@ -1343,7 +1343,7 @@ namespace graph { /// @brief Build power node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1375,7 +1375,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1391,7 +1391,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -1424,7 +1424,7 @@ namespace graph { /// @brief An imaginary error function node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// Note use templates here to defer this so it can use the operator functions. //------------------------------------------------------------------------------ @@ -1611,7 +1611,7 @@ namespace graph { /// @brief Define erfi convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced exp node. @@ -1645,7 +1645,7 @@ namespace graph { /// @brief Cast to a exp node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. diff --git a/graph_framework/metal_context.hpp b/graph_framework/metal_context.hpp index d85ea9f..694a765 100644 --- a/graph_framework/metal_context.hpp +++ b/graph_framework/metal_context.hpp @@ -18,7 +18,7 @@ namespace gpu { //------------------------------------------------------------------------------ /// @brief Class representing a metal gpu context. /// -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class metal_context { @@ -395,7 +395,6 @@ namespace gpu { const size_t size = [kernel_arguments[node.get()] length]; memcpy([kernel_arguments[node.get()] contents], source, size); - [kernel_arguments[node.get()] didModifyRange:NSMakeRange(0, size)]; } //------------------------------------------------------------------------------ diff --git a/graph_framework/newton.hpp b/graph_framework/newton.hpp index 9200871..9f1cbb4 100644 --- a/graph_framework/newton.hpp +++ b/graph_framework/newton.hpp @@ -17,7 +17,7 @@ namespace solver { /// This uses newtons methods to solver for D(x) = 0. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in,out] work Workflow manager. /// @param[in] vars The unknowns to solver for. diff --git a/graph_framework/node.hpp b/graph_framework/node.hpp index 6c875ff..c4615c8 100644 --- a/graph_framework/node.hpp +++ b/graph_framework/node.hpp @@ -24,7 +24,7 @@ namespace graph { /// @brief Class representing a node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class leaf_node : public std::enable_shared_from_this> { @@ -339,7 +339,7 @@ namespace graph { /// @brief Create a null leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A null leaf. //------------------------------------------------------------------------------ @@ -384,7 +384,7 @@ namespace graph { /// @brief Class representing data that cannot change. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class constant_node final : public leaf_node { @@ -606,7 +606,7 @@ namespace graph { /// @brief Construct a constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Array buffer. /// @returns A reduced constant node. @@ -635,7 +635,7 @@ namespace graph { /// @brief Construct a constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Scalar data to initalize. /// @returns A reduced constant node. @@ -650,7 +650,7 @@ namespace graph { /// @brief Create a zero constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A zero constant. //------------------------------------------------------------------------------ @@ -663,7 +663,7 @@ namespace graph { /// @brief Create a one constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A one constant. //------------------------------------------------------------------------------ @@ -676,7 +676,7 @@ namespace graph { /// @brief Create a one constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A one constant. //------------------------------------------------------------------------------ @@ -697,7 +697,7 @@ namespace graph { /// @brief Cast to a constant node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -714,7 +714,7 @@ namespace graph { /// @brief Class representing a straight node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// This ensures that the base leaf type has the common type between the two /// template arguments. @@ -828,7 +828,7 @@ namespace graph { /// @brief Class representing a branch node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// This ensures that the base leaf type has the common type between the two /// template arguments. @@ -952,7 +952,7 @@ namespace graph { /// @brief Class representing a triple branch node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// This ensures that the base leaf type has the common type between the two /// template arguments. @@ -1052,7 +1052,7 @@ namespace graph { /// @brief Class representing data that can change. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class variable_node final : public leaf_node { @@ -1339,7 +1339,7 @@ namespace graph { /// @brief Construct a variable. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] s Size of the data buffer. /// @param[in] symbol Symbol of the variable used in equations. @@ -1354,7 +1354,7 @@ namespace graph { /// @brief Construct a variable. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] s Size of he data buffer. /// @param[in] d Scalar data to initalize. @@ -1370,7 +1370,7 @@ namespace graph { /// @brief Construct a variable. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Array buffer. /// @param[in] symbol Symbol of the variable used in equations. @@ -1385,7 +1385,7 @@ namespace graph { /// @brief Construct a variable. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Array buffer. /// @param[in] symbol Symbol of the variable used in equations. @@ -1411,7 +1411,7 @@ namespace graph { /// @brief Cast to a variable node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -1432,7 +1432,7 @@ namespace graph { /// something that is not itself. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class pseudo_variable_node final : public straight_node { @@ -1577,7 +1577,7 @@ namespace graph { /// @brief Define pseudo variable convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced pseudo variable node. @@ -1595,7 +1595,7 @@ namespace graph { /// @brief Cast to a pseudo variable node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. diff --git a/graph_framework/output.hpp b/graph_framework/output.hpp index a09cd9e..8bc8bc1 100644 --- a/graph_framework/output.hpp +++ b/graph_framework/output.hpp @@ -248,7 +248,7 @@ namespace output { //------------------------------------------------------------------------------ /// @brief Create a variable. /// -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] result A result file reference. /// @param[in] name Name of the variable. @@ -274,7 +274,7 @@ namespace output { //------------------------------------------------------------------------------ /// @brief Load reference. /// -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] result A result file reference. /// @param[in] name Name of the variable. @@ -310,7 +310,7 @@ namespace output { //------------------------------------------------------------------------------ /// @brief Load imaginary reference. /// -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] result A result file reference. /// @param[in] name Name of the variable. diff --git a/graph_framework/piecewise.hpp b/graph_framework/piecewise.hpp index 7e44849..811c4e2 100644 --- a/graph_framework/piecewise.hpp +++ b/graph_framework/piecewise.hpp @@ -86,7 +86,7 @@ void compile_index(std::ostringstream &stream, /// x_norm' = (x - xmin)/dx (11) /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class piecewise_1D_node final : public straight_node { @@ -551,7 +551,7 @@ void compile_index(std::ostringstream &stream, /// @brief Define piecewise_1D convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Data to initalize the piecewise constant. /// @param[in] x Argument. @@ -592,7 +592,7 @@ void compile_index(std::ostringstream &stream, /// @brief Cast to a piecewise 1D node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -644,7 +644,7 @@ void compile_index(std::ostringstream &stream, /// y_norm' = (y - ymin)/dy (21) /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class piecewise_2D_node final : public branch_node { @@ -1265,7 +1265,7 @@ void compile_index(std::ostringstream &stream, /// @brief Define piecewise_2D convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] d Data to initalize the piecewise constant. /// @param[in] n Number of columns. @@ -1314,7 +1314,7 @@ void compile_index(std::ostringstream &stream, /// @brief Cast to a piecewise 2D node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. diff --git a/graph_framework/random.hpp b/graph_framework/random.hpp index 41feb15..2dc64b6 100644 --- a/graph_framework/random.hpp +++ b/graph_framework/random.hpp @@ -18,7 +18,7 @@ namespace graph { /// @brief Class representing a random_state_node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class random_state_node final : public leaf_node { @@ -249,7 +249,7 @@ namespace graph { /// @brief Define random_state convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] size Number of random states. /// @param[in] seed Inital random seed. @@ -285,7 +285,7 @@ namespace graph { /// @brief Cast to a random_state node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -302,7 +302,7 @@ namespace graph { /// @brief Class representing a random_node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class random_node final : public straight_node { @@ -506,7 +506,7 @@ namespace graph { /// @brief Define random convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] state Random state node. /// @returns A reduced random node. @@ -540,7 +540,7 @@ namespace graph { /// @brief Cast to a random node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -554,7 +554,7 @@ namespace graph { /// @brief Create a random_scale constant. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @returns A random_scale constant. //------------------------------------------------------------------------------ diff --git a/graph_framework/trigonometry.hpp b/graph_framework/trigonometry.hpp index e68b8a7..3cb335c 100644 --- a/graph_framework/trigonometry.hpp +++ b/graph_framework/trigonometry.hpp @@ -19,7 +19,7 @@ namespace graph { /// @brief Class representing a sine_node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class sine_node final : public straight_node { @@ -220,7 +220,7 @@ namespace graph { /// @brief Define sine convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced sin node. @@ -253,7 +253,7 @@ namespace graph { /// @brief Cast to a sine node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -270,7 +270,7 @@ namespace graph { /// @brief Class representing a cosine_node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class cosine_node final : public straight_node { @@ -472,7 +472,7 @@ namespace graph { /// @brief Define cosine convience function. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced cos node. @@ -505,7 +505,7 @@ namespace graph { /// @brief Cast to a cosine node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. @@ -524,7 +524,7 @@ namespace graph { /// tan(x) = sin(x)/cos(x) /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Argument. /// @returns A reduced tan node. @@ -541,7 +541,7 @@ namespace graph { /// @brief Class representing a sine_node leaf. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class arctan_node final : public branch_node { @@ -793,7 +793,7 @@ namespace graph { /// @brief Build arctan node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -824,7 +824,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -840,7 +840,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left branch. /// @param[in] r Right branch. @@ -859,7 +859,7 @@ namespace graph { /// @brief Cast to a power node. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x Leaf node to attempt cast. /// @returns An attemped dynamic case. diff --git a/graph_framework/vector.hpp b/graph_framework/vector.hpp index fea3069..8702554 100644 --- a/graph_framework/vector.hpp +++ b/graph_framework/vector.hpp @@ -16,7 +16,7 @@ namespace graph { /// @brief Class to represent vector quantities. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class vector_quantity : public std::enable_shared_from_this> { @@ -122,7 +122,7 @@ namespace graph { /// @brief Build a shared vector quantity. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -141,7 +141,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -160,7 +160,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam M Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -179,7 +179,7 @@ namespace graph { /// /// @tparam T Base type of the calculation. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -199,7 +199,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. /// @tparam M Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -220,7 +220,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam M Float type for the constant. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -241,7 +241,7 @@ namespace graph { /// @tparam T Base type of the calculation. /// @tparam L Float type for the constant. /// @tparam R Float type for the constant. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -260,7 +260,7 @@ namespace graph { /// @brief Build a shared vector quantity. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] x X vector component. /// @param[in] y Y vector component. @@ -280,7 +280,7 @@ namespace graph { /// @brief Addition operator. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left vector. /// @param[in] r Right vector. @@ -298,7 +298,7 @@ namespace graph { /// @brief Subtraction operator. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] l Left vector. /// @param[in] r Right vector. @@ -316,7 +316,7 @@ namespace graph { /// @brief Multiplication operator. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] s Scalar term. /// @param[in] v Vector term. @@ -334,7 +334,7 @@ namespace graph { /// @brief Division operator. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] v Vector numerator. /// @param[in] s Scalar denominator. @@ -355,7 +355,7 @@ namespace graph { /// @brief Class to represent matrix quantities. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class matrix_quantity : public std::enable_shared_from_this> { @@ -402,7 +402,7 @@ namespace graph { /// @brief Build a shared vector quantity. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. /// /// @param[in] r1 Row 1 matrix component. /// @param[in] r2 Row 2 matrix component. diff --git a/graph_framework/workflow.hpp b/graph_framework/workflow.hpp index 86dac56..90d5735 100644 --- a/graph_framework/workflow.hpp +++ b/graph_framework/workflow.hpp @@ -15,7 +15,7 @@ namespace workflow { /// @brief Class representing a workitem. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class work_item { @@ -78,7 +78,7 @@ namespace workflow { /// @brief Class representing a convergence workitem. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class converge_item final : public work_item { @@ -164,7 +164,7 @@ namespace workflow { /// @brief Class representing a workflow manager. /// /// @tparam T Base type of the calculation. -/// @tparam SAFE_MATH Use safe math operations. +/// @tparam SAFE_MATH Use @ref general_concepts_safe_math operations. //------------------------------------------------------------------------------ template class manager { -- GitLab From 4e2475c749f3ef5df351fc2437932629dc1c463b Mon Sep 17 00:00:00 2001 From: cianciosa Date: Wed, 27 Aug 2025 10:20:44 -0400 Subject: [PATCH 03/12] Add documentation for C++ name spaces. Add diagrams for dispersion functions. --- graph_docs/ColdPlasma.png | Bin 0 -> 31849 bytes graph_docs/O-Mode.png | Bin 0 -> 22724 bytes graph_docs/X-Mode.png | Bin 0 -> 26789 bytes graph_docs/bohm-gross.png | Bin 0 -> 22075 bytes graph_docs/general.dox | 1 + graph_docs/main.dox | 13 ++++++++++--- graph_docs/tutorial.dox | 7 ++++--- graph_driver/xrays.cpp | 1 + graph_framework/absorption.hpp | 1 + graph_framework/backend.hpp | 1 + graph_framework/commandline_parser.hpp | 1 + graph_framework/dispersion.hpp | 8 +++++++- graph_framework/equilibrium.hpp | 2 ++ graph_framework/jit.hpp | 1 + graph_framework/metal_context.hpp | 1 + graph_framework/node.hpp | 1 + graph_framework/output.hpp | 1 + graph_framework/solver.hpp | 1 + graph_framework/special_functions.hpp | 1 + graph_framework/timing.hpp | 1 + graph_framework/workflow.hpp | 1 + 21 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 graph_docs/ColdPlasma.png create mode 100644 graph_docs/O-Mode.png create mode 100644 graph_docs/X-Mode.png create mode 100644 graph_docs/bohm-gross.png diff --git a/graph_docs/ColdPlasma.png b/graph_docs/ColdPlasma.png new file mode 100644 index 0000000000000000000000000000000000000000..07976fda96ef41d0812880f6ccba22b541cc9e83 GIT binary patch literal 31849 zcmeAS@N?(olHy`uVBq!ia0y~yV9a1(U@YfgV_;zDNWD0lfq_vy)7d#7+u7YYKPSH^ zxF9h()iEVMDK*I5$E z63#GentIxs%i)cjLbQse^qDw@BymPrj+A`Hjh7YQ2q%~de3RWUYl1?$!f)mYXQ#8I z88^OpjDObtw{a_ekT zHdqoQYV�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 K&t;ucLK6TqSDGsT literal 0 HcmV?d00001 diff --git a/graph_docs/O-Mode.png b/graph_docs/O-Mode.png new file mode 100644 index 0000000000000000000000000000000000000000..b05f7580f3eb8f4c8596980cd24146d0568d2d7c GIT binary patch literal 22724 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�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 Qz`(%Z>FVdQ&MBb@02<1kr~m)} literal 0 HcmV?d00001 diff --git a/graph_docs/bohm-gross.png b/graph_docs/bohm-gross.png new file mode 100644 index 0000000000000000000000000000000000000000..f15beaecca64d5bf4e6b32e261422868115242d5 GIT binary patch literal 22075 zcmeAS@N?(olHy`uVBq!ia0y~yV9a1(U|hz*#=yW3$SxFgYk?dX?$Blp5sjWN2w=!N8y~F*zY2$U{ftM50ha!ilrmnp{QYK^+}EK?(II4;)lD zs=(El?J01sy#eoO6XY=$Z{Mw{^t(hK&c1u9z?vA9@27Y`9jU6wvY!-C0K zEA*hTex$$q!4n5gOlf2kc_(mnKJ&qcCpF606x$d$Hd+et@ci?Zl!*AJaKxudQbO#7 zfx!oV*N&BvMg|-&j1At*o*WYu!e-hw@#KugMge&SVKJ}3cH0{s3=9kwsS%!OzP=1v z3=9k$42DpfEmtS29ng<;B}RO!GXck#WAFU@$FpB zJ3d$cAK!2M`Nnjeo6|kEbZp^Rt0KBmME6vXSIeT%lVKX0Tsz)e>W|NyuIu^tU+Wvs z)BYOOom~R+D&PIDIrrz;%SyTPMd{D(?JR#+vv0ll`7?Kl&wsLeUi0kC&gXO1pAS$o z5mI0jQeeC;_+hu6`xybw2@ISQ8q_8T@wTtu|1WA=&P}DIUQ@fCmECh@QgLA7^nCE( zU~|ysG~boc+w)>R$xn5t|8S6fQ`y_7ogWTyKc3{N<^)ogr?8>!Z`IBpkGk*bUI<+k zBKYU^jg53qdgx-oE~|EMKS=O_5z|Yizt`jIPquIhr~Ll* zc6mzS(JoP=@^^QF?VhuPlsGVb6Z8;&aa_JW#;s3A^Xcj7_NrTZrOmzC`DCBGxVU(E z%ww23feTE3&zj#qF-0>t<;I4@pcMg%dz}_%UthN=|GwSathG^FpFBA^c~kOnzUrcb z5uOb!9t|vhiVIk)9v$f{IwqO!@%q}@(uSqp(@(95+|0)vpF*w^@5l6B#8WdKEIwzPE5|OCSpUh!29F<^7`{@zs>ye`uh22YYeKu z${TxFwm5u$dpmrZZnT=J*A#&_QzAE~^~zY6`RqR)a_q^;$zNlNk4gWW1@gDYfjFir zzFo!7&lUZCyZ!V+=k_I8S65jb&ENkwZ2heRziWPex;dNsm>(!&RSLKozihTJs5-WP zgX5I!D=P%+PJ^S*fvHe!!E%d7bJQj)gS;nX;Ml;F%OuncPEf)u8W;Qm(r1CfE1`*j z^%jc?n<7Y=I!C~QxeLyjfMVbP3nSMSP7fY%3i19q41TNY9Q@16dW4O7&{$38dy9IfGkvBVeAXiKI##=#>i>bs?%bJ zJBtj!fxn@rA-d#DP~*Fs#v0G(&DNSeihv~J3$ZWUR&2J#w{%2b{QLViX#YO{x_^;N-1(pHubtC& z`io}+i%>U13HL8n+2(ncxznC0s2)|{oX)5sWF)(`c~4*P=HA(re9N_GzMRa!`NWUG>gv|)7vcX`1lFxh-g#ee z{_1JmCY$bV&31^|_T}XJ{oQw}^88}oa6RgC7do& zt+@|#1v8$Motn}xMN@fG$x222{byG4-OidIIGKU-h|7Z9+a@=+dLLPTrQngvZ56{+ zHn*nDE_zyHRGRf-_KTV6mr^dP^(|VwO7WfxlS+a#Yn{`*g!wZ*oPZ61Taq;CR zll?U=-3({7S7j9H5NCWL@P%WSNR-r@Ka+O7IhD8DLHXjZuYZja8sgVJ6L@*UaK*f7 zMXQu|pL&q4;=uGxxZ$5e`vP}n_N3z2m=uFmO-FUp&)Ynnep>JI%F>H7-aphkydtaH zd?Ewq5g&yu_Rdc}ov!`#<#OTV11mnsZok9Iv~Xo#(ovVU1|})beEdpXLX-D&vUn(D zF

-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 z

XZ--POnArK-j{ID`p66h3(izM7wcGYS;&I6cx9E`fe*I#u^+BoLQ+lko9$HD8 zjCiqFOif#R_#-bPL_yZC5bKZ4uX7QOfYujvco^w$8 z&STYcmMNX`>H>^hTe`Jgf4^Tp{rS9VKmW=bbJuo>)_(f=T=NxA!u*{3dRe#gSFMRm zKL5^b_vuI1ejF5zDb$knlV-^;*nZm}wXLk>n~Qf2lSqd6Rrx;$6J3v=*55BPJtpzp z&&mEwuQt@r|MP1#s5QCu^8}?_)<3P>mzNYiUhs@-pZD}*`RnB0vcFy7+AS6)(pqTY z(ZKXp;m;b+WJ{4X@%!sGmA<~VW_oUA|6(2cKL!hI_WyXYe!q)8<7}ImO0wKHx}M`%L7Ri3HIGyE_kNj_ zXP@Do;lJgG+JR6Rz190KE_Q$IoHMWL)yf^ub1p1sxOL*eZ@#ZGu z)`e^fba`$@ue!1-?hdCemBz2rU zYySJm1ILTeQ`q_Wx)KXac-VjO^n;Q#nv)|%8Tg@^jJN903rg!ItlvnoufA-h>d^&xX@~uf7Cq1;o zzpb43**;iqbGr1Y_lW_yiQl$)oS!*)ncL}=RWBF*a$LAA@V9BZ*VIS$ODAqzRj|+a z7V9mDp&A!B1D1b%b@lRb*IkOM8yzxEB|r1oANQU+-N1J?+tZur&8Liew#z9jveCG1 z`<>;h-f1CKmwi8!OqMe8&n{KbDvg3*tLIJ5VN6MPw3~z;|*3Zr+(@^Zu?cfE z!>-rsCcE`Yt=xJ4@J4ruWS-PhKb~F<55DsA5@YR@XVY{SJxgi6w5#+{Uf#iF!cXL% zI#iyskH2E#+2v;S7WZQVpzX0)+c_=nKiYHl`lU;A%Wh?UIxb)Tg5BBQ{_mEh zg~x>=7rQNF@6g}-B>eLerT2T1HT>mPo{IJf;FIy_$>e|XdE@a1H`PL)gDkkV);rL> zb=UIQU*6q~z7B33p1sX-=kljLXKzlrl(0hj+H+9nC8O&+7g*SS zm>$jZ)wb}F%ig)xZ_Z!RtxUFiqv+7Mt$lUw#(C@OitT^D*_>rvC>(CL^LXPIRSB|gC=igDha^m>nezwwmZ2W$gf9Bk~v)uj6iFzBpYyDd$ zhO7*7yT}?+t3T*VaU?(lrfNcM3Z{WuvHe7{@omJEhlSXWE&6KK57l zl8@#j9Ud$7vLC8Vv1K#k-`er?t}y)CxY*+PdGjxg-$b>Sd2P>ge0r5Nm|L)4*hf_U zqf*_H<}Z0WRaabgx0@iJV-~qVK~?dHB&*xr;5ojbwK2@L|9(6+Dth9f8Nct3=F7Z0 zI|8?EJ^xTeWayf9&p{D{cJy=akPo z@$c`VXO}L2dAH}%QpI^IjjBol!q)i&x1V!Yzp*3#XqSmB|0Cx;H~zMlOpue=-Y4-; z{0Vcgq1Z*MO*j#(Y1 zd)I#BYvZ8JUk?0R5cO^HuIln7l?gv2IBXV&71wM@Xq1WC8?{UAfa2SuA(8U??7qBj zf6rUn^YYXAOJ62!dv7mraDS(kj{~o)R=C*8psVVl+CQdT=n~P_3)-+i%5hbgbjZB; z4HH?4@9h7pwyAu+qILO-dTUoBtEQC;9_?DSOyhq;-By#c`swrk+B@FUE{geEynC-z zV$+^gay)rK?TULXN><$7{Cee|r6H?S7-c@pZGU+1tz`O~h11fvT~nN{7rSb?^|3zL z)%V-$Ke~KY&0gssKhM~`F1UUBg-7lSW_xk{zakJ=wyM4}r8P7y`tSSunm>;<2r~Db zV3%F)qMBv9`JZ{D%gb`7Nbjl9e}X?7YzqFn_-Oxum#3_KJKx>CI=%Yw7Z*dVx@R-f zFWrB9^tgPzj&AfepZR4mTeGId)Ow*QO;qzy*>V?rUfp3Z}E#^%Vg6#;kEz&elNN@HT;xp`Mu2apdM>!rVGY5K0Q7C zHU5uyoyUxSja3_i|K_ajnO}X%Ky_=y$E4Cfj=_KB{y)^Xv3lJuuex6^)vv~JuNL)t zeO2Us<*#^)3wfrWH+WXoW?Wkn`7E6$;;7)tvoj12AF!Wg%>kN`uJ~|}op&qi4Oz(~ zJsrh{UoLxB-EE$BaPRyMEd$zH$rTEOgf9#aRSE)mTn&{*&O@c2z_QH7~G z(c8`hthVUclzLj~?ygefD^of?9+S?0!NV(Ob7RMsOWwV|-|xR4@cC++)njYh#aS{= z-X%;&uLuYo_YGUoAQ?U@oMVCA;p1nkmiol$u-7$62P?ThdGS9Phh- za|G3Z5J#@9sqImI>aUa@o8eRK-_$+x0abJ$HY@%86U+A~&b`mah9DC;RL`Bl9A+ zXAc#cYWWf$b6EKtQm)^4=iSfe^RM5(C8rq_B+9&4_saa+(|y%Km(I}8aXT$}{z;q0 z^%a52lP#2`dbT8Xi|JlEek5#lm~Z>*o12%f(B!w(@7;0em|)3_7WaQio#z`EnXfc& zPI~3C?X|I~RKLi@%|{PdMdnl-=q&yE`ug?Vmu#YMsOa7})XIHzr+)gYxd#L?Z)`|B z{6ul9i&*@rqgSIY{rvoV`Q?WkRnk@O*=zBCNPo$6ujcdFR~EOoo{~Hw{_4fO|CftzKAaT1;IN9#7jb?? zua&Idq|I_J6vxPE%}VcXx@i1r^_E)`o7>$?-U}Ys!fv)UWzL}!5ng{@oz0r_=!Dl1 z=J!{FuK8#n=6O z$~h@G&De(_e%YGs2E6}RK}~c|>jOdxvwm}Ih`ST6o_9)+^_K6}MCZ5Z=Uupc z;N{_SYzGWoI=`;JF|YsE!%e#+9IAeVacybW7I*db^t|Zb@%`Oh?Y&iBKUHK3udZ0Z ze}#MAgT?bQR3=PiV71Z~?B9Ew@x8@rvFBIz{rmO$Re;I7j%RIJZnkIU*+$FHYyRaa z!p@VIFx{tefrGkZZnC@Zw_nNECt00P<@9>?%3BHcdWL% zGeg?1aL2~5M-!I&+y6DuQlD0MVpjU(hRXp3%O^HOGKpktUScEiu2np4Li+sLur?ma zM+<{??$>z0`%Zt~k43+YPs{8A?U)d~DsbOtOU6Yf(E1O_RdXgBs+T%j$Mk^b-s-8v z@gJ5?Y>;FU$uOQ`BepDVZ&g(>%N`zWbL(6EvyOMYSoP?Df9!ID4a0vW&{>#R8?XWc)OxLFL%hYVoyQ`HxzjmA5YU`Vo8~!}w zED&w444cOlxgo)Erg3^-+)c)Z3vRkIc)v2syQAUWCnJdD9f@~~y7fLKth^JcQpdS# zbKISI+J1#Q_O?Bmv48*nf7X2~EA2HueW{bZ9qYukk9D>ICb?s+;b8nor9=-12TvpLThSPE1;Xk=d! zx;pI13}*SdoOulH7oJ6`x_WeNHofZ8cdfwZTZG1illPd4H2+W2jZV40uXbn4gQW(H z1x)%g(CmdQ~MS*2%o#bU@pZO;o88IE9%*QG*aPVBCbyj?HV^u$jutlQX=_vFOHPY>JW zxhgJt9PnZi$iaw0)6;Z62b@&W z=Q{QOO0a*X+yf_N#@!qN3*IWd-dN#1RZI1}&F7v6OSYYxYkm6SVt3mxr{bfII|J(^ zDjK+ZS>7l)G;Zr&!~Xc_3rW88?YXzrK0iDAIf3)Dp3te@PtD8~7d#I5F~uBBRFCaH zI(O0}rOV6xr^oIt^E^FG*EY!Z<5Z_F9pHACl&=R5Z-j_&cv7c`+hjRy0TJP+AOEQ zy)EYy>#6plMSDzyI@B4tN^CN#b=GdbSLJP%e@|zwRq3QFS3>%y>V?Qm;eP6D85k$U zd1NvJtJS>t>Qb4hBH+&?@}lC>w}>d$E|G~R zC#!Rxdvjxd{r=-#;#z#CT0bqEqoLo+^2oDcwZ$XP+s&D#xwk_0{eEX{`TNag+X$hHX#~)3v5GX`iUN0{Yd87%dekWPoLcXPT8TcEPk#^N#DOepZ#y{ zF3)$G&iK>aGDGEo2_x5*%cc(&emQ*l;)dIL6M297w>@p{jB!6Xshq21)0GmLQ;|E1 zQZ38g%=mW5sPxqpizOMgLMP1koLC^E!Qaa=N5!GBY|_5tm+bz2xt#ju#>QPC{r3NM zyt%nqeWBNm>hF1u`x4jh`P8+*#zd%K5<_^Qh3Ea|%Fn94-}mImt%oj~om#n0URdb-b>{WXY30wZ&t|bW z`tWR3>6VaAjdPNXs#X7tr?svZp3T5&wej`&uRH(0-F`pi&W^%$=hQ#7*Ie>AkjtWR zA#b%H|5J8$Uek;V4srE=OF{KjOr+71>}zWxt>(wsemFVx!A#9y7L5zb3=9KISRNEE ziQixM>1ueq=k~n2G24GK&kh7-*T}t9ThFQ6E^!Gyz2~?elSqd3OQXDl%lc32?e^Kw z^0rfbUV*6K6LxRLiThpd$2`{BaHc1fMdQM>g()sK1wZ`$Ym|CQL^EQ;f_YvyHYU55 z9engp@>AnV-Y49%gD3b)aqj44n0|BTS~r^+^NY{hhO7C`T2d<+wl?ajsH%&d!PdsN zFQ3mT?$iEs#Akv-7?a40H7-Byi81BPaas|*ecc23UY0vv4f|i;i84MT&N;#1lJEit z^;+Q$dxkTA&9bg|_|35pynbY&+$GmvCPE%8pm1KH%KubQsq^g>?eKL|p3kqhTc_$= zsV8h<|#Tfe)9=cb94Ok{QUax(uAu=HY6V2;(V>*iA-Po#JGx3&QFfY zjN645IPBirW;4Tnjdk6ViS8^)ob_!V4VE;2nV@%R`9udLP>JfYLY4nn;fV=~Q97%` z*UL@6bhq~V-Ku{(V|Er5diHltXb=UJYyl}Ug2EaxJ2o8go^yC+cX`#rlAqIA7O5W4 z?8`X$(axLm&7GaWmo8n>=@tH{7$?Q4qQ%Hnvgq2J_D{C8ze*0~Iq#Uc>5_o_qq&C3 zZBs8A=?Qg6Gjf&O2{2wbhvUHa`xBMjm*n5yx2g8`w>eF&Uo0Ov)^tqY$Exgf{D2;4 z&?YcdB|8jMQod#Wuzvr)N$m1925CHPi7zSy95F; z|3KP2Z_4fb{jtAUdak||d2~>4d7}Q~-MQL?&b_w@K){2kHtzK zzFv<%y~wp&X_xrJLit{nJx&e5GI1+C`KKmdUglf$a_MxhkB^Ri-NL@i{?n$vzrSa1 z4{hg@on)GQ?ZnUL^XFgJ-Q&l!PW^!3me;E_ej0HU?tRpy&9bO_v+)^;LyCWI8n(p<=vf~o3gI1icx&P5!mAVjfwQ9TfF@IK z^V!!|SF5Mbt6UbcBET_fOUAmQwPCIN@tZ|?2gz32bG-$of16y_%X z5I^!;&bBI|&L@*eAyI5{i-TI@u}F>zrGJmQ^-r;i$0$_%D7s(!owKib$;5_WmIv+y zXJ#1Qn*ZR$MCGr{j(^Vn*cn`zyh|lPz0rqB*6x+z24C{oKM^y z%*tLj(fa+KVEH8`>E~o*Mc&Ug$((dMcaIwrr?0|gtv=9bob|OMRhKqQ)rkz+e}vgt zr;_XT63@vgFE1^9xc$?w*Xx(>f5t7eq4~g-mBCAEe}B8Qr?NP5N5MjqygN7gQY6$l zceFXEHS)1FTk3uC_dF>QBG28aESsq!pwHCGC3@*m&liPDCPE*q8hutpZ%lHvtoyU0 zE{JdWybaCl{I7QITNS!GEh%tSh~~bktF`@J)#^KCw{tJ8 z4qxwa>evQQTf>1#OyGnGd+(2eE06i@|0wJ(dwc2L1a2{%3NIsp4|}V>pISb@uIkj* z`}O~AZ=d()1Z6farkv!!rpLLQQndRNAm(K$^w=A_xNP)QK zrjSJ{pVjSvKNB2enlw}yXwpjY{xPtaM6{eZU&lAKpZj2Ue|LF)=9Lu_udI)^pY@`GpYw?a!>y}pB8?l<5(_$e z1N~;cW$IxT74=tu` zzJ)5Hu42Z3d)?yXVxd7T60SneHIAH-AjXA)^B$6S$z{m@BaE)+NJ%9uD3p%c(Y{h&u6o530r<*D35jR61jMeRd3&qM_+OdD!v5G znV++M@ALo6O7Zo3zs>qKtL`AHxW!b~WwT`&pPF^JG0o)A&{sY7a{2tc2kT#LXe)|O z)7T!|_Q`psW{h9{s*sgQdw#uIZ5g}mOYu|r%K=Oopp~=7V$1KQ##BC?`fKl}w!}=U ziEhjGDeydPjWJ#mzJA`bmA~c}9+xebIK{cH?_H<*JcC&#nL?RYwzaGeTRY3J?oUPZ zqqHR#g&X3{r8rZR7!u#z+M4|<{S@Pd!ppwqk^-~Vv}H%?E_Rr2Q)%@2>6h=3@6Z0S zvrXXB7t@c+S+Zn_#A5gUb0UxKmfts3X!D+?bMi}N*~j$nl6g%X&r04N=@g#%=S+{JY6u3iG8ef0TMRM6@$M6D#-od2sKkxpy=RTOXg9*_4 zEbe#dJ+&lYp;OV%r_)crySw}AS8x5jA#&Ak3}xl(zTL0=e%Gk}U(MgRUJKTJ>}PLX zSsDB_#A|)rUZcC0R)uOyn&r$W3vc0`5!P^f(IVIGu3w8TK5ej8u8G@_;As1`;ice> zkB^VL_8wVU@bJ*CobZ^!);}K(^Z&Yaq*M5-h*u*MYf0VxipRWvci#LjSM$N~?IvzM z&qVz_ADn)DIc9#pX7Tct3GxLmE-mdocly`Y*Gsdmu4<|_yvnld6}P6Xr_aO%do-dy zK03NI`FP*0+m=i=-|rM(TIMTVTYt1mwA8XlOL|%BmGy$M@7KldUXp%(UQ@L|`tNUV zFWatK{O`eAsdEbtE=)Y!1}eM1{Q1zjmBoTRSJz+m_O-QbXXedKb3U`t{pOC1{_FNx zy?>utaiQ+hNp;uWTU#cFnMR449$jc$@aBf0Zqf(Aj-B`U?f(Rnzwnx>dDqv)ZhNSplz6!2SN;Fr@qbmB!XvrG^`_MQ{RQf}ZS`##V_E1`MU4D0*!rLJh6Wn|B$2 zK%`x2tE6u9Hj`QA`FSxF4_n>#)%@gn>KV-*s_g09JFiFCy>H3=sNH3`&b?2*RQnXR z9Dc;CdZ_Kwq&aoIr4@gr{!i75y%n(d=$G#^euptFxG!&0apA-}`MRjb^2^NKdL$;+ zy`N)Q%%fV=CiU}W{lm(PJ?CenU0&wfdpmEp?%#d+`~QadcdiiJxKM7wt4&&r=GWH6 zX3JO<9Qg5i{eB+RxGK4S&t~VFUFoT(8h1W9``3*qndwqqFL=IY9}ZAXwmrJ3=&6@%TrKA^b;fJ_HXj-`CLiak&AqU|u}!M+b^WXB zoeS$`zS!V(g4gts-+uk&n-m#dNf%%65I-+{z$k~AozG;-@@(gyO(p@`Ykz&=j5oS6 zJ*4XHvicL^(*z%I+-lR`yZPLwlLs0r`-5^ltj=o~Hkl>sMr{%Jx%zTm)u85lb(czyh6bo8bayb91|GN*;KE)|9ZyV?Tknmi+GvaTsy^P-D z_#USG9S_+8iyv*uySwX)x5QjNdApeX^5%JShNE}C_ImN#+w-q0 z7yBfqm^=wT``dea-d&c(uR-1Z|4f|if&BJ|^}kLzGfg-8321HU{Do(dkM(%&@5@yE z%DUiwx{moW^CGS2A88+0s;{Kq_#jm(6nC?EV%?1ouNn7m%J?R*z~T0Rt!}*Yc_aij zD5gDMbVNp#=Q6{?`HxMdS;zTwR)_dyp)8F_ zUneD;lWzN&cxJYee*_bUAs4q$-KWFM6*r8Qb^bQy`h9I}^jH7NBaDnk=jhdKd)&>T z)VmTie-n0PJ;%)riOmV87%!V=rL5eqVX!{;n8E&DeJh{X6w?mfeFBPixW#k?&a6&; z#d_J+fJ6Hfcl748Ua=3Ko}PaFeMa1YD*`-~&XONmnNLT&n{!HR-ZZBl8-6tPOX)sV zo-4Pn=kT54)zP)g|2OwIoZEY1lZr&3lF$KX+cTAV@%v)VpT1ZB|L;rwvsca+240rF zw7Erz$PShS~U|h6})kQZ{c+FlnIfMDVKZAP8 zu72^{_9B1hQ!(A98P%-|7RpqdXk$;9U-xU}ikA|)4O>d*V_8Or%T@YFE>4Y8296}sT%P7;Vt1lDgeVgbmcd}4(o>bxM zg2c8N*~il#mI%ZjE4?6Xo_D4A?+N>VE8}&l`YdhO*M`k`@gqQ7f8P(Kyz9$cLhiSh zOi(|we)Yv2``RpDyk58aUA-dj-0O2rvDInF`}l@R&Uo%Nr{Y_|->=uDAMl)xs@Gt? zwB)Aqf%c40*9#sBNlY`QAL$UV@7^rE(N!j~$2`H5+3mUn@9d3>-TS%1^rmQsznk(v z;$+fP*B|M%77V9)=63&(36=|!o_02oZ>LMAkkzZu)nPA}=IsCbZT7s^N7py?To!xy z#qfDgrlQW#)2EBHqObivAiQ6o==anKU*+~~pT@v?D{5X(FN==qgun&Gvo>usaddm8 z#Wbh6EVR_XSY^UY2050bRCc$kTb?K%5G?t0)zaICNo9fpi$#;)gsvnr&jyxB{S2&D zKVQvJRbv$L5MUB{!Lm{#Z8D38!cUHX1(VmGi%b$yXk<}zXdEyNGxwIOc`Tdh`(2wi9-ewHOwLdc_vN#whVa}-{4w_&K zuZ@no1?rhi)e6<=pDs9wfwLoE!A-6tr3S$*pT5Wh%j}uS;-OH@B=X|T&JV$pSswWA z3RxMX=4>p%Il)1NMdQN63rRP8Sp4Q#D6(>iocJPne*yz%gnI*1uI%Y0-I>?d#Rjbm zTDnBroZE-#qmn~opLiz!vdNeKd_LIBzBK>-K2ZB6a!=+4X*LznvDp{htkW0TGMcc=yg~KI75AqNM)7c#3PC^m~sorgnb$ zYsF_?Ut4=x@aRNk_oBJ=@2;(#Eus?<09rx)*rM*wj+nBWsh9TER=>QuI=t`WCnio6 zZpOX^xvO42Jw2WKU+db!$H$uL6N`UUS;$}fcQ*H*rA&GpKfAyE-;$qCCi@>c2pV>; zdg{L1Z|)`g$J|05X-py+v$N!x{@f`(pW0=++QGWgHu%`0ipiI``u_iUZvW{pzkN#A z$5pG>O^Vu@mHLY(A2gsKXA8T9vFg*(=u5sq0G5` zZ~xXCmbMCawq#D$iQc9Y{AEV_InM;tMB(E*nlMJ~>GhRQIlo-(Odyb3?a7u;BK#+{^aeUyk0d z|G(C?;@g{>mlis+J6iovI_x&xs`S;1deD67_HK8sX%B6k54@i_X@kNvVbCGL%EZ9a8;JHb?VZ+H3nGjpxOcV9e|=p*5KzwCBy zmAB>f;ODMWuJ3hg08JQf-C*;<^u}U$e%n=`6#-A5oSgh}03Ls?8nN1X`+;c6OHPWHsMYs%mjcjPC^(I8?9q)72J~ zyJ4DhBY<1&S(p94ACJH6`2OamGN^A^FaNgt`~CWOgR6}bOUlA_m*r}Pt(h_J@W0RJ z?Kg8DI`45{GmFNBd26Fyb6wk2n(gW7c`=y3L)80uA%~FN=EHyL>VGkMSNJM7rl=mc zHh+z&yyH&q>3X_nXPHj^kRe`tIra3kvxaPIPDz+#Ot@3|eD0@bv-6)x=q=}#Fn#>+ z!LzfoFE=OLw&-P<)XNZFs1n`l9vOFrvHZ=Az5!zGc|!FYFo}q|K*28+^?<*Ek5&iOXlS-$EKaP{~vQ|iss~G zi#P@FPI31OJ3l|X%EMCd!H(~7`%|-~V_|RQ>;DAm?Rudk%eOdFigSX)6P6ua%0+3O zwd~VwC9ZmWV`H-C*~V6N&{QFZmE08DDQxGS9&mI69nkq3G(?~NW~B(1h{ghb^G_iQ zBP4_hG#UL0cWg\left(0.4 x+0.6\right) which + * Running this will generate the output \\left(0.4 x+0.6\\right) which * renders to @f$\left(0.4 x+0.6\right)@f$. * * @subsection tutorial_derivatives Auto Differentiation @@ -191,7 +192,7 @@ work.add_item({ * @f$\frac{\partial y}{\partial x}@f$. The third and forth arguments are blank * because there are no maps and we are not using random numbers. The last * argument needs to match the dimensions of the inputs. Inputs need to be cast - * from generic @ref graph::leaf_nodes to the specific + * from generic @ref graph::leaf_node to the specific * @ref graph::variable_node. * * To evaluate the kernel, we need to first compile it. Then set the values for @@ -300,7 +301,7 @@ for (size_t i = 0; i < 10; i++) { 1.0001 @endcode * - * @section tutorial_workflow_iter Newtons Method. + * @section tutorial_workflow_newton Newtons Method. * In this tutorial we are going to show how we can put all these concepts * together to impliment a newtons method. Newtons method if defined as * @f{equation}{x = x - \frac{f\left(x\right)}{\frac{\partial}{\partial x}f\left(x\right)}@f} diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index b822a2b..e120ba2 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -794,6 +794,7 @@ void bin_power(const commandline::parser &cl, //------------------------------------------------------------------------------ /// @page xrays_commandline xrays Command Line Arguments +/// @brief Command Line Arguments for the xrays RF Ray tracing code. /// @tableofcontents /// /// @section xrays_commandline_intro Introduction diff --git a/graph_framework/absorption.hpp b/graph_framework/absorption.hpp index 5dca67d..1484a30 100644 --- a/graph_framework/absorption.hpp +++ b/graph_framework/absorption.hpp @@ -13,6 +13,7 @@ #include "newton.hpp" #include "output.hpp" +/// Namespace for power absorption models. namespace absorption { //****************************************************************************** // Base class diff --git a/graph_framework/backend.hpp b/graph_framework/backend.hpp index 0ad9222..c95b65d 100644 --- a/graph_framework/backend.hpp +++ b/graph_framework/backend.hpp @@ -15,6 +15,7 @@ #include "special_functions.hpp" #include "register.hpp" +/// Name space for backend buffers. namespace backend { //****************************************************************************** // Data buffer. diff --git a/graph_framework/commandline_parser.hpp b/graph_framework/commandline_parser.hpp index d400142..17b5795 100644 --- a/graph_framework/commandline_parser.hpp +++ b/graph_framework/commandline_parser.hpp @@ -11,6 +11,7 @@ #include #include +/// Name space for the command line parsing. namespace commandline { /// Lock to syncronize netcdf accross threads. static std::mutex sync; diff --git a/graph_framework/dispersion.hpp b/graph_framework/dispersion.hpp index c28ea4a..d532752 100644 --- a/graph_framework/dispersion.hpp +++ b/graph_framework/dispersion.hpp @@ -6,6 +6,7 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// @page dispersion_function Dispersion Functions +/// @brief Dispersion function documentation for the xrays RF Ray tracing code. /// @tableofcontents /// /// @section dispersion_function_intro Introduction @@ -27,7 +28,7 @@ /// @f$k_{B}@f$ @f$\frac{J}{K}@f$Boltzmann constant /// @f$\omega_{pe}@f$ @f$s^{-1}@f$ Electron Plasma Frequency @f$\omega_{pe}=\frac{n_{e}q^{2}}{\epsilon_{0}m_{e}c}@f$ /// @f$\omega_{ce}@f$ @f$s^{-1}@f$ Electron Cyclotron Frequency @f$\omega_{ce}=\frac{q\left|\vec{B}\right|}{m_{e}}@f$ -/// @f$\omega_{h} @f$s^{-1}@f$ Upper Hybrid Frequency @f$\omega_{h}^{s}=\omega_{pe}^{2}+\omega_{ce}^{2}@f$ +/// @f$\omega_{h}@f$ @f$s^{-1}@f$ Upper Hybrid Frequency @f$\omega_{h}^{s}=\omega_{pe}^{2}+\omega_{ce}^{2}@f$ /// @f$v_{th}@f$ @f$\frac{m}{s}@f$Thermal velocity @f$v_{th}=\sqrt{\frac{k_{B}t_{e}}{m_{e}}}@f$ /// @f$\vec{n}@f$ @f$1 @f$ @f$n=\frac{\vec{k}c}{\omega}@f$ /// @@ -59,6 +60,7 @@ /// propagate. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\omega_{pe}+\frac{3}{2}\vec{k}\cdot\vec{k}v^{2}_{th}-\omega^{2}\equiv 0 @f} /// It has no resonances or cutoffs. But @f$v_{g}@f$ can never exceed @f$v_{th}@f$. +/// @image{} html bohm-gross.png "" /// /// @subsection dispersion_function_ordinary_wave Ordinary Wave /// This disperison function represents a wave with a @@ -66,17 +68,20 @@ /// parallel to the magnetic field. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega^{2}_{pe}}{\omega^{2}}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} /// This wave is cut off below @f$\omega_{pe}@f$. +/// @image{} html O-Mode.png "" /// /// @subsection dispersion_function_extra_ordinary_wave Extra Ordinary Wave /// This disperison function represents a wave in a vaccume. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega_{pe}^2}{\omega^{2}}\frac{\omega^{2}-\omega_{pe}^2}{\omega^{2}-\omega_{h}^2}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} /// This mode has /// It has no resonances or cutoffs. +/// @image{} html X-Mode.png "" /// /// @subsection dispersion_function_cold_plasma Cold Plasma /// This disperison function represents a wave in a vaccume. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\equiv 0 @f} /// It has no resonances or cutoffs. +/// @image{} html ColdPlasma.png "" /// //------------------------------------------------------------------------------ @@ -86,6 +91,7 @@ #include "newton.hpp" #include "equilibrium.hpp" +/// Name space for dispersion functions. namespace dispersion { //****************************************************************************** // Z Function interface. diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index 1419ab9..cd11da1 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -5,6 +5,7 @@ /// Defined the interfaces to access plasma equilibrium. //------------------------------------------------------------------------------ /// @page equilibrum_models Equilibrium Models +/// @brief Documentation for formatting equilibrium files. /// @tableofcontents /// /// @section equilibrum_models_intro Introduction @@ -167,6 +168,7 @@ #include "arithmetic.hpp" #include "newton.hpp" +/// Name space for equilibrium models. namespace equilibrium { /// Lock to syncronize netcdf accross threads. static std::mutex sync; diff --git a/graph_framework/jit.hpp b/graph_framework/jit.hpp index e6a01d4..c22bb79 100644 --- a/graph_framework/jit.hpp +++ b/graph_framework/jit.hpp @@ -37,6 +37,7 @@ #define END_GPU #endif +/// Name space for JIT functions. namespace jit { //------------------------------------------------------------------------------ /// @brief Class for JIT compile of the GPU kernels. diff --git a/graph_framework/metal_context.hpp b/graph_framework/metal_context.hpp index 694a765..c5c980d 100644 --- a/graph_framework/metal_context.hpp +++ b/graph_framework/metal_context.hpp @@ -14,6 +14,7 @@ #include "random.hpp" +/// Name space for GPU backends. namespace gpu { //------------------------------------------------------------------------------ /// @brief Class representing a metal gpu context. diff --git a/graph_framework/node.hpp b/graph_framework/node.hpp index c4615c8..99de48f 100644 --- a/graph_framework/node.hpp +++ b/graph_framework/node.hpp @@ -16,6 +16,7 @@ #include "backend.hpp" +/// Name space for graph nodes. namespace graph { //****************************************************************************** // Base leaf node. diff --git a/graph_framework/output.hpp b/graph_framework/output.hpp index 8bc8bc1..4b7184f 100644 --- a/graph_framework/output.hpp +++ b/graph_framework/output.hpp @@ -12,6 +12,7 @@ #include "jit.hpp" +/// Name space for output files. namespace output { /// Lock to syncronize netcdf accross threads. static std::mutex sync; diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index de5210c..a8bb2ee 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -13,6 +13,7 @@ #include "dispersion.hpp" #include "output.hpp" +/// Name space for solvers. namespace solver { //****************************************************************************** // Solver interface. diff --git a/graph_framework/special_functions.hpp b/graph_framework/special_functions.hpp index 318f9ae..3350770 100644 --- a/graph_framework/special_functions.hpp +++ b/graph_framework/special_functions.hpp @@ -37,6 +37,7 @@ using complex_type = std::complex; #endif +/// Name space for special functions. namespace special { /// I constant. diff --git a/graph_framework/timing.hpp b/graph_framework/timing.hpp index 933a8a6..0c67942 100644 --- a/graph_framework/timing.hpp +++ b/graph_framework/timing.hpp @@ -10,6 +10,7 @@ #include #include +/// Name space for timers. namespace timeing { //------------------------------------------------------------------------------ /// @brief A timing object. diff --git a/graph_framework/workflow.hpp b/graph_framework/workflow.hpp index 90d5735..8412559 100644 --- a/graph_framework/workflow.hpp +++ b/graph_framework/workflow.hpp @@ -10,6 +10,7 @@ #include "jit.hpp" +/// Name space for workflows. namespace workflow { //------------------------------------------------------------------------------ /// @brief Class representing a workitem. -- GitLab From 3b3e963a4c3a860a39e3d069192a80d648205133 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Wed, 27 Aug 2025 18:46:55 -0400 Subject: [PATCH 04/12] Tweak formatting for readability and add more cross references. Add example for adding new equilibria. Complete the disperison functions. Add section on absorption models. Add section on solvers. Add example command line arguments. Document xays output files. --- graph_docs/compiling.dox | 55 ++++++--- graph_docs/general.dox | 64 ++++++---- graph_docs/main.dox | 9 +- graph_docs/tutorial.dox | 4 + graph_driver/xrays.cpp | 211 ++++++++++++++++++++++++-------- graph_framework/absorption.hpp | 51 +++++++- graph_framework/dispersion.hpp | 47 +++++-- graph_framework/equilibrium.hpp | 55 ++++++++- graph_framework/solver.hpp | 74 ++++++++++- 9 files changed, 456 insertions(+), 114 deletions(-) diff --git a/graph_docs/compiling.dox b/graph_docs/compiling.dox index 4a9fd63..99d4a04 100644 --- a/graph_docs/compiling.dox +++ b/graph_docs/compiling.dox @@ -7,6 +7,7 @@ * This page details the cmake based build * system. * + *
* @section build_system_user User Guide * The following section is for users of framework. * @@ -68,14 +69,22 @@ * are various options for configuing LLVM and can be ignored. The important * options are listed below. * - * * CMAKE_BUILD_TYPE Switch between Release, Debug, MinSizeRel, RelWithDebInfo - * * USE_VERBOSE Show verbose information about compute kernels. - * * BUILD_C_BINDING Generate the C langauge interface. - * * BUILD_Fortran_BINDING Generate the Fortran language interface. - * * USE_METAL Enable the Metal backend (macOS only). - * * USE_CUDA Enable the Cuda backend (Linux only). - * * USE_HIP Enable the Hip backend (Linux only, Hip branch). - * * USE_SSH Use ssh for git instead of html. + * + * + *
Build options for users.
Option Discrption + *
CMAKE_BUILD_TYPE Switch between + * * Release + * * Debug + * * MinSizeRel + * * RelWithDebInfo + *
USE_VERBOSE Show verbose information about compute kernels. + *
BUILD_C_BINDING Generate the C langauge interface. + *
BUILD_Fortran_BINDINGGenerate the Fortran language interface. + *
USE_METAL Enable the Metal backend (macOS only). + *
USE_CUDA Enable the Cuda backend (Linux only). + *
USE_HIP Enable the Hip backend (Linux only, Hip branch). + *
USE_SSH Use ssh for git instead of html. + *
* * NOTE:macOS uses will need to change the default option for * CMAKE_CXX_COMPILER to clang++. This is due to the way the @@ -127,6 +136,7 @@ * Like the parallel build the -jnum_processes option determines * number of parallel instances to run. * + *
* @section build_system_dev Developer Guide * This section covers information for developers of the framework itself. * @@ -194,16 +204,21 @@ * that can be enabled. * * @subsubsection build_system_dev_options Build system Options - * * USE_PCH Use precomiled headers during computation. Most users should keep this on. - * * SAVE_KERNEL_SOURCE Option to dump the generated compute kernel source code to disk. - * * USE_INPUT_CACHE Option to cache registers for the kernel arguments. - * * USE_CONSTANT_CACHE Option to use registers to cache constant values otherwise constanst are inlined. - * * SHOW_USE_COUNT Generates information on the number of times a register is used. - * * USE_INDEX_CACHE Option to use registers to cache array indicies. - * * SANITIZE_ADDRESS Use address sanitizer debugging option. - * * SANITIZE_LEAK Use leak sanitizer debugging option. - * * SANITIZE_MEMORY Use memory sanitizer debugging option. - * * SANITIZE_THREAD Use thread sanitizer debugging option. - * * SANITIZE_UNDEFINED Use undefined sanitizer debugging option. - * * SANITIZE_FLOAT-DIVIDE-BY-ZERO Use float-divide-by-zero sanitizer debugging option. + * + * + *
Build options for developers.
Option Discrption + *
USE_PCH Use precomiled headers during computation. Most users should keep this on. + *
SAVE_KERNEL_SOURCE Option to dump the generated compute kernel source code to disk. + *
USE_INPUT_CACHE Option to cache registers for the kernel arguments. + *
USE_CONSTANT_CACHE Option to use registers to cache constant values otherwise constanst are inlined. + *
SHOW_USE_COUNT Generates information on the number of times a register is used. + *
USE_INDEX_CACHE Option to use registers to cache array indicies. + *
Sanitizer Flags + *
SANITIZE_ADDRESS Use address sanitizer debugging option. + *
SANITIZE_LEAK Use leak sanitizer debugging option. + *
SANITIZE_MEMORY Use memory sanitizer debugging option. + *
SANITIZE_THREAD Use thread sanitizer debugging option. + *
SANITIZE_UNDEFINED Use undefined sanitizer debugging option. + *
SANITIZE_FLOAT-DIVIDE-BY-ZEROUse float-divide-by-zero sanitizer debugging option. + *
*/ diff --git a/graph_docs/general.dox b/graph_docs/general.dox index 02c8555..2ec127d 100644 --- a/graph_docs/general.dox +++ b/graph_docs/general.dox @@ -5,29 +5,35 @@ * @section general_concepts_introduction Introduction * This page documents general concepts of the graph_framework. * - * @section general_concepts_definitions Definitions. - * * node A leaf or branch on the graph tree. - * * graph A data stucture connecting leaf nodes. - * * reduce A tranformation of the graph to remove leaf_nodes. - * * auto differentiation A tranformation of the graph build derivatives. - * * compiler A tool for translating from one language to another. - * * JIT Just-in-time compile. - * * kernel A code function that runs on a batch of data. - * * pre_item A kernel to run before running the main kernels. - * * work_iten A instance of kernel. - * * converge_item A kernel that is run until a convergence test is met. - * * workflow A series of work items. - * * backend The device the kernel is run on. - * * recursion See definition of recursion. - * * safe math Run time checks to avoid off normal conditions. - * * API Application programming interface. - * * Host The place where kernels are launched from. - * * Device The device side where kernels are run. + * @section general_concepts_definitions Definitions + * + * + *
Glossery of terms
Concept Definition + *
node A leaf or branch on the graph tree. + *
graph A data stucture connecting leaf nodes. + *
reduce A tranformation of the graph to remove leaf_nodes. + *
auto differentiationA tranformation of the graph build derivatives. + *
compiler A tool for translating from one language to another. + *
JIT Just-in-time compile. + *
kernel A code function that runs on a batch of data. + *
pre_item A kernel to run before running the main kernels. + *
work_iten A instance of kernel. + *
converge_item A kernel that is run until a convergence test is met. + *
workflow A series of work items. + *
backend The device the kernel is run on. + *
recursion See definition of recursion. + *
safe math Run time checks to avoid off normal conditions. + *
API Application programming interface. + *
Host The place where kernels are launched from. + *
Device The device side where kernels are run. + *
* + *
* @section general_concepts_graph Graph * The graph_framework operates by building tree structure of math operations. - * In tree form it is easy to traverse nodes in the graph. Take the example of - * equation of a line. + * For an example of building expression structures see the + * @ref tutorial_expression "basic expressions tutroial". In tree form it is + * easy to traverse nodes in the graph. Take the example of equation of a line. * @f{equation}{y=mx + b@f} * This equation consists of five leaf nodes. The ends of the tree are clasified * as either variables @f$x@f$ or constants @f$m,b@f$. These leaf_nodes are @@ -45,14 +51,16 @@ * Evaluation is repeated until every node in the graph is evaluated. * @image{} html line_graph_eval_final.png "" * + *
* @section general_concepts_diff Auto Differentiation * From the previous @ref general_concepts_graph "section", it was shown how * graph can be evaluated. This same evaluation can be applied to build - * graphs of a function derivative. Lets say that we want to take the derivative - * of @f$\frac{\partial y}{\partial x}@f$. This is achieved by evaluating the - * until bottom left most leaf_node is reached. Then a new graph is build - * starting with @f$\frac{\partial m}{\partial x}=0@f$. Applying the first half - * of the chain rule we build a new graph for @f$0x@f$ + * graphs of a function derivative. For an example of taking derivatives see the + * @ref tutorial_derivatives "auto differentiation tutroial". Lets say that we + * want to take the derivative of @f$\frac{\partial y}{\partial x}@f$. This is + * achieved by evaluating the until bottom left most leaf_node is reached. Then + * a new graph is build starting with @f$\frac{\partial m}{\partial x}=0@f$. + * Applying the first half of the chain rule we build a new graph for @f$0x@f$ * @image{} html line_graph_dydf1.png "" * Then we take the derivative of the right operand and apply the second half * of the chain rule to build a new graph for @f$0x=0@f$. @@ -60,6 +68,7 @@ * Evaluation is repeated recursively until the full graph has been evaluated. * @image{} html line_graph_dydf_final.png "" * + *
* @section general_concepts_reduction Reduction * The final expression for @f$\frac{\partial y}{\partial x}@f$ contains many * unnecessary nodes in the graph. Instead of building full graphs, we can @@ -71,8 +80,11 @@ * @image{} html line_graph_reduce_final.png "" * By reducing graphs as they are build, we can eliminate nodes one by one. * + *
* @section general_concepts_compile Compile * Once graph expressions are build, they can be compiled to a compute kernel. + * For an example of compiling expression trees into kernels see the + * @ref tutorial_workflow "workflow tutroial". * Using the same recursive evaluation, we can visit each node of a graph and * and create a line of kernel source code. There are three important parts for * creating kernels, inputs, outputs, and maps. These three concepts define @@ -101,10 +113,12 @@ * @f$y + \frac{\partial f}{\partial x}@f$ * can be mapped to update @f$y@f$. * + *
* @section general_concepts_workflow Workflows * Sequences of kernels are evaluated in workflow. A workflow is defined from * workitems which wrap a kernel call. * + *
* @section general_concepts_safe_math Safe Math * There are some conditions where mathematically, a graph should evaluate to * normal number. However, when evaluted suing floating point precison, can lead diff --git a/graph_docs/main.dox b/graph_docs/main.dox index 702c634..293e59e 100644 --- a/graph_docs/main.dox +++ b/graph_docs/main.dox @@ -19,21 +19,28 @@ * * Enable Auto Differentiation. * * Enable easy embedding in C, C++, and Fortran codes. * + *
* @section tools User guides for tools * @subsection rf_ray_tracing RF Ray tracing * This section covers user guides to run the RF Ray traceing code. To run this * code, a use selects an equilibrium, a wave distribution function, a solver - * method, intial ray conditions, and a power obsorption model. + * method, intial ray conditions, and a power obsorption model. To run an + * example follow the instructions for the @ref xrays_commandline_example. * * * @ref equilibrum_models * * @ref dispersion_function + * * @ref solvers + * * @ref absorption_model * * @ref xrays_commandline + * * @ref xrays_output * + *
* @section framework_user Framework user guides * * @ref build_system "Compiling the framework." * * @ref general_concepts "General concepts." * * @ref tutorial "Tutorial" * + *
* @section framework_developer Framework developer guides * * @ref build_system "Build system." * * Code structure diff --git a/graph_docs/tutorial.dox b/graph_docs/tutorial.dox index 023d377..a3b66b3 100644 --- a/graph_docs/tutorial.dox +++ b/graph_docs/tutorial.dox @@ -50,6 +50,7 @@ int main(int argc, const char * argv[]) { * Concept for * valid types of floating point types allowed by the framework. * + *
* @section tutorial_basic Basic Nodes * The graph_framework is built around applying the same equations to a large * ensemble. Ensembles are defined from variables. All variables need to have @@ -98,6 +99,7 @@ void run_tutorial() { * impicit constant was defined for b. Node in the implicit case, the * actual node for b is not created until we use it in an expression. * + *
* @section tutorial_expression Basic Expressions * Finally lets create our equation of a line @f$y=mx+b@f$ and generate the * @f$\LaTeX@f$ expression for it. @@ -152,6 +154,7 @@ auto dydb = y->df(m*x); @endcode * The respective results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. * + *
* @section tutorial_workflow Making workflow. * In this section we will build workflow from these nodes we created. For * simplicity we will decrease the number of elements in variable so we can set @@ -301,6 +304,7 @@ for (size_t i = 0; i < 10; i++) { 1.0001 @endcode * + *
* @section tutorial_workflow_newton Newtons Method. * In this tutorial we are going to show how we can put all these concepts * together to impliment a newtons method. Newtons method if defined as diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index e120ba2..b2d8bad 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -806,77 +806,146 @@ void bin_power(const commandline::parser &cl, /// /// @section xrays_commandline_args Command Options /// -///
Command Values Discription -///
General Options -///
@code --help @endcode Display help text -///
@code --verbose @endcode Show verbose output about kernel information. -///
@code --print_expressions @endcode Render ray equations as @f$\LaTeX@f$ expressions. -///
@code --print @endcode Display a sample of ray progress to the screen. -///
@code --seed @endcode Use a fixed random seed. -///
Control Options -///
@code --num_times @endcode Positive Integer Total number of time steps to run. -///
@code --sub_steps @endcode Positive Integer Number of steps to run between outputs. -///
@code --num_rays @endcode Positive Integer Total number rays to run. -///
@code --endtime @endcode Positive Number Total time to trace the ray to. -///
Ray Initialization Options +///
Command Values Discription +///
General Options +///
@code --help @endcode Display help text +///
@code --verbose @endcode Show verbose output about kernel information. +///
@code --print_expressions @endcode Render ray equations as @f$\LaTeX@f$ expressions. +///
@code --print @endcode Display a sample of ray progress to the screen. +///
@code --seed @endcode Use a fixed random seed. +///
Control Options +///
@code --num_times @endcode Positive Integer Total number of time steps to run. +///
@code --sub_steps @endcode Positive Integer Number of steps to run between outputs. +///
@code --num_rays @endcode Positive Integer Total number rays to run. +///
@code --endtime @endcode Positive Number Total time to trace the ray to. +///
Ray Initialization Options ///
@code --init_w_dist @endcode /// * uniform -/// * normal Distribution function for wave frequency. -///
@code --init_w_mean @endcode Positive Number Mean value for the wave frequency distribution function. -///
@code --init_w_sigma @endcode Positive Number Standard deviation of for the wave frequency distribution function. +/// * normal Distribution function for wave frequency. +///
@code --init_w_mean @endcode Positive Number Mean value for the wave frequency distribution function. +///
@code --init_w_sigma @endcode Positive Number Standard deviation of for the wave frequency distribution function. ///
@code --init_kx_dist @endcode /// * uniform -/// * normal Distribution function for wave number in the x direction. -///
@code --init_kx @endcode Solve for initial wave number in the x direction position. -///
@code --init_kx_mean @endcode Positive Number Mean value for the wave number in the x direction distribution function. -///
@code --init_kx_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. +/// * normal Distribution function for wave number in the x direction. +///
@code --init_kx @endcode Solve for initial wave number in the x direction position. +///
@code --init_kx_mean @endcode Positive Number Mean value for the wave number in the x direction distribution function. +///
@code --init_kx_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. ///
@code --init_ky_dist @endcode /// * uniform -/// * normal Distribution function for wave number in the y direction. -///
@code --init_ky @endcode Solve for initial wave number in the y direction position. -///
@code --init_ky_mean @endcode Positive Number Mean value for the wave number in the y direction distribution function. -///
@code --init_ky_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. +/// * normal Distribution function for wave number in the y direction. +///
@code --init_ky @endcode Solve for initial wave number in the y direction position. +///
@code --init_ky_mean @endcode Positive Number Mean value for the wave number in the y direction distribution function. +///
@code --init_ky_sigma @endcode Positive Number Standard deviation of for the wave number in the y direction distribution function. ///
@code --init_kz_dist @endcode /// * uniform -/// * normal Distribution function for wave number in the z direction. -///
@code --init_kz @endcode Solve for initial wave number in the z direction position. -///
@code --init_kz_mean @endcode Positive Number Mean value for the wave number in the z direction distribution function. -///
@code --init_kz_sigma @endcode Positive Number Standard deviation of for the wave number in the z direction distribution function. +/// * normal Distribution function for wave number in the z direction. +///
@code --init_kz @endcode Solve for initial wave number in the z direction position. +///
@code --init_kz_mean @endcode Positive Number Mean value for the wave number in the z direction distribution function. +///
@code --init_kz_sigma @endcode Positive Number Standard deviation of for the wave number in the z direction distribution function. ///
@code --init_x_dist @endcode /// * uniform -/// * normal Distribution function for ray x position. -///
@code --init_x_mean @endcode Positive Number Mean value for the ray x position distribution function. -///
@code --init_x_sigma @endcode Positive Number Standard deviation of for the ray x position distribution function. +/// * normal Distribution function for ray x position. +///
@code --init_x_mean @endcode Positive Number Mean value for the ray x position distribution function. +///
@code --init_x_sigma @endcode Positive Number Standard deviation of for the ray x position distribution function. ///
@code --init_y_dist @endcode /// * uniform -/// * normal Distribution function for ray y position. -///
@code --init_y_mean @endcode Positive Number Mean value for the ray y position distribution function. -///
@code --init_y_sigma @endcode Positive Number Standard deviation of for the ray y position distribution function. +/// * normal Distribution function for ray y position. +///
@code --init_y_mean @endcode Positive Number Mean value for the ray y position distribution function. +///
@code --init_y_sigma @endcode Positive Number Standard deviation of for the ray y position distribution function. ///
@code --init_z_dist @endcode /// * uniform -/// * normal Distribution function for ray z position. -///
@code --init_z_mean @endcode Positive Number Mean value for the ray z position distribution function. -///
@code --init_z_sigma @endcode Positive Number Standard deviation of for the ray z position distribution function. -///
@code --use_cyl_xy @endcode Use cylindical coordinates for x and y. -///
Ray Tracing Physics Options +/// * normal Distribution function for ray z position. +///
@code --init_z_mean @endcode Positive Number Mean value for the ray z position distribution function. +///
@code --init_z_sigma @endcode Positive Number Standard deviation of for the ray z position distribution function. +///
@code --use_cyl_xy @endcode Use cylindical coordinates for x and y. +///
Ray Tracing Physics Options ///
@code --equilibrium @endcode -/// * efit -/// * vmec Equilibrium to use. +/// * @ref equilibrum_efit "efit" +/// * @ref equilibrum_vmec "vmec" Equilibrium to use. +///
@code --equilibrium_file @endcode Path to @ref equilibrum_models "equilibrium file" Equilibrium file path. ///
@code --dispersion @endcode -/// * simple -/// * bohm_gross -/// * ordinary_wave -/// * extra_ordinary_wave -/// * code_plasma Wave disperion function to trace rays from. +/// * @ref dispersion_function_simple "simple" +/// * @ref dispersion_function_bohm_gross "bohm_gross" +/// * @ref dispersion_function_o_wave "ordinary_wave" +/// * @ref dispersion_function_x_wave "extra_ordinary_wave" +/// * @ref dispersion_function_cold_plasma "code_plasma" Wave disperion function to trace rays from. ///
@code --absorption_model @endcode -/// * root_find -/// * weak_damping Power absoption model to use. +/// * @ref absorption_model_root "root_find" +/// * @ref absorption_model_root "weak_damping" Power absoption model to use. ///
@code --solver @endcode -/// * split_simplextic -/// * rk2 -/// * rk4 -/// * adaptive_rk4 Method used to solve the equation. +/// * @ref solvers_split_simplextic "split_simplextic" +/// * @ref solvers_rk2 "rk2" +/// * @ref solvers_rk4 "rk4" +/// * @ref solvers_adaptive_rk4 "adaptive_rk4" Method used to solve the equation. ///
+/// +///
+/// @section xrays_commandline_example Example commandline +/// Take the example command line +/// @code +/// ./graph_driver/xrays --absorption_model=weak_damping --dispersion=ordinary_wave --endtime=2.0 --equilibrium=efit --equilibrium_file=../graph_tests/efit.nc --init_kx --init_kx_mean=-700.0 --init_ky_dist=normal --init_ky_mean=-100.0 --init_ky_sigma=10.0 --init_kz_dist=normal --init_kz_mean=0.0 --init_kz_sigma=10.0 --init_w_dist=normal --init_w_mean=700 --init_w_sigma=10.0 --init_x_mean=2.5 --init_y_dist=normal --init_y_mean=0.0 --init_y_sigma=0.05 --init_z_dist=normal --init_z_mean=0.0 --init_z_sigma=0.05 --num_rays=100000 --num_times=100000 --solver=rk4 --sub_steps=100 --use_cyl_xy --verbose +/// @endcode +/// This example should be run from the build directory. +/// +/// The options +/// @code +/// --num_rays=100000 --num_times=100000 --sub_steps=100 --verbose +/// @endcode +/// In this example, we will run a 100000 rays for 100000 steps and output +/// every 100th step. This is also the provides verbose output of the kernel +/// information. +/// +/// @code +/// --endtime=2.0 --init_w_mean=700 +/// @endcode +/// Time and frequency are input in +/// @ref dispersion_function_normal "modified units". +/// +/// +///
Conversion between input and real units.
Value Input ValueReal Unit +///
@f$\omega @f$700 @f$\frac{700}{c}@f$ @f$\frac{rad}{s}@f$ +///
@f$t @f$ 2.0 @f$2.0c @f$ @f$s @f$ +///
+/// +/// @subsection xrays_commandline_example_dist Ray intialization. +/// @code +/// --init_x_mean=2.5 --init_y_dist=normal --init_y_mean=0.0 --init_y_sigma=0.05 --init_z_dist=normal --init_z_mean=0.0 --init_z_sigma=0.05 --use_cyl_xy +/// @endcode +/// Inital values for the position for @f$y @f$ and @f$z @f$ will be sampled +/// from a normal distribution fuction. Both values have a mean of zero and as +/// standard devation of 0.05. @f$x @f$ is initalized with a uniform value of +/// 2.5. We also set the command to use cylindical coordinates. So +/// @f$xyz\rightarrow r\phi z @f$. +/// +/// @code +/// --init_w_dist=normal --init_w_mean=700 --init_w_sigma=10.0 +/// @endcode +/// Frequency uses a normal distribution with a mean of 700 and a standard +/// deviation of 10. +/// +/// @code +/// --init_kx --init_kx_mean=-700.0 --init_ky_dist=normal --init_ky_mean=-100.0 --init_ky_sigma=10.0 --init_kz_dist=normal --init_kz_mean=0.0 --init_kz_sigma=10.0 +/// @endcode +/// Inital values for @f$k_{y}@f$ and @f$k_{z}@f$ will be sampled from a normal +/// distribution fuction. Both of them have a standard deviation of 10. +/// @f$k_{y}@f$ has a mean of 100 and @f$k_{z}@f$ has zero mean. +/// @f$k_{x}@f$ uses the default uniform value of 100. However, it +/// configured to solve for the a @f$k_{x}@f$ which satisfies the dispersion +/// function given the values of @f$\omega,k_{y},k_{z},\vec{x}@f$. +/// +/// @subsection xrays_commandline_example_model Ray Models. +/// @code +/// --equilibrium=efit --equilibrium_file=../graph_tests/efit.nc +/// @endcode +/// We are using a @ref equilibrum_efit "EFIT" equilibirum with values +/// initalized from ../graph_tests/efit.nc. +/// +/// @code +/// --absorption_model=weak_damping --dispersion=ordinary_wave--solver=rk4 +/// @endcode +/// It uses the @ref dispersion_function_o_wave "o-mode" dispersion function. +/// Rays are integrated using a @ref solvers_rk4 integrator. Power absorption +/// uses the @ref absorption_model_damping Model. //------------------------------------------------------------------------------ /// @brief Setup and parse commandline options. /// @@ -967,6 +1036,44 @@ commandline::parser parse_commandline(int argc, const char * argv[]) { return cl; } +//------------------------------------------------------------------------------ +/// @page xrays_output xrays Output File +/// @brief Result file format for the traced rays. +/// @tableofcontents +/// +/// @section xrays_output_intro Introduction +/// The results of ray tracing are saved in several NetCDF files depending on +/// how many devices were found. The files have the name format of +/// resultn.nc. +/// +/// @section xrays_output_format File Format +/// The result file contains the following information. Note that to allow for +/// complex values, we add an extra dimension the end of 2D arrays. For real +/// values this dimension has size one while complex values have space for the +/// real and imaginary part. +/// +/// +///
Result file quantities
Dimensions +///
Name Discription +///
time Size of time dimension. +///
num_rays Local number of rays for the device. +///
ray_dim Size of the dimension for quanties. (1 Real, 2 Complex) +///
ray_dim_cplx Size of the dimension for complex quantities (Real, Imagine). +///
2D Qantities +///
Name Dimensions Discription +///
d_power (time,num_rays,ray_dim) Change in power. +///
kamp (time,num_rays,ray_dim_cplx)@f$\sqrt{\vec{k}\cdot\vec{k}}@f$ +///
kx (time,num_rays,ray_dim) Wave number in @f$\hat{x}@f$ direction. +///
ky (time,num_rays,ray_dim) Wave number in @f$\hat{y}@f$ direction. +///
kz (time,num_rays,ray_dim) Wave number in @f$\hat{z}@f$ direction. +///
power (time,num_rays,ray_dim) Wave power. +///
residule(time,num_rays,ray_dim) Dispersion function residule. +///
time (time,num_rays,ray_dim) Time +///
w (time,num_rays,ray_dim) Wave frequency. +///
x (time,num_rays,ray_dim) Position in @f$\hat{x}@f$ direction. +///
y (time,num_rays,ray_dim) Position in @f$\hat{y}@f$ direction. +///
z (time,num_rays,ray_dim) Position in @f$\hat{z}@f$ direction. +///
//------------------------------------------------------------------------------ /// @brief Main program of the driver. /// diff --git a/graph_framework/absorption.hpp b/graph_framework/absorption.hpp index 1484a30..08586ac 100644 --- a/graph_framework/absorption.hpp +++ b/graph_framework/absorption.hpp @@ -4,7 +4,56 @@ /// /// Defines functions for computing power absorbtion. //------------------------------------------------------------------------------ - +//------------------------------------------------------------------------------ +/// @page absorption_model Absoption Models +/// @brief A discription of the models for power absorption. +/// @tableofcontents +/// +/// @section absorption_model_intro Introduction +/// This page documents the types of dispersion functions available. Tracing +/// the ray is only the first step in the process. Along that ray power is +/// deposited into the plasma. For tracing the ray we assumed the wave number +/// was always real. However now we need to figure out what the imaginary +/// component is. +/// +///
+/// @subsection absorption_model_hot Hot Plasma Disperison Function +/// To do this we know assume a hot plasma dispersion function. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=i\sigma\Gamma_{0}+\Gamma_{1}+\vec{n}_{\perp}\cdot\vec{n}_{\perp}\frac{P\omega}{\omega_{ce}}\left(1+\zeta Z\left(\zeta\right)\right)\left(\Gamma_{2} + \Gamma_{5}F\right)\equiv 0 @f} +/// Where +/// @f{equation}{\Gamma_{0}=\vec{n}_{\perp}\cdot\vec{n}_{\perp}\left(\vec{n}\cdot\vec{n}-2\left(1-2q\right)\right)+\left(1-P\right)\left(2\left(1-2q\right)-\left(\vec{n}\cdot\vec{n}+n_{||}^{2}\right)\right)@f} +/// @f{equation}{\Gamma_{1}=\vec{n}_{\perp}\cdot\vec{n}_{\perp}\left(\left(1-q\right)\vec{n}\cdot\vec{n}-(1-2q)\right)+\left(1-P\right)\left(\vec{n}\cdot\vec{n}n^{2}_{||} - \left(1-q\right)\left(\vec{n}\cdot\vec{n}+n^{2}_{||}\right)+\left(1-2q\right)\right)@f} +/// @f{equation}{\Gamma_{2}=\left(\vec{n}\cdot\vec{n}-\left(1-2q\right)\right)+\frac{P\omega}{4\omega_{ce}n^{2}_{||}}\left(\left(\vec{n}\cdot\vec{n} + n^{2}_{||}\right)-2\left(1-2q\right)\right)@f} +/// @f{equation}{\Gamma_{5}=\vec{n}\cdot\vec{n}n^{2}_{||}-\left(1-q\right)\left(\vec{n}\cdot\vec{n}+n^{2}_{||}\right)+\left(1-2q\right)@f} +/// @f{equation}{i\sigma=\frac{PZ\left(\zeta\right)}{2n_{||}v_{e}}@f} +/// @f{equation}{\zeta=\frac{1-\frac{\omega_{ce}}{\omega}}{n_{||}\frac{v_{e}}{c}}@f} +/// @f{equation}{F=\frac{v_{e}\left(1+\zeta Z\left(\zeta\right)\right)\omega}{2n_{||}\omega_{ce}}@f} +/// @f{equation}{P=\frac{\omega^{2}_{pe}}{\omega^{2}}@f} +/// @f{equation}{q=\frac{P}{2\left(1+\frac{\omega_{ce}}{\omega}\right)}@f} +/// @f{equation}{v_{e}=\sqrt{2n_{e}\frac{t_{e}}{m_{e}}}@f} +/// @f{equation}{Z\left(\zeta\right)=-\sqrt{\pi}e^{-\zeta^{s}}\left(efri\left(\zeta\right)-i\right)@f} +/// Where @f$efri\left(\zeta\right)@f$ is the imaginary error function. +/// +/// @subsubsection absorption_model_hotexpand Expansion Terms +/// The hot plasma dispersion function can be split to a hot plasma term and a +/// cold plasma term. +/// @f{equation}{D_{c}\left(\vec{x},\vec{k},\omega\right)=-\frac{P}{2}\left(1+\frac{\omega_{ce}}{\omega}\Gamma_{0}+\left(1-\frac{\omega^{2}_{ce}}{\omega^{2}}\Gamma_{1}\right)\right)@f} +/// Then the hot plasma term is +/// @f{equation}{D_{h}\left(\vec{x},\vec{k},\omega\right)=-\left(1+\frac{\omega_{ce}}{\omega}\right)n_{||}\frac{v_{e}}{c}\left(\Gamma_{1}+\Gamma_{2}+\frac{\vec{n}_{\perp}\cdot\vec{n}_{\perp}}{2n^{2}_{||}}\frac{\omega^{2}}{\omega^{2}_{ce}}\frac{v_{e}}{c}\zeta\Gamma_{5}\right)\left(\frac{1}{Z\left(\zeta\right)}+\zeta\right)@f} +/// +///
+/// @section absorption_model_root Root Find +/// One way to solve for the imaginary component is to locate the root of the +/// hot plasma dispersion function using the cold plasma solution as an intial +/// quess. We start by redefining @f$\vec{k}=k_{amp}\hat{k}@f$ now we can solve +/// for the complex value of @f$k_{amp}@f$ using a +/// @ref solver::newton "Newton method". +/// +///
+/// @section absorption_model_damping Weak Damping +/// Using the cold and hot expansion +/// @f{equation}{k_{amp}=\sqrt{\vec{k}\cdot\vec{k}}-\frac{D_{h}}{\hat{k}\cdot\frac{\partial D_{c}}{\partial \vec{k}}}@f} +//------------------------------------------------------------------------------ #ifndef absorption_h #define absorption_h diff --git a/graph_framework/dispersion.hpp b/graph_framework/dispersion.hpp index d532752..306ff1d 100644 --- a/graph_framework/dispersion.hpp +++ b/graph_framework/dispersion.hpp @@ -10,10 +10,10 @@ /// @tableofcontents /// /// @section dispersion_function_intro Introduction -/// This page documents the types of dispersion functions available. As an -/// a ray moves through the plasma it must remain a solution of these -/// functions. For a fixed wave frequency @f$\omega @f$, the dispersion -/// function dictates how the wave number @f$\vec{k}@f$ and ray trajectory +/// This page documents the types of dispersion functions available. As a ray +/// moves through the plasma it must remain a solution of these functions. For +/// a fixed wave frequency @f$\omega @f$, the dispersion function dictates how +/// the wave number @f$\vec{k}@f$ and ray trajectory /// @f$\vec{x}@f$ interact. /// /// @@ -29,6 +29,8 @@ ///
Symbol definitions
@f$\omega_{pe}@f$ @f$s^{-1}@f$ Electron Plasma Frequency @f$\omega_{pe}=\frac{n_{e}q^{2}}{\epsilon_{0}m_{e}c}@f$ ///
@f$\omega_{ce}@f$ @f$s^{-1}@f$ Electron Cyclotron Frequency @f$\omega_{ce}=\frac{q\left|\vec{B}\right|}{m_{e}}@f$ ///
@f$\omega_{h}@f$ @f$s^{-1}@f$ Upper Hybrid Frequency @f$\omega_{h}^{s}=\omega_{pe}^{2}+\omega_{ce}^{2}@f$ +///
@f$\omega_{r}@f$ @f$s^{-1}@f$ Right cutoff Frequency @f$\omega_{r}=\frac{1}{2}\left(\omega_{ce}+\sqrt{\omega^{2}_{ce}+4\omega_{pe}^{2}}\right)@f$ +///
@f$\omega_{l}@f$ @f$s^{-1}@f$ Left cutoff Frequency @f$\omega_{r}=\frac{1}{2}\left(-\omega_{ce}+\sqrt{\omega^{2}_{ce}+4\omega_{pe}^{2}}\right)@f$ ///
@f$v_{th}@f$ @f$\frac{m}{s}@f$Thermal velocity @f$v_{th}=\sqrt{\frac{k_{B}t_{e}}{m_{e}}}@f$ ///
@f$\vec{n}@f$ @f$1 @f$ @f$n=\frac{\vec{k}c}{\omega}@f$ ///
@@ -47,6 +49,13 @@ /// @f$v_{g}=\frac{\partial\omega}{\partial k}@f$@f$\frac{m}{s}@f$@f$v'_{g}=\frac{\partial\omega'}{\partial k}@f$@f$1 @f$ Group velocity /// /// +/// @section dispersion_function_wave_propagation Wave propagation +/// From any dispersion function, the wave propagation equations are obtained +/// from derivatives of the dispersion relation. +/// @f{equation}{\frac{\partial\vec{x}}{\partial {t}}=-\frac{\frac{\partial D}{\partial\vec{k}}}{\frac{\partial D}{\partial\omega}}@f} +/// @f{equation}{\frac{\partial\vec{k}}{\partial {t}}=\frac{\frac{\partial D}{\partial\vec{x}}}{\frac{\partial D}{\partial\omega}}@f} +/// RF waves are traced by integrating this system of equations. +/// /// @section dispersion_function_avail Available Dispersion Functions /// The following dispersion functions are available in xrays. /// @@ -55,6 +64,7 @@ /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\frac{\vec{k}\cdot\vec{k}}{\omega^{2}}-1\equiv 0 @f} /// It has no resonances or cutoffs. /// +///
/// @subsection dispersion_function_bohm_gross Bohm Gross /// This dispersion function now accounts for how occilations in the plasma /// propagate. @@ -62,7 +72,8 @@ /// It has no resonances or cutoffs. But @f$v_{g}@f$ can never exceed @f$v_{th}@f$. /// @image{} html bohm-gross.png "" /// -/// @subsection dispersion_function_ordinary_wave Ordinary Wave +///
+/// @subsection dispersion_function_o_wave Ordinary Wave /// This disperison function represents a wave with a /// @f$\vec{E}_{1}||\vec{B}_{0}@f$. That means the electric field occilates /// parallel to the magnetic field. @@ -70,19 +81,33 @@ /// This wave is cut off below @f$\omega_{pe}@f$. /// @image{} html O-Mode.png "" /// -/// @subsection dispersion_function_extra_ordinary_wave Extra Ordinary Wave -/// This disperison function represents a wave in a vaccume. +///
+/// @subsection dispersion_function_x_wave Extra Ordinary Wave +/// This dispersion relation encapsulates wave physics in a cold plasma medium. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega_{pe}^2}{\omega^{2}}\frac{\omega^{2}-\omega_{pe}^2}{\omega^{2}-\omega_{h}^2}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} /// This mode has -/// It has no resonances or cutoffs. +/// This wave has two branches. One branch is cannot not progagate below the +/// @f$\omega_{r}@f$ cutoff. The other branch cannot not progagate below the +/// @f$\omega_{l}@f$ cutoff. As the wave approches the upper hybrid fequency, +/// wave propagation stops as the wave number approces +/// @f$\left|\vec{k}\right|\rightarrow\infty @f$. /// @image{} html X-Mode.png "" /// +///
/// @subsection dispersion_function_cold_plasma Cold Plasma /// This disperison function represents a wave in a vaccume. -/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\equiv 0 @f} -/// It has no resonances or cutoffs. +/// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=det\left(\vec{\epsilon}+\vec{n}\vec{n}-\vec{n}\cdot\vec{n}\vec{I}\right)\equiv 0 @f} +/// The quantity @f$\epsilon @f$ is the diaelectric tensor. Using Onsager +/// symmetries, this tensor is defined as +/// @f{equation}{\vec{\epsilon}=\left(\begin{array}{ccc}\epsilon_{11}&\epsilon_{12}&0\\-\epsilon_{12}&\epsilon_{11}&0\\0&0&\epsilon_{33}\end{array}\right)@f} +/// where +/// @f{equation}{\epsilon_{11}=1-\sum_{s}\frac{\frac{\omega^{2}_{p}}{\omega^{2}}}{1-\frac{\Omega^{2}_{c}}{\omega^{2}}}@f} +/// @f{equation}{\epsilon_{12}=-i\sum_{s}\frac{\frac{\Omega_{c}}{\omega}\frac{\omega^{2}_{p}}{\omega^{2}}}{1-\frac{\Omega^{2}_{c}}{\omega^{2}}}@f} +/// @f{equation}{\epsilon_{33}=1-\sum_{s}\frac{\omega^{2}_{p}}{\omega^{2}}@f} +/// Note here we are including the plasma frequency for ions aswell. This +/// dispersion function is effectively a super position of the O-Mode and +/// X-Mode dispersion functions and as such has the same cutoffs and resonaces. /// @image{} html ColdPlasma.png "" -/// //------------------------------------------------------------------------------ #ifndef dispersion_h diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index cd11da1..4fac8fa 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -20,6 +20,7 @@ /// The equilibrium models used in this section make use of Cubic and Bicubic /// splines. /// +///
/// @subsection equilibrum_splines_1D Cubic Splines /// Cubic splines are 1D interpolation functions that consisting of 4 coeffient /// arrays. They take the form of @@ -39,6 +40,7 @@ /// @f{equation}{x = \frac{x_{real} - x_{min}}{dx}@f} /// Rounding down the value of @f$x@f$ gives the correct coefficient index. /// +///
/// @subsection equilibrum_splines_2D Bicubic Splines /// Bicubic Splines are computed in a simular way instead they consist of a /// total of 16 coeffients. These represent 4 spline functions in one @@ -67,6 +69,7 @@ /// @f{equation}{x = \frac{x_{real} - x_{min}}{dx}@f} /// @f{equation}{y = \frac{y_{real} - y_{min}}{dy}@f} /// +///
/// @section equilibrum_efit EFIT /// @image{} html Efit.png "Cross section of poloidal flux surfaces." /// EFIT is an equilibium that comes from a solution of the @@ -110,6 +113,7 @@ /// psi_cij (numr,numz)@f$t_{e}@f$ profile coefficents. /// /// +///
/// @section equilibrum_vmec VMEC /// @image{} html vmec.png "Cross section of 3D flux surfaces." /// VMEC is an equilibium that comes from @@ -142,16 +146,63 @@ /// sminf Minimum @f$s @f$ on the full grid. /// sminh Minimum @f$s @f$ on the half grid. /// 1D Qantities -/// NameSize Discription +/// Name Size Discription /// chi_ci numsf Poloidal flux profile. /// xm nummn Poloidal modes. /// xn nummn Toroidal modes. /// 2D Qantities -/// NameSize Discription +/// Name Size Discription /// lmns_ci (numsh,nummn)@f$\lambda @f$ fourier coefficents. /// rmnc_ci (numsf,nummn)@f$r @f$ fourier coefficents. /// zmns_ci (numsf,nummn)@f$z @f$ fourier coefficents. /// +/// +///
+/// @section equilibrum_devel Developing new equilibrium models +/// This section is intended for code developer and outlines how to create new +/// equilibrium models. All equilibrium model use the same +/// @ref equilibrium::generic interface. New equilibrium models can be created +/// from a subclass of @ref equilibrium::generic or any other existing +/// equilibrium class and overloading class methods. +/// @code +/// template +/// class new_equilibrium final : public generic { +/// ... +/// }; +/// @endcode +/// +/// When a new equilibrium is +/// subclassed from @ref equilibrium::generic implimentations must be provided +/// for the following pure virtual methods. +/// * @ref equilibrium::generic::get_characteristic_field +/// * @ref equilibrium::generic::get_electron_density +/// * @ref equilibrium::generic::get_electron_temperature +/// * @ref equilibrium::generic::get_ion_density +/// * @ref equilibrium::generic::get_ion_temperature +/// * @ref equilibrium::generic::get_magnetic_field +/// +/// @note @ref equilibrium::generic::get_characteristic_field is only used by +/// the normalized boris method for particle pushing for most cases this can +/// simply return 1. +/// +/// For the remaining methods, or any other methods one wishes to override, the +/// arguments provide expressions the input position of the ray. The methods +/// return are expressions for the quantity at hand. +/// +/// @subsection equilibrum_devel_coordinate Noncartesian Coordinates +/// While these methods take an @f$x,y,z @f$ as the argument names, there is +/// no reason these need to be assumed to be cartesian coordinates. For +/// instance the @ref equilibrum_vmec treats @f$x,y,z\rightarrow s,u,v @f$ as +/// flux coordinates. In flux coordinate the coordinate system is no longer +/// normalized nor orthogonal. So that other parts of the code can treat +/// @f$\vec{k}@f$ correctly there are methods to return the covariant basis +/// vectors @f$\vec{e}_{s},\vec{e}_{u},\vec{e}_{v}@f$. +/// * @ref equilibrium::generic::get_esup1 +/// * @ref equilibrium::generic::get_esup2 +/// * @ref equilibrium::generic::get_esup3 +/// +/// By default, @ref equilibrium::generic return basis vectors for a cartesian +/// system @f$\vec{e}_{1}=\hat{x},\vec{e}_{2}=\hat{y},\vec{e}_{3}=\hat{z}@f$. //------------------------------------------------------------------------------ #ifndef equilibrium_h diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index a8bb2ee..ab1921e 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -2,9 +2,79 @@ /// @file solver.hpp /// @brief Base class for a ode solvers. /// -/// Defines a ode solver. +/// Defines an ode solver. +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +/// @page solvers Solvers +/// @brief A discription of the integation methods for solving the ray equations. +/// @tableofcontents +/// +/// @section solvers_intro Introduction +/// This page documents the types of dispersion functions available. These +/// solver integrate the +/// @ref dispersion_function_wave_propagation "wave propagation equations" to +/// solve for the ray trajectory. Each solver builds an expressions for the +/// updates for @f$\vec{x}@f$ and @f$\vec{k}@f$. These expressions are used to +/// build @ref general_concepts_compile_maps "map" kernels that can be iterated +/// to integrate the ray equations. Available integrators are: +/// +///
+/// @subsection solvers_split_simplextic Split Simplextic +/// This solver only works when the system is separable. The conditions for +/// separability are +/// @f$\frac{\partial\frac{\partial D}{\partial\vec{k}}}{\partial\vec{k}}\equiv 0 @f$ +/// and +/// @f$\frac{\partial\frac{\partial D}{\partial\vec{x}}}{\partial\vec{x}}\equiv 0 @f$ +/// If the equations are separable, the solver proceeds as +/// @f{equation}{\vec{x}_{h}=\vec{x}+\frac{dt}{2}\frac{\partial\vec{x}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f} +/// Where @f$\frac{\partial\vec{x}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f$ +/// represents the equation of motion evaluated at the current @f$\vec{x}@f$ +/// and @f$\vec{k}@f$. Using the half step @f$\vec{x}_{h}@f$ we can update +/// @f$\vec{k}@f$. +/// @f{equation}{\vec{k}_{next}=k+dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x}_{h},\vec{k},\omega\right)@f} +/// Then we can take the remaining half step to update @f$\vec{x}@f$. +/// @f{equation}{\vec{x}_{next}=\vec{x}_{h}+\frac{dt}{2}\frac{\partial\vec{x}}{\partial t}\left(\vec{x}_{h},\vec{k}_{next},\omega\right)@f} +/// +///
+/// @subsection solvers_rk2 2nd Order Runge Kutta +/// This solver integates coupled differential equations using the Runge Kutta +/// to second order. +/// It starts by computing a substep for @f$\vec{x}@f$ and @f$\vec{k}@f$. +/// @f{equation}{\vec{x}_{1}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f} +/// @f{equation}{\vec{k}_{1}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f} +/// That substep is used to compute a second substep. +/// @f{equation}{\vec{x}_{2}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x} + \vec{x}_{1},\vec{k} + \vec{k}_{1},\omega\right)@f} +/// @f{equation}{\vec{k}_{2}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x} + \vec{x}_{1},\vec{k} + \vec{k}_{1},\omega\right)@f} +/// These substeps are combined into a single step update. +/// @f{equation}{\vec{x}_{next}=\vec{x}+\frac{\vec{x}_{1}+\vec{x}_{2}}{2}@f} +/// @f{equation}{\vec{k}_{next}=\vec{k}+\frac{\vec{k}_{1}+\vec{k}_{2}}{2}@f} +/// +///
+/// @subsection solvers_rk4 4th Order Runge Kutta +/// This solver integates coupled differential equations using the Runge Kutta +/// to fouth order. Like the second order Runge Kutta, this solver computes 4 +/// substeps. +/// @f{equation}{\vec{x}_{1}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f} +/// @f{equation}{\vec{k}_{1}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x},\vec{k},\omega\right)@f} +/// @f{equation}{\vec{x}_{2}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x} + \frac{\vec{x}_{1}}{2},\vec{k} + \frac{\vec{k}_{1}}{2},\omega\right)@f} +/// @f{equation}{\vec{k}_{2}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x} + \frac{\vec{x}_{1}}{2},\vec{k} + \frac{\vec{k}_{1}}{2},\omega\right)@f} +/// @f{equation}{\vec{x}_{3}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x} + \frac{\vec{x}_{2}}{2},\vec{k} + \frac{\vec{k}_{2}}{2},\omega\right)@f} +/// @f{equation}{\vec{k}_{3}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x} + \frac{\vec{x}_{2}}{2},\vec{k} + \frac{\vec{k}_{2}}{2},\omega\right)@f} +/// @f{equation}{\vec{x}_{4}=dt\frac{\partial\vec{x}}{\partial t}\left(\vec{x} + \vec{x}_{3},\vec{k} + \vec{k}_{3},\omega\right)@f} +/// @f{equation}{\vec{k}_{4}=dt\frac{\partial\vec{k}}{\partial t}\left(\vec{x} + \vec{x}_{3},\vec{k} + \vec{k}_{3},\omega\right)@f} +/// These substeps are combined into a single step update. +/// @f{equation}{\vec{x}_{next}=\vec{x}+\frac{\vec{x}_{1}+2\left(\vec{x}_{2}+\vec{x}_{3}\right)+\vec{x}_{4}}{6}@f} +/// @f{equation}{\vec{k}_{next}=\vec{k}+\frac{\vec{k}_{1}+2\left(\vec{k}_{2}+\vec{x}_{3}\right)+\vec{x}_{4}}{6}@f} +/// +///
+/// @subsection solvers_adaptive_rk4 Adaptive 4th Order Runge Kutta +/// This method is an extension of the 4th Order Runge Kutta which adapts the +/// step size to solutions error. We define a loss function +/// @f{equation}{f_{loss}\left(dt,\lambda\right)=\frac{1}{dt}-\lambda D^{2}@f} +/// We use a newton method to solve for @f$dt @f$ and @f$\lambda @f$ which +/// minimize @f$f_{loss}@f$. The new @f$dt @f$ is then used in a standard 4th +/// Order Runge Kutta iteration. //------------------------------------------------------------------------------ - #ifndef solver_h #define solver_h -- GitLab From 3fd13a40177919ab743a50b44d5c64f186cc96e3 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 18:22:34 -0400 Subject: [PATCH 05/12] Add an example for adding nodes. Add a default is_match. Add developer documentation for dispersion, solvers, and absorption. Fix spelling of timing namespace. Fix cross references and formatting. Add tutorials for language bindings. --- graph_benchmark/xrays_bench.cpp | 8 +- graph_c_binding/graph_c_binding.h | 105 ++++++ graph_docs/code_structure.dox | 27 ++ graph_docs/main.dox | 15 +- graph_docs/tutorial.dox | 3 +- graph_driver/xrays.cpp | 8 +- .../graph_fortran_binding.f90 | 79 +++- graph_framework.xcodeproj/project.pbxproj | 2 + graph_framework/absorption.hpp | 46 +++ graph_framework/dispersion.hpp | 17 + graph_framework/equilibrium.hpp | 44 +-- graph_framework/math.hpp | 4 +- graph_framework/node.hpp | 351 ++++++++++++++++-- graph_framework/random.hpp | 29 +- graph_framework/solver.hpp | 24 ++ graph_framework/timing.hpp | 2 +- graph_korc/xkorc.cpp | 6 +- graph_tests/f_binding_test.f90 | 32 +- graph_tests/solver_test.cpp | 6 +- 19 files changed, 708 insertions(+), 100 deletions(-) create mode 100644 graph_docs/code_structure.dox diff --git a/graph_benchmark/xrays_bench.cpp b/graph_benchmark/xrays_bench.cpp index ef6d042..28e2df9 100644 --- a/graph_benchmark/xrays_bench.cpp +++ b/graph_benchmark/xrays_bench.cpp @@ -38,10 +38,10 @@ void bench_runner() { const size_t batch = NUM_RAYS/threads.size(); const size_t extra = NUM_RAYS%threads.size(); - timeing::measure_diagnostic_threaded time_setup("Setup Time"); - timeing::measure_diagnostic_threaded time_init("Init Time"); - timeing::measure_diagnostic_threaded time_compile("Compile Time"); - timeing::measure_diagnostic_threaded time_steps("Time Steps"); + timing::measure_diagnostic_threaded time_setup("Setup Time"); + timing::measure_diagnostic_threaded time_init("Init Time"); + timing::measure_diagnostic_threaded time_compile("Compile Time"); + timing::measure_diagnostic_threaded time_steps("Time Steps"); for (size_t i = 0, ie = threads.size(); i < ie; i++) { threads[i] = std::thread([&time_setup, &time_init, &time_compile, &time_steps, batch, extra] (const size_t thread_number) -> void { diff --git a/graph_c_binding/graph_c_binding.h b/graph_c_binding/graph_c_binding.h index 5ed50aa..aa73003 100644 --- a/graph_c_binding/graph_c_binding.h +++ b/graph_c_binding/graph_c_binding.h @@ -2,6 +2,111 @@ /// @file graph_c_binding.h /// @brief Header file for the c binding library. //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +/// @page graph_c_binding Embedding in C code +/// @brief Documentation for linking into a C code base. +/// @tableofcontents +/// +/// @section graph_c_binding_into Introduction +/// This section assumes the reader is already familar with developing C codes. +/// The simplist method to link framework code into a C code is to create a c++ +/// function with @code extern "C" @endcode First create a header file +/// c_callable.h +/// @code +/// extern "C" { +/// void c_callable_function(); +/// } +/// @endcode +/// +/// Next create a source file c_callable.c and add the +/// framework. This example uses the line +/// @ref tutorial_workflow "making workflows" turorial. +/// @code +/// // Include the necessary framework headers. +/// +/// extern "C" { +/// void c_callable_function() { +/// auto x = graph::variable(3, "x"); +/// +/// // Define explicit constant. +/// auto m = graph::constant (0.4); +/// // Define implicit constant. +/// const T b = 0.6; +/// +/// // Equation of a line +/// auto y = m*x + b; +/// +/// // Auto differentiation. +/// auto dydx = y->df(x); +/// +/// x->set({1.0, 2.0, 3.0}); +/// +/// // Create a workflow manager. +/// workflow::manager work(0); +/// work.add_item({ +/// graph::variable_cast(x) +/// }, { +/// y, dydx +/// }, {}, NULL, "my_first_kernel", 3); +/// work.compile(); +/// +/// work.run(); +/// work.print(0, {x, y, dydx}); +/// work.print(1, {x, y, dydx}); +/// work.print(2, {x, y, dydx}); +/// } +/// } +/// @endcode +/// +///
+/// @section graph_c_binding_interface C Binding Interface +/// An alternative is to use the @ref graph_c_binding.h "C Language interface". +/// The C binding interface can be enabled as one of the cmake +/// @ref build_system_user_options "conifgure options". As an example, we will +/// convert the @ref tutorial_workflow "making workflows" turorial to use the +/// C language bindings. +/// @code +/// #include +/// +/// void c_binding() { +/// const bool use_safe_math = 0; +/// struct graph_c_context *c_context = graph_construct_context(DOUBLE, use_safe_math); +/// graph_node x = graph_variable(c_context, 3, "x"); +/// +/// graph_node m = graph_constant(c_context, 0.4); +/// graph_node b = graph_constant(c_context, 0.6); +/// +/// graph_node y = graph_add(c_context, graph_mul(c_context, m, x), b); +/// graph_node dydx = graph_df(c_context, y, x); +/// +/// double temp[3]; +/// temp[0] = 1.0; +/// temp[1] = 2.0; +/// temp[2] = 3.0; +/// graoh_set_variable(c_context, x, temp); +/// +/// graph_set_device_number(c_context, 0); +/// graph_node inputs[1]; +/// inputs[0] = x; +/// graph_node outputs[2]; +/// outputs[0] = y; +/// outputs[1] = dydx; +/// graph_add_item(c_context, inputs, 1, outputs, 2, NULL, NULL, 0, NULL, +/// "x", 3); +/// graph_compile(c_context); +/// graph_run(c_context); +/// graph_node inputs2[3]; +/// inputs2[0] = x; +/// inputs2[1] = y; +/// inputs2[2] = dydx; +/// graph_print(c_context, 0, inputs2, 3); +/// graph_print(c_context, 1, inputs2, 3); +/// graph_print(c_context, 2, inputs2, 3); +/// +/// graph_destroy_context(c_context); +/// } +/// @endcode +//------------------------------------------------------------------------------ #ifndef graph_c_binding_h #define graph_c_binding_h diff --git a/graph_docs/code_structure.dox b/graph_docs/code_structure.dox new file mode 100644 index 0000000..206ac7a --- /dev/null +++ b/graph_docs/code_structure.dox @@ -0,0 +1,27 @@ +/*! + * @page code_structure Code Structure + * @brief Architecture of the code base. + * @tableofcontents + * + * @section code_structure_intro Introduction + * This topic covers the structure of the framework and the structure of the RF + * Ray tracing code xrays. + * + * @section code_structure_framework Framework + * The namespaces of the graph framework are: + * * @ref graph The operation nodes. + * * @ref workflow The routines for executing graphs. + * * @ref jit Generic interface for Just-In-Time compiling of the graphs. + * * @ref backend Host side buffers and operations. + * * @ref gpu Device drivers for CPU and the GPU. + * * @ref timeing Routines for timing. + * * @ref output Routines for loading and saving graph to Netcdf files. + * * @ref commandline Routines for parsing command lines. + * + * @section code_structure_xrays Ray Tracing code + * The namespaces of the Ray Tracing code are: + * * @ref equilibrium Equilibrium models. + * * @ref dispersion Dispersion functions. + * * @ref solver PDE integration methods and optimization methods. + * * @ref absorption The absorption models. + */ diff --git a/graph_docs/main.dox b/graph_docs/main.dox index 293e59e..adcb404 100644 --- a/graph_docs/main.dox +++ b/graph_docs/main.dox @@ -39,10 +39,19 @@ * * @ref build_system "Compiling the framework." * * @ref general_concepts "General concepts." * * @ref tutorial "Tutorial" + * * @ref graph_c_binding + * * @ref graph_fortran_binding * *
* @section framework_developer Framework developer guides - * * @ref build_system "Build system." - * * Code structure - * * Adding new operations tutorial. + * * @ref build_system + * * @ref code_structure + * * @ref new_operations_tutorial + * + * @subsection framework_developer_tools Developer guide for RF Ray Tracing + * * @ref code_structure_xrays "Code Structure" + * * @ref equilibrum_devel + * * @ref dispersion_function_devel + * * @ref solvers_devel + * * @ref absorption_model_devel */ diff --git a/graph_docs/tutorial.dox b/graph_docs/tutorial.dox index a3b66b3..baeca88 100644 --- a/graph_docs/tutorial.dox +++ b/graph_docs/tutorial.dox @@ -2,6 +2,7 @@ * @page tutorial Tutorial * @brief Hands on tutorial for building expressions and running workflow. * @tableofcontents + * * @section tutorial_introduction Introduction * In this tutorial we will put the basic @ref general_concepts of the * graph_into action. This will discuss building trees, generating, and @@ -155,7 +156,7 @@ auto dydb = y->df(m*x); * The respective results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. * *
- * @section tutorial_workflow Making workflow. + * @section tutorial_workflow Making workflows. * In this section we will build workflow from these nodes we created. For * simplicity we will decrease the number of elements in variable so we can set * the values easier. First thing we do is create a @ref workflow::manager. diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index b2d8bad..3b86261 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -414,7 +414,7 @@ void trace_ray(const commandline::parser &cl, const size_t num_times, const size_t sub_steps, const size_t num_rays) { - const timeing::measure_diagnostic total("Total Ray Time"); + const timing::measure_diagnostic total("Total Ray Time"); std::vector threads(std::max(std::min(static_cast (jit::context::max_concurrency()), static_cast (num_rays)), @@ -600,7 +600,7 @@ void calculate_power(const commandline::parser &cl, const size_t num_times, const size_t sub_steps, const size_t num_rays) { - const timeing::measure_diagnostic total("Power Time"); + const timing::measure_diagnostic total("Power Time"); std::vector threads(std::max(std::min(static_cast (jit::context::max_concurrency()), static_cast (num_rays)), @@ -675,7 +675,7 @@ void bin_power(const commandline::parser &cl, const size_t num_times, const size_t sub_steps, const size_t num_rays) { - const timeing::measure_diagnostic total("Power Time"); + const timing::measure_diagnostic total("Power Time"); std::vector threads(std::max(std::min(static_cast (jit::context::max_concurrency()), static_cast (num_rays)), @@ -1084,7 +1084,7 @@ int main(int argc, const char * argv[]) { START_GPU (void)argc; (void)argv; - const timeing::measure_diagnostic total("Total Time"); + const timing::measure_diagnostic total("Total Time"); const commandline::parser cl = parse_commandline(argc, argv); jit::verbose = cl.is_option_set("verbose"); diff --git a/graph_fortran_binding/graph_fortran_binding.f90 b/graph_fortran_binding/graph_fortran_binding.f90 index 4fa6423..6d7e2ff 100644 --- a/graph_fortran_binding/graph_fortran_binding.f90 +++ b/graph_fortran_binding/graph_fortran_binding.f90 @@ -6,6 +6,84 @@ ! found in the Module not the file. ! !> Module contains subroutines for calling this from fortran. +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +!> @page graph_fortran_binding Embedding in Fortran code +!> @brief Documentation for linking into Fortran code base. +!> @tableofcontents +!> +!> @section graph_fortran_binding_into Introduction +!> This section assumes the reader is already familar with developing Fortran +!> codes. The simplist method is to create a C callable function like the +!> @ref graph_c_binding_into "C binding exmaple". Then create a fortran +!> interface for it. +!> @code +!> INTERFACE +!> SUBROUTINE Fortran_Callable BIND(C, NAME='c_callable_function') +!> USE, INTRINSIC :: ISO_C_BINDING +!> IMPLICIT NONE +!> END SUBROUTINE +!> END INTERFACE +!> @endcode +!> This subroutine can be called like any other Fortran subroutine. +!> @code +!> CALL Fortran_Callable +!> @endcode +!> +!>
+!> @section graph_fortran_binding_interface Fortran Binding Interface +!> An alternative is to use the +!> @ref graph_fortran "Fortran Language interface". The Fortran binding +!> interface can be enabled as one of the cmake +!> @ref build_system_user_options "conifgure options". As an example, we will +!> convert the @ref tutorial_workflow "making workflows" turorial to use the +!> Fortran language bindings. +!> @code +!> SUBROUTINE fortran_binding +!> USE graph_fortran +!> USE, INTRINSIC :: ISO_C_BINDING +!> +!> IMPLICIT NONE +!> +!> CLASS(graph_context), POINTER :: graph +!> TYPE(C_PTR) :: x +!> TYPE(C_PTR) :: m +!> TYPE(C_PTR) :: b +!> TYPE(C_PTR) :: y +!> TYPE(C_PTR) :: dydx +!> +!> LOGICAL(C_BOOL), PARAMETER :: use_safe_math = .false. +!> +!> graph => graph_double_context(use_safe_math); +!> +!> x = graph%variable(1_C_LONG, 'x' // C_NULL_CHAR) +!> m = graph%constant(0.4_C_DOUBLE) +!> b = graph%constant(0.6_C_DOUBLE) +!> +!> y = graph%add(graph%mul(m, x), b) +!> dydx = graph%df(y, x); +!> +!> CALL graph%set_variable(x, (/ 1.0_C_DOUBLE, 2.0_C_DOUBLE, 3.0_C_DOUBLE /)) +!> +!> CALL graph%set_device_number(0) +!> CALL graph%add_item((/ graph_ptr(x) /), & +!> (/ graph_ptr(y), graph_ptr(dydx) /)) & +!> graph_null_array, graph_null_array, C_NULL_PTR, & +!> 'my_first_kernel' // C_NULL_CHAR, 3_C_LONG) +!> CALL graph%compile +!> CALL graph%run +!> CALL graph%print(0, (/ graph_ptr(x), graph_ptr(y), graph_ptr(dydx) /)) +!> CALL graph%print(1, (/ graph_ptr(x), graph_ptr(y), graph_ptr(dydx) /)) +!> CALL graph%print(2, (/ graph_ptr(x), graph_ptr(y), graph_ptr(dydx) /)) +!> +!> DEALLOCATE(graph) +!> END SUBROUTINE +!> @endcode +!> +!> @note Graphs need to use the @ref graph_fortran::graph_ptr function to get +!> the pointer address of node. +!> @note The @ref graph_fortran::graph_null_array allows set arrays of nodes to +!> null. !------------------------------------------------------------------------------- MODULE graph_fortran USE, INTRINSIC :: ISO_C_BINDING @@ -14,7 +92,6 @@ !> A null array for empty INTEGER(C_INTPTR_T), DIMENSION(0) :: graph_null_array -!> A !------------------------------------------------------------------------------- !> @brief Class object for the binding. diff --git a/graph_framework.xcodeproj/project.pbxproj b/graph_framework.xcodeproj/project.pbxproj index 7fc9d54..fb8c1f0 100644 --- a/graph_framework.xcodeproj/project.pbxproj +++ b/graph_framework.xcodeproj/project.pbxproj @@ -399,6 +399,7 @@ C7DC9EE82E39789900524F6F /* libgraph_c.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgraph_c.a; sourceTree = BUILT_PRODUCTS_DIR; }; C7DC9EEF2E397BE600524F6F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; C7DC9EF12E3A688F00524F6F /* c_binding_test.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; path = c_binding_test.c; sourceTree = ""; }; + C7DD87D32E664B440058BA66 /* code_structure.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = code_structure.dox; sourceTree = ""; }; C7E134492A3CB3EC0083F6A7 /* output.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = output.hpp; sourceTree = ""; }; C7E5643E28A2A16F000F31A2 /* backend_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = backend_test; sourceTree = BUILT_PRODUCTS_DIR; }; C7E5644A28A2A1C5000F31A2 /* dispersion_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dispersion_test; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -619,6 +620,7 @@ C75C42922E5CA60B00B0950B /* general.dox */, C75C42932E5CA60B00B0950B /* main.dox */, C75C42952E5CC80B00B0950B /* tutorial.dox */, + C7DD87D32E664B440058BA66 /* code_structure.dox */, ); path = graph_docs; sourceTree = ""; diff --git a/graph_framework/absorption.hpp b/graph_framework/absorption.hpp index 08586ac..d801e8e 100644 --- a/graph_framework/absorption.hpp +++ b/graph_framework/absorption.hpp @@ -53,6 +53,40 @@ /// @section absorption_model_damping Weak Damping /// Using the cold and hot expansion /// @f{equation}{k_{amp}=\sqrt{\vec{k}\cdot\vec{k}}-\frac{D_{h}}{\hat{k}\cdot\frac{\partial D_{c}}{\partial \vec{k}}}@f} +/// +///
+/// @section absorption_model_devel Developing new absorption models +/// This section is intended for code developers and outlines how to create new +/// absorption models. New absorption models can be created from a subclass +/// of @ref absorption::method or any other existing +/// absorption class and overloading class methods. +/// @code +/// template +/// class new_absorption final : public method { +/// new_absorption(graph::shared_leaf kamp, +/// graph::shared_leaf w, +/// graph::shared_leaf kx, +/// graph::shared_leaf ky, +/// graph::shared_leaf kz, +/// graph::shared_leaf x, +/// graph::shared_leaf y, +/// graph::shared_leaf z, +/// graph::shared_leaf t, +/// equilibrium::shared &eq, +/// const std::string &filename="", +/// const size_t index=0) { +/// ... +/// } +/// +/// void compile() { +/// ... +/// } +/// +/// void run(const size_t time_index) { +/// ... +/// } +/// }; +/// @endcode //------------------------------------------------------------------------------ #ifndef absorption_h #define absorption_h @@ -80,6 +114,18 @@ namespace absorption { typedef T base; /// Retrieve template parameter of safe math. static constexpr bool safe_math = SAFE_MATH; + +//------------------------------------------------------------------------------ +/// @brief Compile the workitems. +//------------------------------------------------------------------------------ + virtual void compile()=0; + +//------------------------------------------------------------------------------ +/// @brief Run the workflow. +/// +/// @param[in] time_index The time index to run the case for. +//------------------------------------------------------------------------------ + virtual void run(const size_t time_index)=0; }; /// Solver method concept. diff --git a/graph_framework/dispersion.hpp b/graph_framework/dispersion.hpp index 306ff1d..26089a6 100644 --- a/graph_framework/dispersion.hpp +++ b/graph_framework/dispersion.hpp @@ -108,6 +108,23 @@ /// dispersion function is effectively a super position of the O-Mode and /// X-Mode dispersion functions and as such has the same cutoffs and resonaces. /// @image{} html ColdPlasma.png "" +/// +///
+/// @section dispersion_function_devel Developing new dispersion functions +/// This section is intended for code developers and outlines how to create new +/// equilibrium models. New equilibrium models can be created from a subclass +/// of @ref dispersion::dispersion_function or any other existing +/// dispersion_function class and overloading class methods. For convinence the +/// @ref dispersion::physics class contains several defined physical constants. +/// @code +/// template +/// class new_dispersion final : public dispersion_function { +/// ... +/// }; +/// @endcode +/// When a new dispersion function is subclassed from +/// @ref dispersion::dispersion_function an implimentation must be provided for +/// the pure virtual method @ref dispersion::dispersion_function::D. //------------------------------------------------------------------------------ #ifndef dispersion_h diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index 4fac8fa..1d5fb44 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -87,30 +87,30 @@ /// /// ///
Efit netcdf file quantities
Dimensions -///
Name Discription -///
numr Size of radial grid. -///
numz Size of vertical grid. -///
numpsi Size of arrays for @f$\psi@f$ mapped quantities. +///
Name Discription +///
numr Size of radial grid. +///
numz Size of vertical grid. +///
numpsi Size of arrays for @f$\psi@f$ mapped quantities. ///
Scalar Qantities -///
dpsi Step size of the @f$\psi@f$ grid. -///
dr Step size of the radial grid. -///
dz Step size of the vertial grid. -///
ne_scale Scale of the @f$n_{e}@f$ profile. -///
pres_scale Scale of the pressure profile. -///
psibry Value of @f$\psi@f$ at the boundary. -///
psimin Minimum @f$\psi@f$ value. -///
rmin Minimum radial value. -///
te_scale Scale of the electron temperature profile. -///
zmin Minimum vertial value. +///
dpsi Step size of the @f$\psi@f$ grid. +///
dr Step size of the radial grid. +///
dz Step size of the vertial grid. +///
ne_scale Scale of the @f$n_{e}@f$ profile. +///
pres_scale Scale of the pressure profile. +///
psibry Value of @f$\psi@f$ at the boundary. +///
psimin Minimum @f$\psi@f$ value. +///
rmin Minimum radial value. +///
te_scale Scale of the electron temperature profile. +///
zmin Minimum vertial value. ///
1D Qantities -///
NameSize Discription -///
fpol_ci numpsi Flux function profile coefficents -///
ne_ci numpsi @f$n_{e}@f$ profile coefficents. -///
pressure_cinumpsi Pressure profile coefficents. -///
te_ci numpsi @f$t_{e}@f$ profile coefficents. +///
NameSize Discription +///
fpol_ci numpsi Flux function profile coefficents +///
ne_ci numpsi @f$n_{e}@f$ profile coefficents. +///
pressure_ci numpsi Pressure profile coefficents. +///
te_ci numpsi @f$t_{e}@f$ profile coefficents. ///
2D Qantities -///
NameSize Discription -///
psi_cij (numr,numz)@f$t_{e}@f$ profile coefficents. +///
NameSize Discription +///
psi_cij (numr,numz)@f$t_{e}@f$ profile coefficents. ///
/// ///
@@ -159,7 +159,7 @@ /// ///
/// @section equilibrum_devel Developing new equilibrium models -/// This section is intended for code developer and outlines how to create new +/// This section is intended for code developers and outlines how to create new /// equilibrium models. All equilibrium model use the same /// @ref equilibrium::generic interface. New equilibrium models can be created /// from a subclass of @ref equilibrium::generic or any other existing diff --git a/graph_framework/math.hpp b/graph_framework/math.hpp index b7fae77..9ef8dc1 100644 --- a/graph_framework/math.hpp +++ b/graph_framework/math.hpp @@ -190,9 +190,9 @@ namespace graph { auto x_cast = sqrt_cast(x); if (x_cast.get()) { return this->arg->is_match(x_cast->get_arg()); - } else { - return false; } + + return false; } //------------------------------------------------------------------------------ diff --git a/graph_framework/node.hpp b/graph_framework/node.hpp index 99de48f..b49aa7e 100644 --- a/graph_framework/node.hpp +++ b/graph_framework/node.hpp @@ -4,7 +4,332 @@ /// /// Defines a tree of operations that allows automatic differentiation. //------------------------------------------------------------------------------ - +//------------------------------------------------------------------------------ +/// @page new_operations_tutorial Adding New Operations Tutorial +/// @brief A discription of the models for power absorption. +/// @tableofcontents +/// +/// @section new_operations_tutorial_intro Introduction +/// In most cases, physics problems can be generated from combinations of graph +/// nodes. For instance, the @ref graph::tan nodes are built from +/// @f$\frac{\sin\left(x\right)}{\cos\left(x\right)}@f$. +/// +/// However, some problems will call for adding new operations. This page +/// provides a basic example of how to impliment a new operator +/// @f$foo\left(x\right)@f$ in the graph framework. +/// +///
+/// @section new_operations_tutorial_node_subclass Node Subclasses +/// All graph nodes are subclasses of @ref graph::leaf_node or subclasses or +/// other nodes. In the case of our @f$foo\left(x\right)@f$ example we can +/// sublass the @ref graph::straight_node instead. If there are two or three +/// operands you can subclass +/// * @ref graph::branch_node +/// * @ref graph::triple_node +/// +/// @note Any existing node can be subclassed but do so with caution. +/// Subclasses inherent reduction rules which maybe incorrect. +/// +/// In this case, the @ref graph::straight_node (Along with +/// @ref graph::branch_node, @ref graph::triple_node) have no reduction +/// assumputions. For this case since our operation @f$foo\left(x\right)@f$ +/// takes one argument, we will subclass the @ref graph::straight_node. +/// +/// The basics of subclassing a node, start with a subclass and a constructor. +/// @code +/// template +/// class foo_node : public straight_node { +/// private: +/// static std::string to_string(leaf_node *x) { +/// return "foo(" + +/// jit::format_to_string(reinterpret_cast (l)) + +/// ")"; +/// } +/// +/// public: +/// foo_node(shared_leaf x) : +/// straight_node(x, foo_node::to_string(x.get())) {} +/// }; +/// @endcode +/// The static to_string method provices an idenifier that can be used +/// to generate a hash for the node. This hash will be used later in a factory +/// function to exsure nodes only exist once. +/// +/// A factor function constructs a node then immedately reduces it. The reduced +/// node is then checked if it already exists in the +/// @ref leaf_node::caches::node. If the node is a new node, we add it to the +/// cache and return it. Otherwise we discard the node and return the cached +/// node. In it's place. +/// @code +/// template +/// shared_leaf foo(shared_leaf x) { +/// auto temp = std::make_shared> (x)->reduce(); +/// // Test for hash collisions. +/// for (size_t i = temp->get_hash(); +/// i < std::numeric_limits::max(); i++) { +/// if (leaf_node::caches.nodes.find(i) == +/// leaf_node::caches.nodes.end()) { +/// leaf_node::caches.nodes[i] = temp; +/// return temp; +/// } else if (temp->is_match(leaf_node::caches.nodes[i])) { +/// return leaf_node::caches.nodes[i]; +/// } +/// } +/// } +/// @endcode +/// +/// To aid in introspection we also need a function to case a generic +/// @ref graph::shared_leaf back to the specifi node tpe. For convience, we +/// also define a type alias for shared type. +/// @code +/// template +/// using shared_foo = std::shared_ptr>; +/// +/// template +/// shared_foo foo_cast(shared_leaf x) { +/// return std::dynamic_pointer_cast> (x); +/// } +/// @endcode +/// +///
+/// @section new_operations_tutorial_method Methods overloads +/// To subclass a @ref graph::leaf_node there are several methods that need to +/// be provided. +/// +///
+/// @subsection new_operations_tutorial_evalute Evaluate +/// To start, lets provide a way to +/// @ref graph::leaf_node::evaluate "evalute the node". The first step to +/// evaluate a node is to the nodes argument. +/// @code +/// virtual shared_leaf evaluate() { +/// backend::buffer result = this->arg->evaluate(); +/// } +/// @endcode +/// @ref backend::buffer are quick ways we can evalute the node on the GPU +/// before needing to generate GPU kernels and is used by the +/// @ref graph::leaf_node::reduce method to precompute constant values. We can +/// extend the @ref backend::buffer class with a new method to evaluate foo or +/// you can use the existing operators. In this case lets assume +/// @f$foo\left(x\right)=x^{2}@f$. +/// @code +/// virtual shared_leaf evaluate() { +/// backend::buffer result = this->arg->evaluate(); +/// return result*result; +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_is_match Is Match +/// This methiod checks if the node matches another node. The first thing to +/// check is if the pointers match. Then we can check if the structure of the +/// graphs match. +/// @code +/// virtual bool is_match(shared_leaf x) { +/// if (this == x.get()) { +/// return true; +/// } +/// +/// auto x_cast = foo_cast(x); +/// if (x_cast.get()) { +/// return this->arg->is_match(x_cast->get_arg()); +/// } +/// +/// return false; +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_reduce Reduce +/// Lets add a simple reduction method. When the argument @f$x @f$ is a +/// constant we can reduce this node down to a single constant by pre +/// evaluating it. +/// @code +/// virtual shared_leaf reduce() { +/// if (constant_cast(this->arg).get()) { +/// return constant (this->evaluate()); +/// } +/// +/// return this->shared_from_this(); +/// } +/// @endcode +/// In this example we first check if the argument can be cast to a constant. +/// If it was castable, we evalute this node and create a new constant to +/// return in its place. Otherwise we return the current node unchanged. +/// @note Other reductions are possible but not shown here. +/// +///
+/// @subsection new_operations_tutorial_df df +/// Auto differentiation is provided by returning the derivative expression. +/// @f$\frac{\partial}{\partial y}foo\left(x\right)=2x\frac{\partial x}{\partial y}@f$. +/// However, in this frame it is also possible to take a derivative with +/// respect to itself @f$\frac{\partial foo\left(x\right)}{\partial foo\left(x\right)}=1 @f$. +/// @code +/// virtual shared_leaf df(shared_leaf x) { +/// if (this->is_match(x)) { +/// return one (); +/// } +/// +/// const size_t hash = reinterpret_cast (x.get()); +/// if (this->df_cache.find(hash) == this->df_cache.end()) { +/// this->df_cache[hash] = 2.0*this->arg*this->arg->df(x); +/// } +/// return this->df_cache[hash]; +/// } +/// @endcode +/// Here we made use of the @ref graph::leaf_node::df_cache to avoid needing +/// to rebuild expressions everytime the same derivative is taken. +/// +///
+/// @subsection new_operations_tutorial_compile_preamble Compile preamble +/// The @ref graph::leaf_node::compile_preamble method provides ways that +/// header files or define functions. Lets use this method to define a function +/// that can be called from the kerne. +/// @code +/// virtual void compile_preamble(std::ostringstream &stream, +/// jit::register_map ®isters, +/// jit::visiter_map &visited, +/// jit::register_usage &usage, +/// jit::texture1d_list &textures1d, +/// jit::texture2d_list &textures2d, +/// int &avail_const_mem) { +/// if (visited.find(this) == visited.end()) { +/// this->arg->compile_preamble(stream, registers, +/// visited, usage, +/// textures1d, textures2d, +/// avail_const_mem); +/// +/// jit::add_type (stream); +/// stream << " foo(const " +/// jit::add_type (stream); +/// stream << "x) {" +/// << " return 2*x;" +/// << "}"; +/// +/// visited.insert(this); +/// #ifdef SHOW_USE_COUNT +/// usage[this] = 1; +/// } else { +/// ++usage[this]; +/// #endif +/// } +/// } +/// @endcode +/// The compile methods generate kernel source code. In this case we created a +/// function in the preamble to evaluate foo. Since we only want this create +/// this preamble once, we first check if this node has already been visited. +/// The @ref build_system_dev_options "build system option" +/// SHOW_USE_COUNT tracks the number of times a node is used in the +/// kernel. When this option is set we need to increment it's usage count. +/// @note Most nodes don't require a preamble so this method can be left out. +/// +///
+/// @subsection new_operations_tutorial_compile Compile +/// The compile method writes a line of source code to the kernel. Here we can +/// use the function defined in the preamble. +/// @code +/// virtual shared_leaf +/// compile(std::ostringstream &stream, +/// jit::register_map ®isters, +/// jit::register_map &indices, +/// const jit::register_usage &usage) { +/// if (registers.find(this) == registers.end()) { +/// shared_leaf a = this->arg->compile(stream, +/// registers, +/// indices, +/// usage); +/// +/// registers[this] = jit::to_string('r', this); +/// stream << " const "; +/// jit::add_type (stream); +/// stream << " " << registers[this] << " = foo(" +/// << registers[a.get()] << ")"; +/// this->endline(stream, usage); +/// } +/// +/// return this->shared_from_this(); +/// } +/// @endcode +/// Kernels are created by assuming infinite registers. In this case, a +/// register is a temporary variable. To provide a unquie name, the node +/// pointer value is converted into a string. Since we only want to evaluate +/// this once, we check if the register has already been created. +/// +///
+/// @subsection new_operations_tutorial_to_latex To Latex +/// This method returns the code to generate the @f$\LaTeX @f$ expression for +/// the node. +/// @code +/// virtual void to_latex () const { +/// std::cout << "foo\left(; +/// this->arg->to_latex(); +/// std::cout << "\right)"; +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_is_power_like Is Power Like +/// This provides information for other nodes about how this works for +/// reduction methods. In this care we need to set this to true. If this node +/// did not act like a power, this method can be ignored. +/// @code +/// virtual bool is_power_like() const { +/// return true; +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_get_power_base Get power base +/// Return the base of the power node. This provides information for other +/// nodes about how this works for reduction methods. +/// @code +/// virtual shared_leaf get_power_base() const { +/// return this->arg; +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_get_power_exponent Get power exponent +/// Return the exponent of the power node. This provides information for other +/// nodes about how this works for reduction methods. +/// @code +/// virtual shared_leaf get_power_exponent() const { +/// return constant (static_cast (2.0)); +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_remove_pseudo Remove Pseudo +/// Return the node with pseduo variables removed. +/// @code +/// virtual shared_leaf remove_pseudo() { +/// if (this->has_pseudo()) { +/// return sqrt(this->arg->remove_pseudo()); +/// } +/// return this->shared_from_this(); +/// } +/// @endcode +/// +///
+/// @subsection new_operations_tutorial_to_vizgraph To Vizgraph +/// Generates a vizgraph node for visualization. +/// @code +/// virtual shared_leaf to_vizgraph(std::stringstream &stream, +/// jit::register_map ®isters) { +/// if (registers.find(this) == registers.end()) { +/// const std::string name = jit::to_string('r', this); +/// registers[this] = name; +/// stream << " " << name +/// << " [label = \"foo\", shape = oval, style = filled, fillcolor = blue, fontcolor = white];" << std::endl; +/// +/// auto a = this->arg->to_vizgraph(stream, registers); +/// stream << " " << name << " -- " << registers[a.get()] << ";" << std::endl; +/// } +/// +/// return this->shared_from_this(); +/// } +/// @endcode +//------------------------------------------------------------------------------ #ifndef node_h #define node_h @@ -134,7 +459,9 @@ namespace graph { /// @param[in] x Other graph to check if it is a match. /// @returns True if the nodes are a match. //------------------------------------------------------------------------------ - virtual bool is_match(std::shared_ptr> x) = 0; + virtual bool is_match(std::shared_ptr> x) { + return this == x.get(); + } //------------------------------------------------------------------------------ /// @brief Check if the base of the powers match. @@ -1202,16 +1529,6 @@ namespace graph { return this->shared_from_this(); } -//------------------------------------------------------------------------------ -/// @brief Querey if the nodes match. -/// -/// @param[in] x Other graph to check if it is a match. -/// @returns True if the nodes are a match. -//------------------------------------------------------------------------------ - virtual bool is_match(shared_leaf x) { - return this == x.get(); - } - //------------------------------------------------------------------------------ /// @brief Set the value of variable data. /// @@ -1478,16 +1795,6 @@ namespace graph { return constant (static_cast (this->is_match(x))); } -//------------------------------------------------------------------------------ -/// @brief Querey if the nodes match. -/// -/// @param[in] x Other graph to check if it is a match. -/// @returns True if the nodes are a match. -//------------------------------------------------------------------------------ - virtual bool is_match(shared_leaf x) { - return this == x.get(); - } - //------------------------------------------------------------------------------ /// @brief Convert the node to latex. //------------------------------------------------------------------------------ diff --git a/graph_framework/random.hpp b/graph_framework/random.hpp index 2dc64b6..ace6faa 100644 --- a/graph_framework/random.hpp +++ b/graph_framework/random.hpp @@ -106,7 +106,10 @@ namespace graph { << " uint16_t padding[3];" << std::endl #endif << "};" << std::endl; + + visited.insert(this); #ifdef SHOW_USE_COUNT + usage[this] = 1; } else { ++usage[this]; #endif @@ -130,19 +133,6 @@ namespace graph { return this->shared_from_this(); } -//------------------------------------------------------------------------------ -/// @brief Querey if the nodes match. -/// -/// @param[in] x Other graph to check if it is a match. -/// @returns True if the nodes are a match. -//------------------------------------------------------------------------------ - virtual bool is_match(shared_leaf x) { - if (this == x.get()) { - return true; - } - return false; - } - //------------------------------------------------------------------------------ /// @brief Convert the node to latex. //------------------------------------------------------------------------------ @@ -375,12 +365,12 @@ namespace graph { jit::texture1d_list &textures1d, jit::texture2d_list &textures2d, int &avail_const_mem) { - this->arg->compile_preamble(stream, registers, - visited, usage, - textures1d, textures2d, - avail_const_mem); - if (visited.find(this) == visited.end()) { + this->arg->compile_preamble(stream, registers, + visited, usage, + textures1d, textures2d, + avail_const_mem); + jit::add_type (stream); stream << " random("; if constexpr (jit::use_metal ()) { @@ -406,7 +396,10 @@ namespace graph { jit::add_type (stream); stream << "> (y^(y >> 18));" << std::endl << "}" << std::endl; + + visited.insert(this); #ifdef SHOW_USE_COUNT + usage[this] = 1; } else { ++usage[this]; #endif diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index ab1921e..99525ab 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -74,6 +74,30 @@ /// We use a newton method to solve for @f$dt @f$ and @f$\lambda @f$ which /// minimize @f$f_{loss}@f$. The new @f$dt @f$ is then used in a standard 4th /// Order Runge Kutta iteration. +/// +///
+/// @section solvers_devel Developing new solvers +/// This section is intended for code developers and outlines how to create new +/// solver methods. All solvers use the same @ref solver::solver_interface +/// interface. New solver models can be created from a subclass of +/// @ref solver::solver_interface or any other existing equilibrium class and +/// overloading class methods. +/// @code +/// tempate +/// class new_solver : public solver_interface { +/// ... +/// } +/// @endcode +/// When a new dispersion function is subclassed from +/// @ref dispersion::dispersion_function no methods need to be overloaded, In +/// stead expressions for +/// * @ref dispersion::dispersion_function::kx_next +/// * @ref dispersion::dispersion_function::ky_next +/// * @ref dispersion::dispersion_function::kz_next +/// * @ref dispersion::dispersion_function::x_next +/// * @ref dispersion::dispersion_function::y_next +/// * @ref dispersion::dispersion_function::z_next +/// * @ref dispersion::dispersion_function::t_next //------------------------------------------------------------------------------ #ifndef solver_h #define solver_h diff --git a/graph_framework/timing.hpp b/graph_framework/timing.hpp index 0c67942..5303dbc 100644 --- a/graph_framework/timing.hpp +++ b/graph_framework/timing.hpp @@ -11,7 +11,7 @@ #include /// Name space for timers. -namespace timeing { +namespace timing { //------------------------------------------------------------------------------ /// @brief A timing object. //------------------------------------------------------------------------------ diff --git a/graph_korc/xkorc.cpp b/graph_korc/xkorc.cpp index 845d5d2..c3f83c5 100644 --- a/graph_korc/xkorc.cpp +++ b/graph_korc/xkorc.cpp @@ -9,7 +9,7 @@ //------------------------------------------------------------------------------ template void run_korc() { - const timeing::measure_diagnostic t_total("Total Time"); + const timing::measure_diagnostic t_total("Total Time"); const size_t num_particles = 1000000; std::cout << "Num particles " << num_particles << std::endl; @@ -24,7 +24,7 @@ void run_korc() { threads[i] = std::thread([num_particles, batch, extra] (const size_t thread_number) -> void { const size_t local_num_particles = batch + (extra > thread_number ? 1 : 0); - const timeing::measure_diagnostic t_setup("Setup Time"); + const timing::measure_diagnostic t_setup("Setup Time"); auto eq = equilibrium::make_efit (EFIT_FILE); //auto eq = equilibrium::make_slab_density (); @@ -141,7 +141,7 @@ void run_korc() { t_setup.print(); - const timeing::measure_diagnostic t_run("Run Time"); + const timing::measure_diagnostic t_run("Run Time"); work.pre_run(); for (size_t i = 0; i < 1000000; i++) { /* sync.join(); diff --git a/graph_tests/f_binding_test.f90 b/graph_tests/f_binding_test.f90 index 64f04ad..1c3d962 100644 --- a/graph_tests/f_binding_test.f90 +++ b/graph_tests/f_binding_test.f90 @@ -185,12 +185,12 @@ C_NULL_PTR, & 'f_binding_converge' // C_NULL_CHAR, & 1_C_LONG, 1.0E-30_C_DOUBLE, 1000_C_LONG) - CALL graph%compile() + CALL graph%compile value(1) = 10.0 CALL graph%copy_to_device(z, value) - CALL graph%pre_run() - CALL graph%run() - CALL graph%wait() + CALL graph%pre_run + CALL graph%run + CALL graph%wait CALL graph%print(0_C_LONG, (/ graph_ptr(z), graph_ptr(y) /)) CALL graph%copy_to_host(y, value) @@ -357,12 +357,12 @@ C_NULL_PTR, & 'f_binding_converge' // C_NULL_CHAR, & 1_C_LONG, 1.0E-30_C_DOUBLE, 1000_C_LONG) - CALL graph%compile() + CALL graph%compile value(1) = 10.0 CALL graph%copy_to_device(z, value) - CALL graph%pre_run() - CALL graph%run() - CALL graph%wait() + CALL graph%pre_run + CALL graph%run + CALL graph%wait CALL graph%print(0_C_LONG, (/ graph_ptr(z), graph_ptr(y) /)) CALL graph%copy_to_host(y, value) @@ -533,12 +533,12 @@ C_NULL_PTR, & 'f_binding_converge' // C_NULL_CHAR, & 1_C_LONG, 1.0E-30_C_DOUBLE, 1000_C_LONG) - CALL graph%compile() + CALL graph%compile value(1) = 10.0 CALL graph%copy_to_device(z, value) - CALL graph%pre_run() - CALL graph%run() - CALL graph%wait() + CALL graph%pre_run + CALL graph%run + CALL graph%wait CALL graph%print(0_C_LONG, (/ graph_ptr(z), graph_ptr(y) /)) CALL graph%copy_to_host(y, value) @@ -727,12 +727,12 @@ C_NULL_PTR, & 'f_binding_converge' // C_NULL_CHAR, & 1_C_LONG, 1.0E-30_C_DOUBLE, 1000_C_LONG) - CALL graph%compile() + CALL graph%compile value(1) = 10.0 CALL graph%copy_to_device(z, value) - CALL graph%pre_run() - CALL graph%run() - CALL graph%wait() + CALL graph%pre_run + CALL graph%run + CALL graph%wait CALL graph%print(0_C_LONG, (/ graph_ptr(z), graph_ptr(y) /)) CALL graph%copy_to_host(y, value) diff --git a/graph_tests/solver_test.cpp b/graph_tests/solver_test.cpp index e213bbe..34528a5 100644 --- a/graph_tests/solver_test.cpp +++ b/graph_tests/solver_test.cpp @@ -42,15 +42,15 @@ void test_solver(const typename SOLVER::base tolarance, auto dt_const = graph::constant(static_cast (dt)); SOLVER solve(w, kx, ky, kz, x, y, z, t, dt_const, eq); - const timeing::measure_diagnostic solver("init"); + const timing::measure_diagnostic solver("init"); auto residule = solve.init(kx, tolarance); solver.print(); - const timeing::measure_diagnostic compile("compile"); + const timing::measure_diagnostic compile("compile"); solve.compile(); compile.print(); - const timeing::measure_diagnostic step("step"); + const timing::measure_diagnostic step("step"); for (size_t i = 0; i < 5; i++) { solve.step(); assert(std::abs(solve.check_residule(0)) < std::abs(tolarance) && -- GitLab From 469c3b7987d60678efc4b061444e5a800b88650c Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 18:44:21 -0400 Subject: [PATCH 06/12] Add vmec flux surface image. --- graph_docs/vmec.png | Bin 0 -> 233715 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 graph_docs/vmec.png diff --git a/graph_docs/vmec.png b/graph_docs/vmec.png new file mode 100644 index 0000000000000000000000000000000000000000..8a36cf3d90943cb608c322fac1ef0da8e6e402cf GIT binary patch literal 233715 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 literal 0 HcmV?d00001 -- GitLab From 2db0ee3dd8bfda5201511313da7f1e50ffdea23f Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 19:19:42 -0400 Subject: [PATCH 07/12] Change the README to be a quick start guide that references the hosted documents. --- README.md | 63 ++++++----------------- graph_framework.xcodeproj/project.pbxproj | 2 + 2 files changed, 17 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 77bd127..d3637df 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,21 @@ -# graph_framework +# Quick Start Guide -Graph computation framework that supports auto differentiation. +graph_framework Graph computation framework that supports auto differentiation. +It is designed to allow domain scientists to create cross platform GPU +accelerated code. -# Dependencies -This code makes use of the [NetCDF `C` library](https://www.unidata.ucar.edu/software/netcdf/). - -On Macs, this requires the latest install of XCode 16.3. - -# Compiling -To compile the code, first clone this repository. - -A `graph_framework` directory will be created. In this directory create -a `build` directory and navigate to it. - -``` -cd graph_framework -mkdir build -cd build -``` - -It's recommended that you use the `ccmake` to configure the build system. -From inside the build directory, run the `ccmake` command +## Documentation +[graph_framework-docs](https://ornl-fusion.github.io/graph_framework-docs) Documentation for the graph_framework. +## Obtaining the Code +To get started clone this repository using the command. ``` -ccmake ../ +git clone https://github.com/ORNL-Fusion/graph_framework.git ``` -Initally, there will be no options. Press the `c` key to configure. -During this step, the LLVM software repo is cloned and configured. -This may take a while. Once configured, there will be several options. - -- On Linux systems, you may optionally use CUDA by toggling the `USE_CUDA` -option. -- On Mac systems, you may optionally use Metal by toggling the `USE_METAL` -option. - -__NOTE__: On Macs using the default system compiler, you will need to change -the `CMAKE_CXX_COMPILER` to `clang++`. To do this press the `t` to toggle -to the advanced options. - -Once all the options are configured press the 'c' key again and a -generate 'g' option will be available. Pressing the 'g' key will finish -generating the make file and close out `ccmake`. - -One the makefile is created. The code can be built using `make` or -optionally built in parallel using `make -j'_[number of parallel intances]_. - -__NOTE__: To many parallel instances can cause the LLVM build system to -hang so it is recommended to limit these to less than 20 depending on -the available memory. - -Unit tests can be run by the `make test` command. An example ray tracing -case can be found in `efit_example.sh` of the `graph_driver` directory. +## Compiling the Code +For instructions to build the code consult the +[build system](https://ornl-fusion.github.io/graph_framework-docs/build_system.html) +documentation. This framework uses a [cmake](https://cmake.org) based build +system and requires the [NetCDF-C](https://www.unidata.ucar.edu/software/netcdf/) +library. diff --git a/graph_framework.xcodeproj/project.pbxproj b/graph_framework.xcodeproj/project.pbxproj index fb8c1f0..854d12d 100644 --- a/graph_framework.xcodeproj/project.pbxproj +++ b/graph_framework.xcodeproj/project.pbxproj @@ -400,6 +400,7 @@ C7DC9EEF2E397BE600524F6F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; C7DC9EF12E3A688F00524F6F /* c_binding_test.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; path = c_binding_test.c; sourceTree = ""; }; C7DD87D32E664B440058BA66 /* code_structure.dox */ = {isa = PBXFileReference; lastKnownFileType = text; path = code_structure.dox; sourceTree = ""; }; + C7DD87D42E665E260058BA66 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; C7E134492A3CB3EC0083F6A7 /* output.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = output.hpp; sourceTree = ""; }; C7E5643E28A2A16F000F31A2 /* backend_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = backend_test; sourceTree = BUILT_PRODUCTS_DIR; }; C7E5644A28A2A1C5000F31A2 /* dispersion_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dispersion_test; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -638,6 +639,7 @@ isa = PBXGroup; children = ( C7931E7228073BFC0033B488 /* CMakeLists.txt */, + C7DD87D42E665E260058BA66 /* README.md */, C79141AD22DA9C0600E0BA0D /* graph_framework */, C7931E6928073BCA0033B488 /* graph_tests */, C7DC9EE32E39768300524F6F /* graph_c_binding */, -- GitLab From 7a2c82d767486006741a82c49c34a7155a48089b Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 19:42:57 -0400 Subject: [PATCH 08/12] Make the compling note on macOS a Doxygen note so it stands out. --- graph_docs/compiling.dox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graph_docs/compiling.dox b/graph_docs/compiling.dox index 99d4a04..a37a674 100644 --- a/graph_docs/compiling.dox +++ b/graph_docs/compiling.dox @@ -86,7 +86,7 @@ * USE_SSH Use ssh for git instead of html. * * - * NOTE:macOS uses will need to change the default option for + * @note macOS uses will need to change the default option for * CMAKE_CXX_COMPILER to clang++. This is due to the way the * build systems determines default include directories for system libraries. * This can be accomplished using the advacned options using the t -- GitLab From d5d5987d7a0ca1f673e28cc4ba5fdea752153f53 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 21:28:59 -0400 Subject: [PATCH 09/12] Correct references for solvers. --- graph_framework/solver.hpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index 99525ab..e3a24cc 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -88,16 +88,18 @@ /// ... /// } /// @endcode -/// When a new dispersion function is subclassed from -/// @ref dispersion::dispersion_function no methods need to be overloaded, In -/// stead expressions for -/// * @ref dispersion::dispersion_function::kx_next -/// * @ref dispersion::dispersion_function::ky_next -/// * @ref dispersion::dispersion_function::kz_next -/// * @ref dispersion::dispersion_function::x_next -/// * @ref dispersion::dispersion_function::y_next -/// * @ref dispersion::dispersion_function::z_next -/// * @ref dispersion::dispersion_function::t_next +/// When a new solver method is subclassed from +/// @ref solver::solver_interface no methods need to be overloaded, Instead +/// expressions for +/// * @ref solver::solver_interface::kx_next +/// * @ref solver::solver_interface::ky_next +/// * @ref solver::solver_interface::kz_next +/// * @ref solver::solver_interface::x_next +/// * @ref solver::solver_interface::y_next +/// * @ref solver::solver_interface::z_next +/// * @ref solver::solver_interface::t_next +/// +/// must be created. //------------------------------------------------------------------------------ #ifndef solver_h #define solver_h -- GitLab From c17bd02e7ede5610af1889b43887679fee431077 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 21:37:13 -0400 Subject: [PATCH 10/12] Correct cross reference for timing. --- graph_docs/code_structure.dox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graph_docs/code_structure.dox b/graph_docs/code_structure.dox index 206ac7a..a4f9225 100644 --- a/graph_docs/code_structure.dox +++ b/graph_docs/code_structure.dox @@ -14,7 +14,7 @@ * * @ref jit Generic interface for Just-In-Time compiling of the graphs. * * @ref backend Host side buffers and operations. * * @ref gpu Device drivers for CPU and the GPU. - * * @ref timeing Routines for timing. + * * @ref timing Routines for timing. * * @ref output Routines for loading and saving graph to Netcdf files. * * @ref commandline Routines for parsing command lines. * -- GitLab From dc0e8d742c6e7980a673826f4b307b6c269aa6e8 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Mon, 1 Sep 2025 23:26:24 -0400 Subject: [PATCH 11/12] Fix spelling and grammer errors up to the Tutorial. --- graph_c_binding/graph_c_binding.h | 4 +- graph_docs/compiling.dox | 77 ++++++++++--------- graph_docs/general.dox | 53 ++++++------- graph_docs/main.dox | 15 ++-- graph_docs/tutorial.dox | 37 ++++----- .../graph_fortran_binding.f90 | 7 +- 6 files changed, 96 insertions(+), 97 deletions(-) diff --git a/graph_c_binding/graph_c_binding.h b/graph_c_binding/graph_c_binding.h index aa73003..3736ed6 100644 --- a/graph_c_binding/graph_c_binding.h +++ b/graph_c_binding/graph_c_binding.h @@ -9,7 +9,7 @@ /// /// @section graph_c_binding_into Introduction /// This section assumes the reader is already familar with developing C codes. -/// The simplist method to link framework code into a C code is to create a c++ +/// The simplist method to link framework code into a C code is to create a C++ /// function with @code extern "C" @endcode First create a header file /// c_callable.h /// @code @@ -19,7 +19,7 @@ /// @endcode /// /// Next create a source file c_callable.c and add the -/// framework. This example uses the line +/// framework. This example uses the equation of a line example from the /// @ref tutorial_workflow "making workflows" turorial. /// @code /// // Include the necessary framework headers. diff --git a/graph_docs/compiling.dox b/graph_docs/compiling.dox index a37a674..36d8d4e 100644 --- a/graph_docs/compiling.dox +++ b/graph_docs/compiling.dox @@ -9,15 +9,18 @@ * *


* @section build_system_user User Guide - * The following section is for users of framework. + * The following section is for users of the framework. * * @subsection build_system_user_dependencies Dependencies - * The graph_framwork requires three requires external dependencies and one - * optional dependency.
LLVM is another - * dependency that is used for generating CPU code. However this is - * automatically obtained via the build system. The graph_frame is written using - * the C++20 standard. The C interface using C17 and the fortran interface using - * Fortran 2008. + * The graph_framwork requires three external dependencies and one optional + * dependency. LLVM is another dependency that is + * used for generating CPU code. However this is automatically obtained via the + * build system. The graph_frame is written using the + * C++20 standard. The + * C interface uses + * C17 + * and the fortran interface uses + * Fortran 2008. * * @subsubsection build_system_user_dependencies_required Required * * cmake version greater than 3.21. @@ -28,7 +31,7 @@ * * Doxygen for generating this documentation. * * @subsection build_system_clone Obtaining the code - * The framework code itself be obtained from the + * The framework code itself can be obtained from the * graph_framework * Github repository. * @code @@ -53,7 +56,7 @@ * Where ../ points to the source directory containing the top * level CMakeLists.txt file. * - * The recommended method is to use the interatice ccmake command + * The recommended method is to use the interactive ccmake command * instead. * @code ccmake ../ @@ -62,10 +65,10 @@ * -D option. * * @subsubsection build_system_user_options Build system Options - * Initally, there will be no options. Along the botton, there are several - * command. Use the 'c' command to start the configuation process. Once + * Initially, there will be no options. Along the botton, there are several + * commands. Use the 'c' command to start the configuation process. Once * configured several options will apear. During this process cmake is cloning - * the LLVM repository. So this step may take some time initally. Mode of the + * the LLVM repository. So this step may take some time initally. Most of the * are various options for configuing LLVM and can be ignored. The important * options are listed below. * @@ -78,27 +81,27 @@ * * MinSizeRel * * RelWithDebInfo * USE_VERBOSE Show verbose information about compute kernels. - * BUILD_C_BINDING Generate the C langauge interface. - * BUILD_Fortran_BINDINGGenerate the Fortran language interface. + * BUILD_C_BINDING Generate the @ref graph_c_binding.h "C langauge interface". + * BUILD_Fortran_BINDINGGenerate the @ref graph_fortran "Fortran language interface". * USE_METAL Enable the Metal backend (macOS only). * USE_CUDA Enable the Cuda backend (Linux only). * USE_HIP Enable the Hip backend (Linux only, Hip branch). * USE_SSH Use ssh for git instead of html. * * - * @note macOS uses will need to change the default option for + * @note macOS users will need to change the default option for * CMAKE_CXX_COMPILER to clang++. This is due to the way the * build systems determines default include directories for system libraries. - * This can be accomplished using the advacned options using the t + * This can be accomplished using the advacned options accessed from the t * command or setting this via the command line. * @code cmake -DCMAKE_CXX_COMPILER=clang++ ../ @endcode * - * Every time an option is changed, or a new option is available, you need to - * use the configure c command for changes to take affect. Once all - * options are set, the a generate g options will appear. Using this - * option will build a make file. + * Any time an option is changed, or a new option becomes is available, you need + * to use the configure c command for changes to take affect. Once all + * options are set, a generate g options will appear. Using this option + * will generate the Makefile. * * @subsubsection build_system_trouble_shooting Trouble Shooting. * Some times, cmake will fail to locate the NetCDF library if it is not @@ -113,28 +116,28 @@ * @code make @endcode - * command. Note that due build system first starts by pulling the latest - * of LLVM. The build system then has to build LLVM first which can take a - * while. It is recommended to use a limited parallel build. + * command. Note that the build system first starts by pulling the latest + * revision of LLVM. The build system then has to build LLVM first which can + * take a while. It is recommended to use a limited parallel build. * @code make -j10 @endcode * The -jnum_processes option determines number of parallel - * instances to run. The build products will be found in assocated build - * directories in the build directory. + * instances to run. The build products will be found in assocated directories + * in the build directory. * - * A list of individual components which can be build can be identified using + * A list of individual components which can be built can be identified using * @code - make -h + make help @endcode * - * @subsection build_system_test Running unit tests. + * @subsection build_system_test Running unit tests * Units tests can be run using the command. * @code make test ARGS=-j10 @endcode * Like the parallel build the -jnum_processes option determines - * number of parallel instances to run. + * the number of parallel instances to run. * *
* @section build_system_dev Developer Guide @@ -144,7 +147,7 @@ * The build system defines some macros for defining targets, configuring debug * options, and configuing external dependences. * - * @subsubsection build_system_targets Tool targets. + * @subsubsection build_system_targets Tool targets * *
* add_tool_target(target lang)\n\n @@ -153,7 +156,7 @@ * [in] target The name of the target.\n * [in] lang File extention for the target (c, cpp, f90).\n\n * Target assumes there is a source file defined as target.lang. For - * instance a C++ source file named foo.cpp is configures as + * instance a C++ source file named foo.cpp is configured as * @code add_tool_target(foo cpp) @endcode @@ -176,8 +179,8 @@ * Register a sanitizer option.\n\n * Parameters\n * [in] name The name of the sanitizer flags.\n\n - * This add new for using the SANITIZE_NAME cmake option and - * add -fsanitize=name to the command line arguments. + * This adds a new cmake option SANITIZE_NAME to add + * -fsanitize=name to the command line arguments. *
* * @subsubsection build_system_project Register an external project @@ -203,14 +206,14 @@ * In addition to the standard build options there are several debugging options * that can be enabled. * - * @subsubsection build_system_dev_options Build system Options + * @subsubsection build_system_dev_options Build System Options * * - * *
Build options for developers.
Option Discrption - *
USE_PCH Use precomiled headers during computation. Most users should keep this on. + *
Option Discription + *
USE_PCH Use precompiled headers during computation. Most users should keep this on. *
SAVE_KERNEL_SOURCE Option to dump the generated compute kernel source code to disk. *
USE_INPUT_CACHE Option to cache registers for the kernel arguments. - *
USE_CONSTANT_CACHE Option to use registers to cache constant values otherwise constanst are inlined. + *
USE_CONSTANT_CACHE Option to use registers to cache constant values otherwise constants are inlined. *
SHOW_USE_COUNT Generates information on the number of times a register is used. *
USE_INDEX_CACHE Option to use registers to cache array indicies. *
Sanitizer Flags diff --git a/graph_docs/general.dox b/graph_docs/general.dox index 2ec127d..3e72d21 100644 --- a/graph_docs/general.dox +++ b/graph_docs/general.dox @@ -10,9 +10,9 @@ *
Glossery of terms
Concept Definition *
node A leaf or branch on the graph tree. - *
graph A data stucture connecting leaf nodes. - *
reduce A tranformation of the graph to remove leaf_nodes. - *
auto differentiationA tranformation of the graph build derivatives. + *
graph A data stucture connecting nodes. + *
reduce A transformation of the graph to remove leaf_nodes. + *
auto differentiationA transformation of the graph build derivatives. *
compiler A tool for translating from one language to another. *
JIT Just-in-time compile. *
kernel A code function that runs on a batch of data. @@ -25,27 +25,27 @@ *
safe math Run time checks to avoid off normal conditions. *
API Application programming interface. *
Host The place where kernels are launched from. - *
Device The device side where kernels are run. + *
Device The side where kernels are run. *
* *
* @section general_concepts_graph Graph - * The graph_framework operates by building tree structure of math operations. + * The graph_framework operates by building a tree structure of math operations. * For an example of building expression structures see the * @ref tutorial_expression "basic expressions tutroial". In tree form it is * easy to traverse nodes in the graph. Take the example of equation of a line. * @f{equation}{y=mx + b@f} - * This equation consists of five leaf nodes. The ends of the tree are clasified - * as either variables @f$x@f$ or constants @f$m,b@f$. These leaf_nodes are - * connected by leaf nodes for multiply and additon operations. The ouptut - * @f$y@f$ represents the entire graph of operations. + * This equation consists of five nodes. The ends of the tree are clasified + * as either variables @f$x@f$ or constants @f$m,b@f$. These nodes are connected + * by nodes for multiply and addition operations. The output @f$y@f$ represents + * the entire graph of operations. * @image{} html line_graph.png "The graph stucture for y = mx + b." * Evaluation of graphs start from the top most node in this case the @f$+@f$ * operation. Evaluation of a node is not performed until all subnodes are * evaluated starting with the left operand. Evaluation starts by recursively - * evaluating the left operands until the last leaf_node is reached @f$m@f$. + * evaluating the left operands until the last node is reached @f$m@f$. * @image{} html line_graph_eval1.png "" - * Once @f$m@f$ the result is returned ot the @f$+@f$ then the right operand is + * Once @f$m@f$ the result is returned to the @f$+@f$ then the right operand is * evaluated. * @image{} html line_graph_eval2.png "" * Evaluation is repeated until every node in the graph is evaluated. @@ -54,13 +54,13 @@ *
* @section general_concepts_diff Auto Differentiation * From the previous @ref general_concepts_graph "section", it was shown how - * graph can be evaluated. This same evaluation can be applied to build + * graphs can be evaluated. This same evaluation can be applied to build * graphs of a function derivative. For an example of taking derivatives see the * @ref tutorial_derivatives "auto differentiation tutroial". Lets say that we * want to take the derivative of @f$\frac{\partial y}{\partial x}@f$. This is - * achieved by evaluating the until bottom left most leaf_node is reached. Then - * a new graph is build starting with @f$\frac{\partial m}{\partial x}=0@f$. - * Applying the first half of the chain rule we build a new graph for @f$0x@f$ + * achieved by evaluating the until bottom left most node is reached. Then a new + * graph is build starting with @f$\frac{\partial m}{\partial x}=0@f$. Applying + * the first half of the chain rule we build a new graph for @f$0x@f$ * @image{} html line_graph_dydf1.png "" * Then we take the derivative of the right operand and apply the second half * of the chain rule to build a new graph for @f$0x=0@f$. @@ -72,17 +72,18 @@ * @section general_concepts_reduction Reduction * The final expression for @f$\frac{\partial y}{\partial x}@f$ contains many * unnecessary nodes in the graph. Instead of building full graphs, we can - * simplify and eleminate node as we build them. For instance, when the - * expression @f$0x@f$ this create can be immediately reduced to a single node. + * simplify and eleminate nodes as we build them. For instance, when the + * expression @f$0x@f$ this created can be immediately reduce it to a single + * node. * @image{} html line_graph_reduce1.png "" - * Applying all possible reduction reduces the final expression to + * Applying all possible reductions reduces the final expression to * @f$\frac{\partial y}{\partial x}=m@f$. * @image{} html line_graph_reduce_final.png "" * By reducing graphs as they are build, we can eliminate nodes one by one. * *
* @section general_concepts_compile Compile - * Once graph expressions are build, they can be compiled to a compute kernel. + * Once graph expressions are built, they can be compiled to a compute kernel. * For an example of compiling expression trees into kernels see the * @ref tutorial_workflow "workflow tutroial". * Using the same recursive evaluation, we can visit each node of a graph and @@ -92,22 +93,22 @@ * be genereted from multiple outputs and maps. * * @subsection general_concepts_compile_inputs Inputs - * Inputs are the varible nodes that define the graph. In the line example - * @f$\frac{\partial y}{\partial x}@f$, the input variable would be the node - * for @f$x@f$. Some graphs have no inputs. The graph for + * Inputs are the variable nodes that define the graph inputs. In the line + * example @f$\frac{\partial y}{\partial x}@f$, the input variable would be the + * node for @f$x@f$. Some graphs have no inputs. The graph for * @f$\frac{\partial y}{\partial x}=m@f$ has eliminated all the variable nodes * in the graph. * * @subsection general_concepts_compile_outputs Outputs * Outputs are the ends of the nodes. These are the values we want to compute. - * Any node of a graph can be a potential output. For each out put a device + * Any node of a graph can be a potential output. For each output a device * buffer is generated to store the results of the evalutaion. For nodes that * are not used as outputs, no buffers need to be created since those results * are never stored. * * @subsection general_concepts_compile_maps Maps - * Maps enable the results of an output node to stored in an input node. This is - * use for a wide varity of steps. For instance take a gradient decent step. + * Maps enable the results of an output node to be stored in an input node. This + * is use for a wide varity of steps. For instance take a gradient decent step. * @f{equation}{y = y + \frac{\partial f}{\partial x}@f} * In this case the output of the expression * @f$y + \frac{\partial f}{\partial x}@f$ @@ -120,7 +121,7 @@ * *
* @section general_concepts_safe_math Safe Math - * There are some conditions where mathematically, a graph should evaluate to + * There are some conditions where mathematically, a graph should evaluate to a * normal number. However, when evaluted suing floating point precison, can lead * to Inf or NaN. An example of this the * @f$\exp\left(x\right)@f$ function. For large argument values, diff --git a/graph_docs/main.dox b/graph_docs/main.dox index adcb404..2e311c1 100644 --- a/graph_docs/main.dox +++ b/graph_docs/main.dox @@ -3,11 +3,10 @@ * @tableofcontents * @section introduction Introduction * The graph_framework - * is a domain specific compiler for translating physics - * equations to optimized code that run a on a GPUs and CPUs. The domain - * specific aspect limits this to classes of problems where the same physics is - * applied to a ensemble. Eamples include RF Ray tracing, particle pushing, and - * field line following. + * is a domain specific compiler for translating physics equations to optimized + * code that runs on GPUs and CPUs. The domain specific aspect limits this to + * classes of problems where the same physics is applied to an ensemble. Eamples + * include RF Ray tracing, particle pushing, and field line following. * * @subsection purpose Purpose * The purpose of this framework is to enable domain scientists to write code @@ -15,15 +14,15 @@ * * This framework enables: * * Portability to Nvidia, AMD, and Apple GPUs and CPUs. - * * Abstract physcis from the compute. + * * Abstraction of the physics from the compute. * * Enable Auto Differentiation. * * Enable easy embedding in C, C++, and Fortran codes. * *
* @section tools User guides for tools * @subsection rf_ray_tracing RF Ray tracing - * This section covers user guides to run the RF Ray traceing code. To run this - * code, a use selects an equilibrium, a wave distribution function, a solver + * This section covers user guides to run the RF Ray tracing code. To run this + * code, a user selects an equilibrium, a wave distribution function, a solver * method, intial ray conditions, and a power obsorption model. To run an * example follow the instructions for the @ref xrays_commandline_example. * diff --git a/graph_docs/tutorial.dox b/graph_docs/tutorial.dox index baeca88..85636bd 100644 --- a/graph_docs/tutorial.dox +++ b/graph_docs/tutorial.dox @@ -1,12 +1,12 @@ /*! * @page tutorial Tutorial - * @brief Hands on tutorial for building expressions and running workflow. + * @brief Hands on tutorial for building expressions and running workflows. * @tableofcontents * * @section tutorial_introduction Introduction * In this tutorial we will put the basic @ref general_concepts of the - * graph_into action. This will discuss building trees, generating, and - * executing workflows. + * graph_framework into action. This will discuss building trees, generating + * kernels, and executing workflows. * * To accomplish this there is a playground tool in the graph_framework * directory. This playground is a preconfigured executable target which can be @@ -27,8 +27,8 @@ int main(int argc, const char * argv[]) { } @endcode * To start, create a template function above main and call that function from - * main. This will allow to play with different floating point types. For now we - * will start with a simple floating point type. + * main. This will allow us to play with different floating point types. For now + * we will start with a simple floating point type. * @code #include "../graph_framework/jit.hpp" @@ -47,9 +47,10 @@ int main(int argc, const char * argv[]) { END_GPU } @endcode - * Here @ref jit::float_scalar is a C++20 + * Here @ref jit::float_scalar is a + * C++20 * Concept for - * valid types of floating point types allowed by the framework. + * valid floating point types allowed by the framework. * *
* @section tutorial_basic Basic Nodes @@ -97,7 +98,7 @@ void run_tutorial() { } @endcode * An explicit @ref graph::constant_node is create for m while an - * impicit constant was defined for b. Node in the implicit case, the + * impicit constant was defined for b. Note in the implicit case, the * actual node for b is not created until we use it in an expression. * *
@@ -147,19 +148,19 @@ void run_tutorial() { } @endcode * Here we take derivatives using the @ref graph::leaf_node::df method. We can - * also take several variation of this. + * also take several variations of this. * @code auto dydm = y->df(m); auto dydy = y->df(y); auto dydb = y->df(m*x); @endcode - * The respective results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. + * The results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. * *
* @section tutorial_workflow Making workflows. - * In this section we will build workflow from these nodes we created. For - * simplicity we will decrease the number of elements in variable so we can set - * the values easier. First thing we do is create a @ref workflow::manager. + * In this section we will build a workflow from these nodes we created. For + * simplicity we will decrease the number of elements in the variable so we can + * set the values easier. First thing we do is create a @ref workflow::manager. * @code template void run_tutorial() { @@ -270,7 +271,7 @@ work.print(2, {x, y, dydx}); @endcode * * @subsection tutorial_workflow_iter Iteration - * In this section we are going to make use of maps to iterate a variable. I + * In this section we are going to make use of maps to iterate a variable. We * want to evaluate the value of @f$y@f$ and set it as the new value of @f$x@f$. * We do this my modifying call to @ref workflow::manager::add_item to define * a map. This generates a kernel where after @f$y@f$ is computed it is stored @@ -306,11 +307,11 @@ for (size_t i = 0; i < 10; i++) { @endcode * *
- * @section tutorial_workflow_newton Newtons Method. + * @section tutorial_workflow_newton Newton's Method. * In this tutorial we are going to show how we can put all these concepts - * together to impliment a newtons method. Newtons method if defined as + * together to implement a newtons method. Newton's method is defined as * @f{equation}{x = x - \frac{f\left(x\right)}{\frac{\partial}{\partial x}f\left(x\right)}@f} - * From the iteration example, it's step update can be handled by a simple map. + * From the iteration example, its step update can be handled by a simple map. * However we need a measure for convergence. To do that we output the value of * @f$f\left(x\right)@f$. Lets setup a test function. * @code @@ -366,7 +367,7 @@ void run_tutorial() { @endcode * * However there are some things that are not optimial here. We are performing - * a reduction on the host side and transfer the entire array to the host. To + * a reduction on the host side and transfering the entire array to the host. To * improve this we can use a converge item instead. * @code // Create a workflow manager. diff --git a/graph_fortran_binding/graph_fortran_binding.f90 b/graph_fortran_binding/graph_fortran_binding.f90 index 6d7e2ff..8a2a5e1 100644 --- a/graph_fortran_binding/graph_fortran_binding.f90 +++ b/graph_fortran_binding/graph_fortran_binding.f90 @@ -1,12 +1,6 @@ !------------------------------------------------------------------------------- !> @file graph_fortran_binding.f90 !> @brief Implimentation of the Fortran binding library. -! -! Note separating the Doxygen comment block here so the detailed description is -! found in the Module not the file. -! -!> Module contains subroutines for calling this from fortran. -!------------------------------------------------------------------------------- !------------------------------------------------------------------------------- !> @page graph_fortran_binding Embedding in Fortran code !> @brief Documentation for linking into Fortran code base. @@ -85,6 +79,7 @@ !> @note The @ref graph_fortran::graph_null_array allows set arrays of nodes to !> null. !------------------------------------------------------------------------------- +!> Module contains subroutines for calling this from fortran. MODULE graph_fortran USE, INTRINSIC :: ISO_C_BINDING -- GitLab From 022953fa9d8f567bfdbd99b5bacf56f9da82dd99 Mon Sep 17 00:00:00 2001 From: cianciosa Date: Tue, 2 Sep 2025 12:09:13 -0400 Subject: [PATCH 12/12] Fix more copy and paste errors and typos. --- README.md | 9 +-- graph_docs/tutorial.dox | 28 ++++----- graph_driver/xrays.cpp | 10 ++-- .../graph_fortran_binding.f90 | 8 +-- graph_framework/absorption.hpp | 6 +- graph_framework/dispersion.hpp | 31 ++++++++-- graph_framework/equilibrium.hpp | 23 +++---- graph_framework/node.hpp | 60 +++++++++++-------- graph_framework/solver.hpp | 12 ++-- 9 files changed, 108 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index d3637df..fb7d556 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # Quick Start Guide -graph_framework Graph computation framework that supports auto differentiation. -It is designed to allow domain scientists to create cross platform GPU -accelerated code. +**graph_framework**: A graph computation framework that supports auto +differentiation. It is designed to allow domain scientists to create cross +platform GPU accelerated code and embed those codes in existing legacy tools. ## Documentation -[graph_framework-docs](https://ornl-fusion.github.io/graph_framework-docs) Documentation for the graph_framework. +[graph_framework-docs](https://ornl-fusion.github.io/graph_framework-docs) +Documentation for the graph_framework. ## Obtaining the Code To get started clone this repository using the command. diff --git a/graph_docs/tutorial.dox b/graph_docs/tutorial.dox index 85636bd..aa25e24 100644 --- a/graph_docs/tutorial.dox +++ b/graph_docs/tutorial.dox @@ -8,10 +8,10 @@ * graph_framework into action. This will discuss building trees, generating * kernels, and executing workflows. * - * To accomplish this there is a playground tool in the graph_framework - * directory. This playground is a preconfigured executable target which can be - * used to test out the API's of this framework. The playground starts with a - * blank main function. + * To accomplish this there is a playground tool in the + * graph_playground directory. This playground is a preconfigured + * executable target which can be used to test out the API's of this framework. + * The playground starts with a blank main function. * @code #include "../graph_framework/jit.hpp" @@ -28,7 +28,7 @@ int main(int argc, const char * argv[]) { @endcode * To start, create a template function above main and call that function from * main. This will allow us to play with different floating point types. For now - * we will start with a simple floating point type. + * we will start with a simple float type. * @code #include "../graph_framework/jit.hpp" @@ -49,7 +49,7 @@ int main(int argc, const char * argv[]) { @endcode * Here @ref jit::float_scalar is a * C++20 - * Concept for + * Concept of * valid floating point types allowed by the framework. * *
@@ -65,8 +65,8 @@ void run_tutorial() { } @endcode * Here we are creating a @ref graph::variable_node with the symbol @f$x@f$ - * which holds 1000 elements. The symbol is used to by the @f$\LaTeX@f$ renderer - * to use as a symbol place holder. Any graph can be rendered to latex by + * which holds 1000 elements. The symbol is used by the @f$\LaTeX@f$ renderer + * as a symbol place holder. Any graph can be rendered to @f$\LaTeX@f$ by * calling the @ref graph::leaf_node::to_latex method. * @code template @@ -77,7 +77,7 @@ void run_tutorial() { } @endcode * When compiling and running the code, this will print out the @f$\LaTeX@f$ - * code needed to generate the equation. By copy and pasting this into a + * code needed to generate the equation. By copy and pasting this into * @f$\LaTeX@f$ it produces the symbol @f$x@f$. Note that all nodes of a graph * are wrapped in a * std::shared_ptr. @@ -97,7 +97,7 @@ void run_tutorial() { const T b = 0.6; } @endcode - * An explicit @ref graph::constant_node is create for m while an + * An explicit @ref graph::constant_node is created for m while an * impicit constant was defined for b. Note in the implicit case, the * actual node for b is not created until we use it in an expression. * @@ -154,7 +154,7 @@ auto dydm = y->df(m); auto dydy = y->df(y); auto dydb = y->df(m*x); @endcode - * The results will be @f$x@f$, @f$1@f$, and @f$0@f$ respectively. + * The results will be @f$0.4@f$, @f$x@f$, @f$1@f$, and @f$0@f$ respectively. * *
* @section tutorial_workflow Making workflows. @@ -263,7 +263,7 @@ work.print(0, {x, y, dydx}); work.print(1, {x, y, dydx}); work.print(2, {x, y, dydx}); @endcode - * Restore the expected result. + * This restores the expected result. * @code 1 1 0.4 2 1.4 0.4 @@ -309,10 +309,10 @@ for (size_t i = 0; i < 10; i++) { *
* @section tutorial_workflow_newton Newton's Method. * In this tutorial we are going to show how we can put all these concepts - * together to implement a newtons method. Newton's method is defined as + * together to implement a Newton's method. Newton's method is defined as * @f{equation}{x = x - \frac{f\left(x\right)}{\frac{\partial}{\partial x}f\left(x\right)}@f} * From the iteration example, its step update can be handled by a simple map. - * However we need a measure for convergence. To do that we output the value of + * However, we need a measure for convergence. To do that we output the value of * @f$f\left(x\right)@f$. Lets setup a test function. * @code template diff --git a/graph_driver/xrays.cpp b/graph_driver/xrays.cpp index 3b86261..347d67e 100644 --- a/graph_driver/xrays.cpp +++ b/graph_driver/xrays.cpp @@ -928,10 +928,10 @@ void bin_power(const commandline::parser &cl, /// @endcode /// Inital values for @f$k_{y}@f$ and @f$k_{z}@f$ will be sampled from a normal /// distribution fuction. Both of them have a standard deviation of 10. -/// @f$k_{y}@f$ has a mean of 100 and @f$k_{z}@f$ has zero mean. -/// @f$k_{x}@f$ uses the default uniform value of 100. However, it -/// configured to solve for the a @f$k_{x}@f$ which satisfies the dispersion -/// function given the values of @f$\omega,k_{y},k_{z},\vec{x}@f$. +/// @f$k_{y}@f$ has a mean of -100 and @f$k_{z}@f$ has zero mean. +/// @f$k_{x}@f$ uses the default uniform value of -700.0. However, it is +/// configured to solve for @f$k_{x}@f$ which satisfies the dispersion function +/// given the values of @f$\omega,k_{y},k_{z},\vec{x}@f$. /// /// @subsection xrays_commandline_example_model Ray Models. /// @code @@ -941,7 +941,7 @@ void bin_power(const commandline::parser &cl, /// initalized from ../graph_tests/efit.nc. /// /// @code -/// --absorption_model=weak_damping --dispersion=ordinary_wave--solver=rk4 +/// --absorption_model=weak_damping --dispersion=ordinary_wave --solver=rk4 /// @endcode /// It uses the @ref dispersion_function_o_wave "o-mode" dispersion function. /// Rays are integrated using a @ref solvers_rk4 integrator. Power absorption diff --git a/graph_fortran_binding/graph_fortran_binding.f90 b/graph_fortran_binding/graph_fortran_binding.f90 index 8a2a5e1..183b4e1 100644 --- a/graph_fortran_binding/graph_fortran_binding.f90 +++ b/graph_fortran_binding/graph_fortran_binding.f90 @@ -3,13 +3,13 @@ !> @brief Implimentation of the Fortran binding library. !------------------------------------------------------------------------------- !> @page graph_fortran_binding Embedding in Fortran code -!> @brief Documentation for linking into Fortran code base. +!> @brief Documentation for linking into a Fortran code base. !> @tableofcontents !> !> @section graph_fortran_binding_into Introduction !> This section assumes the reader is already familar with developing Fortran !> codes. The simplist method is to create a C callable function like the -!> @ref graph_c_binding_into "C binding exmaple". Then create a fortran +!> @ref graph_c_binding_into "C binding exmaple". Then create a Fortran !> interface for it. !> @code !> INTERFACE @@ -76,8 +76,8 @@ !> !> @note Graphs need to use the @ref graph_fortran::graph_ptr function to get !> the pointer address of node. -!> @note The @ref graph_fortran::graph_null_array allows set arrays of nodes to -!> null. +!> @note The @ref graph_fortran::graph_null_array allows setting array of nodes +!> arguments to null. !------------------------------------------------------------------------------- !> Module contains subroutines for calling this from fortran. MODULE graph_fortran diff --git a/graph_framework/absorption.hpp b/graph_framework/absorption.hpp index d801e8e..7119a06 100644 --- a/graph_framework/absorption.hpp +++ b/graph_framework/absorption.hpp @@ -11,14 +11,14 @@ /// /// @section absorption_model_intro Introduction /// This page documents the types of dispersion functions available. Tracing -/// the ray is only the first step in the process. Along that ray power is +/// the ray is only the first step in the process. Along that, ray power is /// deposited into the plasma. For tracing the ray we assumed the wave number -/// was always real. However now we need to figure out what the imaginary +/// was always real. However, now we need to figure out what the imaginary /// component is. /// ///
/// @subsection absorption_model_hot Hot Plasma Disperison Function -/// To do this we know assume a hot plasma dispersion function. +/// To do this we now assume a hot plasma dispersion function. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=i\sigma\Gamma_{0}+\Gamma_{1}+\vec{n}_{\perp}\cdot\vec{n}_{\perp}\frac{P\omega}{\omega_{ce}}\left(1+\zeta Z\left(\zeta\right)\right)\left(\Gamma_{2} + \Gamma_{5}F\right)\equiv 0 @f} /// Where /// @f{equation}{\Gamma_{0}=\vec{n}_{\perp}\cdot\vec{n}_{\perp}\left(\vec{n}\cdot\vec{n}-2\left(1-2q\right)\right)+\left(1-P\right)\left(2\left(1-2q\right)-\left(\vec{n}\cdot\vec{n}+n_{||}^{2}\right)\right)@f} diff --git a/graph_framework/dispersion.hpp b/graph_framework/dispersion.hpp index 26089a6..0727f38 100644 --- a/graph_framework/dispersion.hpp +++ b/graph_framework/dispersion.hpp @@ -69,7 +69,7 @@ /// This dispersion function now accounts for how occilations in the plasma /// propagate. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=\omega_{pe}+\frac{3}{2}\vec{k}\cdot\vec{k}v^{2}_{th}-\omega^{2}\equiv 0 @f} -/// It has no resonances or cutoffs. But @f$v_{g}@f$ can never exceed @f$v_{th}@f$. +/// It has no resonances. Waves cannot propagate below @f$\omega_{pe}@f$ and @f$v_{g}@f$ can never exceed @f$v_{th}@f$. /// @image{} html bohm-gross.png "" /// ///
@@ -83,7 +83,9 @@ /// ///
/// @subsection dispersion_function_x_wave Extra Ordinary Wave -/// This dispersion relation encapsulates wave physics in a cold plasma medium. +/// This disperison function represents a wave with a +/// @f$\vec{E}_{1}\perp\vec{B}_{0}@f$. That means the electric field occilates +/// perpendicular to the magnetic field. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=1-\frac{\omega_{pe}^2}{\omega^{2}}\frac{\omega^{2}-\omega_{pe}^2}{\omega^{2}-\omega_{h}^2}-\vec{n}_{\perp}\cdot\vec{n}_{\perp}\equiv 0 @f} /// This mode has /// This wave has two branches. One branch is cannot not progagate below the @@ -95,9 +97,9 @@ /// ///
/// @subsection dispersion_function_cold_plasma Cold Plasma -/// This disperison function represents a wave in a vaccume. +/// This disperison function represents a wave in a cold plasma medium. /// @f{equation}{D\left(\vec{x},\vec{k},\omega\right)=det\left(\vec{\epsilon}+\vec{n}\vec{n}-\vec{n}\cdot\vec{n}\vec{I}\right)\equiv 0 @f} -/// The quantity @f$\epsilon @f$ is the diaelectric tensor. Using Onsager +/// The quantity @f$\vec{\epsilon}@f$ is the diaelectric tensor. Using Onsager /// symmetries, this tensor is defined as /// @f{equation}{\vec{\epsilon}=\left(\begin{array}{ccc}\epsilon_{11}&\epsilon_{12}&0\\-\epsilon_{12}&\epsilon_{11}&0\\0&0&\epsilon_{33}\end{array}\right)@f} /// where @@ -112,8 +114,8 @@ ///
/// @section dispersion_function_devel Developing new dispersion functions /// This section is intended for code developers and outlines how to create new -/// equilibrium models. New equilibrium models can be created from a subclass -/// of @ref dispersion::dispersion_function or any other existing +/// dispersion functions. New dispersion functions can be created from a +/// subclass of @ref dispersion::dispersion_function or any other existing /// dispersion_function class and overloading class methods. For convinence the /// @ref dispersion::physics class contains several defined physical constants. /// @code @@ -125,6 +127,23 @@ /// When a new dispersion function is subclassed from /// @ref dispersion::dispersion_function an implimentation must be provided for /// the pure virtual method @ref dispersion::dispersion_function::D. +/// @code +/// template +/// class new_dispersion final : public dispersion_function { +/// public: +/// virtual graph::shared_leaf D(graph::shared_leaf w, +/// graph::shared_leaf kx, +/// graph::shared_leaf ky, +/// graph::shared_leaf kz, +/// graph::shared_leaf x, +/// graph::shared_leaf y, +/// graph::shared_leaf z, +/// graph::shared_leaf t, +/// equilibrium::shared &eq) { +/// ... +/// } +/// }; +/// @endcode //------------------------------------------------------------------------------ #ifndef dispersion_h diff --git a/graph_framework/equilibrium.hpp b/graph_framework/equilibrium.hpp index 1d5fb44..4433fa0 100644 --- a/graph_framework/equilibrium.hpp +++ b/graph_framework/equilibrium.hpp @@ -12,7 +12,8 @@ /// This page documents the types and formatting of the equilibrium models. /// xrays currently supports two equilibrium models. /// * EFIT Are 2D axisymetric equilibria relevant to tokamak devices. -/// * VMEC Are 3D nested flux surface equulibria relevant for stellarator devices. +/// * VMEC Are 3D nested flux surface equilibria relevant for stellarator devices. +/// /// This documentation assumes the user has some familiarity with EFIT or VMEC /// and focuses instead how quanties from these are formatted. /// @@ -22,7 +23,7 @@ /// ///
/// @subsection equilibrum_splines_1D Cubic Splines -/// Cubic splines are 1D interpolation functions that consisting of 4 coeffient +/// Cubic splines are 1D interpolation functions consisting of 4 coeffient /// arrays. They take the form of /// @f{equation}{y\left(x\right)=C_{0} + C_{1}x + C_{2}x^2 + C_{3}x^2@f} /// where @f$x@f$ is a normalized radial index. Cubic splines coefficients can @@ -45,7 +46,7 @@ /// Bicubic Splines are computed in a simular way instead they consist of a /// total of 16 coeffients. These represent 4 spline functions in one /// dimension which interpolate 4 coeffient values for the other dimension. -/// Like the 1D splines, 2D spline coeffients are normalized to the spline +/// Like the 1D splines, 2D spline coeffients are normalized so the spline /// arguments can be used as normalized indices. /// @f{equation}{C'^{ij}_{00}=C^{ij}_{00}-C^{ij}_{01}j+C^{ij}_{02}j^{2}-C^{ij}_{03}j^{3}-C^{ij}_{10}i+C^{ij}_{11}ij-C^{ij}_{12}ij^{2}+C^{ij}_{13}ij^{3}+C^{ij}_{20}i^{2}-C^{ij}_{21}i^{2}j+C^{ij}_{22}i^{2}j^{2}-C^{ij}_{23}i^{2}j^{3}-C^{ij}_{30}i^{3}+C^{ij}_{31}i^{3}j-C^{ij}_{32}i^{3}j^{2}+C^{ij}_{33}i^{3}j^{3}j@f} /// @f{equation}{C'^{ij}_{01}=C^{ij}_{01}-2C^{ij}_{02}j+3C^{ij}_{03}j^{2}-C^{ij}_{11}i+2C^{ij}_{12}ij-3C^{ij}_{13}ij^{2}+C^{ij}_{21}i^{2}-2C^{ij}_{22}i^{2}j+3C^{ij}_{23}i^{2}j^{2}-C^{ij}_{31}i^{3}+2C^{ij}_{32}i^{3}j-3C^{ij}_{33}i^{3}j^{2}@f} @@ -110,7 +111,7 @@ /// te_ci numpsi @f$t_{e}@f$ profile coefficents. /// 2D Qantities /// NameSize Discription -/// psi_cij (numr,numz)@f$t_{e}@f$ profile coefficents. +/// psi_cij (numr,numz)@f$\psi\left(r,z\right)@f$ coefficents. /// /// ///
@@ -130,8 +131,8 @@ /// format of name_ci. All radial quantities are splined accross /// the magnetic axis to the opposite end. That is quantities extend from /// @f$-s\rightarrow s @f$. Splines of fourier coeffients are one dimensional -/// splines stored in a 2D array. Radial quantities are store as a full or half -/// grid value. +/// splines stored in a 2D array. Radial quantities are stored as a full or +/// half grid value. /// /// ///
VMEC netcdf file quantities
Dimensions @@ -140,8 +141,8 @@ ///
numsh Size of half radial grid. ///
nummn Number of Fourier modes. ///
Scalar Qantities -///
dphi Step size toroidal flux. -///
ds Step size normalized toroidal flux. +///
dphi Step size of toroidal flux. +///
ds Step size of normalized toroidal flux. ///
signj Sign of the Jacobian. ///
sminf Minimum @f$s @f$ on the full grid. ///
sminh Minimum @f$s @f$ on the half grid. @@ -182,12 +183,12 @@ /// * @ref equilibrium::generic::get_magnetic_field /// /// @note @ref equilibrium::generic::get_characteristic_field is only used by -/// the normalized boris method for particle pushing for most cases this can +/// the normalized boris method for particle pushing. For most cases this can /// simply return 1. /// /// For the remaining methods, or any other methods one wishes to override, the -/// arguments provide expressions the input position of the ray. The methods -/// return are expressions for the quantity at hand. +/// arguments provide expressions for the input position of the ray. The +/// methods return are expressions for the quantity at hand. /// /// @subsection equilibrum_devel_coordinate Noncartesian Coordinates /// While these methods take an @f$x,y,z @f$ as the argument names, there is diff --git a/graph_framework/node.hpp b/graph_framework/node.hpp index b49aa7e..698a551 100644 --- a/graph_framework/node.hpp +++ b/graph_framework/node.hpp @@ -6,24 +6,23 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /// @page new_operations_tutorial Adding New Operations Tutorial -/// @brief A discription of the models for power absorption. +/// @brief A tutorial for creating new operations. /// @tableofcontents /// /// @section new_operations_tutorial_intro Introduction /// In most cases, physics problems can be generated from combinations of graph /// nodes. For instance, the @ref graph::tan nodes are built from -/// @f$\frac{\sin\left(x\right)}{\cos\left(x\right)}@f$. -/// -/// However, some problems will call for adding new operations. This page -/// provides a basic example of how to impliment a new operator -/// @f$foo\left(x\right)@f$ in the graph framework. +/// @f$\frac{\sin\left(x\right)}{\cos\left(x\right)}@f$. However, some problems +/// will call for adding new operations. This page provides a basic example of +/// how to impliment a new operator @f$foo\left(x\right)@f$ in the +/// graph_framework. /// ///
/// @section new_operations_tutorial_node_subclass Node Subclasses -/// All graph nodes are subclasses of @ref graph::leaf_node or subclasses or +/// All graph nodes are subclasses of @ref graph::leaf_node or subclasses of /// other nodes. In the case of our @f$foo\left(x\right)@f$ example we can -/// sublass the @ref graph::straight_node instead. If there are two or three -/// operands you can subclass +/// sublass the @ref graph::straight_node since these assume single arguments. +/// If there are two or three operands you can subclass /// * @ref graph::branch_node /// * @ref graph::triple_node /// @@ -55,11 +54,11 @@ /// to generate a hash for the node. This hash will be used later in a factory /// function to exsure nodes only exist once. /// -/// A factor function constructs a node then immedately reduces it. The reduced -/// node is then checked if it already exists in the -/// @ref leaf_node::caches::node. If the node is a new node, we add it to the -/// cache and return it. Otherwise we discard the node and return the cached -/// node. In it's place. +/// A factory function constructs a node then immedately reduces it. The +/// reduced node is then checked if it already exists in the +/// @ref graph::leaf_node::caches_t::nodes. If the node is a new node, we add +/// it to the cache and return it. Otherwise we discard the node and return the +/// cached node in it's place. /// @code /// template /// shared_leaf foo(shared_leaf x) { @@ -78,8 +77,8 @@ /// } /// @endcode /// -/// To aid in introspection we also need a function to case a generic -/// @ref graph::shared_leaf back to the specifi node tpe. For convience, we +/// To aid in introspection we also need a function to cast a generic +/// @ref graph::shared_leaf back to the specific node type. For convience, we /// also define a type alias for shared type. /// @code /// template @@ -100,14 +99,14 @@ /// @subsection new_operations_tutorial_evalute Evaluate /// To start, lets provide a way to /// @ref graph::leaf_node::evaluate "evalute the node". The first step to -/// evaluate a node is to the nodes argument. +/// evaluate a node is to evaluate the nodes argument. /// @code /// virtual shared_leaf evaluate() { /// backend::buffer result = this->arg->evaluate(); /// } /// @endcode -/// @ref backend::buffer are quick ways we can evalute the node on the GPU -/// before needing to generate GPU kernels and is used by the +/// @ref backend::buffer are quick ways we can evalute the node on the host +/// before needing to generate device kernels and is used by the /// @ref graph::leaf_node::reduce method to precompute constant values. We can /// extend the @ref backend::buffer class with a new method to evaluate foo or /// you can use the existing operators. In this case lets assume @@ -123,7 +122,10 @@ /// @subsection new_operations_tutorial_is_match Is Match /// This methiod checks if the node matches another node. The first thing to /// check is if the pointers match. Then we can check if the structure of the -/// graphs match. +/// graphs match. This is important for the factory function. When checking for +/// cached nodes, two graphs can be identical but have different pointer +/// values. Checking the structure of the graphs ensures that we catch +/// identical graphs. /// @code /// virtual bool is_match(shared_leaf x) { /// if (this == x.get()) { @@ -162,7 +164,7 @@ /// @subsection new_operations_tutorial_df df /// Auto differentiation is provided by returning the derivative expression. /// @f$\frac{\partial}{\partial y}foo\left(x\right)=2x\frac{\partial x}{\partial y}@f$. -/// However, in this frame it is also possible to take a derivative with +/// However, in this framework it is also possible to take a derivative with /// respect to itself @f$\frac{\partial foo\left(x\right)}{\partial foo\left(x\right)}=1 @f$. /// @code /// virtual shared_leaf df(shared_leaf x) { @@ -182,9 +184,9 @@ /// ///
/// @subsection new_operations_tutorial_compile_preamble Compile preamble -/// The @ref graph::leaf_node::compile_preamble method provides ways that +/// The @ref graph::leaf_node::compile_preamble method provides ways to include /// header files or define functions. Lets use this method to define a function -/// that can be called from the kerne. +/// that can be called from the kernel. /// @code /// virtual void compile_preamble(std::ostringstream &stream, /// jit::register_map ®isters, @@ -281,7 +283,8 @@ ///
/// @subsection new_operations_tutorial_get_power_base Get power base /// Return the base of the power node. This provides information for other -/// nodes about how this works for reduction methods. +/// nodes about how this works for reduction methods. In this case the power +/// base is the function argument. /// @code /// virtual shared_leaf get_power_base() const { /// return this->arg; @@ -291,7 +294,8 @@ ///
/// @subsection new_operations_tutorial_get_power_exponent Get power exponent /// Return the exponent of the power node. This provides information for other -/// nodes about how this works for reduction methods. +/// nodes about how this works for reduction methods. In this case, the power +/// exponent is @f$2 @f$. /// @code /// virtual shared_leaf get_power_exponent() const { /// return constant (static_cast (2.0)); @@ -301,6 +305,9 @@ ///
/// @subsection new_operations_tutorial_remove_pseudo Remove Pseudo /// Return the node with pseduo variables removed. +/// @ref graph::pseudo_variable_node are used to end derivatives construction +/// by treating a sub graph as a pseduo variable. Before graphs can be +/// evaluated, these @ref graph::pseudo_variable_node need to be removed. /// @code /// virtual shared_leaf remove_pseudo() { /// if (this->has_pseudo()) { @@ -312,7 +319,8 @@ /// ///
/// @subsection new_operations_tutorial_to_vizgraph To Vizgraph -/// Generates a vizgraph node for visualization. +/// Generates a vizgraph node for +/// visualization. /// @code /// virtual shared_leaf to_vizgraph(std::stringstream &stream, /// jit::register_map ®isters) { diff --git a/graph_framework/solver.hpp b/graph_framework/solver.hpp index e3a24cc..122d853 100644 --- a/graph_framework/solver.hpp +++ b/graph_framework/solver.hpp @@ -10,11 +10,11 @@ /// @tableofcontents /// /// @section solvers_intro Introduction -/// This page documents the types of dispersion functions available. These -/// solver integrate the +/// This page documents the types of solver methods available. These solvers +/// integrate the /// @ref dispersion_function_wave_propagation "wave propagation equations" to -/// solve for the ray trajectory. Each solver builds an expressions for the -/// updates for @f$\vec{x}@f$ and @f$\vec{k}@f$. These expressions are used to +/// solve for the ray trajectory. Each solver builds expressions for the +/// updates to @f$\vec{x}@f$ and @f$\vec{k}@f$. These expressions are used to /// build @ref general_concepts_compile_maps "map" kernels that can be iterated /// to integrate the ray equations. Available integrators are: /// @@ -69,7 +69,7 @@ ///
/// @subsection solvers_adaptive_rk4 Adaptive 4th Order Runge Kutta /// This method is an extension of the 4th Order Runge Kutta which adapts the -/// step size to solutions error. We define a loss function +/// step size to the solutions error. We define a loss function /// @f{equation}{f_{loss}\left(dt,\lambda\right)=\frac{1}{dt}-\lambda D^{2}@f} /// We use a newton method to solve for @f$dt @f$ and @f$\lambda @f$ which /// minimize @f$f_{loss}@f$. The new @f$dt @f$ is then used in a standard 4th @@ -80,7 +80,7 @@ /// This section is intended for code developers and outlines how to create new /// solver methods. All solvers use the same @ref solver::solver_interface /// interface. New solver models can be created from a subclass of -/// @ref solver::solver_interface or any other existing equilibrium class and +/// @ref solver::solver_interface or any other existing solver class and /// overloading class methods. /// @code /// tempate -- GitLab