From ce94db2ec16fa71b0291153cd5e25376a6437ebc Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 17 Sep 2019 15:50:14 -0600 Subject: [PATCH 01/21] Formatting and content updates --- docs/_static/.blank | 1 - docs/_static/docs_options.png | Bin 0 -> 58191 bytes docs/source/dev/dev_phil.rst | 26 ++++++++++++++------------ docs/source/this_doc.rst | 11 ++++++++--- 4 files changed, 22 insertions(+), 16 deletions(-) delete mode 100644 docs/_static/.blank create mode 100644 docs/_static/docs_options.png diff --git a/docs/_static/.blank b/docs/_static/.blank deleted file mode 100644 index 5a53296512..0000000000 --- a/docs/_static/.blank +++ /dev/null @@ -1 +0,0 @@ -Need this file so I can check in a blank _static directory. diff --git a/docs/_static/docs_options.png b/docs/_static/docs_options.png new file mode 100644 index 0000000000000000000000000000000000000000..9105d95e6ebfbe6e524b88811dd589fea9d6770d GIT binary patch literal 58191 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 repository. +Code Style +---------- +OpenFAST and its underlying modules are mostly written in Fortran adhering to +the 2003 standard, but modules can be written in C or C++. The +`NWTC Programmer's Handbook `__ +is the definitive reference for all questions related to working with the +FAST Framework and adding code to OpenFAST. + +Generally, code should be written such that it is straightforward to read. +Syntactic sugar or brevity should not detract from readability. The exception +to this is in situations where performance dictates a poorly readable code. +Here, comment blocks should be used to describe what is not readily apparent +in the code. Indentation is typically three spaces and no tabs. + Versioning ---------- OpenFAST follows `semantic versioning `_. In summary, this @@ -45,15 +59,3 @@ For example, ``OpenFAST-v1.0.0-123-gabcd1234-dirty`` describes OpenFAST as: build [the ``-g`` is for ``git``] - abcd1234 is the first 8 characters of the current commit hash - dirty denotes that local changes have been made but not committed - -Code Style ----------- -OpenFAST and its underlying modules are mostly written in Fortran adhering to -the 2003 standard, but modules can be written in C or C++. Indentation is -typically three spaces and no tabs. - -Generally, code should be written such that it is straightforward to read. -Syntactic sugar or brevity should not detract from readability. The exception -to this is in situations where performance dictates a poorly readable code. -Here, comment blocks should be used to describe what is not readily apparent -in the code. diff --git a/docs/source/this_doc.rst b/docs/source/this_doc.rst index a08d8d369c..780787ac56 100644 --- a/docs/source/this_doc.rst +++ b/docs/source/this_doc.rst @@ -8,9 +8,14 @@ OpenFAST documentation is hosted on generated from both the `master `_ and `dev `_ branches whenever -new commits are added. A PDF of the documentation can be retrieved from -`readthedocs `_ by clicking the arrow on the -lower left corner of the page next to ``v:master`` or ``v:dev``. +new commits are added. Clicking on the bar on the lower left corner of the +page reveals a panel (see image below) containing options to select the branch +of the repository, download the documentation other formats (PFD, HTML, EPub), +and link to other relevant websites. + +.. figure:: ../_static/docs_options.png + :width: 30% + :align: center While OpenFAST developer documentation is being enhanced here, developers are encouraged to consult the legacy FAST v8 From 6839f76b105478145619d881d9b0de5e387006c2 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 17 Sep 2019 17:18:51 -0600 Subject: [PATCH 02/21] Improve the git workflow description --- docs/_static/GitFlowFeatureBranches.png | Bin 73887 -> 124925 bytes docs/source/dev/github_workflow.rst | 58 ++++++++++++++++-------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/docs/_static/GitFlowFeatureBranches.png b/docs/_static/GitFlowFeatureBranches.png index 13e2b03250bbe2777c1dfae8e7522b8462f4c4d9..5b96426c76e9b59f162331cf2c8eb5bd1446b8f6 100644 GIT binary patch literal 124925 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�QQpl!FqPohLNfFE1 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

Kh5V?q&1SWLKGwoIdmjHtQyKHxgywu0?&pf* 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

|W@eX7X<*f|U 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 E57MRp_5c6? literal 73887 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 diff --git a/docs/source/dev/github_workflow.rst b/docs/source/dev/github_workflow.rst index 6c10939f0c..0af4372a69 100644 --- a/docs/source/dev/github_workflow.rst +++ b/docs/source/dev/github_workflow.rst @@ -3,7 +3,7 @@ Working with OpenFAST on GitHub =============================== The majority of the collaboration and development for OpenFAST takes place -on the `github repository `__. There, +on the `GitHub repository `__. There, `issues `__ and `pull requests `__ are discussed and new versions are released. It is the best mechanism for @@ -26,14 +26,14 @@ submitted along with all appropriate documentation and tests. An NREL OpenFAST team member will assign a reviewer and work with the developer to have the code merged into the main repository. -New pull requests should contain +New pull requests should contain the following: - A description of the need for modifications - If the pull request fixes a bug, the accompanying GitHub issue should be referenced -- A highlight of the work implemented +- A summary of the work implemented - Regression test results - If all tests pass, the summary print out should be provided @@ -58,8 +58,9 @@ development community. It is detailed nicely `here `__ and the chart below provides a high level perspective. -.. image:: ../../_static/GitFlowFeatureBranches.png - :align: center +.. figure:: ../../_static/GitFlowFeatureBranches.png + :width: 70% + :align: center Reference: http://nvie.com/posts/a-successful-git-branching-model @@ -71,24 +72,45 @@ On public branches, avoid using `git rebase `__ and never `force push `__. -In OpenFAST development, the typical workflow follows this procedure +In OpenFAST development, the typical workflow follows this procedure: -1. Fork the OpenFAST/OpenFAST repository on GitHub +1. Fork the OpenFAST repository on GitHub -2. Clone your new fork: ``git clone https://github.com//OpenFAST`` +2. Clone your new fork -3. Add OpenFAST/OpenFAST as a remote: ``git remote add upstream https://github.com/OpenFAST/OpenFAST`` +.. code-block:: bash -4. Create a feature branch for active development: -``git branch feature/a_great_feature`` or -``git checkout -b feature/a_great_feature`` + git clone https://github.com//OpenFAST -5. Add new development on `feature/a_great_feature`: -``git add a_file.f90 && git commit -m "A message" && git push`` +3. Add OpenFAST/OpenFAST as a remote named ``upstream`` -5. Update your feature branch with OpenFAST/dev: -``git pull upstream dev && git push`` +.. code-block:: bash -6. Create a GitHub pull request to merge -``youruser/OpenFAST/feature/a_great_feature`` into ``OpenFAST/OpenFAST/dev`` + git remote add upstream https://github.com/OpenFAST/OpenFAST +4. Create a feature branch for active development starting from the OpenFAST + ``dev`` branch and check it out + +.. code-block:: bash + + git branch feature/a_great_feature upstream/dev + git checkout feature/a_great_feature + +5. Add new development on ``feature/a_great_feature`` + +.. code-block:: bash + + git add a_file.f90 + git commit -m "A message" + git push origin feature/a_great_feature + +6. Update your feature branch with ``upstream`` + +.. code-block:: bash + + git pull upstream dev + git push origin feature/a_great_feature + +7. Open a new `pull request `__ + to merge ``/OpenFAST/feature/a_great_feature`` into + ``OpenFAST/OpenFAST/dev`` From 3ed922726a746d241de1c1d95c526d2d91959cb9 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Wed, 18 Sep 2019 00:56:52 -0600 Subject: [PATCH 03/21] Restructure the developer docs sections --- docs/source/dev/build_doc.rst | 87 +++++++++++++++++------------ docs/source/dev/code_style.rst | 15 +++++ docs/source/dev/debugging.rst | 66 ++++++++++++---------- docs/source/dev/dev_phil.rst | 61 -------------------- docs/source/dev/doxy_doc.rst | 8 --- docs/source/dev/github_workflow.rst | 14 ++--- docs/source/dev/index.rst | 70 ++++++++++++++++++++--- docs/source/dev/versioning.rst | 22 ++++++++ 8 files changed, 191 insertions(+), 152 deletions(-) create mode 100644 docs/source/dev/code_style.rst delete mode 100644 docs/source/dev/dev_phil.rst delete mode 100644 docs/source/dev/doxy_doc.rst create mode 100644 docs/source/dev/versioning.rst diff --git a/docs/source/dev/build_doc.rst b/docs/source/dev/build_doc.rst index d8e57eeca7..d8639cd751 100644 --- a/docs/source/dev/build_doc.rst +++ b/docs/source/dev/build_doc.rst @@ -4,80 +4,95 @@ Developing Documentation ======================== OpenFAST documentation is hosted on `readthedocs `_. It is automatically generated -through the readthedocs build system from both the ``master`` and ``dev`` +through the ``readthedocs`` build system from both the ``master`` and ``dev`` branches whenever new commits are added. This documentation uses the `restructured text `_ markup language. Building this documentation locally ----------------------------------- -The documentation is compiled with Sphinx, which is a Python based tool. -Install it and the other required Python packages listed in -``docs/requirements.txt`` with pip or another python package manager. +The documentation is compiled with `Sphinx `__, which is +a Python based tool. Install it and the other required Python packages listed +in ``openfast/docs/requirements.txt`` with ``pip`` or another Python package +manager. + +These additional packages are optional and are not included in the requirements +file: -These packages are optional: - `Doxygen `__ - `Doxylink `__ - `Graphviz `__ +- `LaTeX `__ Doxygen and Graphviz can be installed directly from their website or with a package manager like ``brew``, ``yum``, or ``apt``. Pure python build ------------------ +~~~~~~~~~~~~~~~~~ If CMake and Make are not available on your system, the documentation can be generated directly with `sphinx`. -**Note: This method does not generate the API documentation through Doxygen.** -First, align your build structure to the standard OpenFAST build by creating -a directory at ``openfast/build``. +.. note:: + + This method does not generate the API documentation through Doxygen. -If all tools are available, move into ``openfast/build`` and run the `sphinx` -command: +First, align your directory structure to the standard OpenFAST build by +creating a directory at ``openfast/build``. Then, move into +``openfast/build`` and run this command: -:: +.. code-block:: bash # sphinx-build -b sphinx-build -b html ../docs ./docs/html -If this completes successfully, a html file will be created at +If this completes successfully, an html file will be created at ``build/docs/html/index.html`` which can be opened with any web browser. Building with CMake and Make ----------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In the OpenFAST directory, create a ``build`` directory and move into it. -Then, run CMake with this flag: ``-DBUILD_DOCUMENTATION=ON``. If all -of the required tools are found successfully, CMake will configure with the -ability to build the documentation. +Then, run CMake with this flag: ``-DBUILD_DOCUMENTATION=ON``. CMake will +configure the build system with the necessary files for building +the documentation. + +Next, run the command to compile the docs: + +.. code-block:: bash -Next, run the command ``make docs`` which will first build the Doxygen -documentation and then the Sphinx documentation. If this completes -successfully, a html file will be created at ``build/docs/html/index.html`` -which can be opened with any web browser. + make docs + +This will first build the Doxygen API documentation and then the Sphinx +documentation. If this completes successfully, a html file will be +created at ``build/docs/html/index.html`` which can be opened with any web +browser. -For example, from the OpenFAST directory: +The full procedure for configuring and building the documentation is: -:: +.. code-block:: bash mkdir build cd build cmake .. -DBUILD_DOCUMENTATION=ON make docs -If you modify document source files in ``openfast/docs/source``, you can simply -update the html files through another ``make docs`` in ``openfast/build``: +If any modifications are made to the source files in ``openfast/docs/source``, +you can simply update the html files by executing the ``make`` command again. -:: +The table below lists make-targets related to the documentation. - make docs +======================= ================== ======================================== + Target Command Output location +======================= ================== ======================================== + Full docs make docs openfast/build/docs/html/index.html + Full docs make sphinx openfast/build/docs/html/index.html + Doxygen API Reference make doxygen + HTML only make sphinx-html openfast/build/docs/html/index.html + PDF only make sphinx-pdf openfast/build/docs/latex/Openfast.pdf +======================= ================== ======================================== + +Adding documentation +-------------------- -Building only the html -~~~~~~~~~~~~~~~~~~~~~~ -Generating the only html is much faster than compiling all components of the -documentation. This can be done with ``make sphinx-html``. +Coming soon. -Building the PDF -~~~~~~~~~~~~~~~~ -If LaTeX is installed, a pdf version of the documentation can be built with -``make sphinx-pdf``, and the output is available at -``OpenFAT/build/docs/latex/Openfast.pdf``. +Feel like contributing? Start here! diff --git a/docs/source/dev/code_style.rst b/docs/source/dev/code_style.rst new file mode 100644 index 0000000000..2645df9094 --- /dev/null +++ b/docs/source/dev/code_style.rst @@ -0,0 +1,15 @@ +.. _code_style: + +Code Style +~~~~~~~~~~ +OpenFAST and its underlying modules are mostly written in Fortran adhering to +the 2003 standard, but modules can be written in C or C++. The +`NWTC Programmer's Handbook `__ +is the definitive reference for all questions related to working with the +FAST Framework and adding code to OpenFAST. + +Generally, code should be written such that it is straightforward to read. +Syntactic sugar or brevity should not detract from readability. The exception +to this is in situations where performance dictates a poorly readable code. +Here, comment blocks should be used to describe what is not readily apparent +in the code. Indentation is typically three spaces and no tabs. diff --git a/docs/source/dev/debugging.rst b/docs/source/dev/debugging.rst index e2620ce261..6e7ada3353 100644 --- a/docs/source/dev/debugging.rst +++ b/docs/source/dev/debugging.rst @@ -4,46 +4,54 @@ Debugging OpenFAST ================== Being a Fortran project, OpenFAST can be challenging to debug and the process -is unique for each system and environment. However, a common requirement for -all systems is to compile OpenFAST in debug mode. +is unique for each system and environment. Keep in mind that some OpenFAST +cases can be quite large in their memory footprint and may take a long time +to reach the point of interest in the code. Choosing a test case carefully +could save a significant amount time. -Keep in mind that some OpenFAST cases can be quite large in their memory -footprint and may take a long time to reach the point you're targetting in -the code. Choosing a minimal test case could save significant time. - -It may by helpful to write a small fortran program to verify that your +It may by helpful to write a small fortran program to verify that all debugging tools are set up properly before diving in to OpenFAST. Be sure to simulate a bug by doing something like accessing an array element that is not -allocated and verify that you can catch the bug with your tools. +allocated and verify that you can catch the bug with a given set of tools. + +.. note:: + + A requirement for all systems is to compile OpenFAST in **debug** mode. + +.. _debugging_windows: Debugging on Windows -------------------- -Windows developers using Intel tools can use Visual Studio for debugging. This -is a straightforward process with lots of support from Intel. +Windows developers using Intel tools can use Visual Studio solution included in +the OpenFAST repository for debugging. This is a straightforward process with +lots of support from Intel. + +Otherwise, Windows developers compiling in Unix-style environments should +proceed to :ref:`debugging_linux`. -Otherwise, Windows developers compiling with CygWin or MinGW should proceed to -the section for debugging with linux. +.. _debugging_linux: -Debugging on Linux and macOS ----------------------------- -First, compile OpenFAST in debug mode by setting CMAKE_BUILD_TYPE to Debug. -You can do this on the command line with +Debugging on Linux and Mac +-------------------------- +First, compile OpenFAST in debug mode by setting ``CMAKE_BUILD_TYPE`` to +"Debug". This can be done on the command line with: .. code-block:: bash cmake .. -D CMAKE_BUILD_TYPE=Debug -or by using ccmake to open the command line cmake gui to change it. +or by using ``ccmake`` to open the command line cmake gui to change it. -The GNU debugger, GDB, works well for debugging compiled code. It has a +The GNU debugger, ``gdb``, works well for debugging compiled code. It has a comprehensive command line interface which enables developers to add breakpoints and inspect variables. Driving the debugger through an IDE can make inspecting the code much more -efficient. One IDE known to work well is Visual Studio Code with the Native -Debug extension. You can set up a launch configuration in VS Code so that -you can debug a particular OpenFAST case through the IDE. To do this, open -the launch configuration and add a block similar to this: +efficient. One IDE known to work well is `Visual Studio Code `__ +with the `Native Debug `__ +extension. You can set up a `launch configuration `__ +so that you can debug a particular OpenFAST case through the IDE. To do this, +open the launch configuration and add a block similar to this: .. code-block:: json @@ -60,10 +68,10 @@ the launch configuration and add a block similar to this: "arguments": "${workspaceRoot}/build/reg_tests/glue-codes/openfast/AOC_WSt/AOC_WSt.fst", }, -macOS configuration -~~~~~~~~~~~~~~~~~~~ -GDB on macOS needs some configuration before the system allows it to take -over a process. It is recommended that gdb be installed with homebrew +Mac-specific configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~ +GDB on Mac needs some configuration before the system allows it to take +over a process. It is recommended that ``gdb`` be installed with homebrew .. code-block:: bash @@ -71,7 +79,7 @@ over a process. It is recommended that gdb be installed with homebrew brew install gdb After that completes, be sure to follow the caveats to finish the installation. -For gdb 8.2.1, it looks like this: +For ``gdb 8.2.1``, it looks like this: .. code-block:: bash @@ -85,8 +93,8 @@ For gdb 8.2.1, it looks like this: echo "set startup-with-shell off" >> ~/.gdbinit -For Native Debug on macOS, you have to sort of hack the extension to allow -breakpoints in fortran files by adding this line to your settings.json: +For Native Debug on Mac, you have to sort of hack the extension to allow +breakpoints in fortran files by adding this line to ``.vscode/settings.json``: .. code-block:: json diff --git a/docs/source/dev/dev_phil.rst b/docs/source/dev/dev_phil.rst deleted file mode 100644 index 6addd2f287..0000000000 --- a/docs/source/dev/dev_phil.rst +++ /dev/null @@ -1,61 +0,0 @@ -.. _dev_philosophy: - -OpenFAST Development Philosophy -=============================== - -OpenFAST is intended to be a self sustaining community developed software. -A couple of tenets of this goal are that the code should be reasonably -straightforward to comprehend and manageable to improve. With that in mind, we -expect that new capabilities will include adequate testing and documentation. - -We have the following guidance for developers: - -- When fixing a bug, first introduce a unit test that exposes the bug, fix the - bug, and submit a Pull Request. See :numref:`testing` and - :numref:`github_workflow` for information on testing and the GitHub workflow. - -- When adding a new feature, create appropriate automated unit and regression - tests as described in :numref:`testing`. The objective is to create a GitHub - pull request that provides adequate verification and validation such that the - NREL OpenFAST developer team can merge the pull request with confidence that - the new feature is "correct" and supports our goal of self-sustaining - software. See :numref:`pull_requests` for detailed information on submitting - a pull request. - -- If a code modification affects regression test results in an expected manner, - work with the NREL OpenFAST developer team to upgrade the regression test - suite via a GitHub issue or pull request at the `openfast/r-test `_ - repository. - -Code Style ----------- -OpenFAST and its underlying modules are mostly written in Fortran adhering to -the 2003 standard, but modules can be written in C or C++. The -`NWTC Programmer's Handbook `__ -is the definitive reference for all questions related to working with the -FAST Framework and adding code to OpenFAST. - -Generally, code should be written such that it is straightforward to read. -Syntactic sugar or brevity should not detract from readability. The exception -to this is in situations where performance dictates a poorly readable code. -Here, comment blocks should be used to describe what is not readily apparent -in the code. Indentation is typically three spaces and no tabs. - -Versioning ----------- -OpenFAST follows `semantic versioning `_. In summary, this -means that with a version number as MAJOR.MINOR.PATCH, the components will be -incremented as follows: - -- MAJOR version when introducing incompatible API changes, -- MINOR version when adding functionality in a backwards-compatible manner, and -- PATCH version when making backwards-compatible bug fixes. - -For example, ``OpenFAST-v1.0.0-123-gabcd1234-dirty`` describes OpenFAST as: - -- v1.0.0 is the MAJOR.MINOR.PATCH numbering system and corresponds to a tagged - commit made by NREL on GitHub -- 123-g is the number of additional commits after the most recent tag for a - build [the ``-g`` is for ``git``] -- abcd1234 is the first 8 characters of the current commit hash -- dirty denotes that local changes have been made but not committed diff --git a/docs/source/dev/doxy_doc.rst b/docs/source/dev/doxy_doc.rst deleted file mode 100644 index 15bdda41c9..0000000000 --- a/docs/source/dev/doxy_doc.rst +++ /dev/null @@ -1,8 +0,0 @@ -Doxygen API documentation -========================= - -If the Doxygen documentation is available, it can be found at the following locations - - * `Main Page <../../../doxygen/html/index.html>`_ - * `Index of Classes <../../../doxygen/html/classes.html>`_ - * `Files <../../../doxygen/html/files.html>`_ diff --git a/docs/source/dev/github_workflow.rst b/docs/source/dev/github_workflow.rst index 0af4372a69..d00408e8b0 100644 --- a/docs/source/dev/github_workflow.rst +++ b/docs/source/dev/github_workflow.rst @@ -47,18 +47,14 @@ New pull requests should contain the following: Git workflow and interacting with the main repository ----------------------------------------------------- OpenFAST development should follow "Git Flow" when interacting with the github -repository. Git Flow is a git workflow outlining safe methods of pushing and -pulling commits to a shared repository. Maintaining Git Flow is critical to -prevent remote changes from blocking your local development. - -Git Flow --------- -The Git Flow process is well defined and adopted throughout the software -development community. It is detailed nicely +repository. Git Flow is a well-defined and widely adopted workflow for using +git that outlines safe methods of pushing and pulling commits to a shared +repository. Maintaining Git Flow is critical to prevent remote changes from +blocking your local development. This workflow is detailed nicely `here `__ and the chart below provides a high level perspective. -.. figure:: ../../_static/GitFlowFeatureBranches.png +.. image:: ../../_static/GitFlowFeatureBranches.png :width: 70% :align: center diff --git a/docs/source/dev/index.rst b/docs/source/dev/index.rst index 1bccef2141..adae17751d 100644 --- a/docs/source/dev/index.rst +++ b/docs/source/dev/index.rst @@ -14,13 +14,11 @@ If you'd like to help with general OpenFAST development or work on a particular feature, then first install OpenFAST following the :doc:`installation instructions <../install/index>` for your machine. Next, verify that your installation is valid by running the test suite following the -:doc:`testing instructions <../testing/index>`. - -After a successful and validated build, we encourage reading through the -:doc:`OpenFAST development philosophy ` to understand the general -workflow for individual and coordinated development. Finally, be sure to review -the :doc:`GitHub workflow ` to avoid any merge or code -conflicts. +:doc:`testing instructions <../testing/index>`. While OpenFAST is compiling, we +encourage reading through the :ref:`development_philosophy` section to +understand the general workflow for individual and coordinated development. +Finally, be sure to review the :doc:`GitHub workflow ` to +avoid any merge or code conflicts. With development happening in parallel between NREL, industry partners, and universities, NREL relies on these GitHub tools to coordinate efforts: @@ -35,12 +33,66 @@ universities, NREL relies on these GitHub tools to coordinate efforts: For other questions regarding OpenFAST, please contact `Mike Sprague `_. +.. tip:: + + The following sections provide valuable guidance on workflow and + development tips which make the process more efficient and + effective: + + - :ref:`github_workflow` + - :ref:`code_style` + - :ref:`debugging` + +API Reference +~~~~~~~~~~~~~ +If the Doxygen documentation is available, it can be found at the following +locations: + +- `Main Page <../../../doxygen/html/index.html>`_ +- `Index of Classes <../../../doxygen/html/classes.html>`_ +- `Files <../../../doxygen/html/files.html>`_ + +.. _development_philosophy: + +Development Philosophy +~~~~~~~~~~~~~~~~~~~~~~ + +OpenFAST is intended to be a self sustaining community developed software. +A couple of tenets of this goal are that the code should be reasonably +straightforward to comprehend and manageable to improve. With that in mind, we +expect that new capabilities will include adequate testing and documentation. + +We have the following guidance for developers: + +- When fixing a bug, first introduce a unit test that exposes the bug, fix the + bug, and submit a Pull Request. See :numref:`testing` and + :numref:`github_workflow` for information on testing and the GitHub workflow. + +- When adding a new feature, create appropriate automated unit and regression + tests as described in :numref:`testing`. The objective is to create a GitHub + pull request that provides adequate verification and validation such that the + NREL OpenFAST developer team can merge the pull request with confidence that + the new feature is "correct" and supports our goal of self-sustaining + software. See :numref:`pull_requests` for detailed information on submitting + a pull request. + +- If a code modification affects regression test results in an expected manner, + work with the NREL OpenFAST developer team to upgrade the regression test + suite via a GitHub issue or pull request at the `openfast/r-test `_ + repository. + +Development Guidelines +~~~~~~~~~~~~~~~~~~~~~~ +The following sections provide extended guidance on how to develop source code, +interacting with the NREL OpenFAST team and other community contributors, and +generally debugging and building out features. + .. toctree:: :maxdepth: 1 - dev_phil.rst github_workflow.rst + code_style.rst build_doc.rst debugging.rst - doxy_doc.rst performance.rst + versioning.rst diff --git a/docs/source/dev/versioning.rst b/docs/source/dev/versioning.rst new file mode 100644 index 0000000000..e8d3caf1c6 --- /dev/null +++ b/docs/source/dev/versioning.rst @@ -0,0 +1,22 @@ +.. _versioning: + +Versioning +~~~~~~~~~~ +OpenFAST follows `semantic versioning `_. In summary, this +means that with a version number as MAJOR.MINOR.PATCH, the components will be +incremented as follows: + +- MAJOR version when introducing incompatible API changes, +- MINOR version when adding functionality in a backwards-compatible manner, and +- PATCH version when making backwards-compatible bug fixes. + +For example, ``OpenFAST-v1.0.0-123-gabcd1234-dirty`` describes OpenFAST as: + +=================== ============= + Version Component Explanation +=================== ============= + v1.0.0 MAJOR.MINOR.PATCH numbering system; corresponds to a tagged commit made by NREL on GitHub + 123-g Number of additional commits after the most recent tag for a build [the ``-g`` is for ``git``] + abcd1234 First 8 characters of the current commit hash + dirty Denotes that local changes have been made but not committed; omitted if there are no local changes +=================== ============= From 43ad84de85164bd96ff8e141b4a6165c02a7bb5f Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 20 Sep 2019 14:43:12 -0600 Subject: [PATCH 04/21] Consolidate and improve the installation docs --- .gitignore | 1 + docs/index.rst | 11 +- docs/source/install/index.rst | 408 +++++++++++++++++- docs/source/install/install_cmake_cygwin.rst | 69 --- docs/source/install/install_cmake_linux.rst | 142 ------ docs/source/install/install_cmake_windows.rst | 124 ------ docs/source/install/install_spack.rst | 68 +-- 7 files changed, 432 insertions(+), 391 deletions(-) delete mode 100644 docs/source/install/install_cmake_cygwin.rst delete mode 100644 docs/source/install/install_cmake_linux.rst delete mode 100644 docs/source/install/install_cmake_windows.rst diff --git a/.gitignore b/.gitignore index 7647b77c31..e3ee8923a7 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ __pycache__/* # Build specific files build*/ +_build*/ install/ vs-build/ diff --git a/docs/index.rst b/docs/index.rst index b2258bb525..fd3238b1eb 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -41,16 +41,18 @@ existing code, and we expect that new capabilities will include adequate testing and documentation. Here are some important links: -- `Github Organization Page `_ + +- `OpenFAST Github Organization `_ - `Github Repository `_ -- `Nightly Testing Results `_ +- `Nightly Tests `_ + +**Documentation Directory** .. toctree:: :numbered: :maxdepth: 2 source/this_doc.rst - source/get_started.rst source/install/index.rst source/testing/index.rst source/user/index.rst @@ -58,6 +60,3 @@ Here are some important links: source/license.rst source/help.rst source/acknowledgements.rst - - Nightly Testing Results - github.com Repository diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index 72ecebbec0..91f0e13a0b 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -2,38 +2,410 @@ Installing OpenFAST =================== +Guidelines and procedures for obtaining precompiled binaries or compiling +OpenFAST from source code are described here. While there +are multiple ways to achieve the same outcome, the OpenFAST team has developed +a comprehensive and well though out system for compiling the source code. Thus, +the methods described here are the only officially supported and maintained +paths for obtaining an OpenFAST executable. -The following pages provide instructions for building OpenFAST and/or its modules from source code. -The developer team is moving towards a CMake-only approach that well supports Window Visual Studio users, -but at this time we provide a separate build path for those users. +For Windows users only, precompiled binaries are available as described in the +:ref:`download_binaries` section. For all platforms, OpenFAST is configured +to build with with CMake and a system-appropriate build tool. Background +on CMake is given in :ref:`understanding_cmake` and procedures for configuring +and compiling are given in :ref:`cmake_unix` and :ref:`cmake_windows`. Finally, +an alternative and more appropriate option for compiling on Windows while +doing active software development is given in :ref:`vs_windows`. -Obtaining the OpenFAST source code -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. _download_binaries: -OpenFAST can be cloned (i.e., downloaded) from its `Github Repository `_. -For example, from a command line: +Download binaries +~~~~~~~~~~~~~~~~~ +Each tagged release is accompanied by precompiled binaries for Windows +systems. DLL's for MAP and the DISCON controllers are also included. +The following architecture and precision combinations are currently +available: -:: +- 32 bit single precision +- 64 bit single precision +- 64 bit double precision + +All precompiled binaries can be found in the ``Assets`` dropdown in the +`GitHub Releases `__. Click +`here `__ +to download the latest binaries. + +Compile from source +~~~~~~~~~~~~~~~~~~~ +For compiling from source code, the NREL OpenFAST team has developed an +approach that uses CMake to generate build files for all platforms. At the +moment, CMake support for Visual Studio while doing active development +is not well supported, so OpenFAST maintains a Visual Studio solution +giving Windows developers a better option for developing code, compiling +and debugging in a streamlined manner. + +Dependencies +------------ +Compiling OpenFAST from source requires additional libraries and tools that +are not distributed with the OpenFAST repository. In many cases, these tools +can be installed with a system's package manager (e.g. ``homebrew``, ``yum``, +or ``apt``). If binaries are downloaded or compiled locally, be sure they are +installed in a standard location for your system so that the other components +of the OpenFAST build system can find the dependencies. + +Build tools ++++++++++++ + +A build system is required and may consist of a combination of the following +packages: + +- `CMake `__ - minimum version 3.0 +- `GNU Make `__ +- `Visual Studio `__ - minimum version 2015 +- `Intel Parallel Studio `__ - minimum version 2013 +- Fortran compiler + + - `GNU Fortran (gfortran) `__ + - `Intel Fortran (ifort) `__ + +- C and C++ compiler + + - `GNU Compiler Collection (gcc) `__ + - `Intel C/C++ (icc/icpp) `__ + +Math libraries +++++++++++++++ + +Math libraries with the BLAS and LAPACK interfaces are also required. These can +be obtained as free, open source libraries or paid, closed source versions. +Some packages contain separate libraries for each interface while others have +the interfaces bundles into a single binary. The most common options are: + +- NetLib + + - `BLAS `__ + - `LAPACK `__ + +- OpenBLAS + + - `BLAS/LAPACK `__ + +- Intel MKL + + - `BLAS/LAPACK `__ + +Dependencies for the test suite ++++++++++++++++++++++++++++++++ + +The following packages are required to run the test suite: + +- `Python 3 `__ +- `MatPlotLib `__ - used for generating error plots + +Dependencies for the C++ API +++++++++++++++++++++++++++++ + +When using the C++ API, the following packages are required: + +- `HDF5 `_ (provided by ``HDF5_ROOT``) +- `yaml-cpp `_ (provided by ``YAML_ROOT``) + +Get the code +------------ +OpenFAST can be cloned (i.e., downloaded) from its `Github Repository `_ +via the command line: + +.. code-block:: bash git clone https://github.com/OpenFAST/OpenFAST.git -It can also be downloaded directly from https://github.com/OpenFAST/OpenFAST. +An archive of the source code can also be downloaded directly from these links: -Linux and Mac -~~~~~~~~~~~~~ +- `"master" branch `__ - Stable release +- `"dev" branch `__ - Latest updates + +.. _understanding_cmake: + +Visual Studio Solution for Windows +---------------------------------- +A complete Visual Studio solution is maintained for working with the OpenFAST +on Windows systems. The procedure for configuring the system and proceding +with the build process are documentated in the following section: .. toctree:: :maxdepth: 1 - install_cmake_linux.rst - install_spack.rst + install_vs_windows.rst + +Understanding CMake +------------------- +To more fully understand CMake and its methodology, visit this guide on +`running CMake `__. + +CMake is a build configuration system that creates files as input to a build +tool like ``make``, Visual Studio, or ``ninja``. CMake does not compile code +or run compilers directly, but +rather creates the environment needed for another tool to run compilers and +create binaries. A CMake project is described by a series of files called +``CMakeLists.txt`` located in various directories. The main CMake file for OpenFAST +is located at ``openfast/CMakeLists.txt`` and each module and glue-code has +its own ``CMakeLists.txt``; for example, AeroDyn and BeamDyn have one at +``openfast/modules/aerodyn/CMakeLists.txt`` and +``openfast/modules/beamdyn/CMakeLists.txt``, respectively. + +**Running CMake** + +Running CMake and compiling will create many files (text files and binaries) used in the +various stages of the build. For this reason, a ``build`` folder is created +which contains all of the generated files associated with the build process. +Here, an important file called ``CMakeCache.txt`` contains the user-defined +settings for the CMake configuration. This file functions like memory storage +for the build. It is initially created the first time the CMake command is run +and populated with the initial settings. Then, any subsequent changes to the settings +will be updated and stored there. + +CMake can be executed in a few ways: + +- Command line interace: ``cmake`` +- Command line curses interface: ``ccmake`` +- Official CMake GUI + +The CMake GUI is only distributed for Windows, but it can be built from source +for other platforms. OpenFAST's build process focuses on the command line +execution of CMake for both the Linux/Mac and Windows terminals. The command +line syntax to run CMake for OpenFAST is generally: + +.. code-block:: bash + + cmake [options] -Windows -~~~~~~~ + Options + -D [:]= = Create or update a cmake cache entry. + +For example, a common CMake command issued from the ``openfast/build`` directory +is: + +.. code-block:: bash + + # cmake [options] + # where + # is ".." + # [options] can be + # -DBUILD_SHARED_LIBS:BOOL=ON or + # -DBUILD_SHARED_LIBS=ON + + cmake .. -DBUILD_SHARED_LIBS=ON + +The command line curses interface can be invoked similarly: + +.. code-block:: bash + + ccmake .. + +The interface will be rendered in the terminal window and all navigation +happens through keyboard inputs. + +**OpenFAST CMake options** + +CMake has a large number of configuration variables avaiable. Here is a good +resource for useful CMake variables: `GitLab CMake variables `_. +The `CMake API documentation `_ +is also helpful for searching through variables and determining the resulting +action. Note that the CMake process should be well understood before +customizing the general options. + +The CMake options specific to OpenFAST and their default settings are: + +:: + + BUILD_DOCUMENTATION - Build documentation (Default: OFF) + BUILD_OPENFAST_CPP_API - Enable building OpenFAST - C++ API (Default: OFF) + BUILD_SHARED_LIBS - Enable building shared libraries (Default: OFF) + BUILD_TESTING - Build the testing tree (Default: OFF) + CMAKE_BUILD_TYPE - Choose the build type: Debug Release (Default: Release) + CMAKE_Fortran_MODULE_DIRECTORY - Set the Fortran Modules directory + CMAKE_INSTALL_PREFIX - Install path prefix, prepended onto install directories. + DOUBLE_PRECISION - Treat REAL as double precision (Default: ON) + FPE_TRAP_ENABLED - Enable Floating Point Exception (FPE) trap in compiler options (Default: OFF) + ORCA_DLL_LOAD - Enable OrcaFlex library load (Default: OFF) + USE_DLL_INTERFACE - Enable runtime loading of dynamic libraries (Default: ON) + +Additional system-specific options may exist for a given system, but those +should not impact the OpenFAST configuration. As mentioned above, the +configuration variables are set initially but can be changed at any time. +For example, the defaults may be accepted to initially configure the project, +but then the settings may be configured individually: + +.. code-block:: bash + + # Initial configuration with the default settings + cmake .. + + # Change the build to Debug mode rather than Release + cmake .. -DCMAKE_BUILD_TYPE=Debug + + # Use dynamic linking rather than static linking + cmake .. -DBUILD_SHARED_LIBS=ON + +The commands above are equivalent to having run this command the first time: + +.. code-block:: bash + + # Initial configuration in Debug mode with dynamic linking + cmake .. -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON + +**Setting the build tool** + +CMake can target a variety of build tools or *generators*. To obtain a list +of available generators on the current system, run with the empty generator +flag, select the target from the list, and rerun with the generator flag +populated: + +.. code-block:: bash + + # Run with the empty -G flag to get a list of available generators + cmake .. -G + + # CMake Error: No generator specified for -G + # + # Generators + # * Unix Makefiles = Generates standard UNIX makefiles. + # Ninja = Generates build.ninja files. + # Xcode = Generate Xcode project files. + # CodeBlocks - Ninja = Generates CodeBlocks project files. + # CodeBlocks - Unix Makefiles = Generates CodeBlocks project files. + # CodeLite - Ninja = Generates CodeLite project files. + # CodeLite - Unix Makefiles = Generates CodeLite project files. + # Sublime Text 2 - Ninja = Generates Sublime Text 2 project files. + # Sublime Text 2 - Unix Makefiles + # = Generates Sublime Text 2 project files. + # Kate - Ninja = Generates Kate project files. + # Kate - Unix Makefiles = Generates Kate project files. + # Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files. + # Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files. + + # Choose on from the list above and pass it as an argument after -G + # NOTE: wrap this is in quotes! + cmake .. -G"Sublime Text 2 - Ninja" + +**Math libraries** + +The CMake project is configured to search for the required math libraries +in default locations. However, if math libraries are not found, they can +be specified directly to CMake. The two required libraries are ``BLAS`` +and ``LAPACK``, and their location can be passed to CMake with this command +syntax: + +.. code-block:: bash + + cmake .. -DBLAS_LIBRARIES="/path/to/blas" -DLAPACK_LIBRARIES="/path/to/lapack" + +The paths given should be to the directory which contains the libraries, +not to the libraries themselves. + +.. _cmake_unix: + +CMake with Make for Linux/Mac +----------------------------- +After reading :ref:`understanding_cmake`, proceed with +configuring OpenFAST. The CMake project is well developed for Linux and +Mac systems, so the default settings should work as given. These settings +should only be changed when a custom build is required. + +The procedure for configuring CMake and compiling with GNU Make on Linux +and Mac systems is given below. + +.. code-block:: bash + + # Clone the repository from GitHub using git + git clone https://github.com/OpenFAST/OpenFAST.git + + # Move into the OpenFAST directory + cd OpenFAST + + # Create the build directory and move into it + mkdir build + cd build + + # Execute CMake with the default options; + # this step creates the Makefiles + cmake .. + + # Execute the Make-help command to list all available targets + make help + + # Choose a particular target or give no target to compile everything + # NOTE: compile in parallel by adding "-jN" where N is + # where N is the number of parallel processes to use + make + +This will build the OpenFAST project in the ``build`` directory. Binaries are +located in ``openfast/build/glue-codes/`` and ``openfast/build/modules/``. Since +all build-related files are located in the ``build`` directory, a new fresh build +process can be accomplished by simply deleting the build directory and starting +again. + +.. _cmake_windows: + +CMake with Visual Studio for Windows +------------------------------------ +After reading :ref:`understanding_cmake`, proceed with +configuring OpenFAST. The result of this configuration process will be +a Visual Studio solution which will be fully functional for compiling +any of the targets within OpenFAST. However, this method lacks support +for continued active development. Specifically, any settings that are +configured in the Visual Studio solution directly will be lost any time +CMake is executed. Therefore, this method should only be used to compile +binaries, and the procure described in :ref:`vs_windows` should be used +for active OpenFAST development on Windows. + +The procedure for configuring CMake and compiling with Visual Studio +on Windows systems is given below. + +.. code-block:: bash + + # Clone the repository from GitHub using git + git clone https://github.com/OpenFAST/OpenFAST.git + + # Move into the OpenFAST directory + cd OpenFAST + + # Create the build directory and move into it + mkdir build + cd build + + # Execute CMake with the default options and a specific Visual Studio version + # and build architecture. For a list of available CMake generators, run + # ``cmake .. -G``. + # This step creates the Visual Studio solution. + cmake .. -G "Visual Studio 14 2015 Win64" + + # Open the generated Visual Studio solution + start OpenFAST.sln + +Visual Studio will open a solution containing all of the OpenFAST projects, +and any module library, module driver, or glue-code can be compiled from there. +The compiled binaries are located within a directory determined by the Visual +Studio build type (Release, Debug, or RelWithDebInfo) in +``openfast/build/glue-codes/`` and ``openfast/build/modules/``. For example, the +OpenFAST executable will be located at ``openfast/build/glue-codes/Release/openfast.exe`` +when compiling in *Release* mode. + +**The CMake-generated Visual Studio build is currently damaged.** Some modules +are compiled before their associated registry type files are seen by Visual +Studio so an initial build may fail. However, a simple work around is to run +the build command in Visual Studio multiple times until it succeeds. + +.. _vs_windows: + +Appendix +~~~~~~~~ +The following are additional methods for installation which may not be fully +test or may be deprecated in the future. .. toctree:: :maxdepth: 1 - install_cmake_windows.rst - install_vs_windows.rst - install_cmake_cygwin.rst + install_spack.rst + +.. TODO: Check the windows paths: math library command, installation location diff --git a/docs/source/install/install_cmake_cygwin.rst b/docs/source/install/install_cmake_cygwin.rst deleted file mode 100644 index b4fd1a595f..0000000000 --- a/docs/source/install/install_cmake_cygwin.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. _install_cmake_cygwin: - -Building OpenFAST on Windows with CMake and Cygwin 64-bit -========================================================= -WARNING: This build process takes a significantly long amount of time. If GNU tools are not required, -it is recommended that Windows users follow the instructions at :ref:`install_cmake_windows` or :ref:`install_vs_windows`. - -Installing prerequisites ------------------------- - -1. Download and install `Cygwin - 64-bit `__. You will need to - ``Run as Administrator`` to complete the installation process. - - - Choose ``Install from internet`` - - Choose the default install location - - Choose the default package download location - - Choose ``Direct connection`` - - Choose a download site - - See next step for ``select packages``. Alternately, you can skip this - step and run ``setup-x86_64.exe`` anytime later to select and install - required software. - -2. Select packages necessary for compiling ``OpenFAST``. Choose - ``binary`` packages and not the source option. - - - Choose ``Category`` view, we will be installing packages from - ``Devel`` and ``Math`` - - From ``Devel`` mark the following packages for installation - - - ``cmake`` - - ``cmake-doc`` - - ``cmake-gui`` - - ``cygwin-devel`` - - ``gcc-core`` - - ``gcc-fortran`` - - ``gcc-g++`` - - ``git`` - - ``make`` - - ``makedepend`` - - - From ``Math`` mark the following packages for installation - - - ``liblapack-devel`` - - ``libopenblas`` - - - To run the test suite, install these optional packages from ``Python``: - - - ``python3`` - - ``Python3-numpy`` - - - Click ``Next`` and accept all additional packages that the setup - process requests to install to satisfy dependencies - -3. It is *recommended* that you reboot the machine after installing - ``Cygwin`` and all the necessary packages. - -Compiling OpenFAST ------------------- -From here, pick up from the Linux with CMake instructions at :ref:`cmake-build-instructions`. - -Other tips ----------- - -- If you desire to be able to run ``openfast.exe`` from the ``cmd`` - window, then you must add the ``C:\cygwin64\lib\lapack`` and - ``C:\cygwin64\home\\software\bin`` to your ``%PATH%`` - variable in environment setting. Replace ```` with your - account name on windows system. diff --git a/docs/source/install/install_cmake_linux.rst b/docs/source/install/install_cmake_linux.rst deleted file mode 100644 index 020e9c2f14..0000000000 --- a/docs/source/install/install_cmake_linux.rst +++ /dev/null @@ -1,142 +0,0 @@ -.. _install_cmake_linux: - -Building OpenFAST with CMake on Linux and Mac -============================================= - -We describe here how to install OpenFAST (or any of its modules) using the `CMake `_ -build system on Linux or Mac OS systems. Separate CMake documentation is -provided for Windows users at :numref:`install_cmake_windows` and Cygwin users at :numref:`install_cmake_cygwin`. -Also, some template build scripts are available in ``openfast/share``. - -Required software for building OpenFAST ---------------------------------------- - -In order to build OpenFAST using CMake, one needs the following minimum set of packages installed: - -- Fortran compiler (GNU compiler version above 4.6.0 or Intel compiler version above 11) - -- C/C++ compiler - -- GNU Make (version 3.81 or later) - -- CMake (version 2.8.12 or later) - -OpenFAST third party library dependencies ------------------------------------------ - -OpenFAST has the following dependencies: - -- LAPACK libraries. Users should set ``BLAS_LIBRARIES`` and ``LAPACK_LIBRARIES`` appropriately for CMake if the library is not found in standard paths. Use `BLASLIB` as an example when using Intel MKL. - -- **Optional:** For the C++ API, `HDF5 `_ (provided by ``HDF5_ROOT``) and `yaml-cpp `_ (provided by ``YAML_ROOT``) - -- **Optional:** For the testing framework, Python 3+ - -.. _cmake-build-instructions: - -CMake build instructions ------------------------- - -If one has the appropriate third party libraries, CMake, and git installed, obtaining and building OpenFAST can be accomplished as follows: - -.. code-block:: bash - - # obtain the source code; e.g., from the command line using git: - git clone https://github.com/OpenFAST/OpenFAST.git - - # go to the OpenFAST directory - cd OpenFAST - - # create a directory called `build` - mkdir build - - # go to the build directory - cd build - - # execute CMake with the default options, which will create a series of Makefiles - cmake ../ - - # execute a make command (with no target provided, equivalent to `make all` - make - -This will build the OpenFAST suite in the ``build`` directory, which can be deleted for a clean build. - -There are many ``Makefile`` targets (besides ``all``), which can be listed via ``help``: - -.. code-block:: bash - - # list available make targets - make help - - # make a specific target, e.g. - make beamdyn_driver - - - -Current CMake options -~~~~~~~~~~~~~~~~~~~~~ - -Below is a list of current CMake options including their default settings (which will effect, e.g., the targets in a resulting ``Makefile``. - -- ``BUILD_DOCUMENTATION`` - Build documentation (Default: OFF) -- ``BUILD_OPENFAST_CPP_API`` - Enable building OpenFAST - C++ API (Default: OFF) -- ``BUILD_SHARED_LIBS`` - Enable building shared libraries (Default: OFF) -- ``BUILD_TESTING`` - Build the testing tree (Default: OFF) -- ``CMAKE_BUILD_TYPE`` - Choose the build type: Debug Release (Default: Release) -- ``CMAKE_INSTALL_PREFIX`` - Install path prefix, prepended onto install directories. -- ``DOUBLE_PRECISION`` - Treat REAL as double precision (Default: ON) -- ``FPE_TRAP_ENABLED`` - Enable Floating Point Exception (FPE) trap in compiler options (Default: OFF) -- ``ORCA_DLL_LOAD`` - Enable OrcaFlex library load (Default: OFF) -- ``USE_DLL_INTERFACE`` - Enable runtime loading of dynamic libraries (Default: ON) - -CMake options can be configured through command line, e.g. - -.. code-block:: bash - - # to enable Makefile for local building of sphinx-based documentation - cmake .. -DBUILD_DOCUMENTATION:BOOL=ON - - # to compile OpenFAST in single precision - cmake .. -DDOUBLE_PRECISION:BOOL=OFF - - -Custom CMake builds -~~~~~~~~~~~~~~~~~~~ - -The CMake configuration and resulting build can be customized easily through explicitly setting CMake variables. In general, -this is done by passing a flag in the CMake configuration command - -.. code-block:: bash - - cmake .. -D=ON - cmake .. -D=/usr/local/bin/this_thing - -This syntax is the same as in setting a CMake option and the result is used very similarly in the CMake configuration files. -Common customizations revolve around choosing a compiler or math library; for example - -.. code-block:: bash - - cmake .. -DCMAKE_Fortran_COMPILER=/usr/local/bin/gfortran-8 -DLAPACK_LIBRARIES=/System/Library/Frameworks/Accelerate.framework -DLAPACK_LIBRARIES=/System/Library/Frameworks/Accelerate.framework - -**NOTE** Many CMake configurations can also be set through an environment variable. -For example, when using Intel's MKL, the math libraries can be discovered automatically by setting the ``MKLROOT`` -environment variable. The Fortran compiler can also be set explicitly with the ``FC`` environment variable. - -Here is a good resource for useful CMake variables: `GitLab useful cmake variables `_. -The `CMake documentation `_ is also helpful for searching -through variables and determining the resulting action. - - -Parallel build -~~~~~~~~~~~~~~ - -GNU Make has a parellel build option with the ``-jobs`` or ``-j`` flag, and the OpenFAST -CMake configuration handles setting up the dependencies for Make so the build can be -parallelized. However, it is important to note that the only parallel portion -of the build process is in compiling the modules. Due to some interdependency between -modules, the max parallel level is around 12. The remaining portion of the build, -mainly compiling the OpenFAST library itself, takes a considerable amount of time -and cannot be parallelized. - -An example parallel build command is ``make -j 8``. - diff --git a/docs/source/install/install_cmake_windows.rst b/docs/source/install/install_cmake_windows.rst deleted file mode 100644 index 645c1b3d8d..0000000000 --- a/docs/source/install/install_cmake_windows.rst +++ /dev/null @@ -1,124 +0,0 @@ -.. _install_cmake_windows: - -Building OpenFAST on Windows with CMake and Visual Studio -========================================================= - -We describe here how to install OpenFAST (or any of its modules) using the `CMake `_ -build system on Windows systems. Separate CMake documentation is -provided for Cygwin users at :numref:`install_cmake_cygwin` and Linux/Mac users at :numref:`install_cmake_linux`. -A standalone Visual Studio solution also exists at `openfast/vs-build` and documentation is at :numref:`install_vs_windows`. - -Required software for building OpenFAST ---------------------------------------- - -In order to build OpenFAST using CMake, one needs the following minimum set of packages installed: - -- Fortran compiler (GNU compiler version above 4.6.0 or Intel compiler version above 11) - -- C/C++ compiler - -- Visual Studio - -- CMake (version 2.8.12 or later) - -OpenFAST third party library dependencies ------------------------------------------ - -OpenFAST has the following dependencies: - -- LAPACK libraries. Users should set ``BLAS_LIBRARIES`` and ``LAPACK_LIBRARIES`` appropriately for CMake if the library is not found in standard paths. Use `BLASLIB` as an example when using Intel MKL. - -- **Optional:** For the C++ API, `HDF5 `_ (provided by ``HDF5_ROOT``) and `yaml-cpp `_ (provided by ``YAML_ROOT``) - -- **Optional:** For the testing framework, Python 3+ - -CMake build instructions ------------------------- - -If one has the appropriate third party libraries, CMake, and git installed, obtaining and building OpenFAST can be accomplished as follows: - -.. code-block:: bash - - # Obtain the source code; e.g., from the command line using git: - git clone https://github.com/OpenFAST/OpenFAST.git - - # Go to the OpenFAST directory - cd OpenFAST - - # Create a directory called `build` - mkdir build - - # Go to the build directory - cd build - - # Execute CMake with the default options and a specific Visual Studio version - # and build architecture. For a list of available CMake generators, run - # `cmake .. -G` - cmake .. -G "Visual Studio 14 2015 Win64" - - # Open the generated Visual Studio solution - start OpenFAST.sln - -Visual Studio will open a solution containing all of the OpenFAST projects, and you -can then build any module library, module driver, or glue code. Note that any time -CMake is rerun, the Visual Studio solution will be regenerated causing the Visual Studio -GUI to lag momentarily while it reloads the data. - -**The CMake-generated Visual Studio build is currently damaged.** Some modules are compiled -before their associated registry type files are seen by Visual Studio so an initial build -will fail. However, a simple work around is to run the build command in Visual Studio -multiple times until it succeeds. - - -CMake options -~~~~~~~~~~~~~ - -Below is a list of current CMake options including their default settings (which will effect, e.g., the targets in a resulting ``Makefile``. - -- ``BUILD_DOCUMENTATION`` - Build documentation (Default: OFF) -- ``BUILD_OPENFAST_CPP_API`` - Enable building OpenFAST - C++ API (Default: OFF) -- ``BUILD_SHARED_LIBS`` - Enable building shared libraries (Default: OFF) -- ``BUILD_TESTING`` - Build the testing tree (Default: OFF) -- ``CMAKE_BUILD_TYPE`` - Choose the build type: Debug Release (Default: Release) -- ``CMAKE_INSTALL_PREFIX`` - Install path prefix, prepended onto install directories. -- ``DOUBLE_PRECISION`` - Treat REAL as double precision (Default: ON) -- ``FPE_TRAP_ENABLED`` - Enable Floating Point Exception (FPE) trap in compiler options (Default: OFF) -- ``ORCA_DLL_LOAD`` - Enable OrcaFlex library load (Default: OFF) -- ``USE_DLL_INTERFACE`` - Enable runtime loading of dynamic libraries (Default: ON) - -CMake options can be configured through command line, e.g. - -.. code-block:: bash - - # to enable Makefile for local building of sphinx-based documentation - cmake .. -DBUILD_DOCUMENTATION:BOOL=ON - - # to compile OpenFAST in single precision - cmake .. -DDOUBLE_PRECISION:BOOL=OFF - - -Custom CMake builds -~~~~~~~~~~~~~~~~~~~ - -The CMake configuration and resulting build can be customized easily by explicitly setting CMake variables. In general, -this is done by passing a flag in the CMake configuration command - -.. code-block:: bash - - cmake .. -D=ON - cmake .. -D=\home\user\Desktop\this_thing - -This syntax is the same as in setting a CMake option and the result is used very similarly in the CMake configuration files. -Common customizations revolve around choosing a compiler or math library; for example - -.. code-block:: bash - - cmake .. -DCMAKE_Fortran_COMPILER=/usr/local/bin/gfortran-8 -DLAPACK_LIBRARIES=/System/Library/Frameworks/Accelerate.framework -DLAPACK_LIBRARIES=/System/Library/Frameworks/Accelerate.framework - -**NOTE** Many CMake configurations can also be set through an environment variable. -For example, when using Intel's MKL, the math libraries can be discovered automatically by setting the ``MKLROOT`` -environment variable. The Fortran compiler can also be set explicitly with the ``FC`` environment variable. - -Here is a good resource for useful CMake variables: `GitLab useful cmake variables `_. -The `CMake documentation `_ is also helpful for searching -through variables and determining the resulting action. diff --git a/docs/source/install/install_spack.rst b/docs/source/install/install_spack.rst index 51ea8dbaae..bec6bf806a 100644 --- a/docs/source/install/install_spack.rst +++ b/docs/source/install/install_spack.rst @@ -3,27 +3,32 @@ Building OpenFAST with Spack ============================ -The process to build and install OpenFAST with `Spack `__ -on Linux or macOS is described here. +The process to build and install OpenFAST with +`Spack `__ on Linux or macOS is +described here. Dependencies ------------ - OpenFAST has the following dependencies: -- LAPACK libraries. Users should set ``BLAS_LIBRARIES`` and ``LAPACK_LIBRARIES`` appropriately for cmake if the library isn't found in standard paths. Use `BLASLIB` as an example when using Intel MKL. -- For the optional C++ API, `HDF5 `__ (provided by ``HDF5_ROOT``) and `yaml-cpp `__ (provided by ``YAML_ROOT``) +- LAPACK libraries. Users should set ``BLAS_LIBRARIES`` and + ``LAPACK_LIBRARIES`` appropriately for CMake if the library isn't found + in standard paths. Use `BLASLIB` as an example when using Intel MKL. +- For the optional C++ API, `HDF5 `__ + (provided by ``HDF5_ROOT``) and + `yaml-cpp `__ (provided by ``YAML_ROOT``) - For the optional testing framework, Python 3+ and Numpy Building OpenFAST Semi-Automatically Using Spack on macOS or Linux ---------------------------------------------------------------------- +------------------------------------------------------------------ The following describes how to build OpenFAST and its dependencies -mostly automatically on your Mac using `Spack `_. -This can also be used as a template to build OpenFAST on any -Linux system with Spack. +mostly automatically on your Mac using +`Spack `_. This can also be used as a +template to build OpenFAST on any Linux system with Spack. -These instructions were developed on macOS 10.11 with the following tools installed via Homebrew: +These instructions were developed on macOS 10.11 with the following tools +installed via Homebrew: - GCC 6.3.0 - CMake 3.6.1 @@ -31,40 +36,39 @@ These instructions were developed on macOS 10.11 with the following tools instal Step 1 ~~~~~~ +Checkout the official Spack repo from github (we will checkout into +``${HOME}``): -Checkout the official Spack repo from github (we will checkout into ``${HOME}``): +.. code-block:: bash -``cd ${HOME} && git clone https://github.com/LLNL/spack.git`` + cd ${HOME} && git clone https://github.com/LLNL/spack.git Step 2 ~~~~~~ - Add Spack shell support to your ``.profile`` by adding the lines: -:: +.. code-block:: bash export SPACK_ROOT=${HOME}/spack . $SPACK_ROOT/share/spack/setup-env.sh Step 3 ~~~~~~ - Copy the https://raw.githubusercontent.com/OpenFAST/openfast/dev/share/spack/package.py file to your installation of Spack: -:: - +.. code-block:: bash + mkdir ${SPACK_ROOT}/var/spack/repos/builtin/packages/openfast cd ${SPACK_ROOT}/var/spack/repos/builtin/packages/openfast wget --no-check-certificate https://raw.githubusercontent.com/OpenFAST/openfast/dev/share/spack/package.py Step 4 ~~~~~~ - Try ``spack info openfast`` to see if Spack works. If it does, check the compilers you have available by: -:: +.. code-block:: bash machine:~ user$ spack compilers ==> Available compilers @@ -76,32 +80,32 @@ compilers you have available by: Step 5 ~~~~~~ - Install OpenFAST with your chosen version of GCC: -:: +.. code-block:: bash spack install openfast %gcc@6.3.0 To install OpenFAST with the C++ API, do: -:: +.. code-block:: bash spack install openfast+cxx %gcc@6.3.0 - -That should be it! Spack will automatically use the most up-to-date dependencies -unless otherwise specified. For example to constrain OpenFAST to use some specific -versions of dependencies you could issue the Spack install command: -:: +That should be it! Spack will automatically use the most up-to-date +dependencies unless otherwise specified. For example to constrain OpenFAST +to use some specific versions of dependencies you could issue the Spack +install command: - spack install openfast %gcc@6.3.0 ^hdf5@1.8.16 +.. code-block:: bash + + spack install openfast %gcc@6.3.0 ^hdf5@1.8.16 The executables and libraries will be located at -:: - +.. code-block:: bash + spack location -i openfast - -Add the appropriate paths to your ``PATH`` and ``LD_LIBRARY_PATH`` to run OpenFAST. +Add the appropriate paths to your ``PATH`` and ``LD_LIBRARY_PATH`` to run +OpenFAST. From e0e48202c04cfccf5c666700093a593fffe8851b Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 20 Sep 2019 16:24:50 -0600 Subject: [PATCH 05/21] Cleanup acknowledgements --- docs/source/acknowledgements.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/source/acknowledgements.rst b/docs/source/acknowledgements.rst index 92e9382418..dedd7a58bc 100644 --- a/docs/source/acknowledgements.rst +++ b/docs/source/acknowledgements.rst @@ -3,15 +3,16 @@ Acknowledgements ================ -This software is developed and maintained by researchers at the `National Renewable Energy Laboratory `_ with funding from U.S. -Department of Energy (DOE) Wind Energy Technology Office through the `Atmosphere to electrons (A2e) `_ research initiative. +This software is developed and maintained by researchers at the +`National Renewable Energy Laboratory `_ with funding +from U.S. Department of Energy Wind Energy Technology Office through the +`Atmosphere to electrons (A2e) `_ research initiative. -NREL gratefully acknowledges development contributions from the following organizations: +NREL gratefully acknowledges development contributions from the following +organizations: -* Envision Energy USA, Ltd - -* Brigham Young University - -NREL gratefully acknowledges additional development support through an -`Intel® Parallel Computing Center (IPCC) `_ +- Envision Energy USA, Ltd +- Brigham Young University +NREL gratefully acknowledges additional development support through designation +as an `Intel® Parallel Computing Center (IPCC) `_. From d35e5113ecd86f66f4cb41164b2c2a566ffbdd19 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 20 Sep 2019 16:25:11 -0600 Subject: [PATCH 06/21] Improve the testing documentation --- docs/source/testing/index.rst | 59 ++++--- docs/source/testing/regression_test.rst | 199 ++++++++++++++---------- docs/source/testing/unit_test.rst | 181 +++++++++++---------- 3 files changed, 231 insertions(+), 208 deletions(-) diff --git a/docs/source/testing/index.rst b/docs/source/testing/index.rst index 79c40b97df..56f462d6f0 100644 --- a/docs/source/testing/index.rst +++ b/docs/source/testing/index.rst @@ -3,35 +3,38 @@ Testing OpenFAST ================ -The OpenFAST test suite consists of system and module level regression tests and -unit tests. The regression test compares locally generated solutions to a set of -baseline solutions. The unit tests ensure that individual subroutines are -functioning as intended. +The OpenFAST test suite consists of system and module level regression tests +and unit tests. The regression test compares locally generated solutions to +a set of baseline solutions. The unit tests ensure that individual subroutines +are functioning as intended. -All of the necessary files corresponding to the regression test are contained in -the ``reg_tests`` directory. The unit test framework is housed in ``unit_tests`` -while the actual tests are contained in the directory corresponding to the tested -module. +All of the necessary files corresponding to the regression tests are contained +in the ``reg_tests`` directory. The unit test framework is housed in +``unit_tests`` while the actual tests are contained in the directory +corresponding to the tested module. Configuring the test suite -------------------------- -Portions of the test suite are linked to the OpenFAST repository through +Portions of the test suite are linked to the OpenFAST repository through a ``git submodule``. Specifically, - `r-test `__ -- `pFUnit `__ +- `pFUnit `__ -Be sure to clone the repo with the ``--recursive`` flag or execute -``git submodule update --init --recursive`` after cloning. +.. tip:: -The test suite can be built with `CMake `__ similar to + Be sure to clone the repo with the ``--recursive`` flag or execute + ``git submodule update --init --recursive`` after cloning. + +The test suite can be configured with `CMake `__ similar to OpenFAST. The default CMake configuration is useful, but may need customization -for particular build environments. See the installation documentation at :numref:`installation` -for more details on configuring the CMake targets. +for particular build environments. See the :ref:`installation` section for more +details on configuring the CMake targets. While the unit tests must be built with CMake due to its external dependencies, -the regression test may be executed without building with CMake. :numref:`unit_test` and :numref:`regression_test` -have more information on unit testing and regression testing, respectively. +the regression test may be executed without CMake. :numref:`unit_test` and +:numref:`regression_test` have more information on unit testing and regression +testing, respectively. Test specific documentation --------------------------- @@ -42,18 +45,16 @@ Test specific documentation regression_test.rst regression_test_windows.rst -Continuous Integration +Continuous integration ---------------------- A TravisCI configuration file is included with the OpenFAST source code at ``openfast/.travis.yml``. -The continuous integration infrastructure is still under development, but the status for all branches -and pull requests can be found on the `TravisCI OpenFAST page `_. - -Note that if you use the included TravisCI configuration, you will need to add your own Intel compiler -license serial number to your TravisCI project. Otherwise, simply remove the ``ifort`` line from the -environment list. +The continuous integration infrastructure is still under development, but the +status for all branches and pull requests can be found on the +`TravisCI OpenFAST page `_. -For development and testing purposes, a version of the TravisCI test can be run locally with Docker. -Below is a guide which should be modified depending on the particular build being replicated +For development and testing purposes, a version of the TravisCI test can be run +locally with Docker. The code snippet below outlines starting a TravisCI image +on Docker. .. code-block:: bash @@ -78,8 +79,7 @@ Below is a guide which should be modified depending on the particular build bein git checkout -qf FETCH_HEAD git submodule update --init --recursive - export INTEL_SERIAL_NUMBER=VFGH-65656FTH - export FC=ifort + export FC=/usr/bin/gfortran-7 export DOUBLE_PRECISION=ON export TRAVIS_BUILD_INTEL=YES export TRAVIS_COMPILER=gcc @@ -87,9 +87,6 @@ Below is a guide which should be modified depending on the particular build bein gcc --version pyenv shell 3.6.3 - wget 'https://raw.githubusercontent.com/nemequ/icc-travis/master/install-icc.sh' # installs from http://registrationcenter-download.intel.com/akdlm/irc_nas/9061/parallel_studio_xe_2016_update3_online.sh - chmod 755 install-icc.sh - ./install-icc.sh --components ifort,icc,mkl source ~/.bashrc pip3 install numpy mkdir build && cd build diff --git a/docs/source/testing/regression_test.rst b/docs/source/testing/regression_test.rst index f856c26c74..c0a6c2a844 100644 --- a/docs/source/testing/regression_test.rst +++ b/docs/source/testing/regression_test.rst @@ -2,101 +2,120 @@ Regression test =============== - -The regression test executes a series of test cases which intend to fully describe -OpenFAST and its module's capabilities. - -Jump to :ref:`regression_test_ctest`, :ref:`regression_test_example`, or :ref:`regression_test_windows` -for instructions on running the regression tests locally. - -Each locally computed result is compared -to a static set of baseline results. To account for system, hardware, and compiler +The regression test executes a series of test cases which intend to fully +describe OpenFAST and its module's capabilities. Jump to +:ref:`regression_test_ctest`, :ref:`regression_test_example`, or +:ref:`regression_test_windows` for instructions on running the regression +tests. + +Each locally computed result is compared to a static set of baseline +results. To account for system, hardware, and compiler differences, the regression test attempts to match the current machine and compiler type to the appropriate solution set from these combinations: - macOS with GNU compiler (default) -- Red Hat Enterprise Linux with Intel compiler +- CentOS 7 with Intel compiler +- CentOS 7 with GNU compiler - Windows with Intel compiler -The compiler versions, specific math libraries, and hardware used to generate these baseline -solutions are documented in the -`r-test repository documentation `__. Currently, +The compiler versions, specific math libraries, and hardware used to generate +the baseline solutions are documented in the +`r-test repository documentation `__. Currently, the regression test supports only double precision solutions, so it is required -to build OpenFAST in double precision for testing. All baseline solutions are generated -with a double precision build. +to build OpenFAST in double precision for testing. All baseline solutions are +generated with a double precision build. -The regression test system can be executed with CMake and CTest or manually with -an included Python driver. Both systems provide similar functionality with respect -to testing, but CTest integration provides access to multithreading, automation, -and test reporting via CDash. Both modes of execution require some configuration -as outlined below. +The regression test system can be executed with CMake/CTest or manually with +an included Python driver. Both systems provide similar functionality with +respect to testing, but CTest integration provides access to multithreading, +automation, and test reporting via CDash. Both modes of execution require some +configuration as outlined below. -In both modes of execution a subdirectory is created in the build directory +In both modes of execution a directory is created in the build directory called ``reg_tests`` where all of the input files for the test cases are copied -and all of the locally generated outputs are stored. +and all of the locally generated outputs are stored. Ultimately, both CTest and +the manual execution program call a series of Python scripts and libraries in +``reg_tests`` and ``reg_tests/lib``. One such script is ``lib/pass_fail.py`` +which reads the output files and computes a norm on each channel reported. If +the maximum norm is greater than a preset tolerance, that particular test is +reported as failed. The failure criteria is outlined in pseudocode below. -Ultimately, both CTest and the manual execution program call a series of Python -scripts and libraries in ``reg_tests`` and ``reg_tests/lib``. One such script is -``lib/pass_fail.py`` which reads the output files and computes a norm on each -channel reported. If the maximum norm is greater than a preset tolerance, that particular -test is reported as failed. The failure criteria is outlined in pseudocode below. +.. code-block:: python -:: + difference = abs(testData - baselineData) + for i in nChannels: + if channelRange < 1: + norm[i] = MaxNorm( difference[:,i] ) + else: + norm[i] = MaxNorm( difference[:,i] ) / channelRange - difference = abs(testData-baselineData) - for i in nChannels - if channelRange < 1 { - norm[i] = MaxNorm( difference[:,i] ) - } else { - norm[i] = MaxNorm( difference[:,i] ) / channelRange - } - - if max(norm) < tolerance: - success + if max(norm) < tolerance: + success! Dependencies ------------ - - Python 3+ - - Numpy - - CMake and CTest (Optional) - - matplotlib (Optional) +The following packages are required for regression testing: + +- Python 3+ +- Numpy +- CMake and CTest (Optional) +- matplotlib (Optional) + +Manual driver +------------- +The regression test can be executed manually with the included driver at +``openfast/reg_tests/manualRegressionTest.py``. This program reads a case list +file at ``openfast/reg_tests/r-test/glue-codes/openfast/CaseList.md``. Cases +can be removed or ignored with a ``#``. This driver program includes multiple +optional flags which can be obtained by executing with the help option: -Manual driver configuration ---------------------------- +:: -The regression test can be executed manually with the included driver -``openfast/reg_tests/manualRegressionTest.py``. This program reads a case list file at -``openfast/reg_tests/r-test/glue-codes/openfast/CaseList.md``. Cases can be removed -or ignored with a ``#``. This driver program includes multiple optional flags -which can be obtained by executing with the help option: -``openfast/reg_tests/manualRegressionTest.py -h`` + >>>$ python manualRegressionTest.py -h + usage: manualRegressionTest.py [-h] [-p [Plotting-Flag]] [-n [No-Execution]] + [-v [Verbose-Flag]] [-case [Case-Name]] + OpenFAST System-Name Compiler-Id Test-Tolerance + + Executes OpenFAST and a regression test for a single test case. + + positional arguments: + OpenFAST path to the OpenFAST executable + System-Name current system's name: [Darwin,Linux,Windows] + Compiler-Id compiler's id: [Intel,GNU] + Test-Tolerance tolerance defining pass or failure in the regression + test + + optional arguments: + -h, --help show this help message and exit + -p [Plotting-Flag], -plot [Plotting-Flag] + bool to include matplotlib plots in failed cases + -n [No-Execution], -no-exec [No-Execution] + bool to prevent execution of the test cases + -v [Verbose-Flag], -verbose [Verbose-Flag] + bool to include verbose system output + -case [Case-Name] single case name to execute For the NREL 5MW turbine test cases, an external ServoDyn controller must be compiled and included in the appropriate directory or all NREL 5MW cases will fail without starting. More information is available in the documentation for the `r-test repository `__. -CTest configuration -------------------- - +CTest driver +------------ CTest is included with CMake and is mostly a set of preconfigured targets and -commands. To use the CTest driver for the regression test, CMake must be run with -one of two ``CMakeLists.txt``'s: - -- openfast/CMakeList.txt -- openfast/reg_tests/CMakeLists.txt - -CMake variables can be configured in the `CMake -GUI `__ or through the command line interface with -``ccmake``. +commands. To use the CTest driver for the regression test, execute CMake as +described in :ref:`installation`, but with this additional flag: +``BUILD_TESTING=ON``. The regression test specific CMake variables are -- BUILD_TESTING -- CTEST_OPENFAST_EXECUTABLE -- CTEST_[MODULE]_EXECUTABLE -- CTEST_PLOT_ERRORS -- CTEST_REGRESSION_TOL +:: + + - BUILD_TESTING + - CTEST_OPENFAST_EXECUTABLE + - CTEST_[MODULE]_EXECUTABLE + - CTEST_PLOT_ERRORS + - CTEST_REGRESSION_TOL **IT IS IMPORTANT** to verify that NREL 5MW turbine external controllers are compiled and placed in the correct location. More information is available in the documentation for the @@ -105,9 +124,9 @@ but be aware that these three DISCON controllers must exist .. code-block:: bash - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON.dll - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_ITIBarge.dll - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_OC3Hywind.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_ITIBarge.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_OC3Hywind.dll This can be accomplished manually with the CMake projects included with the DISCON source codes at ``openfast/reg_tests/r-test/glue-codes/openfast/5MW_Baseline/ServoData/`` @@ -169,8 +188,31 @@ are strictly read not modified by the automated process. Regression test example ----------------------- +The following examples illustrate ways to run the regression tests. + +CTest driver +~~~~~~~~~~~~ + +Python driver +~~~~~~~~~~~~~ + + +.. code-block:: bash + + git clone --recursive https://github.com/openfast/openfast.git + cd openfast + + ## Build the ServoDyn external controller libraries + # Open the Visual Studio Solution (DISCON.sln) located in 'openfast\vs-build\DISCON' + # Choose Release and x64 for the Solutions Configuration and Solutions Platform + # Build Solution + + ## Execute the OpenFAST regression Tests + # Open a command prompt which is configured for Python (like Anaconda) + cd openfast\reg_tests + python manualRegressionTest.py ..\build\bin\openfast_x64.exe Windows Intel 1e-5 + -- Build OpenFAST and the test suite .. code-block:: bash @@ -186,7 +228,6 @@ Regression test example make install ctest -- Build only the test suite if an openfast binary already exists .. code-block:: bash @@ -207,17 +248,3 @@ Regression test example Follow the link above for a detailed procedure. It is summarized below though excluding the procedure to build OpenFAST itself. -.. code-block:: bash - - git clone --recursive https://github.com/openfast/openfast.git - cd openfast - - ## Build the ServoDyn external controller libraries - # Open the Visual Studio Solution (DISCON.sln) located in 'openfast\vs-build\DISCON' - # Choose Release and x64 for the Solutions Configuration and Solutions Platform - # Build Solution - - ## Execute the OpenFAST regression Tests - # Open a command prompt which is configured for Python (like Anaconda) - cd openfast\reg_tests - python manualRegressionTest.py ..\build\bin\openfast_x64.exe Windows Intel 1e-5 diff --git a/docs/source/testing/unit_test.rst b/docs/source/testing/unit_test.rst index 2308a2c33b..da45dabace 100644 --- a/docs/source/testing/unit_test.rst +++ b/docs/source/testing/unit_test.rst @@ -2,120 +2,119 @@ Unit test ========= - -In a software package as dynamic and collaborative as OpenFAST, confidence in multiple -layers of code is best accomplished with a strong system of unit tests. -Through robust testing practices, the entire OpenFAST community can +In a software package as dynamic and collaborative as OpenFAST, confidence in +multiple layers of code is best accomplished with a strong system of unit +tests. Through robust testing practices, the entire OpenFAST community can understand the intention behind code blocks and debug or expand functionality quicker and with more confidence and stability. -Unit testing in OpenFAST modules is accomplished through `pFUnit `__. -This framework provides a Fortran abstraction to the popular `xUnit `__ -structure. pFUnit is compiled along with OpenFAST through CMake when -the CMake variable ``BUILD_TESTING`` is turned on. +Unit testing in OpenFAST modules is accomplished through `pFUnit `__. +This framework provides a Fortran abstraction to the popular +`xUnit `__ structure. pFUnit is compiled +along with OpenFAST through CMake when the CMake variable ``BUILD_TESTING`` is +turned on. -The BeamDyn module has been unit tested and should serve as a reference for future -development and testing. +The BeamDyn module has been unit tested and should serve as a reference for +future development and testing. Dependencies ------------ - - Python 3+ - - CMake and CTest - - Numpy and matplotlib (Optional) - - pFUnit (Included in unit test suite) +The following packages are required for unit testing: -Compiling the unit tests ------------------------- +- Python 3+ +- CMake +- pFUnit - Included in OpenFAST repo through a git-submodule -Compiling the unit tests is handled with CMake similar to compiling OpenFAST in general. -After configuring CMake with ``BUILD_TESTING`` on, new make targets are created for each -module included in the unit test framework named ``[module]_utest``. Then, simply make the target to test +Compiling +--------- +Compiling the unit tests is handled with CMake similar to compiling OpenFAST +in general. After configuring CMake with ``BUILD_TESTING`` turned on, new make +targets are created for each module included in the unit test framework named +``[module]_utest``. Then, simply make the target to test -:: - - cmake .. -DBUILD_TESTING=ON - make beamdyn_utest - -This creates a binary unit test executable at +.. code-block:: bash + + cmake .. -DBUILD_TESTING=ON + make beamdyn_utest + +This creates a unit test executable at ``openfast/build/unit_tests/[module]_utest``. - -Executing the unit tests ------------------------- +Executing +--------- +To execute a module's unit test, simply run the unit test binary. For example: -To execute a module's unit test, simply run the unit test binary. For example, -:: - - >>>$ ./openfast/build/unit_tests/beamdyn_utest - ............. - Time: 0.018 seconds - - OK - (13 tests) +.. code-block:: bash + + >>>$ ./openfast/build/unit_tests/beamdyn_utest + ............. + Time: 0.018 seconds + + OK + (14 tests) pFUnit will display a ``.`` for each unit test successfully completed -and a ``F`` for each failing test. If any tests do fail, the failure -criteria will be displayed listing which particular value caused +and a ``F`` for each failing test. If any tests do fail, the failure +criteria will be displayed listing which particular value caused the failure. Failure cases display the following output -:: - - >>>$ ./unit_tests/beamdyn_utest - .....F....... - Time: 0.008 seconds - - Failure - in: - test_BD_CrvMatrixH_suite.test_BD_CrvMatrixH - Location: - [test_BD_CrvMatrixH.F90:48] - simple rotation with known parameters: Pi on xaxis expected +0.5000000 but found: +0.4554637; difference: |+0.4453627E-01| > tolerance:+0.1000000E-13; first difference at element [1, 1]. - - FAILURES!!! - Tests run: 13, Failures: 1, Errors: 0 - Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO - ERROR STOP *** Encountered 1 or more failures/errors during testing. *** - - Error termination. Backtrace: - #0 0x1073b958c - #1 0x1073ba295 - #2 0x1073bb1b6 - #3 0x106ecdd4f - #4 0x1063fabee - #5 0x10706691e - - +.. code-block:: bash + + >>>$ ./unit_tests/beamdyn_utest + .....F....... + Time: 0.008 seconds + + Failure + in: + test_BD_CrvMatrixH_suite.test_BD_CrvMatrixH + Location: + [test_BD_CrvMatrixH.F90:48] + simple rotation with known parameters: Pi on xaxis expected +0.5000000 but found: +0.4554637; difference: |+0.4453627E-01| > tolerance:+0.1000000E-13; first difference at element [1, 1]. + + FAILURES!!! + Tests run: 13, Failures: 1, Errors: 0 + Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO + ERROR STOP *** Encountered 1 or more failures/errors during testing. *** + + Error termination. Backtrace: + #0 0x1073b958c + #1 0x1073ba295 + #2 0x1073bb1b6 + #3 0x106ecdd4f + #4 0x1063fabee + #5 0x10706691e + Adding unit tests ----------------- - -Unit tests should be included for each new, *testable* code block (subroutine or function). -What is testable is the discretion of the developer, but a portion -of the pull request review process will be evaluating test coverage. +Unit tests should be included for each new, *testable* code block (subroutine +or function). What is testable is the discretion of the developer, but an +element of the pull request review process will be evaluating test coverage. New unit tests can be added to a ``tests`` directory alongside the ``src`` directory included in each module. For example, the BeamDyn module directory is structured as :: - + openfast/ - |-- modules/ - |-- beamdyn/ - |-- src/ - |-- BeamDyn.f90 - `-- BeamDyn_Subs.f90 - `-- tests/ - |-- test_BD_Subroutine1.F90 - |-- test_BD_Subroutine2.F90 - `-- test_BD_Subroutine3.F90 - -Each unit test must be contained in a unique file called ``test_[SUBROUTINE].F90`` where -``[SUBROUTINE]`` is the code block being tested. Finally, update the CMake configuration -for building a module's unit test executable with the appropriate list of test subroutines -in ``openfast/unit_tests/CMakeLists.txt`` using the following format + └── modules/ + └── beamdyn/ + ├── src/ + │ ├── BeamDyn.f90 + │ └── BeamDyn_Subs.f90 + └── tests/ + ├── test_BD_Subroutine1.F90 + ├── test_BD_Subroutine2.F90 + └── test_BD_Subroutine3.F90 + +Each unit test must be contained in a unique file called +``test_[SUBROUTINE].F90`` where ``[SUBROUTINE]`` is the code block being +tested. Finally, update the CMake configuration for building a module's unit +test executable with the appropriate list of test subroutines +in ``openfast/unit_tests/CMakeLists.txt`` using the following format: + +.. code-block:: cmake -:: - set(testlist test_SUBROUTINE1 test_SUBROUTINE2 @@ -123,11 +122,11 @@ in ``openfast/unit_tests/CMakeLists.txt`` using the following format ) # it is important to keep the quotes around "${testlist}" in the call below build_utest("module_name" "${testlist}") - -For reference, a template unit test file is included at ``openfast/unit_tests/test_SUBROUTINE.F90``. -Each unit test should fully test the target code block. If full test coverage -is not easily achievable, it may be an indication that refactoring would be beneficial. +For reference, a template unit test file is included at +``openfast/unit_tests/test_SUBROUTINE.F90``. Each unit test should fully test +the target code block. If full test coverage is not easily achievable, it may +be an indication that refactoring would be beneficial. Some useful topics to consider when developing and testing for OpenFAST are: From 7d48c9c65f31773e6f41229731a8a1add217a053 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 24 Sep 2019 10:20:14 -0600 Subject: [PATCH 07/21] Update the README and add GA tracking --- README.md | 82 ---------------------------- README.rst | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ docs/conf.py | 4 +- 3 files changed, 151 insertions(+), 83 deletions(-) delete mode 100644 README.md create mode 100644 README.rst diff --git a/README.md b/README.md deleted file mode 100644 index ee5384bfc4..0000000000 --- a/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# OpenFAST - -OpenFAST is a wind turbine simulation tool which builds on FAST v8. It was -created with the goal of being a community model developed and used by research -laboratories, academia, and industry. It is managed by a dedicated team at the -National Renewable Energy Lab. Our objective is to ensure that OpenFAST is -sustainable software that is well tested and well documented. If you'd like -to contribute, see the -[Developer Documentation](https://openfast.readthedocs.io/en/dev/source/dev/index.html) -and any open GitHub issues with the -[Help Wanted](https://github.com/OpenFAST/openfast/issues?q=is%3Aopen+is%3Aissue+label%3A"Help+wanted") -tag. - -**OpenFAST is under active development**. - -### FAST v8 - OpenFAST v0.1.0 - -The transition from FAST v8 to OpenFAST v0.1.0 represents the effort to better support an open-source developer community around FAST-based aero-hydro-servo-elastic engineering models of wind-turbines and wind-plants. OpenFAST is the next generation of FAST analysis tools. More inforation is available in the [transition notes](http://openfast.readthedocs.io/en/latest/source/user/fast_to_openfast.html). - -FAST v8 is a computer-aided engineering tool for simulating the coupled dynamic response of wind turbines. FAST joins aerodynamics models, hydrodynamics models for offshore structures, control and electrical system (servo) dynamics models, and structural (elastic) dynamics models to enable coupled nonlinear aero-hydro-servo-elastic simulation in the time domain. The FAST tool enables the analysis of a range of wind turbine configurations, including two- or three-blade horizontal-axis rotor, pitch or stall regulation, rigid or teetering hub, upwind or downwind rotor, and lattice or tubular tower. The wind turbine can be modeled on land or offshore on fixed-bottom or floating substructures. FAST is based on advanced engineering models derived from fundamental laws, but with appropriate simplifications and assumptions, and supplemented where applicable with computational solutions and test data. - -The aerodynamic models use wind-inflow data and solve for the rotor-wake effects and blade-element aerodynamic loads, including dynamic stall. The hydrodynamics models simulate the regular or irregular incident waves and currents and solve for the hydrostatic, radiation, diffraction, and viscous loads on the offshore substructure. The control and electrical system models simulate the controller logic, sensors, and actuators of the blade-pitch, generator-torque, nacelle-yaw, and other control devices, as well as the generator and power-converter components of the electrical drive. The structural-dynamics models apply the control and electrical system reactions, apply the aerodynamic and hydrodynamic loads, adds gravitational loads, and simulate the elasticity of the rotor, drivetrain, and support structure. Coupling between all models is achieved through a modular interface and coupler. - -### Documentation -Web based documentation is available at . - -This documentation is stored and maintained alongside the source code. It is compiled into html with Sphinx, so it is tied to a particular version of OpenFAST. [readthedocs](http://openfast.readthedocs.io) compiles various versions of the documentation automatically upon new commits: -* `latest` - The latest commit on the `master` branch -* `stable` - Corresponds to the last tagged release -* `dev` - The latest commit on the `dev` branch - -These can be toggled with the `v: latest` button in the lower left corner of the docs site. - -### Obtaining OpenFAST - -OpenFAST is hosted entirely on GitHub so you are in the [right place](https://github.com/OpenFAST/OpenFAST)! The repository is structured with various branches following the "git-flow" convention: -* `master` -* `dev` - -The `master` branch is stable, well tested, and represents the most up to date released version of OpenFAST. The latest commit on `master` contains a tag with version info and brief release notes. The tag history can be obtained with the `git tag` command and viewed in more detail on [GitHub Releases](https://github.com/OpenFAST/openfast/releases). For general use, the `master` branch is highly recommended. - -The `dev` branch is generally stable and tested, but not static. It contains new features, bug fixes, and documentation updates that have not been compiled into a production release. Before proceeding with new development, it is recommended to explore the `dev` branch. This branch is updated regularly through pull requests, so be sure to `git fetch` often and check [outstanding pull requests](https://github.com/OpenFAST/openfast/pulls). - -For those not familiar with git and GitHub, there are many resources, e.g., - -* -* -* -* -* - -### Compilation, Usage, and Development - -Details for compiling [compiling](http://openfast.readthedocs.io/en/latest/source/install/index.html), -[using](http://openfast.readthedocs.io/en/latest/source/user/index.html), and -[developing](http://openfast.readthedocs.io/en/latest/source/dev/index.html) -OpenFAST on Linux-based and Windows machines are available at -. - - -### Nightly Testing - -The `dev` branch is automatically compiled and run through the test suite nightly. The results are publicly available through the [CDash Dashboard](http://my.cdash.org/index.php?project=OpenFAST&date=). - -### Help - -Please use [github issues](https://github.com/OpenFAST/OpenFAST/issues) to: -* ask usage questions -* report bugs -* request code enhancements - -For other questions regarding OpenFAST, please contact [Mike Sprague](mailto:michael.a.sprague@nrel.gov). - -Users and developers may also be interested in the NREL National Wind Technology Center (NWTC) [phpBB Forum](https://wind.nrel.gov/forum/wind/). - -### Acknowledgments - -OpenFAST is being maintained and developed by researchers and software engineers at the [National Renewable Energy Laboratory](http://www.nrel.gov/) (NREL), with support from the US Department of Energy's Wind Energy Technology Office. NREL gratefully acknowledges development contributions from the following organizations: - -* Envision Energy USA, Ltd -* Brigham Young University -* [Intel® Parallel Computing Center (IPCC)](https://software.intel.com/en-us/ipcc) diff --git a/README.rst b/README.rst new file mode 100644 index 0000000000..3900f682d2 --- /dev/null +++ b/README.rst @@ -0,0 +1,148 @@ +OpenFAST +======== + +|travisci| |nbsp| |rtfd| + +.. |travisci| image:: https://travis-ci.org/OpenFAST/openfast.svg?branch=dev + :target: https://travis-ci.org/OpenFAST/openfast + :alt: Build Status +.. |rtfd| image:: https://readthedocs.org/projects/openfast/badge/?version=dev + :target: https://openfast.readthedocs.io/en/dev + :alt: Documentation Status +.. |nbsp| unicode:: 0xA0 + :trim: + +OpenFAST is a wind turbine simulation tool which builds on FAST v8. It was +created with the goal of being a community model developed and used by research +laboratories, academia, and industry. It is managed by a dedicated team at the +National Renewable Energy Lab. Our objective is to ensure that OpenFAST is +sustainable software that is well tested and well documented. If you'd like +to contribute, see the `Developer Documentation `_ +and any open GitHub issues with the +`Help Wanted `_ +tag. + +**OpenFAST is under active development**. + +FAST v8 - OpenFAST v0.1.0 +------------------------- +The transition from FAST v8 to OpenFAST v0.1.0 represents the effort to better +support an open-source developer community around FAST-based aero-hydro-servo- +elastic engineering models of wind-turbines and wind-plants. OpenFAST is the +next generation of FAST analysis tools. More inforation is available in the +`transition notes `_. + +FAST v8 is a computer-aided engineering tool for simulating the coupled dynamic +response of wind turbines. FAST joins aerodynamics models, hydrodynamics models +for offshore structures, control and electrical system (servo) dynamics models, +and structural (elastic) dynamics models to enable coupled nonlinear aero- +hydro-servo-elastic simulation in the time domain. The FAST tool enables the +analysis of a range of wind turbine configurations, including two- or +three-blade horizontal-axis rotor, pitch or stall regulation, rigid or +teetering hub, upwind or downwind rotor, and lattice or tubular tower. The wind +turbine can be modeled on land or offshore on fixed-bottom or floating +substructures. FAST is based on advanced engineering models derived from +fundamental laws, but with appropriate simplifications and assumptions, and +supplemented where applicable with computational solutions and test data. + +The aerodynamic models use wind-inflow data and solve for the rotor-wake +effects and blade-element aerodynamic loads, including dynamic stall. The +hydrodynamics models simulate the regular or irregular incident waves and +currents and solve for the hydrostatic, radiation, diffraction, and viscous +loads on the offshore substructure. The control and electrical system models +simulate the controller logic, sensors, and actuators of the blade-pitch, +generator-torque, nacelle-yaw, and other control devices, as well as the +generator and power-converter components of the electrical drive. The +structural-dynamics models apply the control and electrical system +reactions, apply the aerodynamic and hydrodynamic loads, adds gravitational +loads, and simulate the elasticity of the rotor, drivetrain, and support +structure. Coupling between all models is achieved through a modular +interface and coupler. + +Documentation +------------- +The full documentation is available at http://openfast.readthedocs.io/. + +This documentation is stored and maintained alongside the source code. +It is compiled into HTML with Sphinx and is tied to a particular version +of OpenFAST. `Readthedocs `_ hosts the following +versions of the documentation: + +* ``latest`` - The latest commit on the ``master`` branch +* ``stable`` - Corresponds to the last tagged release +* ``dev`` - The latest commit on the ``dev`` branch + +These can be toggled with the ``v: latest`` button in the lower left corner of +the docs site. + +Obtaining OpenFAST +------------------ +OpenFAST is hosted entirely on GitHub so you are in the `right place `_! +The repository is structured with two branches following the +"git-flow" convention: + +* ``master`` +* ``dev`` + +The ``master`` branch is stable, well tested, and represents the most up to +date released version of OpenFAST. The latest commit on ``master`` contains +a tag with version info and brief release notes. The tag history can be +obtained with the ``git tag`` command and viewed in more detail on +`GitHub Releases `_. For general +use, the ``master`` branch is highly recommended. + +The ``dev`` branch is generally stable and tested, but not static. It contains +new features, bug fixes, and documentation updates that have not been compiled +into a production release. Before proceeding with new development, it is +recommended to explore the ``dev`` branch. This branch is updated regularly +through pull requests, so be sure to ``git fetch`` often and check +`outstanding pull requests `_. + +For those not familiar with git and GitHub, there are many resources: + +* https://guides.github.com +* https://try.github.io +* https://help.github.com/categories/bootcamp/ +* https://desktop.github.com/ +* http://nvie.com/posts/a-successful-git-branching-model/ + +Compilation, Usage, and Development +----------------------------------- +Details for compiling +`compiling `_, +`using `_, and +`developing `_ +OpenFAST on Unux-based and Windows machines are available at `readthedocs `_. + +Nightly Testing +--------------- +The ``dev`` branch is automatically compiled and run through the test suite +nightly. The results are publicly available through the +`CDash Dashboard `_. + +Help +---- +Please use `github issues `_ to: + +* ask usage questions +* report bugs +* request code enhancements + +For other questions regarding OpenFAST, please contact +`Mike Sprague `_. + +Users and developers may also be interested in the NREL National Wind +Technology Center (NWTC) `phpBB Forum `_. + +Acknowledgments +--------------- + +OpenFAST is maintained and developed by researchers and software engineers at +the `National Renewable Energy Laboratory `_ (NREL), with +support from the US Department of Energy's Wind Energy Technology Office. NREL +gratefully acknowledges development contributions from the following +organizations: + +* Envision Energy USA, Ltd +* Brigham Young University +* `Intel® Parallel Computing Center (IPCC) `_ diff --git a/docs/conf.py b/docs/conf.py index 85479a74d3..9b7fdb7e6d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -159,7 +159,9 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # further. For a list of options available for each theme, see the # documentation. # -# html_theme_options = {} +html_theme_options = { + "analytics_id": "UA-68999653-10" +} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From 6e81413797d982d95c62a5190bb2cc0b2e2a19a1 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 24 Sep 2019 12:20:46 -0600 Subject: [PATCH 08/21] Add rtfd config file And bug fixes when warnings are treated as failures --- .readthedocs.yml | 29 +++++++++++++++ docs/source/dev/debugging.rst | 6 ++-- docs/source/get_started.rst | 41 ---------------------- docs/source/install/index.rst | 28 +++++++-------- docs/source/install/install_vs_windows.rst | 3 +- docs/source/testing/regression_test.rst | 2 +- 6 files changed, 49 insertions(+), 60 deletions(-) create mode 100644 .readthedocs.yml delete mode 100644 docs/source/get_started.rst diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000000..431543a33b --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,29 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +sphinx: + configuration: docs/conf.py + +formats: + - htmlzip + - pdf + # - epub + +python: + version: 3.7 + install: + - requirements: docs/requirements.txt + system_packages: true + +# select the docker image to use: stable | latest +build: + image: stable + +sphinx: + builder: html + configuration: docs/conf.py + fail_on_warning: true diff --git a/docs/source/dev/debugging.rst b/docs/source/dev/debugging.rst index 6e7ada3353..d8099da353 100644 --- a/docs/source/dev/debugging.rst +++ b/docs/source/dev/debugging.rst @@ -66,7 +66,7 @@ open the launch configuration and add a block similar to this: "target": "${workspaceRoot}/build/glue-codes/openfast/openfast", "cwd": "${workspaceRoot}/build/reg_tests/glue-codes/openfast/AOC_WSt/", "arguments": "${workspaceRoot}/build/reg_tests/glue-codes/openfast/AOC_WSt/AOC_WSt.fst", - }, + } Mac-specific configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -98,4 +98,6 @@ breakpoints in fortran files by adding this line to ``.vscode/settings.json``: .. code-block:: json - "debug.allowBreakpointsEverywhere": true, + { + "debug.allowBreakpointsEverywhere": true + } diff --git a/docs/source/get_started.rst b/docs/source/get_started.rst deleted file mode 100644 index 87f26ca6b3..0000000000 --- a/docs/source/get_started.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. _get_started: - -Getting Started -=============== - -**Get the code:** - -OpenFAST can be cloned (i.e., downloaded) from its `Github Repository `_, e.g., from the command line: -:: - - git clone https://github.com/OpenFAST/OpenFAST.git - -It can also be downloaded directly from https://github.com/OpenFAST/OpenFAST.git. - -**Compile the code:** - -See :ref:`installation`, for installation instructions (including dependency requirements) for CMake, Spack, and Visual Studio and for multiple platforms (Linux, Mac, Windows). -As an example, from the command line in a Mac or Linux environment: -:: - - cd OpenFAST - mkdir build && cd build - cmake ../ - make - -Note that one can see all of the `make` targets via -:: - - make help - - -**Use the code:** - -See :ref:`user_guide`, which is under construction. -In the interim, users may refer to the FAST v8 documentation at https://nwtc.nrel.gov/. - -**Develop the code:** - -See :ref:`dev_guide`, which is under construction. -In the interim, developers may consult the FAST v8 `Programmer's Handbook `_. - diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index 91f0e13a0b..a24643f01b 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -147,22 +147,22 @@ tool like ``make``, Visual Studio, or ``ninja``. CMake does not compile code or run compilers directly, but rather creates the environment needed for another tool to run compilers and create binaries. A CMake project is described by a series of files called -``CMakeLists.txt`` located in various directories. The main CMake file for OpenFAST -is located at ``openfast/CMakeLists.txt`` and each module and glue-code has -its own ``CMakeLists.txt``; for example, AeroDyn and BeamDyn have one at -``openfast/modules/aerodyn/CMakeLists.txt`` and +``CMakeLists.txt`` located in various directories. The main CMake file for +OpenFAST is located at ``openfast/CMakeLists.txt`` and each module and +glue-code has its own ``CMakeLists.txt``; for example, AeroDyn and BeamDyn +have one at ``openfast/modules/aerodyn/CMakeLists.txt`` and ``openfast/modules/beamdyn/CMakeLists.txt``, respectively. **Running CMake** -Running CMake and compiling will create many files (text files and binaries) used in the -various stages of the build. For this reason, a ``build`` folder is created -which contains all of the generated files associated with the build process. -Here, an important file called ``CMakeCache.txt`` contains the user-defined -settings for the CMake configuration. This file functions like memory storage -for the build. It is initially created the first time the CMake command is run -and populated with the initial settings. Then, any subsequent changes to the settings -will be updated and stored there. +Running CMake and compiling will create many files (text files and binaries) +used in the various stages of the build. For this reason, a ``build`` folder +is created which contains all of the generated files associated with the build +process. Here, an important file called ``CMakeCache.txt`` contains the +user-defined settings for the CMake configuration. This file functions like +memory storage for the build. It is initially created the first time the CMake +command is run and populated with the initial settings. Then, any subsequent +changes to the settings will be updated and stored there. CMake can be executed in a few ways: @@ -182,8 +182,8 @@ line syntax to run CMake for OpenFAST is generally: Options -D [:]= = Create or update a cmake cache entry. -For example, a common CMake command issued from the ``openfast/build`` directory -is: +For example, a common CMake command issued from the ``openfast/build`` +directory is: .. code-block:: bash diff --git a/docs/source/install/install_vs_windows.rst b/docs/source/install/install_vs_windows.rst index 0213d3c627..b9e5145657 100644 --- a/docs/source/install/install_vs_windows.rst +++ b/docs/source/install/install_vs_windows.rst @@ -4,8 +4,7 @@ Building OpenFAST on Windows with Visual Studio =============================================== These instructions are specifically for the standalone Visual Studio project at `openfast/vs-build`. -Separate CMake documentation is provided for Windows users at :numref:`install_cmake_windows` and -Cygwin users at :numref:`install_cmake_cygwin`. +Separate CMake documentation is provided for Windows users at :numref:`cmake_windows`. Prerequisites ------------------------ diff --git a/docs/source/testing/regression_test.rst b/docs/source/testing/regression_test.rst index c0a6c2a844..ecabeb4083 100644 --- a/docs/source/testing/regression_test.rst +++ b/docs/source/testing/regression_test.rst @@ -50,7 +50,7 @@ reported as failed. The failure criteria is outlined in pseudocode below. norm[i] = MaxNorm( difference[:,i] ) / channelRange if max(norm) < tolerance: - success! + pass = True Dependencies ------------ From 962d22689285b18b099ac97fab9dd31640c49f95 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 24 Sep 2019 13:55:43 -0600 Subject: [PATCH 09/21] Enable Doxygen for readthedocs --- docs/Doxyfile.in | 265 ++++++++++++++++++++++++-------------- docs/conf.py | 92 ++++++++----- docs/source/dev/index.rst | 14 +- 3 files changed, 235 insertions(+), 136 deletions(-) diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index e154543c1a..88c8b3b1fa 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -1,4 +1,4 @@ -# Doxyfile 1.8.13 +# Doxyfile 1.8.16 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -17,11 +17,11 @@ # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 @@ -44,14 +44,14 @@ PROJECT_NUMBER = # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "OpenFAST description goes here." +PROJECT_BRIEF = "Wind turbine multiphysics simulator" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = @CMAKE_BINARY_DIR@/docs/html/_static/openfastlogo.jpg +PROJECT_LOGO = @CMAKE_BINARY_DIR@/docs/_static/openfastlogo.jpg # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -93,6 +93,14 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -189,6 +197,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = YES + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -236,7 +254,12 @@ TAB_SIZE = 4 # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) ALIASES = @@ -274,16 +297,26 @@ OPTIMIZE_FOR_FORTRAN = YES OPTIMIZE_OUTPUT_VHDL = NO +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it -# language is one of the parsers supported byen:IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is +# Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # @@ -294,7 +327,7 @@ EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. +# documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. @@ -306,10 +339,10 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. -TOC_INCLUDE_HEADINGS = 0 +TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can @@ -336,7 +369,7 @@ BUILTIN_STL_SUPPORT = YES CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. @@ -434,7 +467,7 @@ LOOKUP_CACHE_SIZE = 0 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = YES +EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. @@ -442,11 +475,17 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = YES +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. -EXTRACT_PACKAGE = YES +EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. @@ -468,7 +507,7 @@ EXTRACT_LOCAL_CLASSES = YES # included. # The default value is: NO. -EXTRACT_LOCAL_METHODS = YES +EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called @@ -520,7 +559,7 @@ INTERNAL_DOCS = NO # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. +# (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO @@ -707,7 +746,7 @@ LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. @@ -752,7 +791,8 @@ WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = NO @@ -795,7 +835,7 @@ INPUT = @CMAKE_SOURCE_DIR@/glue-codes/ \ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. @@ -819,6 +859,7 @@ FILE_PATTERNS = *.f90 \ *.F90 \ *.f \ *.F \ + *.for \ *.c \ *.cxx \ *.cpp \ @@ -827,7 +868,8 @@ FILE_PATTERNS = *.f90 \ *.hh \ *.hxx \ *.hpp \ - *.h + *.h \ + *.py # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. @@ -842,12 +884,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE_PATTERNS = @CMAKE_SOURCE_DIR@/.git/* \ - @CMAKE_SOURCE_DIR@/build/* \ - @CMAKE_SOURCE_DIR@/cmake/* \ - @CMAKE_SOURCE_DIR@/docs/* \ - @CMAKE_SOURCE_DIR@/modules/orcaflex-interface/src/OrcaFlexInterface.f90 \ - @CMAKE_SOURCE_DIR@/modules/servodyn/src/BladedInterface.f90 +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -863,6 +900,13 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* +EXCLUDE_PATTERNS = @CMAKE_SOURCE_DIR@/.git/* \ + @CMAKE_SOURCE_DIR@/build/* \ + @CMAKE_SOURCE_DIR@/cmake/* \ + @CMAKE_SOURCE_DIR@/docs/* \ + @CMAKE_SOURCE_DIR@/modules/orcaflex-interface/src/OrcaFlexInterface.f90 \ + @CMAKE_SOURCE_DIR@/modules/servodyn/src/BladedInterface.f90 + # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the @@ -943,7 +987,9 @@ FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern usihistag requires that the tag FILTER_SOURCE_FILES is set to YES. +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = @@ -981,16 +1027,16 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. +# entity all documented functions referencing it will be listed. # The default value is: NO. -REFERENCED_BY_RELATION = YES +REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. -REFERENCES_RELATION = YES +REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and @@ -1013,12 +1059,12 @@ SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version +# (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # @@ -1158,7 +1204,7 @@ HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. @@ -1194,6 +1240,17 @@ HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = NO +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via Javascript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have Javascript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. @@ -1217,13 +1274,13 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# environment (see: https://developer.apple.com/xcode/), introduced with OSX +# 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1262,7 +1319,7 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output @@ -1338,7 +1395,7 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1346,7 +1403,7 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1355,7 +1412,7 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1363,7 +1420,7 @@ QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1371,7 +1428,7 @@ QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1464,7 +1521,7 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # @@ -1476,7 +1533,7 @@ FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1503,11 +1560,11 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example @@ -1543,7 +1600,7 @@ MATHJAX_CODEFILE = # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -SEARCHENGINE = NO +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using Javascript. There @@ -1565,7 +1622,7 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). +# Xapian (see: https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1578,7 +1635,7 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Xapian (see: https://xapian.org/). See the section "External Indexing and # Searching" for details. # This tag requires that the tag SEARCHENGINE is set to YES. @@ -1630,21 +1687,35 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. # -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. +# Note that when not enabling USE_PDFLATEX the default is latex when enabling +# USE_PDFLATEX the default is pdflatex and when in the later case latex is +# chosen this is overwritten by pdflatex. For specific output languages the +# default can have been set differently, this depends on the implementation of +# the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. +# Note: This tag is used in the Makefile / make.bat. +# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file +# (.tex). # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex +# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. +# Note: This tag is used in the generated output file (.tex). +# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. +# The default value is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_MAKEINDEX_CMD = makeindex + # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. @@ -1765,7 +1836,7 @@ LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1779,6 +1850,14 @@ LATEX_BIB_STYLE = plain LATEX_TIMESTAMP = NO +# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) +# path from which the emoji images will be read. If a relative path is entered, +# it will be relative to the LATEX_OUTPUT directory. If left blank the +# LATEX_OUTPUT directory will be used. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EMOJI_DIRECTORY = + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1818,9 +1897,9 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# configuration file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the # default style sheet that doxygen normally uses. @@ -1829,8 +1908,8 @@ RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. +# similar to doxygen's configuration file. A template extensions file can be +# generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = @@ -1916,6 +1995,13 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# namespace members in file scope as well, matching the HTML output. +# The default value is: NO. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_NS_MEMB_FILE_SCOPE = NO + #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- @@ -1948,9 +2034,9 @@ DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sf.net) file that captures the -# structure of the code including all documentation. Note that this feature is -# still experimental and incomplete at the moment. +# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# the structure of the code including all documentation. Note that this feature +# is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -2040,7 +2126,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = *.h *.hpp +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2088,12 +2174,14 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -GENERATE_TAGFILE = @CMAKE_BINARY_DIR@/docs/openfast.tag +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. +GENERATE_TAGFILE = @CMAKE_BINARY_DIR@/docs/openfast.tag + # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be # listed. @@ -2115,12 +2203,6 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- @@ -2134,15 +2216,6 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = YES -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2205,7 +2278,7 @@ DOT_FONTPATH = # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -CLASS_GRAPH = NO +CLASS_GRAPH = YES # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation @@ -2214,14 +2287,14 @@ CLASS_GRAPH = NO # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -COLLABORATION_GRAPH = NO +COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for # groups, showing the direct groups dependencies. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GROUP_GRAPHS = NO +GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling @@ -2259,7 +2332,7 @@ TEMPLATE_RELATIONS = NO # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -INCLUDE_GRAPH = NO +INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing @@ -2280,7 +2353,7 @@ INCLUDED_BY_GRAPH = NO # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALL_GRAPH = NO +CALL_GRAPH = YES # If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller # dependency graph for every global function or class method. @@ -2292,7 +2365,7 @@ CALL_GRAPH = NO # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALLER_GRAPH = NO +CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical # hierarchy of all classes instead of a textual one. @@ -2308,7 +2381,7 @@ GRAPHICAL_HIERARCHY = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -DIRECTORY_GRAPH = NO +DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section diff --git a/docs/conf.py b/docs/conf.py index 9b7fdb7e6d..f73c5c2af7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,11 +24,11 @@ #sys.path.append(os.path.abspath('_extensions/')) readTheDocs = os.environ.get('READTHEDOCS', None) == 'True' -sourcedir = sys.argv[-2] builddir = sys.argv[-1] +sourcedir = sys.argv[-2] # Use this to turn Doxygen on or off -useDoxygen=False +useDoxygen = True # This function was adapted from https://gitlab.kitware.com/cmb/smtk # Only run when on readthedocs @@ -37,13 +37,12 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): cfg = dx.read() srcdir = os.path.abspath(os.path.join(os.getcwd(), '..')) bindir = srcdir - c2 = re.sub('@CMAKE_SOURCE_DIR@', srcdir, \ - re.sub('@CMAKE_BINARY_DIR@', bindir, cfg)) + c2 = re.sub('@CMAKE_SOURCE_DIR@', srcdir, re.sub('@CMAKE_BINARY_DIR@', bindir, cfg)) doxname = os.path.join(sourcedir, doxyfileOut) dox = open(doxname, 'w') - print >>dox, c2 + print(c2, file=dox) dox.close() - print 'Running Doxygen on %s' % doxyfileOut + print("Running Doxygen on {}".format(doxyfileOut)) doxproc = subprocess.call(('doxygen', doxname)) if readTheDocs and useDoxygen: @@ -59,15 +58,19 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.mathjax', - 'sphinx.ext.intersphinx', - 'sphinxcontrib.doxylink', - 'sphinxcontrib.bibtex', - ] + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.mathjax', + 'sphinx.ext.intersphinx', + 'sphinxcontrib.doxylink', + 'sphinxcontrib.bibtex', +] -autodoc_default_flags = ['members','show-inheritance','undoc-members'] +autodoc_default_flags = [ + 'members', + 'show-inheritance', + 'undoc-members' +] autoclass_content = 'both' @@ -77,16 +80,16 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): if useDoxygen: if readTheDocs: doxylink = { - 'openfast' : ( - os.path.join(builddir, '..', '..', 'openfast.tag'), - os.path.join('html') + 'openfast': ( + os.path.join(builddir, '..', '..', 'openfast.tag'), + os.path.join('html') ) } else: doxylink = { - 'openfast' : ( - os.path.join(builddir, '..', 'openfast.tag'), - os.path.join('html') + 'openfast': ( + os.path.join(builddir, '..', 'openfast.tag'), + os.path.join('html') ) } @@ -199,8 +202,13 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'Openfast.tex', u'OpenFAST Documentation', - u'National Renewable Energy Laboratory', 'manual'), + ( + master_doc, + 'Openfast.tex', + u'OpenFAST Documentation', + u'National Renewable Energy Laboratory', + 'manual' + ), ] @@ -209,8 +217,13 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'openfast', u'OpenFAST Documentation', - [author], 1) + ( + master_doc, + 'openfast', + u'OpenFAST Documentation', + [author], + 1 + ) ] @@ -220,16 +233,27 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'OpenFAST', u'OpenFAST Documentation', - author, 'OpenFAST', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + 'OpenFAST', + u'OpenFAST Documentation', + author, + 'OpenFAST', + 'One line description of project.', + 'Miscellaneous' + ), ] def setup(app): - app.add_object_type("confval", "confval", - objname="input file parameter", - indextemplate="pair: %s; input file parameter") - app.add_object_type("cmakeval", "cmakeval", - objname="CMake configuration value", - indextemplate="pair: %s; CMake configuration") - + app.add_object_type( + "confval", + "confval", + objname="input file parameter", + indextemplate="pair: %s; input file parameter" + ) + app.add_object_type( + "cmakeval", + "cmakeval", + objname="CMake configuration value", + indextemplate="pair: %s; CMake configuration" + ) diff --git a/docs/source/dev/index.rst b/docs/source/dev/index.rst index adae17751d..f8d92da6a9 100644 --- a/docs/source/dev/index.rst +++ b/docs/source/dev/index.rst @@ -45,12 +45,14 @@ For other questions regarding OpenFAST, please contact API Reference ~~~~~~~~~~~~~ -If the Doxygen documentation is available, it can be found at the following -locations: - -- `Main Page <../../../doxygen/html/index.html>`_ -- `Index of Classes <../../../doxygen/html/classes.html>`_ -- `Files <../../../doxygen/html/files.html>`_ +Some subroutines and derived types throughout the source code have in-source +documentation which is compiled with Doxygen. This portion of the documentation +is always under development, but the existing API reference can be found in the +following pages: + +- `Main Page <../../html/index.html>`_ +- `Index of Types <../../html/classes.html>`_ +- `Source Files <../../html/files.html>`_ .. _development_philosophy: From b78830ed113daf016d0bab7b1c4af711b2e6b7be Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 27 Sep 2019 13:25:18 -0600 Subject: [PATCH 10/21] Update link to download the latest binaries --- docs/source/install/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index a24643f01b..44b002716a 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -32,7 +32,7 @@ available: All precompiled binaries can be found in the ``Assets`` dropdown in the `GitHub Releases `__. Click -`here `__ +`here `__ to download the latest binaries. Compile from source From a9855fdd1a251f73ea6f7f8d0e4339641cff04f6 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 1 Oct 2019 08:57:12 -0600 Subject: [PATCH 11/21] Minor bug fixes --- docs/source/install/index.rst | 65 +++++++++++++++++++------------ docs/source/testing/index.rst | 2 +- docs/source/testing/unit_test.rst | 10 ++--- docs/source/this_doc.rst | 15 +++---- 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index 44b002716a..f03e832aa6 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -5,9 +5,9 @@ Installing OpenFAST Guidelines and procedures for obtaining precompiled binaries or compiling OpenFAST from source code are described here. While there are multiple ways to achieve the same outcome, the OpenFAST team has developed -a comprehensive and well though out system for compiling the source code. Thus, -the methods described here are the only officially supported and maintained -paths for obtaining an OpenFAST executable. +a comprehensive and well thought out system for compiling the source code. +Thus, the methods described here are the only officially supported and +maintained paths for obtaining an OpenFAST executable. For Windows users only, precompiled binaries are available as described in the :ref:`download_binaries` section. For all platforms, OpenFAST is configured @@ -38,26 +38,28 @@ to download the latest binaries. Compile from source ~~~~~~~~~~~~~~~~~~~ For compiling from source code, the NREL OpenFAST team has developed an -approach that uses CMake to generate build files for all platforms. At the -moment, CMake support for Visual Studio while doing active development +approach that uses CMake to generate build files for all platforms. Currently, +CMake support for Visual Studio while doing active development is not well supported, so OpenFAST maintains a Visual Studio solution giving Windows developers a better option for developing code, compiling -and debugging in a streamlined manner. +and debugging in a streamlined manner. See :ref:`installation_appendix` +for more information. Dependencies ------------ Compiling OpenFAST from source requires additional libraries and tools that are not distributed with the OpenFAST repository. In many cases, these tools -can be installed with a system's package manager (e.g. ``homebrew``, ``yum``, -or ``apt``). If binaries are downloaded or compiled locally, be sure they are +can be installed with a system's package manager (e.g. ``homebrew`` for macOS, +``yum`` for CentOS/Red Hat, or ``apt`` for Debian-based systems like Ubuntu). +If binaries are downloaded or compiled manually, be sure they are installed in a standard location for your system so that the other components of the OpenFAST build system can find the dependencies. Build tools +++++++++++ -A build system is required and may consist of a combination of the following -packages: +An environment-specific build system is required and may consist of a +combination of the following packages: - `CMake `__ - minimum version 3.0 - `GNU Make `__ @@ -112,7 +114,7 @@ When using the C++ API, the following packages are required: Get the code ------------ -OpenFAST can be cloned (i.e., downloaded) from its `Github Repository `_ +OpenFAST can be cloned (i.e., downloaded) from its `Github repository `_ via the command line: .. code-block:: bash @@ -124,7 +126,7 @@ An archive of the source code can also be downloaded directly from these links: - `"master" branch `__ - Stable release - `"dev" branch `__ - Latest updates -.. _understanding_cmake: +.. _vs_windows: Visual Studio Solution for Windows ---------------------------------- @@ -137,13 +139,15 @@ with the build process are documentated in the following section: install_vs_windows.rst +.. _understanding_cmake: + Understanding CMake ------------------- To more fully understand CMake and its methodology, visit this guide on `running CMake `__. CMake is a build configuration system that creates files as input to a build -tool like ``make``, Visual Studio, or ``ninja``. CMake does not compile code +tool like GNU Make, Visual Studio, or Ninja. CMake does not compile code or run compilers directly, but rather creates the environment needed for another tool to run compilers and create binaries. A CMake project is described by a series of files called @@ -157,8 +161,8 @@ have one at ``openfast/modules/aerodyn/CMakeLists.txt`` and Running CMake and compiling will create many files (text files and binaries) used in the various stages of the build. For this reason, a ``build`` folder -is created which contains all of the generated files associated with the build -process. Here, an important file called ``CMakeCache.txt`` contains the +should be created to contain all of the generated files associated with the +build process. Here, an important file called ``CMakeCache.txt`` contains the user-defined settings for the CMake configuration. This file functions like memory storage for the build. It is initially created the first time the CMake command is run and populated with the initial settings. Then, any subsequent @@ -207,8 +211,8 @@ happens through keyboard inputs. **OpenFAST CMake options** -CMake has a large number of configuration variables avaiable. Here is a good -resource for useful CMake variables: `GitLab CMake variables `_. +CMake has a large number of general configuration variables available. A good +resource for useful CMake variables is at this link: `GitLab CMake variables `_. The `CMake API documentation `_ is also helpful for searching through variables and determining the resulting action. Note that the CMake process should be well understood before @@ -284,10 +288,14 @@ populated: # Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files. # Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files. - # Choose on from the list above and pass it as an argument after -G + # Choose one from the list above and pass it as an argument after -G # NOTE: wrap this is in quotes! cmake .. -G"Sublime Text 2 - Ninja" +.. note:: + + If the chosen generator name contains spaces, be sure to wrap it in quotes. + **Math libraries** The CMake project is configured to search for the required math libraries @@ -335,10 +343,13 @@ and Mac systems is given below. make help # Choose a particular target or give no target to compile everything - # NOTE: compile in parallel by adding "-jN" where N is - # where N is the number of parallel processes to use make +.. tip:: + + Compile in parallel by adding "-jN" where N is the number of parallel + processes to use + This will build the OpenFAST project in the ``build`` directory. Binaries are located in ``openfast/build/glue-codes/`` and ``openfast/build/modules/``. Since all build-related files are located in the ``build`` directory, a new fresh build @@ -392,11 +403,16 @@ OpenFAST executable will be located at ``openfast/build/glue-codes/Release/openf when compiling in *Release* mode. **The CMake-generated Visual Studio build is currently damaged.** Some modules -are compiled before their associated registry type files are seen by Visual -Studio so an initial build may fail. However, a simple work around is to run -the build command in Visual Studio multiple times until it succeeds. +are compiled before their associated OpenFAST Registry type-files are seen by +Visual Studio so an initial build may fail. However, a simple work around is +to run the build command in Visual Studio multiple times until it succeeds. +Futher, any configurations made to the Solution in the Visual Studio UI will be +lost when CMake is executed, and this can happen whenever a change is made to +the structure of the file system. It is recommended that this method **not** be +used for debugging or active development on Windows. Instead, see +:ref:`vs_windows`. -.. _vs_windows: +.. _installation_appendix: Appendix ~~~~~~~~ @@ -409,3 +425,4 @@ test or may be deprecated in the future. install_spack.rst .. TODO: Check the windows paths: math library command, installation location +.. TODO: Add cygwin? diff --git a/docs/source/testing/index.rst b/docs/source/testing/index.rst index 56f462d6f0..7c8df5bbb7 100644 --- a/docs/source/testing/index.rst +++ b/docs/source/testing/index.rst @@ -16,7 +16,7 @@ corresponding to the tested module. Configuring the test suite -------------------------- Portions of the test suite are linked to the OpenFAST repository through a -``git submodule``. Specifically, +`git submodule`. Specifically, - `r-test `__ - `pFUnit `__ diff --git a/docs/source/testing/unit_test.rst b/docs/source/testing/unit_test.rst index da45dabace..6c6e439774 100644 --- a/docs/source/testing/unit_test.rst +++ b/docs/source/testing/unit_test.rst @@ -28,9 +28,9 @@ The following packages are required for unit testing: Compiling --------- Compiling the unit tests is handled with CMake similar to compiling OpenFAST -in general. After configuring CMake with ``BUILD_TESTING`` turned on, new make -targets are created for each module included in the unit test framework named -``[module]_utest``. Then, simply make the target to test +in general. After configuring CMake with ``BUILD_TESTING`` turned on, new +``make`` targets are created for each module included in the unit test +framework named ``[module]_utest``. Then, simply ``make`` the target to test .. code-block:: bash @@ -38,7 +38,7 @@ targets are created for each module included in the unit test framework named make beamdyn_utest This creates a unit test executable at -``openfast/build/unit_tests/[module]_utest``. +``openfast/build/unit_tests/beamdyn_utest``. Executing --------- @@ -56,7 +56,7 @@ To execute a module's unit test, simply run the unit test binary. For example: pFUnit will display a ``.`` for each unit test successfully completed and a ``F`` for each failing test. If any tests do fail, the failure criteria will be displayed listing which particular value caused -the failure. Failure cases display the following output +the failure. Failure cases display the following output: .. code-block:: bash diff --git a/docs/source/this_doc.rst b/docs/source/this_doc.rst index 780787ac56..24ff4bf367 100644 --- a/docs/source/this_doc.rst +++ b/docs/source/this_doc.rst @@ -4,7 +4,7 @@ This documentation ================== OpenFAST documentation is hosted on -`readthedocs `_, and is automatically +`readthedocs `_, and is automatically generated from both the `master `_ and `dev `_ branches whenever @@ -13,23 +13,24 @@ page reveals a panel (see image below) containing options to select the branch of the repository, download the documentation other formats (PFD, HTML, EPub), and link to other relevant websites. -.. figure:: ../_static/docs_options.png +.. image:: ../_static/docs_options.png :width: 30% :align: center While OpenFAST developer documentation is being enhanced here, developers are encouraged to consult the legacy FAST v8 `Programmer's Handbook `_. +Instructions on obtaining and installing OpenFAST are available in +:ref:`installation`, and documentation for verifying an installation with the +automated tests is at :ref:`testing`. -This documentation is divided into two parts: +The majority of this documentation is divided into two parts: :ref:`user_guide` Directed towards end-users, this part provides detailed documentation - regarding installation and usage of the OpenFAST and its underlying modules, - as well as theory and verification documentation. Also included are - instructions for using the automated test suite, which serves as a suite of - examples. + regarding usage of the OpenFAST and its underlying modules, + as well as theory and verification documentation. :ref:`dev_guide` From 938c1acb40b6151c5a66b4dee7b8b079868b62f5 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 1 Oct 2019 11:32:56 -0600 Subject: [PATCH 12/21] Improve the regression testing docs --- docs/source/testing/index.rst | 16 +- docs/source/testing/regression_test.rst | 348 ++++++++++++++++-------- 2 files changed, 241 insertions(+), 123 deletions(-) diff --git a/docs/source/testing/index.rst b/docs/source/testing/index.rst index 7c8df5bbb7..25b7a08d3d 100644 --- a/docs/source/testing/index.rst +++ b/docs/source/testing/index.rst @@ -26,15 +26,12 @@ Portions of the test suite are linked to the OpenFAST repository through a Be sure to clone the repo with the ``--recursive`` flag or execute ``git submodule update --init --recursive`` after cloning. -The test suite can be configured with `CMake `__ similar to -OpenFAST. The default CMake configuration is useful, but may need customization -for particular build environments. See the :ref:`installation` section for more -details on configuring the CMake targets. - -While the unit tests must be built with CMake due to its external dependencies, -the regression test may be executed without CMake. :numref:`unit_test` and -:numref:`regression_test` have more information on unit testing and regression -testing, respectively. +The test suite can be configured with CMake similar to OpenFAST. The default +CMake configuration is generally applicable, but may need customization +for particular build environments. See the :ref:`understanding_cmake` section +for more details on configuring the CMake targets. While the unit tests must +be built with CMake due to its external dependencies, the regression test +may be executed without CMake. Test specific documentation --------------------------- @@ -43,7 +40,6 @@ Test specific documentation unit_test.rst regression_test.rst - regression_test_windows.rst Continuous integration ---------------------- diff --git a/docs/source/testing/regression_test.rst b/docs/source/testing/regression_test.rst index ecabeb4083..33bca32f1f 100644 --- a/docs/source/testing/regression_test.rst +++ b/docs/source/testing/regression_test.rst @@ -3,8 +3,8 @@ Regression test =============== The regression test executes a series of test cases which intend to fully -describe OpenFAST and its module's capabilities. Jump to -:ref:`regression_test_ctest`, :ref:`regression_test_example`, or +describe OpenFAST and its module's capabilities. Jump to :ref:`python_driver` +:ref:`ctest_driver`, :ref:`regression_test_example`, or :ref:`regression_test_windows` for instructions on running the regression tests. @@ -37,8 +37,8 @@ and all of the locally generated outputs are stored. Ultimately, both CTest and the manual execution program call a series of Python scripts and libraries in ``reg_tests`` and ``reg_tests/lib``. One such script is ``lib/pass_fail.py`` which reads the output files and computes a norm on each channel reported. If -the maximum norm is greater than a preset tolerance, that particular test is -reported as failed. The failure criteria is outlined in pseudocode below. +the maximum norm is greater than the given tolerance, that particular test is +reported as failed. The failure criteria is outlined below. .. code-block:: python @@ -61,8 +61,10 @@ The following packages are required for regression testing: - CMake and CTest (Optional) - matplotlib (Optional) -Manual driver -------------- +.. _python_driver: + +Executing with Python driver +---------------------------- The regression test can be executed manually with the included driver at ``openfast/reg_tests/manualRegressionTest.py``. This program reads a case list file at ``openfast/reg_tests/r-test/glue-codes/openfast/CaseList.md``. Cases @@ -95,156 +97,276 @@ optional flags which can be obtained by executing with the help option: bool to include verbose system output -case [Case-Name] single case name to execute -For the NREL 5MW turbine test cases, an external ServoDyn controller must be compiled and -included in the appropriate directory or all NREL 5MW cases will fail without starting. -More information is available in the documentation for the -`r-test repository `__. +.. note:: -CTest driver ------------- -CTest is included with CMake and is mostly a set of preconfigured targets and -commands. To use the CTest driver for the regression test, execute CMake as + For the NREL 5MW turbine test cases, an external ServoDyn controller must + be compiled and included in the appropriate directory or all NREL 5MW + cases will fail without starting. More information is available in the + documentation for the `r-test repository `__, + but be aware that these three DISCON controllers must exist + + .. code-block:: bash + + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_ITIBarge.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_OC3Hywind.dll + +.. _ctest_driver: + +Executing with CTest +-------------------- +CTest is included with CMake and is primarily a set of preconfigured targets +and commands. To use the CTest driver for the regression test, execute CMake as described in :ref:`installation`, but with this additional flag: -``BUILD_TESTING=ON``. +``-DBUILD_TESTING=ON``. The regression test specific CMake variables are :: - - BUILD_TESTING - - CTEST_OPENFAST_EXECUTABLE - - CTEST_[MODULE]_EXECUTABLE - - CTEST_PLOT_ERRORS - - CTEST_REGRESSION_TOL + BUILD_TESTING + CTEST_OPENFAST_EXECUTABLE + CTEST_[MODULE]_EXECUTABLE where [MODULE] is the module name + CTEST_PLOT_ERRORS + CTEST_REGRESSION_TOL -**IT IS IMPORTANT** to verify that NREL 5MW turbine external controllers are compiled -and placed in the correct location. More information is available in the documentation for the -`r-test repository `__, -but be aware that these three DISCON controllers must exist +Some additional resources that are required for the full regression test suite +are included in the CMake project. Specifically, external ServoDyn controllers +must be compiled for a given system and placed in a particular location. Thus, +be sure to execute the build command with the ``install`` target: .. code-block:: bash - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON.dll - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_ITIBarge.dll - openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_OC3Hywind.dll - -This can be accomplished manually with the CMake projects included with the DISCON source codes -at ``openfast/reg_tests/r-test/glue-codes/openfast/5MW_Baseline/ServoData/`` -or during CMake configuration by setting the ``CMAKE_INSTALL_PREFIX`` CMake variable. -If using this method, the install prefix variable should point to an existing and appropriate -location for CMake to place the compiled binaries. This is important because the NREL 5MW turbine external -controller CMake projects are preconfigured to install themselves in the appropriate -location in the build directory. Then, it is important to execute ``make install`` -rather than simply ``make``. If ``CMAKE_INSTALL_PREFIX`` is not appropriately configured, -the install step may fail or openfast binaries may be placed in some inappropriate default location. - -After CMake configuration, the automated regression test can be executed -by running either of the commands ``make test`` or ``ctest`` from the build -directory. If the entire OpenFAST package is to be built, CMake will configure -CTest to find the new binary at ``openfast/build/glue-codes/openfast/openfast``. -However, if the intention is to build only the test suite, the OpenFAST binary -should be specified in the CMake configuration under the ``CTEST_OPENFAST_EXECUTABLE`` -flag. There is also a corresponding ``CTEST_[MODULE]_NAME`` flag for each module -included in the regression test. - -.. _regression_test_ctest: - -Running the regression test with CTest --------------------------------------- + # configure cmake + cmake .. -DBUILD_TESTING=ON + + # build and install + make install + +.. note:: + + REMINDER: For the NREL 5MW turbine test cases, an external ServoDyn controller must + be compiled and included in the appropriate directory or all NREL 5MW + cases will fail without starting. More information is available in the + documentation for the `r-test repository `__, + but be aware that these three DISCON controllers must exist + + .. code-block:: bash + + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_ITIBarge.dll + openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline/ServoData/DISCON_OC3Hywind.dll + +After CMake configuration and compiling, the automated regression test can be +executed by running either of the commands ``make test`` or ``ctest`` from the +``build`` directory. If the entire OpenFAST package is to be built, CMake will +configure CTest to find the new binary at +``openfast/build/glue-codes/openfast/openfast``. However, if the intention is +to build only the test suite, the OpenFAST binary should be specified in the +CMake configuration under the ``CTEST_OPENFAST_EXECUTABLE`` flag. There is +also a corresponding ``CTEST_[MODULE]_NAME`` flag for each module included in +the regression test. When driven by CTest, the regression test can be executed by running various -forms of the command ``ctest`` from the build directory. The basic commands are +forms of the command ``ctest`` from the build directory. The basic commands +are: + +.. code-block:: bash + + # Run the entire regression test + ctest + + # Disable actual execution of tests; + # this is helpful in formulating a particular ctest command + ctest -N -- ``ctest`` - Run the entire regression test -- ``ctest -N`` - Disable actual execution of tests; this is helpful in formulating a particular ctest command -- ``ctest -V`` - Run the entire regression test with verbose output -- ``ctest -R [TestName]`` - Run a test by name where TestName is a regex to search -- ``ctest -j [N]`` - Run all tests with N tests executing in parallel + # Run the entire regression test with verbose output + ctest -V + + # Run a test by name where TestName is a regular expression (regex) + ctest -R [TestName] + + # Run all tests with N tests executing in parallel + ctest -j [N] Each regression test case contains a series of labels associating all of the modules used. The labeling can be seen in the test instantiation in -``reg_tests/CTestList.cmake`` or with the command +``reg_tests/CTestList.cmake`` or with the command: -- ``ctest --print-labels`` - Print all available test labels +.. code-block:: bash -Labels can be called directly with + # Print all available test labels + ctest --print-labels -- ``ctest -L [Label]`` +The test cases corresponding to a particular label can be executed with this +command: -These flags can be compounded making useful variations of ``ctest`` such as +.. code-block:: bash -- ``ctest -V -L aerodyn14`` - Runs all cases that use AeroDyn14 with verbose output -- ``ctest -j 16 -L aerodyn14`` - Runs all cases that use AeroDyn14 in 16 concurrent processes -- ``ctest -V -R 5MW_DLL_Potential_WTurb`` - Runs the case with name "5MW_DLL_Potential_WTurb" -- ``ctest -N -L beamdyn`` - Lists all tests with the "beamdyn" label -- ``ctest -N -R bd --print-labels`` - Lists the labels included in all tests matching the regex "bd" + # Filter the test cases corresponding to a particular label + ctest -L [Label] -The automated regression test writes new files only into the build directory. Specifically, -all locally generated solutions are located in the corresponding glue-code or module within -``openfast/build/reg_tests``. The baseline solutions contained in ``openfast/reg_tests/r-test`` -are strictly read not modified by the automated process. +Flags can be compounded making useful variations of ``ctest`` such as -.. _regression_test_example: +.. code-block:: bash + + # Run all cases that use AeroDyn14 with verbose output + ctest -V -L aerodyn14 + + # Run all cases that use AeroDyn14 in 16 concurrent processes + ctest -j 16 -L aerodyn14 -Regression test example ------------------------ -The following examples illustrate ways to run the regression tests. + # Run the case with name "5MW_DLL_Potential_WTurb" with verbose output + ctest -V -R 5MW_DLL_Potential_WTurb -CTest driver -~~~~~~~~~~~~ + # List all tests with the "beamdyn" label + ctest -N -L beamdyn -Python driver -~~~~~~~~~~~~~ + # List the labels included in all tests matching the regex "bd" + ctest -N -R bd --print-labels +The automated regression test writes new files only into the build directory. +Specifically, all locally generated solutions are located in the corresponding +glue-code or module within ``openfast/build/reg_tests``. The baseline solutions +contained in ``openfast/reg_tests/r-test`` are strictly read not modified by +the automated process. + +.. _regression_test_example: + +Regression test examples +------------------------ +The following examples illustrate methods of running the regression tests. + +Compile OpenFAST and execute with CTest +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The following example assumes the user is starting completely from scratch. +The commands below download the source code, configure the OpenFAST project +with CMake, compile all executables, and execute the full regression test +suite. + .. code-block:: bash + # Download the source code from GitHub + # Note: The default branch is 'master' git clone --recursive https://github.com/openfast/openfast.git cd openfast - ## Build the ServoDyn external controller libraries - # Open the Visual Studio Solution (DISCON.sln) located in 'openfast\vs-build\DISCON' - # Choose Release and x64 for the Solutions Configuration and Solutions Platform - # Build Solution + # If necessary, switch to another target branch and update r-test + git checkout dev + git submodule update + + # Create the build directory and move into it + mkdir build install && cd build - ## Execute the OpenFAST regression Tests - # Open a command prompt which is configured for Python (like Anaconda) - cd openfast\reg_tests - python manualRegressionTest.py ..\build\bin\openfast_x64.exe Windows Intel 1e-5 + # Configure CMake for testing + # - BUILD_TESTING - turn ON + # - CTEST_OPENFAST_EXECUTABLE - accept the default + # - CTEST_[MODULE]_EXECUTABLE - accept the default + cmake .. -DBUILD_TESTING=ON + # Compile and install + make install + # Execute the full test suite with 4 processes + ctest -j4 + +Configure with CMake and a given executable +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example assumes the user has a fully functional OpenFAST executable +available along with any necessary libraries, but does not have the source +code repository downloaded. This might be the case when executables are +distributed within an organization. Here, nothing will be compiled, but the +test suite will be configured with CMake for use with the CTest command. .. code-block:: bash - git clone --recursive https://github.com/openfast/openfast.git - # The default git branch is 'master'. If necessary, switch to your target branch: - # git checkout dev - mkdir build install && cd build - # Configure CMake with openfast/CMakeLists.txt - # - BUILD_TESTING - # - CTEST_OPENFAST_EXECUTABLE - # - CTEST_[MODULE]_EXECUTABLE - cmake .. -DBUILD_TESTING=ON - make install - ctest + # Download the source code from GitHub + # Note: The default branch is 'master' + git clone --recursive https://github.com/openfast/openfast.git + cd openfast + # If necessary, switch to another target branch and update r-test + git checkout dev + git submodule update -.. code-block:: bash + # Create the build directory and move into it + mkdir build install && cd build + + # Configure CMake with openfast/reg_tests/CMakeLists.txt + # - BUILD_TESTING + # - CTEST_OPENFAST_EXECUTABLE + # - CTEST_[MODULE]_EXECUTABLE + + # Configure CMake for testing + # - BUILD_TESTING - turn ON + # - CTEST_OPENFAST_EXECUTABLE - provide a path + # - CTEST_[MODULE]_EXECUTABLE - provide a path + cmake ../reg_tests -DBUILD_TESTING=ON -DCTEST_OPENFAST_EXECUTABLE=/home/user/Desktop/openfast_executable -DCTEST_BEAMDYN_EXECUTABLE=/home/user/Desktop/beamdyn_driver + + # Install required files + make install - git clone --recursive https://github.com/openfast/openfast.git - # The default git branch is 'master'. If necessary, switch to your target branch: - # git checkout dev - mkdir build install && cd build - # Configure CMake with openfast/reg_tests/CMakeLists.txt - # - BUILD_TESTING - # - CTEST_OPENFAST_EXECUTABLE - # - CTEST_[MODULE]_EXECUTABLE - cmake ../reg_tests - make install - ctest + # Execute the full test suite with 4 processes + ctest -j4 -- :ref:`regression_test_windows` +.. _example_python_driver: -Follow the link above for a detailed procedure. It is summarized below though -excluding the procedure to build OpenFAST itself. +Python driver with a given executable +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +This example assumes the user has a fully functional OpenFAST executable +available along with any necessary libraries, but does not have the source +code repository downloaded. This might be the case when executables are +distributed within an organization. Nothing will be compiled, but the +test suite will be executed with the included Python driver. + +.. code-block:: bash + + # Download the source code from GitHub + # Note: The default branch is 'master' + git clone --recursive https://github.com/openfast/openfast.git + cd openfast + # If necessary, switch to another target branch and update r-test + git checkout dev + git submodule update + + # Execute the Python driver + cd reg_tests + python manualRegressionTest.py -h + # usage: manualRegressionTest.py [-h] [-p [Plotting-Flag]] [-n [No-Execution]] + # [-v [Verbose-Flag]] [-case [Case-Name]] + # OpenFAST System-Name Compiler-Id Test-Tolerance + # + # Executes OpenFAST and a regression test for a single test case. + # + # positional arguments: + # OpenFAST path to the OpenFAST executable + # System-Name current system's name: [Darwin,Linux,Windows] + # Compiler-Id compiler's id: [Intel,GNU] + # Test-Tolerance tolerance defining pass or failure in the regression + # test + # + # optional arguments: + # -h, --help show this help message and exit + # -p [Plotting-Flag], -plot [Plotting-Flag] + # bool to include matplotlib plots in failed cases + # -n [No-Execution], -no-exec [No-Execution] + # bool to prevent execution of the test cases + # -v [Verbose-Flag], -verbose [Verbose-Flag] + # bool to include verbose system output + # -case [Case-Name] single case name to execute + + python manualRegressionTest.py ..\build\bin\openfast_x64_Double.exe Windows Intel 1e-5 + +Detailed example of running on Windows +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The example :ref:`example_python_driver` can be generally used for running the +regression tests on a Windows computer. However, a more detailed, step-by-step +description is given in :ref:`regression_test_windows`. + +.. toctree:: + :maxdepth: 1 + :hidden: + + regression_test_windows.rst From d80b839731b114d7512f3b2d26172a7ec2ceba50 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Wed, 2 Oct 2019 12:24:35 -0600 Subject: [PATCH 13/21] TravisCI: update macos image to 10.14 --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 79c99f28a9..c4f51bc19d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,10 +19,10 @@ matrix: dist: bionic env: FC=/usr/bin/gfortran-7; DOUBLE_PRECISION=ON; CPP_API=ON; CMAKE_FLAGS="-DBUILD_OPENFAST_CPP_API=$CPP_API" - os: osx - osx_image: xcode9.2 + osx_image: xcode11 env: FC=/usr/local/bin/gfortran-7; DOUBLE_PRECISION=ON - os: osx - osx_image: xcode9.2 + osx_image: xcode11 env: FC=/usr/local/bin/gfortran-7; DOUBLE_PRECISION=OFF # macos dependency install @@ -36,9 +36,6 @@ addons: update: true before_install: - # mac configuration - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew upgrade python; fi - # linux configuration - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install gfortran libblas-dev liblapack-dev; fi - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CPP_API" == "ON" ]]; then sudo apt-get install libopenmpi-dev libyaml-cpp-dev libhdf5-dev libxml2-dev; fi From a5a66310906d8d62bc5654e5f5c44045facb5a2f Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 29 Oct 2019 14:52:55 -0600 Subject: [PATCH 14/21] Add CygWin installation instructions as appendix --- docs/source/install/index.rst | 2 +- docs/source/install/install_cygwin.rst | 81 ++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 docs/source/install/install_cygwin.rst diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index f03e832aa6..cdcc925559 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -423,6 +423,6 @@ test or may be deprecated in the future. :maxdepth: 1 install_spack.rst + install_cygwin.rst .. TODO: Check the windows paths: math library command, installation location -.. TODO: Add cygwin? diff --git a/docs/source/install/install_cygwin.rst b/docs/source/install/install_cygwin.rst new file mode 100644 index 0000000000..a08d4f1052 --- /dev/null +++ b/docs/source/install/install_cygwin.rst @@ -0,0 +1,81 @@ +.. _install_cygwin: + +Building OpenFAST on Windows with CMake and Cygwin 64-bit +========================================================= +WARNING: This build process takes a significantly long amount of time. +If GNU tools are not required, it is recommended that Windows users see one +of the following sections: + +- :ref:`download_binaries` +- :ref:`cmake_windows` +- :ref:`install_vs_windows`. + +Installing prerequisites +------------------------ + +1. Download and install `Cygwin 64-bit `__. + You will need to ``Run as Administrator`` to complete the installation + process. + + - Choose ``Install from internet`` + - Choose the default install location + - Choose the default package download location + - Choose ``Direct connection`` + - Choose a download site + - See next step for ``select packages``. Alternately, you can skip this + step and run ``setup-x86_64.exe`` anytime later to select and install + required software. + +2. Select packages necessary for compiling ``OpenFAST``. Choose ``binary`` + packages and not the source option. + + - Choose ``Category`` view, we will be installing packages from + ``Devel`` and ``Math`` + - From ``Devel`` mark the following packages for installation + + - ``cmake`` + - ``cmake-doc`` + - ``cmake-gui`` + - ``cygwin-devel`` + - ``gcc-core`` + - ``gcc-fortran`` + - ``gcc-g++`` + - ``git`` + - ``make`` + - ``makedepend`` + + - From ``Math`` mark the following packages for installation + + - ``liblapack-devel`` + - ``libopenblas`` + + - To run the test suite, install these optional packages from ``Python``: + + - ``python3`` + - ``Python3-numpy`` + + - Click ``Next`` and accept all additional packages that the setup + process requests to install to satisfy dependencies + +3. It is *recommended* that you reboot the machine after installing + ``Cygwin`` and all the necessary packages. + +Compiling OpenFAST +------------------ +From here, pick up from the Linux with CMake instructions at +:ref:`cmake_unix`. + +Other tips +---------- +- If you would like to run ``openfast.exe`` from the ``cmd`` terminal, then you + must add the ``C:\cygwin64\lib\lapack`` and + ``C:\cygwin64\home\\software\bin`` to your ``%PATH%`` variable in + environment setting. Replace ```` with your account name on Windows + system. + +- It is suggested to compile with optimization level 2 for Cygwin. Do this by + changing the build mode in the cmake command + + .. code-block:: bash + + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo From 3fe03403a7034c342e5e85f2af3e3642ed44bcb7 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 29 Oct 2019 15:23:16 -0600 Subject: [PATCH 15/21] Move bolded nonsections to subsections --- docs/source/install/index.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index cdcc925559..bbebebce46 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -157,8 +157,8 @@ glue-code has its own ``CMakeLists.txt``; for example, AeroDyn and BeamDyn have one at ``openfast/modules/aerodyn/CMakeLists.txt`` and ``openfast/modules/beamdyn/CMakeLists.txt``, respectively. -**Running CMake** - +Running CMake ++++++++++++++ Running CMake and compiling will create many files (text files and binaries) used in the various stages of the build. For this reason, a ``build`` folder should be created to contain all of the generated files associated with the @@ -209,8 +209,8 @@ The command line curses interface can be invoked similarly: The interface will be rendered in the terminal window and all navigation happens through keyboard inputs. -**OpenFAST CMake options** - +OpenFAST CMake options +++++++++++++++++++++++ CMake has a large number of general configuration variables available. A good resource for useful CMake variables is at this link: `GitLab CMake variables `_. The `CMake API documentation `_ @@ -258,8 +258,9 @@ The commands above are equivalent to having run this command the first time: # Initial configuration in Debug mode with dynamic linking cmake .. -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON -**Setting the build tool** +Setting the build tool +++++++++++++++++++++++ CMake can target a variety of build tools or *generators*. To obtain a list of available generators on the current system, run with the empty generator flag, select the target from the list, and rerun with the generator flag @@ -296,8 +297,8 @@ populated: If the chosen generator name contains spaces, be sure to wrap it in quotes. -**Math libraries** - +Math libraries +++++++++++++++ The CMake project is configured to search for the required math libraries in default locations. However, if math libraries are not found, they can be specified directly to CMake. The two required libraries are ``BLAS`` From b46948717a670bfcdd838e8552ee1dc24f46fe58 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 29 Oct 2019 15:32:40 -0600 Subject: [PATCH 16/21] Describe some CMake options --- docs/source/install/index.rst | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index bbebebce46..aafcc2d485 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -258,6 +258,48 @@ The commands above are equivalent to having run this command the first time: # Initial configuration in Debug mode with dynamic linking cmake .. -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON +CMAKE_BUILD_TYPE +**************** +This option allows to set the compiler optimization level and debug +information. The value and its effect are listed in the table below. + +================== ================================================================================================================ + CMAKE_BUILD_TYPE Effect +================== ================================================================================================================ + Release ``-O3`` optimization level + RelWithDebInfo ``-O2`` optimization level with ``-g`` flag for debug info + MinSizeRel ``-O1`` optimization level + Debug No optimization and `-g` flag for debug info; additional debugging flags: ``-fcheck=all -pedantic -fbacktrace`` +================== ================================================================================================================ + +Use ``Debug`` during active development to add debug symbols for use with a +debugger. This build type also adds flags for generating runtime checks that +would otherwise result in undefined behavior. ``MinSizeRel`` adds basic +optimizations and targets a minimal size for the generated executable. The next +level, ``RelWithDebInfo``, enables vectorization and other more agressive +optimizations. It also adds debugging symbols and results in a larger +executable size. Finally, use ``Release`` for best performance at the cost +of increased compile time. + +This flag can be set with the following command: + +.. code-block:: bash + + cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo + +CMAKE_INSTALL_PREFIX +******************** +This flag sets the location of the compiled binaries when the build +tool runs the ``install`` command. It should be a full path in a carefully +chosen location. The binaries will be copied into ``include``, ``lib``, +and ``bin`` subfolders under the value of this flag. The default is to +install binaries within the repository in a folder called ``install``. + +This flag can be set with the following command: + +.. code-block:: bash + + cmake .. -DCMAKE_INSTALL_PREFIX="/usr/local/" Setting the build tool ++++++++++++++++++++++ From 4d0fea2b33918f56101cbff4ebd2053cb2d8961f Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Thu, 31 Oct 2019 21:31:27 -0600 Subject: [PATCH 17/21] Remove redundancies and update the intro --- docs/index.rst | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index fd3238b1eb..c4474e9749 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,19 +9,9 @@ OpenFAST Documentation :Version: |release| :Date: |today| -OpenFAST is an open-source wind turbine simulation tool established in 2017 -which builds on FAST v8 (see :ref:`fast_to_openfast`). It was -created with the goal of being a community model developed and used by research -laboratories, academia, and industry. It is managed by a dedicated team at the -National Renewable Energy Lab. Our objective is to ensure that OpenFAST is -sustainable software that is well tested and well documented. If you'd like -to contribute, see the :ref:`dev_guide` and any open GitHub issues with the -`Help Wanted `_ -tag. - OpenFAST is a multi-physics, multi-fidelity tool for simulating the coupled dynamic response of wind turbines. Practically speaking, OpenFAST is the -framework (or glue code) that couples computational modules for +framework (or "glue code") that couples computational modules for aerodynamics, hydrodynamics for offshore structures, control and electrical system (servo) dynamics, and structural dynamics to enable coupled nonlinear aero-hydro-servo-elastic simulation in the time domain. OpenFAST enables the @@ -31,16 +21,24 @@ teetering hub, upwind or downwind rotor, and lattice or tubular tower. The wind turbine can be modeled on land or offshore on fixed-bottom or floating substructures. -OpenFAST and its underlying modules are mostly written in Fortran (adhering to -the 2003 standard), but modules can be written in C/C++. OpenFAST was created -with the goal of being a community model, with developers and users from -research laboratories, academia, and industry. Our goal is also to ensure that -OpenFAST is sustainable software that is well tested and well documented. To -that end, we are continually improving the documentation and test coverage for -existing code, and we expect that new capabilities will include adequate -testing and documentation. +Established in 2017, OpenFAST is an open-source software package +that builds on FAST v8 (see :ref:`fast_to_openfast`). The glue code +and underlying modules are mostly written in Fortran +(adhering to the 2003 standard), and modules can also be written in C or +C++. It was created with the goal of being a community model developed +and used by research laboratories, academia, and industry. It is +managed by a dedicated team at the National Renewable Energy Lab. +Our objective is to ensure that OpenFAST is well tested, well +documented, and self-sustaining software. To that end, we are continually +improving the documentation and test coverage for existing code, and we +expect that new capabilities will include adequate testing and +documentation. If you'd like to contribute, see the +:ref:`dev_guide` and any open GitHub issues with the +`Help Wanted `_ +tag. -Here are some important links: +The following links provide more insight into OpenFAST as a software +package: - `OpenFAST Github Organization `_ - `Github Repository `_ From 8010e586c0a43c73a5e18c0487a02604d403931d Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Thu, 31 Oct 2019 22:06:17 -0600 Subject: [PATCH 18/21] Clean up and updates to the testing docs --- docs/source/testing/index.rst | 6 +- docs/source/testing/regression_test.rst | 108 ++++++++++++++---------- docs/source/testing/unit_test.rst | 4 +- 3 files changed, 70 insertions(+), 48 deletions(-) diff --git a/docs/source/testing/index.rst b/docs/source/testing/index.rst index 25b7a08d3d..ab1cfb87ab 100644 --- a/docs/source/testing/index.rst +++ b/docs/source/testing/index.rst @@ -3,8 +3,8 @@ Testing OpenFAST ================ -The OpenFAST test suite consists of system and module level regression tests -and unit tests. The regression test compares locally generated solutions to +The OpenFAST test suite consists of glue code and module level regression tests +and unit tests. The regression tests compare locally generated solutions to a set of baseline solutions. The unit tests ensure that individual subroutines are functioning as intended. @@ -27,7 +27,7 @@ Portions of the test suite are linked to the OpenFAST repository through a ``git submodule update --init --recursive`` after cloning. The test suite can be configured with CMake similar to OpenFAST. The default -CMake configuration is generally applicable, but may need customization +CMake configuration is suitable for most systems, but may need customization for particular build environments. See the :ref:`understanding_cmake` section for more details on configuring the CMake targets. While the unit tests must be built with CMake due to its external dependencies, the regression test diff --git a/docs/source/testing/regression_test.rst b/docs/source/testing/regression_test.rst index 33bca32f1f..57aab2c196 100644 --- a/docs/source/testing/regression_test.rst +++ b/docs/source/testing/regression_test.rst @@ -3,33 +3,40 @@ Regression test =============== The regression test executes a series of test cases which intend to fully -describe OpenFAST and its module's capabilities. Jump to :ref:`python_driver` -:ref:`ctest_driver`, :ref:`regression_test_example`, or -:ref:`regression_test_windows` for instructions on running the regression -tests. +describe OpenFAST and its module's capabilities. Jump to one of the following +sections for instructions on running the regression +tests: + +- :ref:`python_driver` +- :ref:`ctest_driver` +- :ref:`regression_test_example` +- :ref:`regression_test_windows` Each locally computed result is compared to a static set of baseline results. To account for system, hardware, and compiler differences, the regression test attempts to match the current machine and compiler type to the appropriate solution set from these combinations: -- macOS with GNU compiler (default) -- CentOS 7 with Intel compiler -- CentOS 7 with GNU compiler -- Windows with Intel compiler - -The compiler versions, specific math libraries, and hardware used to generate -the baseline solutions are documented in the +================== ========== ============================ + Operating System Compiler Hardware +================== ========== ============================ + **macOS** **GNU** **2017 MacbookPro** + CentOS 7 Intel NREL Eagle - Intel Skylake + CentOS 7 GNU NREL Eagle - Intel Skylake + Windows 10 Intel Dell Precision 3530 +================== ========== ============================ + +The compiler versions, specific math libraries, and more info on hardware used +to generate the baseline solutions are documented in the `r-test repository documentation `__. Currently, -the regression test supports only double precision solutions, so it is required -to build OpenFAST in double precision for testing. All baseline solutions are -generated with a double precision build. +the regression test supports only double precision builds. -The regression test system can be executed with CMake/CTest or manually with -an included Python driver. Both systems provide similar functionality with +The regression test system can be executed with CMake (through its included +test driver, CTest) or manually with +a custom Python driver. Both systems provide similar functionality with respect to testing, but CTest integration provides access to multithreading, automation, and test reporting via CDash. Both modes of execution require some -configuration as outlined below. +configuration as described in the following sections. In both modes of execution a directory is created in the build directory called ``reg_tests`` where all of the input files for the test cases are copied @@ -51,6 +58,8 @@ reported as failed. The failure criteria is outlined below. if max(norm) < tolerance: pass = True + else: + pass = False Dependencies ------------ @@ -68,8 +77,9 @@ Executing with Python driver The regression test can be executed manually with the included driver at ``openfast/reg_tests/manualRegressionTest.py``. This program reads a case list file at ``openfast/reg_tests/r-test/glue-codes/openfast/CaseList.md``. Cases -can be removed or ignored with a ``#``. This driver program includes multiple -optional flags which can be obtained by executing with the help option: +can be removed or ignored by starting that line with a ``#``. The driver +program includes multiple optional flags which can be obtained by +executing with the help option: :: @@ -137,10 +147,11 @@ be sure to execute the build command with the ``install`` target: .. code-block:: bash - # configure cmake + # Configure CMake with testing enabled and accept the default + # values for all other test-specific CMake variables cmake .. -DBUILD_TESTING=ON - # build and install + # Build and install make install .. note:: @@ -183,7 +194,7 @@ are: # Run the entire regression test with verbose output ctest -V - # Run a test by name where TestName is a regular expression (regex) + # Run tests by name where TestName is a regular expression (regex) ctest -R [TestName] # Run all tests with N tests executing in parallel @@ -206,7 +217,7 @@ command: # Filter the test cases corresponding to a particular label ctest -L [Label] -Flags can be compounded making useful variations of ``ctest`` such as +Flags can be compounded making useful variations such as .. code-block:: bash @@ -229,14 +240,17 @@ Flags can be compounded making useful variations of ``ctest`` such as The automated regression test writes new files only into the build directory. Specifically, all locally generated solutions are located in the corresponding glue-code or module within ``openfast/build/reg_tests``. The baseline solutions -contained in ``openfast/reg_tests/r-test`` are strictly read not modified by -the automated process. +contained in ``openfast/reg_tests/r-test`` are strictly read and are not +modified by the automated process. .. _regression_test_example: Regression test examples ------------------------ -The following examples illustrate methods of running the regression tests. +The following examples illustrate methods of running the regression tests +on Unix-based systems. However, similar procedures can be used +on Windows with CMake and CTest. An alternate method of running the +regression tests on Windows is given in :ref:`reg_test_windows`. Compile OpenFAST and execute with CTest ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -256,7 +270,7 @@ suite. git checkout dev git submodule update - # Create the build directory and move into it + # Create the build and install directories and move into build mkdir build install && cd build # Configure CMake for testing @@ -268,7 +282,7 @@ suite. # Compile and install make install - # Execute the full test suite with 4 processes + # Execute the full test suite with 4 concurrent processes ctest -j4 Configure with CMake and a given executable @@ -276,8 +290,10 @@ Configure with CMake and a given executable This example assumes the user has a fully functional OpenFAST executable available along with any necessary libraries, but does not have the source code repository downloaded. This might be the case when executables are -distributed within an organization. Here, nothing will be compiled, but the -test suite will be configured with CMake for use with the CTest command. +distributed within an organization or downloaded from an +`OpenFAST Release `__. +Here, nothing will be compiled, but the test suite will be configured +with CMake for use with the CTest command. .. code-block:: bash @@ -291,23 +307,21 @@ test suite will be configured with CMake for use with the CTest command. git submodule update # Create the build directory and move into it - mkdir build install && cd build + mkdir build && cd build - # Configure CMake with openfast/reg_tests/CMakeLists.txt - # - BUILD_TESTING - # - CTEST_OPENFAST_EXECUTABLE - # - CTEST_[MODULE]_EXECUTABLE - - # Configure CMake for testing + # Configure CMake with openfast/reg_tests/CMakeLists.txt for testing # - BUILD_TESTING - turn ON # - CTEST_OPENFAST_EXECUTABLE - provide a path # - CTEST_[MODULE]_EXECUTABLE - provide a path - cmake ../reg_tests -DBUILD_TESTING=ON -DCTEST_OPENFAST_EXECUTABLE=/home/user/Desktop/openfast_executable -DCTEST_BEAMDYN_EXECUTABLE=/home/user/Desktop/beamdyn_driver + cmake ../reg_tests \ + -DBUILD_TESTING=ON \ + -DCTEST_OPENFAST_EXECUTABLE=/home/user/Desktop/openfast_executable \ + -DCTEST_BEAMDYN_EXECUTABLE=/home/user/Desktop/beamdyn_driver # Install required files make install - # Execute the full test suite with 4 processes + # Execute the full test suite with 4 concurrent processes ctest -j4 .. _example_python_driver: @@ -317,8 +331,10 @@ Python driver with a given executable This example assumes the user has a fully functional OpenFAST executable available along with any necessary libraries, but does not have the source code repository downloaded. This might be the case when executables are -distributed within an organization. Nothing will be compiled, but the -test suite will be executed with the included Python driver. +distributed within an organization or downloaded from an +`OpenFAST Release `__. +Nothing will be compiled, but the test suite will be executed with the +included Python driver. .. code-block:: bash @@ -357,11 +373,17 @@ test suite will be executed with the included Python driver. # bool to include verbose system output # -case [Case-Name] single case name to execute - python manualRegressionTest.py ..\build\bin\openfast_x64_Double.exe Windows Intel 1e-5 + python manualRegressionTest.py \ + ..\build\bin\openfast_x64_Double.exe \ + Windows \ + Intel \ + 1e-5 + +.. _reg_test_windows: Detailed example of running on Windows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The example :ref:`example_python_driver` can be generally used for running the +The :ref:`example_python_driver` example can be used for running the regression tests on a Windows computer. However, a more detailed, step-by-step description is given in :ref:`regression_test_windows`. diff --git a/docs/source/testing/unit_test.rst b/docs/source/testing/unit_test.rst index 6c6e439774..1ccfafcd3b 100644 --- a/docs/source/testing/unit_test.rst +++ b/docs/source/testing/unit_test.rst @@ -29,8 +29,8 @@ Compiling --------- Compiling the unit tests is handled with CMake similar to compiling OpenFAST in general. After configuring CMake with ``BUILD_TESTING`` turned on, new -``make`` targets are created for each module included in the unit test -framework named ``[module]_utest``. Then, simply ``make`` the target to test +build targets are created for each module included in the unit test +framework named ``[module]_utest``. Then, ``make`` the target to test: .. code-block:: bash From e375dbce2e25b9ad2a25ce51afc82959272da443 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 1 Nov 2019 13:37:39 -0500 Subject: [PATCH 19/21] Update CMake flags and minor formatting fixes Mostly converts lists to tables --- docs/source/install/index.rst | 82 ++++++++++++++++------------------- 1 file changed, 37 insertions(+), 45 deletions(-) diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index aafcc2d485..2d39683d3f 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -12,7 +12,7 @@ maintained paths for obtaining an OpenFAST executable. For Windows users only, precompiled binaries are available as described in the :ref:`download_binaries` section. For all platforms, OpenFAST is configured to build with with CMake and a system-appropriate build tool. Background -on CMake is given in :ref:`understanding_cmake` and procedures for configuring +on CMake is given in :ref:`understanding_cmake`, and procedures for configuring and compiling are given in :ref:`cmake_unix` and :ref:`cmake_windows`. Finally, an alternative and more appropriate option for compiling on Windows while doing active software development is given in :ref:`vs_windows`. @@ -42,7 +42,7 @@ approach that uses CMake to generate build files for all platforms. Currently, CMake support for Visual Studio while doing active development is not well supported, so OpenFAST maintains a Visual Studio solution giving Windows developers a better option for developing code, compiling -and debugging in a streamlined manner. See :ref:`installation_appendix` +and debugging in a streamlined manner. See :ref:`vs_windows` for more information. Dependencies @@ -58,22 +58,18 @@ of the OpenFAST build system can find the dependencies. Build tools +++++++++++ -An environment-specific build system is required and may consist of a -combination of the following packages: +An environment-specific build system is required and will consist of a +combination of the packages listed in the table below. -- `CMake `__ - minimum version 3.0 -- `GNU Make `__ -- `Visual Studio `__ - minimum version 2015 -- `Intel Parallel Studio `__ - minimum version 2013 -- Fortran compiler - - - `GNU Fortran (gfortran) `__ - - `Intel Fortran (ifort) `__ - -- C and C++ compiler - - - `GNU Compiler Collection (gcc) `__ - - `Intel C/C++ (icc/icpp) `__ +============================================== ==================== ================= ======= + Package Applicable systems Minimum version Link +============================================== ==================== ================= ======= + CMake All 3.0 https://cmake.org + GNU Make macOS, Linux 1.8 https://www.gnu.org/software/make/ + Visual Studio Windows 2015 https://visualstudio.microsoft.com> + GNU Compiler Collection (gfortran, gcc, g++) macOS, Linux 4.6.0 https://gcc.gnu.org + Intel Parallel Studio (ifort, icc) All 2013 https://software.intel.com/en-us/parallel-studio-xe/ +============================================== ==================== ================= ======= Math libraries ++++++++++++++ @@ -81,20 +77,17 @@ Math libraries Math libraries with the BLAS and LAPACK interfaces are also required. These can be obtained as free, open source libraries or paid, closed source versions. Some packages contain separate libraries for each interface while others have -the interfaces bundles into a single binary. The most common options are: - -- NetLib - - - `BLAS `__ - - `LAPACK `__ - -- OpenBLAS - - - `BLAS/LAPACK `__ - -- Intel MKL - - - `BLAS/LAPACK `__ +the interfaces bundles into a single binary. The most common options are listed +in the table below. + +============ ============ =========== ============== ====== +Library Maintainer Paid/Free Open Source? Link +============ ============ =========== ============== ====== +BLAS NetLib Free Yes http://www.netlib.org/blas/ +LAPACK NetLib Free Yes http://www.netlib.org/lapack/ +BLAS/LAPACK OpenBLAS Free Yes https://www.openblas.net +MKL Intel Paid No https://software.intel.com/en-us/mkl +============ ============ =========== ============== ====== Dependencies for the test suite +++++++++++++++++++++++++++++++ @@ -151,15 +144,15 @@ tool like GNU Make, Visual Studio, or Ninja. CMake does not compile code or run compilers directly, but rather creates the environment needed for another tool to run compilers and create binaries. A CMake project is described by a series of files called -``CMakeLists.txt`` located in various directories. The main CMake file for -OpenFAST is located at ``openfast/CMakeLists.txt`` and each module and -glue-code has its own ``CMakeLists.txt``; for example, AeroDyn and BeamDyn -have one at ``openfast/modules/aerodyn/CMakeLists.txt`` and +``CMakeLists.txt`` located in directories throughout the project. The main +CMake file for OpenFAST is located at ``openfast/CMakeLists.txt`` and each +module and glue-code has its own ``CMakeLists.txt``; for example, AeroDyn +and BeamDyn have one at ``openfast/modules/aerodyn/CMakeLists.txt`` and ``openfast/modules/beamdyn/CMakeLists.txt``, respectively. Running CMake +++++++++++++ -Running CMake and compiling will create many files (text files and binaries) +Running CMake and a build tool will create many files (text files and binaries) used in the various stages of the build. For this reason, a ``build`` folder should be created to contain all of the generated files associated with the build process. Here, an important file called ``CMakeCache.txt`` contains the @@ -224,6 +217,7 @@ The CMake options specific to OpenFAST and their default settings are: BUILD_DOCUMENTATION - Build documentation (Default: OFF) BUILD_OPENFAST_CPP_API - Enable building OpenFAST - C++ API (Default: OFF) + BUILD_OPENFAST_SIMULINK_API - Enable building OpenFAST for use with Simulink BUILD_SHARED_LIBS - Enable building shared libraries (Default: OFF) BUILD_TESTING - Build the testing tree (Default: OFF) CMAKE_BUILD_TYPE - Choose the build type: Debug Release (Default: Release) @@ -231,6 +225,7 @@ The CMake options specific to OpenFAST and their default settings are: CMAKE_INSTALL_PREFIX - Install path prefix, prepended onto install directories. DOUBLE_PRECISION - Treat REAL as double precision (Default: ON) FPE_TRAP_ENABLED - Enable Floating Point Exception (FPE) trap in compiler options (Default: OFF) + GENERATE_TYPES - Use the openfast-regsitry to autogenerate types modules ORCA_DLL_LOAD - Enable OrcaFlex library load (Default: OFF) USE_DLL_INTERFACE - Enable runtime loading of dynamic libraries (Default: ON) @@ -364,7 +359,7 @@ Mac systems, so the default settings should work as given. These settings should only be changed when a custom build is required. The procedure for configuring CMake and compiling with GNU Make on Linux -and Mac systems is given below. +and macOS systems is given below. .. code-block:: bash @@ -445,15 +440,12 @@ Studio build type (Release, Debug, or RelWithDebInfo) in OpenFAST executable will be located at ``openfast/build/glue-codes/Release/openfast.exe`` when compiling in *Release* mode. -**The CMake-generated Visual Studio build is currently damaged.** Some modules -are compiled before their associated OpenFAST Registry type-files are seen by -Visual Studio so an initial build may fail. However, a simple work around is -to run the build command in Visual Studio multiple times until it succeeds. -Futher, any configurations made to the Solution in the Visual Studio UI will be +**The CMake-generated Visual Studio build is not currently fully functional.** +Any configurations made to the Solution in the Visual Studio UI will be lost when CMake is executed, and this can happen whenever a change is made to -the structure of the file system. It is recommended that this method **not** be -used for debugging or active development on Windows. Instead, see -:ref:`vs_windows`. +the structure of the file system or if the CMake configuration is changed. It +is recommended that this method **not** be used for debugging or active +development on Windows. Instead, see :ref:`vs_windows`. .. _installation_appendix: From aec53f5d5d9e089eddda9e3a0dd143f9cad1b6e9 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 1 Nov 2019 13:50:57 -0500 Subject: [PATCH 20/21] Clean up in the developer docs --- docs/source/dev/build_doc.rst | 4 +--- docs/source/dev/code_style.rst | 2 +- docs/source/dev/index.rst | 22 +++++++++++----------- docs/source/dev/versioning.rst | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/docs/source/dev/build_doc.rst b/docs/source/dev/build_doc.rst index d8639cd751..c906cb558b 100644 --- a/docs/source/dev/build_doc.rst +++ b/docs/source/dev/build_doc.rst @@ -93,6 +93,4 @@ The table below lists make-targets related to the documentation. Adding documentation -------------------- -Coming soon. - -Feel like contributing? Start here! +Coming soon. Feel like contributing? Start here! diff --git a/docs/source/dev/code_style.rst b/docs/source/dev/code_style.rst index 2645df9094..eac515713b 100644 --- a/docs/source/dev/code_style.rst +++ b/docs/source/dev/code_style.rst @@ -10,6 +10,6 @@ FAST Framework and adding code to OpenFAST. Generally, code should be written such that it is straightforward to read. Syntactic sugar or brevity should not detract from readability. The exception -to this is in situations where performance dictates a poorly readable code. +to this is in situations where performance requires poorly readable code. Here, comment blocks should be used to describe what is not readily apparent in the code. Indentation is typically three spaces and no tabs. diff --git a/docs/source/dev/index.rst b/docs/source/dev/index.rst index 5deb3b21f1..2725408ae7 100644 --- a/docs/source/dev/index.rst +++ b/docs/source/dev/index.rst @@ -3,8 +3,8 @@ Developer Documentation ======================= -**Our goal as developers is to ensure that OpenFAST is a sustainable open -source software that is well tested and well documented.** To that end, we +**Our goal as developers of OpenFAST is to ensure that it is well tested, well +documented, and self-sustaining software.** To that end, we continually work to improve the documentation and test coverage along with feature additions and improvements. This section of the documentation outlines the processes and procedures we have established for external developers @@ -21,7 +21,7 @@ Finally, be sure to review the :doc:`GitHub workflow ` to avoid any merge or code conflicts. With development happening in parallel between NREL, industry partners, and -universities, NREL relies on these GitHub tools to coordinate efforts: +universities, NREL relies on GitHub to coordinate efforts: - `GitHub Issues `_ is the place to ask usage or development questions, report bugs, and @@ -46,9 +46,9 @@ For other questions regarding OpenFAST, please contact API Reference ~~~~~~~~~~~~~ Some subroutines and derived types throughout the source code have in-source -documentation which is compiled with Doxygen. This portion of the documentation -is always under development, but the existing API reference can be found in the -following pages: +documentation which is compiled with Doxygen. Though this portion of the +documentation is always under development, the existing API reference can +be found in the following pages: - `Main Page <../../html/index.html>`_ - `Index of Types <../../html/classes.html>`_ @@ -67,15 +67,15 @@ expect that new capabilities will include adequate testing and documentation. We have the following guidance for developers: - When fixing a bug, first introduce a unit test that exposes the bug, fix the - bug, and submit a Pull Request. See :numref:`testing` and - :numref:`github_workflow` for information on testing and the GitHub workflow. + bug, and submit a Pull Request. See :ref:`testing` and + :ref:`github_workflow` for more information. - When adding a new feature, create appropriate automated unit and regression - tests as described in :numref:`testing`. The objective is to create a GitHub - pull request that provides adequate verification and validation such that the + tests as described in :ref:`testing`. The objective is to create a GitHub + pull request that provides adequate verification and validation so that the NREL OpenFAST developer team can merge the pull request with confidence that the new feature is "correct" and supports our goal of self-sustaining - software. See :numref:`pull_requests` for detailed information on submitting + software. See :ref:`pull_requests` for more information on submitting a pull request. - If a code modification affects regression test results in an expected manner, diff --git a/docs/source/dev/versioning.rst b/docs/source/dev/versioning.rst index e8d3caf1c6..8f742f1962 100644 --- a/docs/source/dev/versioning.rst +++ b/docs/source/dev/versioning.rst @@ -16,7 +16,7 @@ For example, ``OpenFAST-v1.0.0-123-gabcd1234-dirty`` describes OpenFAST as: Version Component Explanation =================== ============= v1.0.0 MAJOR.MINOR.PATCH numbering system; corresponds to a tagged commit made by NREL on GitHub - 123-g Number of additional commits after the most recent tag for a build [the ``-g`` is for ``git``] + 123-g Number of additional commits after the most recent tag for a build (the ``-g`` is for ``git``) abcd1234 First 8 characters of the current commit hash dirty Denotes that local changes have been made but not committed; omitted if there are no local changes =================== ============= From 3656f8e7c279dd12cce59a7ed021802a22c8ae0f Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Fri, 1 Nov 2019 13:55:56 -0500 Subject: [PATCH 21/21] Change references to Mac to macOS --- docs/source/dev/debugging.rst | 12 ++++++------ docs/source/install/index.rst | 8 ++++---- docs/source/install/install_spack.rst | 2 +- docs/source/user/fast_to_openfast.rst | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/source/dev/debugging.rst b/docs/source/dev/debugging.rst index d8099da353..807c726749 100644 --- a/docs/source/dev/debugging.rst +++ b/docs/source/dev/debugging.rst @@ -31,8 +31,8 @@ proceed to :ref:`debugging_linux`. .. _debugging_linux: -Debugging on Linux and Mac --------------------------- +Debugging on Linux and macOS +---------------------------- First, compile OpenFAST in debug mode by setting ``CMAKE_BUILD_TYPE`` to "Debug". This can be done on the command line with: @@ -68,9 +68,9 @@ open the launch configuration and add a block similar to this: "arguments": "${workspaceRoot}/build/reg_tests/glue-codes/openfast/AOC_WSt/AOC_WSt.fst", } -Mac-specific configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~ -GDB on Mac needs some configuration before the system allows it to take +macOS-specific configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +GDB on macOS needs some configuration before the system allows it to take over a process. It is recommended that ``gdb`` be installed with homebrew .. code-block:: bash @@ -93,7 +93,7 @@ For ``gdb 8.2.1``, it looks like this: echo "set startup-with-shell off" >> ~/.gdbinit -For Native Debug on Mac, you have to sort of hack the extension to allow +For Native Debug on macOS, you have to sort of hack the extension to allow breakpoints in fortran files by adding this line to ``.vscode/settings.json``: .. code-block:: json diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index 2d39683d3f..9c42a658b7 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -169,7 +169,7 @@ CMake can be executed in a few ways: The CMake GUI is only distributed for Windows, but it can be built from source for other platforms. OpenFAST's build process focuses on the command line -execution of CMake for both the Linux/Mac and Windows terminals. The command +execution of CMake for both the Linux/macOS and Windows terminals. The command line syntax to run CMake for OpenFAST is generally: .. code-block:: bash @@ -351,11 +351,11 @@ not to the libraries themselves. .. _cmake_unix: -CMake with Make for Linux/Mac ------------------------------ +CMake with Make for Linux/macOS +------------------------------- After reading :ref:`understanding_cmake`, proceed with configuring OpenFAST. The CMake project is well developed for Linux and -Mac systems, so the default settings should work as given. These settings +macOS systems, so the default settings should work as given. These settings should only be changed when a custom build is required. The procedure for configuring CMake and compiling with GNU Make on Linux diff --git a/docs/source/install/install_spack.rst b/docs/source/install/install_spack.rst index bec6bf806a..bc5d3091f4 100644 --- a/docs/source/install/install_spack.rst +++ b/docs/source/install/install_spack.rst @@ -23,7 +23,7 @@ Building OpenFAST Semi-Automatically Using Spack on macOS or Linux ------------------------------------------------------------------ The following describes how to build OpenFAST and its dependencies -mostly automatically on your Mac using +mostly automatically on macOS using `Spack `_. This can also be used as a template to build OpenFAST on any Linux system with Spack. diff --git a/docs/source/user/fast_to_openfast.rst b/docs/source/user/fast_to_openfast.rst index fb49d20d8d..9f84b18b32 100644 --- a/docs/source/user/fast_to_openfast.rst +++ b/docs/source/user/fast_to_openfast.rst @@ -48,7 +48,7 @@ OpenFAST includes the following organizational changes relative to FAST v8.16: * An online documentation system has been established to replace existing documentation of FAST v8: http://openfast.readthedocs.io/; during the transition to OpenFAST, most user-related documentation is still provided through the NWTC Information Portal, https://nwtc.nrel.gov -* Cross platform compiling is accomplished with CMake on Mac, Linux, and Cygwin (Windows) systems +* Cross platform compiling is accomplished with CMake on macOS, Linux, and Cygwin (Windows) systems * Visual Studio Projects (VS-Build) are provided for compiling OpenFAST on Windows (starting from OpenFAST v1.0.0), but the development team is working to automate the generation of Visual Studio build files via CMake in a future release @@ -73,7 +73,7 @@ Algorithmically, OpenFAST v0.1.0 is the release most closely related to FAST v8. * The OpenFAST glue codes, modules, module drivers, and compiling tools are contained within a single repository: https://github.com/openfast/openfast - * Cross platform compiling is accomplished with CMake on Mac, Linux, and Cygwin (Windows) systems + * Cross platform compiling is accomplished with CMake on macOS, Linux, and Cygwin (Windows) systems * An online documentation system has been established to replace existing documentation of FAST v8: http://openfast.readthedocs.io/ @@ -123,7 +123,7 @@ v1.0.0 (September 2017) * The online documentation (http://openfast.readthedocs.io/en/latest/index.html) has been extensively updated with additions for installation, testing, user (AeroDyn BeamDyn, transition from FAST v8, release notes), and developer guides, etc - * The scripts for compiling OpenFAST using CMake on Mac, Linux, and Cygwin (Windows) systems have been updated, including the ability to compile in single precision and building with Spack + * The scripts for compiling OpenFAST using CMake on macOS, Linux, and Cygwin (Windows) systems have been updated, including the ability to compile in single precision and building with Spack * Visual Studio Projects (VS-Build) are provided for compiling OpenFAST on Windows