diff --git a/doc/.gitignore b/doc/.gitignore index 5c6615501..360e6a803 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,9 +1,18 @@ build/ -output/ -node_modules/ config.yaml -erb-out.txt -documentation-coverage-report.txt -package-lock.json +*.egg*/ +.doit.* +.pytest_cache/ +.vscode/ +.venv/ +__pycache__/ +dist/ +**/probe-definitions/*.md +!**/probe-definitions/index.md + +probes.txt +cullist.txt + +.DS_Store \ No newline at end of file diff --git a/doc/.pylintrc b/doc/.pylintrc new file mode 100644 index 000000000..12335f318 --- /dev/null +++ b/doc/.pylintrc @@ -0,0 +1,585 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) +extension-pkg-whitelist= + +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold to be exceeded before program exits with error. +fail-under=10.0 + +# Files or directories to be skipped. They should be base names, not paths. +ignore=CVS + +# Add files or directories matching the regex patterns to the ignore-list. The +# regex matches against paths and can be in Posix or Windows format. +ignore-paths= + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. The default value ignores emacs file +# locks +ignore-patterns=^\.# + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.10 + +# Discover python modules and packages in the file system subtree. +recursive=no + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + + +[LOGGING] + +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the 'python-enchant' package. +spelling-dict= + +# List of comma separated words that should be considered directives if they +# appear and the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + +# Regular expression of note tags to take in consideration. +#notes-rgx= + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# class is considered mixin if its name matches the mixin-class-rgx option. +ignore-mixin-members=yes + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# Regex pattern to define which classes are considered mixins ignore-mixin- +# members is set to 'yes' +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of names allowed to shadow builtins +allowed-redefined-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=120 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[SIMILARITIES] + +# Comments are removed from the similarity computation +ignore-comments=yes + +# Docstrings are removed from the similarity computation +ignore-docstrings=yes + +# Imports are removed from the similarity computation +ignore-imports=no + +# Signatures are removed from the similarity computation +ignore-signatures=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. +check-str-concat-over-line-jumps=no + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. If left empty, argument names will be checked with the set +# naming style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. +#class-attribute-rgx= + +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. If left empty, class names will be checked with the set naming style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. If left empty, function names will be checked with the set +# naming style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _ + +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. If left empty, method names will be checked with the set naming style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. If left empty, module names will be checked with the set naming style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. If left empty, variable names will be checked with the set +# naming style. +variable-rgx=[a-z] # Allow single-letter variables (useful in list comprehensions, exception propagation, etc.) + + +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "BaseException, Exception". +overgeneral-exceptions=BaseException, + Exception diff --git a/doc/README.md b/doc/README.md index 6e1bd2f14..2b5bf2828 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,158 +1,72 @@ -# CSE User Manual Build Scripts +# CSE User Manual -The files in this folder are concerned with building the documentation and website for CSE; specifically, the CSE User Manual. The build process heavily leverages the [Ruby] programming language, the [Pandoc] documentation processing tool, and, [Node.js] for doing compression of html/css. The majority of the build process is contained in the `rakefile.rb` located in this directory with supporting code in the `lib` subdirectory. The "source code" for the documentation is written in [Pandoc-flavored Markdown] with the manifest of files located in [YAML] files, both in the `src` directory. Additional support files are located in the `config` directory. The `test` directory is test code specifically for the documentation build system -- it can be run using `rake test` from the command line. +The files in this folder are concerned with building the documentation and website for CSE; specifically, the CSE User Manual. The documentation is built using Material for MkDocs, a popular theme for MkDocs, which is built with Python. -The source files including both manifest files (in YAML) and markdown files (ending with a `.md` extension) are preprocessed by "embedded Ruby" or [ERB] prior to running through the rest of the documentation build pipeline. +## uv and Python environment -[Pandoc-flavored Markdown]: http://pandoc.org/MANUAL.html#pandocs-markdown -[YAML]: http://yaml.org/ -[ERB]: http://ruby-doc.org/stdlib-2.3.1/libdoc/erb/rdoc/ERB.html +This project uses [uv](https://docs.astral.sh/uv/) to manage dependencies and python environments. -## Dependencies for Website Generation +See the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/) to get set up with uv. There are many options for installing uv, including pip/pipx, Homebrew, WinGet, and more. -- the [Pandoc] markup language converter (use Pandoc version 1.17.2; other versions are not supported) -- (optional) for PDF output, you will need to install a LaTeX system (see below) -- (optional) for compression of HTML/CSS, a recent version of [Node.js] -- a recent version of the [Ruby] programming language (use any Ruby NOT at end-of-life, currently Ruby 2.4+) -- (optional) an internet connection (for installing node dependencies) -- the git version control manager (we are using 2.10.2) -- Microsoft C++ Build Tools (for Visual Studio 2017 or 2019) +## MkDocs CLI -Pandoc version 1.17.2 can be downloaded from [here](https://github.com/jgm/pandoc/releases). If you do not have version 1.17.2 installed, the build tool will stop immediately with instructions on how to install Pandoc 1.17.2. +MkDocs handles most of the functions that are required for developing and building the documentation. See the official [MkDocs documentation](https://www.mkdocs.org/user-guide/cli) for more detail on possible options/configuration when using the MkDocs CLI. -One way to make it easier to set up Pandoc 1.17.2 (especially in the presence of potentially a newer Pandoc version), is to use the cross-platform [conda] package, dependency, and environment manager. To do this, install the [miniconda] tool and then create an environment called `cse-docs`: +One option to highlight is the `-f` argument, which allows running MkDocs using the config specified in a location other than the current directory. - # this only needs to be done once: - conda create --name cse-docs - # on windows: activate cse-docs - # on mac/linux: source activate cse-docs - conda install -c edurand pandoc=1.17.2 +From `cse/doc/src`: -This will install a managed [Pandoc] 1.17.2 on your computer. You can activate the [conda] environment and, therefore, the [Pandoc] version that comes with it by calling: + > uv run mkdocs serve - # this needs to be done each time you want to activate Pandoc - source activate cse-docs +From `cse`: -[conda]: https://conda.io/docs/ -[miniconda]: https://conda.io/miniconda.html + > uv run mkdocs serve -f doc/src/mkdocs.yml -For PDF generation, Pandoc creates LaTeX which is further processed to PDF. For Windows, [MiKTeX] is recommended. For Mac OS and Linux, please follow the instructions for recommended (La)TeX systems at [Pandoc's Install] page. Note that to build the PDF, you must change the value of the "build-pdf?" key to true in the `config.yaml` file in this directory. This configuration file is discussed more below. -[Pandoc]: http://pandoc.org/ -[Ruby]: https://www.ruby-lang.org/en/ -[Node.js]: https://nodejs.org/en/ -[MiKTeX]: https://miktex.org/ -[Pandoc's Install]: http://pandoc.org/installing.html -With the above installed, the scripts in this directory should be able to download and install all other dependencies. +## Developing the Docs -The specific dependencies for [Node.js] are listed in the `package.json` file. +MkDocs includes a dev server which can be helpful during development. -With regard to the Microsoft Build Tools, the C++ preprocessor is required in the full build process to parse parameter names from the CSE source code. -This is accomplished with the `cl` program. -If you type `where cl` at your prompt and get a valid path, then `cl` is installed and reachable. -If not, the best way to get this is to set up your Visual Studio with C++ tools (you should have this if you are able to build CSE). -Then, to get a shell with `cl` and other tools on the path, go to `Start > Visual Studio 20XX > Developer Command Prompt for VS XX`. -You should have access to `cl` from that prompt. -If not, please check this [cl] article from Microsoft. + > uv run mkdocs serve -[cl]: https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=vs-2019 +The dev serve includes a file watcher, so the docs will be rebuilt when changes are saved. -## Instructions for Building the Documentation +To have MkDocs only rebuild dirty files, use the `--dirty` flag. WARNING: While the build process can be significantly faster, there are certain limitations to be aware of: +- Links and navigation headings may not work correctly. +- Content shared using the `{% include shared/file.md %}` directive might not trigger a rebuild and/or changes might not be reflected in the new build. -Using [Node.js] enables us to compress the HTML and CSS for the website. It is an optional dependency but recommended if you plan to push to the live `gh-pages` branch. The [Node.js] dependencies are off by default: in order to use [Node.js], create a local `config.yaml` file in `doc/config.yaml` with the value of `use-node?:` as `true`: - use-node?: true +## Building the Docs -Your primary interaction with the build system will be through the [Rake] build tool (from the [Ruby] programming folks). [Rake] is a "make for Ruby". +To build the documentation, use -[Rake]: https://github.com/ruby/rake + > uv run mkdocs build -[Rake] comes installed with most [Ruby] installers. To see the build commands available, (after [Ruby] has been installed), type: - > rake -T +## Inserting (Shared) File Content -from this directory to see a list of commands. +To include external files within a page, use the include directive: -The default command is `build` which can be invoked either by: + {% include 'enduses.md' %} - > rake build - -or, since it is the default command: - - > rake - -## The Configuration File - -Configuration parameters can be used to change how the documentation builds. The config defaults are located in `doc/config/defaults.yaml`. If a file named `doc/config.yaml` is placed in the `doc` directory, it will override the corresponding value in the defaults.yaml file. By default, the `doc/config.yaml` file is ignored by the version control system (see `doc/.gitignore`) allowing developers to customize the build process for their needs. The `doc/config/defaults.yaml` file is written in [YAML] format and is heavily documented with comments to help clarify the role of each parameter. - -A typical `doc/config.yaml` file for a developer planning to build the documentation for [GitHub Pages] would be as follows: - - use-node?: true - build-pdf?: true - context: - build_all: true - -Note in particular that the "context" attribute contains a dictionary (i.e., map or hash table) of values to define and pass into the embedded ruby ([ERB]) preprocessor. These attributes must be lower-case as discussed below. - -## Preprocessing files with Embedded Ruby - -Embedded Ruby or [ERB] is a technology originally developed for making web pages server-side "on the fly". Instead of a program consisting primarily of code with surrounding comments, [ERB] flips things around to where a file is string content with programming constructs embedded inside of it. This can be used for simple calculations and also for conditional inclusion of code: - - <% if dev_build %> - # Experimental Stuff - - lorem ipsum dolar ... - <% end %> - - # Stable stuff - - blah blah - -In the above code, assuming that the variable `dev_build` was defined, this snippet of [ERB] would include the "Experimental Stuff" section depending on whether the value was `true` (yes, include) or `false` (skip). You can define variable flags such as `dev_build` by adding a "context" section to your local `config.yaml` file. For example, a local user's `config.yaml` file for the above snippet might look as follows: - - build-pdf?: true - context: - dev_build: true - -**Note**: due to limitations with Ruby, your context variables need to start with either a lowercase letter or an underscore ("_"). A great way to test that ERB is doing the right thing for you is to use the `rake erb` task: - - set FILE=path\to\file.md & rake erb - -or, if you happen to be on a Unix, GNU/Linux, or Mac OS computer: - - rake erb FILE=path/to/file.md - -This will preprocess the file using [ERB] and write the results to `doc/erb-out.txt` for your perusal using the context variables you've defined in your local `doc/config.yaml` (which are merged with the context variables defined in `doc/config/defaults.yaml` -- your local context variables override the defaults). - -We recommend looking at an [ERB Tutorial] to get up to speed on using [ERB]. - -[ERB Tutorial]: http://www.stuartellis.name/articles/erb/ - -## Inserting File Content - -A special directive is available that allows one to insert any file directly into markdown documents (to avoid repetition) by specifying the file's relative path from the repository root. For example, to add the file: `\doc\src\enduses.md`, one would write: - - <%= insert_file('doc/src/enduses.md') %> - -Note: the `insert_file` method could be replaced by a direct call to `File.read(path_to_read)`. However, direct calls to `File.read` are fragile since the absolute paths won't build between multiple machines and the question with relative paths is what directory will be used. In contrast, the `insert_file` method always uses a path relative to the repository root. - -## Table Pre-processing Directives - -By setting the config variable "use-table-lang?" to `true` (note: it is `true` by default), we enable [ERB] to use a table pre-processing language. At the time of this writing, these table directives are used to transform imbedded CSV data (CSV = comma-separated value), in-file CSV data, or special tables to the "ascii-art" multi-line tables required by [Pandoc-flavored Markdown]. For general tables, external CSV files can be used (recommended). In this case, the source files may be edited with a spreadsheet program and saved to disk (in CSV format). By default, tables are stored in the directory relative to the `doc` directory as specified by the "table-path" variable specified in the `doc/config/defaults.yaml` file. At the time of this writing, that variable defaults to `doc/src/tables`. +## Tables The three table directives and their options and syntax are shown below: -### member\_table -- special syntax for Record Member Tables +### member_table -The `member_table` has the following syntax: +The `member_table` uses the following syntax: - <%= member_table( - units: "1/^o^F", - legal_range: "no restrictions", - default: "-0.0026", - required: "No", - variability: "constant") %> + {{ + member_table({ + "units": "1/^o^F", + "legal_range": "no restrictions", + "default": "-0.0026", + "required": "No", + "variability": "constant" + }) + }} This writes a Markdown table similar to the following: @@ -164,235 +78,62 @@ This writes a Markdown table similar to the following: restrictions --------------------------------------------------------------- -The arguments to `member_table` are a [Ruby] hash (also called a hash-table, dictionary, or map). An alternate valid [Ruby] syntax for the same thing is: - - <%= member_table( - :units => "1/^o^F", - :legal_range => "no restrictions", - :default => "-0.0026", - :required => "No", - :variability => "constant") %> - -or alternately to be very explicit (note the curly brackets `{` and `}` below): - - <%= member_table({ - :units => "1/^o^F", - :legal_range => "no restrictions", - :default => "-0.0026", - :required => "No", - :variability => "constant"}) %> - -In the call to `member_table`, each of the keys is checked for correct spelling. Keys that are elided are replaced with `--`, the markdown symbol for "--". - -### csv\_table -- inline csv tables - -CSV tables provide an alternate syntax for describing a multi-line table. Cell contents should be written in [Pandoc-flavored Markdown] to indicate boldness, links, etc. - -A simple CSV Table appears below: - - <%= csv_table(< false) - A,B,C - 1,2,3 - END - %> - -Here, we use [Ruby] syntax for ["here docs"](http://blog.jayfields.com/2006/12/ruby-multiline-strings-here-doc-or.html). Essentially, the CSV string gets escaped and placed where `< true) - A,B,C - 1,2,3 - END - %> - -... we get: - - -------------------------------------------------------------------- - A B C - ---------------------- ---------------------- ---------------------- - 1 2 3 - -------------------------------------------------------------------- - -But what if we want to use a comma (",") in our strings? In this case, we must quote (i.e., surround with `"`) all of our cells. But what if we want to use a literal `"`? Then we double up the `"` character. See this example: - - <%= csv_table(< true) - "Property","Value" - "*Units*","units of measure (lb., ft, Btu, etc.) where applicable" - "*Legal*","limits of valid range for numeric inputs; valid ""choices""" - END - %> - -This yields: - - -------------------------------------------------------------------- - Property Value - -------------- ----------------------------------------------------- - *Units* units of measure (lb., ft, Btu, etc.) where - applicable - - *Legal* limits of valid range for numeric inputs; valid - "choices" - -------------------------------------------------------------------- - -So, all in all, it is relatively straight-forward to embed a csv table inline with the markdown. However, we recommend using the next directive for handling CSV tables: `csv_table_from_file` - -### csv\_table\_from\_file - -This last directive loads a CSV file from the file system and processes it into a multi-line Markdown table per [Pandoc-flavored Markdown]. - -An example of calling this directive lies below: - - <%= csv_table_from_file("input-data--member-table-definition.csv") %> - -This yields: - - -------------------------------------------------------------------- - *Units* units of measure (lb., ft, Btu, etc.) where applicable - ------------- ------------------------------------------------------ - *Legal* limits of valid range for numeric inputs; valid - choices - - *Range* for *choice* members, etc. - - *Default* value assumed if member not given; applicable only if - not required - - *Required* YES if you must give this member - - *Variability* how often the given expression can change: hourly, - daily, etc. See sections on - [expressions](#expressions-overview), - [statements](#member-statements), and [variation - frequencies](#variation-frequencies-revisited) - -------------------------------------------------------------------- - -Note that by default (same as `csv_table`), the value of `:row_header` is `true`. To turn that off, we use: - - <%= csv_table_from_file( - "input-data--member-table-definition.csv", row_header: false) %> - -which is equivalent to: - - <%= csv_table_from_file( - "input-data--member-table-definition.csv", :row_header => false) %> - -Both of the above yield: - - ------------- ------------------------------------------------------ - *Units* units of measure (lb., ft, Btu, etc.) where applicable - - *Legal* limits of valid range for numeric inputs; valid - choices - - *Range* for *choice* members, etc. - - *Default* value assumed if member not given; applicable only if - not required - - *Required* YES if you must give this member - - *Variability* how often the given expression can change: hourly, - daily, etc. See sections on - [expressions](#expressions-overview), - [statements](#member-statements), and [variation - frequencies](#variation-frequencies-revisited) - ------------- ------------------------------------------------------ - -The exciting thing about using `csv_table_from_file` is that the table data can live on the file system and be edited with a spreadsheet tool such as *Microsoft Excel* or *LibreOffice Calc*. - -## Updating the Documents: Support Files - -The `doc/config/` directory contains various support files used to help build the documents. The `defaults.yaml` holds default configuration parameters that are discussed in the [configuration section](#the-configuration-file). Specifically, the css used for html styling is in the `css` directory; the templates used for both HTML and LaTeX (a precursor for a pdf build) are located in the `template` directory; and finally we have a `reference` directory which holds the following files: - -- `probes.txt` is a file dump from the `cse -p` command -- `probes_input.yaml` is a yaml file of the above processed to include comments -- `record-index-exceptions.yaml` allows one to override settings when a record's "canonical location" in the documentation does **not** follow the "typical convention". The "typical convention" is that a record will have its own file located in the `doc/src/records` folder with a file name corresponding to the record's name (all in lowercase). Within that file, there will be a header with the same name as the record and this section header would be unique in all of the documentation sections. In other words, we would normally expect to find a record named "SOMETHING" in file `doc/src/records/something.md` where, opening that file, we would expect a header of `# SOMETHING` (Markdown). If that is **not** the case, then this file is where you would explicitly say where to locate the Record's "canonical location" in the documentation source. - -The format of the `record-index-exceptions.yaml` file is: - - AUTOGENERATED RECORD NAME: { "NAME TO REPLACE IT WITH": "filename.html#tag-name" } -In the above, filename.html should be named with an `.html` extension (even though the "source" is `.md`) and we still expect to find it in the `doc/src/records` folder. +### csv_table -- inline csv tables -## Updating the Documents: Adding a new Section or Record +CSV tables provide an alternate syntax for describing a multi-line table. A csv string is passed as the first argument. The second argument is a boolen for whether a header should be included. By default, no header is included in the table. -When adding a new section or record you generally just open up your text editor and write the new file and place it under `doc/src`. However, the following list a few "gotchas" to look out for: + {{ + csv_table(csv_string, header=False) + }} -- be sure to save the file extension as `.md` -- the build tooling assumes markdown files are named with this extension -- write your file as if it were at the "top level". That is, even if you know the document will be nested several levels deep, make your top-most header a first-level header. -- be sure to enter the file's name and *actual* level in the document in the appropriate manifest.yaml file -- otherwise it won't get included in the documentation when you build! -- be sure to add your file to the version control sytem -- you don't need to explicitly link *any* RECORD names. If you uppercase record names per the document convention, the build process will automatically detect the name as a record name and cross-link the name to the "canonical location" where the record is defined -- all non-RECORD cross-links including section links **do** need to be added explicitly. The target for a section can be formed using [some straightforward rules] and would be written as `[link text](#identifier)`. Note: only use the `#identifier` syntax -- you don't need to specify the filename; even when the cross-link is in another physical file. The build process detects and fills in the filename depending on the type of build (pdf, single-page html, multi-page html, etc.) -- the [YAML] manifests for each document are located in the source. The section you will typically be adjusting is the `sections:` area. This is a list of two-tuples: the first is the "file level" and the second is the relative path from the "src/" directory. A "file level" indicates the level of indentation of that file in the documentation tree. "File levels" should **not** increase more than one at a time. +To add commas, we must (annoyingly) use the HTML comma entity, `,`. To add quotation marks, first escape the character: `\"`. -[some straightforward rules]: http://pandoc.org/MANUAL.html#extension-auto_identifiers -## Checking for Issues +### csv_table_from_file -The document processing system contains two quality control checking mechanisms: documentation coverage and links checks. +`csv_table_from_file` is provided as a convenience wrapper for csv_table. This function takes a file_path as the first argument. The second arugment is a boolean flag for header, as in the regular csv_table. The file_path is expected to be a path to a csv file, so that when loaded, the content can be passed to csv_table as a csv string. + {{ + csv_table(file_path, header=False) + }} ### Coverage Report -The coverage report can be accessed via: +The module `coverage.py` can be used to verify if the headings in the input-data directory contain exact matches (case-insensitive) to the output of `CSE -c`. - > rake coverage +#### Running the coverage check -The coverage report can be toggled to run by default or not using: +The python file can be run from anywhere in the cse directory by calling: - > rake set_coverage_on_by_default - > rake set_coverage_off_by_default + > uv run path/to/coverage.py --path_to_cse [--path_to_input_data ] -Whether coverage checks run or not by default can also be changed directly by editing your local `config.yaml` file. -Specifically, setting the `coverage?` key to true or false will set the coverage to run by default or not. -Either way, explicitly calling `rake coverage` will always run the coverage report. +The coverage checker will internally call `CSE -c` and capture the stdout to a string, which is then parsed and compared with the contents of the input-data directory. If no matches are found, a pass message will be printed. Otherwise, differences in either direction are printed. -The `rake coverage` check returns a non-zero exit code if any coverage issues are found. -Certain records or fields of certain records can be ignored by specifying an `ignore-coverage` key in the YAML manifest file. -If specified, the `ignore-coverage` dictionary-structure can contain up to two sub-fields: +#### Class Variables -* records: a list of the names of records to ignore. - Note: if a record is ignored, none of its data fields will be compared either. -* data-fields: a dictionary between record name and a list of data-fields to ignore +There are a few hard-coded constants (saved as class variables) specified at the top of the `coverage.py` file to be aware of. -An example structure appears below. +**IGNORED_HEADERS** specifices headers (e.g., record names) that are ignored for the purpose of checking if the docs have full coverage of the `CSE -c` output. -```yaml -ignore-coverage: - records: - - "airHandler" - data-fields: - export: - - "exTu" -``` +**IGNORED_INPUT_DATA_FILE_PATHS** includes files in the input-data directory that are not analyzed as part of the coverage check. For example, it should be possible to define headings of any level in `index.md` without triggering a failure in the coverage check. -In the example above, the "airHandler" record is completely ignored. -In addition, the "exTu" data field of the "export" record is also ignored. -The coverage check is accomplished by comparing the result of `cse -c` with what is in the documentation. +**SHARED** is a dictionary/map for record names that contain data members from files shared using the `{% include shared/file.md%}` directive. The coverage check analyzes the raw markdown headings before any rendering by Jinja or other steps in the build process (i.e., before shared content is injected), thus the SHARED class variable allows the coverage check to account for this shared content. The keys are record names and the value is a file in the `shared` directory whose data member headings will be associated with the key/record name for the purpose of the coverage check. -NOTE: the fields in ignore-coverage and the compared fields are NOT case sensitive at this time. -However, we recommend trying to respect the case where possible should case-sensitive compare be desired in the future. +**ALIASES**: certain headings in the output of `CSE -c` are enumerated, but are simplified in the docs (e.g., **cpStage1, ..., cpStage7** in `CSE -c` output becomes **cpStageN** in the docs). Aliases account for these differences. -### Link Check (i.e., Verify Links) +## Deploying Built Documents to GitHub Pages -The rake task `rake verify_links` will check the documentation for bad links. -This can be set up to run by default during a documentation build using the local `config.yaml` file. -Set the `verify-links?` field to true to run by default or false to disable by default. +The documentation can be deployed to GitHub Pages using either the built-in deploy command or by manually committing the built files. +### Deploy with MkDocs -## Pushing Built Documents to the Server +The command: -Documents are built by default into `doc/build/output`. This directory is a check-out of the remote repository's `gh-pages` branch which uses GitHub's [GitHub Pages] functionality. The remote repository URL can be configured in the `config.yaml` file under the key `remote-repo-url`. + > uv run mkdocs gh-deploy -[GitHub Pages]: https://pages.github.com/ +will automatically build and deploy the docs to GitHub pages. -Once you have built the documents and are satisfied with how they look, you can push to the remote repository's `gh-pages` branch for the github site you're interested in (by default, `origin` is set to the value in `config.yaml` under the key `remote-repo-url`). +### Deploy manually +Build the docs using `mkdocs build`, as described above. Then, paste the contents of the resulting `build` directory to the _gh-pages_ branch to manually deploy the latest version of the docs. diff --git a/doc/checkdoc.bat b/doc/checkdoc.bat deleted file mode 100644 index 778d783b8..000000000 --- a/doc/checkdoc.bat +++ /dev/null @@ -1,4 +0,0 @@ -:: fast build of CSE documentation (single HTML only) -call rake build_html_single -call rake coverage -start output\cse-user-manual.html diff --git a/doc/config/css/base.css b/doc/config/css/base.css deleted file mode 100644 index ed0bdad73..000000000 --- a/doc/config/css/base.css +++ /dev/null @@ -1,94 +0,0 @@ -@media all {html {font-size: 24px;}} -@media all and (max-width:1000px){html {font-size: 24px;}} -@media all and (max-width: 960px){html {font-size: 22px;}} -@media all and (max-width: 920px){html {font-size: 21px;}} -@media all and (max-width: 880px){html {font-size: 20px;}} -@media all and (max-width: 840px){html {font-size: 19px;}} -@media all and (max-width: 800px){html {font-size: 18px;}} -@media all and (max-width: 760px){html {font-size: 17px;}} -@media all and (max-width: 720px){html {font-size: 16px;}} -@media all and (max-width: 680px){html {font-size: 15px;}} -@media all and (max-width: 640px){html {font-size: 14px;}} -@media all and (max-width: 600px){html {font-size: 13px;}} -@media all and (max-width: 560px){html {font-size: 12px;}} -@media all and (max-width: 520px){html {font-size: 10px;}} -body { - width: 1000px; - margin: 0 auto; -} -body > * { - font-size: 100%; - margin-left: 2.5rem; - margin-right: 2.5rem; - text-align: justify; -} -table { - font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; - background: #fff; - width: 100%; - border-collapse: collapse; - text-align: left; - margin-left: auto; - margin-right: auto; -} -table th { - font-size: 100%; - font-weight: normal; - color: #039; - border-bottom: 2px solid #6678b1; - padding: 10px 8px; -} -table td { - color: #669; - font-size: 80%; - padding: 9px 8px 0; - vertical-align: top; -} -h1 { - font-family: "Helvetica"; - text-transform: uppercase; - border-top: 1px solid #666; - padding-top: 0em; - font-size: 170%; -} -h1.subtitle { - font-size: 125%; - border: none; -} -pre { - background-color: #fbf1d2; - padding-top: 1rem; - padding-bottom: 1rem; -} -td code { - font-size: 80%; -} -pre code { - font-size: 60%; - font-weight: lighter; - width: 100%; -} -.nav-bar { - display: inline-block; - list-style: none; -} -.nav-bar li { - padding-left: 1em; - padding-right: 1em; - display: inline; -} -.footer { - font-size: 60%; - font-weight: lighter; - width: 100%; - border-top: medium solid black; - padding: 1em; -} -.draft { - font-weight: bold; - text-align: center; - color: cornflowerblue; -} -.underline { - text-decoration: underline; -} diff --git a/doc/config/defaults.yaml b/doc/config/defaults.yaml deleted file mode 100644 index a6cabbdeb..000000000 --- a/doc/config/defaults.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (c) 1997-2018 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -# The branch in this git repository used for "GitHub Pages" -# see https://pages.github.com/ -docs-branch: "gh-pages" -# the source directory for the documentation -src-dir: "src" -# The reference directory with various reference files -reference-dir: "config/reference" -# Path to CSSNano if it is present -# see http://cssnano.co/ -cssnano-exe: "node_modules/.bin/cssnano" -# Path to html-minifier -# see https://github.com/kangax/html-minifier -html-minifier-exe: "node_modules/.bin/html-minifier" -# Flag on whether to use Node.js or not -# if yes, node is used to compress the HTML and CSS files -use-node?: true -# Flag on whether or not to use GitHub pages -# if yes, when the documentation is generated, it is set up for easier use to -# push to github pages -use-ghpages?: true -# Flag on whether to build the PDFs or not. Defaults to false since PDF -# requires more dependencies -build-pdf?: false -# Location of the build directory (relative to this file) -build-dir: 'build' -# Location of the final output directory -output-dir: 'output' -# URL of the remote origin. This is also the location where the gh-pages branch -remote-repo-url: "https://github.com/cse-sim/cse.git" -# Flag to build under 'draft' status or not -draft?: false -# If true, runs verification after a build to check generated document links -verify-links?: true -# If true, runs verification after a build to check that manifests include all -# files and that all files expected are accounted for -verify-manifest?: true -# Flag to set the verbosity of output -verbose?: false -# Run documentation coverage report by default? -# This report checks doc/config/reference/cullist.txt against what's in the -# documentation to determine if the documentation is covering all topics -coverage?: true -# This flag determines whether the "table pre-processing language" is made -# active during ERB preprocessing or not. If this is set to "true", then -# the directives available in lib/table.rb in the class Main are available -# within ERB -use-table-lang?: true -# if defined, the path below directs the table preprocessing language as to -# where to find CSV table files. Only relevant if "use-table-lang?" is true -table-path: "src/tables" -# if true, the build directory will be automatically deleted after output -# is created. Defaults to false as the system only rebuilds what is needed -# so it is more efficient to keep the build directory around. Note: this -# is the same as calling "rake clean" after building and will only be -# invoked on the default "rake" or "rake build" tasks. Also, NOTE that -# if your output directory is inside of the build directory, it will -# be deleted, too! -delete-build-dir?: false -# this variable holds various "flags" to pass into the ERB preprocessor -# NOTE: Only define variable keys that could be standard Ruby variables! -# For example, "some-variable: 10" would not work since "some-variable" -# is not a valid Ruby variable name. On a related note, all variables must -# be lower case due to a restriction of how we pass these variables into -# the ERB preprocessor and due to Ruby associating a semantics with upper -# case names. -context: - build_all: true - test_erb: false - inactive_CNE_records: false # true -> include TERMINAL, CHILLER, etc - # (records not used in CA compliance) - comfort_model: false # true -> include ZONE comfort model inputs - not_yet_implemented: false # true -> include portions that are explicitly - # labeled as NYI. - # Residential Alternative Calculation Method document link at CA/CEC - # Note: linking to the BEES reference section as the location of standards on - # the CA website is believed to change often - racm_url: "http://www.bwilcox.com/BEES/reference.html" - # show_comments: if true, show comments, otherwise don't - show_comments: false diff --git a/doc/config/reference/.gitignore b/doc/config/reference/.gitignore deleted file mode 100644 index ff1491a56..000000000 --- a/doc/config/reference/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -cullist.txt -probes.txt -probes_input.yaml diff --git a/doc/config/reference/record-index-exceptions.yaml b/doc/config/reference/record-index-exceptions.yaml deleted file mode 100644 index c55e914e7..000000000 --- a/doc/config/reference/record-index-exceptions.yaml +++ /dev/null @@ -1,2 +0,0 @@ ---- -TOP-MEMBERS: {"TOP": "top-members.html#top-members"} diff --git a/doc/config/template/site-template.html b/doc/config/template/site-template.html deleted file mode 100644 index 8760f7fb8..000000000 --- a/doc/config/template/site-template.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - -$for(author-meta)$ - -$endfor$ -$if(date-meta)$ - -$endif$ -$if(keywords)$ - -$endif$ - $if(title-prefix)$$title-prefix$ – $endif$$pagetitle$ - -$if(quotes)$ - -$endif$ -$if(highlighting-css)$ - -$endif$ -$for(css)$ - -$endfor$ -$if(math)$ - $math$ -$endif$ - -$for(header-includes)$ - $header-includes$ -$endfor$ - - -$for(include-before)$ -$include-before$ -$endfor$ -$if(title)$ -
-

$title$

-$if(subtitle)$ -

$subtitle$

-$endif$ -$for(author)$ -

$author$

-$endfor$ -$if(date)$ -

$date$

-$endif$ -$if(draft)$ -

DRAFT

-$endif$ -$if(do-nav)$ - -$endif$ -
-$endif$ -$if(toc)$ - -$endif$ -
-$body$ -
- -$for(include-after)$ -$include-after$ -$endfor$ - - diff --git a/doc/config/template/template.tex b/doc/config/template/template.tex deleted file mode 100644 index eb293c5d9..000000000 --- a/doc/config/template/template.tex +++ /dev/null @@ -1,291 +0,0 @@ -\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$} -$if(fontfamily)$ -\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$} -$else$ -\usepackage{lmodern} -$endif$ -$if(linestretch)$ -\usepackage{setspace} -\setstretch{$linestretch$} -$endif$ -\usepackage{amssymb,amsmath} -% BEGIN add bold math -\usepackage{bm} -% END add bold math -\usepackage{ifxetex,ifluatex} -\usepackage{fixltx2e} % provides \textsubscript -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc} - \usepackage[utf8]{inputenc} -$if(euro)$ - \usepackage{eurosym} -$endif$ -\else % if luatex or xelatex - \ifxetex - \usepackage{mathspec} - \else - \usepackage{fontspec} - \fi - \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase} -$for(fontfamilies)$ - \newfontfamily{$fontfamilies.name$}[$fontfamilies.options$]{$fontfamilies.font$} -$endfor$ -$if(euro)$ - \newcommand{\euro}{€} -$endif$ -$if(mainfont)$ - \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$} -$endif$ -$if(sansfont)$ - \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$} -$endif$ -$if(monofont)$ - \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$} -$endif$ -$if(mathfont)$ - \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$} -$endif$ -$if(CJKmainfont)$ - \usepackage{xeCJK} - \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$} -$endif$ -\fi -% use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -% use microtype if available -\IfFileExists{microtype.sty}{% -\usepackage{microtype} -\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} -$if(geometry)$ -\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} -$endif$ -% BEGIN fancy header addition Aug 16, 2016 -% NOTE: See http://tex.stackexchange.com/questions/241523/header-line-doesnt-span-width-of-page -% Fancy Header must be loaded *AFTER* geometry -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhead[CO,CE]{$header$} -\fancyfoot[CO,CE]{$footer$$if(draft)$ -- DRAFT --$endif$} -\fancyfoot[LE,RO]{\thepage} -\renewcommand{\headrulewidth}{0.4pt} -\renewcommand{\footrulewidth}{0.4pt} -% END fancy header addition Aug 16, 2016 -\usepackage[unicode=true]{hyperref} -$if(colorlinks)$ -\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref -$endif$ -\hypersetup{ -$if(title-meta)$ - pdftitle={$title-meta$}, -$endif$ -$if(author-meta)$ - pdfauthor={$author-meta$}, -$endif$ -$if(keywords)$ - pdfkeywords={$for(keywords)$$keywords$$sep$; $endfor$}, -$endif$ -$if(colorlinks)$ - colorlinks=true, - linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$, - citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$, - urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$, -$else$ - pdfborder={0 0 0}, -$endif$ - breaklinks=true} -\urlstyle{same} % don't use monospace font for urls -$if(lang)$ -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel} -$if(babel-newcommands)$ - $babel-newcommands$ -$endif$ -\else - \usepackage{polyglossia} - \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$} -$for(polyglossia-otherlangs)$ - \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$} -$endfor$ -\fi -$endif$ -$if(natbib)$ -\usepackage{natbib} -\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} -$endif$ -$if(biblatex)$ -\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex} -$for(bibliography)$ -\addbibresource{$bibliography$} -$endfor$ -$endif$ -$if(listings)$ -\usepackage{listings} -$endif$ -$if(lhs)$ -\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} -$endif$ -$if(highlighting-macros)$ -$highlighting-macros$ -$endif$ -$if(verbatim-in-note)$ -\usepackage{fancyvrb} -\VerbatimFootnotes % allows verbatim text in footnotes -$endif$ -$if(tables)$ -\usepackage{longtable,booktabs} -$endif$ -$if(graphics)$ -\usepackage{graphicx,grffile} -\makeatletter -\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} -\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} -\makeatother -% Scale images if necessary, so that they will not overflow the page -% margins by default, and it is still possible to overwrite the defaults -% using explicit options in \includegraphics[width, height, ...]{} -\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} -$endif$ -$if(links-as-notes)$ -% Make links footnotes instead of hotlinks: -\renewcommand{\href}[2]{#2\footnote{\url{#1}}} -$endif$ -$if(strikeout)$ -\usepackage[normalem]{ulem} -% avoid problems with \sout in headers with hyperref: -\pdfstringdefDisableCommands{\renewcommand{\sout}{}} -$endif$ -$if(indent)$ -$else$ -\IfFileExists{parskip.sty}{% -\usepackage{parskip} -}{% else -\setlength{\parindent}{0pt} -\setlength{\parskip}{6pt plus 2pt minus 1pt} -} -$endif$ -\setlength{\emergencystretch}{3em} % prevent overfull lines -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} -$if(numbersections)$ -\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$} -$else$ -\setcounter{secnumdepth}{0} -$endif$ -$if(subparagraph)$ -$else$ -% Redefines (sub)paragraphs to behave more like sections -\ifx\paragraph\undefined\else -\let\oldparagraph\paragraph -\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}} -\fi -\ifx\subparagraph\undefined\else -\let\oldsubparagraph\subparagraph -\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}} -\fi -$endif$ -$if(dir)$ -\ifxetex - % load bidi as late as possible as it modifies e.g. graphicx - $if(latex-dir-rtl)$ - \usepackage[RTLdocument]{bidi} - $else$ - \usepackage{bidi} - $endif$ -\fi -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \TeXXeTstate=1 - \newcommand{\RL}[1]{\beginR #1\endR} - \newcommand{\LR}[1]{\beginL #1\endL} - \newenvironment{RTL}{\beginR}{\endR} - \newenvironment{LTR}{\beginL}{\endL} -\fi -$endif$ -$for(header-includes)$ -$header-includes$ -$endfor$ - -$if(title)$ -\title{$title$$if(thanks)$\thanks{$thanks$}$endif$} -$endif$ -$if(subtitle)$ -\providecommand{\subtitle}[1]{} -\subtitle{$subtitle$} -$endif$ -$if(author)$ -\author{$for(author)$$author$$sep$ \and $endfor$} -$endif$ -$if(institute)$ -\institute{$for(institute)$$institute$$sep$ \and $endfor$} -$endif$ -\date{$date$} - -\begin{document} -\begin{titlepage} -\centering - $if(draft)$ - {\Large DRAFT \par} - \vspace{1cm} - $endif$ - {\LARGE $title$ \par} - $if(subtitle)$ - \vspace{1cm} - {\Large $subtitle$ \par} - $endif$ - \vspace{4cm} - {\Large $date$ \par} - \vspace{$if(draft)$13cm$else$14cm$endif$} - {\small Copyright (c) 1997-$if(current_year)$$current_year$$else$2017$endif$ The CSE Authors. All rights reserved. \par} - - \vfill - -\end{titlepage} -$if(abstract)$ -\begin{abstract} -$abstract$ -\end{abstract} -$endif$ - -$for(include-before)$ -$include-before$ - -$endfor$ -$if(toc)$ -{ -$if(colorlinks)$ -\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$} -$endif$ -\setcounter{tocdepth}{$toc-depth$} -\tableofcontents -} -$endif$ -$if(lot)$ -\listoftables -$endif$ -$if(lof)$ -\listoffigures -$endif$ -$body$ - -$if(natbib)$ -$if(bibliography)$ -$if(biblio-title)$ -$if(book-class)$ -\renewcommand\bibname{$biblio-title$} -$else$ -\renewcommand\refname{$biblio-title$} -$endif$ -$endif$ -\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$} - -$endif$ -$endif$ -$if(biblatex)$ -\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ - -$endif$ -$for(include-after)$ -$include-after$ - -$endfor$ -\end{document} diff --git a/doc/lib/command.rb b/doc/lib/command.rb deleted file mode 100644 index 02f042b77..000000000 --- a/doc/lib/command.rb +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 1997-2016 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -require('open3') - -module Command - # Run :: String (Array String) ?String ?Bool -> String - # Given a command (a String), an array of strings of options, and an optional - # input string to feed into the program, and an optional flag to print if - # verbose, return program's output, erroring if the program errors - Run = lambda do |cmd, opts, input=nil, verbose=false| - opts_str = if opts.instance_of?("".class) - opts - else - opts.join(' ') - end - cmd = "#{cmd} #{opts_str}" - output = error = exit_status = nil - Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr| - stdin.puts(input) if input - stdin.close - stdout.set_encoding('utf-8') - output = stdout.read - error = stderr.read - exit_status = wait_thr.value - end - if verbose - puts("cmd : #{cmd}") - puts("input : #{input}") - puts("output: #{output}") - puts("error : #{error}") - end - raise error unless exit_status.success? - output - end -end diff --git a/doc/lib/coverage_check.rb b/doc/lib/coverage_check.rb deleted file mode 100644 index bc1f72200..000000000 --- a/doc/lib/coverage_check.rb +++ /dev/null @@ -1,348 +0,0 @@ -require 'set' - -module CoverageCheck - # String -> (Or Nil String) - # Given a line of markdown, recognize an ATX header and return the header - # itself or return nil - MdHeader = lambda do |line| - m = line.match(/^#+\s+(.*)$/) - if m - m[1].strip - else - nil - end - end - # String -> (Or Nil String) - # Given a line of markdown, recognize a data item header and return it, or - # return nil. - DataItemHeader = lambda do |line| - m = line.match(/^\*\*(.*)\*\*\\?\s*$/) - if m - header = m[1].split(/=/)[0].gsub(/\*/,'').strip - if Ignore[header] - nil - else - header - end - else - nil - end - end - IgnoredHeaders = Set.new(["Related Probes"].map(&:downcase)) - # String -> Bool - # Return true if the given header should be ignored - Ignore = lambda do |header| - hdc = header.downcase - IgnoredHeaders.each do |ih| - return true if hdc.include?(ih) or ih.include?(hdc) - end - false - end - # String -> (Map String (Set String)) - # Given the content of a markdown document of a record and its input, return - # a RecordInputSet for the records and input fields found in that document - ParseRecordDocument = lambda do |content| - output = {} - current_header = nil - content.lines.map(&:chomp).each do |line| - h = MdHeader[line] - if h and not Ignore[h] - current_header = h - output[current_header] = Set.new unless output.include?(h) - else - input_hdr = DataItemHeader[line] - if input_hdr - output[current_header] << input_hdr - end - end - end - output - end - # String -> (Map String (Set String)) - # Given a file path to a markdown document containing record documentation, - # return a RecordInputSet for the records and input fields found in that - # document. - ReadRecordDocument = lambda do |path| - ParseRecordDocument[File.read(path)] - end - # (Array String) -> (Map String (Set String)) - # Given an array of file paths to record documentation, consecutively - # construct a RecordInputSet from all of the documents listed. Note: it is an - # error for a document to define the same Record Name, Record Input Field - # combination. - ReadAllRecordDocuments = lambda do |paths| - output = {} - paths.each do |path| - new_output = ReadRecordDocument[path] - new_output.keys.each do |k| - if output.include?(k) - raise "Duplicate keys found: #{k} at #{path}" - end - end - output.merge!(new_output) - end - output - end - # String -> (Map String (Set String)) - # Given the string content of the results of `cse -c > cullist.txt`, - # parse that into a RecordInputSet - ParseCulList = lambda do |content| - output = {} - current_record = nil - content.lines.map(&:chomp).each_with_index do |line, idx| - next unless idx > 3 - record = line.match(/^(\S+).*$/) - if record - current_record = record[1].strip - output[current_record] = Set.new unless output.include?(current_record) - elsif !current_record.nil? - field = line.match(/^ (\S+).*$/) - if field - output[current_record] << field[1].strip - end - end - end - output - end - # String -> (Map String (Set String)) - # Given the path to a cullist.txt file (i.e., the result of `cse -c > - # cullist.txt`), read the file and parse it into a RecordInputSet - ReadCulList = lambda do |path| - ParseCulList[File.read(path)] - end - # Given two sets and an optional flag (defaults to false) that, if true, - # compares on case, if false, doesn't; check for differences between the - # contents of set 1 and the contents of set 2, reporting items in the first - # set (but not in the second) and items in the second set (but not in the - # first) - # ARGUMENTS - # s1: (Set String), the first set - # s2: (Set String), the second set - # case_matters: ?Bool, if true compare with case, else case-insensitive; default: false - # keys_to_ignore: ?(Or (Set String) nil): a set of keys to ignore; default nil - # RETURNS - # (Or Nil - # (Record :in_1st_not_2nd (Or Nil (Set String)) - # :in_2nd_not_1st (Or Nil (Set String)))) - SetDifferences = lambda do |s1, s2, case_matters=false, keys_to_ignore=nil| - keys_to_ignore ||= Set.new - if s1 == s2 - nil - elsif case_matters - s1_ = s1 - keys_to_ignore - s2_ = s2 - keys_to_ignore - if s1_ == s2_ - nil - else - { - :in_1st_not_2nd => s1_ - s2_, - :in_2nd_not_1st => s2_ - s1_, - } - end - else - keys_to_ignore_dc = Set.new(keys_to_ignore.map {|k|k.downcase}) - f = lambda {|m, item| m.merge({item.downcase => item})} - m1 = s1.inject({}, &f) - m2 = s2.inject({}, &f) - s1_ = Set.new(m1.keys) - keys_to_ignore_dc - s2_ = Set.new(m2.keys) - keys_to_ignore_dc - if s1_ == s2_ - nil - else - { - :in_1st_not_2nd => Set.new((s1_ - s2_ - keys_to_ignore_dc).map {|k| m1[k]}), - :in_2nd_not_1st => Set.new((s2_ - s1_ - keys_to_ignore_dc).map {|k| m2[k]}), - } - end - end - end - # (Map String (Set String)) -> (Map String (Set String)) - # Given a map from string to set of string, adjust the map so that fields - # with spacing in them get collapsed to the record defined by the first word - # through set union - AdjustMap = lambda do |m| - n = {} - m.each do |k, v| - new_k = (k =~ /\s+/) ? k.split(/\s+/)[0] : k - if n.include?(new_k) - n[new_k] += v - else - n[new_k] = v - end - end - n - end - # (Map String (Set String)) -> (Map String (Set String)) - # Adjust a record input set to drop all fields that end with "Name" - DropNameFields = lambda do |ris| - n = {} - ris.each do |k, vs| - n[k] = vs.reject {|v| v.end_with?("Name")}.to_set - end - n - end - # RecordInputSet -> RecordInputSet - # Downcase a record input set - DowncaseRecordInputSet = lambda do |ris| - n = {} - ris.each do |k, vs| - n[k.downcase] = vs.map(&:downcase).to_set - end - n - end - # (Map String (Set String)) (Map String (Set String)) ?Bool -> - # (Map String (Set String)) - # Given a record input set and a reference record input set and an optional - # boolean flag (defaulting to false) that, if true, compares case sensitive, - # drop all fields that end with "Name" UNLESS they also appear in the - # reference. Note: compares - DropNameFieldsIfNotInRef = lambda do |ris, ref, case_sensitive=false| - ref = case_sensitive ? ref : DowncaseRecordInputSet[ref] - name = case_sensitive ? "Name" : "name" - n = {} - ris.each do |k, vs| - kk = case_sensitive ? k : k.downcase - n[k] = vs.reject {|v| - w = case_sensitive ? v : v.downcase - w.end_with?(name) && !(ref.include?(kk) && ref[kk].include?(w)) - }.to_set - end - n - end - # Given two RecordInputSet objects, an optional flag (defaulting to false) - # which, if true, compares based on case, and optional records to ignore and - # record fields to ignore, compare the two RecordInputSet objects, returning - # any differences. If no differences, return nil. - # ARGUMENTS: - # - ris1: (Map String (Set String)) - # - ris2: (Map String (Set String)) - # - case_matters: ?Bool - # - records_to_ignore: ?(Set String) - # - record_fields_to_ignore: ?(Map String (Set String)) - # RETURN: - # (Or Nil - # (Record :records_in_1st_not_2nd (Or Nil (Set String)) - # :records_in_2nd_not_1st (Or Nil (Set String)) - # String - # (Record :in_1st_not_2nd (Or Nil (Set String)) - # :in_2nd_not_1st (Or Nil (Set String))))) - RecordInputSetDifferences = lambda do |ris1, ris2, case_matters=false, records_to_ignore=nil, record_fields_to_ignore=nil| - records_to_ignore ||= Set.new - record_fields_to_ignore ||= {} - if !case_matters - # if case doesn't matter, downcase all keys - ris1 = ris1.keys.inject({}) {|m, k| m.merge({k.downcase => Set.new(ris1[k].map {|ris1k|ris1k.downcase})})} - ris2 = ris2.keys.inject({}) {|m, k| m.merge({k.downcase => Set.new(ris2[k].map {|ris2k|ris2k.downcase})})} - records_to_ignore = Set.new(records_to_ignore.map {|k| k.downcase}) - record_fields_to_ignore = record_fields_to_ignore.keys.inject({}) {|m, k| m.merge({k.downcase => record_fields_to_ignore[k]})} - end - if ris1 == ris2 - nil - else - g = lambda {|x,y|{records_in_1st_not_2nd: x, records_in_2nd_not_1st: y}} - ks1 = Set.new(ris1.keys) - ks2 = Set.new(ris2.keys) - key_diffs = SetDifferences[ks1, ks2, case_matters, records_to_ignore] - out = nil - if key_diffs - out = g[key_diffs[:in_1st_not_2nd], key_diffs[:in_2nd_not_1st]] - end - # check fields - fsd = :field_set_differences - ks = ks1 & ks2 - ks.each do |k| - # ignore based on lookup that is both case sensitive and insensitive - next if records_to_ignore.include?(k) - field_ignores = record_fields_to_ignore.fetch(k, Set.new) - diffs = SetDifferences[ - ris1.fetch(k, Set.new), ris2.fetch(k, Set.new), - case_matters, field_ignores] - if diffs - if out - out[fsd] = {} unless out.include?(fsd) - out[fsd][k] = diffs - else - out = g[nil, nil] - out[fsd] = {} unless out.include?(fsd) - out[fsd][k] = diffs - end - end - end - out - end - end - # (Map * *) String * * String String -> String - # Given a map, a string for a name of what the map represents (e.g., - # Records, Data Input Fields, etc.), two keys into the map, and two strings - # to name the variations represented by the two keys, report off on the - # differences as a string. - DiffsToString = lambda do |diffs, name, k1, k2, a, b, indent=0| - if diffs.nil? - "" - else - ind = " "*indent - s = "" - s += "#{name}:\n" if !name.nil? and !diffs.nil? and (diffs[k1] or diffs[k2]) - [[k1,a,b], [k2,b,a]].each do |k, x, y| - if diffs[k] - s += "#{ind}in #{x} but not in #{y}:\n" unless diffs[k].nil? or diffs[k].empty? - diffs[k].sort.each do |r| - s += "#{ind}- #{r}\n" - end - else - s += "" - end - end - s - end - end - # (Or Nil - # (Record :records_in_1st_not_2nd (Or Nil (Set String)) - # :records_in_2nd_not_1st (Or Nil (Set String)) - # :field_set_differences - # (Or Nil - # (Map String - # (Record :in_1st_not_2nd (Or Nil (Set String)) - # :in_2nd_not_1st (Or Nil (Set String))))))) - # -> String - # Given the output of RecordInputSetDifferences, format it and retun as a string - RecordInputSetDifferencesToString = lambda do |diffs, a=nil, b=nil| - a ||= "First" - b ||= "Second" - if diffs.nil? - "No changes detected between #{a} and #{b}" - else - s = "" - if diffs[:records_in_1st_not_2nd] or diffs[:records_in_1st_not_2nd] - s += "RECORD INCONSISTENCIES:\n" - s += DiffsToString[ - diffs, - nil, - :records_in_1st_not_2nd, - :records_in_2nd_not_1st, - a, - b, - 4 - ] - end - if diffs[:field_set_differences] - ks = diffs[:field_set_differences].keys.sort - if ks and !ks.empty? - s += "DATA FIELD INCONSISTENCIES:\n" - ks.each do |k| - s += DiffsToString[ - diffs[:field_set_differences][k], - k, - :in_1st_not_2nd, - :in_2nd_not_1st, - a, - b, - 4 - ] - end - end - end - s - end - end -end diff --git a/doc/lib/cse.rb b/doc/lib/cse.rb deleted file mode 100644 index de7ecc2ac..000000000 --- a/doc/lib/cse.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 1997-2016 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -require_relative('command') - -module CSE - # Create an Alias - C = Command - - cse_path = ENV.has_key?('CSE_EXE_PATH') ? ENV['CSE_EXE_PATH'] : '..\\builds\\cse' - - # (Or (Array String) String) ?String -> String - # Given an array of strings of options to cse and an optional input to - Run = lambda do |opts, input=nil| - C::Run[cse_path, opts, input] - end - - CullList = lambda do - Run[["-c", "> #{File.join('config','reference','cullist.txt')}"]] - end - - ProbesList = lambda do - Run[["-p", "> #{File.join('config','reference','probes.txt')}"]] - end - -end diff --git a/doc/lib/def_parser.rb b/doc/lib/def_parser.rb deleted file mode 100644 index 9363f34e8..000000000 --- a/doc/lib/def_parser.rb +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright (c) 1997-2018 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -require 'tmpdir' -require 'tempfile' -require 'yaml' -require 'set' -require 'irb' - -require_relative 'command' - -module DefParser - # This is the starting state for the parser - THIS_DIR = File.expand_path(File.dirname(__FILE__)) - IsWindows = !((ENV['OS'] =~ /win/i).nil?) - LoadFromReference = lambda do |fname| - ref_dir = File.expand_path(File.join(THIS_DIR, '..', 'config', 'reference'), THIS_DIR) - path = File.join(ref_dir, fname) - File.read(path) - end - LoadProbes = lambda {LoadFromReference["probes.txt"]} - LoadFromSrc = lambda do |fname| - src_dir = File.expand_path(File.join(THIS_DIR, '..', '..', 'src'), THIS_DIR) - path = File.join(src_dir, fname) - File.read(path) - end - LoadCnRecsOrig = lambda {LoadFromSrc['CNRECS.DEF']} - LoadCnFieldsOrig = lambda {LoadFromSrc['CNFIELDS.DEF']} - LoadCndTypesOrig = lambda {LoadFromSrc['CNDTYPES.DEF']} - # String -> String - # Load via the C Pre-processor - LoadViaCpp = lambda do |fname, with_comments=false| - output = nil - Tempfile.open('temp_file') do |f| - # Call the c preprocessor - src_dir = File.expand_path(File.join(THIS_DIR, '..', '..', 'src'), THIS_DIR) - path = File.join(src_dir, fname) - tgt_path = f.path - if IsWindows - opts = [] - opts << "/I\"#{src_dir}\"" - opts << "/C" if with_comments - opts << "/EP" - opts << "/TP" - opts << "\"#{path}\"" - output = Command::Run["cl", opts, nil, false] - else - `cpp -I#{src_dir} -xc++ #{path} #{tgt_path}` - output = File.read(f.path) - end - end - output - end - LoadCnRecs = lambda {LoadViaCpp['CNRECS.DEF']} - LoadCnRecsWithComments = lambda{LoadViaCpp['CNRECS.DEF', true]} - LoadCndTypes = lambda {LoadViaCpp['CNDTYPES.DEF']} - MkRecord = lambda do |id, name, fields| - { - :id => id, - :name => name, - :fields => fields - } - end - ReplaceMultiLineCommentsKeepSpace = lambda do |txt| - txt.gsub(/\/\*[^*]*\*\//m) {|m| m.gsub(/[^\n]/, ' ')} - end - # Parser for CNFIELDS.DEF - ParseUnits = lambda do |input| - data = {} - ReplaceMultiLineCommentsKeepSpace[input].lines.map(&:chomp).each do |line| - next if line =~/^\s*$/ - next if line =~ /^\s*\/\/.*$/ - toks = line.split(/\s+/) - comment_match = line.match(/^.*?\/\/(.*)$/) - data[toks[0]] = { - :typename => toks[0], - :datatype => toks[1], - :limits => toks[2], - :units => toks[3], - } - if comment_match - data[toks[0]][:description] = comment_match[1].strip - end - end - data - end - ParseCnFields = lambda {ParseUnits[LoadCnFieldsOrig[]]} - ParseTypes = lambda do |input| - - end - ParseCnTypes = lambda {ParseTypes[LoadCndTypes[]]} - ParseCseDashP = lambda do |input| - records = {} - fields = [] - name = nil - input.lines.map(&:chomp).each do |line| - if line.start_with?("@") - re = Regexp.new( - /^@(?[a-zA-Z_0-9]+)/.source + - /(?\[1\.\.\])?\./.source + - /(?\s+I)?/.source + - /(?\s+R)?/.source + - /(?\s+owner:\s+[a-zA-Z_0-9]+)?.*$/.source - ) - m = line.match(re) - if m - # add fields from last record - records[name][:fields] = fields if name - fields = [] - name = m["name"] - records[name] = {} - records[name][:input] = ! m["input"].nil? - records[name][:runtime] = ! m["runtime"].nil? - if m["owner"].nil? - records[name][:owner] = "--" - else - records[name][:owner] = m["owner"].strip.split(/\s+/)[1] - end - records[name][:array] = ! m["array"].nil? - end - elsif line =~ /^\s*$/ or name.nil? - next - else - field = { - :name => line[0..20].strip, - :input => line[21..24].strip == "I", - :runtime => line[25..28].strip == "R", - :type => line[29..49].strip, - :variability => line[50..-1].strip - } - fields << field - end - end - # add fields that may not have been added - records[name][:fields] = fields unless records[name].include?(:fields) - records - end - ParseProbesTxt = lambda {ParseCseDashP[LoadProbes[]]} - VERBOSE = false - CleanStr = lambda do |s| - s.encode('UTF-8', - :invalid => :replace, - :undef => :replace, - :replace => '') - end - # String (Array String) Int -> (Tuple (Or Nil String) Int) - # Given a line, an array of reference lines, and an integer for current - # position in reference lines, return a tuple of the comment description for - # the given line and the new position, or nil and the current position if - # nothing is found. - FindDescription = lambda do |line, ref_lines, current_ref_idx| - stripped_line = line.strip - next_ref_idx = current_ref_idx - ref_line = nil - ref_lines.each_with_index do |rl, ref_idx| - next if ref_idx < current_ref_idx - rl_ = rl.gsub(/\t/, ' ').gsub(/\/\//, ' ').gsub(/\/\*/, ' ') + " " - if rl_.include?(stripped_line + " ") - next_ref_idx = ref_idx - ref_line = rl - break - end - end - if ref_line - puts("matching:\n\t#{line.strip[0..40]}\n with\n\t#{ref_line.strip[0..40]}\n") if VERBOSE - m = ref_line.match(/^.*?\/\/(.*)$/) - if m - # match // ... lines - description = CleanStr[m[1].strip] - puts("found field!: #{description[0..40]}") if VERBOSE - [description, next_ref_idx] - else - # match /* ... lines - n = ref_line.match(/^.*?\/\*(.*)$/) - if n - description = CleanStr[n[1].strip.gsub(/\*\//, '')] - puts("found field!: #{description[0..40]}") if VERBOSE - [description, next_ref_idx] - else - [nil, current_ref_idx] - end - end - else - [nil, current_ref_idx] - end - end - Parse = lambda do |input, reference=nil| - in_record = false - record_id = nil - record_name = nil - record_fields = [] - output = {} - variability = Set.new([ - "e" ,# field varies at end of interval. - "p" ,# with above, field varies at post-calc stage, not start (intermediate results) - "f" ,# value available after input, before setup; before re-setup after autosize. - "r" ,# runly (start of run) variability, including things set by input check/setup - "y" ,# runly (end of run) variability, including things set by input check/setup - "s" ,# subhour - "h" ,# hour - "mh",# month-hour - "d" ,# day - "m" ,# month - "z" ,# constant - "i" ,# after input, before checking/setup - ]) - ref_lines = reference.lines.map(&:chomp) if reference - current_ref_idx = 0 - input.lines.map(&:chomp).each_with_index do |line, idx| - if line =~ /^\s*RECORD/ - m = line.match(/^\s*RECORD\s+([a-zA-Z_0-9-]*)\s*\"([^"]*)\"\s+\*(RAT|STRUCT|SUBSTRUCT).*$/) - if m and (m[3] == "RAT") - in_record = true - record_id = m[1] - record_name = m[2] - elsif m and (m[1] == "ZNRES_IVL_SUB") - # TODO: fix this special-casing to more generally handle parsing and - # association of substructs with their parent RAT objects. - in_record = true - record_id = "ZNRES" - record_name = "znRes" - end - elsif line =~ /^\s*\*declare.*$/ - next - elsif line =~ /^\s*$/ - next - elsif ((line =~ /^\s*\*.*$/) or (line.split(/\s+/).length >= 2 and in_record)) and !(line =~ /^\s*\*END.*$/) - # take the last two items - spec, name = line.split(/\s+/)[-2..-1] - next if spec.nil? || name.nil? || spec.include?('*') || name.include?('*') - field = { - :spec => spec, - :name => name.gsub(/;/,'') - } - if reference - description, current_ref_idx = FindDescription[ - line, ref_lines, current_ref_idx] - field[:description] = description if description - end - toks = line.gsub(/#{spec}\s+#{name}\s*$/, '') - .strip - .split(/\*/) - .map(&:strip) - .reject(&:empty?).map {|x| x.split(/\s+/)} - hide = false - toks.each do |tok| - t = tok[0].downcase - if t == "hide" - hide = true - elsif variability.include?(t) - if field.include?(:variability) - field[:variability] += [t] - else - field[:variability] = [t] - end - elsif t == "array" - field[:array] = true - begin - field[:size] = tok[1].to_i - rescue => e - puts("!!! Attempt to read array size as an integer on line #{idx} failed;\n#{e.message}") - puts("!!! tok=#{tok.inspect}") - puts("!!! Storing and moving on...") - field[:size] = tok[1] - end - elsif t == "noname" - hide = true - elsif t == "nest" - hide = true - else - puts("!!! Ignoring #{t}; tok: #{tok}\n!!! line[#{idx}]: #{line}") - end - end - record_fields << field unless hide - elsif (line =~ /^\s*[a-zA-Z_0-9]+\s+[a-zA-Z_0-9]+\s*$/) and in_record - # we have a two token field - spec, name = line.strip.split(/\s+/) - field = { - :spec => spec, - :name => name, - :variability => ["constant"] - } - next if spec.nil? or name.nil? or spec.include?('*') or name.include?('*') - record_fields << field - elsif (line =~ /^\s*\*END/) and in_record - in_record = false - output_key = record_id.downcase - if output.include?(output_key) - if output_key != "znres" # See exception above. - puts("Warning! Duplicate id found: #{record_id}--line[#{idx}]") - end - output[output_key] = MkRecord[ - record_id, record_name, - output[output_key][:fields] + record_fields] - else - output[output_key] = MkRecord[record_id, record_name, record_fields] - end - record_id = nil - record_name = nil - record_fields = [] - end - end - output - end - ParseCnRecs = lambda {Parse[LoadCnRecs[], LoadCnRecsWithComments[]]} - # String -> Nil - # Given the path to an output file, write the output file in YAML format. - ParseCnRecsToYaml = lambda {|p| File.write(p, ParseCnRecs[].to_yaml)} -end diff --git a/doc/lib/lineproc.rb b/doc/lib/lineproc.rb deleted file mode 100644 index a10c371ef..000000000 --- a/doc/lib/lineproc.rb +++ /dev/null @@ -1,29 +0,0 @@ - -module LineProc - # String Init Reducer -> Init - ReduceLines = lambda do |str, init, reducer| - val = init - str.split("\n").each {|line| - val = reducer.call(val, line) - } - val - end - - # (Vec String) Init Reducer (Array (Tuple Regex String)) -> Init - ReduceOverFiles = lambda do |files, init, reducer, gsubs=nil| - val = init - files.each do |f| - val = val.merge(Hash[:file_url,f]) - open(f, 'r') do |fin| - str = fin.read() - if gsubs - gsubs.each do |regex, sub| - str = str.gsub(regex, sub) - end - end - val = ReduceLines[str, val, reducer] - end - end - val - end -end diff --git a/doc/lib/md.rb b/doc/lib/md.rb deleted file mode 100644 index db73f1def..000000000 --- a/doc/lib/md.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative 'slug' - -module MD - # String -> Bool - # Returns true if the line is an ATX style header - SelectHeader = lambda {|s| s =~ /^#+[[:space:]]+.*$/ } - - # String -> String - # Retreive the header string from an ATX style header - NameFromHeader = lambda do |line| - name_match = line.match(/^#+[[:space:]]+((?:(?![[:space:]]+\{[#\.]).)*)/) - if name_match.nil? then "" else name_match[1].strip end - end - - # String -> String - NameAndSlug = lambda do |line| - name = NameFromHeader[line] - custom_slug_match = line.match(/\{#([^\}]*)\}\s*$/) - if custom_slug_match.nil? - slug = Slug::Slugify[name] - else - slug = custom_slug_match[1] - end - [name, slug] - end -end diff --git a/doc/lib/pandoc.rb b/doc/lib/pandoc.rb deleted file mode 100644 index 1c463cc80..000000000 --- a/doc/lib/pandoc.rb +++ /dev/null @@ -1,358 +0,0 @@ -# Copyright (c) 1997-2016 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -require_relative('command') - -module Pandoc - # Create an Alias - C = Command - - STD_MD_OPTS = [ - '-t markdown', - '--atx-headers', - '--normalize', - '--wrap=none', - '+RTS', '-K128m', '-RTS' - ] - - # (Or (Array String) String) ?String -> String - # Given an array of strings of options to pandoc and an optional input to - # feed into Pandoc, return Pandoc's output, erroring if Pandoc errors - Run = lambda do |opts, input=nil| - C::Run['pandoc', opts, input] - end - - # MdToJson : MarkdownString -> JsonString - # Transform a MarkdownString into a JsonString. - # Note: to get Ruby data structures, run the output string through JSON.parse - MdToJson = lambda do |md_str| - Run[["-t json", "-f markdown"], md_str] - end - - # GetDocMeta :: DocIR -> RubyJson - # Given a Pandoc DocIR document, extract the meta-data portion and return it. - GetDocMeta = lambda do |doc_ir| - doc_ir[0] - end - - # GetDocContent :: DocIR -> DocSnippet - # Given a DocIR, extract the content portion - GetDocContent = lambda do |doc_ir| - doc_ir[1] - end - - # GetItemTag :: DocItem -> String - # Given a top item as from the items in the content portion of a - # PandocRubyJson document, return the tag (a string) - GetItemTag = lambda do |doc_item| - doc_item.fetch("t") - end - - # GetHeaderLevel :: HeaderItem -> Int - # Given a RubyJson representation of a header as from a PandocRubyJson - # document, return the heading level - GetHeaderLevel = lambda do |h| - h["c"][0].to_i - end - - # SplitJsonByHeadingLevel :: DocIR (Array Int) -> (Array DocIR) - # This method takes (1) DocIR document and (2) an array of heading levels to - # split the document at and returns an array of DocIR documents split at the - # given heading levels. Note: the original document's meta-data is inserted - # verbatim into each subdocument as it's meta-data. - SplitJsonByHeadingLevel = lambda do |doc_ir, heading_levels| - docs = [] - meta = GetDocMeta[doc_ir] - current_doc = [] - GetDocContent[doc_ir].each do |top_item| - tag = GetItemTag[top_item] - if tag == "Header" and heading_levels.include?(GetHeaderLevel[top_item]) - docs << [meta.clone, current_doc] unless current_doc == [] - current_doc = [] - current_doc << top_item - else - current_doc << top_item - end - end - docs << [meta.clone, current_doc] unless current_doc == [] - end - - # ObjsOfTag :: DocIR String -> (Array DocItem) - # Given a DocIR Document and the Tag (a string) to search for, return all - # occurrences of the given tag in an array. Note: only searches the top - # level. - ObjsOfTag = lambda do |doc_ir, tag| - items = [] - GetDocContent[doc_ir].each do |item| - items << item if GetItemTag[item] == tag - end - items - end - - # FirstObjOfTag :: DocIR String -> (Or DocItem nil) - # Given a DocIR Document and a Tag (a string) to search for, return the - # first occurrence of the given tag, a DocItem - # Note: only searches the top level. - FirstObjOfTag = lambda do |doc_ir, tag| - GetDocContent[doc_ir].each do |item| - return item if GetItemTag[item] == tag - end - nil - end - - # MakeEmptyDocMeta :: () -> { unMeta :: EmptyMap } - # Creates an empty document metadata object. Since Ruby doesn't have proper - # immutable objects, it's safer just to make a new one each time with a - # call to this function. - MakeEmptyDocMeta = lambda do - {"unMeta"=>{}} - end - - # MakeDocIr :: (Or DocItem DocSnippet) ?DocMeta -> DocIR - # Given a block DocItem or DocSnippet, create a proper DocIR given an - # optional DocMeta. If no DocMeta is provided, a blank DocMeta will be used - MakeDocIr = lambda do |snippet, meta=nil| - meta = MakeEmptyDocMeta[] if meta.nil? - content = if snippet.class == {}.class - [snippet] - elsif snippet.class == [].class - snippet - else - raise ArgumentError, "unhandled object: #{snippet}" - end - [meta, content] - end - - # DocSnippetToMd :: (Or Nil DocItem DocSnippet) -> MarkdownString - # Given a part of a document (that must be a block element or array of - # block elements), wrap it in such a way that we can create a Markdown - # string from it and return that string. If snippet is nil, returns "" - DocSnippetToMd = lambda do |snippet| - return "" if snippet.nil? - doc = MakeDocIr[snippet] - json_str = JSON.generate(doc) - Run[['-f json'] + STD_MD_OPTS, json_str] - end - - # MakeAttr :: String ?(Array String) ?(Array (Tuple String String)) -> AttrItem - # Creates a new attribute with the given ID (a string), the given classes - # (optional), and the given Array of Key/Value pairs (both strings). Returns - # the AttrItem - MakeAttr = lambda do |id, classes=nil, key_val_pairs=nil| - classes = [] if classes.nil? - key_val_pairs = [] if key_val_pairs.nil? - [id, classes, key_val_pairs] - end - - # StrItem :: String -> StrItem - # Creates a new string item. The String passed in should NOT contain - # any spaces or special markup. It should essentially be just one - # word or token. Returns the new StrItem for the given text. - StrItem = lambda do |text| - {"t"=>"Str", - "c"=>text} - end - - # SpaceItem :: () -> SpaceItem - # Creates and returns a new SpaceItem - SpaceItem = lambda do - {"t"=>"Space", - "c"=>[]} - end - - # StrToDocItems :: String -> (Array DocItem) - # Turns a string into an array of Str and Space DocInline items - StrToDocItems = lambda do |s| - items = [] - toks = s.split(/ /) - num_toks = toks.length - cnt = 0 - toks.each do |tok| - items << StrItem[tok] - cnt += 1 - items << SpaceItem[] unless cnt == num_toks - end - items - end - - # MakeHeaderItem :: Int (Array DocInline) ?Attr -> HeaderItem - # Create a header item given the header level, the header content - # as an Array of DocInline, and an optional Attr object. Returns - # the HeaderItem specified. - MakeHeaderItem = lambda do |level, inlines, attr=nil| - {"t"=>"Header", - "c"=>[level, - if attr.nil? then MakeAttr[SecureRandom.uuid] else attr end, - inlines]} - end - - # MakePara :: (Array DocInline) -> DocPara - # Create a paragraph from an array of inlines - MakePara = lambda do |inlines| - {"t"=>"Para", - "c"=>inlines} - end - - # HeaderText :: DocHeader -> (Array DocInline) - # Given a DocHeader, extract and return an array of DocInline items - HeaderText = lambda do |h| - h["c"][2] - end - - # Tree (Fn Tag Content State -> Result) State -> Tree - # Walk a tree, applying an action to every object and keeping a state. - # Returns the modified tree. - Walk = lambda do |x, f, state| - if x.class == [].class - array = [] - x.each do |item| - if (item.class == {}.class && item.include?('t')) - res = f.call(item['t'], item['c'], state) - if res.nil? - array << Walk.call(item, f, state) - elsif res.class == [].class - res.each {|z| array << Walk.call(z, f, state)} - else - array << Walk.call(res, f, state) - end - else - array << Walk.call(item, f, state) - end - end - state[:out] = array unless state.include? :out - array - elsif x.class == {}.class - obj = {} - x.keys.each do |k| - obj[k] = Walk.call(x[k], f, state) - end - obj - else - x - end - end - - # DocIR -> Int - # Given a DocIR document, return the minimum heading - # level found within that document. If no headers exist, returns nil - MinHeadingLevel = lambda do |doc| - f = lambda do |tag, content, state| - if tag == "Header" - header_level = content[0] - if state[:min_header_level].nil? or (header_level < state[:min_header_level]) - state[:min_header_level] = header_level - end - end - nil - end - state = {min_header_level: nil} - Walk.call(doc, f, state) - state.fetch(:min_header_level) - end - - # (Or DocItem DocInline DocSnippet DocIR) Int -> - # (Or DocItem DocInline DocSnippet DocIR) - # Return a document with heading level adjusted by the given amount for - # every heading level encountered - AdjustHeading = lambda do |doc, adjustment| - return doc if adjustment == 0 - f = lambda do |tag, content, state| - if tag == "Header" - header_level = content[0] - new_header_level = header_level + adjustment - new_content = [new_header_level] + content[1..-1] - {"t" => "Header", "c" => new_content} - else - nil - end - end - Walk.call(doc, f, {}) - end - - # DocIR -> DocIR - # - # Make it so the lowest heading number in a markdown file is 1 by moving - # each heading's level by 1 - (min headingLevels) - NormalizeHeadings = lambda do |doc| - min_heading = MinHeadingLevel[doc] - desired_min_heading = 1 - heading_adjust = desired_min_heading - min_heading - AdjustHeading[doc, heading_adjust] - end - - # MarkdownString (Array Int) Bool -> - # (Record slug: String, level: Int, doc: RubyJSON) - # - # Given a string of markdown, split it by the heading levels given in the - # heading_levels array, and name the new split files according to the top - # level heading in each file. Returns a map (record) with symbol keys: slug, - # level, and doc where slug is the slugified name of the first heading (title - # if missing), level is the heading level of the split document, and doc is - # the actual document as RubyJSON datastructures - # - # Note: normalizes heading levels if normalize_headings set to true - SplitMdByHeadingLevels = lambda do |md_str, heading_levels, normalize_headings=true| - verbose = false - doc_ir = JSON.parse(MdToJson[md_str]) - docs = SplitJsonByHeadingLevel.call(doc_ir, heading_levels) - slug_set = Set.new - docs.map do |x| - h = FirstObjOfTag.call(x, "Header") - if h.nil? - txt = "title" - else - txt = DocSnippetToMd.call(MakePara.call(HeaderText.call(h))) - .gsub(/<[^>]*>/, ' ').gsub(/[^a-zA-Z0-9]/, ' ').strip - end - slug = Slug::CreateUnique.call(Slug::SlugifyName.call(txt), slug_set) - slug_set << slug - xx = if normalize_headings then NormalizeHeadings.call(x) else x end - new_doc = JsonToMd.call(xx) - level = if h.nil? then 1 else GetHeaderLevel.call(h) end - puts "#{slug} (#{level})" if verbose - puts "... original header: #{txt}" if verbose - puts "... doc: #{new_doc[0..80].inspect}" if verbose - {slug: slug, level: level, doc: new_doc} - end - end - - # DocIR -> MarkdownString - # Use Pandoc to convert a DocIR to MarkdownString. Converts the DocIR to - # a JsonString and feeds that into Pandoc using the standard pandoc options - # defined in STD_MD_OPTS - JsonToMd = lambda do |doc_ir| - json_str = JSON.generate(doc_ir) - begin - Pandoc::Run.call(['-f json'] + STD_MD_OPTS, json_str) - rescue - puts "Error running JsonToMd over:\n#{json_str[0..1200]}" - raise - end - end - - # ContentObject ?String -> String - # Given the content field of a JSON representation of a document, tunnel - # through until all content has been reduced to a string. - FlattenToString = lambda do |content, s=nil| - s ||= "" - if content.class == [].class - content.inject(s) do |new_s, c| - FlattenToString[c, new_s] - end - elsif content.class == {}.class - if content["t"] == "Space" - s + " " - elsif content["t"] == "Str" - s + content["c"] - elsif content["t"] == "SoftBreak" - s + " " - else - FlattenToString[content["c"], s] - end - elsif content.class == "".class - s += "" - else - s - end - end -end diff --git a/doc/lib/probes.rb b/doc/lib/probes.rb deleted file mode 100644 index d276e47c7..000000000 --- a/doc/lib/probes.rb +++ /dev/null @@ -1,130 +0,0 @@ -require 'yaml' -require 'fileutils' -require_relative 'tables' -require_relative 'utils' - -module Probes - class BuildProbesAndCopyIntoManifest - def initialize(config=nil) - @disable = config.fetch('disable?', false) - if !@disable - @probes_dir = config.fetch('probes-build-dir') - @out_dir = config.fetch('output-dir') - @insert_after = config.fetch('insert-after-file') - Utils::EnsureAllExist[[@probes_dir, @out_dir]] - @probes_input = config.fetch('path-to-probes-input') - @probes = YAML.load_file(@probes_input) - @probes_in_one_file = config.fetch('probes-in-one-file?', false) - probes_main = File.join(@probes_dir, 'probes.md') - if @probes_in_one_file - @probes_paths = [[nil, probes_main]] - write_probes_to_one_file(@probes_paths[0][1]) - else - @probes_paths = [[nil, probes_main]] - @probes.keys.sort_by {|k| k.downcase}.each do |k| - k_dc = k.downcase - @probes_paths << [k, File.join(@probes_dir, "probe_#{k_dc}.md")] - end - write_probes_to_files(@probes_paths) - end - end - end - # INPUTS: - # k: String, the probe key into @probes - # f: open file handle, note: this method does NOT open/close - # RETURNS: nil - # SIDE-EFFECT: Writes a probe table to the given file handle - # Note: if @probes[k][:fields] is empty, returns without writing file - def write_probe_table(k, f) - table = [["Name", "Input?", "Runtime?", "Type", "Variability", "Description"]] - flds = @probes[k][:fields] - return if flds.empty? - name = k - array_txt = if @probes[k][:array] then "[1..]" else "" end - title = "#{name}" - full_title = "\\@#{name}#{array_txt}." - owner = @probes[k][:owner] - owner_txt = if owner == "--" then "" else " (owner: #{owner})" end - tag = "\{#p_#{k.downcase}\}" - f.write("## #{title}#{owner_txt} #{tag}\n\n") - f.write("#{full_title}\n\n") - if @probes[k].include?(:description) - f.write(@probes[k][:description] + "\n\n") - end - flds.each do |fld| - table << [ - fld[:name], - if fld[:input] then "X" else "--" end, - if fld[:runtime] then "X" else "--" end, - fld[:type], - fld[:variability], - fld.fetch(:description, "--").gsub(/\\/, "") - ] - end - f.write(Tables::WriteTable[ table, true ]) - f.write("\n\n\n") - end - # INPUTS: - # - path: String, path to write probe tables to - # RETURNS: nil - # SIDE-EFFECT: Writes probe data to the given file-system location - def write_probes_to_one_file(path) - File.open(path, 'w') do |f| - f.write("# Probe Definitions\n\n") - @probes.keys.sort_by {|k| k.downcase}.each do |k| - write_probe_table(k, f) - end - end - end - # INPUTS: - # - keys_and_paths:: (Array (Tuple String String)), an array of 2-element - # arrays with first element the key into @probes and the second element the - # path corresponding to where that probe's info should be written - # RETURN: nil - # SIDE-EFFECT: Writes probe files to each table - def write_probes_to_files(keys_and_paths) - keys_and_paths.each do |k_p| - k, p = k_p - File.open(p, 'w') do |f| - if k.nil? - f.write("# Probe Definitions\n\n") - else - write_probe_table(k, f) - end - end - end - end - # INPUTS: - # - manifest: (Array String), an array of paths - # RETURNS: (Array String), the (possibly modified) manifest - def call(manifest) - if @disable - manifest - else - new_manifest = [] - manifest.each do |path| - bn = File.basename(path) - out_path = File.join(@out_dir, bn) - new_manifest << out_path - Utils::CopyIfStale[path, out_path] - if bn == @insert_after - @probes_paths.each do |k_p| - p = k_p[1] - probes_out_path = File.join(@out_dir, File.basename(p)) - new_manifest << probes_out_path - Utils::CopyIfStale[p, probes_out_path] - end - end - end - new_manifest - end - end - # INPUTS: - # - manifest: (Array String), an array of paths - # RETURNS: (Array String), the (possibly modified) manifest - # Note: alias for call(manifest) - def [](manifest) - call(manifest) - end - end -end diff --git a/doc/lib/section_index.rb b/doc/lib/section_index.rb deleted file mode 100644 index 66ca2d813..000000000 --- a/doc/lib/section_index.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'yaml' - -require_relative 'md' -require_relative 'slug' - -module SectionIndex - # (Array FilePath) -> (Map Tag File) - Generate = lambda do |manifest| - idx = {} - n_ = 0 - m_ = 0 - manifest.each do |path| - n_ += 1 - bn = File.basename(path, '.md') + ".html" - content = File.read(path) - content.lines.map(&:chomp).each do |line| - if line =~ /^#+\s+(.*)$/ - m_ += 1 - _, slug = MD::NameAndSlug[line] - final_slug = "#" + slug - idx[final_slug] = bn unless idx.include?(final_slug) - end - end - end - #puts("Processed #{n_} files, #{m_} sections") - idx - end -end - -if false - THIS_DIR = File.expand_path(File.dirname(__FILE__)) - File.write( - "section-index.yaml", - SectionIndex::Generate[ - Dir[File.expand_path("../src/*.md", THIS_DIR)] + - Dir[File.expand_path("../src/records/*.md", THIS_DIR)] - ].to_yaml - ) -end diff --git a/doc/lib/slug.rb b/doc/lib/slug.rb deleted file mode 100644 index 039bdf0d2..000000000 --- a/doc/lib/slug.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Slug - Slugify = lambda do |s| - val = s.strip.downcase - .gsub(/^[\d\.\s]*/, '') - .gsub(/[:)(\/\[\]]/, '') - .gsub(/---/, '') - .gsub(/--/, '') - .gsub(/[^\.\w-]+/, '-') - .gsub(/^-+/, '') - .gsub(/-+$/, '') - if val == '' - 'section' - else - val - end - end -end diff --git a/doc/lib/split_md.rb b/doc/lib/split_md.rb deleted file mode 100644 index b416cf03f..000000000 --- a/doc/lib/split_md.rb +++ /dev/null @@ -1,46 +0,0 @@ -# This is a utility script used to split the monolithic CSE User Manual into -# smaller files. -require_relative 'pandoc' -require_relative 'slug' -require 'json' - -THIS_DIR = File.expand_path(File.dirname(__FILE__)) - -def split_file_by(fname, levels=nil) - levels ||= [1] - src = File.expand_path( - File.join('..', 'src', fname), - THIS_DIR - ) - md = File.read(src, :encoding=>"UTF-8") - json = Pandoc::MdToJson[md] - doc = JSON.parse(json) - sections = Pandoc::SplitJsonByHeadingLevel[doc, levels] - sections.each do |section| - normalized_section = Pandoc::NormalizeHeadings[section] - snippet = Pandoc::DocSnippetToMd[ - Pandoc::FirstObjOfTag[normalized_section, "Header"] - ] - name = Slug::Slugify[snippet.match(/^#+\s+(.*)$/)[1]] - path = File.expand_path(File.join('..', 'src', "#{name}.md"), THIS_DIR) - if File.exist?(path) - puts("Warning! #{path} would be overwritten! Skipping...") - else - File.write(path, Pandoc::JsonToMd[normalized_section]) - end - end -end - -# This file can be used as a script to split markdown files. However, this -# scripting functionality is not enabled by default. -if false - puts("Ready...") - split_file_by('cse-user-manual.md', [1]) - split_file_by('input-data.md', [1, 2]) - split_file_by('top-members.md', [1, 2]) - split_file_by('construction.md', [1, 2]) - split_file_by('zone.md', [1, 2]) - split_file_by('heatplant.md', [1, 2]) - split_file_by('coolplant.md', [1, 2]) - puts("Done!") -end diff --git a/doc/lib/table.rb b/doc/lib/table.rb deleted file mode 100644 index d85525554..000000000 --- a/doc/lib/table.rb +++ /dev/null @@ -1,318 +0,0 @@ -# Problem we're trying to solve: -# - Markdown ascii tables are hard to write and maintain -# - Existing tables do not (always) generate correctly in PDF -require 'erb' -require 'set' -require 'csv' - -module Table - ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')) - CheckKeys = lambda do |expected_keys, args| - unexpected_keys = Set.new(args.keys) - expected_keys - if not unexpected_keys.empty? - raise "Unexpected keys: #{unexpected_keys.to_a}" - end - end - # String -> (Map String String) -> Binding - MakeBinding = lambda do |base_path=nil| - lambda do |ctxt| - Main.new(:context => ctxt, :base_path => base_path).get_binding - end - end - # The Main class's responsibility is to serve as the binding context for - # an ERB template rendering. As such, it must expose the methods that - # correspond to the table language and, additionally, it must be able - # to define methods corresponding to /doc/config.yaml context variables. To - # allow for the possibility of different "back end" targets, there are stubs - # for HTML, LaTeX, and Markdown backends. For now, we just transform our - # table language to Markdown and let the markdown toolchain transform to HTML - # and/or LaTeX. - class Main - def initialize(args=nil) - @_verbose = false - args = args || {} - expected_keys = Set.new( - [:writer, :base_path, :allow_shadowing, :context]) - CheckKeys.(expected_keys, args) - @writer = args.fetch(:writer, MdWriter.new) - @base_path = args.fetch(:base_path, nil) - # if true, context can overwrite some or all method names - @allow_shadowing = args.fetch(:allow_shadowing, true) - local_methods = methods - args.fetch(:context, {}).each do |k, v| - sym = k.to_sym - if local_methods.include?(sym) - msg = "Key \"#{k}\" will be shadowed by a local method" - if @allow_shadowing - puts "WARNING! #{msg}" if @_verbose - else - raise ArgumentError, msg - end - end - define_singleton_method(sym) { v } - end - end - def get_binding - binding - end - def csv_table(csv_str, opts=nil) - opts = opts || {} - expected_keys = Set.new([:row_header, :col_header]) - CheckKeys.(expected_keys, opts) - cells = CSV.new(csv_str).read - @writer.array_of_array_to_table(cells, opts) - end - def csv_table_from_file(csv_path, opts=nil) - path = if @base_path then File.join(@base_path, csv_path) else csv_path end - csv_str = File.read(path) - csv_table(csv_str, opts) - end - def member_table(args) - expected_keys = Set.new([:units,:legal_range,:default,:required,:variability]) - CheckKeys.(expected_keys, args) - @writer.member_table(args) - end - def insert_file(file_path) - full_path = File.join(ROOT_DIR, file_path) - if File.exist?(full_path) - File.read(full_path) - else - msg = ("Path '#{file_path}' doesn't exist. " + "resolved full-path: '#{full_path}'") - raise IOError.new(msg) - end - end - end - - class HtmlWriter - def array_of_array_to_table(cells, opts=nil) - opts = opts || {} - row_header = opts.fetch(:row_header, true) - col_header = opts.fetch(:col_header, false) - table_str = "\n" - cells.each_with_index do |line, row_idx| - if row_header and row_idx == 0 - table_str += "\n" - elsif row_header and row_idx == 1 - table_str += "\n" - end - attr_str = if row_header and row_idx == 0 then ' class="header"' else '' end - table_str += "\n" - line.each_with_index do |col, col_idx| - if row_header and row_idx == 0 - table_str += "\n" - elsif col_header and col_idx == 0 - table_str += "\n" - else - table_str += "\n" - end - end - table_str += "\n" - if row_header and row_idx == 0 - table_str += "\n" - end - end - if row_header - table_str += "\n" - end - table_str += "
\n#{col}\n\n\n#{col}\n\n#{col}\n
\n" - table_str - end - def member_table(args) - nil_mark = "—" - units= args.fetch(:units, nil_mark) - legal_range = args.fetch(:legal_range, nil_mark) - default = args.fetch(:default, nil_mark) - required= args.fetch(:required, "No") - variability=args.fetch(:variability, "constant") - "\n" + - "\n" + - "\n" + - ["Units","Legal Range","Default","Required","Variability"].map do |c| - "\n" - end.join("") + - "\n" + - "\n" + - "\n" + - "\n" + - [units, legal_range, default, required, variability].map do |c| - "\n" - end.join("") + - "\n" + - "\n" + - "
\n#{c}\n\n
#{c}\n
\n" - end - end - - class LatexWriter - def array_of_array_to_table - end - def member_table - end - end - - class MdWriter - def initialize(args=nil) - args = args || {} - @intercol_space = args.fetch(:intercol_space, 1) - @max_width = args.fetch(:max_width, 70) - end - def min_column_widths(table) - min_widths = [2] * table[0].length - table.each do |row| - row.each_with_index do |cols, idx| - words = cols.split - longest_word = words.map {|w| w.length}.max - longest_word = 0 if longest_word.nil? - min_widths[idx] = [longest_word, min_widths.fetch(idx, 2)].max - end - end - min_widths - end - def max_column_widths(table) - max_widths = [0] * table[0].length - table.each do |row| - row.each_with_index do |col, idx| - if not col.match(/^-+$/) - max_widths[idx] = [col.length, max_widths.fetch(idx, 0)].max - end - end - end - max_widths - end - def col_widths(mins, maxs) - num_cols = mins.length - spacing = 2 * (num_cols - 1) - minimum_max_width = (mins.inject(0, &:+) + spacing) - the_max_width = if minimum_max_width > @max_width then minimum_max_width else @max_width end - extra_space = the_max_width - minimum_max_width - total_max = maxs.inject(0, &:+).to_f - width_fracs = maxs.map {|m| m / total_max} - extra_space_alloc = width_fracs.map {|w| (w * extra_space).to_i} - widths = mins.zip(extra_space_alloc).map {|m,e| m+e} - widths - end - def write_header(widths) - cols = [] - widths.each do |w| - cols << ('-' * w) - end - cols.join(' '*@intercol_space) - end - def write_footer(widths) - num_cols = widths.length - spacing = 2 * (num_cols - 1) - width = widths.inject(0, &:+) - '-' * (width + spacing) - end - # String Number -> (Array String) - def chunk_col(col, width) - words = col.split - first_word = true - len = 0 - chunks = [] - chunk = [] - words.each do |w| - if first_word - first_word = false - len += w.length - else - len += w.length + 1 - end - if len > width - chunks << chunk - len = w.length - chunk = [w] - else - chunk << w - end - end - chunks << chunk unless chunk.empty? - chunks.map {|c| c.join(" ")} - end - # (Array String) (Array Number) -> String - def write_row(cols, widths) - col_chunks = [] - num_lines = 0 - cols.each_with_index do |col, idx| - the_chunk = chunk_col(col, widths[idx]) - col_chunks << the_chunk - num_lines = [the_chunk.length, num_lines].max - end - lines = [""] * num_lines - num_cols = widths.length - num_lines.times do |line_idx| - #puts "line index: #{line_idx}" - col_chunks.each_with_index do |chunks, col_idx| - #puts "column index: #{col_idx}" - cm = if col_idx == (num_cols - 1) - 0 - else - 1 - end - if chunks.length > line_idx - makeup_space = [widths[col_idx] - chunks[line_idx].length, 0].max - lines[line_idx] += chunks[line_idx] + " " * makeup_space + " " * (@intercol_space * cm) - else - lines[line_idx] += " " * widths[col_idx] + " " * (@intercol_space * cm) - end - end - end - lines.join("\n") - end - def write_content(table, widths) - content = [] - table.each do |row| - content << write_row(row, widths) - end - content.join("\n\n") - end - def write_table(table) - mins = min_column_widths(table) - maxs = max_column_widths(table) - widths = col_widths(mins, maxs) - hdr = write_header(widths) - [ - hdr, - write_content(table, widths), - hdr - ].join("\n") - end - def write_border_line(widths) - "-"*(widths.inject(0,&:+) + (widths.length - 1)*@intercol_space) - end - def write_table_with_header(table) - mins = min_column_widths(table) - maxs = max_column_widths(table) - widths = col_widths(mins, maxs) - bl = write_border_line(widths) - [ - bl, - write_content([table[0]], widths), - write_header(widths), - write_content(table[1..-1], widths), - bl, - ].join("\n") - end - def array_of_array_to_table(cells, opts=nil) - opts = opts || {} - row_header = opts.fetch(:row_header, true) - if row_header - write_table_with_header(cells) - else - write_table(cells) - end - end - def member_table(args) - nil_mark = "--" - units= args.fetch(:units, nil_mark) - legal_range = args.fetch(:legal_range, nil_mark) - default = args.fetch(:default, nil_mark) - required= args.fetch(:required, "No") - variability=args.fetch(:variability, "constant") - headers = ["**Units**","**Legal** **Range**","**Default**","**Required**","**Variability**"] - content = [units, legal_range, default, required, variability] - table = [headers, content] - write_table_with_header(table) - end - end -end diff --git a/doc/lib/tables.rb b/doc/lib/tables.rb deleted file mode 100644 index 56f6537c9..000000000 --- a/doc/lib/tables.rb +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright (c) 1997-2016 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. - -module Tables - INTERCOL_SPACE = 2 - PAGE_MAX_COLS = 80 - - TxtToTable = lambda do |txt| - table = [] - txt.split(/\n/).each do |row| - next if row == "" - row = row.strip - cols = row.split(/\|/) - cols.map! {|c| c.strip} - table << cols - end - table - end - - MinColumnWidths = lambda do |table| - min_widths = [2] * table[0].length - table.each do |row| - row.each_with_index do |cols, idx| - words = cols.split - longest_word = words.map {|w| w.length}.max - longest_word = 0 if longest_word.nil? - min_widths[idx] = [longest_word, min_widths.fetch(idx, 2)].max - end - end - min_widths - end - - MaxColumnWidths = lambda do |table| - max_widths = [0] * table[0].length - table.each do |row| - row.each_with_index do |col, idx| - if not col.match(/^-+$/) - max_widths[idx] = [col.length, max_widths.fetch(idx, 0)].max - end - end - end - max_widths - end - - ColWidths = lambda do |mins, maxs| - num_cols = mins.length - spacing = 2 * (num_cols - 1) - extra_space = PAGE_MAX_COLS - (mins.inject(0, &:+) + spacing) - extra_space = 0 if extra_space < 0 - total_max = maxs.inject(0, &:+).to_f - width_fracs = maxs.map {|m| m / total_max} - extra_space_alloc = width_fracs.map {|w| (w * extra_space).to_i} - widths = mins.zip(extra_space_alloc).map {|m,e| m+e} - widths - end - - WriteHeader = lambda do |widths| - cols = [] - widths.each do |w| - cols << ('-' * w) - end - cols.join(' ') - end - - WriteFooter = lambda do |widths| - num_cols = widths.length - spacing = 2 * (num_cols - 1) - width = widths.inject(0, &:+) - '-' * (width + spacing) - end - - # String Number -> (Array String) - ChunkCol = lambda do |col, width| - words = col.split - first_word = true - len = 0 - chunks = [] - chunk = [] - words.each do |w| - if first_word - first_word = false - len += w.length - else - len += w.length + 1 - end - if len > width - chunks << chunk - len = w.length - chunk = [w] - else - chunk << w - end - end - chunks << chunk unless chunk.empty? - chunks.map {|c| c.join(" ")} - end - - # (Array String) (Array Number) -> String - WriteRow = lambda do |cols, widths| - col_chunks = [] - num_lines = 0 - cols.each_with_index do |col, idx| - the_chunk = ChunkCol[col, widths[idx]] - col_chunks << the_chunk - num_lines = [the_chunk.length, num_lines].max - end - lines = [""] * num_lines - num_cols = widths.length - num_lines.times do |line_idx| - #puts "line index: #{line_idx}" - col_chunks.each_with_index do |chunks, col_idx| - #puts "column index: #{col_idx}" - cm = if col_idx == (num_cols - 1) then 0 else 1 end - if chunks.length > line_idx - makeup_space = [widths[col_idx] - chunks[line_idx].length, 0].max - lines[line_idx] += chunks[line_idx] + " " * makeup_space + " " * (INTERCOL_SPACE * cm) - else - lines[line_idx] += " " * widths[col_idx] + " " * (INTERCOL_SPACE * cm) - end - end - end - lines.join("\n") - end - - WriteContent = lambda do |table, widths| - content = [] - table.each do |row| - content << WriteRow[row, widths] - end - content.join("\n\n") - end - - WriteTable = lambda do |table, header=false| - mins = MinColumnWidths[table] - maxs = MaxColumnWidths[table] - widths = ColWidths[mins, maxs] - parts = [] - if header - parts << WriteFooter[widths] - parts << WriteContent[[table[0]], widths] - parts << WriteHeader[widths] - parts << WriteContent[table[1..-1], widths] - parts << WriteFooter[widths] - else - parts << WriteHeader[widths] - parts << WriteContent[table, widths] - parts << WriteFooter[widths] - end - parts.join("\n") - end - - Main = lambda do |txt| - table = TxtToTable[txt] - WriteTable[table] - end - - #example = < Binding - MakeBinding = lambda do |ctxt| - Namespace.new(ctxt).get_binding - end - - # String Binding -> String - # Render the given string template with Embedded Ruby (ERB) using the binding - # context passed in by the second parameter. - # See http://stackoverflow.com/a/5462069 - RenderWithErb = lambda do |template, b| - result = nil - begin - # Ruby 2.6+ - # the rescue block form is deprecated... - result = ERB.new(template,trim_mode:'>').result(b) - rescue - # Ruby prior to 2.6 - result = ERB.new(template,0,'>').result(b) - end - result - end - - # String String Int (Map String String) -> nil - # Given a source file path, an output file path (assumed to be created up to - # the parent directory), an integer for the processing file number (not - # used), and a context hash to create a binding context for template - # rendering, process the input file to the output file and save. - PreprocFile = lambda do |fn=MakeBinding| - lambda do |path, out_path, _, config| - b = fn[config.fetch("context")] - text = File.read(path) - result = RenderWithErb[text, b] - last_result = nil - max_iterations = 10 - max_iterations.times do - last_result = result - result = RenderWithErb[result, b] - break if result == last_result - end - File.write(out_path, result) - end - end -end diff --git a/doc/lib/toc.rb b/doc/lib/toc.rb deleted file mode 100644 index 1dcc29f8e..000000000 --- a/doc/lib/toc.rb +++ /dev/null @@ -1,104 +0,0 @@ -# Generate Table of Contents -require 'yaml' -require 'set' -require_relative 'md' -require_relative 'slug' -require_relative 'lineproc' - -module TOC - # TocData String -> TocData - # where TocData = (spec/keys :req [:file_url :contents]) - # (spec/def :contents (spec/cat :level :name :link)) - # (spec/def :file_url string?) - # (spec/def :level integer?) - # (spec/def :name string?) - # (spec/def :link string?) - TocReducer = lambda do |toc, line| - if MD::SelectHeader[line] - level = line.match(/^#+/).to_s.length - name, slug = MD::NameAndSlug[line] - final_slug = slug - idx = 1 - while toc[:slug_set].include?(final_slug) - final_slug = "#{slug}-#{idx}" - idx += 1 - end - toc[:slug_set] << final_slug - src_basename = File.basename(toc[:file_url]) - ext = File.extname(src_basename) - file_url = src_basename.gsub(ext, '.html') - link = file_url + "##{final_slug}" - new_contents = toc[:contents] + [[level, name, link]] - if name.strip == '' - # we have a 'blank' header... don't bother recording it - toc - else - toc.merge({:contents => new_contents}) - end - else - toc - end - end - - # Integer (Array (Tuple Integer FilePath)) -> String - # Generate the table of contents file from an integer specifying the maximum - # level of depth and an array of tuples of file level and file path. Returns - # a string of the table of contents markdown file. - GenTableOfContentsFromFiles = lambda do |max_level, files| - r = TocReducer - init = {:contents=>[], :slug_set=>Set.new} - toc = LineProc::ReduceOverFiles[ - files.map {|f| f[1]}, - init, - r, - [[//m, '']] - ] - out = "" - last_level0 = 1 - idx0 = 0 - last_fname0 = toc[:contents][0][2].gsub(/\#.*$/,'') - toc[:contents].inject([last_level0, idx0, last_fname0]) do |s, c| - last_level = s[0] - # remove {#foo} at the end of headers - name = c[1].gsub(/{[^}]*}\Z/, '').strip - url = c[2] - fname = url.gsub(/\#.*$/, '') - last_fname = s[2] - idx = if fname==last_fname then s[1] else s[1]+1 end - file_level = files[idx][0] - # level is the minimum of the actual header level or one more than - # the last level -- prevents jumps in indentation of more than one - # unit - level = [c[0] + file_level, last_level + 1].min - if level <= max_level - indent = (' ' * ((level - 1) * 4)) + '- ' - out += indent + "[#{name}](#{url})\n" - end - [level, idx, fname] - end - out - end - - # Integer FilePath FilePath -> Nil - # Generate a Table of Contents (TOC) for a Markdown Document - # - *max_level*: Integer >= 1, the maximum header depth to use in TOC - # - *manifest_path*: String, path to the manifest file in YAML - # - *toc_path*: String, path to the table of contents file to write out in markdown - GenTableOfContents = lambda do |max_level, manifest_path, toc_path| - man_dir = File.dirname(manifest_path) - data = YAML.load_file(manifest_path) - fs = data.fetch('sections', []) - puts "Warning!!! No files in manifest at #{manifest_path}" if fs.empty? - # make level 0-based to ease algorithm below; - # expand file path to full path from the manifest directory - files = fs.map {|level, path| [level - 1, File.expand_path(path, man_dir)]} - File.write(toc_path, GenTableOfContentsFromFiles[max_level, files]) - end -end - -if false - THIS_DIR = File.expand_path(File.dirname(__FILE__)) - MAN_PATH = File.expand_path(File.join('..','src','cse-user-manual.yaml'), THIS_DIR) - TOC_PATH = File.join(THIS_DIR, 'junk-toc.md') - TOC::GenTableOfContents[3, MAN_PATH, TOC_PATH] -end diff --git a/doc/lib/utils.rb b/doc/lib/utils.rb deleted file mode 100644 index 2f8545446..000000000 --- a/doc/lib/utils.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'fileutils' - -module Utils - # String -> nil - # Ensures the given path (a directory) exists - EnsureExists = lambda do |path| - FileUtils.mkdir_p(path) unless File.exist?(path) - end - - # (Array String) -> nil - # Ensures that all of the given paths exist. - EnsureAllExist = lambda do |paths| - paths.each {|p| EnsureExists[p]} - end - - CopyIfStale = lambda do |from_path, to_path| - if !FileUtils.uptodate?(to_path, [from_path]) - FileUtils.cp(from_path, to_path) - end - end -end diff --git a/doc/lib/verify_links.rb b/doc/lib/verify_links.rb deleted file mode 100644 index 345fc7654..000000000 --- a/doc/lib/verify_links.rb +++ /dev/null @@ -1,88 +0,0 @@ -require 'net/http' -# TODO: update verifylinks to check #target links in multi-page HTML. - -module VerifyLinks - # Problem: links don't always work in generated documentation due to a large - # number of reasons. We would like to be able to confirm all links are valid - # within a generated HTML document. - - # String -> Bool - # See http://stackoverflow.com/a/18582395 - UrlGood = lambda do |url_string| - begin - url = URI.parse(url_string) - req = Net::HTTP.new(url.host, url.port) - req.use_ssl = (url.scheme == 'https') - path = url.path unless url.path == "" - res = req.request_head(path || '/') - if res.kind_of?(Net::HTTPRedirection) - # Go after any redirect and make sure you can access the redirected URL - url_exist?(res['location']) - else - res.code[0] != "4" #false if http code starts with 4 - error on your side. - end - rescue Errno::ENOENT - false #false if can't find the server - end - end - - # String -> (Array String) - GatherLinks = lambda do |text| - text.scan(/href\s*=\s*["']([^"']*)["']/).flatten - end - - # (Array String) String String -> (Array String) - LinkIssues = lambda do |links, path, root, display=true| - dir = if File.directory?(path) then path else File.dirname(path) end - problems = [] - links.each do |link| - good = true - if link.start_with?("http") - # calling urls with Ruby via SSL not robust on windows... - # skipping the check below for now... - if false # !UrlGood[link] - problems << link - good = false - end - else - file_path, id = link.split(/#/) - full_path = if file_path.start_with?("/") then File.join(root, file_path) else File.join(dir, file_path) end - exist = File.exist?(full_path) - if !exist - problems << "#{link} doesn't exist" - good = false - end - if id and exist and File.file?(full_path) - txt = File.read(full_path) - if !(txt =~ /id\s*=\s*["']#{id}["']/) - problems << "\"##{id}\" not found in file #{full_path}" - good = false - end - end - end - if display - STDOUT.write(good ? '.' : 'x') - STDOUT.flush - end - end - problems - end - - # String -> (Array String) - # Given the path to an html directory, check all links in all files and - # return an array of all problems - CheckLinks = lambda do |dir| - problems = [] - num_paths = 0 - num_links = 0 - Dir[File.join(dir, '**', '*.html')].each do |path| - links = GatherLinks[File.read(path)] - problems += LinkIssues[links, path, dir].map {|lnk| "Source: #{path}; Issue: #{lnk}"} - num_paths += 1 - num_links += links.length - end - puts("\nChecked #{num_paths} files for a total of #{num_links} links") - puts("#{problems.length} link issues encountered") - problems - end -end diff --git a/doc/lib/xlink.rb b/doc/lib/xlink.rb deleted file mode 100644 index 67a0c8d0e..000000000 --- a/doc/lib/xlink.rb +++ /dev/null @@ -1,440 +0,0 @@ -require 'set' -require_relative 'pandoc' -require_relative 'slug' - -# Below method of program design adapted from "How to Design Programs, 2nd -# Edition": -# http://www.ccs.neu.edu/home/matthias/HtDP2e/part_preface.html#%28part._.Systematic_.Program_.Design%29 -# -# Problem Analysis and Data Definitions -# ------------------------------------- -# -# ### Problem Analysis -# -# The current cross-linking algorithm does not know where it is in a -# markdown-based document. As such, it will link any term that matches criteria -# to its "canonical source link". What we would like is that if a term links to -# the "parent section" of the current documentation (and optionally arbitrarily -# high up the ancestor "path"), then we DO NOT want to cross-link it, otherwise -# we do. This will prevent a new section on Foo from getting multiple links to -# the term "Foo" in the opening paragraph which is just silly and causes visual -# clutter. -# -# The current cross-linking algorithm works but is a fairly large piece of code -# that could use some refactoring. -# -# ### Data Definitions -# -# QuoteType :: (Case "SingleQuote" "DoubleQuote") -# -------------------- -# Types of Quotes -- used in Pandoc JSON -# -# Inline :: (Case -# {'t' => 'Str', 'c' => String} -# {'t' => 'Emph', 'c' => (Array Inline)} -# {'t' => 'Strong', 'c' => (Array Inline)} -# {'t' => 'Strikeout', 'c' => (Array Inline)} -# {'t' => 'Superscript', 'c' => (Array Inline)} -# {'t' => 'Subscript', 'c' => (Array Inline)} -# {'t' => 'SmallCaps', 'c' => (Array Inline)} -# {'t' => 'Quoted', 'c' => (Tuple QuoteType (Array Inline))} -# {'t' => 'Cite', 'c' => (Tuple (Array Citation) (Array Inline))} -# {'t' => 'Code', 'c' => (Tuple Attr String)} -# {'t' => 'Space', 'c' => []} -# {'t' => 'SoftBreak', 'c' => []} -# {'t' => 'LineBreak', 'c' => []} -# {'t' => 'Math', 'c' => (Tuple MathType String)} -# {'t' => 'RawInline', 'c' => (Tuple Format String)} -# {'t' => 'Link', 'c' => (Tuple Attr (Array Inline) Target)} -# {'t' => 'Image', 'c' => (Tuple Attr (Array Inline) Target)} -# {'t' => 'Note', 'c' => (Array Block)} -# {'t' => 'Span', 'c' => (Tuple Attr (Array Inline))}) -# -------------------- -# Types of Inline constructs in Pandoc JSON -# -# RecordIndex :: (Map String String) -# -------------------- -# -# A mapping from the name of a record (e.g., "CONSTRUCTION") to its -# location in the final rendered HTML file including both filename (e.g., -# "construction.html") AND bookmark (e.g., "#construction") -# -# Example: -# { -# "CONSTRUCTION" => "construction.html#construction", -# "DHWDAYUSE" => "dhwdayuse.html#dhwdayuse", -# "DHWHEATER" => "dhwheater.html#dhwheater" -# } -# -# Markdown :: String -# -------------------- -# -# This is just text in Markdown format. -# -# RJson :: Int | String | Bool | Float | (Map RJSON RJSON) | (Array RJSON) -# -------------------- -# -# This is JSON (javascript object notation) represented in Ruby format. -# -# JSON :: String -# -------------------- -# -# A string in JSON format. -# -# SectionPath :: (Array String) -# -------------------- -# -# An array of strings of section headers to identify the section one is in at the moment. -# -# FilePath :: String -# -------------------- -# -# The path to a file. -# -# Manifest :: (Array String) -# -------------------- -# -# An array of full file paths constituting one entire "document". -# -# FileLevel :: PositiveInt -# -------------------- -# -# The level of the file in the overall document hierarchy. A level of "1" -# indicates that there should be no adjustments to the headings in the -# current file. A level of 2 or greater indicates that headings should be -# shifted (FileLevel - 1) positions (i.e., an H1 would become an H3 if -# FileLevel is 3 -- H1 + (3 - 1) = H3) -# -# NoLinkLevels :: NonNegativeInteger -# -------------------- -# -# The number of levels of hierarchy to screen for skipping potential -# "self-links". Set to 0 to get the "link everywhere" behavior. -# -# Signature, Purpose Statement, Header -# ------------------------------------ -# -# ### Signature -# -# XLinkMarkdownNoSelflinks :: (Map String Any) -> -# ((Array String) -> (Array String)) -# The XLinkMarkdownNoSelflinks block is designed to be configured and return a -# closure around a function that takes a manifest of files to process, -# processes them, and returns the manifest of the newly processed files. -# -# OverString :: Markdown FilePath FileLevel NoLinkLevels RecordIndex SectionPath -> (Tuple Markdown SectionPath) -# Given a markdown string, a file path corresponding to the markdown string, -# the file level of the path, the levels to check for no-linking, a record -# index and a section path, cross-link the given markdown string and return -# it along with any updates to the section path. Note: the FilePath has to be -# equivalent to what is used in the values of the RecordIndex. -# -# ### Notes -# -# - make the log a config variable, not a global; although, it could default to -# STDOUT... -# -# Function Examples -# ----------------- -# -# Record Index: -# -# rec_idx = {"STUFF"=>"index.html#stuff","JUNK"=>"index.html#junk"} -# -# SectionPath: -# -# sec_path = [] -# -# Source String, `s`: -# -# # STUFF -# -# There is a lot of STUFF available in the world, including a lot of JUNK. -# -# # JUNK -# -# JUNK is a kind of STUFF. -# -# File name of source string: -# -# file_basename = "index.html" -# -# This would be the result of running the source string through our processor: -# -# out, new_sec_path = OverString[s, file_basename, 1, 1, rec_idx, sec_path] -# -# Contents of `out`: -# -# # STUFF -# -# There is a lot of STUFF available in the world, including a lot of [JUNK](#junk). -# -# # JUNK -# -# JUNK is a kind of [STUFF](#stuff). -# -# Contents of `new_sec_path`: -# -# ["junk"] -# -# Calling with: -# -# out, new_sec_path = OverString[s, "other.html", 1, 1, rec_idx, sec_path] -# -# Would result in `out` as: -# -# # STUFF -# -# There is a lot of [STUFF](index.html#stuff) available in the world, including a lot of [JUNK](index.html#junk). -# -# # JUNK -# -# [JUNK](index.html#junk) is a kind of [STUFF](#stuff). -# -# Contents of `new_sec_path`: -# -# ["junk"] -# -module XLink - # String -> String - # Attempts to remove a plural "s" from a word if appropriate. Note: this is a - # very basic algorithm. - DePluralize = lambda do |word| - if word.end_with?("s") - if word.length > 1 - word[0..-2] - end - else - word - end - end - - # String RJson (Record :rec_idx RecordIndex :rec_name_set (Set String) :sec_path (Array String)) - Walker = lambda do |tag, the_content, state| - g = lambda do |inline| - if inline['t'] == 'Str' - index = state[:rec_idx] - rns = state[:rec_name_set] - word = inline['c'] - word_only = word.scan(/[a-zA-Z:]/).join - word_only_singular = DePluralize[word_only] - if rns.include?(word_only) or rns.include?(word_only_singular) - if index.include?(word_only) or index.include?(word_only_singular) - w = rns.include?(word_only) ? word_only : word_only_singular - state[:num_hits] += 1 - ref = index[w].scan(/(\#.*)/).flatten[0] - {'t' => 'Link', - 'c' => [ - ["", [], []], - [{'t'=>'Str','c'=>word}], - [ref, '']]} - else - puts("WARNING! ObjectNameSet includes #{word_only}|#{word_only_singular}; Index doesn't") - inline - end - else - inline - end - elsif inline['t'] == 'Emph' - new_ins = inline['c'].map(&g) - {'t'=>'Emph', 'c'=>new_ins} - elsif inline['t'] == 'Strong' - new_ins = inline['c'].map(&g) - {'t'=>'Strong', 'c'=>new_ins} - else - inline - end - end - if tag == "Para" - new_inlines = the_content.map(&g) - {'t' => 'Para', - 'c' => new_inlines} - else - nil - end - end - - OverFileOrig = lambda do |path, out_path, idx, config| - content = File.read(path, :encoding=>"UTF-8") - rec_idx_path = config.fetch("record-index-path") - rec_idx = YAML.load_file(rec_idx_path) - rec_name_set = Set.new(rec_idx.keys) - state = { - num_hits: 0, - rec_idx: rec_idx, - rec_name_set: rec_name_set - } - doc = JSON.parse(Pandoc::MdToJson[content]) - new_doc = Pandoc::Walk[doc, Walker, state] - new_content = Pandoc::JsonToMd[new_doc] - LogRun[path, config, state] - File.write(out_path, new_content) - end - - # String (Record "log"? (Or IO Nil) "verbose"? Bool) (Record :num_hits Int) -> Void - # Prints a log to the "log" field of the config variable if exists. If "verbose" field - # is set to true, logs a line stating the number of hits in the given file, otherwise "." - LogRun = lambda do |path, config, state| - log = config.fetch("log", nil) - if config.fetch("verbose", false) and log - log.write("CrossLinked #{File.basename(path)}; #{state[:num_hits]} found\n") - log.flush - elsif log - log.write(".") - log.flush - end - end - - # String RJson (Record :rec_idx RecordIndex :rec_name_set (Set String) :sec_path (Array String)) - # Walker that keeps track of the section it is in - SectionWalker = lambda do |tag, the_content, state| - g = lambda do |inline| - if inline['t'] == 'Str' - index = state[:rec_idx] - rns = state[:rec_name_set] - sp = state[:sec_path] - word = inline['c'] - word_only = word.scan(/[a-zA-Z:]/).join - word_only_singular = DePluralize[word_only] - if rns.include?(word_only) or rns.include?(word_only_singular) - if index.include?(word_only) or index.include?(word_only_singular) - w = rns.include?(word_only) ? word_only : word_only_singular - ref = index[w].scan(/(\#.*)/).flatten[0] - id = index[w] - if InSectionPath[sp, id, state[:nolink_lvl]] - inline - else - state[:num_hits] += 1 - {'t' => 'Link', - 'c' => [ - ["", [], []], - [{'t'=>'Str','c'=>word}], - [ref, '']]} - end - else - puts("WARNING! ObjectNameSet includes #{word_only}|#{word_only_singular}; Index doesn't") - inline - end - else - inline - end - elsif inline['t'] == 'Emph' - new_ins = inline['c'].map(&g) - {'t'=>'Emph', 'c'=>new_ins} - elsif inline['t'] == 'Strong' - new_ins = inline['c'].map(&g) - {'t'=>'Strong', 'c'=>new_ins} - else - inline - end - end - if tag == "Para" - new_inlines = the_content.map(&g) - {'t' => 'Para', - 'c' => new_inlines} - elsif tag == "Header" - sp = state[:sec_path] - h_adj = state[:hdr_adj] - h_lvl, _, inlines = the_content - h_adj = state[:hdr_adj] - slug = Slug::Slugify[InlinesToText[inlines]] - new_sp = UpdateSectionPath[ - sp, - File.basename(state[:file_path],'.*') + '.html' + "#" + slug, - h_lvl + h_adj - ] - state[:sec_path] = new_sp - nil - else - nil - end - end - - InlinesToText_vtable = { - 'Str' => lambda {|c| c}, - 'Emph' => lambda {|c| '*' + InlinesToText[c] + '*'}, - 'Strong' => lambda {|c| '**' + InlinesToText[c] + '**'}, - 'Strikeout' => lambda {|c| '~~' + InlinesToText[c] + '~~'}, - 'Superscript' => lambda {|c| '^' + InlinesToText[c] + '^'}, - 'Subscript' => lambda {|c| '~' + InlinesToText[c] + '~'}, - 'SmallCaps' => lambda {|c| '[' + InlinesToText[c] + ']{style="font-variant:small-caps;"}'}, - 'Quoted' => lambda do |c| - q = (c[0] == "DoubleQuote" ? '"' : "'") - q + InlinesToText[c[1]] + q - end, - 'Space' => lambda {|_| " "}, - } - - # (Array Inline) -> String - # Compute a (markdown) string from an array of inlines - InlinesToText = lambda do |inlines| - out = "" - inlines.each do |inln| - f = InlinesToText_vtable.fetch(inln['t']) - out += f[inln['c']] - end - out - end - - # String (Array String) PositiveInt (Array Inline) -> (Array String) - # Updates the section path given the current file path, the existing section - # path, the header level, and the header text - UpdateSectionPath = lambda do |sec_path, id, lvl| - new_sp = [] - 0.upto(lvl).each do |idx| - if idx == (lvl - 1) - new_sp << id - break - else - new_sp << sec_path[idx] - end - end - new_sp - end - - # (Array String) String NonNegativeInt -> Bool - # Return true if `id` is in the first `search_levels` of section path, else false. - InSectionPath = lambda do |sec_path, id, search_levels| - p = sec_path.reverse.take(search_levels) - p.include?(id) - end - - # Markdown FilePath FileLevel NoLinkLevel RecordIndex SectionPath -> (Tuple Markdown SectionPath) - # Add cross-linking to the given file and return. Don't cross-link when link - # goes to a header in the direct path of the current location up to - # NoLinkLevels up the ancestor chain. - OverString = lambda do |md_str, path, hdr_lvl, nolink_lvl, rec_idx, sec_path| - rjson = JSON.parse(Pandoc::MdToJson[md_str]) - state = { - num_hits: 0, - rec_idx: rec_idx, - rec_name_set: Set.new(rec_idx.keys), - hdr_adj: (hdr_lvl - 1), - nolink_lvl: nolink_lvl, - sec_path: sec_path.dup, - file_path: path - } - new_rjson = Pandoc::Walk[rjson, SectionWalker, state] - new_md_str = Pandoc::JsonToMd[new_rjson] - [new_md_str, state[:sec_path], state[:num_hits]] - end - - # FilePath FilePath Int (Record "record-index-path" String - # "section-path"? (Array String) "levels" (Array Int) "nolinklevel" Int - # "verbose"? Bool "log"? IO) -> Void - # Assume that path is in the format to correspond to paths in config record-index - OverFile = lambda do |path, out_path, idx, config| - rec_idx_path = config.fetch("record-index-path") - rec_idx = YAML.load_file(rec_idx_path) - sec_path = config.fetch("section-path", []) - nolink_level = config.fetch("nolinklevel", 1) - levels = config.fetch("levels", nil) - level = if levels.nil? then 1 else levels[idx] end - md, new_sp, num_hits = OverString[ - File.read(path), path, level, nolink_level, rec_idx, sec_path - ] - config["section-path"] = new_sp - LogRun[path, config, {num_hits: num_hits}] - File.write(out_path, md) - end -end diff --git a/doc/package.json b/doc/package.json deleted file mode 100644 index 905c83767..000000000 --- a/doc/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "cse-user-manual-build-utils", - "version": "0.0.1", - "description": "Node dependencies to assist in building the CSE User Manual", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "private": true, - "license": "BSD", - "dependencies": { - "cssnano-cli": "^1.0.4", - "html-minifier": "^4.0.0" - } -} diff --git a/doc/pyproject.toml b/doc/pyproject.toml new file mode 100644 index 000000000..db9ae0927 --- /dev/null +++ b/doc/pyproject.toml @@ -0,0 +1,29 @@ +[project] +name = "CSE-documentation" +version = "0.1.0" +description = "Source code for CSE documentation website" +authors = [{ name = "The CSE Authors" }] +license = "BSD-3" +readme = "README.md" +keywords = ["cse", "energy-modeling", "simulation", "documentation"] +requires-python = ">=3.12" +dependencies = [ + "mkdocs-material", + "mkdocs-autorefs>=1.3.1", + "mkdocs-macros-plugin>=1.3.7", + "mkdocs-awesome-nav>=3.1.1", + "pyyaml>=6.0.2", + "python-slugify>=8.0.4", + "beautifulsoup4>=4.13.4", +] + + +[tool.uv] +dev-dependencies = [ + "ruff>=0.9.9", +] + +[tool.mypy] +disallow_incomplete_defs = true +no_implicit_optional = true +check_untyped_defs = true diff --git a/doc/rakefile.rb b/doc/rakefile.rb deleted file mode 100644 index 466b6805f..000000000 --- a/doc/rakefile.rb +++ /dev/null @@ -1,1986 +0,0 @@ -# Copyright (c) 1997-2017 The CSE Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file. -######################################## -# Build Documentation and Website -######################################## -require 'fileutils' -require 'json' -require 'yaml' -require 'set' -require 'pathname' -require 'time' -require 'rake/testtask' -require 'irb' -require_relative 'lib/template' -require_relative 'lib/cse' -require_relative 'lib/pandoc' -require_relative 'lib/tables' -require_relative 'lib/table' -require_relative 'lib/toc' -require_relative 'lib/def_parser' -require_relative 'lib/section_index' -require_relative 'lib/verify_links' -require_relative 'lib/coverage_check' -require_relative 'lib/xlink' -require_relative 'lib/probes' - -######################################## -# Check Dependencies -######################################## -begin - PANDOC_VERSION = `pandoc --version`.split(/\n/)[0].gsub(/pandoc\s*/,'') -rescue - # pandoc isn't available - PANDOC_VERSION = nil -end -if PANDOC_VERSION.nil? or PANDOC_VERSION != "1.17.2" - puts "This build tool requires pandoc 1.17.2" - puts "Please uninstall your current pandoc via Windows" - puts "'Add and Remove Programs' and then install" - puts "Pandoc 1.17.2 via the *.msi file from here:" - puts "https://github.com/jgm/pandoc/releases" - exit(1) -end - -######################################## -# Globals -######################################## -class EvalContext - def test(name) - begin - if name[0] != "_" and (name[0] == name[0].upcase) - puts("Bad context variable name: #{name}") - puts("Cannot use uppercase letter to start context variable name (Ruby limitation)") - puts("Either use a lowercase letter to start the name or start the name with an '_'") - exit(1) - end - eval("#{name} = true") - rescue - puts("issue with context key \"#{name}\" in #{CONFIG_FILE}'s context section") - puts("all context variables must be valid Ruby variables:") - puts(" a lowercase letter or underscore followed by any\n" + - " combination of upper/lowercase letters, underscores, and digits") - puts("please fix the variable in question in #{CONFIG_FILE} before continuing") - exit - end - end -end -DEFAULT_CONFIG_FILE = "config/defaults.yaml" -CONFIG_FILE = "config.yaml" -LOG = STDOUT -ERB_OUTPUT_FILE = "erb-out.txt" -CONFIG = lambda do - f = lambda {|path| if File.exist?(path) then YAML.load_file(path) else {} end} - defaults = f[DEFAULT_CONFIG_FILE] - local = f[CONFIG_FILE] - config = defaults.merge(local) - default_context = if defaults.include?("context") then defaults["context"] else {} end - local_context = if local.include?("context") then local["context"] else {} end - context = default_context.merge(local_context) - ec = EvalContext.new - context.each {|k, _| ec.test(k)} - config['context'] = context - #puts(config.inspect) - config -end.call -THIS_DIR = File.expand_path(File.dirname(__FILE__)) -PROBES_DATA_DIR = File.join(THIS_DIR, 'config', 'reference') -BUILD_DIR = CONFIG.fetch("build-dir") -SRC_DIR = CONFIG.fetch("src-dir") -LOCAL_REPO = File.expand_path(File.join('..', '.git'), THIS_DIR) -REMOTE_REPO = CONFIG.fetch("remote-repo-url") -RUN_COVERAGE = CONFIG.fetch("coverage?") -REFERENCE_DIR = File.expand_path( - CONFIG.fetch("reference-dir") , THIS_DIR -) -RECORD_INDEX_EXCEPTIONS_FILE = File.join( - REFERENCE_DIR, 'record-index-exceptions.yaml' -) -DATE = nil # "February 23, 2016" -DRAFT = CONFIG.fetch("draft?") # true means, it is a draft -HEADER = "CSE User's Manual" -FOOTER = "Generated: #{Time.now.strftime("%FT%T%:z")}" -TOC_DEPTH = 3 -WEB_SITE_MANIFEST_PATH = File.join(SRC_DIR, "web-page.yaml") -CSE_USER_MANUAL_MANIFEST_PATH = File.join(SRC_DIR, 'cse-user-manual.yaml') -BUILD_PDF = CONFIG.fetch("build-pdf?") -USE_GHPAGES = CONFIG.fetch("use-ghpages?") -USE_NODE = CONFIG.fetch("use-node?") -NODE_BIN_DIR = File.expand_path('node_modules', THIS_DIR) -DOCS_BRANCH = CONFIG.fetch("docs-branch") -OUTPUT_DIR = CONFIG.fetch("output-dir") -VERBOSE = CONFIG.fetch("verbose?", false) -VERIFY_LINKS = CONFIG.fetch("verify-links?", false) -VERIFY_MANIFEST = CONFIG.fetch("verify-manifest?", false) -PANDOC_GENERAL_OPTIONS = [ - "--parse-raw", - "--standalone", - "--wrap=none", -].join(' ') -PANDOC_MD_OPTIONS = PANDOC_GENERAL_OPTIONS + " " + [ - "--atx-headers", - "--normalize", - "--to markdown", - "--from markdown", -].join(' ') -CSS_NANO_EXE = File.expand_path( - CONFIG.fetch("cssnano-exe"), THIS_DIR -) -HTML_MIN_EXE = File.expand_path( - CONFIG.fetch("html-minifier-exe"), THIS_DIR -) -PREPROCESSOR_CONTEXT = CONFIG.fetch("context", {}) -ERB_BINDING_FN = if CONFIG.fetch("use-table-lang?", true) - if CONFIG.include?("table-path") - table_path = File.expand_path( - CONFIG.fetch("table-path"), THIS_DIR) - Table::MakeBinding[table_path] - else - Table::MakeBinding[] - end - else - Template::MakeBinding - end -DELETE_BUILD_DIR = CONFIG.fetch("delete-build-dir?", false) - -######################################## -# Helper Functions -######################################## -# Note: section index must be generated *after* the preprocessing -# source-paths can (should?) be a glob, i.e., some-path/**/* or -# some-path/**/*.md -GenerateSectionIndex = lambda do |config| - src_path_glob = config.fetch("source-paths") - outpath = config.fetch("output-path") - merge_values = config.fetch("merge-values", nil) - parent = File.dirname(outpath) - FileUtils.mkdir_p(parent) unless File.exist?(parent) - lambda do - srcpaths = Dir[src_path_glob] - if !FileUtils.uptodate?(outpath, srcpaths) - si = SectionIndex::Generate[srcpaths] - si = si.merge(merge_values) if merge_values - File.write(outpath, si.to_yaml) - end - end -end - -# String String -> String -# Given a full path and a root path, return the relative path from root -RelativePath = lambda do |path, root_path| - Pathname.new(path).relative_path_from(Pathname.new(root_path)).to_s -end - -# String -> Nil -# Given a path to a directory where manifest yaml files can be found, report on -# whether the manifests represent all files on disk -CheckManifests = lambda do |src_dir| - src = Pathname.new(src_dir) - md_file_set = Set.new( - Dir[File.join(src_dir, "**", "*.md")].map do |p| - Pathname.new(p).relative_path_from(src).to_s - end - ) - unknown_files = Set.new - Dir[File.join(src_dir, "**", "*.yaml")].each do |path| - puts("... checking #{File.basename(path)}") - man = YAML.load_file(path) - man["sections"].each do |_, section_file| - if md_file_set.include?(section_file) - md_file_set.delete(section_file) - else - unknown_files << section_file - end - end - end - puts("Verifying manifest") - if md_file_set.empty? and unknown_files.empty? - puts("No problems detected") - return - end - puts("Problems detected:") - if !md_file_set.empty? - puts(" Files on disk but not in any manifest: ") - md_file_set.sort.each {|f| puts(" - #{f}")} - end - if !unknown_files.empty? - puts(" Files in manifest but not on disk: ") - unknown_files.sort.each {|f| puts(" - #{f}")} - end -end - -# (Array String) -> (Map String String) -# Given an array of basefile names, return a record index array based on the -# "typical rules". -FilesToRecordIndex = lambda do |paths| - rec_idx = {} - paths.each do |path| - base_no_ext = File.basename(path, ".*") - base_html = base_no_ext + ".html" - rec_idx[base_no_ext.upcase] = "#{base_html}##{base_no_ext.downcase}" - end - rec_idx -end - -# (Map String String) (Map String (Map String String)) -> (Map String String) -# Given a record index of record name to index value (file and hashtag), and a -# map of known exceptions representing "false record name" to correct index entry -# to merge, update the record index with the exceptions. Example: -# -# UpdateRecordIndex[ -# { -# "TOP-MEMBERS"=>"top-members.html#top-members", -# "RSYS"=>"rsys.html#rsys" -# }, -# { -# "TOP-MEMBERS" => { -# "TOP" => "top-members.html#top-members" -# } -# } -# ] -# => -# { -# "TOP"=>"top-members.html#top-members", -# "RSYS"=>"rsys.html#rsys" -# } -UpdateRecordIndex = lambda do |ri, updates| - new_ri = ri.dup - updates.each do |k, v| - if new_ri.include?(k) - new_ri.delete(k) - new_ri.merge!(v) - end - end - new_ri -end - -# Problem: need to build the record index on the fly based on what is left -# AFTER preprocessing. We also need to account for exceptions to the basic -# rule. The basic rule seems to be: -# -# 1. one record per file in doc/src/records -# 2. the index of that file is # -# 3. the record name seems to be -# 4. put the above in a map -# -# String String String -> Nil -# Given the path to the records/ directory, a path to save the record index at, -# and a file with known exceptions, read the record directory and create the -# record index and save it at the given path. -CreateRecordIndex = lambda do |rec_dir, outpath, exc_path=nil| - paths = Dir[File.join(rec_dir, '*.md')] - ri = FilesToRecordIndex[paths] - exceptions = if exc_path then YAML.load_file(exc_path) else {} end - ri = UpdateRecordIndex[ri, exceptions] - File.write(outpath, ri.to_yaml) - nil -end - -InstallNodeDeps = lambda do - unless File.exist?(NODE_BIN_DIR) - `npm install` - end -end - -# String -> Nil -# Removes all files under the given path -Clean = lambda do |path| - FileUtils.rm_rf(Dir[File.join(path, '*')]) -end - -# -> Nil -# The basic idea of this subroutine is to clone the current repository into the -# build output directory and checkout the gh-pages branch. We then clean all -# files out and (re-)generate into that git repository. The user can then manually -# pull back into the local gh-pages branch after inspection. -SetupGHPages = lambda do - if USE_GHPAGES - if ! File.exist?(File.join(OUTPUT_DIR, '.git')) - FileUtils.mkdir_p(File.dirname(OUTPUT_DIR)) - `git clone "#{LOCAL_REPO}" "#{OUTPUT_DIR}"` - Dir.chdir(OUTPUT_DIR) do - `git remote rm origin` - `git remote add origin #{REMOTE_REPO}` - `git fetch --all` - `git checkout #{DOCS_BRANCH}` - end - puts("Removing existing content...") - Dir[File.join(OUTPUT_DIR, '*')].each do |path| - unless File.basename(path) == '.git' - puts("... removing: rm -rf #{path}") - FileUtils.rm_rf(path) - end - end - end - end -end - -EnsureExists = lambda do |path| - FileUtils.mkdir_p(path) unless File.exist?(path) -end - -EnsureAllExist = lambda do |paths| - paths.each {|p| EnsureExists[p]} -end - -Run = lambda do |cmd, working_dir=nil| - working_dir ||= Dir.pwd - Dir.chdir(working_dir) do - begin - result = `#{cmd}` - raise "Error running command" if $?.exitstatus != 0 - if !result or result.empty? - if VERBOSE - LOG.write("executed command: `#{cmd}`\n") - LOG.write("... in directory: #{working_dir}\n") - LOG.flush - else - LOG.write(".") - LOG.flush - end - else - if VERBOSE - LOG.write("executed command: `#{cmd}`\n") - LOG.write("... in directory: #{working_dir}\n") - LOG.write("... result:\n#{result}\n") - LOG.flush - else - LOG.write(".") - LOG.flush - end - end - rescue - if VERBOSE - LOG.write("Error running command: `#{cmd}`\n") - LOG.write("... from directory: #{working_dir}\n") - LOG.write("... failure:\n #{result}") - LOG.flush - else - LOG.write("X") - LOG.flush - end - raise "Error running command" - end - end -end - -CopyFile = lambda do |path, out_path, dummy1=nil, dummy2=nil| - FileUtils.cp(path, out_path) -end - -# (Array String) (Map String *) -> Bool -# Returns true if the configuration has the given keys -CheckConfigHasKeys = lambda do |config, keys| - keys.each do |k| - if !config.include?(k) - msg = ( - "KeyNotFound Error:\n" + - "Configuration missing expected key #{k}\n" + - "config: #{config.inspect}" - ) - raise msg - end - end - true -end - -# (String String Int (Map String *) -> nil) ?(Or Nil (Array String)) -> -# ((Map String *) -> ((Array String) -> (Array String))) -# Setup up a function to take an array of file paths and process their contents -# to an output path while wrapping in a context of parameters. -# The initial arguments are a function to do the work of transforming from -# source path to target path and configuration keys to check. -# -# This function has signature: -# String String Int (Map String *) -> nil -# That is, it takes a source path, a target path, the index of which path it is -# in the overall process (a manifest is an array of source paths, so the index -# is the index into that array), and finally a map from string to any value (*) -# that is for configuation purposes. This file doesn't return any meaningful -# results (or if it does, they are not captured) and, instead, is run for its -# side-effects: creating a transformed file at the ouptut path location based -# on applying the function to the source path contents (presumably). -# -# The configuration keys is an array of strings to ensure exist in the -# configuration parameters fed into the next step of this function. -# -# Feeding MapOverManifest these two first arguments returns another function -# which takes a HashTable of configuration parameters which are optionally -# checked for values from the check_keys array. -# -# Feeding that next function the configuration parameters returns the -# final function which takes an array of source file paths (the "manifest") -# and processes them to the output directory (with the same basename as the -# input). -MapOverManifest = lambda do |fn, check_keys=nil| - lambda do |config| - CheckConfigHasKeys[config, check_keys] unless check_keys.nil? - out_dir = config.fetch("output-dir") - EnsureExists[out_dir] - other_deps = config.fetch("paths-to-other-dependencies", []) - if config.fetch("disable?", false) - #MapOverManifest[CopyFile][config.merge("disable?" => false)] - lambda {|manifest| manifest} - else - lambda do |manifest| - new_manifest = [] - manifest.each_with_index do |path, idx| - out_path = nil - if config.fetch("relative-root-path", nil) - out_path = File.join( - out_dir, - RelativePath[path, config["relative-root-path"]] - ) - EnsureExists[File.dirname(out_path)] - else - out_path = File.join(out_dir, File.basename(path)) - end - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path] + other_deps) - fn[path, out_path, idx, config] - end - end - new_manifest - end - end - end -end - -# (String (Map String *) -> String) ?(Or Nil (Array String)) -> -# ((Map String *) -> ((Array String) -> (Array String))) -# This function is very similar to MapOverManifest but instead -# works only on the manfiest path names themselves (and doesn't -# touch the actual file content). This can be used to modify -# path names. -MapOverManifestPaths = lambda do |fn, check_keys=nil| - lambda do |config| - CheckConfigHasKeys[config, check_keys] unless check_keys.nil? - if config.fetch('disable?', false) - lambda do |manifest| - manifest - end - else - lambda do |manifest| - new_manifest = [] - manifest.map do |path| - new_manifest << fn[path, config] - end - new_manifest - end - end - end -end - -# (Record 'output-dir' String 'context' (Map String *)) -# -> ((Array String) -> (Array String)) -# This function takes an array of source files and preprocesses each with ERB, -# saving the rendered result with the same basename in the designated -# output-dir, creating the output-dir if necessary. -PreprocessManifest = MapOverManifest[ - Template::PreprocFile[ERB_BINDING_FN], - ['output-dir', 'context'] -] - -# (Map "reference-dir" String ...) -> ((Array String) -> (Array String)) -# Configuring with a reference directory, expand all manifest paths and -# return them. -ExpandPathsFrom = MapOverManifestPaths[ - lambda do |path, config| - reference_dir = config.fetch("reference-dir") - File.expand_path(path, reference_dir) - end, - ["reference-dir"] -] - -TapManifest = lambda do |msg| - lambda do |manifest| - puts(msg) - puts("manifest = #{manifest.inspect}") - manifest - end -end - -NormalizeMarkdown = MapOverManifest[ - lambda do |path, out_path, _, _| - Run["pandoc #{PANDOC_MD_OPTIONS} -o \"#{out_path}\" \"#{path}\""] - end -] - -#AdjustMarkdownLevels = MapOverManifest[ -# lambda do |path, out_path, idx, config| -# levels = config.fetch("levels") -# end, -# ["levels"] -#] -AdjustMarkdownLevels = lambda do |config| - levels = config.fetch("levels") - out_dir = config.fetch("output-dir") - EnsureExists[out_dir] - lambda do |manifest| - new_manifest = [] - if manifest.length != levels.length - puts("length of manifest doesn't equal length of levels:") - puts("... manifest length: #{manifest.length}") - puts("... levels length: #{levels.length}") - exit(1) - end - manifest.zip(levels).each do |path, level| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if level == 1 - FileUtils.cp(path, out_path) - else - adjustment = "#" * (level - 1) - md = File.read(path, :encoding=>"UTF-8") - File.open(out_path, 'w') do |f| - md.lines.each do |line| - if line =~ /^#+\s+/ - f.write(adjustment + line) - else - f.write(line) - end - end - end - end - end - new_manifest - end -end - -AddFiles = lambda do |config| - new_paths = config.fetch("paths") - out_dir = config.fetch("output-dir") - add_to_manifest = config.fetch("append-to-manifest?", false) - EnsureExists[out_dir] - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_paths.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path if add_to_manifest - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end -end - -CopyToDir = lambda do |config| - out_dir = config.fetch("output-dir") - EnsureExists[out_dir] - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << path - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end -end - -CopyByGlob = lambda do |config| - from_glob = config.fetch("from-glob") - out_dir = config.fetch("output-dir") - EnsureExists[out_dir] - lambda do - new_manifest = [] - Dir[from_glob].each do |path| - out_path = File.join(tgt_dir, File.basename(path)) - new_manifest << out_path - if not FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end -end - -PassThroughWithSideEffect = lambda do |config| - fn = config.fetch("function") - disable = config.fetch("disable?", false) - lambda do |x| - fn[] unless disable - x - end -end - -UpdateOutlineCount = lambda do |count, level_at| - new_count = [] - mod_idx = level_at - 1 - 0.upto(mod_idx).each do |idx| - c = count.fetch(idx, 0) - if idx == mod_idx - new_count << c+1 - elsif idx < mod_idx - if idx > (count.length-1) - new_count << c+1 - else - new_count << c - end - else - next - end - end - new_count -end - -OutlineCountToStr = lambda do |count| - count.map(&:to_s).join(".") -end - -NumberMd = lambda do |config| - if config.fetch("disable", false) - lambda do |manifest| - manifest - end - else - out_dir = config.fetch("output-dir") - levels = config.fetch("levels", nil) - starting_count = config.fetch("starting-count", [0]) - exceptions = config.fetch("exceptions", []) - EnsureExists[out_dir] - unnum = lambda do |line| - line =~ /{-}\s*$/ || line =~ /{[^}]*?\.unnumbered[^}]*?}\s*$/ - end - lambda do |manifest| - new_manifest = [] - count = starting_count - manifest.each_with_index do |path, idx| - bn = File.basename(path) - out_path = File.join(out_dir, bn) - new_manifest << out_path - if exceptions.include?(bn) - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - next - end - level_adjustment = (levels and levels[idx]) ? (levels[idx] - 1) : 0 - md = File.read(path, :encoding=>"UTF-8") - if !FileUtils.uptodate?(out_path, [path]) - File.open(out_path, 'w') do |f| - md.lines.each do |line| - if line =~ /^#+\s+/ and !unnum[line] - m = line.match(/^(#+)\s+(.*)$/) - level_at = m[1].length + level_adjustment - count = UpdateOutlineCount[count, level_at] - outline_number = OutlineCountToStr[count] - f.write(m[1] + ' ' + outline_number + ' ' + m[2].chomp + "\n") - else - f.write(line) - end - end - end - end - end - new_manifest - end - end -end - -# String -> String -# Attempts to remove a plural "s" from a word if appropriate. Note: this is a -# very basic algorithm. -DePluralize = lambda do |word| - if word.end_with?("s") - if word.length > 1 - word[0..-2] - end - else - word - end -end - -# Task to cross-link terms in source documents -# Config (and defaults) -# "record-index-path" -# "output-dir" -# "log" => nil -# "verbose" => false -# "disable?" => false -# "paths-to-other-dependencies" => [] -# "relative-root-path" => nil -XLinkMarkdown = MapOverManifest[ - XLink::OverFileOrig, - ["record-index-path"] -] - -# Task to cross-link terms in source documents. This version allows us to -# remove "self-links" -- i.e., links to sections that are the immediate parent -# or (optionally) on the path of sections to the current point. The basic idea -# is that we shouldn't have links to a section in the paragraph immediately -# below the beginning of a section. -# Config (and defaults) -# "record-index-path" -# "output-dir" -# "levels" => (Array Int), default: [1,1,1, ...] -# "nolinklevel" => Int, default: 1, how high up to go in the path to check if we are "self-linking" -# "section-path" => [] -# "log" => nil -# "verbose" => false -# "disable?" => false -# "paths-to-other-dependencies" => [] -# "relative-root-path" => nil -XLinkMarkdownAdv = MapOverManifest[ - XLink::OverFile, - ["record-index-path"] -] - -JoinManifestToString = lambda do |manifest| - manifest.map{|f| "\"#{f}\""}.join(' ') -end - -RunPandoc = lambda do |config| - opts = config.fetch('options') - out_path = config.fetch('output-path') - out_dir = File.dirname(out_path) - working_dir = config.fetch('working-dir', out_dir) - EnsureExists[out_dir] - lambda do |input| - cmd = "pandoc #{opts} -o \"#{out_path}\" #{input}" - Run[cmd, working_dir] - out_path - end -end - -RunPandocOverEach = lambda do |config| - opts = config.fetch('options') - out_dir = config.fetch('output-dir') - working_dir = config.fetch('working-dir', nil) - do_nav = config.fetch('do-navigation?', false) - top = config.fetch('top-url', nil) - toc = config.fetch('toc-url', nil) - EnsureExists[out_dir] - lambda do |manifest| - new_manifest = [] - num_files = manifest.length - manifest.each_with_index do |path, idx| - out_path = File.join(out_dir, File.basename(path, '.md') + '.html') - new_manifest << out_path - working_dir = File.dirname(path) if working_dir.nil? - if !FileUtils.uptodate?(out_path, [path]) - nav_opts = [] - prev = File.basename(manifest[(idx-1)%num_files], '.md') + '.html' - the_next = File.basename(manifest[(idx+1)%num_files], '.md') + '.html' - nav_opts << "--variable prev=\"#{prev}\"" if num_files > 1 - nav_opts << "--variable next=\"#{the_next}\"" if num_files > 1 - nav_opts << "--variable top=\"#{top}\"" if top - nav_opts << "--variable nav-toc=\"#{toc}\"" if toc - nav_opts << "--variable do-nav=true" if do_nav - all_opts = opts + ' ' + nav_opts.join(' ') - cmd = "pandoc #{all_opts} -o \"#{out_path}\" \"#{path}\"" - Run[cmd, working_dir] - end - end - new_manifest - end -end - -GenTOC = lambda do |config| - max_level = config.fetch('max-level') - out_dir = config.fetch('output-dir') - toc_name = config.fetch('toc-name', 'index.md') - levels = config.fetch('levels') - disable = config.fetch('disable?', false) - if disable - lambda do |manifest| - manifest - end - else - EnsureExists[out_dir] - lambda do |manifest| - new_manifest = [] - toc_out_path = File.join(out_dir, toc_name) - new_manifest << toc_out_path - if !FileUtils.uptodate?(toc_out_path, manifest) - lev_man = [] - manifest.each_with_index do |path, idx| - lev_man << [levels[idx], path] - end - toc_content = TOC::GenTableOfContentsFromFiles[ - max_level, - lev_man - ] - File.write(toc_out_path, toc_content) - end - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end - end -end - -Listify = lambda {|x| [x]} - -JoinFunctions = lambda do |fs| - lambda do |x| - fs.each do |f| - x = f[x] - end - x - end -end - -NewManifest = lambda do |manifest| - lambda do |_| - manifest - end -end - -CompressCSS = lambda do |config| - disable = config.fetch("disable?", false) - out_dir = config.fetch("output-dir") - EnsureExists[out_dir] - if disable - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end - else - working_dir = config.fetch("working-dir", out_dir) - cssnano = config.fetch("path-to-cssnano") - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - cmd = "#{cssnano} < #{path} > #{out_path}" - Run[cmd, working_dir] - end - end - new_manifest - end - end -end - -CompressHTML = lambda do |config| - out_dir = config.fetch("output-dir") - disable = config.fetch("disable?", false) - EnsureExists[out_dir] - if disable - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end - else - html_minifier = config.fetch("path-to-html-minifier") - working_dir = config.fetch("working-dir", out_dir) - opts = config.fetch("options", "") - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - out_path = File.join(out_dir, File.basename(path)) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - if html_minifier - cmd = "#{html_minifier} #{opts} -o #{out_path} #{path}" - Run[cmd, working_dir] - else - FileUtils.cp(path, out_path) - end - end - end - new_manifest - end - end -end - -BuildProbesYaml = lambda do - # Name in Probes => Name in CNRECS - # all mappings are downcased - mappings = { - 'door'=>'surface', - 'window'=>'surface', - 'export'=>'report', - 'exportcol'=>'reportcol', - 'exportfile'=>'reportfile', - 'weathernexthour'=>'weather', - #'znres'=>'zone interval results sub', - } - dirs = [ - PROBES_DATA_DIR - ] - EnsureAllExist[dirs] - CSE::ProbesList[] - out_path = File.join(PROBES_DATA_DIR, 'probes_input.yaml') - probes = DefParser::ParseProbesTxt[] - probes_alt_orig = DefParser::ParseCnRecs[] - probes_alt = {} - probes_alt_orig.keys.each do |k| - name = probes_alt_orig[k][:name] - probes_alt[name.downcase] = probes_alt_orig[k] - end - #puts("probes.keys: #{probes.keys}") - #puts("probes_alt.keys: #{probes_alt.keys}") - probes.keys.sort_by {|k| k.downcase}.each do |k| - rec_alt = nil - k_dc = k.downcase - k_lookup = mappings.fetch(k_dc, k_dc) - if probes_alt.include?(k_lookup) - rec_alt = probes_alt[k_lookup] - else - puts("Warning! No additional data found for #{k} (#{k_lookup})") - end - next if rec_alt.nil? - flds = probes[k][:fields] - next if flds.empty? - flds.each do |fld| - desc = nil - flds_alt = rec_alt[:fields].select do |f| - na = f[:name].downcase - n1a = na - n2a = na.split(/_/)[-1].split(/\./)[-1].gsub(/\[[^\]]*\]/, '') - nb = fld[:name].downcase.split(/_/)[-1].split(/\./)[-1].gsub(/\[[^\]]*\]/, '') - n1a == nb || n2a == nb - end - if flds_alt.length == 1 - fld_alt = flds_alt[0] - desc = fld_alt.fetch(:description, desc) - end - begin - fld[:description] = desc.capitalize unless desc.nil? - rescue - fld[:description] = desc unless desc.nil? - end - end - end - File.write(out_path, probes.to_yaml) -end - -BuildProbesAndCopyIntoManifest = lambda do |config| - disable = config.fetch("disable?", false) - if disable - lambda do |manifest| - manifest - end - else - probes_dir = config.fetch('probes-build-dir') - out_dir = config.fetch('output-dir') - insert_after = config.fetch('insert-after-file') - EnsureAllExist[[probes_dir, out_dir]] - probes_input = config.fetch('path-to-probes-input') - probes = YAML.load_file(probes_input) - probes_md_path = File.join(probes_dir, 'probes.md') - File.open(probes_md_path, 'w') do |f| - f.write("# Probe Definitions\n\n") - probes.keys.sort_by {|k| k.downcase}.each do |k| - table = [["Name", "Input?", "Runtime?", "Type", "Variability", "Description"]] - flds = probes[k][:fields] - next if flds.empty? - name = k - array_txt = if probes[k][:array] then "[1..]" else "" end - title = "\\@#{name}#{array_txt}." - owner = probes[k][:owner] - owner_txt = if owner == "--" then "" else " (owner: #{owner})" end - f.write("## #{title}#{owner_txt}\n\n") - if probes[k].include?(:description) - f.write(probes[k][:description] + "\n\n") - end - flds.each do |fld| - table << [ - fld[:name], - if fld[:input] then "X" else "--" end, - if fld[:runtime] then "X" else "--" end, - fld[:type], - fld[:variability], - fld.fetch(:description, "--") - ] - end - f.write(Tables::WriteTable[ table, true ]) - f.write("\n\n\n") - end - end - lambda do |manifest| - new_manifest = [] - manifest.each do |path| - bn = File.basename(path) - out_path = File.join(out_dir, bn) - new_manifest << out_path - if bn == insert_after - probes_out_path = File.join(out_dir, File.basename(probes_md_path)) - new_manifest << probes_out_path - if !FileUtils.uptodate?(probes_out_path, [probes_md_path]) - FileUtils.cp(probes_md_path, probes_out_path) - end - end - if !FileUtils.uptodate?(out_path, [path]) - FileUtils.cp(path, out_path) - end - end - new_manifest - end - end -end - -ReLinkHTML = lambda do |config| - out_dir = config.fetch("output-dir") - tags_fname_map = config.fetch("tags-filename-map") - EnsureExists[out_dir] - lambda do |manifest| - if tags_fname_map.respond_to?(:call) - tags_fname_map = tags_fname_map.call - end - new_manifest = [] - m = manifest.length - n = 0 - manifest.each do |path| - bn = File.basename(path) - out_path = File.join(out_dir, bn) - new_manifest << out_path - if !FileUtils.uptodate?(out_path, [path]) - n += 1 - content = File.read(path, :encoding=>"UTF-8") - new_content = tags_fname_map.to_a.inject(content) do |nc, tag_fname| - tag = tag_fname[0] - fname = tag_fname[1] - if fname == bn - nc - else - nc.gsub(/([^<]*)<\/a>/, - "\\1") - end - end - File.write(out_path, new_content) - end - end - if VERBOSE - LOG.write("Updated #{n}/#{m} files for relinking\n") - LOG.flush - else - LOG.write(".") - LOG.flush - end - new_manifest - end -end - -CheckCoverage = lambda do |config| - tag = config.fetch("tag") - this_dir = config.fetch('this-dir', THIS_DIR) - build_dir = config.fetch("build-dir", "build") - md_dir = config.fetch("md-dir", "md") - context = config.fetch("preproc-context", PREPROCESSOR_CONTEXT) - JoinFunctions[[ - ExpandPathsFrom[ - "reference-dir" => File.expand_path('src') - ], - PreprocessManifest[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed"), this_dir - ), - "relative-root-path" => File.expand_path('src'), - "context" => context - ], - NormalizeMarkdown[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "normalize"), this_dir - ) - ] - ]] -end - -BuildSinglePageHTML = lambda do |config| - tag = config.fetch("tag") - levels = config.fetch("levels") - this_dir = config.fetch('this-dir', THIS_DIR) - build_dir = config.fetch("build-dir", BUILD_DIR) - md_dir = config.fetch("md-dir", "md") - html_dir = config.fetch("html-dir", "html") - rsrc_dir = config.fetch("resource-dir", "resources") - out_dir = config.fetch("output-dir", OUTPUT_DIR) - out_file = config.fetch("output-file-name", "out.html") - disable_probes = config.fetch("disable-probes?", false) - disable_toc = config.fetch("disable-toc?", false) - disable_xlink = config.fetch("disable-xlink?", false) - disable_compression = config.fetch("disable-compression?", !USE_NODE) - disable_numbering = config.fetch("disable-numbering?", false) - do_navigation = config.fetch("do-navigation?", false) - title = config.fetch("title", "CSE User's Manual") - subtitle = config.fetch("subtitle", "California Simulation Engine") - date = config.fetch("date", nil) - draft = config.fetch("draft?", true) - context = config.fetch("preproc-context", PREPROCESSOR_CONTEXT) - section_index = config.fetch( - "section-index-path", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "section-index.yaml"), this_dir - ) - ) - record_index_file = config.fetch( - "record-index-file", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "record-index.yaml"), this_dir - ) - ) - JoinFunctions[[ - ExpandPathsFrom[ - "reference-dir" => File.expand_path('src') - ], - PreprocessManifest[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed"), this_dir - ), - "relative-root-path" => File.expand_path('src'), - "context" => context - ], - PassThroughWithSideEffect[ - "function" => lambda do - rec_dir = File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed", "records"), this_dir - ) - outpath = record_index_file - parent = File.dirname(outpath) - FileUtils.mkdir_p(parent) unless File.exist?(parent) - exc_path = RECORD_INDEX_EXCEPTIONS_FILE - deps = [exc_path] + Dir[File.join(rec_dir, '*.md')] - if !FileUtils.uptodate?(outpath, deps) - CreateRecordIndex[rec_dir, outpath, exc_path] - end - end - ], - NormalizeMarkdown[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "normalize"), this_dir - ) - ], - XLinkMarkdownAdv[ - "record-index-path" => record_index_file, - "levels" => levels, - "nolinklevel" => 1, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "xlink"), this_dir - ), - "log" => STDOUT, - "disable?" => disable_xlink - ], - AdjustMarkdownLevels[ - "output-dir" => File.join(build_dir, tag, md_dir, "adjusted-headers"), - "levels" => levels - ], - Probes::BuildProbesAndCopyIntoManifest.new( - "disable?" => disable_probes, - "probes-build-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "probes"), this_dir - ), - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-with-probes"), this_dir - ), - "insert-after-file" => "output-reports.md", - "path-to-probes-input" => File.expand_path( - File.join("config", "reference", "probes_input.yaml"), this_dir - ), - "probes-in-one-file?" => false, - ), - PassThroughWithSideEffect[ - "function" => GenerateSectionIndex[ - "source-paths"=> File.expand_path( - # File.join(build_dir, tag, md_dir, "preprocessed", "**", "*.md"), this_dir - File.join(build_dir, tag, md_dir, "all-with-probes", "**", "*.md"), this_dir - ), - "output-path" => section_index, - "merge-values" => {"#probe-definitions"=>"probes.html"} - ] - ], - AddFiles[ - "paths" => [File.expand_path( - File.join("config", "template", "site-template.html"), this_dir - )], - "append-to-manifest?" => false, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-with-probes-and-template"), this_dir - ) - ], - JoinManifestToString, - RunPandoc[ - "options" => [ - "--parse-raw", - "--standalone", - "--wrap=none", - "--to html5", - "--from markdown", - "--mathjax", - disable_numbering ? "" : "--number-sections", - "--css=css/base.css", - disable_toc ? "" : "--table-of-contents", - disable_toc ? "" : "--toc-depth=#{TOC_DEPTH}", - "--smart", - "--variable header=\"#{HEADER}\"", - "--variable footer=\"#{FOOTER}\"", - "--variable current_year=#{DateTime.now.year}", - "--variable do-nav=#{do_navigation}", - "--variable top=\"index.html\"", - "--template=site-template.html", - title ? "--variable title=\"#{title}\"" : "", - subtitle ? "--variable subtitle=\"#{subtitle}\"" : "", - date ? "--variable date=\"#{date}\"" : "", - draft ? "--variable draft=true" : "", - ].join(' '), - "output-path" => File.expand_path( - File.join(build_dir, tag, html_dir, "generated-singlepage", out_file), this_dir - ), - "working-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-with-probes-and-template"), this_dir - ), - ], - Listify, - CompressHTML[ - "path-to-html-minifier" => HTML_MIN_EXE, - "options" => [ - "--minify-css", - "--minify-js", - "--remove-comments" - ].join(' '), - "output-dir" => File.expand_path(out_dir, this_dir), - "disable?" => disable_compression - ], - NewManifest[ - Dir[ - File.expand_path(File.join("config", "css", "*.css"), this_dir) - ] - ], - CompressCSS[ - "path-to-cssnano" => CSS_NANO_EXE, - "output-dir" => File.expand_path( - File.join(out_dir, "css"), this_dir - ), - "disable?" => disable_compression - ], - NewManifest[ - Dir[File.expand_path(File.join("src", "media", "*"), this_dir)] - ], - CopyToDir[ - "output-dir" => File.expand_path( - File.join(out_dir, "media"), this_dir - ) - ], - ]] -end - -BuildMultiPageHTML = lambda do |config| - tag = config.fetch("tag") - levels = config.fetch("levels") - build_dir = config.fetch("build-dir", BUILD_DIR) - md_dir = config.fetch("md-dir", "md") - html_dir = config.fetch("html-dir", "html") - this_dir = config.fetch("this-dir", THIS_DIR) - out_dir = config.fetch("output-dir", OUTPUT_DIR) - rsrc_dir = config.fetch("resource-dir", "resources") - disable_probes = config.fetch("disable-probes?", false) - disable_toc = config.fetch("disable-toc?", false) - disable_xlink = config.fetch("disable-xlink?", false) - disable_compression = config.fetch("disable-compression?", !USE_NODE) - disable_numbering = config.fetch("disable-numbering?", false) - do_navigation = config.fetch("do-navigation?", false) - title = config.fetch("title", "CSE User's Manual") - subtitle = config.fetch("subtitle", "California Simulation Engine") - date = config.fetch("date", nil) - draft = config.fetch("draft?", true) - context = config.fetch("preproc-context", PREPROCESSOR_CONTEXT) - section_index = config.fetch( - "section-index-path", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "section-index.yaml"), this_dir - ) - ) - record_index_file = config.fetch( - "record-index-file", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "record-index.yaml"), this_dir - ) - ) - JoinFunctions[[ - ExpandPathsFrom[ - "reference-dir" => File.expand_path('src') - ], - PreprocessManifest[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed"), this_dir - ), - "relative-root-path" => File.expand_path('src'), - "context" => context - ], - PassThroughWithSideEffect[ - "function" => lambda do - rec_dir = File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed", "records"), this_dir - ) - outpath = record_index_file - parent = File.dirname(outpath) - FileUtils.mkdir_p(parent) unless File.exist?(parent) - exc_path = RECORD_INDEX_EXCEPTIONS_FILE - deps = [exc_path]+Dir[File.join(rec_dir,'*.md')] - if !FileUtils.uptodate?(outpath, deps) - CreateRecordIndex[rec_dir, outpath, exc_path] - end - end - ], - NormalizeMarkdown[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "normalize"), this_dir - ) - ], - XLinkMarkdownAdv[ - "record-index-path" => record_index_file, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "xlink"), this_dir - ), - "levels" => levels, - "nolinklevel" => 1, - "log" => STDOUT, - "disable?" => disable_xlink - ], - Probes::BuildProbesAndCopyIntoManifest.new( - "probes-build-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "probes"), this_dir - ), - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-with-probes"), this_dir - ), - "insert-after-file" => "output-reports.md", - "path-to-probes-input" => File.expand_path( - File.join("config", "reference", "probes_input.yaml"), this_dir - ), - "disable?" => disable_probes, - "probes-in-one-file?" => false, - ), - PassThroughWithSideEffect[ - "function" => GenerateSectionIndex[ - "source-paths"=> File.expand_path( - # File.join(build_dir, tag, md_dir, "preprocessed", "**", "*.md"), this_dir - File.join(build_dir, tag, md_dir, "all-with-probes", "**", "*.md"), this_dir - ), - "output-path" => section_index, - "merge-values" => {"#probe-definitions"=>"probes.html"} - ] - ], - NumberMd[ - "output-dir" => File.join(build_dir, tag, md_dir, "number"), - "levels" => levels + (disable_probes ? [] : [1]), - "disable?" => disable_numbering - ], - GenTOC[ - "max-level" => TOC_DEPTH, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "toc"), this_dir - ), - "toc-name" => "index.md", - "levels" => (levels + (disable_probes ? [] : [1]*100)).map do |lev| - lev - 1 - end, - "disable?" => disable_toc - ], - AddFiles[ - "paths" => [File.expand_path( - File.join("config", "template", "site-template.html"), this_dir - )], - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "ready-to-build"), this_dir - ) - ], - RunPandocOverEach[ - "options" => [ - "--parse-raw", - "--standalone", - "--wrap=none", - "--to html5", - "--from markdown", - "--mathjax", - "--css=css/base.css", - "--smart", - "--template=site-template.html", - "--variable header=\"#{HEADER}\"", - "--variable footer=\"#{FOOTER}\"", - "--variable current_year=#{DateTime.now.year}", - title ? "--variable title=\"#{title}\"" : "", - subtitle ? "--variable subtitle=\"#{subtitle}\"" : "", - date ? "--variable date=\"#{date}\"" : "", - draft ? "--variable draft=true" : "", - ].join(' '), - "output-dir" => File.expand_path( - File.join(build_dir, tag, html_dir, "generated-multipage"), this_dir - ), - "top-url" => "../index.html", - "toc-url" => "index.html", - "do-navigation?" => do_navigation - ], - ReLinkHTML[ - "tags-filename-map" => lambda do - index = YAML.load_file(record_index_file) - index.to_a.sort_by do |e| - e[0] - end.inject(YAML.load_file(section_index)) do |m, e| - fname_tag = e[1].scan(/([^\#]*)(\#.*)/).flatten - m.merge(Hash[fname_tag[1], fname_tag[0]]) - end - end, - "output-dir" => File.expand_path( - File.join(build_dir, tag, html_dir, "relinked"), this_dir - ) - ], - CompressHTML[ - "path-to-html-minifier" => HTML_MIN_EXE, - "options" => [ - "--minify-css", - "--minify-js", - "--remove-comments" - ].join(' '), - "output-dir" => File.expand_path(out_dir, this_dir), - "disable?" => disable_compression - ], - NewManifest[ - Dir[ - File.expand_path(File.join("config", "css", "*.css"), this_dir) - ] - ], - CompressCSS[ - "path-to-cssnano" => CSS_NANO_EXE, - "output-dir" => File.expand_path( - File.join(out_dir, "css"), this_dir - ), - "disable?" => disable_compression - ], - NewManifest[ - Dir[File.expand_path(File.join("src", "media", "*"), this_dir)] - ], - CopyToDir[ - "output-dir" => File.expand_path( - File.join(out_dir, "media"), this_dir - ) - ], - ]] -end - -BuildPDF = lambda do |config| - tag = config.fetch("tag") - levels = config.fetch("levels") - this_dir = config.fetch('this-dir', THIS_DIR) - build_dir = config.fetch("build-dir", BUILD_DIR) - md_dir = config.fetch("md-dir", "md") - out_dir = config.fetch("output-dir", OUTPUT_DIR) - out_file = config.fetch("output-file-name", "out.pdf") - rsrc_dir = config.fetch("resource-dir", "resources") - disable_probes = config.fetch("disable-probes?", false) - disable_toc = config.fetch("disable-toc?", false) - disable_xlink = config.fetch("disable-xlink?", false) - title = config.fetch("title", "CSE User's Manual") - subtitle = config.fetch("subtitle", "California Simulation Engine") - date = config.fetch("date", nil) - draft = config.fetch("draft?", true) - context = config.fetch("preproc-context", PREPROCESSOR_CONTEXT) - section_index = config.fetch( - "section-index-path", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "section-index.yaml"), this_dir - ) - ) - record_index_file = config.fetch( - "record-index-file", - File.expand_path( - File.join(build_dir, tag, rsrc_dir, "record-index.yaml"), this_dir - ) - ) - JoinFunctions[[ - ExpandPathsFrom[ - "reference-dir" => File.expand_path('src') - ], - PreprocessManifest[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed"), this_dir - ), - "relative-root-path" => File.expand_path('src'), - "context" => context - ], - #PassThroughWithSideEffect[ - # "function" => GenerateSectionIndex[ - # "source-paths"=> File.expand_path( - # File.join(build_dir, tag, md_dir, "preprocessed", "**", "*.md"), this_dir - # # File.join(build_dir, tag, md_dir, "all-with-probes", "**", "*.md"), this_dir - # ), - # "output-path" => section_index, - # "merge-values" => {"#probe-definitions"=>"probes.html"} - # ] - #], - PassThroughWithSideEffect[ - "function" => lambda do - rec_dir = File.expand_path( - File.join(build_dir, tag, md_dir, "preprocessed", "records"), this_dir - ) - outpath = record_index_file - parent = File.dirname(outpath) - FileUtils.mkdir_p(parent) unless File.exist?(parent) - exc_path = RECORD_INDEX_EXCEPTIONS_FILE - deps = [exc_path]+Dir[File.join(rec_dir,'*.md')] - if !FileUtils.uptodate?(outpath, deps) - CreateRecordIndex[rec_dir, outpath, exc_path] - end - end - ], - NormalizeMarkdown[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "normalize"), this_dir - ) - ], - XLinkMarkdownAdv[ - "record-index-path" => record_index_file, - "levels" => levels, - "nolinklevel" => 1, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "xlink"), this_dir - ), - "log" => STDOUT, - "disable?" => disable_xlink - ], - AdjustMarkdownLevels[ - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "adjusted-headers"), this_dir - ), - "levels" => levels - ], - Probes::BuildProbesAndCopyIntoManifest.new( - "disable?" => disable_probes, - "probes-build-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "probes"), this_dir - ), - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-with-probes"), this_dir - ), - "insert-after-file" => "output-reports.md", - "path-to-probes-input" => File.expand_path( - File.join("config", "reference", "probes_input.yaml"), this_dir - ), - "probes-in-one-file?" => false, - ), - PassThroughWithSideEffect[ - "function" => GenerateSectionIndex[ - "source-paths"=> File.expand_path( - # File.join(build_dir, tag, md_dir, "preprocessed", "**", "*.md"), this_dir - File.join(build_dir, tag, md_dir, "all-with-probes", "**", "*.md"), this_dir - ), - "output-path" => section_index, - "merge-values" => {"#probe-definitions"=>"probes.html"} - ] - ], - AddFiles[ - "paths" => [File.expand_path( - File.join("config", "template", "template.tex"), this_dir - )], - "append-to-manifest?" => false, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-ready-to-build"), this_dir - ) - ], - AddFiles[ - "paths" => Dir[ - File.expand_path(File.join("src", "media", "*"), this_dir) - ], - "append-to-manifest?" => false, - "output-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-ready-to-build", "media"), this_dir - ) - ], - JoinManifestToString, - RunPandoc[ - "options" => [ - "--parse-raw", - "--standalone", - "--wrap=none", - '--variable geometry="margin=1in"', - '--variable urlcolor=cyan', - "--variable current_year=#{DateTime.now.year}", - #"--variable monofont='Courier New'", - #"--variable monofont='Inconsolatazi4-Regular.otf'", - "--latex-engine=xelatex", - disable_toc ? "" : "--table-of-contents", - disable_toc ? "" : "--toc-depth=#{TOC_DEPTH}", - "--number-sections", - "--smart", - "--template=template.tex", - #"--listings", - "--from markdown", - "--variable header=\"#{HEADER}\"", - "--variable footer=\"#{FOOTER}\"", - title ? "--variable title=\"#{title}\"" : "", - subtitle ? "--variable subtitle=\"#{subtitle}\"" : "", - date ? "--variable date=\"#{date}\"" : "", - draft ? "--variable draft=true" : "", - ].join(' '), - "output-path" => File.expand_path( - File.join(out_dir, out_file), this_dir - ), - "working-dir" => File.expand_path( - File.join(build_dir, tag, md_dir, "all-ready-to-build"), this_dir - ), - ], - ]] -end - -######################################## -# Tasks -######################################## -def time_it(&block) - start_time = Time.now - block.call - puts("Elapsed time: #{Time.now - start_time} seconds") -end - -desc "Setup gh-pages and node if used" -task :setup do - SetupGHPages[] if USE_GHPAGES - InstallNodeDeps[] if USE_NODE -end - -desc "Build single-page HTML" -task :build_html_single => [:setup] do - time_it do - puts("#"*60) - puts("Build Single-Page HTML") - tag = "cse-user-manual-single-page" - processed_manifest_path = File.join(BUILD_DIR, tag, 'md', 'preprocessed') - context = PREPROCESSOR_CONTEXT.merge({'build_type'=>'build_html_single'}) - PreprocessManifest[ - 'output-dir' => processed_manifest_path, - 'context' => context - ][[CSE_USER_MANUAL_MANIFEST_PATH]] - doc = YAML.load_file( - File.join( - processed_manifest_path, - File.basename(CSE_USER_MANUAL_MANIFEST_PATH) - ) - ) - manifest = doc["sections"] - levels = manifest.map {|level, _| level} - files = manifest.map {|_, path| path} - BuildSinglePageHTML[ - "tag" => tag, - "levels" => levels, - "draft?" => DRAFT, - "date" => DATE, - "output-dir" => OUTPUT_DIR, - "output-file-name" => "cse-user-manual.html", - "do-navigation?" => true, - "disable-compression?" => !USE_NODE, - "context" => context, - ][files] - puts("\nSingle-Page HTML DONE!") - puts("^"*60) - CheckManifests[processed_manifest_path] if VERIFY_MANIFEST - end -end - -desc "Build multi-page html" -task :build_html_multi => [:setup] do - time_it do - puts("#"*60) - puts("Build Multi-Page HTML") - tag = "cse-user-manual-multi-page" - processed_manifest_path = File.join(BUILD_DIR, tag, 'md', 'preprocessed') - context = PREPROCESSOR_CONTEXT.merge({'build_type'=>'build_html_multi'}) - PreprocessManifest[ - 'output-dir' => processed_manifest_path, - 'context' => context - ][[CSE_USER_MANUAL_MANIFEST_PATH]] - doc = YAML.load_file( - File.join( - processed_manifest_path, - File.basename(CSE_USER_MANUAL_MANIFEST_PATH) - ) - ) - manifest = doc["sections"] - levels = manifest.map {|level, _| level} - files = manifest.map {|_, path| path} - BuildMultiPageHTML[ - "tag" => tag, - "levels" => levels, - "draft?" => DRAFT, - "date" => DATE, - "output-dir" => File.join(OUTPUT_DIR, "cse-user-manual"), - "do-navigation?" => true, - "disable-compression?" => !USE_NODE, - "context" => context, - ][files] - puts("\nMulti-Page HTML DONE!") - puts("^"*60) - CheckManifests[processed_manifest_path] if VERIFY_MANIFEST - end -end - -desc "Build PDF" -task :build_pdf => [:setup] do - time_it do - puts("#"*60) - puts("Building PDF...(note: can take up to several minutes)") - tag = "cse-user-manual-pdf" - processed_manifest_path = File.join(BUILD_DIR, tag, 'md', 'preprocessed') - context = PREPROCESSOR_CONTEXT.merge({'build_type'=>'build_pdf'}) - PreprocessManifest[ - 'output-dir' => processed_manifest_path, - 'context' => context - ][[CSE_USER_MANUAL_MANIFEST_PATH]] - doc = YAML.load_file( - File.join( - processed_manifest_path, - File.basename(CSE_USER_MANUAL_MANIFEST_PATH) - ) - ) - manifest = doc["sections"] - levels = manifest.map {|level, _| level} - files = manifest.map {|_, path| path} - BuildPDF[ - "tag" => tag, - "levels" => levels, - "draft?" => DRAFT, - "output-dir" => File.join(OUTPUT_DIR, "pdfs"), - "output-file-name" => "cse-user-manual.pdf", - ][files] - puts("\nPDF DONE!") - puts("^"*60) - CheckManifests[processed_manifest_path] if VERIFY_MANIFEST - end -end - -desc "Build Site" -task :build_site => [:setup] do - time_it do - puts("#"*60) - puts("Build Site HTML") - tag = "web-site" - processed_manifest_path = File.join(BUILD_DIR, tag, 'md', 'preprocessed') - context = PREPROCESSOR_CONTEXT.merge({'build_type'=>'build_site'}) - PreprocessManifest[ - 'output-dir' => processed_manifest_path, - 'context' => context - ][[WEB_SITE_MANIFEST_PATH]] - doc = YAML.load_file( - File.join( - processed_manifest_path, - File.basename(WEB_SITE_MANIFEST_PATH) - ) - ) - manifest = doc["sections"] - levels = manifest.map {|level, _| level} - files = manifest.map {|_, path| path} - BuildMultiPageHTML[ - "tag" => tag, - "levels" => levels, - "date" => nil, - "draft?" => DRAFT, - "subtitle" => nil, - "title" => "California Simulation Engine", - "do-navigation?" => false, - "output-dir" => OUTPUT_DIR, - "disable-toc?" => true, - "disable-xlink?" => true, - "disable-compression?" => !USE_NODE, - "context" => context, - ][files] - puts("\nSite HTML DONE!") - puts("^"*60) - CheckManifests[processed_manifest_path] if VERIFY_MANIFEST - end -end - -all_builds = [:probes, :build_html_single, :build_html_multi, :build_site] -all_builds << :build_pdf if BUILD_PDF -all_builds << :verify_links if VERIFY_LINKS -all_builds << :coverage if RUN_COVERAGE -all_builds << :clean if DELETE_BUILD_DIR - -desc "Build everything" -task :build_all => all_builds - -desc "Check links for issues" -task :verify_links do - puts("Checking links") - problems = VerifyLinks::CheckLinks[OUTPUT_DIR] - problems.each do |p| - puts(" - #{p}") - end -end - -desc "Build everything (alias for build_all)" -task :build => [:build_all] - -desc "Removes the entire build directory. Note: you will loose build cache!" -task :clean_all do - Clean[BUILD_DIR] -end - -desc "Alias for clean_all" -task :clean do - Clean[BUILD_DIR] -end - -desc "Alias for clean_all" -task :reset do - Clean[BUILD_DIR] -end - -desc "Check manifests for missing/misspelled files" -task :check_manifests do - CheckManifests[SRC_DIR] -end - -desc "Render file specified with FILE env variable to #{ERB_OUTPUT_FILE}" -task :erb do - if ENV.include? "FILE" - Template::PreprocFile[ERB_BINDING_FN][ - ENV["FILE"], - ERB_OUTPUT_FILE, - 1, - "context" => PREPROCESSOR_CONTEXT - ] - else - puts("You must define the environment variable `FILE` so we\n" + - "know which file to test preprocessing with") - exit(1) - end -end - -desc "Run documentation coverage checker" -task :coverage do - all_passed = true - time_it do - puts("#"*60) - puts("Check CSE User Manual's Documentation Coverage") - CSE::CullList[] # Run CSE to produce input list (cullist.txt) - tag = "cse-user-manual-coverage" - processed_manifest_path = File.join(BUILD_DIR, tag, 'md', 'preprocessed') - context = PREPROCESSOR_CONTEXT.merge({'build_type'=>'build_html_single'}) - PreprocessManifest[ - 'output-dir' => processed_manifest_path, - 'context' => context - ][[CSE_USER_MANUAL_MANIFEST_PATH]] - doc = YAML.load_file( - File.join( - processed_manifest_path, - File.basename(CSE_USER_MANUAL_MANIFEST_PATH) - ) - ) - default_ignores = { - "records" => [], # ["record-name", ...], - "data-fields" => { - # "record-name" => ["field-name", ...], - }, - } - ignores = doc.fetch("ignore-coverage", default_ignores) - manifest = doc["sections"] - files = manifest.map {|_, path| path} - CheckCoverage[ - "tag" => tag, - "context" => context, - ][files] - ris1 = CoverageCheck::ReadCulList[ - File.join('config','reference','cullist.txt') - ] - files = Dir[File.join(BUILD_DIR, tag, 'md', 'preprocessed', 'records', '*.md')].map do |path| - File.join(BUILD_DIR, tag, 'md', 'normalize', File.basename(path)) - end - ris2 = CoverageCheck::ReadAllRecordDocuments[files] - ris3 = CoverageCheck::DropNameFieldsIfNotInRef[CoverageCheck::AdjustMap[ris2], ris1] - records_to_ignore = Set.new(ignores.fetch("records", [])) - records_to_ignore.sort.reduce(true) do |print_header, r| - puts("\nIgnoring the following records (and any subsequent field discrepancies):") if print_header - puts("- #{r}") - false - end - data_fields_to_ignore = lambda do - dfs = ignores.fetch("data-fields", {}) - ks = dfs.keys - ks.each do |k| - dfs[k] = Set.new(dfs[k]) - end - dfs - end.call - data_fields_to_ignore.keys.sort.reduce(true) do |print_header, r| - puts("\nIgnoring the following fields:") if print_header - data_fields_to_ignore[r].sort.each {|f| puts("- #{r}:#{f}")} - false - end - diffs = CoverageCheck::RecordInputSetDifferences[ - ris1, ris3, false, - records_to_ignore, - data_fields_to_ignore - ] - all_passed = diffs.nil? - diff_report = CoverageCheck::RecordInputSetDifferencesToString[ - diffs, "CSE", "Documentation" - ] - puts("\n\n"+diff_report) - File.write("documentation-coverage-report.txt", diff_report) - if all_passed - puts("\nCoverage Check: PASSED") - else - puts("\nCoverage Check: FAILED") - end - puts("^"*60) - exit(1) unless all_passed - end -end - -desc "Generate probes yaml input" -task :probes do - BuildProbesYaml[] -end - -Rake::TestTask.new(:test) do |t| - t.libs << "test" - t.libs << "lib" - t.test_files = FileList['test/**/*_test.rb'] -end - -desc "start an irb console in the rakefile context" -task :irb do - binding.irb -end - -def set_local_config(key, value) - new_config = if File.exist?(CONFIG_FILE) then YAML.load_file(CONFIG_FILE) else {} end - new_config[key] = value - File.open(CONFIG_FILE, 'w') {|f| YAML.dump(new_config, f)} -end - -desc "Set coverage report off by default by writing to local config file" -task :set_coverage_off_by_default do - set_local_config("coverage?", false) - puts("Local config updated to not run coverage by default; Path: #{CONFIG_FILE}") -end - -desc "Set coverage report on by default by writing to local config file" -task :set_coverage_on_by_default do - set_local_config("coverage?", true) - puts("Local config updated to run coverage by default; Path: #{CONFIG_FILE}") -end - -task :default => [:build_all] diff --git a/doc/src/about-cse.md b/doc/src/about-cse.md deleted file mode 100644 index ee49bd0e0..000000000 --- a/doc/src/about-cse.md +++ /dev/null @@ -1,7 +0,0 @@ -# About CSE - -## About CSE - -### About CSE - -To be written diff --git a/doc/src/coverage.py b/doc/src/coverage.py new file mode 100644 index 000000000..4f8cc3cd3 --- /dev/null +++ b/doc/src/coverage.py @@ -0,0 +1,606 @@ +from pathlib import Path +import re +from typing import Dict, Set, Optional, Any, List +import copy +import subprocess +import argparse + + +class CoverageCheck: + """ + A class for checking coverage between the output of "cse -c" and the markdown content in docs/input-data (or shared). + """ + + IGNORED_HEADERS = {"related probes", "inverse"} + + # Files in input-data directory that should not be analyzed for coverage. + IGNORED_INPUT_DATA_FILE_PATHS = [".nav.yml", "index.md"] + + # The key is a record name that will be enriched with data members from the content + # in the markdown file in the shared directory. + SHARED = { + "dhwheater": "dhwheater-doc.md", + "dhwloopheater": "dhwheater-doc.md", + } + + # cullist outputs enumerated data members. Docs aliases these with just the "N" postfix. + # For example, cullist outputs "cpStage1", etc. while docs uses "cpStageN". + ALIASES = { + "cpstagen": [ + "cpstage1", + "cpstage2", + "cpstage3", + "cpstage4", + "cpstage5", + "cpstage6", + "cpstage7", + ], + "hpstagen": [ + "hpstage1", + "hpstage2", + "hpstage3", + "hpstage4", + "hpstage5", + "hpstage6", + "hpstage7", + ], + } + + @staticmethod + def md_header(line: str, levels: List[int]) -> Optional[str]: + """ + Checks whether the given line is a heading at the level specified by levels. + + Args: + line: A line of markdown text + levels: List of heading levels (1-6) to match. Defaults to [1]. + + Returns: + The heading value if found and level matches, None otherwise + """ + match = re.match(r"^(#+)\s+(.*)$", line) + if match: + hash_count = len(match.group(1)) + if hash_count in levels: + return match.group(2).strip() + return None + + @staticmethod + def record_header(line: str) -> str | None: + """ + Thin wrapper of md_header for finding h1 record headers. + + Args: + line: A line of markdown text + + Returns: + The record header if found and not ignored, None otherwise + """ + + heading = CoverageCheck.md_header(line, [1]) + + return ( + heading.strip() if heading and not CoverageCheck.ignore(heading) else None + ) + + @staticmethod + def data_item_header(line: str) -> List[str]: + """ + Thin wrapper of md_header for finding h3 data item headers. + + Args: + line: A line of markdown text + + Returns: + The data item header(s) if found and not ignored, None otherwise + """ + + heading = CoverageCheck.md_header(line, [3]) + + if not heading: + return [] + + return [ + result.strip() + for result in heading.split(",") + if not CoverageCheck.ignore(result) + ] + + @staticmethod + def ignore(header: str) -> bool: + """ + Return True if the given header should be ignored. + + Args: + header: Header string to check + + Returns: + True if header should be ignored, False otherwise + """ + h = header.lower() + return h in CoverageCheck.IGNORED_HEADERS + + @staticmethod + def parse_record_document( + content: str, expect_orphan_data_items: Optional[bool] = False + ) -> Dict[str, Set[str]]: + """ + Given the content of a markdown document of a record and its input, return + a RecordInputSet for the records and input fields found in that document. + + Args: + content: The markdown document content + + Returns: + Dictionary mapping record names to sets of input field names + """ + output = {} + current_header = None + + for line in content.splitlines(): + line = line.rstrip() + h = CoverageCheck.record_header(line) + if h and not CoverageCheck.ignore(h): + current_header = h + if current_header not in output: + output[current_header] = set() + else: + input_hdr = CoverageCheck.data_item_header(line) + + if len(input_hdr) == 0: + continue + + if not current_header and "orphan_members" not in output: + output["orphan_members"] = set() + + for ih in input_hdr: + ih_lower_strip = ih.strip().lower() + resolved_heading = ( + CoverageCheck.ALIASES[ih_lower_strip] + if ih_lower_strip in CoverageCheck.ALIASES + else ih_lower_strip + ) + if type(resolved_heading) is list: + for item in resolved_heading: + output[current_header or "orphan_members"].add(item) + else: + output[current_header or "orphan_members"].add(resolved_heading) + + if not expect_orphan_data_items and "orphan_members" in output: + print(output["orphan_members"]) + raise Exception("Found orphan members but expect_orphan_data_items=False") + + return output + + @staticmethod + def read_record_document( + path: str, expect_orphan_data_items: Optional[bool] = False + ) -> Dict[str, Set[str]]: + """ + Given a file path to a markdown document containing record documentation, + return a RecordInputSet for the records and input fields found in that + document. + + Args: + path: Path to the markdown file + + Returns: + Dictionary mapping record names to sets of input field names + """ + with open(path, "r", encoding="utf-8") as f: + content = f.read() + + return CoverageCheck.parse_record_document(content, expect_orphan_data_items) + + @staticmethod + def read_all_record_documents(paths: List[str]) -> Dict[str, Set[str]]: + """ + Given an array of file paths to record documentation, consecutively + construct a RecordInputSet from all of the documents listed. Note: it is an + error for a document to define the same Record Name, Record Input Field + combination. + + Args: + paths: List of file paths to markdown documents + + Returns: + Dictionary mapping record names to sets of input field names + + Raises: + ValueError: If duplicate keys are found + """ + output = {} + for path in paths: + new_output = CoverageCheck.read_record_document(path) + for k in new_output.keys(): + if k in output: + raise ValueError(f"Duplicate keys found: {k} at {path}") + output.update(new_output) + return output + + @staticmethod + def parse_cul_list(content: str) -> Dict[str, Set[str]]: + """ + Given the string content of the results of `cse -c > cullist.txt`, + parse that into a RecordInputSet. + + Args: + content: Content of the cullist.txt file + + Returns: + Dictionary mapping record names to sets of field names + """ + output = {} + current_record = None + + lines = content.splitlines() + for idx, line in enumerate(lines): + if idx <= 3: # Skip first 4 lines + continue + + line = line.rstrip() + record_match = re.match(r"^(\S+).*$", line) + if record_match: + current_record = record_match.group(1).strip() + if current_record not in output: + output[current_record] = set() + elif current_record is not None: + field_match = re.match(r"^ (\S+).*$", line) + if field_match: + output[current_record].add(field_match.group(1).strip()) + + return output + + @staticmethod + def set_differences( + s1: Set[str], + s2: Set[str], + case_matters: bool = False, + keys_to_ignore: Optional[Set[str]] = None, + ) -> Optional[Dict[str, Set[str]]]: + """ + Given two sets and an optional flag that controls case sensitivity, + check for differences between the contents of set 1 and set 2. + + Args: + s1: First set + s2: Second set + case_matters: If True compare with case, else case-insensitive + keys_to_ignore: Set of keys to ignore + + Returns: + Dictionary with 'in_1st_not_2nd' and 'in_2nd_not_1st' keys, or None if no differences + """ + if keys_to_ignore is None: + keys_to_ignore = set() + + if s1 == s2: + return None + + if case_matters: + s1_ = s1 - keys_to_ignore + s2_ = s2 - keys_to_ignore + if s1_ == s2_: + return None + return {"in_1st_not_2nd": s1_ - s2_, "in_2nd_not_1st": s2_ - s1_} + else: + keys_to_ignore_dc = {k.lower() for k in keys_to_ignore} + m1 = {item.lower(): item for item in s1} + m2 = {item.lower(): item for item in s2} + s1_ = set(m1.keys()) - keys_to_ignore_dc + s2_ = set(m2.keys()) - keys_to_ignore_dc + + if s1_ == s2_: + return None + + return { + "in_1st_not_2nd": {m1[k] for k in (s1_ - s2_ - keys_to_ignore_dc)}, + "in_2nd_not_1st": {m2[k] for k in (s2_ - s1_ - keys_to_ignore_dc)}, + } + + @staticmethod + def adjust_map(m: Dict[str, Set[str]]) -> Dict[str, Set[str]]: + """ + Given a map from string to set of string, adjust the map so that fields + with spacing in them get collapsed to the record defined by the first word + through set union. + + Args: + m: Dictionary to adjust + + Returns: + Adjusted dictionary + """ + n = {} + for k, v in m.items(): + new_k = k.split()[0] if " " in k else k + if new_k in n: + n[new_k] = n[new_k].union(v) + else: + n[new_k] = v.copy() + return n + + @staticmethod + def downcase_record_input_set(ris: Dict[str, Set[str]]) -> Dict[str, Set[str]]: + """ + Downcase a record input set. + + Args: + ris: Record input set + + Returns: + Downcased record input set + """ + n = {} + for k, vs in ris.items(): + n[k.lower()] = {v.lower() for v in vs} + return n + + @staticmethod + def record_input_set_differences( + ris1: Dict[str, Set[str]], + ris2: Dict[str, Set[str]], + case_matters: bool = False, + records_to_ignore: Optional[List[str]] = None, + record_fields_to_ignore: Optional[Dict[str, Set[str]]] = None, + ) -> Optional[Dict[str, Any]]: + """ + Given two RecordInputSet objects, compare them and return any differences. + + Args: + ris1: First record input set + ris2: Second record input set + case_matters: Whether case matters in comparison + records_to_ignore: Set of record names to ignore + record_fields_to_ignore: Map of record names to sets of fields to ignore + + Returns: + Dictionary of differences or None if no differences + """ + if records_to_ignore is None: + records_to_ignore = set() + if record_fields_to_ignore is None: + record_fields_to_ignore = {} + + if not case_matters: + # Downcase everything if case doesn't matter + ris1 = {k.lower(): {v.lower() for v in vs} for k, vs in ris1.items()} + ris2 = {k.lower(): {v.lower() for v in vs} for k, vs in ris2.items()} + records_to_ignore = {k.lower() for k in records_to_ignore} + record_fields_to_ignore = { + k.lower(): v for k, v in record_fields_to_ignore.items() + } + + if ris1 == ris2: + return None + + ks1 = set(ris1.keys()) + ks2 = set(ris2.keys()) + key_diffs = CoverageCheck.set_differences( + ks1, ks2, case_matters, records_to_ignore + ) + + out = None + if key_diffs: + out = { + "records_in_1st_not_2nd": key_diffs["in_1st_not_2nd"], + "records_in_2nd_not_1st": key_diffs["in_2nd_not_1st"], + } + + # Check fields + ks = ks1 & ks2 + for k in ks: + if k in records_to_ignore: + continue + + field_ignores = record_fields_to_ignore.get(k, set()) + diffs = CoverageCheck.set_differences( + ris1.get(k, set()), ris2.get(k, set()), case_matters, field_ignores + ) + + if diffs: + if out is None: + out = { + "records_in_1st_not_2nd": None, + "records_in_2nd_not_1st": None, + } + if "field_set_differences" not in out: + out["field_set_differences"] = {} + out["field_set_differences"][k] = diffs + + return out + + @staticmethod + def diffs_to_string( + diffs: Optional[Dict[str, Set[str]]], + name: Optional[str], + k1: str, + k2: str, + a: str, + b: str, + indent: int = 0, + ) -> str: + """ + Given a map of differences, format them as a string report. + + Args: + diffs: Dictionary of differences + name: Name of what the map represents + k1, k2: Keys into the differences map + a, b: Names for the two variations being compared + indent: Number of spaces to indent + + Returns: + Formatted string report + """ + if diffs is None: + return "" + + ind = " " * indent + s = "" + + if name and diffs and (diffs.get(k1) or diffs.get(k2)): + s += f"{name}:\n" + + for k, x, y in [(k1, a, b), (k2, b, a)]: + if diffs.get(k) and diffs[k]: + s += f"{ind}in {x} but not in {y}:\n" + for r in sorted(diffs[k]): + s += f"{ind}- {r}\n" + + return s + + def __init__(self, path_to_cse: Path, path_to_input_data: Path): + self.path_to_cse = path_to_cse + self.path_to_input_data = path_to_input_data + + cullist_raw = subprocess.run( + [self.path_to_cse, "-c"], + capture_output=True, + text=True, + ).stdout + + self.cullist = self.parse_cul_list(cullist_raw) + self.check() + + def drop_name_fields( + self, + ris: Dict[str, Set[str]], + case_sensitive: bool = False, + ) -> Dict[str, Set[str]]: + """ + Given a record input set, drop all fields + that end with "Name" UNLESS they also appear in cullist. + + Args: + ris: Record input set to process + ref: Reference record input set + case_sensitive: Whether to compare case-sensitively + + Returns: + Processed record input set + """ + if not case_sensitive: + ref = self.downcase_record_input_set(self.cullist) + + name_suffix = "Name" if case_sensitive else "name" + n = {} + + for k, vs in ris.items(): + kk = k if case_sensitive else k.lower() + n[k] = set() + for v in vs: + w = v if case_sensitive else v.lower() + if w.endswith(name_suffix) and not (kk in ref and w in ref[kk]): + continue # Skip this field + n[k].add(v) + + return n + + def check(self): + all_file_paths_in_input_data = [ + path + for path in self.path_to_input_data.iterdir() + if path.is_file() and path.name not in self.IGNORED_INPUT_DATA_FILE_PATHS + ] + + input_data_headings = self.read_all_record_documents( + all_file_paths_in_input_data + ) + + shared_map = {} + for k, v in self.SHARED.items(): + path = self.path_to_input_data.parent / "shared" / v + headings = self.read_record_document(path, expect_orphan_data_items=True) + shared_map[k] = headings["orphan_members"] + + docs_headings = copy.deepcopy(input_data_headings) + for k, v in shared_map.items(): + if k not in docs_headings: + docs_headings[k] = set() + for h in v: + docs_headings[k].add(h) + + docs_headings = self.drop_name_fields(self.adjust_map(docs_headings)) + self.diffs = self.record_input_set_differences( + self.cullist, docs_headings, records_to_ignore=self.IGNORED_HEADERS + ) + + self.passed = self.diffs is None + + return self.passed + + def record_input_set_differences_to_string(self) -> str: + """ + Given the output of record_input_set_differences, format it and return as a string. + + Args: + diffs: Output from record_input_set_differences + a: Name for first set (default: "First") + b: Name for second set (default: "Second") + + Returns: + Formatted string report + """ + a = "cullist" + b = "input-data" + + self.check() + diffs = self.diffs + + if diffs is None: + return f"No changes detected between {a} and {b}" + + s = "" + + if diffs.get("records_in_1st_not_2nd") or diffs.get("records_in_2nd_not_1st"): + s += "RECORD INCONSISTENCIES:\n" + s += CoverageCheck.diffs_to_string( + diffs, None, "records_in_1st_not_2nd", "records_in_2nd_not_1st", a, b, 4 + ) + + if diffs.get("field_set_differences"): + ks = sorted(diffs["field_set_differences"].keys()) + if ks: + s += "DATA FIELD INCONSISTENCIES:\n" + for k in ks: + s += CoverageCheck.diffs_to_string( + diffs["field_set_differences"][k], + k, + "in_1st_not_2nd", + "in_2nd_not_1st", + a, + b, + 4, + ) + + return s + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Coverage Checker for CSE Documenation built with Mkdocs" + ) + parser.add_argument( + "--path_to_cse", + type=str, + help="The path to the CSE executable.", + ) + + parser.add_argument( + "--path_to_input_data", + type=str, + help="The path to the documentation's input-data folder.", + default=((Path(__file__).parent / "docs" / "input-data").resolve().absolute()), + ) + + args = parser.parse_args() + + coverage_checker = CoverageCheck( + Path(args.path_to_cse), Path(args.path_to_input_data) + ) + + if coverage_checker.passed: + print("Passed!") + else: + print(coverage_checker.record_input_set_differences_to_string()) diff --git a/doc/src/cse-user-manual.yaml b/doc/src/cse-user-manual.yaml deleted file mode 100644 index 030243d73..000000000 --- a/doc/src/cse-user-manual.yaml +++ /dev/null @@ -1,113 +0,0 @@ -description: "CSE User's Manual" -tag: "cse-user-manual" -metadata: - title: "CSE User's Manual" - subtitle: "California Simulation Engine" - date: "February 23, 2016" -url-multipage: "cse-user-manual" -url-singlepage: ~ -url-pdf: "pdfs" -media-dir: "media" -cross-link?: true -build-singlepage-html?: true -html-singlepage-name: "cse-user-manual.html" -pdf-name: "cse-user-manual.pdf" -build-multipage-html?: true -build-pdf?: true -html-template: "../config/template/site-template.html" -pdf-template: "../config/template/template.tex" -pdf-exceptions: ["index.md"] -build-table-of-contents?: true -toc-depth: 3 -table-of-contents-name: "index.md" -build-probes?: true -sp-append-probes-to: 'output-reports.md' -mp-append-probes-to: 'output-reports.md' -html-navigation?: true -html-site-top: "/index.html" -html-site-toc: "/cse-user-manual/index.html" -css-files: - - "/css/base.css" -ignore-coverage: - records: - - "inverse" - data-fields: - coolplant: - - "cpStage2" - - "cpStage3" - - "cpStage4" - - "cpStage5" - - "cpStage6" - - "cpStage7" - - "cpstage2 through cpstage7 same" - heatplant: - - "hpStage2" - - "hpStage3" - - "hpStage4" - - "hpStage5" - - "hpStage6" - - "hpStage7" - - "hpstage2 through hpstage7 same" -sections: - - [1, "introduction.md"] - - [1, "operation.md"] - - [1, "input-structure.md"] - - [1, "input-data.md"] - - [2, "records/top-members.md"] - - [2, "records/holiday.md"] - - [2, "records/descond.md"] - - [2, "records/material.md"] - - [2, "records/construction.md"] - - [2, "records/foundation.md"] - - [2, "records/fndblock.md"] - - [2, "records/layer.md"] - - [2, "records/glazetype.md"] - - [2, "records/meter.md"] - - [2, "records/dhwmeter.md"] - - [2, "records/afmeter.md"] - - [2, "records/loadmeter.md"] - - [2, "records/zone.md"] - - [2, "records/gain.md"] - - [2, "records/surface.md"] - - [2, "records/window.md"] - - [2, "records/shade.md"] - - [2, "records/sgdist.md"] - - [2, "records/door.md"] - - [2, "records/perimeter.md"] - - [2, "records/terminal.md"] - - [2, "records/izxfer.md"] - - [2, "records/doas.md"] - - [2, "records/rsys.md"] - - [2, "records/ductseg.md"] - - [2, "records/performancemap.md"] - - [2, "records/dhwdayuse.md"] - - [2, "records/dhwuse.md"] - - [2, "records/dhwsys.md"] - - [2, "records/dhwheater.md"] - - [2, "records/dhwloopheater.md"] - - [2, "records/dhwheatrec.md"] - - [2, "records/dhwtank.md"] - - [2, "records/dhwpump.md"] - - [2, "records/dhwloop.md"] - - [2, "records/dhwlooppump.md"] - - [2, "records/dhwloopseg.md"] - - [2, "records/dhwloopbranch.md"] - - [2, "records/dhwsolarsys.md"] - - [2, "records/dhwsolarcollector.md"] - - [2, "records/pvarray.md"] - - [2, "records/shadex.md"] - - [2, "records/battery.md"] - - [2, "records/airhandler.md"] - - [2, "records/heatplant.md"] - - [2, "records/boiler.md"] - - [2, "records/coolplant.md"] - - [2, "records/chiller.md"] - - [2, "records/towerplant.md"] - - [2, "records/reportfile.md"] - - [2, "records/report.md"] - - [2, "records/reportcol.md"] - - [2, "records/exportfile.md"] - - [2, "records/export.md"] - - [2, "records/exportcol.md"] - - [2, "records/importfile.md"] - - [1, "output-reports.md"] diff --git a/doc/src/docs/.nav.yml b/doc/src/docs/.nav.yml new file mode 100644 index 000000000..88b1a00b7 --- /dev/null +++ b/doc/src/docs/.nav.yml @@ -0,0 +1,8 @@ +nav: +- introduction.md +- operation.md +- input-structure.md +- input-data +- output-reports.md +- probe-definitions +not_in_nav: index.md diff --git a/doc/src/media/diagram-source-CSE.pptx b/doc/src/docs/assets/images/diagram-source-CSE.pptx similarity index 100% rename from doc/src/media/diagram-source-CSE.pptx rename to doc/src/docs/assets/images/diagram-source-CSE.pptx diff --git a/doc/src/media/fd_block_basement.png b/doc/src/docs/assets/images/fd_block_basement.png similarity index 100% rename from doc/src/media/fd_block_basement.png rename to doc/src/docs/assets/images/fd_block_basement.png diff --git a/doc/src/media/fd_block_slab.png b/doc/src/docs/assets/images/fd_block_slab.png similarity index 100% rename from doc/src/media/fd_block_slab.png rename to doc/src/docs/assets/images/fd_block_slab.png diff --git a/doc/src/media/fd_context_basement.png b/doc/src/docs/assets/images/fd_context_basement.png similarity index 100% rename from doc/src/media/fd_context_basement.png rename to doc/src/docs/assets/images/fd_context_basement.png diff --git a/doc/src/media/fd_context_slab.png b/doc/src/docs/assets/images/fd_context_slab.png similarity index 100% rename from doc/src/media/fd_context_slab.png rename to doc/src/docs/assets/images/fd_context_slab.png diff --git a/doc/src/media/fd_refs.png b/doc/src/docs/assets/images/fd_refs.png similarity index 100% rename from doc/src/media/fd_refs.png rename to doc/src/docs/assets/images/fd_refs.png diff --git a/doc/src/media/image1.png b/doc/src/docs/assets/images/image1.png similarity index 100% rename from doc/src/media/image1.png rename to doc/src/docs/assets/images/image1.png diff --git a/doc/src/media/pv_fixed.png b/doc/src/docs/assets/images/pv_fixed.png similarity index 100% rename from doc/src/media/pv_fixed.png rename to doc/src/docs/assets/images/pv_fixed.png diff --git a/doc/src/media/pv_horiz_tracker_east.png b/doc/src/docs/assets/images/pv_horiz_tracker_east.png similarity index 100% rename from doc/src/media/pv_horiz_tracker_east.png rename to doc/src/docs/assets/images/pv_horiz_tracker_east.png diff --git a/doc/src/media/pv_horiz_tracker_south.png b/doc/src/docs/assets/images/pv_horiz_tracker_south.png similarity index 100% rename from doc/src/media/pv_horiz_tracker_south.png rename to doc/src/docs/assets/images/pv_horiz_tracker_south.png diff --git a/doc/src/media/pv_tilted_tracker_south.png b/doc/src/docs/assets/images/pv_tilted_tracker_south.png similarity index 100% rename from doc/src/media/pv_tilted_tracker_south.png rename to doc/src/docs/assets/images/pv_tilted_tracker_south.png diff --git a/doc/src/docs/assets/javascript/extra_js.js b/doc/src/docs/assets/javascript/extra_js.js new file mode 100644 index 000000000..06577d0cb --- /dev/null +++ b/doc/src/docs/assets/javascript/extra_js.js @@ -0,0 +1,22 @@ +document$.subscribe(function () { + var tables = document.querySelectorAll("article table:not([class])"); + tables.forEach(function (table) { + // The only way to have only two rows is to have either: + // - a header with one row (no need for sorting) + // - no header with two rows (again, no need for soring, since header is hidden) + if (table.querySelectorAll('tr').length === 2) return; + + new Tablesort(table); + }); +}); + +document$.subscribe(({ body }) => { + renderMathInElement(body, { + delimiters: [ + { left: "$$", right: "$$", display: true }, + { left: "$", right: "$", display: false }, + { left: "\\(", right: "\\)", display: false }, + { left: "\\[", right: "\\]", display: true }, + ], + }); +}); diff --git a/doc/src/docs/assets/stylesheets/extra_styles.css b/doc/src/docs/assets/stylesheets/extra_styles.css new file mode 100644 index 000000000..4dcc0b710 --- /dev/null +++ b/doc/src/docs/assets/stylesheets/extra_styles.css @@ -0,0 +1,107 @@ +.md-typeset .admonition, .md-typeset details { + font-size: 0.9em; +} + +@media screen and (min-width: 76.25em) { + .md-nav { + transition: unset !important; + } +} + +.no-header-table + * table:not([class]) thead { + display: none; +} + +.no-header-table + * table:not([class]) tr:first-child td { + border-top: none; +} + +.member-table-sibling + * .md-typeset__table { + width: 100%; +} + +.member-table-sibling + * table:not([class]) { + border-radius: 6px; + display: table; + table-layout: fixed; + width: 100%; +} + +/* General dl styling */ +.md-typeset dl, dl code { + font-size: 14.8px; +} + +.md-typeset dl dt, +.md-typeset dl dd, +.md-typeset dl dd > p, +.md-typeset dl dd > div { + margin-block: 0; +} + +.md-typeset dl * + dt { + margin-top: 1em; +} + +/* Nested dl styling customizations */ +.nested-dl, .nested-dl + .admonition { + margin-left: 1.875em; +} + +.nested-dl { + grid-template-columns: fit-content(25%) 1fr; + display: grid; + gap: 0.5em +} + +.nested-dl > dt { + grid-column: 1 / 2; + margin: 0 !important; + text-align: end; +} + +.nested-dl > dd { + grid-column: 2 / 3; + margin: 0 !important +} + + +/* Fix code block alignment if a code block appears (first) as the description value for a description item. + +Supported term +: Some text can come first + + ```Then a text block can appear. We don't want margin-top: 0 for this code block``` + +Unsupported term +: ```code block can't be the first part/block of a description value``` + +Workaround term requiring margin-top fix +: + ```code block as description value starts on the next line``` */ +.nested-dl dd > div:first-child > pre:has(code) { + margin-top: 0; +} + +.probe-table-sibling + * .md-typeset__table { + width: 100%; +} + +.probe-table-sibling + * table:not([class]) { + border-radius: 6px; + display: table; + table-layout: fixed; + width: 100%; +} + +.probe-table-sibling + * table:not([class]) th:last-child { + width: 40%; +} + +.probe-table-sibling + * table:not([class]) th:first-child { + width: 25%; +} + +.md-typeset img { + max-width: 50%; +} \ No newline at end of file diff --git a/doc/src/docs/assets/tables/input-data--member-table-definition.csv b/doc/src/docs/assets/tables/input-data--member-table-definition.csv new file mode 100644 index 000000000..dd9cd920c --- /dev/null +++ b/doc/src/docs/assets/tables/input-data--member-table-definition.csv @@ -0,0 +1,6 @@ +"Header", Meaning +"Units","units of measure (lb., ft, Btu, etc.) where applicable" +"Legal Range","limits of valid range for numeric inputs; valid choices for *choice* members, etc." +"Default","value assumed if member not given; applicable only if not required" +"Required","YES if you must give this member" +"Variability","how often the given expression can change: hourly, daily, etc. See sections on [expressions][expressions-overview], [statements][member-statements], and [variation frequencies][variation-frequencies-revisited]" diff --git a/doc/src/index.md b/doc/src/docs/index.md similarity index 73% rename from doc/src/index.md rename to doc/src/docs/index.md index 5e84df04f..651d185a6 100644 --- a/doc/src/index.md +++ b/doc/src/docs/index.md @@ -9,13 +9,8 @@ CSE is a general purpose building simulation model developed primarily to perfor ## CSE User Manual {-} -- [HTML Format](cse-user-manual/index.html) (multiple pages) -- [HTML Format](cse-user-manual.html) (single page) +WIP ## CSE Source Code {-} The CSE source code is hosted on [GitHub](https://github.com/cse-sim/cse). - -<% if test_erb %> -ERB is Working! -<% end %> diff --git a/doc/src/docs/input-data/.nav.yml b/doc/src/docs/input-data/.nav.yml new file mode 100644 index 000000000..b8da25d59 --- /dev/null +++ b/doc/src/docs/input-data/.nav.yml @@ -0,0 +1,60 @@ +title: Input Data +nav: + - index.md + - TOP Members: top-members.md + - HOLIDAY: holiday.md + - DESCOND: descond.md + - MATERIAL: material.md + - CONSTRUCTION: construction.md + - FOUNDATION: foundation.md + - FNDBLOCK: fndblock.md + - LAYER: layer.md + - GLAZETYPE: glazetype.md + - METER: meter.md + - DHWMETER: dhwmeter.md + - AFMETER: afmeter.md + - LOADMETER: loadmeter.md + - ZONE: zone.md + - GAIN: gain.md + - SURFACE: surface.md + - WINDOW: window.md + - SHADE: shade.md + - SGDIST: sgdist.md + - DOOR: door.md + - PERIMETER: perimeter.md + - TERMINAL: terminal.md + - IZXFER: izxfer.md + - DOAS: doas.md + - RSYS: rsys.md + - DUCTSEG: ductseg.md + - PERFORMANCEMAP: performancemap.md + - DHWDAYUSE: dhwdayuse.md + - DHWUSE: dhwuse.md + - DHWSYS: dhwsys.md + - DHWHEATER: dhwheater.md + - DHWLOOPHEATER: dhwloopheater.md + - DHWHEATREC: dhwheatrec.md + - DHWTANK: dhwtank.md + - DHWPUMP: dhwpump.md + - DHWLOOP: dhwloop.md + - DHWLOOPPUMP: dhwlooppump.md + - DHWLOOPSEG: dhwloopseg.md + - DHWLOOPBRANCH: dhwloopbranch.md + - DHWSOLARSYS: dhwsolarsys.md + - DHWSOLARCOLLECTOR: dhwsolarcollector.md + - PVARRAY: pvarray.md + - SHADEX: shadex.md + - BATTERY: battery.md + - AIRHANDLER: airhandler.md + - HEATPLANT: heatplant.md + - BOILER: boiler.md + - COOLPLANT: coolplant.md + - CHILLER: chiller.md + - TOWERPLANT: towerplant.md + - REPORTFILE: reportfile.md + - REPORT: report.md + - REPORTCOL: reportcol.md + - EXPORTFILE: exportfile.md + - EXPORT: export.md + - EXPORTCOL: exportcol.md + - IMPORTFILE: importfile.md \ No newline at end of file diff --git a/doc/src/records/afmeter.md b/doc/src/docs/input-data/afmeter.md similarity index 67% rename from doc/src/records/afmeter.md rename to doc/src/docs/input-data/afmeter.md index d9097731a..07b8c5701 100644 --- a/doc/src/records/afmeter.md +++ b/doc/src/docs/input-data/afmeter.md @@ -8,33 +8,37 @@ If any AFMETERs are defined, an additional AFMETER "sum_of_AFMETERs" is automati Note that *only* AirNet flows are recorded. -AFMETER results can be REPORTed using rpType=AFMTR (or EXPORTed using exType=AFMTR). See [Air Flow Meter Report](#air-flow-meter-report). +AFMETER results can be REPORTed using rpType=AFMTR (or EXPORTed using exType=AFMTR). See [Air Flow Meter Report][air-flow-meter-report]. -**afMtrName** +### afMtrName Name of meter: required for assigning air flows to the AFMETER. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") -%> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**endAFMeter** +### endAFMeter Indicates the end of the meter definition. Alternatively, the end of the meter definition can be indicated by the declaration of another object or by END. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") -%> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[afmeter](#p_afmeter) +- @[afmeter][p_afmeter] diff --git a/doc/src/docs/input-data/airhandler.md b/doc/src/docs/input-data/airhandler.md new file mode 100644 index 000000000..915641d6c --- /dev/null +++ b/doc/src/docs/input-data/airhandler.md @@ -0,0 +1,2405 @@ +# AIRHANDLER + +AIRHANDLER defines a central air handling system, containing a fan or fans, optional heating and cooling coils, and optional outside air intake and exhaust. AIRHANDLERs are subobjects of TOP, and deliver air to one or more ZONEs through TERMINAL(s). AIRHANDLER objects can be used to model fan ventilation and forced air heating and cooling. Dual duct systems are modeled with two AIRHANDLERs (one for hot air and one for cool air) and two TERMINALs in each zone. Figure 2 shows…. \[need a sentence that explains the figure.\] + +![Air handler diagram](../assets/images/image1.png) +/// caption +Air handler diagram +/// + +AIRHANDLER is designed primarily to model a central system that supplies hot or cold air at a centrally determined temperature (the "Supply Temperature Setpoint") to Variable Air Volume (VAV) terminals in the zones. Some additional variations are also supported: + +1. The AIRHANDLER can model a constant volume, fan-always-on system, where the supply temperature varies to meet the load of a single zone (that is, the thermostat controls the heating and/or cooling coil, but not the fan). This is done by setting the terminal minimum flow, _tuVfMn,_ equal to the maximum flow, _tuVfMxH_ for heating and/or _tuVfMxC_ for cooling, and using a supply temperature control method that adjusts the temperature to the load (_ahTsSp_ = WZ, CZ, or ZN2, described below). + +2. The AIRHANDLER can model constant volume, fan cycling systems where the fan cycles with a single zone thermostat, running at full flow enough of the time to meet the load and shutting completely off the rest of the time, rather than running at variable flow to adjust to the demand from the zones. + + This variation is invoked by specifying _ahFanCycles_= YES (usually with _ahTsSp_=ZN, described below). The user should be aware that this is done by treating fractional flow as equivalent to fractional on-time in most of the program, adjusting for the higher flow and less than 100% duty cycle only in a few parts of the model known to be non-linear, such as computation of cooling coil performance, fan heat, and duct leakage. For example, the outside air inputs, designed for VAV modeling, won't work in the expected manner unless you keep this modeling method in mind. + +3. The AIRHANDLER can supply hot air, cold air, or shut off according to the requirements of a single zone. This variation is invoked by giving _ahTsSp_ = ZN or ZN2, both described further below. + +### ahName + +Name of air handler: give after the word AIRHANDLER. Required for reference in TERMINALs. + +{{ + member_table({ + "units": "", + "legal_range": "_63 characters_", + "default": "", + "required": "Yes", + "variability": "constant" + }) +}} + +### ahSched + +Type: _choice_ + +Air handler schedule; OFF or ON, hourly schedulable by using CSE expression. + +{{ + csv_table("OFF, supply fan off; air handler not operating. Old date? Note: (future) Taylor setback/setup control in effect, when implemented. +ON, supply fan runs, at varying volume according to TERMINAL demand (except if _ahFanCycles_ = YES, fan cycles on and off at full volume).") +}} + +The following might be used to run an air handler between 8 AM and 5 PM: + + ahSched = select( (\$hour > 8 && \$hour <= 5), ON, + default, OFF ); + +{{ + member_table({ + "units": "", + "legal_range": "ON/OFF", + "default": "ON", + "required": "No", + "variability": "hourly" + }) +}} + +### ahFxVfFan + +Type: _float_ + +Fan flow rate multiplier for autosized fan(s). The default value (1.1) specifies 10% oversizing. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "1.1", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Supply Air Temperature Controller + +### ahTsSp + +Type: _float or choice_ + +Supply temperature setpoint numeric value OR\* choice of control method (WZ, CZ, RA, ZN, or ZN2): + +{{ + csv_table("_float_, A numeric value specifies the supply temperature setpoint. An expression can be used to make dependent on time, weather, etc. +WZ, Warmest Zone: for cooling, sets the supply temperature setpoint each sub??hour so that the control zone (see*ahWzCzns*) requiring the coolest supply temperature can meet its load with its VAV damper 90% of the way from its minimum opening to its maximum, that is, at a flow of: _tuVfMn_ + .9(_tuVfMxC_ - \* tuVfMn\*). +CZ, Coolest Zone: analogous to WZ, but for heating +RA, Supply temperature setpoint value is controlled by return air temperature (this cannot be done with a CSE expression without lagging a subhour). See _ahTsRaMn_ and _ahTsRaMx_. +ZN, Causes air handler to switch between heating, OFF, and cooling as required by the load of a single zone. When the zone thermostat (modeled through the _tuTC_ and _tuTH_ inputs) calls for neither heating nor cooling, the air handler shuts down, including stopping its fan(s). Changes _ahFanCycles_ default to YES, to simulate a constant volume, fan cycling system. +, Supply temperature setpoint value when _ahFanCycles_ = YES is taken from _ahTsMn_ for cooling, from _ahTsMx_ for heating (actual temperatures expected to be limited by coil capacity since fan is running at full flow). When _ahFanCycles_ = NO, the setpoint is determined to allow meeting the load, as for WZ and CZ. +, When the zone is calling for neither heat nor cold, the air handler shuts down, including stopping its fan(s), regardless of the _ahFanCycles_ value. +ZN2, Causes air handler to switch between heating, cooling, and FAN ONLY operation as required by the load of a single zone. To model a constant volume system where the fan runs continuously, use ZN2 and set the terminal minimum flow (_tuVfMn_) equal to the maximum (_tuVfMxC_ and/or _tuVfMxH_). +, When _ahTsSp_ is ZN2, the supply temperature setpoint is determined to allow meeting the load, as for WZ and CZ, described above.") +}} + +Only when _ahTsSp_ is ZN or ZN2 does AIRHANDLER switches between heating and cooling supply temperatures according to demand. In other cases, there is but a single setpoint value or control method (RA, CZ, or WZ); if you want the control method or numeric value to change according to time of day or year, outside temperature, etc., your CSE input must contain an appropriate conditional expression for _ahTsSp_. + +Unless _ahTsSp_ is ZN or ZN2, the AIRHANDLER does not know whether it is heating or cooling, and will use either the heating coil or cooling coil, if available, as necessary, to keep the supply air at the single setpoint temperature. The coil schedule members, described below, allow you to disable present coils when you don't want them to operate, as to prevent cooling supply air that is already warm enough when heating the zones. For example, in an AIRHANDLER with both heating and cooling coils, if you are using a conditional expression based on outdoor temperature to change _ahTsSp_ between heating and cooling values, you may use expressions with similar conditions for _ahhcSched_ and _ahccSched_ to disable the cooling coil when heating and vice versa. (Expressions would also be used in the TERMINALS to activate their heating or cooling setpoints according to the same conditions.) + +Giving _ahTsSp_ is disallowed for an air handler with no economizer, no heat coil and no cooling coil. Such an AIRHANDLER object is valid as a ventilator; its supply temperature is not controlled. but rather determined by the outside temperature and/or the return air temperature. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_number_, RA\*, WZ, CZ, ZN\*\*, ZN2\*\*,", + "default": "0", + "required": "Yes, if coil(s) or economizer present", + "variability": "hourly" + }) +}} + +\* ahTsRaMn, ahTsRaMx, ahTsMn, and ahTsMx are _required_ input for this choice. + +\*\* only a single ZONE may be used with these choices. + +{{ + csv_table("**To Model**, **Use**, **Comments** +VAV heating _OR_ cooling system, _ahTsSp_ = _numeric expression, _ WZ, CZ, or RA, CSE models this most directly +VAV system that both heats and cools (single duct), Use a conditional expression to change _ahTsSp_ between heating and cooling values on the basis of outdoor temperature, date, or some other condition., Also use expressions to disable the unwanted coil and change each zone's setpoints according to same as _ahTsSp_. For example, when heating, use _ahccSched_ = OFF and _tuTC _= 999; and when cooling, use _ahhcSched_ = OFF and _tuTH_ = -99. +Dual duct heating cooling system, Use two AIRHANDLERs +Single zone VAV system that heats or cools per zone thermostat, _ahTsSp_ = ZN2, Supply fan runs, at flow _tuVfMn_, even when neither heating nor cooling. Supply temp setpoint determined as for CZ or WZ. +Single zone constant volume system that heats or cools per zone thermostat, e.g. PSZ., _ahTsSp_ = _ZN2_; _tuVfMn_ = _tuVfMxH_ = _tuVfMxC_, Supply fan circulates air even if neither heating nor cooling. Supply temp setpoint determined as for CZ or WZ. All _tuVf_'s same forces constant volume. +Single zone constant volume, fan cycling system that heats or cools per zone thermostat, e.g. PTAC, RESYS, or furnace., _ahTsSp_= ZN; _ahTsMx_ = heat supply temp setpoint; _ahTsMn_ = cool supply temp setpoint; _tuVfMn_= 0; tuVfMxH = tuVfMxC normally; _sfanVfDs_ >= max( _tuVfMxH, tuVfMxC)_ to minimize confusion about flow modeled., _AhFanCycles_ defaults to YES. Supply fan off when not heating or cooling. Flow when fan on is _tuVfMxH_ or _tuVfMxC_ as applicable (or _sfanVfDs \* sfanVfMxF_ if smaller).", True) +}} + +: Using AIRHANDLER to Model Various Systems + + + +### ahFanCycles + +Type: _choice_ + +Determines whether the fan cycles with the zone thermostat. + +{{ + csv_table("YES, Supply fan runs only for fraction of the subhour that the zone requests heating or cooling. When running, supply fan runs at full flow (i.e. constant volume), as determined by the more limiting of the air handler and terminal specifications. Use with a single zone only. Not allowed with _ahTsSp_ = ZN2. +NO, Normal CSE behavior for simulating VAV systems with continuously running (or scheduled), variable flow supply fans. (For constant volume, fan always on modeling, use NO, and make _tuVfMn_ equal to _tuVfMxH/C_.)") +}} + +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES when _ahTsSp_=ZN, NO otherwise", + "required": "No", + "variability": "hourly" + }) +}} + +### ahTsMn + +Type: _float_ + +Minimum supply temperature. Also used as cooling supply temperature setpoint value under _ahTsSp_ = ZN. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_no limit_; typically: 40 $\\le$ _x_ $\\le$ 140^o^", + "default": "0^o^F", + "required": "Only for _ahTsSp_=RA", + "variability": "hourly" + }) +}} + + + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_no limit_; typically: 40 $\\le$ _x_ $\\le$ 140^o^", + "default": "999^o^ F", + "required": "Only for _asTsSp_=RA; recommend giving for _ahTsSp_=ZN", + "variability": "hourly" + }) +}} + +### ahTsMx + +Type: _float_ + +Maximum supply temperature. Also used as heating supply temperature setpoint value under _ahTsSp_ = ZN. + + + +### ahWzCzns, ahCzCzns + +Type: _zone names_ or _ALL_ or _ALL_BUT zone names_** + +Specify zones monitored to determine supply temperature setpoint value (control zones), under _ahTsSp_=WZ and CZ respectively. + +{{ + csv_table("_zone names_, A list of zone names, with commas between them. Up to 15 names may be given. +ALL_BUT, May be followed by a a comma and list of up to 14 zone names; all zones on air handler other than these are the control zones. +ALL, Indicates that all zones with terminals connected to the air handler are control zones.") +}} + +A comma must be entered between zone names and after the word ALL_BUT. + + + +{{ + member_table({ + "units": "", + "legal_range": "_name(s) of ZONEs_ ALL ALL_BUT _zone Name(s)_", + "default": "ALL", + "required": "No", + "variability": "hourly" + }) +}} + +### ahTsDsC + +Type: _float_ + +Cooling design supply temperature, for sizing coil vs fan. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "x $>$ 0", + "default": "_ahTsMn_", + "required": "No", + "variability": "hourly" + }) +}} + +### ahTsDsH + +Type: _float_ + +Heating design supply temperature, for sizing coil vs fan. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "x $>$ 0", + "default": "_ahTsMx_", + "required": "No", + "variability": "hourly" + }) +}} + +### ahCtu + +Type: _terminal name_ + +Terminal monitored to determine whether to heat or cool under ZN and ZN2 supply temperature setpoint control. Development aid feature; believe there is no need to give this since ahTsSp = ZN or ZN2 should only be used with one zone. + +{{ + member_table({ + "units": "", + "legal_range": "name of a TERMINAL", + "default": "AIRHANDLER's TERMINAL, if only one", + "required": "If _ahTsSp_ = ZN with more than 1 TERMINAL", + "variability": "hourly" + }) +}} + + + +_AhTsRaMn_ and _ahTsRaMx_ are used when _ahTsSp_ is RA. + +### ahTsRaMn + +Type: _float_ + +Return air temperature at which the supply temperature setpoint is at the _maximum_ supply temperature, _ahTsMx_. + +### ahTsRaMx + +Type: _float_ + +Return air temperature at which the supply temperature setpoint is at the _minimum_ supply temperature, _ahTsMn_. + +When the return air temperature is between *ahTsRaMn*and _ahTsRaMx_, the supply temperature setpoint has a proportional value between _ahTsMx_ and _ahTsMn_. + +If return air moves outside the range _ahTsRaMn_ to _ahTsRaMx_, the supply temperature setpoint does not change further. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_no limit_; typically: 40 $\\le$ _x_ $\\le$ 140^o^", + "default": "_none_", + "required": " Only for _ahTsSp_=RA", + "variability": "hourly" + }) +}} + +## AIRHANDLER Supply fan + +All AIRHANDLERs have supply fans. + +### sfanType + +Type: _choice_ + +Supply fan type/position. A BLOWTHRU fan is located in the air path before the coils; a DRAWTHRU fan is after the coils. + +{{ + member_table({ + "units": "", + "legal_range": "DRAWTHRU, BLOWTHRU", + "default": "DRAWTHRU", + "required": "No", + "variability": "constant" + }) +}} + +### sfanVfDs + +Type: _float_ + +Design or rated (volumetric) air flow at rated pressure. Many fans will actually blow a larger volume of air at reduced pressure: see sfanVfMxF (next). + +{{ + member_table({ + "units": "cfm", + "legal_range": "_AUTOSIZE_ or _x_ $\\ge$ 0", + "default": "_none_", + "required": "Yes", + "variability": "constant" + }) +}} + +### sfanVfMxF + +Type: _float_ + +Overrun factor: maximum factor by which fan will exceed rated flow (at reduced pressure, not explicitly modeled). CSE delivers flows demanded by terminals until total flow at supply fan reaches sfanVfDs \* sfanVsMxF, then reduces maximum flows to terminals, keeping them in proportion to terminal design flows, to keep total flow at that value. + +We recommend giving 1.0 to eliminate overrun in constant volume modeling. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\ge$ 1.0", + "default": "1.3", + "required": "No", + "variability": "constant" + }) +}} + +### sfanPress + +Type: float + +Design or rated pressure. The work done by the fan is computed as the product of this pressure and the current flow, except that the flow is limited to sfanVfDs. That is, in overrun (see _sfanVfMxF_) it is assumed that large VAV terminal damper openings allow the pressure to drop in proportion to the flow over rated. This work is added to the air as heat at the fan, and is termed "fan heat". Setting sfanPress to zero will eliminate simulated fan heat for theoretical simulation of a coil only. + +{{ + member_table({ + "units": "inches H~2~O", + "legal_range": "_x_ $\\gt$ 0", + "default": "3", + "required": "No", + "variability": "constant" + }) +}} + +Prior text: At most, one of the next two items may be given: in combination with sfanVfDs and sfanPress, either is sufficient to compute the other. SfanCurvePy is then used to compute the mechanical power at the fan shaft at partial loads; sfanMotEff allows determining the electrical input from the shaft power. + +New possible text (after addition of sfanElecPwr): Only one of sfanElecPwr, sfanEff, and sfanShaftBhp may be given: together with sfanVfDs and xfanPress, any one is sufficient for CSE to determine the others and to compute the fan heat contribution to the air stream. + +### sfanElecPwr + +Type: _float_ + +Fan input power per unit air flow (at design flow and pressure). + +{{ + member_table({ + "units": "W/cfm", + "legal_range": "_x_ $\\gt$ 0", + "default": "derived from sfanEff and sfanShaftBhp", + "required": "If sfanEff and sfanShaftBhp not present", + "variability": "constant" + }) +}} + +### sfanEff + +Type: _float_ + +Fan efficiency at design flow and pressure, as a fraction. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "derived from _sfanShaftBhp_ if given, else 0.65", + "required": "No", + "variability": "constant" + }) +}} + +### sfanShaftBhp + +Type: _float_ + +Fan shaft brake horsepower at design flow and pressure. + +{{ + member_table({ + "units": "bhp", + "legal_range": "_x_ $\\gt$ 0", + "default": "derived from _sfanEff_.", + "required": "No", + "variability": "constant" + }) +}} + +### sfanCurvePy + +Type: $k_0$, $k_1$, $k_2$, $k_3$, $x_0$ + +$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five _floats_ may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: + +$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ + +where: + +- $x$ is the relative fan air flow (as fraction of _sfanVfDs_; 0 $\le$ x $\le$ 1); +- $x_0$ is the minimum relative air flow (default 0); +- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; +- $z$ is the relative energy consumption. + +If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "_0, 1, 0, 0, 0 (linear)_", + "required": "No", + "variability": "constant" + }) +}} + +### sfanMotEff + +Type: _float_ + +Motor/drive efficiency. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.9", + "required": "No", + "variability": "constant" + }) +}} + +### sfanMotPos + +Type: _choice_ + +Motor/drive position: determines disposition of fan motor heat (input energy in excess of work done by fan; the work done by the fan is the "fan heat", always added to air flow). + +{{ + csv_table("IN_FLOW, add fan motor heat to supply air at the fan position. +IN_RETURN, add fan motor heat to the return air flow. +EXTERNAL, discard fan motor heat") +}} + +### sfanMtr + +Type: _mtrName_ + +Name of meter, if any, to record energy used by supply fan. End use category used is "Fan". + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Return/Relief fan + +A return/relief fan is optional. Its presence is established by setting _rfanType_ to a value other than NONE. For additional information on the return/relief fan members, refer to the description of the corresponding supply fan member above. + +### rfanType + +Type: _choice_ + +relief fan type/position. + +{{ + csv_table("RETURN, fan is at air handler; all return air passes through it. +RELIEF, fan is in exhaust path. Air being exhausted to the outdoors passes through fan; return air being recirculated does not pass through it. +NONE, no return/relief fan in this AIRHANDLER.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "NONE, RETURN, RELIEF", + "default": "NONE", + "required": "Yes, if fan present", + "variability": "constant" + }) +}} + +### rfanVfDs + +Type: _float_ + +design or rated (volumetric) air flow. + +{{ + member_table({ + "units": "cfm", + "legal_range": "_AUTOSIZE_ or _x_ $\\gt$ 0", + "default": "_sfanVfDs - oaVfDsMn_", + "required": "No", + "variability": "constant" + }) +}} + +### rfanVfMxF + +Type: _float_ + +factor by which fan will exceed design flow (at reduced pressure). + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\ge$ 1.0", + "default": "1.3", + "required": "No", + "variability": "constant" + }) +}} + +### rfanPress + +Type: _float_ + +design or rated pressure. + +{{ + member_table({ + "units": "inches H~2~O", + "legal_range": "_x_ $\\gt$ 0", + "default": "0.75", + "required": "No", + "variability": "constant" + }) +}} + +_At most, one of the next three?? items may be defined: ??_ rework re rfanElecPwr + +### rfanElecPwr + +Type: _float_ + +Fan input power per unit air flow (at design flow and pressure). + +{{ + member_table({ + "units": "W/cfm", + "legal_range": "_x_ $>$ 0", + "default": "derived from rfanEff and rfanShaftBhp", + "required": "If rfanEff and rfanShaftBhp not present", + "variability": "constant" + }) +}} + +### rfanEff + +Type: _float_ + +Fan efficiency at design flow and pressure. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "derived from _rfanShaftBhp_ if given, else 0.65", + "required": "No", + "variability": "constant" + }) +}} + +### rfanShaftBhp + +Type: _float_ + +Fan shaft brake horsepower at design flow and pressure. + +{{ + member_table({ + "units": "bhp", + "legal_range": "_x_ $\\gt$ 0", + "default": "derived from _rfanEff_", + "required": "No", + "variability": "constant" + }) +}} + +### rfanCurvePy + +Type: $k_0$, $k_1$, $k_2$, $k_3$, $x_0$ + +$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five _floats_ may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: + +$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ + +where: + +- $x$ is the relative fan air flow (as fraction of _rfanVfDs_; 0 $\le$ x $\le$ 1); +- $x_0$ is the minimum relative air flow (default 0); +- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; +- $z$ is the relative energy consumption. + +If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "_0, 1, 0, 0, 0 (linear)_", + "required": "No", + "variability": "constant" + }) +}} + +### rfanMotEff + +Type: _float_ + +Motor/drive efficiency. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.9", + "required": "No", + "variability": "constant" + }) +}} + +### rfanMotPos + +Type: _choice_ + +Motor/drive position. + +{{ + member_table({ + "units": "", + "legal_range": "IN_FLOW, EXTERNAL", + "default": "IN_FLOW", + "required": "No", + "variability": "constant" + }) +}} + +### rfanMtr + +Type: _mtrName_ + +Name of meter, if any, to record power consumption of this return fan. May be same or different from meter used for other fans and coils in this and other air handlers. "Fan" end use category is used. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Heating coil/Modeling Furnaces + +Heating coils are optional devices that warm the air flowing through the AIRHANDLER, including electric resistance heaters, hot water coils supplied by a HEATPLANT, the heating function of an air source heat pump, and furnaces. + +Furnaces are modeled as AIRHANDLERs with heat "coils" that model the heating portion of a gas or oil forced hot air furnace. Notes on modeling a furnace with a CSE AIRHANDLER: + +- Give _ahhcType_ = GAS or OIL. +- Give _ahhcAux's_ to model the power consumption of pilot, draft fan, etc. +- Use _ahTsSp_ = ZN, which implies _ahFanCyles_ = YES, to model constant volume, fan cycling (as opposed to VAV) operation. +- Use _ahTsMx_ = an appropriate value around 140 or 180 to limit the supply temperature, simulating the furnace's high temperature cutout (the default *ahTsMx*of 999 is too high!). +- Use a single TERMINAL on the AIRHANDLER. +- To eliminate confusion about the fan cfm (which, precisely, under _ahFanCyles_ = YES, is the smaller of the terminal maximum or the supply fan maximum including overrun), give the same value for TERMINAL _tuVfMxH_ and AIRHANDLER _sfanVfDs_, and give _sfanVfMxF_ = 1.0 to eliminate overrun. +- You will usually want to use _oaVfDsMn_ = 0 (no outside air), and no economizer. + +The heating function of an air source heat pump is modeled with an AIRHANDLER with heat coil type AHP. There are several additional heat coil input variables (names beginning with _ahp-_) described later in the heat coil section. Also, a heat pump generally has a crankcase heater, which is specified with the crankcase heater inputs (_cch-_), described later in the AIRHANDLER Section 0. If the heat pump also performs cooling, its cooling function is modeled by specifying a suitable cooling coil in the same AIRHANDLER. Use _ahccType_ = DX until a special cooling coil type for heat pumps is implemented. It is the user's responsibility to specify consistent heating and cooling coil inputs when the intent is to model a heat pump that both heats and cools, as CSE treats the heat coil and the cool coil as separate devices. + +The next four members apply to all heat coil types, except as noted. + +To specify that an AIRHANDLER has a heating coil and thus heating capability, give an _ahhcType_ other than NONE. + +### ahhcType + +Type: _choice_ + +Coil type choice: + +{{ + csv_table("ELECTRIC, electric resistance heat: 100% efficient, can deliver its full rated capacity at any temperature and flow. +HW, hot water coil, supplied by a HEATPLANT object. +GAS or OIL, 'coil' type that models heating portion of a forced hot air furnace. Furnace 'coil' model uses inputs for full-load efficiency and part-load power input; model must be completed with appropriate auxiliaries, _ahTsSp_, etc. See notes above. +, GAS and OIL are the same here -- the differences between gas- and oil-fired furnaces is in the auxiliaries (pilot vs. draft fan, etc.), which you specify separately. +AHP, heating function of an air source heat pump. +NONE, AIRHANDLER has no heat coil, thus no heating capability.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "ELECTRIC, HW, GAS OIL, AHP, NONE", + "default": "NONE", + "required": "Yes, if coil is present", + "variability": "constant" + }) +}} + +### ahhcSched + +Type: _choice_ + +Heat coil schedule; choice of AVAIL or OFF, hourly variable. Use an appropriate ahhcSched expression if heat coil is to operate only at certain times of the day or year or only under certain weather conditions, etc. + +{{ + csv_table("AVAIL, heat coil available: will operate as necessary to heat supply air to supply temperature setpoint, up to the coil's capacity. +OFF, coil will not operate, no matter how cold supply air is. A HW coil should be scheduled off whenever its HEATPLANT is scheduled off (_hpSched_) to insure against error messages.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "AVAIL, OFF", + "default": "AVAIL", + "required": "No", + "variability": "hourly" + }) +}} + +### ahhcCapTRat + +Type: _float_ + +Total heating (output) capacity. For an ELECTRIC, AHP, GAS, or OIL coil, this capacity is always available. For an HW heating coil, when the total heat being requested from the coil's HEATPLANT would overload the HEATPLANT, the capacity of all HW coils connected to the plant (in TERMINALs as well as AIRHANDLERs) is reduced proportionately until the requested total heat is within the HEATPLANT's capacity. For AHP, this value represents the AHRI rated capacity at 47 ^o^F outdoor temperature. + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_AUTOSIZE_ or _x_ $\\ge$ 0", + "default": "_none_", + "required": "Yes, if coil present", + "variability": "hourly" + }) +}} + +### ahhcFxCap + +Type: _float_ + +Capacity sizing multiplier for autoSized heating coils. The default value (1.1) specifies 10% oversizing. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "1.1", + "required": "No", + "variability": "constant" + }) +}} + +### ahhcMtr + +Type: _mtrName_ + +Name of meter to accumulate energy use by this heat coil. The input energy used by the coil is accumulated in the end use category "Htg"; for a heat pump, the energy used by the supplemental resistance heaters (regular and defrost) is accumulated under the category "hp". Not allowed when\*ahhcType\* is HW, as an HW coil's energy comes from its HEATPLANT, and the HEATPLANT's BOILERs accumulate input energy to meters. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +The following input is used only when _ahhcType_ is HW: + +### ahhcHeatplant + +Type: _Heatplant name_ + +Name of HEATPLANT supporting hot water coil. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a HEATPLANT_", + "default": "_none_", + "required": "if _ahhcType_ is HW", + "variability": "constant" + }) +}} + +The following inputs are used only for furnaces (_ahhcType_ = GAS or OIL). + +One of the next two items, but not both, **must** be given for furnaces: + +### ahhcEirR + +Type: _float_ + +Rated energy input ratio (input energy/output energy) at full power. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\ge$ 1", + "default": "_none_", + "required": "if _ahhcEirR_ not given and _ahhcType_ is GAS or OIL", + "variability": "hourly" + }) +}} + +### ahhcEffR + +Type: _float_ + +Rated efficiency (output energy/input energy; 1/ahhcEirR) at full power + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "_none_", + "required": "if _ahhcEirR_ not given and _ahhcType_ is GAS or OIL", + "variability": "hourly" + }) +}} + +### ahhcPyEi + +Type: $k_0$, $k_1$, $k_2$, $k_3$ + +Coefficients of cubic polynomial function of (subhour average) part-load-ratio (plrAv) to adjust the full-load furnace energy input for part load operation. Enter, separated by commas, in order, the constant part, the coefficient of plrAv, the coefficient of plrAv squared, and the coefficient of plrAv cubed. CSE will normalize the coefficients if necessary to make the polynomial value be 1.0 when the part load ratio is 1.0. + +The default, from DOE2, is equivalent to: + + ahhcPyEi = .01861, 1.094209, -.112819, 0.; + +which corresponds to the quadratic polynomial: + +$$\text{pyEi}(\text{plrAv}) = 0.01861 + 1.094209 \cdot \textbf{plrAv} - 0.112819 \cdot \textbf{plrAv}^2$$ + +Note that the value of this polynomial adjusts the energy input, not the energy input ratio, for part load operation. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0.01861, 1.094209, -0.112819, 0.0.", + "required": "No", + "variability": "constant" + }) +}} + +### ahhcStackEffect + +Type: _float_ + +Fraction of unused furnace capacity that must be used to make up for additional infiltration caused by stack effect of a hot flue when the (indoor) furnace is NOT running, only in subhours when furnace runs PART of the subhour, per DOE2 model. + +This is an obscure feature that will probably never be used, included only due to indecisiveness on the part of most members of the committee designing this program. The first time reader should skip this section, or read it only as an example of deriving an expression to implement a desired relationship. + +The stack effect is typically a function of the square root of the difference between the outdoor temperature and the assumed stack temperature. + +For example, the following is a typical example for furnace stack effect: + + ahhcStackEffect = @Top.tDbO >= 68. ? 0. + : (68. - @Top.tDbO) + * sqrt(200.-@Top.tDbO) + / (10*68*sqrt(200)); + +The code "`@Top.tDbO >= 68 ? 0. : ...`" insures that the value will be 0, not negative, when it is warmer than 68 out (if the furnace were to run when the value was negative, a run-time error would terminate the run). + +The factor "`(68. - @Top.tDbO)`" reflects the fact that the energy requirement to heat the infiltrating air is proportional to how much colder it is than the indoor temperature. Note that its permitted to use a constant for the indoor temperature because if it is below setpoint, the furnace will be running all the time, and there will be no unused capacity and the value of ahhcStackEffect will be moot. + +The factor "`sqrt(200.-@Top.tDbO)`" represents the volume of infiltrated air that is typically proportional to the square root of the driving temperature difference, where 200 is used for the estimated effective flue temperature. + +The divisor "`/ (10*68*sqrt(200))`" is to make the value 0.1 when tDbO is 0, that is, to make the stack effect loss use 10% of unused load when it is 0 degrees out. The actual modeling engineer must know enough about his building to be able to estimate the additional infiltration load at some temperature. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} + +The following heat coil input members, beginning with _ahp-_, are used when modeling the heating function of an air source heat pump with the air handler heat coil, that is, when _ahhcType_= AHP is given. Also, see the "AIRHANDLER Crankcase Heater" section with regard to specifying the heat pump's crankcase heater. + +### ahpCap17 + +Type: _float_ + +AHRI steady state (continuous operation) rated capacity at 70 degrees F indoor (return) air temp, and 17 degrees F outdoor temp, respectively. These values reflect no cycling, frost, or defrost degradation. To help you find input errors, the program issues an error message if ahpCap17 >= ahhcCapTRat. + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_x_ $\\gt$ 0", + "default": "_none_", + "required": "Yes, for AHP coil", + "variability": "constant" + }) +}} + +### ahpCapRat1747 + +Type: _float_ + +The ratio of AHRI steady state (continuous operation) rated capacities at 17 and 47 degrees F outdoor temp. This is used to determine _ahpCap35_ when _ahhcCapTRat_ is AUTOSIZEd. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\gt$ 0", + "default": "0.6184", + "required": "No", + "variability": "constant" + }) +}} + +### ahpCapRat9547 + +Type: _float_ + +Ratio of ahccCapTRat to ahhcCapTRat. This ratio is used for defaulting of AUTOSIZEd heat pump heating and cooling capacities such that they have consistent values as is required given that a heat pump is a single device. If not given, ahpCapRat9547 is determined during calculations using the relationship ahccCapTRat = 0.98 \* ahhcCapTRat + 180 (derived via correlation of capacities of a set of real units). + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "See above", + "required": "No", + "variability": "constant" + }) +}} + +### ahpCap35 + +Type: _float_ + +AHRI steady state (continuous operation) rated capacity at 35 F outdoor temp, reflecting frost buildup and defrost degradation but no cycling. Unlikely to be available for input; if not given, will be defaulted to _ahpFd35Df_ (next description) times a value determined by linear interpolation between the given _ahpCap17_ and _ahhcCapTRat_ values. If _ahpCap35_ is given, CSE will issue an error message if it is greater than value determined by linear interpolation between _ahpCap17_ and _ahhcCapTRat_. + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_x_ $\\gt$ 0", + "default": "from ahpFd35Df", + "required": "No", + "variability": "constant" + }) +}} + +### ahpFd35Df + +Type: _float_ + +Default frost/defrost degradation factor at 35 F: reduction of output at unchanged input, due to defrosting and due to frost on outdoor coil. Used in determining default value for _ahpCap35_ (preceding description); not used if _ahpCap35_ is given. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.85", + "required": "No", + "variability": "constant" + }) +}} + +### ahpCapIa + +Type: _float_ + +Capacity correction factor for indoor (return) air temperature, expressed as a fraction reduction in capacity per degree above 70F. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.004", + "required": "No", + "variability": "constant" + }) +}} + +### ahpCapSupH + +Type: _float_ + +Output capacity of the supplemental reheat coil used when heat pump alone cannot meet the load or to offset the defrost cooling load. Energy consumed by this heater is accumulated in category "HPBU" of ahhcMeter (whereas energy consumption of the heat pump compressor is accumulated under category "Htg"). + +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "_x_ $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### ahpEffSupH + +Type: _float_ + +Efficiency of the supplemental reheat coil. Use values other than the default for gas supplemental heaters. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\gt$ 0", + "default": "1.0", + "required": "No", + "variability": "hourly" + }) +}} + +### ahpSupHMtr + +Type: _mtrName_ + +Specifies a meter for recording supplemental heater energy use. End use category "HPBU" is used. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +The next seven inputs specify frost buildup and defrosting and their effect on capacity. + +### ahpTFrMn + +Type: _float_ + +### ahpTFrMx + +Type: _float_ + +### ahpTFrPk + +Type: _float_ + +Lowest, highest, and peak temperatures for frost buildup and defrost effects. Capacity reduction due to frost and defrosting consists of a component due to frost buildup on the outdoor coil, plus a component due to lost heating during the time the heat pump is doing reverse cycle defrosting (heating the outdoor coil to melt off the frost, which cools the indoor coil). The effects of Frost Buildup and of time spent defrosting are computed for different temperature ranges as follows: + +- Above _ahpTFrMx_: no frost buildup, no defrosting. + +- At _ahpTFrMx_ OR _ahpTFrMn_: defrosting time per _ahpDfrFMn_ (next description); no frost buildup effect. + +- At _ahpTFrPk_: defrosting time per _ahpDfrFMx_, plus additional output reduction due to effect of frost buildup, computed by linear extrapolation from _ahpCap35_ or its default. + +- Between _ahpTFrPk_ and _ahpTFrMn_ or _ahpTFrMx_: defrost time and defrost buildup degradation linearly interpolated between values at _ahpTFrPk_ and values at _ahpTFrMn_ or _ahpTFrMx_. + +- Below _ahpTFrMn_: no frost buildup effect; time defrosting remains at _ahpDfrFMn_. + +In other words, the curve of capacity loss due to frost buildup follows straight lines from its high point at _ahpTFrPk_ to zero at _ahpTFrMn_ and _ahpTFrMx_, and remains zero outside the range _ahpTFrMn_ to _ahpTFrMx_. The height of the high point is determined to match the _ahpCap35_ input value or its default. The curve of time spent defrosting is described in other words in the description of _ahpDfrFMn_ and _ahpDfrFMx_, next. + +An error will occur unless _ahpTFrMn_ < _ahpTFrPk_ < _ahpTFrMx_ and _ahpTFrMn_ < 35 < *ahpTFrMx*. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_x_ $\\gt$ 0", + "default": "_ahpTFrMn_: 17, _ahpTFrMx_: 47, _ahpTFrPk_: 42", + "required": "No", + "variability": "constant" + }) +}} + +### ahpDfrFMn + +Type: _float_ + +### ahpDfrFMx + +Type: _float_ + +Minimum and maximum fraction of time spent in reverse cycle defrost cooling. + +The fraction of the time spent defrosting depends on the outdoor temperature, as follows: at or below _ahpTFrMn_, and at (but not above) _ahpTFrMx_, _ahpDfrFMn_ is used. _ahpDfrFMx_ is used at _ahpTFrMx_. Linear interpolation is used between _ahpTFrMn_ or _ahpTFrMx_ and _ahpTFrMx_. No time is spent defrosting above _ahpTFrMx_. + +In other words, the curve of time spent defrosting versus outdoor temperature has the value _ahpDfrFMn_ up to _ahpTFrMn_, then rises in a straight line to _ahpDfrFMx_ at _ahpTFrMx_, then falls in a straight line back to _ahpDfrFMn_ at _ahpTFrMx_, then drops directly to zero for all higher temperatures. + +During the fraction of the time spent defrosting, the heat pump's input remains constant and the output is changed as follows: + +- Usual heat output is not delivered to load. + +- Cold output due to reverse cycle operation is delivered to load. See _ahpDfrCap_. + +- An additional resistance heater is operated; and its heat output is delivered to load. See _ahpDfrRh_. + +The program will issue an error message if _ahpDfrFMx_ $\le$ _ahpDfrFMn_. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "_ahpDfrFMn_: .0222, (2 minutes/90 minutes), _ahpDfrFMx_:.0889, (8 minutes / 90 minutes)", + "required": "No", + "variability": "constant" + }) +}} + +### ahpDfrCap + +Type: _float_ + +Cooling capacity (to air handler supply air) during defrosting. Program separately computes the lost heating capacity during defrosting, but effects of switchover transient should be included in _ahpDfrCap_. + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_x_ $\\neq$ 0", + "default": "2 $\\cdot$ _ahpCap17_", + "required": "No", + "variability": "constant" + }) +}} + +### ahpTOff + +Type: _float_ + +### ahpTOn + +Type: _float_ + +Heat pump low temperature cutout setpoints. Heat pump is disabled (only the supplemental resistance heater operates) when outdoor temperature falls below _ahpTOff_, and is re-enabled when temperature rises above _ahpTOn_. Different values may be given to simulate thermostat differential. _ahpTOff_ must be $\le$ _ahpTOn_; equal values are accepted. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "_ahpTOff_: 5, _ahpTOn_: 12", + "required": "No", + "variability": "constant" + }) +}} + +The next four inputs specify the heating power input for an air source heat pump: + +### ahpCOP47 + +Type: _float_ + +### ahpCOP17 + +Type: _float_ + +Steady state (full power, no cycling) coeffient of performance for compressor and crankcase heater at 70 degrees F indoor (return) air temp and 47 and 17 degrees F outdoor temp, respectively. + +{{ + member_table({ + "units": "kW", + "legal_range": "_x_ $\\gt$ 0", + "default": "_none_", + "required": "Yes, for AHP coil", + "variability": "constant" + }) +}} + +### ahpInIa + +Type: _float_ + +Indoor (return) air temp power input correction factor: fraction increase in steady-state input per degree above 70 F, or decrease below 70F. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.004", + "required": "No", + "variability": "constant" + }) +}} + +### ahpCd + +Type: _float_ + +AHRI cycling degradation coefficient: ratio of fraction drop in system coefficient of performance (COP) to fraction drop in capacity when cycling, from steady-state values, in AHRI 47 F cycling performance tests. A value of .25 means that if the heat pump is cycled to drop its output to 20% of full capacity (i.e. by the fraction .8), its COP will drop by .8 \* .25 = .2. Here COP includes all energy inputs: compressor, crankcase heater, defrost operation, etc. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.25", + "required": "No", + "variability": "constant" + }) +}} + +The following four air handler heat coil members allow specification of auxiliary input power consumption associated with the heat coil (or furnace) under the indicated conditions. The single description box applies to all four. + +### ahhcAux + +Type: _float_ + +Auxiliary energy used by the heating coil. + +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "_x_ $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} + +### ahhcAuxMtr + +Type: _mtrName_ + +Specifies a meter for recording auxiliary energy use. End use category "Aux" is used. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Cooling coil + +A cooling coil is an optional device that remove heat and humidity from the air passing through the AIRHANDLER. Available cooling coil types include chilled water (CHW), supported by a COOLPLANT that supplies cold water, and Direct Expansion (DX), supported by a dedicated compressor and condenser that are modeled integrally with the DX coil. No plant is used with DX coils. + +The following five members are used for all cool coil types except as noted. Presence of a cool coil in the AIRHANDLER is indicated by giving an _ahccType value_ other than NONE. + +### ahccType + +Type: choice + +Cool coil type choice: + +{{ + csv_table("ELECTRIC, Testing artifice: removes heat at 100% efficiency up to rated capacity at any flow and temperature; removes no humidity. Use in research runs to isolate effects of coil models from other parts of the CSE program. +CHW, CHilled Water coil, using a cold water from a COOLPLANT. +DX, Direct Expansion coil, with dedicated compressor and condenser modeled integrally. +NONE, AIRHANDLER has no cooling coil and no cooling capability.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "ELECTRIC, DX, CHW, NONE", + "default": "NONE", + "required": "Yes, if coil present", + "variability": "constant" + }) +}} + +### ahccSched + +Type: choice + +Cooling coil schedule choice, hourly variable. Use a suitable CSE expression for ahccSched if cooling coil is to operate only at certain times, only in hot weather, etc. + +{{ + csv_table("AVAIL, Cooling coil will operate as necessary (within its capacity) to cool the supply air to the supply temperature setpoint. +OFF, Cooling coil will not operate no matter how hot the supply air is. To avoid error messages, a CHW coil should be scheduled OFF whenever its COOLPLANT is scheduled OFF.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "AVAIL, OFF", + "default": "AVAIL", + "required": "No", + "variability": "constant" + }) +}} + +### ahccCapTRat + +Type: _float_ + +Total rated capacity of coil: sum of its "sensible" (heat-removing) and "latent" (moisture removing) capacities. Not used with CHW coils, for which capacity is implicitly specified by water flow (ahccGpmDs*) and transfer unit (*ahccNtuoDs\* and _ahccNtuiDs_) inputs, described below. + +For coil specification conditions (a.k.a. rating conditions or design conditions), see _ahccDsTDbEn_, _ahccDsTWbEn_, *ahccDsTDbCnd*and *ahccVfR*below (see index). + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_AUTOSIZE_ or _x_ $>$ 0", + "default": "_none_", + "required": "Yes", + "variability": "constant" + }) +}} + +### ahccCapSRat + +Type: _float_ + +Sensible (heat-removing) rated capacity of cooling coil. Not used with CHW coils. + +{{ + member_table({ + "units": "Btuh", + "legal_range": "_x_ $>$ 0", + "default": "_none_", + "required": "Yes", + "variability": "constant" + }) +}} + +### ahccSHRRat + +Type: _float_ + +Rated sensible heat ratio (_ahccCapSRat_/_ahccCapTRat_) for cooling coil. Default based on correlation to _ahccVfRperTon_. Not used with CHW coils. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "based on _ahccVfRperTon_", + "required": "No", + "variability": "constant" + }) +}} + +### ahccFxCap + +Type: _float_ + +Capacity sizing multiplier for autoSized cooling coils. The default value (1.1) specifies 10% oversizing. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "1.1", + "required": "No", + "variability": "constant" + }) +}} + +### ahccMtr + +Type: _mtrName_ + +Name of meter, if any, to record energy use of air handler cool coil. End use category "Clg" is used. Not used with CHW coils, because the input energy use for a CHW coil is recorded by the COOLPLANT's CHILLERs. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +The following six members are used with DX cooling coils. + +### ahccMinTEvap + +Type: _float_ + +Minimum (effective surface) temperature of coil (evaporator). Represents refrigerant setpoint, or cutout to prevent freezing. Coil model will reduce output to keep simulated coil from getting colder than this, even though it lets supply air get warmer than setpoint. Should default be 35?? + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_x_ $>$ 0", + "default": "40^o^F", + "required": "No", + "variability": "constant" + }) +}} + +### ahccK1 + +Type: _float_ + +Exponent in power relationship expressing coil effectiveness as a function of relative air flow. Used as K1 in the relationship ntu = ntuR \* relCfmk1, which says that the "number of transfer units" (on the coil outside or air side) varies with the relative air flow raised to the K1 power. Used with CHW as well as DX coils; for a CHW coil, ntuR in the formula is _ahccNtuoDs_. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $<$ 0", + "default": "-0.4", + "required": "No", + "variability": "constant" + }) +}} + +### ahccBypass + +Type: _float_ + +Fraction of air flow which does NOT flow through DX cooling coil, for better humidity control. Running less of the air through the coil lets the coil run colder, resulting in greater moisture removal right??. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\lt$ _x_ $\\le$ 1", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +The next three members are used in determining the energy input to a DX coil under various load conditions. The input is derived from the full load energy input ratio for four segments of the part load curve. In the following the part load ratio (plr) is the ratio of the actual sensible + latent load on the coil to the coil's capacity. The coil's capacity is ahccCaptRat, adjusted by the coil model for differences between entering air temperature, humidity, and flow rate and the coil rating conditions. The coil may run at less than capacity even at full fan flow, depending on the air temperature change needed, the moisture content of the entering air, and the relative values of between _sfanVfDs_ and _ahccVfR_. + +{{ + csv_table("full load, plr (part load ratio) = 1.0 +, Full-load power input is power output times _ahhcEirR._ +compressor unloading region, 1.0 > plr $\\ge$ _ahhcMinUnldPlr_ +, Power input is the full-load input times the value of the _pydxEirUl_ polynomial (below) for the current plr, i.e. pydxEirUl(plr). +false loading region, _ahccMinUnldPlr_ > plr $\\ge$ _ahccMinFsldPlr_ +, Power input in this region is constant at the value for the low end of the compressor unloading region, i.e. pydxEirUl(ahccMinUnldPlr). +cycling region, _ahccMinFsldPlr_ > plr $\\ge$ 0 +, In this region the compressor runs at the low end of the false loading region for the necessary fraction of the time, and the power input is the false loading value correspondingly prorated, i.e. pydxEirUl(ahccMinUnldPlr) \* plr / ahccMinFsldPlr.") +}} + +The default values for the following three members are the DOE2 PTAC (Window air conditioner) values. + +### ahccEirR + +Type: _float_ + +DX compressor energy input ratio (EIR) at full load under rated conditions; defined as the full-load electric energy input divided by the rated capacity, both in Btuh; same as the reciprocal of the Coefficient Of Performance (COP). Polynomials given below are used by CSE to adjust the energy input for part load and for off rated flow and temperature conditions. The default value includes outdoor (condenser) fan energy, but not indoor (air handler supply) fan energy. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0.438", + "required": "No", + "variability": "constant" + }) +}} + +### ahccMinUnldPlr + +Type: _float_ + +Compressor part load ratio (total current load/current capacity) at/above which "Compressor unloading" is used and pydxEirUl (below) is used to adjust the full-load power input to get the current part load power input. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "1 (no unloading)", + "required": "No", + "variability": "constant" + }) +}} + +### ahccMinFsldPlr + +Type: _float_ + +"False Loading" is used between this compressor part load ratio and the plr where unloading is activated (_ahccMinUnldPlr_). In this region, input remains at _pydxEirUl_(*ahccMinUnldPlr).*For plr's less than _ahccMinFsldPlr_, cycling is used, and the power input goes to 0 in a straight line. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ _ahccMinUnldPlr_", + "default": "_ahccMinUnldPlr_ (no false loading)", + "required": "No", + "variability": "constant" + }) +}} + +The following four inputs specify polynomials to approximate functions giving DX coil capacity and power (energy) input as functions of entering temperatures, relative (to ahccVfR) flow, and relative load (plr). In each case several _float_ values may be given, for use as coefficients of the polynomial. The values are ordered from constant to coefficient of highest power. If fewer than the maximum number of values are given, zeroes are used for the trailing (high order) coefficients. + +Examples: + + pydxCaptT = 2.686, -0.01667, 0, 0.006, 0, 0; + + pydxCaptT = 2.686, -0.01667, 0, 0.006; // same + + pydxEirUl = .9, 1.11, .023, -.00345; + +If the polynomial does not evaluate to 1.0 when its inputs are equal to the rating conditions (1.0 for relative flows and plr), CSE will normalize your coefficients by dividing them by the non-1.0 value. + +Some of the polynomials are biquadratic polynomials whose variables are the entering air wetbulb and drybulb temperatures. These are of the form + +$$z = a + bx + cx^2 + dy + ey^2 + fxy$$ + +where a through f are user-inputtable coefficients, x is the entering wetbulb temperature, y is the entering drybulb temperature, and the polynomial value, z, is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual entering air temperatures. + +Other polynomials are cubic polynomials whose variable is the air flow or load as a fraction of full flow or load.. These are of the form + +$$z = a + bx + cx^2+ dx^3$$ + +where a, b, c, and d are user-inputtable coefficients, $x$ is the variable, and the value $z$ is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual flow or load. + +The default values for the polynomial coefficients are the DOE2 PTAC values. + +### pydxCaptT + +Type: a, b, c, d, e, f + +Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust _ahccCaptRat_ for the actual entering air temperatures. The condenser temperature is the outdoor drybulb, but not less than 70. See discussion in preceding paragraphs. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "1.1839345, -0.0081087, 0.00021104, -0.0061425, 0.00000161, -0.0000030", + "required": "No", + "variability": "constant" + }) +}} + +### pydxCaptF + +Type: a=a, b, c, d + +Coefficients of cubic polynomial function of relative flow (entering air cfm/_ahccVfR_) whose value is used to adjust _ahccCaptRat_ for the actual flow. See discussion in preceding paragraphs. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0.8, 0.2, 0.0, 0.0", + "required": "No", + "variability": "constant" + }) +}} + +### pydxCaptFLim + +Type: _float_ + +Upper limit for value of pydxCaptF. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "1.05", + "required": "No", + "variability": "constant" + }) +}} + +### pydxEirT + +Type: _a, b, c, d, e, f_ + +Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust _ahccEirR_ for the actual entering air temperatures. The condenser temperature is the outdoor air drybulb, but not less than 70. If the entering air wetbulb is less than 60, 60 is used, in this function only. See discussion in preceding paragraphs. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "-0.6550461, 0.03889096, -0.0001925, 0.00130464, 0.00013517, -0.0002247", + "required": "No", + "variability": "constant" + }) +}} + +### pydxEirUl + +Type: _a, b, c, d_ + +Coefficients of cubic polynomial function of part load ratio used to adjust energy input to part load conditions, in the compressor unloading part load region (1 $\ge$ plr $\ge$ _ahccMinUnldPlr_) as described above. See discussion of polynomials in preceding paragraphs. + +This polynomial adjusts the full load energy input to part load, not the ratio of input to output, despite the "Eir" in its name. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0.125, 0.875, 0.0, 0.0", + "required": "No", + "variability": "constant" + }) +}} + +The following four members are used only with CHW coils. In addition, _ahccK1,_ described above, is used. + +### ahccCoolplant + +Type: _name_ + +name of COOLPLANT supporting CHW coil. COOLPLANTs contain CHILLERs, and are described in Section 5.21. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a COOLPLANT_", + "default": "_none_", + "required": "for CHW coil", + "variability": "constant" + }) +}} + +### ahccGpmDs + +Type: _float_ + +Design (i.e. maximum) water flow through CHW coil. + +{{ + member_table({ + "units": "gpm", + "legal_range": "_x_ $\\ge$ 0", + "default": "_none_", + "required": "Yes, for CHW coil", + "variability": "constant" + }) +}} + +### ahccNtuoDs + +Type: _float_ + +CHW coil outside number of transfer units at design air flow (ahccVfR*, below). See*ahccK1\* above with regard to transfer units at other air flows. + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\gt$ 0", + "default": "2", + "required": "No", + "variability": "constant" + }) +}} + +### ahccNtuiDs + +Type: _float_ + +CHW coil inside number of transfer units at design water flow (ahccGpmDs, above). + +{{ + member_table({ + "units": "", + "legal_range": "_x_ $\\gt$ 0", + "default": "2", + "required": "No", + "variability": "constant" + }) +}} + +The following four members let you give the specification conditions for the cooling coil: the rating conditions, design conditions, or other test conditions under which the coil's performance is known. The defaults are AHRI (Air-Conditioning and Refrigeration Institute) standard rating conditions. + +### ahccDsTDbEn + +Type: _float_ + +Design (rating) entering air dry bulb temperature, used with DX and CHW cooling coils. With CHW coils, this input is used only as the temperature at which to convert _ahccVfR_ from volume to mass. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_x_ $\\gt$ 0", + "default": "80^o^F (AHRI)", + "required": "No", + "variability": "constant" + }) +}} + +### ahccDsTWbEn + +Type: _float_ + +Design (rating) entering air wet bulb temperature, for CHW coils. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_x_ $\\gt$ 0", + "default": "67^o^F (AHRI)", + "required": "No", + "variability": "constant" + }) +}} + +### ahccDsTDbCnd + +Type: _float_ + +Design (rating) condenser temperature (outdoor air temperature) for DX coils. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_x_ $\\gt$ 0", + "default": "95^o^F (AHRI)", + "required": "No", + "variability": "constant" + }) +}} + +### ahccVfR + +Type: _float_ + +Design (rating) (volumetric) air flow rate for DX or CHW cooling coil. The AHRI specification for this test condition for CHW coils is "450 cfm/ton or less", right?? + +{{ + member_table({ + "units": "cfm", + "legal_range": "_x_ $\\gt$ 0", + "default": "DX coil: _ahccVfRperTon_ CHW coil: _sfanVfDs_", + "required": "No", + "variability": "constant" + }) +}} + +The following four members permit specification of auxiliary input power use associated with the cooling coil under the conditions indicated. + +### ahccVfRperTon + +Type: _float_ + +Design default _ahccVfR_ per ton (12000 Btuh) of _ahhcCapTRat_. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "400.0", + "required": "No", + "variability": "constant" + }) +}} + +### ahccAux + +Type: _float_ + +Auxiliary energy used by the cooling coil. + +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "_x_ $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} + +### ahccAuxMtr + +Type: _mtrName_ + +Specifies a meter for recording auxiliary energy use. End use category "Aux" is used. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Outside Air + +Outside air introduced into the air hander supply air can be controlled on two levels. First, a *minimum*fraction or volume of outside air may be specified. By default, a minimum volume of .15 cfm per square foot of zone area is used. Second, an _economizer_ may be specified. The simulated economizer increases the outside air above the minimum when the outside air is cooler or has lower enthalpy than the return air, in order to reduce cooling coil energy usage. By default, there is no economizer. + +### oaMnCtrl + +Type: _choice_ + +Minimum outside air flow control method choice, VOLUME or FRACTION. Both computations are based on the minimum outside air flow, _oaVfDsMn_; if the control method is FRACTION, the outside air flow is pro-rated when the air handler is supplying less than its design cfm. In both cases the computed minimum cfm is multiplied by a schedulable fraction, _oaMnFrac_, to let you vary the outside air or turn in off when none is desired. + +{{ + csv_table("VOLUME, Volume (cfm) of outside air is regulated: +, min_oa_flow = oaMnFrac \* oaVfDsMn +FRACTION, Fraction of outside air in supply air is regulated. The fraction is oaVfDsMn divided by sfanVfDs, the air handler supply fan design flow. The minimum cfm of outside air is thus computed as +, min_oa_flow = oaMnFrac \* curr_flow \* oaVfDsMn / sfanVfDs +, where curr_flow is the current air handler cfm.") +}} + +If the minimum outside air flow is greater than the total requested by the terminals served by the air handler, then 100% outside air at the latter flow is used. To insure minimum outside air cfm to the zones, use suitable terminal minimum flows (_tuVfMn_) as well as air handler minimum outside air specifications. + +{{ + member_table({ + "units": "", + "legal_range": "VOLUME, FRACTION", + "default": "VOLUME", + "required": "No", + "variability": "constant" + }) +}} + +### oaVfDsMn + +Type: _float_ + +Design minimum outside air flow. If _oaMnCtrl_ is FRACTION, then this is the minimum outside air flow at full air handler flow. See formulas in _oaMnCtrl_ description, just above. + +{{ + member_table({ + "units": "cfm", + "legal_range": "_x_ $\\ge$ 0", + "default": "0.15 times total area of zones served", + "required": "No", + "variability": "constant" + }) +}} + +### oaMnFrac + +Type: _float_ + +Fraction of minimum outside air to use this hour, normally 1.0. Use a CSE expression that evaluates to 0 for hours you wish to disable the minimum outside air flow, for example to suppress ventilation during the night or during warm-up hours. Intermediate values may be used for intermediate outside air minima. See formulas in _oaMnCtrl_ description, above. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "1.0", + "required": "No", + "variability": "hourly" + }) +}} + +CAUTION: the minimum outside air flow only applies when the supply fan is running; it won't assure meeting minimum ventilation requirements when used with ahFanCycles = YES (constant volume, fan cycling). + +### oaZoneLeak + +Type: _float_ + +For the purposes of airnet zone pressure modeling ONLY, _oaZoneLeak_ specifies the fraction of supply air that is assumed to leak from zone(s) (as opposed to returning to the airhandler via the return duct). For example, if the supply air volume is 500 cfm and _oaZoneLeak_ is 0.4, the values passed to airnet are 500 cfm inflow and 300 cfm outflow. The 200 cfm difference is distributed to other zone leaks according to their pressure/flow characteristics. + +The default assumption is that airhandlers with return or relief fans provide balanced zone flows while half the supply flow leaks from zones served by supply-fan-only airhandlers. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "no return/relief fan: 0.5 else 0", + "required": "No", + "variability": "hourly" + }) +}} + +If an _oaEcoType_ choice other than NONE is given, an economizer will be simulated. The economizer will be enabled when the outside temperature is below oaLimT _AND_ the outside air enthalpy is below oaLimE. When enabled, the economizer adjusts the economizer dampers to increase the outside air mixed with the return air until the mixture is cooler than the air handler supply temperature setpoint, if possible, or to maximum outside air if the outside air is not cool enough. + +CAUTIONS: the simulated economizer is just as dumb as the hardware being simulated. Two considerations particularly require attention. First, if enabled when the outside air is warmer than the return air, it will do the worst possible thing: use 100% outside air. Prevent this by being sure your oaLimT or oaLimE input disables the economizer when the outside air is too warm -- or leave the oaLimT = RA default in effect. + +Second, the economizer will operate even if the air handler is heating, resulting in use of more than minimum outside air should the return air get above the supply temperature setpoint. Economizers are intended for cooling air handlers; if you heat and cool with the same air handler, consider disabling the economizer when heating by scheduling a very low _oaLimT_ or _oaLimE_. + + + +### oaEcoType + +Type: _choice_ + +Type of economizer. Choice of: + +{{ + csv_table("NONE, No economizer; outside air flow is the minimum. +INTEGRATED, Coil and economizer operate independently. +NONINTEGRATED, Coil does not run when economizer is using all outside air: simulates interlock in some equipment designed to prevent coil icing due to insufficient load, right? +TWO_STAGE, Economizer is disabled when coil cycles on. _NOT IMPLEMENTED_ as of July 1992.") +}} + +### oaLimT + +Type: _float_ or _RA_ + +Economizer outside air temperature high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air temperature is greater than _oaLimT_. A number may be entered, or "RA" to specify the current Return Air temperature. _OaLimT_ may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_number_ or RA", + "default": "RA (return air temperature)", + "required": "No", + "variability": "hourly" + }) +}} + +### oaLimE + +Type: _float_ or _RA_ + +Economizer outside air enthalpy high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air enthalpy is greater than _oaLimE_. A number may be entered, or "RA" to specify the current Return Air enthalpy. _OaLimE_ may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. + +{{ + member_table({ + "units": "Btu/^o^F", + "legal_range": "_number_ or RA", + "default": "999 (enthalpy limit disabled)", + "required": "No", + "variability": "hourly" + }) +}} + +_oaOaLeak_ and _oaRaLeak_ specify leakages in the economizer dampers, when present. The leaks are constant-cfm flows, expressed as fractions of the maximum possible flow. Thus, when the current flow is less than the maximum possible, the range of operation of the economizer is reduced. When the two damper leakages add up to more than the current air handler flow, outside and return air are used in the ratio of the two leakages and the economizer, if enabled, is ineffective. + +### oaOaLeak + +Type: _float_ + +Outside air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. If an economizer is present, _oaOaLeak_ is a fraction of the supply fan design cfm, _sfanVfDs_. Otherwise, _oaOaLeak_ is a fraction of the design minimum outside air flow _oaVfDsMn_. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} + +### oaRaLeak + +Type: _float_ + +Return air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. Expressed as a fraction of the supply fan design cfm, _sfanVfDs_. Not used when no economizer is being modeled. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Heat Recovery + +The following data members are used to describe a heat exchanger for recovering heat from exhaust air. Heat recovery added to the model when a value for _oaHXSenEffHDs_ is provided. + +### oaHXVfDs + +Type: _float_ + +Heat exchanger design or rated flow. + +{{ + member_table({ + "units": "cfm", + "legal_range": "_x_ $\\gt$ 0", + "default": "_oaVfDsMn_", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXf2 + +Type: _float_ + +Heat exchanger flow fraction (of design flow) used for second set of effectivenesses. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\lt$ _x_ $\\lt$ 1.0", + "default": "0.75", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXSenEffHDs + +Type: _float_ + +Heat exchanger sensible effectiveness in heating mode at the design flow rate. Specifying input triggers modeling of heat recovery. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "required": "when modeling heat recovery", + "variability": "constant" + }) +}} + +### oaHXSenEffHf2 + +Type: _float_ + +Heat exchanger sensible effectiveness in heating mode at the second flow rate (**oaHXf2**). + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXLatEffHDs + +Type: _float_ + +Heat exchanger latent effectiveness in heating mode at the design flow rate. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXLatEffHf2 + +Type: _float_ + +Heat exchanger latent effectiveness in heating mode at the second flow rate (**oaHXf2**). + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXSenEffCDs + +Type: _float_ + +Heat exchanger sensible effectiveness in cooling mode at the design flow rate. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXSenEffCf2 + +Type: _float_ + +Heat exchanger sensible effectiveness in cooling mode at the second flow rate (**oaHXf2**). + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXLatEffCDs + +Type: _float_ + +Heat exchanger latent effectiveness in cooling mode at the design flow rate. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXLatEffCf2 + +Type: _float_ + +Heat exchanger latent effectiveness in cooling mode at the second flow rate (**oaHXf2**). + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1.0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXBypass + +Type: _choice_ + +Yes/No choice for enabling heat exchanger bypass. If selected, the outdoor air will bypass the heat exchanger when otherwise the heat exchanger would require more heating or cooling energy to meet the respective setpoints. + +{{ + member_table({ + "units": "", + "legal_range": "NO, YES", + "default": "NO", + "required": "No", + "variability": "constant" + }) +}} + +### oaHXAuxPwr + +Type: _float_ + +Auxiliary power required to operate the heat recovery device (e.g., wheel motor, contorls). + +{{ + member_table({ + "units": "W", + "legal_range": "_x_ $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} + +### oaHXAuxMtr + +Type: _mtrName_ + +Name of meter, if any, to record energy used by auxiliary components of the heat recovery system. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Leaks and Losses + +_AhSOLeak_ and _ahRoLeak_ express air leaks in the common supply and return ducts, if any, that connect the air handler to the conditioned space. For leakage after the point where a duct branches off to an individual zone, see TERMINAL member _tuSRLeak_. These inputs model leaks in constant pressure (or vacuum) areas nearer the supply fan than the terminal VAV dampers; thus, they are constant volume regardless of flow to the zones. Hence, unless 0 leakage flows are specified, the air handler cfm is greater than the sum of the terminal cfm's, and the air handler cfm is non-0 even when all terminal flows are 0. Any heating or cooling energy applied to the excess cfm is lost to the outdoors. + +If unequal leaks are specified, at present (July 1992) CSE will use the average of the two specifications for both leaks, as the modeled supply and return flows must be equal. A future version may allow unequal flows, making up the difference in exfiltration or infiltration to the zones. + +### ahSOLeak + +Type: _float_ + +Supply duct leakage to outdoors, expressed as a fraction of supply fan design flow (_sfanVfDs_). Use 0 if the duct is indoors. A constant-cfm leak is modeled, as the pressure is constant when the fan is on. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.01", + "required": "No", + "variability": "constant" + }) +}} + +### ahROLeak + +Type: _float_ + +Return duct leakage FROM outdoors, expressed as a fraction of _sfanVfDs_. Use 0 if the duct is indoors. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.01", + "required": "No", + "variability": "constant" + }) +}} + +_AhSOLoss_ and _ahROLoss_ represent conductive losses from the common supply and return ducts to the outdoors. For an individual zone's conductive duct loss, see TERMINAL member _tuSRLoss_. Losses here are expressed as a fraction of the temperature difference which is lost. For example, if the supply air temperature is 120, the outdoor temperature is 60, and the pertinent loss is .1, the effect of the loss as modeled will be to reduce the supply air temperature by 6 degrees ( .1 \* (120 - 60) ) to 114 degrees. CSE currently models these losses a constant _TEMPERATURE LOSSes_ regardless of cfm. + +### ahSOLoss + +Type: _float_ + +Supply duct loss/gain to the outdoors. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} + +### ahROLoss + +Type: _float_ + +Return duct heat loss/gain to the outdoors. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ _x_ $\\le$ 1", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} + +## AIRHANDLER Crankcase Heater + +A "crankcase heater" is an electric resistance heater in the crankcase of the compressor of heat pumps and dx cooling coils. The function of the crankcase heater is to keep the compressor's oil warmer than the refrigerant when the compressor is not operating, in order to prevent refrigerant from condensing into and remaining in the oil, which impairs its lubricating properties and shortens the life of the compressor. Manufacturers have come up with a number of different methods for controlling the crankcase heater. The crankcase heater can consume a significant part of the heat pump's energy input; thus, it is important to model it. + +In CSE a heat pump is modeled as though it were separate heating and cooling coils. However, the crankcase heater may operate (or not, according to its control method) whether the heat pump is heating, or cooling, or, in particular, doing neither, so it is modeled as a separate part of the air handler, not associated particularly with heating or cooling. + +When modeling an air source heat pump (ahhcType = AHP), these variables should be used to specify the crankcase heater, insofar as non-default inputs are desired. + +Appropriateness of use of these inputs when specifying a DX system without associated heat pump heating is not clear to me (Rob) as of 10-23-92; on the one hand, the DX compressor probably has a crankcase heater; on the other hand, the rest of the DX model is supposed to be complete in itself, and adding a crankcase heater here might produce excessive energy input; on the third hand, the DX model does not include any energy input when the compressor is idle; ... . + +### cchCM + +Type: _choice_ + +Crankcase heater presence and control method. Choice of: + +{{ + csv_table("NONE, No crankcase heater present +CONSTANT, Crankcase heater input always _cchPMx_ (below). +PTC, Proportional control based on oil temp when compressor does not run in subhour (see _cchTMx_, _cchMn_, and _cchDT_). If compressor runs at all in subhour, the oil is assumed to be hotter than _cchTMn_ and crankcase heater input is _cchPMn_. (PTC stands for 'Positive Temperature Coefficient' or 'Proportional Temperature Control'.) +TSTAT, Control based on outdoor temperature, with optional differential, during subhours when compressor is off; crankcase heater does not operate if compressor runs at all in subhour. See _cchTOn_, _cchTOff_. +CONSTANT_CLO +PTC_CLO, Same as corresponding choices above except zero crankcase heater input during fraction of time compressor is on ('Compressor Lock Out'). There is no TSTAT_CLO because under TSTAT the crankcase heater does not operate anyway when the compressor is on.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "CONSTANT CONSTANT_CLO PTC PTC_CLO TSTAT NONE", + "default": "PTC_CLO if _ahhcType_ is AHP else NONE ", + "required": "No", + "variability": "constant" + }) +}} + +### cchPMx + +Type: _float_ + +Crankcase resistance heater input power; maximum power if _cchCM_ is PTC or PTC_CLO. + +{{ + member_table({ + "units": "kW", + "legal_range": "_x_ $\\gt$ 0", + "default": ".4 kW", + "required": "No", + "variability": "constant" + }) +}} + +### cchPMn + +Type: _float_ + +Crankcase heater minimum input power if _cchCM_ is PTC or PTC_CLO, disallowed for other _cchCM's_. > 0. + +{{ + member_table({ + "units": "kW", + "legal_range": "_x_ $\\gt$ 0", + "default": ".04 kW", + "required": "No", + "variability": "constant" + }) +}} + +### cchTMx + +Type: _float_ + +### cchTMn + +Type: _float_ + +For _cchCM_ = PTC or PTC_CLO, the low temperature (max power) and high temperature (min power) setpoints. In subhours when the compressor does not run, crankcase heater input is _cchPMx_ when oil temperature is at or below _cchTMx_, _cchPMn_ when oil temp is at or above _cchTMn_, and varies linearly (proportionally) in between. _cchTMn_ must be $\ge$ _cchTMx_. See _cchDT_ (next). + +(Note that actual thermostat setpoints probably cannot be used for _cchTMx_ and _cchTMn_ inputs, because the model assumes the difference between the oil temperature and the outdoor temperature is constant (_cchDT_) regardless of the heater power. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "_cchTMn_: 0; _cchTMx_: 150", + "required": "No", + "variability": "constant" + }) +}} + +### cchDT + +Type: _float_ + +For _cchCM_ = PTC or PTC_CLO, how much warmer than the outdoor temp CSE assumes the crankcase oil to be in subhours when the compressor does not run. If the compressor runs at all in the subhour, the oil is assumed to be warmer than _cchTMn_. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "20^o^F", + "required": "No", + "variability": "constant" + }) +}} + +### cchTOn + +Type: _float_ + +### cchTOff + +Type: _float_ + +For _cchCM_ = TSTAT, in subhours when compressor does not run, the crankcase heater turn-on and turn-off outdoor temperatures, respectively. Unequal values may be given to simulate thermostat differential. When the compressor runs at all in a subhour, the crankcase heater is off for the entire subhour. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "_cchTOff_ $\\ge$ _cchTOn_", + "default": "_cchTOn_: 72^o^F; _chcTOff_: _chcTOn_", + "required": "No", + "variability": "constant" + }) +}} + +### cchMtr + +Type: _name of a METER_ + +METER to record crankcase heater energy use, category "Aux"; not recorded if not given. + +{{ + member_table({ + "units": "", + "legal_range": "_name of a METER_", + "default": "_not recorded_", + "required": "No", + "variability": "constant" + }) +}} + +### endAirHandler + +Indicates the end of the air handler definition. Alternatively, the end of the air handler definition can be indicated by the declaration of another object. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "_none_", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[airHandler][p_airhandler] +- @[ahRes][p_ahres] (accumulated results) diff --git a/doc/src/records/battery.md b/doc/src/docs/input-data/battery.md similarity index 67% rename from doc/src/records/battery.md rename to doc/src/docs/input-data/battery.md index 8377f5130..afe7d819d 100644 --- a/doc/src/records/battery.md +++ b/doc/src/docs/input-data/battery.md @@ -4,143 +4,176 @@ BATTERY describes input data for a model of an energy-storage system which is no The modeler can set limits and constraints on capacities and flows and the associated efficiencies for this model. -**btName** +### btName Name of the battery system. Given after the word BATTERY. -<%= member_table( - units: "", - legal_range: "63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**btMeter=*choice*** +### btMeter + +Type: choice Name of a METER to which the BATTERY's charge/discharge energy flows are recorded. Battery energy flows are accumulated to meter end use "BT". Battery energy flows are seen from the standpoint of a "load" on the electric grid, so charges to the BATTERY system are positive values while discharges from the BATTERY system are negative values. Note btMeter also determines the source for the probe value *loadSeen*. See discussion and example under btChgReq (below). -<%= member_table( - units: "", - legal_range: "meter name ", - default: "*none* ", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "meter name ", + "default": "*none* ", + "required": "No", + "variability": "constant" + }) +}} + +### btChgEff -**btChgEff=*float*** +Type: float The charging efficiency of storing electricity into the BATTERY system. A value of 1.0 means that no energy is lost and 100% of charge energy enters and is stored in the battery. -<%= member_table( - units: "", - legal_range: "0 < x $\\le$ 1", - default: "0.975", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 < x $\\le$ 1", + "default": "0.975", + "required": "No", + "variability": "hourly" + }) +}} + +### btDschgEff -**btDschgEff=*float*** +Type: float The discharge efficiency for when the BATTERY system is discharging power. A value of 1.0 means that no energy is lost and 100% of discharge energy leaves the system. -<%= member_table( - units: "", - legal_range: "0 < x $\\le$ 1", - default: "0.975", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 < x $\\le$ 1", + "default": "0.975", + "required": "No", + "variability": "hourly" + }) +}} -**btMaxCap=*float*** +### btMaxCap + +Type: float This is the maximum amount of energy that can be stored in the BATTERY system in kilowatt-hours. Once the BATTERY has reached its maximum capacity, no additional energy will be stored. -<%= member_table( - units: "kWh", - legal_range: "x $\\ge$ 0", - default: "16", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "kWh", + "legal_range": "x $\\ge$ 0", + "default": "16", + "required": "No", + "variability": "constant" + }) +}} -**btInitSOE=*float*** +### btInitSOE -The initial state of energy of the BATTERY system as a fraction of the total capacity. If `btInitSOE` is specified, the battery state-of-energy at the beginning of the actual simulation will be set to the amount specified, regardless of whether there was a warm-up period or not. If `btInitSOE` is NOT specififed, it will default to 1.0 (i.e., 100%) at the beginning of the warmup period (if any). +Type: float -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 0", - default: "1.0", - required: "No", - variability: "constant") - %> +The initial state of energy of the BATTERY system as a fraction of the total capacity. If `btInitSOE` is specified, the battery state-of-energy at the beginning of the actual simulation will be set to the amount specified, regardless of whether there was a warm-up period or not. If `btInitSOE` is NOT specififed, it will default to 1.0 (i.e., 100%) at the beginning of the warmup period (if any). -**btInitCycles=*int*** +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 0", + "default": "1.0", + "required": "No", + "variability": "constant" + }) +}} -The number of cycles on the battery at the beginning of the run. +### btInitCycles -<% if show_comments %> +Type: int -Note: a more robust life model will need not only cycle counts but cycles by depth of discharge to capture "shallow cycling" vs "deep cycling". A further enhancement is to capture "time at temperature". We may want to look into the battery literature and also more into this application to better understand what kind of life model may be a good fit in terms of information requirements vs fidelity. +The number of cycles on the battery at the beginning of the run. -<% end %> +{{ + member_table({ + "units": "number of cycles", + "legal_range": "x $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "runly" + }) +}} -<%= member_table( - units: "number of cycles", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "runly") - %> +### btMaxChgPwr -**btMaxChgPwr=*float*** +Type: float The maximum rate at which the BATTERY can be charged in kilowatts (i.e., energy flowing *into* the BATTERY). -<%= member_table( - units: "kW", - legal_range: "x $\\ge$ 0", - default: "4", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "kW", + "legal_range": "x $\\ge$ 0", + "default": "4", + "required": "No", + "variability": "hourly" + }) +}} + +### btMaxDschgPwr -**btMaxDschgPwr=*float*** +Type: float The maximum rate at which the BATTERY can be discharged in kilowatts (i.e., energy flowing *out of* the BATTERY). -<%= member_table( - units: "kW", - legal_range: "x $\\ge$ 0", - default: "4", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "kW", + "legal_range": "x $\\ge$ 0", + "default": "4", + "required": "No", + "variability": "hourly" + }) +}} -**btControlAlg=*choice*** +### btControlAlg + +Type: choice Selects charge/discharge control algorithm. btChgReq (next) specifies the desired battery charge or discharge rate. btControlAlg allows selection of alternative algorithms for deriving btChgReq. -<%= csv_table(< false) -DEFAULT, btChgReq is used as input or defaulted (see below) -TDVPEAKSAVE, btChgReq input (if any) is ignored. Instead, a California-specific algorithm is used that saves battery charge until peak TDV (Time Dependant Valuation) hours of the day, shifting energy generated on site (e.g. PV) to supply feed the grid during critical periods. The algorithm requires availability of hourly TDV data, see Top.tdvFName. -END -%> +{{ + csv_table("DEFAULT, btChgReq is used as input or defaulted (see below) +TDVPEAKSAVE, btChgReq input (if any) is ignored. Instead, a California-specific algorithm is used that saves battery charge until peak TDV (Time Dependant Valuation) hours of the day, shifting energy generated on site (e.g. PV) to supply feed the grid during critical periods. The algorithm requires availability of hourly TDV data, see Top.tdvFName.") +}} Note btControlAlg has hourly variability, allowing dynamic algorithm selection. In California compliance applications, TDVPEAKSAVE is typically used only on days with high TDV peaks. -<%= member_table( - units: "", - legal_range: "DEFAULT or TDVPEAKSAVE", - default: "DEFAULT", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "DEFAULT or TDVPEAKSAVE", + "default": "DEFAULT", + "required": "No", + "variability": "hourly" + }) +}} + +### btChgReq -**btChgReq=*float*** +Type: float The power request to charge (or discharge if negative) the battery. If omitted, the default strategy is used (attempt to satisfy all loads and absorb all available excess power). btChgReq and the default strategy requested power are literally *requests*: that is, more power will not be delivered than is available; more power will not be absorbed than capacity exits to store; and the battery's power limits will be respected. @@ -152,29 +185,35 @@ btChgReq can be set by an expression to allow complex energy management/dispatch The sign conventions here are tricky. min(@BATTERY[ 1].loadSeen, 0) produces a value <=0 that is the negative of the amount of surplus energy available. A positive btChgReq value requests charging, hence "-" (minus sign) in front of the min(). Conversely, max( @BATTERY[ 1].loadSeen, 0) results in a value >= 0 indicating the net energy needed by the building. To request discharge, btChgReq must be negative, so "-" is also needed in the discharge expression. (The @BATTERY[1] references mean "this battery", assuming there is only one battery being modelled. In multi-battery situations, the current BATTERY's index or name must be included within the "[ ]".) -<%= member_table( - units: "kW", - legal_range: "", - default: "btMeter net load", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "kW", + "legal_range": "", + "default": "btMeter net load", + "required": "No", + "variability": "hourly" + }) +}} + +### btUseUsrChg -**btUseUsrChg=*choice*** +Type: choice Former yes/no choice that currently has no effect. Deprecated, will be removed in a future version. -**endBATTERY** +### endBATTERY Optionally indicates the end of the BATTERY definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none* ", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none* ", + "required": "No", + "variability": "constant" + }) +}} + +{{ + member_table({ + "units": "^o^F", + "legal_range": "*unrestricted*", + "default": "*none*", + "required": "Required if *sfExCnd* = SPECIFIEDT", + "variability": "hourly" + }) +}} + +### dsInsulR + +Type: float + +Insulation thermal resistance *not including* surface conductances. dsInsulR and dsInsulMat are used to calculate insulation thickness (see below). Duct insulation is modeled as a pure conductance (no mass). + +{{ + member_table({ + "units": "ft^2^-^o^F-hr / Btu", + "legal_range": "x $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### dsInsulMat + +Type: matName + +Name of insulation MATERIAL. The conductivity of this material at 70 ^o^F is combined with dsInsulR to derive the duct insulation thickness. If omitted, a typical fiberglass material is assumed having conductivity of 0.025 Btu/hr-ft^2^-F at 70 ^o^F and a conductivity coefficient of .00418 1/F (see MATERIAL). In addition, insulation conductivity is adjusted during the simulation in response its average temperature. As noted with dsInsulR, duct insulation is modeled as pure conductance -- MATERIAL matDens and matSpHt are ignored. + +{{ + member_table({ + "units": "", + "legal_range": "name of a *MATERIAL*", + "default": "fiberglass", + "required": "No", + "variability": "constant" + }) +}} + +### dsLeakF + +Type: float + +Duct leakage. Return duct leakage is modeled as if it all occurs at the segment inlet. Supply duct leakage is modeled as if it all occurs at the outlet. + +{{ + member_table({ + "units": "", + "legal_range": "0 $<$ x $\\le$ 1", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### dsExH + +Type: float + +Outside (exposed) surface convection coefficient. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "x $\\ge$ 0", + "default": ".54", + "required": "No", + "variability": "subhourly" + }) +}} + +### endDuctSeg + +Optionally indicates the end of the DUCTSEG definition. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[ductSeg][p_ductseg] +- @[izXfer][p_izxfer] (generated as "\-DLkI" for supply or "\-DLkO" for return) diff --git a/doc/src/records/export.md b/doc/src/docs/input-data/export.md similarity index 56% rename from doc/src/records/export.md rename to doc/src/docs/input-data/export.md index 9b44854c3..c8b19b719 100644 --- a/doc/src/records/export.md +++ b/doc/src/docs/input-data/export.md @@ -10,185 +10,247 @@ Depending on your application, if you specify multiple exports, you may need to Input for EXPORTs is similar to input for REPORTs; refer to the REPORT description in Section 5.25 for further discussion of the members shown here. -**exName** +### exName Name of export. Give after the word EXPORT. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**exExportfile=*fname*** +### exExportfile + +Type: fname Name of export file to which current export will be written. If omitted, if EXPORT is within an EXPORTFILE object, report will be written to that export file, or else to the automatically-supplied EXPORTFILE "Primary", which by default uses the name of the input file with the extension .csv. -<%= member_table( - units: "", - legal_range: "name of an *EXPORTFILE*", - default: "current *EXPORTFILE*, if any, else 'Primary'", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "name of an *EXPORTFILE*", + "default": "current *EXPORTFILE*, if any, else 'Primary'", + "required": "No", + "variability": "constant" + }) +}} + +### exType -**exType=*choice*** +Type: choice Choice indicating export type. See descriptions in Section 5.22, REPORT. While not actually disallowed, use of *exType* = ERR, LOG, INP, or ZDD is unexpected. -<%= member_table( - units: "", - legal_range: "ZEB, ZST, MTR, DHWMTR, AH, UDT, or SUM", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "ZEB, ZST, MTR, DHWMTR, AH, UDT, or SUM", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**exFreq=*choice*** +### exFreq + +Type: choice Export Frequency: specifies interval for generating rows of export data: -<%= member_table( - units: "", - legal_range: "YEAR, MONTH, DAY, HOUR, HOURANDSUB, SUBHOUR", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "YEAR, MONTH, DAY, HOUR, HOURANDSUB, SUBHOUR", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### exDayBeg -**exDayBeg=*date*** +Type: date Initial day of export. Exports for which *exFreq* = YEAR do not allow specification of *exDayBeg* and *exDayEnd*; for MONTH exports, these members are optional and default to include the entire run; for DAY and shorter-interval exports, *exDayBeg* is required and *exDayEnd* defaults to *exDayBeg*. -<%= member_table( - units: "", - legal_range: "*date*", - default: "first day of simulation if *exFreq* = MONTH", - required: "Required for *exTypes* ZEB, ZST, MTR, AH, and UDT if *exFreq* is DAY, HOUR, HOURANDSUB, or SUBHOUR", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "first day of simulation if *exFreq* = MONTH", + "required": "Required for *exTypes* ZEB, ZST, MTR, AH, and UDT if *exFreq* is DAY, HOUR, HOURANDSUB, or SUBHOUR", + "variability": "constant" + }) +}} -**exDayEnd=*date*** +### exDayEnd + +Type: date Final day of export period, except for YEAR exports. -<%= member_table( - units: "", - legal_range: "*date*", - default: "last day of simulation if *exFreq*= MONTH, else *exDayBeg*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "last day of simulation if *exFreq*= MONTH, else *exDayBeg*", + "required": "No", + "variability": "constant" + }) +}} + +### exZone -**exZone=*znName*** +Type: znName Name of ZONE for which a ZEB, ZST, or ZDD export is being requested; ALL and SUM are also allowed except with *exType* = ZST. -<%= member_table( - units: "", - legal_range: "name of a *ZONE*, ALL, SUM", - default: "*none*", - required: "Required for *exTypes* ZDD, ZEB, and ZST.", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *ZONE*, ALL, SUM", + "default": "*none*", + "required": "Required for *exTypes* ZDD, ZEB, and ZST.", + "variability": "constant" + }) +}} -**exMeter=*mtrName*** +### exMeter + +Type: mtrName Specifies meter(s) whose data is to be exported, for *exType*=MTR. -<%= member_table( - units: "", - legal_range: "name of a *METER*, ALL, SUM", - default: "*none*", - required: "for *exType*=MTR", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *METER*, ALL, SUM", + "default": "*none*", + "required": "for *exType*=MTR", + "variability": "constant" + }) +}} + +### exTu -**exTu=*tuName*** +Type: tuName Specifies air handler(s) to be reported, for *rpType*=TUSIZE or TULOAD. -<%= member_table( - units: "", - legal_range: "name of a TERMINAL, ALL, SUM", - default: "", - required: "Required for *rpType*", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a TERMINAL, ALL, SUM", + "default": "", + "required": "Required for *rpType*", + "variability": "constant" + }) +}} -**exDHWMeter=*dhwMtrName*** +### exDHWMeter + +Type: dhwMtrName Specifies DHW meter(s) whose data is to be exported, for *exType*=DHWMTR. -<%= member_table( - units: "", - legal_range: "name of a *DHWMETER*, ALL, SUM", - default: "*none*", - required: "for *exType*=DHWMTR", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *DHWMETER*, ALL, SUM", + "default": "*none*", + "required": "for *exType*=DHWMTR", + "variability": "constant" + }) +}} + +### exAFMeter -**exAFMeter=*afMtrName*** +Type: afMtrName Air flow meter report. -<%= member_table( - units: "", - legal_range: "*Name of AFMETER*", - default: "0", - required: "No", - variability: "runly") %> +{{ + member_table({ + "units": "", + "legal_range": "*Name of AFMETER*", + "default": "0", + "required": "No", + "variability": "runly" + }) +}} -**exAh=ah*Name*** +### exAh + +Type: ah*Name* Specifies air handler(s) to be exported, for *exType*=AH. -<%= member_table( - units: "", - legal_range: "name of an *AIRHANDLER*, ALL, SUM", - default: "*none*", - required: "for *exType*=AH", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "name of an *AIRHANDLER*, ALL, SUM", + "default": "*none*", + "required": "for *exType*=AH", + "variability": "constant" + }) +}} + +### exBtuSf -**exBtuSf=*float*** +Type: float Scale factor used for exported energy values. -<%= member_table( - units: "", - legal_range: "*any multiple of ten*", - default: "1,000,000: energy exported in MBtu.", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*any multiple of ten*", + "default": "1,000,000: energy exported in MBtu.", + "required": "No", + "variability": "constant" + }) +}} -**exCond=*expression*** +### exCond + +Type: expression Conditional exporting flag. If given, export rows are generated only when value of expression is non-0. Allowed with *exTypes* ZEB, ZST, MTR, AH, and UDT. -<%= member_table( - units: "", - legal_range: "*any numeric expression*", - default: "1 (exporting enabled)", - required: "No", - variability: "subhour /end of interval") - %> +{{ + member_table({ + "units": "", + "legal_range": "*any numeric expression*", + "default": "1 (exporting enabled)", + "required": "No", + "variability": "subhour /end of interval" + }) +}} + +### exTitle -**exTitle=*string*** +Type: string Title for use in export header of User-Defined export. Disallowed if *exType* is not UDT. -<%= member_table( - units: "", - legal_range: "", - default: "User-defined Export", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "User-defined Export", + "required": "No", + "variability": "constant" + }) +}} -**exHeader=*choice*** +### exHeader + +Type: choice Use NO to suppress the export header which gives the export type, zone, meter, or air handler being exported, time interval, column headings, etc. You might do this if the export is to be subsequently imported to a program that is confused by the header information. Alternatively, one may use COLUMNSONLY to print only the column headings. This can be useful when plotting CSV data in a spreadsheet tool or [DView](https://beopt.nrel.gov/downloadDView). @@ -202,37 +264,46 @@ The *specific* month, day, etc. is NOT shown in the export header (as it is show The field names may be used by a program reading the export to identify the data in the rows which follow; if the program does this, it will not require modification when fields are added to or rearranged in the export in a future version of CSE. -<%= member_table( - units: "", - legal_range: "YES, YESIFNEW, NO, COLUMNSONLY, COLUMNSONLYIFNEW", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, YESIFNEW, NO, COLUMNSONLY, COLUMNSONLYIFNEW", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} + +### exFooter -**exFooter=*choice*** +Type: choice Use NO to suppress the blank line otherwise output as an export "footer". (Exports do not receive the total lines that most reports receive as footers.) -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} -**endExport** +### endExport Optionally indicates the end of the export definition. Alternatively, the end of the export definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[export](#p_export) +- @[export][p_export] diff --git a/doc/src/docs/input-data/exportcol.md b/doc/src/docs/input-data/exportcol.md new file mode 100644 index 000000000..d4130a89c --- /dev/null +++ b/doc/src/docs/input-data/exportcol.md @@ -0,0 +1,130 @@ +# EXPORTCOL + +Each EXPORTCOL defines a single datum of a User Defined Table (UDT) export; EXPORTCOLs are not used with other export types. + +Use as many EXPORTCOLs as there are values to be shown in each row of the user-defined export. The values will appear in the order defined in each data row output. Be sure to include values needed to identify the data, such as the month, day, and hour, as appropriate -- these are NOT automatically supplied in user-defined exports. + +EXPORTCOL members are similar to the corresponding REPORTCOL members. See Section 5.265.1.5 for further discussion. + +### colName + +Name of EXPORTCOL. + +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### colExport + +Type: exName + +Name of export to which this column belongs. If the EXPORTCOL is given within an EXPORT object, then *colExport* defaults to that export. + +{{ + member_table({ + "units": "", + "legal_range": "name of an *EXPORT*", + "default": "*current export, if any*", + "required": "Unless in an *EXPORT*", + "variability": "constant" + }) +}} + +### colVal + +Type: expression + +Value to show in this position in each row of export. + +{{ + member_table({ + "units": "", + "legal_range": "*any numeric or string expression*", + "default": "*none*", + "required": "Yes", + "variability": "subhour /end interval" + }) +}} + +### colHead + +Type: string + +Text used for field name in export header. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*colName* or blank", + "required": "No", + "variability": "constant" + }) +}} + +### colWid + +Type: int + +Maximum width. Leading and trailing spaces and non-significant zeroes are removed from export data to save file space. Specifying a *colWid* less than the default may reduce the maximum number of significant digits output. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "13", + "required": "No", + "variability": "constant" + }) +}} + +### colDec + +Type: int + +Number of digits after decimal point. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "*flexible format*", + "required": "No", + "variability": "constant" + }) +}} + +### colJust + +Type: choice + +Specifies positioning of data within column: + +{{ + csv_table("Left, Left justified + Right, Right justified") +}} + +### endExportCol + +Optionally indicates the end of the EXPORTCOL. Alternatively, the end of the definition can be indicated by END or by beginning another object. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[exportCol][p_exportcol] diff --git a/doc/src/records/exportfile.md b/doc/src/docs/input-data/exportfile.md similarity index 60% rename from doc/src/records/exportfile.md rename to doc/src/docs/input-data/exportfile.md index 4fc9c54af..63943988f 100644 --- a/doc/src/records/exportfile.md +++ b/doc/src/docs/input-data/exportfile.md @@ -6,63 +6,74 @@ EXPORTs contain the same information as reports, but formatted for reading by ot Input for EXPORTFILEs and EXPORTs is similar to that for REPORTFILEs and REPORTs, except that there is no page formatting. Refer to their preceding descriptions (Sections 5.24 and 5.25) for more additional discussion. -**xfName** +### xfName Name of EXPORTFILE object. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**xfFileName=*string*** +### xfFileName + +Type: string path name of file to be written. If no path is specified, the file is written in the current directory. If no extension is specified, .csv is used. -<%= member_table( - units: "", - legal_range: "*file name, path and extension optional*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*file name, path and extension optional*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### xfFileStat -**xfFileStat=*choice*** +Type: choice What CSE should do if file *xfFileName* already exists: -<%= csv_table(< false) - OVERWRITE, Overwrite pre-existing file. +{{ + csv_table("OVERWRITE, Overwrite pre-existing file. NEW, Issue error message if file exists. - APPEND, Append new output to present contents of existing file. -END -%> + APPEND, Append new output to present contents of existing file.") +}} If the specified file does not exist, it is created and *xfFileStat* has no effect. -<%= member_table( - units: "", - legal_range: "OVERWRITE, NEW, APPEND", - default: "OVERWRITE", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "OVERWRITE, NEW, APPEND", + "default": "OVERWRITE", + "required": "No", + "variability": "constant" + }) +}} -**endExportFile** +### endExportFile Optionally indicates the end of the export file definition. Alternatively, the end of the Export file definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[exportFile](#p_exportfile) +- @[exportFile][p_exportfile] diff --git a/doc/src/records/fndblock.md b/doc/src/docs/input-data/fndblock.md similarity index 57% rename from doc/src/records/fndblock.md rename to doc/src/docs/input-data/fndblock.md index 0f1399948..ab2f9c3a5 100644 --- a/doc/src/records/fndblock.md +++ b/doc/src/docs/input-data/fndblock.md @@ -12,29 +12,45 @@ Each block is represented as a rectangle in the domain by specifying the X (late Each corner point of a FNDBLOCK is defined relative to its reference point. The user may specify reference points to simplify the calculation of corner point coordinates. X and Z point values of zero imply that a point is the same as the reference point. The default for X and Z point values is zero since points will often align with one or both of the reference values. Options for X and Z references are illustrated in the figure below. -![Foundation block reference choices](media/fd_refs.png) +![Foundation block reference choices](../assets/images/fd_refs.png) +/// caption +Foundation block reference choices +/// The default X and Z references for the first corner point is WALLINT and WALLTOP, respectively. The second set of references default to the same reference as the first point. An example of defining FNDBLOCKs for a basement are shown below. -![Foundation block example for a basement with partial wall insulation](media/fd_block_basement.png) +![Foundation block example for a basement with partial wall insulation](../assets/images/fd_block_basement.png) +/// caption +Foundation block example for a basement with partial wall insulation +/// The example for a slab foundation shown below illustrates how leveraging default values can simplify user input. -![Foundation block example for a slab with gap and inerior perimeter insulation](media/fd_block_slab.png) +![Foundation block example for a slab with gap and inerior perimeter insulation](../assets/images/fd_block_slab.png) +/// caption +Foundation block example for a slab with gap and inerior perimeter insulation +/// -**fbMat=*matName*** +### fbMat + +Type: matName Name of MATERIAL of the foundation block. -<%= member_table( - legal_range: "Name of a *Material*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "legal_range": "Name of a *Material*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### fbX1Ref -**fbX1Ref=*choice*** +Type: choice Relative X origin for *fbX1* point. Options are: @@ -44,14 +60,19 @@ Relative X origin for *fbX1* point. Options are: - WALLEXT - FARFIELD -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "WALLINT", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "WALLINT", + "required": "No", + "variability": "constant" + }) +}} + +### fbZ1Ref -**fbZ1Ref=*choice*** +Type: choice Relative Z origin for *fbZ1* point. Options are: @@ -62,36 +83,51 @@ Relative Z origin for *fbZ1* point. Options are: - WALLBOTTOM - DEEPGROUND -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "WALLTOP", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "WALLTOP", + "required": "No", + "variability": "constant" + }) +}} -**fbX1=*float*** +### fbX1 + +Type: float The X position of the first corner of the block relative to *fbX1Ref*. -<%= member_table( - units: "ft", - legal_range: "", - default: "0.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "", + "default": "0.0", + "required": "No", + "variability": "constant" + }) +}} + +### fbZ1 -**fbZ1=*float*** +Type: float The Z position of the first corner of the block relative to *fbZ1Ref*. -<%= member_table( - units: "ft", - legal_range: "", - default: "0.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "", + "default": "0.0", + "required": "No", + "variability": "constant" + }) +}} -**fbX2Ref=*choice*** +### fbX2Ref + +Type: choice Relative X origin for *fbX2* point. Options are: @@ -101,14 +137,19 @@ Relative X origin for *fbX2* point. Options are: - WALLEXT - FARFIELD -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "same as *fbX1Ref*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "same as *fbX1Ref*", + "required": "No", + "variability": "constant" + }) +}} + +### fbZ2Ref -**fbZ2Ref=*choice*** +Type: choice Relative Z origin for *fbZ2* point. Options are: @@ -119,43 +160,58 @@ Relative Z origin for *fbZ2* point. Options are: - WALLBOTTOM - DEEPGROUND -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "same as *fbZ1Ref*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "same as *fbZ1Ref*", + "required": "No", + "variability": "constant" + }) +}} -**fbX2=*float*** +### fbX2 + +Type: float The X position of the second corner of the block relative to *fbX2Ref*. -<%= member_table( - units: "ft", - legal_range: "", - default: "0.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "", + "default": "0.0", + "required": "No", + "variability": "constant" + }) +}} + +### fbZ2 -**fbZ2=*float*** +Type: float The Z position of the second corner of the block relative to *fbZ2Ref*. -<%= member_table( - units: "ft", - legal_range: "", - default: "0.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "", + "default": "0.0", + "required": "No", + "variability": "constant" + }) +}} -**endFndBlock** +### endFndBlock Indicates the end of the foundation block definition. Alternatively, the end of the foundation block definition can be indicated by the declaration of another object or by END. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} diff --git a/doc/src/records/foundation.md b/doc/src/docs/input-data/foundation.md similarity index 72% rename from doc/src/records/foundation.md rename to doc/src/docs/input-data/foundation.md index 42bcc7b8e..d9f4e9067 100644 --- a/doc/src/records/foundation.md +++ b/doc/src/docs/input-data/foundation.md @@ -2,9 +2,15 @@ Foundation describes the two-dimensional relationship between ground-contact SURFACEs (i.e., **sfExCnd** = GROUND) and the surrounding ground. A FOUNDATION is referenced by ground-contact floor SURFACEs (see **sfFnd**). FOUNDATIONs are used to describe the two-dimensional features of foundation designs that cannot be captured by the typical one-dimensional CONSTRUCTIONs. The dimensions from the one-dimensional CONSTRUCTIONs associated with ground-contact floors and walls are automatically interpreted into the two-dimensional context. -![Two-dimensional context for a slab foundation](media/fd_context_slab.png) +![Two-dimensional context for a slab foundation](../assets/images/fd_context_slab.png) +/// caption +Two-dimensional context for a slab foundation +/// -![Two-dimensional context with below grade walls](media/fd_context_basement.png) +![Two-dimensional context with below grade walls](../assets/images/fd_context_basement.png) +/// caption +Two-dimensional context with below grade walls +/// Any ground-contact wall SURFACEs in contact with the ground must refer to a Floor SURFACE object (see **sfFndFloor**) to indicate which floor shares the same ground boundary condition in the two-dimensional context. @@ -38,56 +44,76 @@ The following data members describe the dimensions and properties of the structu Other components of the foundation design (e.g., interior/exterior insulation) as well as other variations in thermal properties within the ground are defined using FNDBLOCK (foundation block) objects. Any number of FNDBLOCKs can appear after the definition of a FOUNDATION to be properly associated. -**fdName** +### fdName Name of foundation; give after the word FOUNDATION. Required for reference from SURFACE objects. -<%= member_table( - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**fdWlHtAbvGrd=*float*** +### fdWlHtAbvGrd + +Type: float Distance between the grade level and the top of the foundation wall. -<%= member_table( - units: "ft", - legal_range: "x $\\geq$ 0", - default: "0.5", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "x $\\geq$ 0", + "default": "0.5", + "required": "No", + "variability": "constant" + }) +}} + +### fdWlDpBlwSlb -**fdWlDpBlwSlb=*float*** +Type: float Distance between the bottom of the slab and the bottom of the foundation wall. Foundation walls typically extend to the bottom of the slab and rest on a footing. If the footing isn't explicitly modeled as a FNDBLOCK, this value can be extended to approximate the footing. -<%= member_table( - units: "ft", - legal_range: "x $\\geq$ 0", - default: "0.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "x $\\geq$ 0", + "default": "0.0", + "required": "No", + "variability": "constant" + }) +}} + +### fdWlCon -**fdWlCon=*conName*** +Type: conName Name of the CONSTRUCTION for the structural foundation wall. In the two-dimensional context, this construction spans from the top of the foundation wall to its depth below the slab (*fdWlDpBlwSlb*). Any construction on the interior of the wall (spanning from the top of the foundation wall to the top of the slab), must be defined by the *sfCon* of the corresponding wall surface. Typically, this CONSTRUCTION will be a single layer of poured concrete. -<%= member_table( - legal_range: "Name of a *Construction*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "legal_range": "Name of a *Construction*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**endFoundation** +### endFoundation Indicates the end of the foundation definition. Alternatively, the end of the foundation definition can be indicated by the declaration of another object or by END. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} diff --git a/doc/src/records/gain.md b/doc/src/docs/input-data/gain.md similarity index 65% rename from doc/src/records/gain.md rename to doc/src/docs/input-data/gain.md index 34fa426f8..d4a914b1f 100644 --- a/doc/src/records/gain.md +++ b/doc/src/docs/input-data/gain.md @@ -15,207 +15,253 @@ In the CNE zone mode, the radiant internal gain is distributed to the surfaces i Radiant internal gains are included in the IgnS (Sensible Internal Gain) column in the zone energy balance reports. (They could easily be shown in a separate IgnR column if desired.) Any energy transfer shows two places in the ZEB report, with opposite signs, so that the result is zero -- otherwise it wouldn't be an energy balance. The rest of the reporting story for radiant internal gains turns out to be complex. The specified value of the radiant gain (gnPower \* gnFrZn \* gnFrRad) shows in the IgnS column. To the extent that the gain heats the zone, it also shows negatively in the Masses column, because the zone CAir is lumped with the other masses. To the extent that the gain heats massive surfaces, it also shows negatively in the masses column. To the extent that the gain conducts through windows and quick-model surfaces, it shows negatively in the Conduction column. If the gain conducts through a quick-model surface to another zone, it shows negatively in the Izone (Interzone) column, positively in the Izone column of the receiving zone, and negatively in the receiving zone's Masses or Cond column. -**gnName** +### gnName Name of gain; follows the word GAIN if given. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**gnZone=*znName*** +### gnZone + +Type: znName Name of ZONE to which heat gains are added. Omitted when GAIN is given as a ZONE subobject. If a TOP subobject (i.e., not a ZONE subobject) and znZone is omitted, heat gains are discarded but energy use is still recorded to gnMeter. This feature can be used to represent energy uses that our outside of conditioned zones (e.g. exterior lighting). -<%= member_table( - units: "", - legal_range: "*name of ZONE*", - default: "*parent zone if any*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*name of ZONE*", + "default": "*parent zone if any*", + "required": "No", + "variability": "constant" + }) +}} + +### gnPower -**gnPower=*float*** +Type: float Rate of heat addition/energy use. Negative gnPower values may be used to represent heat removal/energy generation. Expressions containing functions are commonly used with this member to schedule the gain power on a daily and/or hourly basis. Refer to the functions section in Section 4 for details and examples. All gains, including electrical, are specified in Btuh units unless associated with DHW use (see gnCtrlDHWSYS), in which case gnPower is specified in Btuh/gal. Note that meter reporting of internal gain is in MBtu (millions of Btu) by default. -<%= member_table( - units: "Btuh", - legal_range: "*no restrictions*", - default: "*none*", - required: "Yes", - variability: "hourly") - %> +{{ + member_table({ + "units": "Btuh", + "legal_range": "*no restrictions*", + "default": "*none*", + "required": "Yes", + "variability": "hourly" + }) +}} -**gnMeter=*choice*** +### gnMeter + +Type: choice Name of meter by which this GAIN's gnPower is recorded. If omitted, gain is assigned to no meter and energy use is not accounted in CSE simulation reports; thus, gnMeter should only be omitted for "free" energy sources. -<%= member_table( - units: "", - legal_range: "*name of METER*", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*name of METER*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### gnEndUse -**gnEndUse=*choice*** +Type: choice Meter end use to which the GAIN's energy use should be accumulated. -<%= insert_file("doc/src/enduses.md") %> +{% include 'shared/enduses.md' %} -<%= member_table( - units: "", - legal_range: "*Codes listed above*", - default: "*none*", - required: "Required if gnMeter is given", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*Codes listed above*", + "default": "*none*", + "required": "Required if gnMeter is given", + "variability": "constant" + }) +}} The gnFrZn, gnFrPl, and gnFrRtn members allow you to allocate the gain among the zone, the zone's plenum, and the zone's return air flow. Values that total to more than 1.0 constitute an error. If they total less than 1, the unallocated portion of the gain is recorded by the meter (if specified) but not transferred into the building. By default, all of the gain not directed to the return or plenum goes to the zone. -**gnFrZn=*float*** +### gnFrZn -Fraction of gain going to zone. gnFrLat (below) gives portion of this gain that is latent, if any; the remainder is sensible. - -<% if not_yet_implemented %> +Type: float -<%= member_table( - units: "", - legal_range: "gnFrZn + gnFrPl + gnFrRtn $\leq$ 1", - default: "*1 - gnFrPl - gnFrRtn*", - required: "No", - variability: "hourly") - %> +Fraction of gain going to zone. gnFrLat (below) gives portion of this gain that is latent, if any; the remainder is sensible. -<% else %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "1.", + "required": "No", + "variability": "hourly" + }) +}} -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "1.", - required: "No", - variability: "hourly") - %> -<% end %> +### gnFrPl -**gnFrPl=*float*** +Type: float Fraction of gain going to plenum. -<%= member_table( - units: "", - legal_range: "gnFrZn + gnFrPl + gnFrRtn $\\leq$ 1", - default: "0.", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "gnFrZn + gnFrPl + gnFrRtn $\\leq$ 1", + "default": "0.", + "required": "No", + "variability": "hourly" + }) +}} -**gnFrRtn=*float*** +### gnFrRtn + +Type: float Fraction of gain going to return. -<%= member_table( - units: "", - legal_range: "gnFrZn + gnFrPl + gnFrRtn $\\leq$ 1", - default: "0.", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "gnFrZn + gnFrPl + gnFrRtn $\\leq$ 1", + "default": "0.", + "required": "No", + "variability": "hourly" + }) +}} + +### gnFrRad -**gnFrRad=*float*** +Type: float Fraction of total gain going to zone (gnFrZn) that is radiant rather than convective or latent. -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "0.0", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "0.0", + "required": "No", + "variability": "hourly" + }) +}} -**gnFrLat=*float*** +### gnFrLat + +Type: float Fraction of total gain going to zone (gnFrZn) that is latent heat (moisture addition). -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.0", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.0", + "required": "No", + "variability": "hourly" + }) +}} + +### gnDlFrPow -**gnDlFrPow=*float*** +Type: float Hourly power reduction factor, typically used to modify lighting power to account for daylighting. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "1.0", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "1.0", + "required": "No", + "variability": "hourly" + }) +}} -**gnCtrlDHWSYS=*dhwsysName*** +### gnCtrlDHWSYS + +Type: dhwsysName Name of a DHWSYS whose water use modulates gnPower. For example, electricity use of water-using appliances (e.g. dishwasher or clothes washer) can be modeled based on water use, ensuring that the uses are synchronized. When this feature is used, gnPower should be specified in Btuh/gal. -<%= member_table( - units: "", - legal_range: "*name of a DHWSYS*", - default: "no DHWSYS/GAIN linkage", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*name of a DHWSYS*", + "default": "no DHWSYS/GAIN linkage", + "required": "No", + "variability": "constant" + }) +}} + +### gnCtrlDHWMETER -**gnCtrlDHWMETER=*dhwMtrName*** +Type: dhwMtrName Allows gains to track water usage such as dishwashers, clothes washers, etc. -<%= member_table( - units: "", - legal_range: "*name of DHWMETER*", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of DHWMETER*", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### gnCtrlDHWEndUse -**gnCtrlDHWEndUse=*dhwEndUseName*** +Type: dhwEndUseName Name of the DHWSYS end use consumption that modulates gnPower. See DHWMETER for DHW end use definitions. -<%= member_table( - units: "", - legal_range: "DHW end use", - default: "Total", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "DHW end use", + "default": "Total", + "required": "No", + "variability": "constant" + }) +}} -**endGain** +### endGain Optional to indicate the end of the GAIN definition. Alternatively, the end of the gain definition can be indicated by END or by the declaration of another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[gain](#p_gain) +- @[gain][p_gain] diff --git a/doc/src/records/glazetype.md b/doc/src/docs/input-data/glazetype.md similarity index 53% rename from doc/src/records/glazetype.md rename to doc/src/docs/input-data/glazetype.md index a85632bc4..3bea3a416 100644 --- a/doc/src/records/glazetype.md +++ b/doc/src/docs/input-data/glazetype.md @@ -2,31 +2,39 @@ GLAZETYPE constructs an object of class GLAZETYPE that represents a glazing type for use in WINDOWs. -**gtName** +### gtName Name of glazetype. Required for reference from WINDOW objects, below. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**gtModel=*choice*** +### gtModel + +Type: choice Selects model to be used for WINDOWs based on this GLAZETYPE. -<%= member_table( - units: "", - legal_range: "SHGC, ASHWAT", - default: "SHGC", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "SHGC, ASHWAT", + "default": "SHGC", + "required": "No", + "variability": "constant" + }) +}} + +### gtU -**gtU=*float*** +Type: float Glazing conductance (U-factor without surface films, therefore not actually a U-factor but a C-factor). Used as wnU default; an error message will be issued if the U value is not given in the window (wnU) nor in the glazeType (gtU). Preferred Approach: To use accurately with standard winter rated U-factor from ASHRAE or NFRC enter as: @@ -36,75 +44,99 @@ Where 0.85 is the sum of the interior (0.68) and exterior (0.17) design air film Approach 2. Enter gtU=U-factor and let the wnInH and wnExH default. This approach systematically underestimates the window U-factor because it adds the wnExfilm resistance to 1/U-factor thereby double counting the exterior film resistance. This approach will also yield incorrect results for gnFrad internal gain since the high wnInH will put almost all the gain back in the space. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**gtUNFRC=*float*** +### gtUNFRC + +Type: float Fenestration system (including frame) U-factor evaluated at NFRC heating conditions. For ASHWAT windows, a value for the NFRC U-factor is required, set via gtUNFRC or wnUNFRC. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### gtSHGC -**gtSHGC=*float*** +Type: float Glazing Solar Heat Gain Coefficient: fraction of normal beam insolation which gets through glass to space inside. We recommend using this to represent the glass normal transmissivity characteristic only, before shading and framing effects -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**gtSMSO=*float*** +### gtSMSO + +Type: float SHGC multiplier with shades open. May be overriden in the specific window input. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "1.0", - required: "No", - variability: "Monthly - Hourly") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "1.0", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### gtSMSC -**gtSMSC=*float*** +Type: float SHGC multiplier with shades closed. May be overriden in the specific window input. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "gtSMSO (no shades)", - required: "No", - variability: "Monthly - Hourly") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "gtSMSO (no shades)", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### gtFMult -**gtFMult=*float*** +Type: float Framing multiplier used if none given in window, for example .9 if frame and mullions reduce the solar gain by 10%. Default of 1.0 implies frame/mullion effects allowed for in gtSHGC's or always specified in Windows. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "gtSHGCO", - required: "No", - variability: "Monthly - Hourly") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "gtSHGCO", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} -**gtPySHGC =*float*** +### gtPySHGC + +Type: *float* Four float values separated by commas. Coefficients for incidence angle SHGC multiplier polynomial applied to gtSHGC to determine beam transmissivity at angles of incidence other than 90 degrees. The values are coefficients for first through fourth powers of the cosine of the incidence angle; there is no constant part. An error message will be issued if the coefficients do not add to one. They are used in the following computation: @@ -116,98 +148,126 @@ Four float values separated by commas. Coefficients for incidence angle SHGC mul     beamXmisvty = gtSHGCO \* angMult (shades open) -<%= member_table( - units: "float", - legal_range: "*any*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "float", + "legal_range": "*any*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### gtDMSHGC -**gtDMSHGC=*float*** +Type: float SHGC diffuse multiplier, applied to gtSHGC to determine transmissivity for diffuse radiation. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**gtDMRBSol=*float*** +### gtDMRBSol + +Type: float SHGC diffuse multiplier, applied to qtSHGC to determine transmissivity for diffuse radiation reflected back out the window. Misnamed as a reflectance. Assume equal to DMSHGC if no other data available. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### gtNGlz -**gtNGlz=*int*** +Type: int Number of glazings in the Glazetype (bare glass only, not including any interior or exterior shades). -<%= member_table( - units: "", - legal_range: "*0* $<$ *x* $\\leq$ *4*", - default: "2", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*0* $<$ *x* $\\leq$ *4*", + "default": "2", + "required": "No", + "variability": "constant" + }) +}} -**gtExShd=*choice*** +### gtExShd + +Type: choice Exterior shading type (ASHWAT only). -<%= member_table( - units: "", - legal_range: "NONE INSCRN", - default: "NONE", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "NONE INSCRN", + "default": "NONE", + "required": "No", + "variability": "constant" + }) +}} + +### gtInShd -**gtInShd=*choice*** +Type: choice Interior shade type (ASHWAT only). -<%= member_table( - units: "", - legal_range: "NONE DRAPEMED", - default: "NONE", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "NONE DRAPEMED", + "default": "NONE", + "required": "No", + "variability": "constant" + }) +}} + +### gtDirtLoss -**gtDirtLoss=*float*** +Type: float Glazing dirt loss factor. -<%= member_table( - units: "fraction", - legal_range: "*0* $\\leq$ *x* $\\leq$ *1*", - default: "0", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "fraction", + "legal_range": "*0* $\\leq$ *x* $\\leq$ *1*", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} -**endGlazeType** +### endGlazeType Optional to indicates the end of the Glazetype. Alternatively, the end of the GLAZETYPE definition can be indicated by "END" or by beginning another object -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[glazeType](#p_glazetype) +- @[glazeType][p_glazetype] diff --git a/doc/src/records/heatplant.md b/doc/src/docs/input-data/heatplant.md similarity index 69% rename from doc/src/records/heatplant.md rename to doc/src/docs/input-data/heatplant.md index 4108a7376..73bcbd487 100644 --- a/doc/src/records/heatplant.md +++ b/doc/src/docs/input-data/heatplant.md @@ -8,51 +8,62 @@ The BOILERs in the HEATPLANT can be grouped into *STAGES* of increasing capacity For each HEATPLANT, piping loss is modeled, as a constant fraction of the BOILER capacity of the heatPlant's most powerful stage. This heat loss is added to the load whenever the plant is operating; as modeled, the heat loss is independent of load, weather, or any other variables. -**heatplantName** +### heatplantName Name of HEATPLANT object, given immediately after the word HEATPLANT. This name is used to refer to the heatPlant in *tuhcHeatplant* and *ahhcHeatplant* commands. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**hpSched=*choice*** +### hpSched + +Type: choice Heat plant schedule: hourly variable choice of OFF, AVAIL, or ON. -<%= csv_table(< false) -OFF, HEATPLANT will not supply hot water regardless of demand. All loads (HW coils and heat exchangers) should be scheduled off when the plant is off; an error will occur if a coil calls for heat when its plant is off. +{{ + csv_table("OFF, HEATPLANT will not supply hot water regardless of demand. All loads (HW coils and heat exchangers) should be scheduled off when the plant is off; an error will occur if a coil calls for heat when its plant is off. AVAIL, HEATPLANT will operate when one or more loads demand heat. -ON, HEATPLANT runs unconditionally. When no load wants heat, least powerful (first) stage runs. -END -%> +ON, HEATPLANT runs unconditionally. When no load wants heat, least powerful (first) stage runs.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "OFF, AVAIL, or ON", + "default": "AVAIL", + "required": "No", + "variability": "hourly" + }) +}} -<%= member_table( - units: "", - legal_range: "OFF, AVAIL, or ON", - default: "AVAIL", - required: "No", - variability: "hourly") %> +### hpPipeLossF -**hpPipeLossF=*float*** +Type: float Heat plant pipe loss: heat assumed lost from piping connecting boilers to loads whenever the HEATPLANT is operating, expressed as a fraction of the boiler capacity of the plant's most powerful stage. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.01", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.01", + "required": "No", + "variability": "constant" + }) +}} -**hpStage1=boilerName, boilerName, boilerName, ...** -**hpStage1=ALL\_BUT, boilerName, boilerName, boilerName, ...** +### hpStageN -**hpStage2 through hpStage7 same** +Type: boilerName list, ALL_BUT and boilerName list, or ALL The commands *hpStage1* through *hpStage7* allow specification of up to seven *STAGES* in which BOILERs are activated as the load increases. Each stage may be specified with a list of up to seven names of BOILERs in the HEATPLANT, or with the word ALL, meaning all of the HEATPLANT's BOILERs, or with the word ALL\_BUT and a list of up to six names of BOILERs. Each stage should be more powerful than the preceding one. If you have less than seven stages, you may skip some of the commands *hpStage1* through *hpStage7* -- the used stage numbers need not be contiguous. @@ -60,24 +71,30 @@ If none of *hpStage1* through *hpStage7* are given, CSE supplies a single defaul A comma must be entered between boiler names and after the word ALL\_BUT. -<%= member_table( - units: "", - legal_range: "1 to 7 names;ALL\_BUT and 1 to 6 names;ALL", - default: "*hpStage1* = ALL", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "1 to 7 names;ALL\_BUT and 1 to 6 names;ALL", + "default": "*hpStage1* = ALL", + "required": "No", + "variability": "constant" + }) +}} -**endHeatplant** +### endHeatplant Optionally indicates the end of the HEATPLANT definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[heatPlant](#p_heatplant) +- @[heatPlant][p_heatplant] diff --git a/doc/src/records/holiday.md b/doc/src/docs/input-data/holiday.md similarity index 63% rename from doc/src/records/holiday.md rename to doc/src/docs/input-data/holiday.md index bcac9d04a..2471cbd66 100644 --- a/doc/src/records/holiday.md +++ b/doc/src/docs/input-data/holiday.md @@ -1,111 +1,139 @@ # HOLIDAY -HOLIDAY objects define holidays. Holidays have no inherent effect, but input expressions can test for holidays via the \$DOWH, \$isHoliday, \$isHoliTrue, \$isWeHol, and \$isBegWeek system variables (4.6.4). +HOLIDAY objects define holidays. Holidays have no inherent effect, but input expressions can test for holidays via the `$DOWH`, `$isHoliday`, `$isHoliTrue`, `$isWeHol`, and `$isBegWeek` system variables (4.6.4). Examples and the list of default holidays are given after the member descriptions. -**hdName** +### hdName Name of holiday: must follow the word HOLIDAY. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} A holiday may be specified by date or via a rule such as "Fourth Thursday in November". To specify by date, give hdDateTrue, and also hdDateObs or hdOnMonday if desired. To specify by rule, give all three of hdCase, hdMon, and hdDow. -**hdDateTrue*=date*** +### hdDateTrue + +Type: date The true date of a holiday, even if not celebrated on that day. -<%= member_table( - units: "", - legal_range: "*date*", - default: "*blank*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "*blank*", + "required": "No", + "variability": "constant" + }) +}} + +### hdDateObs -**hdDateObs*=date*** +Type: date The date that a holiday will be observed. Allowed only if hdDateTrue given and hdOnMonday not given. -<%= member_table( - units: "", - legal_range: "*date*", - default: "*hdDateTrue*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "*hdDateTrue*", + "required": "No", + "variability": "constant" + }) +}} + +### hdOnMonday -**hdOnMonday=*choice*** +Type: choice If YES, holiday is observed on the following Monday if the true date falls on a weekend. Allowed only if hdDateTrue given and hdDateObs not given. Note: there is no provision to celebrate a holiday that falls on a Saturday on *Friday* (as July 4 was celebrated in 1992). -<%= member_table( - units: "", - legal_range: "YES/NO", - default: "YES", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "YES/NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} -**hdCase=*choice*** +### hdCase + +Type: choice Week of the month that the holiday is observed. hdCase, hdMon, and hdDow may be given only if hdDateTrue, hdDateObs, and hdOnMonday are not given. -<%= member_table( - units: "", - legal_range: "FIRST SECOND THIRD FOURTH LAST", - default: "FIRST", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "FIRST SECOND THIRD FOURTH LAST", + "default": "FIRST", + "required": "No", + "variability": "constant" + }) +}} + +### hdMon -**hdMon=*choice*** +Type: choice Month that the holiday is observed. -<%= member_table( - units: "", - legal_range: "JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC", - default: "*none*", - required: "required if hdCase given", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC", + "default": "*none*", + "required": "required if hdCase given", + "variability": "constant" + }) +}} + +### hdDow -**hdDow*=choice*** +Type: choice Day of the week that the holiday is observed. -<%= member_table( - units: "", - legal_range: "SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY", - default: "MONDAY", - required: "required if hdCase given", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY", + "default": "MONDAY", + "required": "required if hdCase given", + "variability": "constant" + }) +}} -**endHoliday** +### endHoliday Indicates the end of the holiday definition. Alternatively, the end of the holiday definition can be indicated by "END" or simply by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "", - required: "*none*", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "", + "required": "*none*", + "variability": "constant" + }) +}} Examples of valid HOLIDAY object specifications: @@ -139,8 +167,8 @@ Examples of valid HOLIDAY object specifications: As with reports, Holidays are automatically generated for a standard set of Holidays. The following are the default holidays automatically defined by CSE: -<%= csv_table(< false) - New Year's Day, \*January 1 +{{ + csv_table("New Year's Day, \*January 1 M L King Day, \*January 15 President's Day, 3rd Monday in February Memorial Day, last Monday in May @@ -149,9 +177,8 @@ As with reports, Holidays are automatically generated for a standard set of Holi Columbus Day, 2nd Monday in October Veterans Day, \*November 11 Thanksgiving, 4th Thursday in November - Christmas, \*December 25 -END -%> + Christmas, \*December 25") +}} \* *observed on the following Monday if falls on a weekend, except as otherwise noted:* @@ -167,4 +194,4 @@ Note that the name must be spelled *exactly* as listed above. **Related Probes:** -- @[holiday](#p_holiday) +- @[holiday][p_holiday] diff --git a/doc/src/records/importfile.md b/doc/src/docs/input-data/importfile.md similarity index 63% rename from doc/src/records/importfile.md rename to doc/src/docs/input-data/importfile.md index 15005a9dd..f80701b51 100644 --- a/doc/src/records/importfile.md +++ b/doc/src/docs/input-data/importfile.md @@ -1,19 +1,18 @@ # IMPORTFILE -IMPORTFILE allows specification of a file from which external data can be accessed using the [import()](#import) and [importStr()](#importstr) functions. This allows external values to be referenced in expressions. Any number of IMPORTFILEs can be defined and any number of import()/importStr() references can be made to a give IMPORTFILE. +IMPORTFILE allows specification of a file from which external data can be accessed using the [import()][import] and [importStr()][importstr] functions. This allows external values to be referenced in expressions. Any number of IMPORTFILEs can be defined and any number of import()/importStr() references can be made to a give IMPORTFILE. Import files are text files containing an optional header and comma-separated data fields. With -the header present, the structure of an import file matches that of an [EXPORT](#export) file. This makes it convenient to import unmodified files EXPORTed from prior runs. The file structure is as follows (noting that the header in lines 1-4 should not be present when imHeader=NO) -- +the header present, the structure of an import file matches that of an [EXPORT][export] file. This makes it convenient to import unmodified files EXPORTed from prior runs. The file structure is as follows (noting that the header in lines 1-4 should not be present when imHeader=NO) -- -<%= csv_table(< true) - Line, Contents, Notes +{{ + csv_table("Line, Contents, Notes 1, *runTitle*, *runNumber*, read but not checked 2, *timestamp*, in quotes, read but not checked 3, *title*, *freq*, should match imTitle and imFreq (see below) 4, *colName1*, *colName2*, ..., comma separated column names optionally in quotes - 5 .., *val1*, *val2*, ..., comma separated values (string values optionally in quotes) -END -%> + 5 .., *val1*, *val2*, ..., comma separated values (string values optionally in quotes)", True) +}} Example import file imp1.csv @@ -53,85 +52,116 @@ Notes -**imName** +### imName Name of IMPORTFILE object (for reference from Import()). -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**imFileName=*string*** +### imFileName + +Type: string Gives path name of file to be read. If directory is specified, CSE first looks for the file the current directory and searches include paths specified by the -I command line parameter (if any). -<%= member_table( - units: "", - legal_range: "*file name, path optional*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*file name, path optional*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### imTitle -**imTitle=*string*** +Type: string Title expected to be found on line 3 of the import file. A warning is issued if a non-blank imTitle does not match the import file title. -<%= member_table( - units: "", - legal_range: "Text string", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "Text string", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### imFreq -**imFreq=*choice*** +Type: choice Specifies the interval at which CSE reads from the import file. Data is read at the beginning of the indicated interval and buffered in memory for access in expressions via import() or importStr(). -<%= member_table( - units: "", - legal_range: "YEAR, MONTH, DAY, HOUR, or SUBHOUR", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YEAR, MONTH, DAY, HOUR, or SUBHOUR", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**imHeader=*choice*** +### imHeader + +Type: choice Indicates whether the import file include a 4 line header, as described above. If NO, the import file should contain only comma-separated data rows and data items can be referenced only by 1-based column number. -<%= member_table( - units: "", - legal_range: "YES NO", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} + +### imBinary -**imBinary=*choice*** +Type: choice Adds the possibility to output the file as a binary option. -<%= member_table( - units: "", - legal_range: "YES NO", - default: "No", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES NO", + "default": "No", + "required": "No", + "variability": "constant" + }) +}} -**endImportFile** +### endImportFile Optionally indicates the end of the import file definition. Alternatively, the end of the import file definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[importFile](#p_importfile) -- @[impFileFldNames](#p_impfilefldnames) +- @[importFile][p_importfile] +- @[impFileFldNames][p_impfilefldnames] diff --git a/doc/src/input-data.md b/doc/src/docs/input-data/index.md similarity index 56% rename from doc/src/input-data.md rename to doc/src/docs/input-data/index.md index 9df80f987..6febb3f6f 100644 --- a/doc/src/input-data.md +++ b/doc/src/docs/input-data/index.md @@ -16,18 +16,26 @@ After the object name, each member's description is introduced with a line of th - *date* -These types discussed in the section on [expression types](#expression-types). +These types discussed in the section on [expression types][expression-types]. Each member's description continues with a table of the form: -<%= member_table( - units: "ft^2^", - legal_range: "x > 0", - default: "wnHeight \\\* wnWidth", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft^2^", + "legal_range": "x > 0", + "default": "wnHeight \\\* wnWidth", + "required": "No", + "variability": "constant" + }) +}} where the column headers have the following meaning: -<%= csv_table_from_file("input-data--member-table-definition.csv", row_header: false) %> +{{ csv_table("**Units**,units of measure (lb., ft, Btu, etc.) where applicable +**Legal Range**,limits of valid range for numeric inputs; valid choices for *choice* members, etc. +**Default**,value assumed if member not given; applicable only if not required +**Required**,YES if you must give this member +**Variability**,how often the given expression can change: hourly, daily, etc. See sections on [expressions][expressions-overview], [statements][member-statements], and [variation frequencies][variation-frequencies-revisited]") +}} diff --git a/doc/src/records/izxfer.md b/doc/src/docs/input-data/izxfer.md similarity index 59% rename from doc/src/records/izxfer.md rename to doc/src/docs/input-data/izxfer.md index 8671e867c..27dccb4ae 100644 --- a/doc/src/records/izxfer.md +++ b/doc/src/docs/input-data/izxfer.md @@ -7,23 +7,28 @@ The AIRNET types are used in a multi-cell pressure balancing model that finds zo Note that fan-driven types assume pressure-independent flow. That is, the specified flow is included in the zone pressure balance but the modeled fan flow does not change with zone pressure. The assumption is that in realistic configurations, zone pressure will generally be close to ambient pressure. Unbalanced fan ventilation in a zone without relief area will result in runtime termination due to excessively high or low pressure. -**izName** +### izName Optional name of interzone transfer; give after the word "IZXFER" if desired. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**izNVType=*choice*** +### izNVType + +Type: choice Choice specifying the type of ventilation or leakage model to be used. -<%= csv_table(< false) - NONE, No interzone ventilation +{{ + csv_table("NONE, No interzone ventilation ONEWAY, Uncontrolled flow from izZn1 to izZn2 when izZn1 air temperature exceeds izZn2 air temperature (using ASHRAE high/low vent model). TWOWAY, Uncontrolled flow in either direction (using ASHRAE high/low vent model). AIRNETIZ, Single opening to another zone (using pressure balance AirNet model). Flow is driven by buoyancy. @@ -34,27 +39,31 @@ Choice specifying the type of ventilation or leakage model to be used. AIRNETEXTFLOW, Specified flow from exterior to zone (either direction). Behaves identically to AIRNETEXTFAN except no electricity is consumed and no fan heat is added to the air stream. AIRNETIZFLOW, Specified flow between two zones (either direction). Behaves identically to AIRNETIZFAN except no electricity is consumed and no fan heat is added to the air stream. AIRNETHERV, Heat or energy recovery ventilator. Supply and exhaust air are exchanged with the exterior with heat and/or moisture exchange between the air streams. Flow may or may not be balanced. - AIRNETDOAS, Air supplied from and/or exhausted to a centralized DOAS fans. -END -%> + AIRNETDOAS, Air supplied from and/or exhausted to a centralized DOAS fans.") +}} Note that optional inputs izTEx, izWEx, and izWindSpeed can override the outside conditions assumed for ivNVTypes that are connected to ambient (AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, and AIRNETHERV). -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### izAFCat -**izAFCat=*choice*** +Type: choice Choice indicating air flow category used *only* for recording air flow results to an AFMETER. izAFCat has no effect for non-AIRNET IZXFERs. izAFCat is not used unless the associated ZONE(s) specify znAFMtr. Choices are: -<%= csv_table(< false) - InfilEx, Infiltration from ambient +{{ + csv_table("InfilEx, Infiltration from ambient VentEx, Natural ventilation from ambient FanEx, Forced ventilation from ambient InfilUz, Unconditioned Interzone infiltration @@ -64,51 +73,70 @@ Choices are: VentCz, Conditioned Interzone natural ventilation FanCz, Conditioned Interzone forced ventilation DuctLk, Duct leakage - HVAC, HVAC air -END -%> + HVAC, HVAC air") +}} Default values for izAFCat are generally adequate *except* that natural ventilation IZXFERs are by default categorized as infiltration. It is thus recommended that izAfCat be omitted except that ventilation IZXFERs (e.g. representing openable windows) should include izAfCat=VentEx (or VentIz). -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "derived from IZXFER characteristics", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "derived from IZXFER characteristics", + "required": "No", + "variability": "constant" + }) +}} + +### izZn1 -**izZn1=*znName*** +Type: znName Name of primary zone. Flow rates $>$ 0 are into the primary zone. -<%= member_table( - units: "", - legal_range: "name of a ZONE", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a ZONE", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**izZn2=*znName*** +### izZn2 + +Type: znName Name of secondary zone. -<%= member_table( - units: "", - legal_range: "name of a ZONE", - default: "*none*", - required: "required unless constant izNVType = AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, or AIRNETHERV", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a ZONE", + "default": "*none*", + "required": "required unless constant izNVType = AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, or AIRNETHERV", + "variability": "constant" + }) +}} + +### izDOAS -**izDOAS=*oaName*** +Type: oaName Name of DOAS where air is supplied from (**izVfMin** > 0), or exhausting to (**izVfMin** < 0). -<%= member_table( - legal_range: "name of a DOAS", - required: "when izNVType = AIRNETDOAS", - variability: "constant") %> +{{ + member_table({ + "legal_range": "name of a DOAS", + "required": "when izNVType = AIRNETDOAS", + "variability": "constant" + }) +}} -**izLinkedFlowMult=*float*** +### izLinkedFlowMult + +Type: float Specifies a multiplier applied to air flow to/from any associated DOAS. This supports use of a single modeled zone to represent multiple actual zones while preserving the total DOAS air flow and energy consumption. @@ -116,50 +144,70 @@ For example, consider a DOAS-linked IZXFER with izVfMin = 100 and izLinkedFlowMu Note izLinkedFlowMult has no effect on the air flow to or from the zone specified by izZn1. -<%= member_table( - units: "--", - legal_range: "*x* $\\gt$ 0", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "--", + "legal_range": "*x* $\\gt$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} Give izHConst for a conductive transfer between zones. Give izNVType other than NONE and the following variables for a convective (air) transfer between the zones or between a zone and outdoors. Both may be given if desired. Not known to work properly as of July 2011 -**izHConst=*float*** +### izHConst + +Type: float Conductance between zones. -<%= member_table( - units: "Btu/^o^F", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "Btu/^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} -**izALo=*float*** +### izALo + +Type: float Area of low or only vent (typically VentOff) -<%= member_table( - units: "ft^2^", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "ft^2^", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} + +### izAHi -**izAHi=*float*** +Type: float Additional vent area (high vent or VentOn). If used in AIRNET, izAHi > izALo typically but this is not required. -<%= member_table( - units: "ft^2^", - legal_range: "*x* $\\ge$ 0", - default: "izALo", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "ft^2^", + "legal_range": "*x* $\\ge$ 0", + "default": "izALo", + "required": "No", + "variability": "hourly" + }) +}} -**izTEx=*float*** +### izTEx + +Type: float Alternative exterior air dry bulb temperature for this vent. Allowed only with izNVTypes that use outdoor air (AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, and AIRNETHERV). If given, izTEx overrides the outdoor dry-bulb temperature read from the weather file or derived from design conditions. @@ -171,14 +219,19 @@ One use of izTEx is in representation of leaks in surfaces adjacent to zones not This will allow Z1's pressure to be realistic without inducing thermal loads that would occur if the leak source had outdoor conditions. -<%= member_table( - units: "^o^F", - legal_range: "", - default: "Outdoor dry-bulb", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "Outdoor dry-bulb", + "required": "No", + "variability": "subhourly" + }) +}} + +### izWEx -**izWEx=*float*** +Type: float Alternative exterior air humidity ratio seen by this vent. Allowed only with izNVTypes that use outdoor air (AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, and AIRNETHERV). If given, izWEx overrides the outdoor humidity ratio derived from weather file data or design conditions. @@ -186,14 +239,19 @@ Caution: izWEx is not checked against saturation -- there is no verification tha See izTEx example just above. -<%= member_table( - units: "", - legal_range: "$\\gt$ 0", - default: "Outdoor humidity ratio", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "$\\gt$ 0", + "default": "Outdoor humidity ratio", + "required": "No", + "variability": "subhourly" + }) +}} + +### izWindSpeed -**izWindSpeed=*float*** +Type: float Alternative windspeed seen by this vent. Allowed only with izNVTypes that use outdoor air (AIRNETEXT, AIRNETEXTFAN, AIRNETEXTFLOW, and AIRNETHERV). If given, izWindSpeed overrides the windspeed read from the weather file or derived from design conditions. @@ -201,248 +259,358 @@ No adjustments such as TOP windF or ZONE znWindFLkg are applied to izWindSpeed w Note that izCpr must be non-0 for izWindSpeed to have any effect. -<%= member_table( - units: "mph", - legal_range: "$\\ge$ 0", - default: "Zone adjusted windspeed", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "mph", + "legal_range": "$\\ge$ 0", + "default": "Zone adjusted windspeed", + "required": "No", + "variability": "subhourly" + }) +}} -**izL1=*float*** +### izL1 + +Type: float Length or width of AIRNETHORIZ opening. -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "if izNVType = AIRNETHORIZ", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "if izNVType = AIRNETHORIZ", + "variability": "constant" + }) +}} + +### izL2 -**izL2=*float*** +Type: float Width or length of AIRNETHORIZ opening. -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "if izNVType = AIRNETHORIZ", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "if izNVType = AIRNETHORIZ", + "variability": "constant" + }) +}} -**izStairAngle=*float*** +### izStairAngle + +Type: float Stairway angle for AIRNETHORIZ opening. Use 90 for an open hole. Note that 0 prevents flow. -<%= member_table( - units: "^o^ degrees", - legal_range: "*x* $>$ 0", - default: "34", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^ degrees", + "legal_range": "*x* $>$ 0", + "default": "34", + "required": "No", + "variability": "constant" + }) +}} + +### izHD -**izHD=*float*** +Type: float Vent center-to-center height difference (for TWOWAY) or vent height above nominal 0 level (for AirNet types) -<%= member_table( - units: "ft", - legal_range: "", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} -**izNVEff=*float*** +### izNVEff + +Type: float Vent discharge coefficient. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.8", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.8", + "required": "No", + "variability": "constant" + }) +}} + +### izfanVfDs -**izfanVfDs=*float*** +Type: float Fan design or rated flow at rated pressure. For AIRNETHERV, this is the net air flow into the zone, gross flow at the fan is derived using izEATR (see below). -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "0 (no fan)", - required: "If fan present", - variability: "constant") %> +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "0 (no fan)", + "required": "If fan present", + "variability": "constant" + }) +}} -**izCpr=*float*** +### izCpr + +Type: float Wind pressure coefficient (for AIRNETEXT). -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### izExp -**izExp=*float*** +Type: float Opening exponent (for AIRNETEXT). -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "0.5", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "0.5", + "required": "No", + "variability": "constant" + }) +}} + +### izVfMin -**izVfMin=*float*** +Type: float Minimum volume flow rate (VentOff mode). -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "izfanVfDs", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "izfanVfDs", + "required": "No", + "variability": "subhourly" + }) +}} -**izVfMax=*float*** +### izVfMax + +Type: float Maximum volume flow rate (VentOn mode) -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "izVfMin", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "izVfMin", + "required": "No", + "variability": "subhourly" + }) +}} + +### izASEF -**izASEF=*float*** +Type: float Apparent sensible effectiveness for AIRNETHERV ventilator. ASEF is a commonly-reported HERV rating and is calculated as (supplyT - sourceT) / (returnT - sourceT). This formulation includes fan heat (in supplyT), hence the term "apparent". Ignored if izSRE is given. CSE does not HRV exhaust-side condensation, so this model is approximate. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} -**izSRE=*float*** +### izSRE + +Type: float Sensible recovery efficiency (SRE) for AIRNETHERV ventilator. Used as the sensible effectiveness in calculation of the supply air temperature. Note that values of SRE greater than approximately 0.6 imply exhaust-side condensation under HVI rating conditions. CSE does not adjust for these effects. High values of izSRE will produce unrealistic results under mild outdoor conditions and/or dry indoor conditions. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} + +### izASRE -**izASRE=*float*** +Type: float Adjusted sensible recovery efficiency (ASRE) for AIRNETHERV ventilator. The difference izASRE - izSRE is used to calculate fan heat added to the supply air stream. See izSRE notes. No effect when izSRE is 0. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ izSRE", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ izSRE", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} -**izEATR=*float*** +### izEATR + +Type: float Exhaust air transfer ratio for AIRNETHERV ventilator. NetFlow = (1 - EATR)*(grossFlow). -<%= member_table( - units: "cfm", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "cfm", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} + +### izLEF -**izLEF=*float*** +Type: float Latent heat recovery effectiveness for AIRNETHERV ventilator. The default value (0) results in sensible-only heat recovery. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} -**izRVFanHeatF=*float*** +### izRVFanHeatF + +Type: float Fraction of fan heat added to supply air stream for AIRNETHERV ventilator. Used only when when izSRE is 0 (that is, when izASEF specifies the sensible effectiveness). -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} + +### izVfExhRat -**izVfExhRat=*float*** +Type: float Exhaust volume flow ratio for AIRNETHERV ventilator = (exhaust flow) / (supply flow). Any value other than 1 indicates unbalanced flow that effects the zone pressure. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1 (balanced)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "1 (balanced)", + "required": "No", + "variability": "constant" + }) +}} + +### izfanPress -**izfanPress=*float*** +Type: float Design or rated fan pressure. -<%= member_table( - units: "inches H~2~O", - legal_range: "*x* $>$ 0", - default: "0.3", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "inches H~2~O", + "legal_range": "*x* $>$ 0", + "default": "0.3", + "required": "No", + "variability": "constant" + }) +}} Only one of izfanElecPwr, izfanEff, and izfanShaftBhp may be given: together with izfanVfDs and izfanPress, any one is sufficient for CSE to determine the others and to compute the fan heat contribution to the air stream. -**izfanElecPwr=*float*** +### izfanElecPwr + +Type: float Fan input power per unit air flow (at design flow and pressure). -<%= member_table( - units: "W/cfm", - legal_range: "*x* $>$ 0", - default: "derived from izfanEff and izfanShaftBhp", - required: "If izfanEff and izfanShaftBhp not present", - variability: "constant") %> +{{ + member_table({ + "units": "W/cfm", + "legal_range": "*x* $>$ 0", + "default": "derived from izfanEff and izfanShaftBhp", + "required": "If izfanEff and izfanShaftBhp not present", + "variability": "constant" + }) +}} + +### izfanEff -**izfanEff=*float*** +Type: float Fan efficiency at design flow and pressure, as a fraction. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "derived from *izfanShaftBhp* if given, else 0.08", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "derived from *izfanShaftBhp* if given, else 0.08", + "required": "No", + "variability": "constant" + }) +}} -**izfanShaftBhp=*float*** +### izfanShaftBhp + +Type: float Fan shaft brake horsepower at design flow and pressure. -<%= member_table( - units: "bhp", - legal_range: "*x* $>$ 0", - default: "derived from *izfanEff*.", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "bhp", + "legal_range": "*x* $>$ 0", + "default": "derived from *izfanEff*.", + "required": "No", + "variability": "constant" + }) +}} + +### izfanCurvePy -**izfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** +Type: $k_0$, $k_1$, $k_2$, $k_3$, $x_0$ $k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: @@ -457,46 +625,62 @@ where: If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "*0, 1, 0, 0, 0 (linear)*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "*0, 1, 0, 0, 0 (linear)*", + "required": "No", + "variability": "constant" + }) +}} -**izFanMtr=*mtrName*** +### izFanMtr + +Type: mtrName Name of meter, if any, to record energy used by supply fan. End use category used is specified by izFanEndUse (next). -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of a METER*", + "default": "*not recorded*", + "required": "No", + "variability": "constant" + }) +}} + +### izFanEndUse -**izFanEndUse=*choice*** +Type: choice End use to which fan energy is recorded (in METER specified by izFanMtr). See METER for available end use choices. -<%= member_table( - units: "", - legal_range: "*end use choice*", - default: "Fan", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*end use choice*", + "default": "Fan", + "required": "No", + "variability": "constant" + }) +}} -**endIZXFER** +### endIZXFER Optionally indicates the end of the interzone transfer definition. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[izXfer](#p_izxfer) +- @[izXfer][p_izxfer] diff --git a/doc/src/records/layer.md b/doc/src/docs/input-data/layer.md similarity index 61% rename from doc/src/records/layer.md rename to doc/src/docs/input-data/layer.md index a88e22245..9bbd46db3 100644 --- a/doc/src/records/layer.md +++ b/doc/src/docs/input-data/layer.md @@ -6,65 +6,88 @@ The layers should be specified in inside to outside order. -**pvDCtoACRatio=*float*** +### pvDCtoACRatio + +Type: float DC-to-AC ratio used to intentionally undersize the AC inverter. This is used to increase energy production in the beginning and end of the day despite the possibility of clipping peak sun hours. -<%= member_table( - units: "", - legal_range: "*x* > 0.0", - default: "1.2", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "*x* > 0.0", + "default": "1.2", + "required": "No", + "variability": "constant" + }) +}} -**pvInverterEff=*float*** +### pvInverterEff + +Type: float AC inverter efficiency at rated DC power. -<%= member_table( - units: "", - legal_range: "0 $<$ *x* $<$ 1.0", - default: "0.96", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 $<$ *x* $<$ 1.0", + "default": "0.96", + "required": "No", + "variability": "constant" + }) +}} + +### pvSysLosses -**pvSysLosses=*float*** +Type: float Fraction of total DC energy lost. The total loss from a system is aggregated from several possible causes as illustrated below: -<%= csv_table(< true) - **Loss Type**, **Default Assumption** +{{ + csv_table("**Loss Type**, **Default Assumption** Soiling, 0.02 *Shading*, *0 (handled explicitly)* Snow, 0 @@ -257,32 +323,35 @@ Fraction of total DC energy lost. The total loss from a system is aggregated fro Nameplate rating, 0.01 *Age*, *0.05 (estimated 0.5% degradation over 20 years)* Availability, 0.03 - **Total**, **0.14** -END -%> + **Total**, **0.14**", True) +}} *Italic* lines indicate differences from PVWatts assumptions. -<%= member_table( - units: "", - legal_range: "0 $<$ *x* $<$ 1.0", - default: "0.14", - required: "No", - variability: "hourly") - %> +{{ + member_table({ + "units": "", + "legal_range": "0 $<$ *x* $<$ 1.0", + "default": "0.14", + "required": "No", + "variability": "hourly" + }) +}} -**endPVARRAY** +### endPVARRAY Optionally indicates the end of the PVARRAY definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[PVArray](#p_pvarray) +- @[PVArray][p_pvarray] diff --git a/doc/src/records/report.md b/doc/src/docs/input-data/report.md similarity index 67% rename from doc/src/records/report.md rename to doc/src/docs/input-data/report.md index a93209546..4abd569ce 100644 --- a/doc/src/records/report.md +++ b/doc/src/docs/input-data/report.md @@ -18,48 +18,57 @@ In addition to the headers and footers of individual reports, the report file ha **Default Reports:** CSE generates the following reports by default for each run, in the order shown. They are output by default to the "Primary" report file. They may be ALTERed or DELETEd as desired, using the object names shown. -<%= csv_table(< true) - rpName, rpType, Additional members +{{ + csv_table("rpName, rpType, Additional members Err, ERR eb, ZEB, rpFreq=MONTH; rpZone=SUM; Log, LOG - Inp, INP -END -%> + Inp, INP", True) +}} Any reports specified by the user and not assigned to another file appear in the Primary report file between the default reports "eb" and "Log", in the order in which the REPORT objects are given in the input file. Because of the many types of reports supported, the members required for each REPORT depend on the report type and frequency in a complex manner. When in doubt, testing is helpful: try your proposed REPORT specification; if it is incomplete or overspecified, CSE will issue specific error messages telling you what additional members are required or what inappropriate members have been given and why. -**rpName** +### rpName Name of report. Give after the word REPORT. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**rpReportfile=*rfname*** +### rpReportfile + +Type: rfname Name of report file to which current report will be written. If omitted, if REPORT is within a REPORTFILE object, report will be written to that report file, or else to REPORTFILE "Primary", which (as described in previous section) is automatically supplied and by default uses the file name of the input file with the extension .REP. -<%= member_table( - units: "", - legal_range: "name of a *REPORTFILE*", - default: "current *REPORTFILE*, if any, else Primary", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *REPORTFILE*", + "default": "current *REPORTFILE*, if any, else Primary", + "required": "No", + "variability": "constant" + }) +}} + +### rpType -**rpType=*choice*** +Type: choice Choice indicating report type. Report types may be described at greater length, with examples, in Section 6. -<%= csv_table(< false) - ERR, Error and warning messages. If there are any such messages, they are also displayed on the screen *AND* written to a file with the same name as the input file and extension .ERR. Furthermore, \* \*many error messages are repeated in the INP report. +{{ + csv_table("ERR, Error and warning messages. If there are any such messages, they are also displayed on the screen *AND* written to a file with the same name as the input file and extension .ERR. Furthermore, \* \*many error messages are repeated in the INP report. LOG, Run 'log'. As of July 1992, contains only CSE version number; should be enhanced or deleted.?? INP, Input echo: shows the portion of the input file used to specify this run. Does not repeat descriptions of objects left from prior runs in the same session when CLEAR is not used. Error and warning messages relating to specific lines of the input are repeated after or near the line to which they relate, prefixed with '?'. Lines not used due to a preprocessor \#if command (Section 4.4.4) with a false expression are prefixed with a '0' in the leftmost column; all preprocessor command lines are prefixed with a '\#' in that column. SUM, Run summary. As of July 1992, *NOT IMPLEMENTED*: generates no output and no error message. Should be defined and implemented, or else deleted??. @@ -69,32 +78,35 @@ Choice indicating report type. Report types may be described at greater length, MTR, Meter report. Requires *rpMeter*. DHWMTR, DHW meter report. Requires *rpDHWMeter* AFMTR, Air flow meter report. Requires *rpAFMeter* - UDT, User-defined table. Data items are specified with REPORTCOL commands (next section). Allows creating almost any desired report by using CSE expressions to specify numeric or string values to tabulate; 'Probes' may be used in the expressions to access CSE internal data. -END -%> - -<%= member_table( - units: "", - legal_range: "*see above*", - default: "*none*", - required: "Yes", - variability: "constant") %> + UDT, User-defined table. Data items are specified with REPORTCOL commands (next section). Allows creating almost any desired report by using CSE expressions to specify numeric or string values to tabulate; 'Probes' may be used in the expressions to access CSE internal data.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "*see above*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} The next three members specify how frequently values are reported and the start and end dates for the REPORT. They are not allowed with *rpTypes* ERR, LOG, INP, SUM, and ZDD, which involve no time-varying data. -**rpFreq=*choice*** +### rpFreq + +Type: choice Report Frequency: specifies interval for generating rows of report data: -<%= csv_table(< false) - YEAR, at run completion +{{ + csv_table("YEAR, at run completion MONTH, at end of each month (and at run completion if mid-month) DAY, at end of each day HOUR, at end of each hour HOURANDSUB, at end of each subhour and at end of hour - SUBHOUR, at end of each subhour -END -%> + SUBHOUR, at end of each subhour") +}} @@ -102,146 +114,211 @@ END We recommend using HOURly and more frequent reports sparingly, to report on only a few typical or extreme days, or to explore a problem once it is known what day(s) it occurs on. Specifying such reports for a full-year run will generate a huge amount of output and cause extremely slow CSE execution. -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "*none*", - required: "per rpType", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "*none*", + "required": "per rpType", + "variability": "constant" + }) +}} + +### rpDayBeg -**rpDayBeg=*date*** +Type: date Initial day of period to be reported. Reports for which *rpFreq* = YEAR do not allow specification of *rpDayBeg* and *rpDayEnd*; for MONTH reports, these members default to include all months in the run; for DAY and shorter-interval reports, *rpDayBeg* is required and *rpDayEnd* defaults to *rpDayBeg*. -<%= member_table( - units: "", - legal_range: "*date*", - default: "first day of simulation if *rpFreq* = MONTH", - required: "Required for *rpTypes* ZEB, ZST, MTR, AH, and UDT if *rpFreq* is DAY, HOUR, HOURANDSUB, or SUBHOUR", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "first day of simulation if *rpFreq* = MONTH", + "required": "Required for *rpTypes* ZEB, ZST, MTR, AH, and UDT if *rpFreq* is DAY, HOUR, HOURANDSUB, or SUBHOUR", + "variability": "constant" + }) +}} -**rpDayEnd=*date*** +### rpDayEnd + +Type: date Final day of period to be reported, except for YEAR reports. -<%= member_table( - units: "", - legal_range: "*date*", - default: "last day of simulation if *rpFreq*= MONTH, else *rpDayBeg*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "last day of simulation if *rpFreq*= MONTH, else *rpDayBeg*", + "required": "No", + "variability": "constant" + }) +}} + +### rpZone -**rpZone=*znName*** +Type: znName Name of ZONE for which a ZEB, ZST, or ZDD report is being requested. For *rpType* ZEB or ZST, you may use *rpZone*=SUM to obtain a report showing only the sum of the data for all zones, or *rpZone*=ALL to obtain a report showing, for each time interval, a row of data for each zone plus a sum-of-zones row. -<%= member_table( - units: "", - legal_range: "name of a *ZONE*, ALL, SUM", - default: "*none*", - required: "Required for *rpTypes* ZDD, ZEB, and ZST.", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *ZONE*, ALL, SUM", + "default": "*none*", + "required": "Required for *rpTypes* ZDD, ZEB, and ZST.", + "variability": "constant" + }) +}} -**rpMeter=*mtrName*** +### rpMeter + +Type: mtrName Specifies meter(s) to be reported, for *rpType*=MTR. -<%= member_table( - units: "", - legal_range: "name of a *METER*, ALL, SUM", - default: "*none*", - required: "Required for *rpType*=MTR", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *METER*, ALL, SUM", + "default": "*none*", + "required": "Required for *rpType*=MTR", + "variability": "constant" + }) +}} + +### rpDHWMeter -**rpDHWMeter=*dhwMtrName*** +Type: dhwMtrName Specifies DHW meter(s) to be reported, for *rpType*=DHWMTR. -<%= member_table( - units: "", - legal_range: "name of a *DHWMETER*, ALL, SUM", - default: "*none*", - required: "Required for *rpType*=DHWMTR", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *DHWMETER*, ALL, SUM", + "default": "*none*", + "required": "Required for *rpType*=DHWMTR", + "variability": "constant" + }) +}} -**rpAFMeter=*afMtrName*** +### rpAFMeter + +Type: afMtrName Specifies air flow meter(s) to be reported, for *rpType*=AFMTR. -<%= member_table( - units: "", - legal_range: "name of a *DHWMETER*, ALL, SUM", - default: "*none*", - required: "Required for *rpType*=AFMTR", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *DHWMETER*, ALL, SUM", + "default": "*none*", + "required": "Required for *rpType*=AFMTR", + "variability": "constant" + }) +}} + +### rpAh -**rpAh=*ahName*** +Type: ahName Specifies air handler(s) to be reported, for *rpType*=AH, AHSIZE, or AHLOAD. -<%= member_table( - units: "", - legal_range: "name of an *AIRHANDLER*, ALL, SUM", - default: "*none*", - required: "Required for *rpType*=AH, AHSIZE, or AHLOAD", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of an *AIRHANDLER*, ALL, SUM", + "default": "*none*", + "required": "Required for *rpType*=AH, AHSIZE, or AHLOAD", + "variability": "constant" + }) +}} + +### rpTu -**rpTu=*tuName*** +Type: tuName Specifies air handler(s) to be reported, for *rpType*=TUSIZE or TULOAD. -<%= member_table( - units: "", - legal_range: "name of a TERMINAL, ALL, SUM", - default: "*none*", - required: "Required for *rpType*", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a TERMINAL, ALL, SUM", + "default": "*none*", + "required": "Required for *rpType*", + "variability": "constant" + }) +}} -**rpBtuSf=*float*** +### rpBtuSf + +Type: float Scale factor to be used when reporting energy values. Internally, all energy values are represented in Btu. This member allows scaling to more convenient units for output. *rpBtuSf* is not shown in the output, so if you change it, be sure the readers of the report know the energy units being used. *rpBtuSf* is not applied in UDT reports, but column values can be scaled as needed with expressions. -<%= member_table( - units: "", - legal_range: "*any multiple of ten*", - default: "1,000,000: energy reported in MBtu.", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*any multiple of ten*", + "default": "1,000,000: energy reported in MBtu.", + "required": "No", + "variability": "constant" + }) +}} + +### rpCond -**rpCond=*expression*** +Type: expression Conditional reporting flag. If given, report rows are printed only when value of expression is non-0. Permits selective reporting according to any condition that can be expressed as a CSE expression. Such conditional reporting can be used to shorten output and make it easy to find data of interest when you are only interested in the information under exceptional conditions, such as excessive zone temperature. Allowed with *rpTypes* ZEB, ZST, MTR, AH, and UDT. -<%= member_table( - units: "", - legal_range: "*any numeric expression*", - default: "1 (reporting enabled)", - required: "No", - variability: "subhour end of interval") %> +{{ + member_table({ + "units": "", + "legal_range": "*any numeric expression*", + "default": "1 (reporting enabled)", + "required": "No", + "variability": "subhour end of interval" + }) +}} -**rpCPL=*int*** +### rpCPL + +Type: int Characters per line for a UDT (user-defined report). If widths specified in REPORTCOLs add up to more than this, a message occurs; if they total substantially less, additional whitespace is inserted between columns to make the report more readable. If rpCPL = -1, the report width determined based on required space with a single space between columns. rpCPL=0 uses the Top level *repCPL*. rpCPL is not allowed if *rpType* is not UDT. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ -1", - default: "-1 (as wide as needed)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ -1", + "default": "-1 (as wide as needed)", + "required": "No", + "variability": "constant" + }) +}} + +### rpTitle -**rpTitle=*string*** +Type: string Title for use in report header of User-Defined report. Disallowed if *rpType* is not UDT. -<%= member_table( - units: "", - legal_range: "", - default: "User-defined Report", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "User-defined Report", + "required": "No", + "variability": "constant" + }) +}} -**rpHeader=*choice*** +### rpHeader + +Type: choice Use NO to suppress the report header which gives the report type, zone, meter, or air handler being reported, time interval, column headings, etc. One reason to do this might be if you are putting only a single report in a report file and intend to later embed the report in a document or process it with some other program (but for the latter, see also EXPORT, below). @@ -249,35 +326,46 @@ Use with caution, as the header contains much of the identification of the data. See REPORTFILE member *rfPageFmt*, above, to control report *FILE* page headers and footers, as opposed to *REPORT* headers and footers. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} + +### rpFooter -**rpFooter=*choice*** +Type: choice Use NO to suppress the report footers. The report footer is usually a row which sums hourly data for the day, daily data for the month, or monthly data for the year. For a report with *rpZone, rpMeter,*or *rpAh* = ALL, the footer row shows sums for all zones, meters, or air handlers. Sometimes the footer is merely a blank line. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} -**endReport** +### endReport Optionally indicates the end of the report definition. Alternatively, the end of the report definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[report](#p_report) +- @[report][p_report] diff --git a/doc/src/docs/input-data/reportcol.md b/doc/src/docs/input-data/reportcol.md new file mode 100644 index 000000000..ee179a0fc --- /dev/null +++ b/doc/src/docs/input-data/reportcol.md @@ -0,0 +1,144 @@ +# REPORTCOL + +Each REPORTCOL defines a single column of a User Defined Table (UDT) report. REPORTCOLs are not used with report types other than UDT. + +Use as many REPORTCOLs as there are values to be shown in each row of the user-defined report. The values will appear in columns, ordered from left to right in the order defined. Be sure to include any necessary values to identify the row, such as the day of month, hour of day, etc. CSE supplies *NO* columns automatically. + +### colName + +Name of REPORTCOL. + +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### colReport + +Type: rpName + +Name of report to which current report column belongs. If REPORTCOL is given within a REPORT object, then *colReport* defaults to that report. + +{{ + member_table({ + "units": "", + "legal_range": "name of a *REPORT*", + "default": "*current report, if any*", + "required": "Unless in a *REPORT*", + "variability": "constant" + }) +}} + +### colVal + +Type: expression + +Value to show in this column of report. + +{{ + member_table({ + "units": "", + "legal_range": "*any numeric or string expression*", + "default": "*none*", + "required": "Yes", + "variability": "subhour /end interval" + }) +}} + +### colHead + +Type: string + +Text used for column head. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*colName* or blank", + "required": "No", + "variability": "constant" + }) +}} + +### colGap + +Type: int + +Space between (to left of) column, in character positions. Allows you to space columns unequally, to emphasize relations among columns or to improve readability. If the total of the *colGaps* and *colWids* in the report's REPORTCOLs is substantially less than the REPORT's *rpCPL* (characters per line, see REPORT), CSE will insert additional spaces between columns. To suppress these spaces, use a smaller *rpCPL* or use *rpCPL* = -1. + +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### colWid + +Type: int + +Column width. + +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "10", + "required": "No", + "variability": "constant" + }) +}} + +### colDec + +Type: int + +Number of digits after decimal point. + +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "*flexible format*", + "required": "No", + "variability": "constant" + }) +}} + +### colJust + +Type: choice + +Specifies positioning of data within column: + +{{ + csv_table("Left, Left justified + Right, Right justified") +}} + +### endReportCol + +Optionally indicates the end of the report column definition. Alternatively, the end of the report column definition can be indicated by END or by beginning another REPORTCOL or other object. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[reportCol][p_reportcol] diff --git a/doc/src/records/reportfile.md b/doc/src/docs/input-data/reportfile.md similarity index 79% rename from doc/src/records/reportfile.md rename to doc/src/docs/input-data/reportfile.md index 4ff36f530..48e5362b8 100644 --- a/doc/src/records/reportfile.md +++ b/doc/src/docs/input-data/reportfile.md @@ -20,64 +20,80 @@ Using ALTER (Section 4.5.1.2) with REPORTFILE, you can change the characteristic rfPageFmt = NO; // do not format into pages rfFileStat = NEW; // error if file exists -**rfName** +### rfName Name of REPORTFILE object, given immediately after the word REPORTFILE. Note that this name, not the fileName of the report file, is used to refer to the REPORTFILE in REPORTs. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**rfFileName=*path*** +### rfFileName + +Type: path path name of file to be written. If no path is specified, the file is written in the current directory. The default extension is .REP. -<%= member_table( - units: "", - legal_range: "file name, path and extension optional", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "file name, path and extension optional", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### rfFileStat -**rfFileStat=*choice*** +Type: choice Choice indicating what CSE should do if the file specified by *rfFileName*already exists: -<%= csv_table(< false) - OVERWRITE, Overwrite pre-existing file. +{{ + csv_table("OVERWRITE, Overwrite pre-existing file. NEW, Issue error message if file exists at beginning of session. If there are several runs in session using same file, output from runs after the first will append. - APPEND, Append new output to present contents of existing file. -END -%> + APPEND, Append new output to present contents of existing file.") +}} If the specified file does not exist, it is created and *rfFileStat* has no effect. -<%= member_table( - units: "", - legal_range: "OVERWRITE, NEW, APPEND", - default: "OVERWRITE", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "OVERWRITE, NEW, APPEND", + "default": "OVERWRITE", + "required": "No", + "variability": "constant" + }) +}} -**rfPageFmt=*Choice*** +### rfPageFmt -Choice controlling page formatting. Page formatting consists of dividing the output into pages (with form feed characters), starting a new page before each report too long to fit on the current page, and putting headers and footers on each page. Page formatting makes attractive printed output but is a distraction when examining the output on the screen and may inappropriate if you are going to further process the output with another program. +Type: Choice -<%= csv_table(< false) - Yes, Do page formatting in this report file. - No, Suppress page formatting. Output is continuous, uninterrupted by page headers and footers or large blank spaces. -END -%> +Choice controlling page formatting. Page formatting consists of dividing the output into pages (with form feed characters), starting a new page before each report too long to fit on the current page, and putting headers and footers on each page. Page formatting makes attractive printed output but is a distraction when examining the output on the screen and may inappropriate if you are going to further process the output with another program. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "No", - required: "No", - variability: "constant") %> +{{ + csv_table("Yes, Do page formatting in this report file. + No, Suppress page formatting. Output is continuous, uninterrupted by page headers and footers or large blank spaces.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "No", + "required": "No", + "variability": "constant" + }) +}} Unless page formatting is suppressed, the page formats for all report files are controlled by the TOP members *repHdrL, repHdrR, repLPP, repTopM, repBotM,*and *repCPL*, described in Section 5.1. @@ -89,17 +105,20 @@ Vertical page layout is controlled by *repLPP, repTopM,* and *repBotM* (Section In addition to report file *page* headers and footers, individual REPORTs have *REPORT* headers and footers related to the report content. These are described under REPORT, Section 5.25. -**endReportFile** +### endReportFile Optionally indicates the end of the report file definition. Alternatively, the end of the report file definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[reportFile](#p_reportfile) +- @[reportFile][p_reportfile] diff --git a/doc/src/records/rsys.md b/doc/src/docs/input-data/rsys.md similarity index 53% rename from doc/src/records/rsys.md rename to doc/src/docs/input-data/rsys.md index e409d59a6..12bb3dc1a 100644 --- a/doc/src/records/rsys.md +++ b/doc/src/docs/input-data/rsys.md @@ -2,23 +2,28 @@ RSYS constructs an object representing an air-based residential HVAC system. -**rsName** +### rsName Optional name of HVAC system; give after the word “RSYS” if desired. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**rsType=*choice*** +### rsType + +Type: choice Type of system. -<%= csv_table(< true) -rsType, Description +{{ + csv_table("rsType, Description ACFURNACE, Compressor-based cooling modeled per SEER and EER. Fuel-fired heating. Primary heating input energy is accumulated to end use HTG of meter rsFuelMtr. ACPMFURNACE, Compressor-based cooling modeled per PERFORMANCEMAP specified in rsPerfMapClg. Fuel-fired heating. Primary heating input energy is accumulated to end use HTG of meter rsFuelMtr. ACRESISTANCE, Compressor-based cooling and electric ('strip') heating. Cooling performance based on SEER and EER. Primary heating input energy is accumulated to end use HTG of meter rsElecMtr. @@ -38,115 +43,152 @@ ACPKGROOMRESISTANCE, Packaged room cooling and electric resistance heating. COMBINEDHEATDHW, Combined heating / DHW. Use rsCHDHWSYS to specify the DHWSYS that provides hot water to the coil in this RSYS. No cooling. ACCOMBINEDHEATDHW, Compressor-based cooling; COMBINEDHEATDHW heating. ACPMCOMBINEDHEATDHW, Compressor-based cooling modeled per PERFORMANCEMAP specified in rsPerfMapClg; COMBINEDHEATDHW heating. -FANCOIL, Coil-based heating and cooling. No primary (fuel-using) equipment is modeled. rsLoadMtr, rsHtgLoadMtr, and rsClgLoadMtr are typically used to record loads for linking to an external model. -END -%> +FANCOIL, Coil-based heating and cooling. No primary (fuel-using) equipment is modeled. rsLoadMtr, rsHtgLoadMtr, and rsClgLoadMtr are typically used to record loads for linking to an external model.", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "*one of above choices*", + "default": "ACFURNACE", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "*one of above choices*", - default: "ACFURNACE", - required: "No", - variability: "constant") %> +### rsDesc -**rsDesc=*string*** +Type: string Text description of system, included as documentation in debugging reports such as those triggered by rsGeneratePerfMap=YES -<%= member_table( - units: "", - legal_range: "string", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "string", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### rsModeCtrl -**rsModeCtrl=*choice*** +Type: choice Specifies systems heating/cooling availability during simulation. -<%= csv_table(< false) - OFF, System is off (neither heating nor cooling is available) +{{ + csv_table("OFF, System is off (neither heating nor cooling is available) HEAT, System can heat (assuming rsType can heat) COOL, System can cool (assuming rsType can cool) - AUTO, System can either heat or cool (assuming rsType compatibility). First request by any zone served by this RSYS determines mode for the current time step. -END -%> + AUTO, System can either heat or cool (assuming rsType compatibility). First request by any zone served by this RSYS determines mode for the current time step.") +}} -<%= member_table( - units: "", - legal_range: "OFF, HEAT, COOL, AUTO", - default: "AUTO", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "OFF, HEAT, COOL, AUTO", + "default": "AUTO", + "required": "No", + "variability": "hourly" + }) +}} -**rsGeneratePerfMap=*choice*** +### rsGeneratePerfMap + +Type: choice Generate performance map(s) for this RSYS. Comma-separated text is written to file PM\_[rsName].csv. This is a debugging capability that is not necessarily maintained. The format of the generated csv text file may change and is unrelated to the PERFORMANCEMAP input scheme used via *rsPerfMapHtg* and *rsPerfMapClg*. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "NO", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "NO", + "required": "No", + "variability": "constant" + }) +}} + +### rsFanTy -**rsFanTy=*choice*** +Type: choice Specifies fan (blower) position relative to primary heating or cooling source (i.e. heat exchanger or heat pump coil for heating and AC coil for cooling). The blower position determines where fan heat is added to the RSYS air stream and thus influences the coil entering air temperature. -<%= member_table( - units: "", - legal_range: "BLOWTHRU, DRAWTHRU", - default: "BLOWTHRU", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "BLOWTHRU, DRAWTHRU", + "default": "BLOWTHRU", + "required": "No", + "variability": "constant" + }) +}} -**rsFanMotTy=*choice*** +### rsFanMotTy + +Type: choice Specifies type of motor driving the fan (blower). This is used in the derivation of the coil-only cooling capacity for the RSYS. -<%= csv_table(< false) - PSC, Permanent split capacitor - BPM, Brushless permanent magnet (aka ECM) -END -%> +{{ + csv_table("PSC, Permanent split capacitor + BPM, Brushless permanent magnet (aka ECM)") +}} + +{{ + member_table({ + "units": "", + "legal_range": "PSC, BPM", + "default": "PSC", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "PSC, BPM", - default: "PSC", - required: "No", - variability: "constant") %> +### rsAdjForFanHt -**rsAdjForFanHt=*choice*** +Type: choice Fan heat adjustment with two options Yes or no. Yes: fanHtRtd derived from rsFanTy and removed from capacity and input values. No: no rated fan heat adjustments. -**rsElecMtr=*mtrName*** +### rsElecMtr + +Type: mtrName Name of METER object, if any, by which system’s electrical energy use is recorded (under appropriate end uses). -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of a METER*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### rsFuelMtr -**rsFuelMtr =*mtrName*** +Type: *mtrName* Name of METER object, if any, by which system’s fuel energy use is recorded (under appropriate end uses). -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of a METER*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**rsLoadMtr =*ldMtrName***\ -**rsHtgLoadMtr =*ldMtrName***\ -**rsClgLoadMtr =*ldMtrName*** +### rsLoadMtr, rsHtgLoadMtr, rsClgLoadMtr + +Type: *ldMtrName* Names of LOADMETER objects, if any, to which the system’s heating and/or cooling loads are recorded. Loads are the gross heating and cooling energy added to (or removed from) the air stream. Fan heat, auxiliary heat, and duct losses are not included in loads values. @@ -154,16 +196,19 @@ rsLoadMtr accumulates both heating (> 0) and cooling (< 0) loads. rsHtgLoadMtr a rsLoadMtr should not specify the same LOADMETER as rsHtgLoadMtr or rsClgLoadMtr since this would result in double counting. -<%= member_table( - units: "", - legal_range: "*name of a LOADMETER*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of a LOADMETER*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### rsSrcSideLoadMtr, rsHtgSrcSideLoadMtr, rsClgSrcSideLoadMtr -**rsSrcSideLoadMtr=*ldMtrName***\ -**rsHtgSrcSideLoadMtr =*ldMtrName***\ -**rsClgSrcSideLoadMtr =*ldMtrName*** +Type: *ldMtrName* Name of LOADMETER objects, if any, to which the system’s source-side heat transfers are recorded. For DX systems, this is the outdoor coil heat transfer. For other types, source-side values are the same as the indoor coil loads reported via rsLoadMtr. @@ -171,360 +216,507 @@ rsSrcSideLoadMtr accumulates both heating (> 0) and cooling (< 0) transfers. rsH rsSrcSideLoadMtr should not specify the same LOADMETER as rsHtgSrcSideLoadMtr or rsClgSrcSideLoadMtr since this would result in double counting. -<%= member_table( - units: "", - legal_range: "*Name of a LOADMETER*", - default: "", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*Name of a LOADMETER*", + "default": "", + "required": "No", + "variability": "constant" + }) +}} -**rsCHDHWSYS=*dhwsysName*** +### rsCHDHWSYS + +Type: dhwsysName DHWSYS hot water source for this RSYS, required when rsType is COMBINEDHEATDHW or ACCOMBINEDHEATDHW. The specified DHWSYS must include a DHWHEATER of whType=ASHPX or RESISTANCEX. -<%= member_table( - units: "", - legal_range: "Name of a DHWSYS", - default: "*none*", - required: "if combined heat/DHW", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "Name of a DHWSYS", + "default": "*none*", + "required": "if combined heat/DHW", + "variability": "constant" + }) +}} + +### rsAFUE -**rsAFUE=*float*** +Type: float Heating Annual Fuel Utilization Efficiency (AFUE). -<%= member_table( - units: "", - legal_range: "0 $<$ x $\\le$ 1", - default: "0.9 if furnace, 1.0 if resistance", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $<$ x $\\le$ 1", + "default": "0.9 if furnace, 1.0 if resistance", + "required": "No", + "variability": "constant" + }) +}} -**rsCapH=*float*** +### rsCapH + +Type: float Heating capacity, used when rsType is ACFURNACE, ACRESISTANCE, FURNACE, WSHP or RESISTANCE. If rsType=WSHP, rsCapH is at source fluid temperature = 68 ^o^F. -<%= member_table( - units: "Btu/hr", - legal_range: "*AUTOSIZE* or x $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "*AUTOSIZE* or x $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### rsTdDesH -**rsTdDesH=*float*** +Type: float Nominal heating temperature rise (across system, not at zone) used during autosizing (when capacity is not yet known) and to derive heating air flow rate from heating capacity. -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "30 ^o^F if heat pump else 50 ^o^F", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $>$ 0", + "default": "30 ^o^F if heat pump else 50 ^o^F", + "required": "No", + "variability": "constant" + }) +}} -**rsFxCapH=*float*** +### rsFxCapH + +Type: float Heating autosizing capacity factor. If AUTOSIZEd, rsCapH or rsCap47 is set to rsFxCapH $\times$ (peak design-day load). Peak design-day load is the heating capacity that holds zone temperature at the thermostat set point during the *last substep* of all hours of all design days. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1.4", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1.4", + "required": "No", + "variability": "constant" + }) +}} + +### rsFanPwrH -**rsFanPwrH=*float*** +Type: float Heating operating fan power. For most rsTypes, heating air flow is calculated from heating capacity and rsTdDesH. The default value of rsFanPwrH is .365 W/cfm except 0.273 W/cfm is used when rsType=COMBINEDHEATDHW and rsType=ACCOMBINEDHEATDHW. -<%= member_table( - units: "W/cfm", - legal_range: "*x* $\\ge$ 0", - default: "see above", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "W/cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "see above", + "required": "No", + "variability": "constant" + }) +}} -**rsHSPF=*float*** +### rsHSPF + +Type: float For rsType=ASHP, Heating Seasonal Performance Factor (HSPF). -<%= member_table( - units: "Btu/Wh", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes if rsType=ASHP", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "Yes if rsType=ASHP", + "variability": "constant" + }) +}} + +### rsCap47 -**rsCap47=*float*** +Type: float For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 47 ^o^F. If rsType=ASHP and both rsCapC and rsCap47 are autosized, both are set to the larger consistent value using rsCapRat9547 (after application of rsFxCapH and rsFxCapC). -<%= member_table( - units: "Btu/Wh", - legal_range: "*AUTOSIZE* or *x* $>$ 0", - default: "Calculated from rsCapC", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*AUTOSIZE* or *x* $>$ 0", + "default": "Calculated from rsCapC", + "required": "No", + "variability": "constant" + }) +}} + +### rsCap35 -**rsCap35=*float*** +Type: float For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 35 ^o^F. rsCap35 typically reflects reduced capacity due to reverse (cooling) heat pump operation for defrost. -<%= member_table( - units: "Btu/Wh", - legal_range: "*x* $>$ 0", - default: "Calculated from rsCap47 and rsCap17", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*x* $>$ 0", + "default": "Calculated from rsCap47 and rsCap17", + "required": "No", + "variability": "constant" + }) +}} -**rsCap17=*float*** +### rsCap17 + +Type: float For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 17 ^o^F. -<%= member_table( - units: "Btu/Wh", - legal_range: "*x* $>$ 0", - default: "Calculated from rsCap47", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*x* $>$ 0", + "default": "Calculated from rsCap47", + "required": "No", + "variability": "constant" + }) +}} + +### rsCOP95 -**rsCOP95=*float*** +Type: float For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 95 ^o^F. -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "Calculated from rsCap95", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "Calculated from rsCap95", + "required": "No", + "variability": "constant" + }) +}} -**rsCOP47=*float*** +### rsCOP47 + +Type: float For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 47 ^o^F. For rsType=WSHP, rated heating coefficient of performance at source fluid temperature = 68 ^o^F. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "Estimated from rsHSPF, rsCap47, and rsCap17", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "Estimated from rsHSPF, rsCap47, and rsCap17", + "required": "No", + "variability": "constant" + }) +}} + +### rsCOP35 -**rsCOP35=*float*** +Type: float For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 35 ^o^F. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "Calculated from rsCap35, rsCap47, rsCap17, rsCOP47, and rsCOP17", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "Calculated from rsCap35, rsCap47, rsCap17, rsCOP47, and rsCOP17", + "required": "No", + "variability": "constant" + }) +}} -**rsCOP17=*float*** +### rsCOP17 + +Type: float For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 17 ^o^F. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "Calculated from rsHSPF, rsCap47, and rsCap17", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "Calculated from rsHSPF, rsCap47, and rsCap17", + "required": "No", + "variability": "constant" + }) +}} + +### rsCapRat1747 -**rsCapRat1747=*float*** +Type: float For rsType=ASHP, ratio of rsCAP17 over rsCAP47. -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "Based on HSPF or\nother correlations", - required: "No", - variability: "Start of a run") %> +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "Based on HSPF or\nother correlations", + "required": "No", + "variability": "Start of a run" + }) +}} -**rsFChgH=*float*** +### rsFChgH + +Type: float For all heatpump types, heating compressor charge factor. The heating gross (compressor only) COP is modified by rsFChgH to account for incorrect refrigerant charge. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1 (no effect)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1 (no effect)", + "required": "No", + "variability": "constant" + }) +}} + +### rsCapRat9547 -**rsCapRat9547=*float*** +Type: float Ratio of rsCAP95 to rsCAP47. This ratio is used for inter-defaulting rsCap47 and rsCapC such that they have consistent values as is required given that a heat pump is a single device. If not given, rsCapRat9547 is determined during calculations using the relationship cap95 = 0.98 * cap47 + 180 (derived via correlation of capacities of a set of real units). -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "See above", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "See above", + "required": "No", + "variability": "constant" + }) +}} -**rsCapRatCH=*float*** +### rsCapRatCH + +Type: float For WSHP only: ratio of rsCapC to rsCapH. Used to derive capacity during autosizing or when only one capacity is specified. -<%= member_table( - units: "", - legal_range: ".3 $\\leq$ x $<$ 2", - default: "0.8", - required: "No", - variability: "Start of a run") %> +{{ + member_table({ + "units": "", + "legal_range": ".3 $\\leq$ x $<$ 2", + "default": "0.8", + "required": "No", + "variability": "Start of a run" + }) +}} + +### rsPerfMapHtg -**rsPerfMapHtg=*performanceMapName*** +Type: performanceMapName Specifies the heating performance PERFORMANCEMAP for RSYSs having rsType=ASHPPM. The PERFORMANCEMAP must have grid variables outdoor drybulb and compressor speed (in that order) and lookup values of net capacity ratios and COP. See example in PERFORMANCEMAP. -<%= member_table( - units: "", - legal_range: "Name of a PERFORMANCEMAP", - default: "", - required: "if rsType specifies a performance map model", - variability: "Start of a run") %> +{{ + member_table({ + "units": "", + "legal_range": "Name of a PERFORMANCEMAP", + "default": "", + "required": "if rsType specifies a performance map model", + "variability": "Start of a run" + }) +}} -**rsPerfMapClg=*performanceMapName*** +### rsPerfMapClg + +Type: performanceMapName Specifies the cooling performance PERFORMANCEMAP for RSYSs having rsType=ASHPPM, ACPM, ACPMFURNACE, ACPMRESISTANCE, or ACPMCOMBINEDHEATDHW. The PERFORMANCEMAP must have grid variables outdoor drybulb and compressor speed (in that order) and lookup values of net capacity ratios and COP. See example in PERFORMANCEMAP. -<%= member_table( - units: "", - legal_range: "Name of a PERFORMANCEMAP", - default: "", - required: "if rsType specifies a performance map model", - variability: "Start of a run") %> +{{ + member_table({ + "units": "", + "legal_range": "Name of a PERFORMANCEMAP", + "default": "", + "required": "if rsType specifies a performance map model", + "variability": "Start of a run" + }) +}} + +### rsTypeAuxH -**rsTypeAuxH=*choice*** +Type: choice For rsType=ASHP, type of auxiliary heat. Auxiliary heating is used when heatpump capacity is insufficient to maintain zone temperature and during reverse-cycle defrost operation (if rsDefrostModel=REVCYCLEAUX). If rsTypeAuxH=Furnace, energy use for auxiliary heat is accumulated to end use HPBU of meter rsFuelMtr (if specified). If rsTypeAuxH=Resistance, energy use for auxiliary heat is accumulated to end use HPBU of meter rsElecMtr (if specified). -<%= csv_table(< true) -Choice, Description +{{ + csv_table("Choice, Description NONE, No auxiliary heat RESISTANCE, Electric resistance (aka strip heat) -FURNACE, Fuel-fired -END -%> +FURNACE, Fuel-fired", True) +}} -<%= member_table( - units: "", - legal_range: "See table above", - default: "RESISTANCE", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "See table above", + "default": "RESISTANCE", + "required": "No", + "variability": "constant" + }) +}} -**rsCtrlAuxH=*choice*** +### rsCtrlAuxH + +Type: choice For rsType=ASHP, type of auxiliary heating control. -<%= csv_table(< true) -Choice, Description +{{ + csv_table("Choice, Description LOCKOUT, Compressor locked out if any auxiliary heating control CYCLE, Compressor runs continuously and auxiliary cycles -ALTERNATE, Alternates between compressor and auxiliary -END -%> +ALTERNATE, Alternates between compressor and auxiliary", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "See table above", + "default": "ALTERNATE if rsTypeAuxH=FURNACE else CYCLE", + "required": "No", + "variability": "Start of a run" + }) +}} -<%= member_table( - units: "", - legal_range: "See table above", - default: "ALTERNATE if rsTypeAuxH=FURNACE else CYCLE", - required: "No", - variability: "Start of a run") %> +### rsCapAuxH -**rsCapAuxH=*float*** +Type: float For rsType=ASHP, auxiliary heating capacity. If AUTOSIZEd, rsCapAuxH is set to the peak heating load evaluated at the heating design temperature (Top.heatDsTDbO). -<%= member_table( - units: "Btu/hr", - legal_range: "*AUTOSIZE* or *x* $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "*AUTOSIZE* or *x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} -**rsAFUEAuxH=*float*** +### rsAFUEAuxH + +Type: float For rsType=ASHP, auxiliary heat annualized fuel utilization efficiency. -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "0.9 if rsTypeAuxH=FURNACE else 1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "0.9 if rsTypeAuxH=FURNACE else 1", + "required": "No", + "variability": "constant" + }) +}} + +### rsDefrostModel -**rsDefrostModel=*choice*** +Type: choice Selects modeling options for ASHP outdoor coil defrosting when 17 ^o^F < TDbO < 45 ^o^F. In this temperature range, heating capacity and/or efficiency are typically reduced due to frost accumulation on the outdoor coil. -<%= csv_table(< false) - NONE, Defrost is not modeled. When 17 ^o^F < TDbO < 45 ^o^F, capacity and efficiency are determined by interpolation using unmodified 17 ^o^F and 47 ^o^F data. +{{ + csv_table("NONE, Defrost is not modeled. When 17 ^o^F < TDbO < 45 ^o^F, capacity and efficiency are determined by interpolation using unmodified 17 ^o^F and 47 ^o^F data. REVCYCLE, Reverse compressor (cooling) operation. Net capacity and efficiency is derived from rsCap17/rsCOP17 and rsCap35/rsCOP35 using linear interpolation. Auxiliary heat is not modeled. - REVCYCLEAUX, Reverse compressor (cooling) operation with provision of sufficient auxiliary heat to make up the loss of heating capacity. Auxiliary heating is typically used to prevent cold air delivery to zones during the defrost cycle. -END -%> + REVCYCLEAUX, Reverse compressor (cooling) operation with provision of sufficient auxiliary heat to make up the loss of heating capacity. Auxiliary heating is typically used to prevent cold air delivery to zones during the defrost cycle.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "*one of above choices*", + "default": "REVCYCLEAUX", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "*one of above choices*", - default: "REVCYCLEAUX", - required: "No", - variability: "constant") %> +### rsSHRtarget -**rsSHRtarget=*float*** +Type: float Nominal target for sensible heat ratio (for fancoil). -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "0.7", - required: "No", - variability: "subhour") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "0.7", + "required": "No", + "variability": "subhour" + }) +}} -**rsFxCapAuxH=*float*** +### rsFxCapAuxH + +Type: float Auxiliary heating autosizing capacity factor. If AUTOSIZEd, rsCapAuxH is set to rsFxCapAuxH $\times$ (peak design-day load). Peak design-day load is the heating capacity that holds zone temperature at the thermostat set point during the *last substep* of all hours of all design days. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### rsSEER -**rsSEER=*float*** +Type: float Cooling rated Seasonal Energy Efficiency Ratio (SEER). -<%= member_table( - units: "Btu/Wh", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**rsEER=*float*** +### rsEER + +Type: float Cooling Energy Efficiency Ratio (EER) at standard AHRI rating conditions (outdoor drybulb of 95 ^o^F and entering air at 80 ^o^F drybulb and 67 ^o^F wetbulb). For rsType=WSHP, rated EER at fluid source temperature = 86 ^o^F. -<%= member_table( - units: "Btu/Wh", - legal_range: "*x* $>$ 0", - default: "Estimated from SEER unless WSHP", - required: "Yes for WSHP else No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/Wh", + "legal_range": "*x* $>$ 0", + "default": "Estimated from SEER unless WSHP", + "required": "Yes for WSHP else No", + "variability": "constant" + }) +}} + +### rsCapC -**rsCapC=*float*** +Type: float Net cooling capacity at standard rating conditions (outdoor drybulb temperature = 95 ^o^F for air source or fluid source temperature = 86 ^o^F for water source). @@ -532,336 +724,475 @@ If rsType=ASHP and both rsCapC and rsCap47 are autosized, both are set to the la If rsType=WSHP and both rsCapC and rsCapH are autosized, both are set to the larger consistent value using rsCapRatCH (after application of rsFxCapH and rsFxCapC). -<%= member_table( - units: "Btu/hr", - legal_range: "*AUTOSIZE* or *x* $\\le$ 0 (x $>$ 0 coverted to $<$ 0)", - default: "*none*", - required: "Yes if rsType includes cooling", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "*AUTOSIZE* or *x* $\\le$ 0 (x $>$ 0 coverted to $<$ 0)", + "default": "*none*", + "required": "Yes if rsType includes cooling", + "variability": "constant" + }) +}} -**rsTdDesC=*float*** +### rsTdDesC + +Type: float Nominal cooling temperature fall (across system, not zone) used during autosizing (when capacity is not yet known). -<%= member_table( - units: "^o^F", - legal_range: "*x* $<$ 0", - default: "-25", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $<$ 0", + "default": "-25", + "required": "No", + "variability": "constant" + }) +}} + +### rsFxCapC -**rsFxCapC=*float*** +Type: float Cooling autosizing capacity factor. rsCapC is set to rsFxCapC $\times$ (peak design-day load). Peak design-day load is the cooling capacity that holds zone temperature at the thermostat set point during the *last substep* of all hours of all design days. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1.4", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1.4", + "required": "No", + "variability": "constant" + }) +}} -**rsFChgC=*float***\ -**rsFChg=*float*** +### rsFChgC, rsFChg + +Type: float Cooling compressor charge factor. The cooling gross (compressor only) COP is modified by rsFChgC to account for incorrect refrigerant charge. Note: rsFChg is the prior name for this value and is supported for backwards compatibility. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1 (no effect)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1 (no effect)", + "required": "No", + "variability": "constant" + }) +}} + +### rsVFPerTon -**rsVFPerTon=*float*** +Type: float Standard air volumetric flow rate per nominal ton of cooling capacity. -<%= member_table( - units: "cfm/ton", - legal_range: "150 $\\le$ x $\\le$ 500", - default: "350", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "cfm/ton", + "legal_range": "150 $\\le$ x $\\le$ 500", + "default": "350", + "required": "No", + "variability": "constant" + }) +}} -**rsFanPwrC=*float*** +### rsFanPwrC + +Type: float Cooling fan power. -<%= member_table( - units: "W/cfm", - legal_range: "*x* $\\ge$ 0", - default: "0.365", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "W/cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "0.365", + "required": "No", + "variability": "constant" + }) +}} + +### rsASHPLockOutT -**rsASHPLockOutT=*float*** +Type: float Source air dry-bulb temperature below which the air source heat pump compressor does not operate. -<%= member_table( - units: "^o^F", - legal_range: "", - default: "(no lockout)", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "(no lockout)", + "required": "No", + "variability": "hourly" + }) +}} -**rsCdH=*float*** +### rsCdH + +Type: float Heating cyclic degradation coefficient, valid only for compressor-based heating (heat pumps). -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 0.5", - default: "ASHPHYDRONIC: 0.25 ASHP: derived from rsHSPF", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 0.5", + "default": "ASHPHYDRONIC: 0.25 ASHP: derived from rsHSPF", + "required": "No", + "variability": "hourly" + }) +}} + +### rsCdC -**rsCdC=*float*** +Type: float Cooling cyclic degradation coefficient, valid for configurations having compressor-based cooling. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 0.5", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 0.5", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} -**rsFEffH=*float*** +### rsFEffH + +Type: float Heating efficiency factor. At each time step, the heating efficiency is multiplied by rsFEffH. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### rsFEffAuxHBackup -**rsFEffAuxHBackup=*float*** +Type: float Backup auxiliary heating efficiency factor. At each time step, the backup heating efficiency is multiplied by rsFEffAuxHBackup. Backup auxiliary heating is typically provided by electric resistance "strip heat" but may be provided by a furnace (see rsTypeAuxH). If rsTypeAuxH is not "none", backup heat operates when air source heat pump compressor capacity is insufficient to meet heating load. See also rsFEffAuxHDefrost. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} -**rsFEffAuxHDefrost=*float*** +### rsFEffAuxHDefrost + +Type: float Defrost auxiliary heating efficiency factor. At each time step, the defrost auxiliary heating efficiency is multiplied by rsFEffAuxHDefrost. Defrost auxiliary heating is typically provided by electric resistance "strip heat" but may be provided by a furnace (see rsTypeAuxH). If rsDefrostModel=REVCYCLEAUX, defrost auxiliary heat operates during air source heat pump defrost mode. Since defrost and backup heating are generally provided by the same equipment, rsFEffAuxHDefrost and rsFEffAuxHBackup are usually set to the same value, but separate inputs are available for special cases. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### rsFEffC -**rsFEffC=*float*** +Type: float Cooling efficiency factor. At each time step, the cooling efficiency is multiplied by rsEffC. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### rsCapNomH -**rsCapNomH=*float*** +Type: float Heating nominal capacity. Provides type-independent probe source for RSYS heating capacity. Daily variability is specified to support value changes during AUTOSIZEing. Values set via input are typically constant. -<%= member_table( - units: "Btu/hr", - legal_range: "*x* $\\ge$ 0", - default: "no heating: 0 heat pump: rsCap47 (input or AUTOSIZEd) other: rsCapH (input or AUTOSIZEd)", - required: "No", - variability: "daily") %> +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "*x* $\\ge$ 0", + "default": "no heating: 0 heat pump: rsCap47 (input or AUTOSIZEd) other: rsCapH (input or AUTOSIZEd)", + "required": "No", + "variability": "daily" + }) +}} -**rsCapNomC=*float*** +### rsCapNomC + +Type: float Cooling nominal capacity. Provides type-independent probe source for RSYS cooling capacity. Daily variability is specified to support value changes during AUTOSIZEing. Values set via input are typically constant. -<%= member_table( - units: "Btu/hr", - legal_range: "*x* $\\ge$ 0", - default: "no cooling: 0 other: rsCap95 (input or AUTOSIZEd)", - required: "No", - variability: "daily") %> +{{ + member_table({ + "units": "Btu/hr", + "legal_range": "*x* $\\ge$ 0", + "default": "no cooling: 0 other: rsCap95 (input or AUTOSIZEd)", + "required": "No", + "variability": "daily" + }) +}} + +### rsDSEH -**rsDSEH=*float*** +Type: float Heating distribution system efficiency. If given, (1-rsDSEH) of RSYS heating output is discarded. Cannot be combined with more detailed DUCTSEG model. -<%= member_table( - units: "", - legal_range: "0 < *x* < 1", - default: "(use DUCTSEG model)", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 < *x* < 1", + "default": "(use DUCTSEG model)", + "required": "No", + "variability": "hourly" + }) +}} -**rsDSEC=*float*** +### rsDSEC + +Type: float Cooling distribution system efficiency. If given, (1-rsDSEC) of RSYS cooling output is discarded. Cannot be combined with more detailed DUCTSEG model. -<%= member_table( - units: "", - legal_range: "0 < *x* < 1", - default: "(use DUCTSEG model)", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 < *x* < 1", + "default": "(use DUCTSEG model)", + "required": "No", + "variability": "hourly" + }) +}} + +### rsOAVType - **rsOAVType=*choice*** +Type: choice Type of central fan integrated (CFI) outside air ventilation (OAV) included in this RSYS. OAV systems use the central system fan to circulate outdoor air (e.g. for night ventilation). - OAV cannot operate simultaneously with whole building ventilation (operable windows, whole house fans, etc.). Availability of ventilation modes is controlled on an hourly basis via [Top ventAvail](#top-model-control-items). + OAV cannot operate simultaneously with whole building ventilation (operable windows, whole house fans, etc.). Availability of ventilation modes is controlled on an hourly basis via [Top ventAvail][top-model-control-items]. -<%= csv_table(< false) -NONE, No CFI ventilation capabilities +{{ + csv_table("NONE, No CFI ventilation capabilities FIXED, Fixed-flow CFI (aka SmartVent). The specified rsOAVVfDs is used whenever the RSYS operates in OAV mode. -VARIABLE, Variable-flow CFI (aka NightBreeze). Flow rate is determined at midnight based on prior day's average dry-bulb temperature according to a control algorithm defined by the NightBreeze vendor. -END -%> +VARIABLE, Variable-flow CFI (aka NightBreeze). Flow rate is determined at midnight based on prior day's average dry-bulb temperature according to a control algorithm defined by the NightBreeze vendor.") +}} -<%= member_table( - units: "", - legal_range: "NONE, FIXED, VARIABLE", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "NONE, FIXED, VARIABLE", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} - **rsOAVVfDs=*float*** +### rsOAVVfDs + +Type: float Design air volume flow rate when RSYS is operating in OAV mode. -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "*none*", - required: "if rsOAVType $\ne$ NONE", - variability: "constant") %> +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* $\\ge$ 0", + "default": "*none*", + "required": "if rsOAVType $\ne$ NONE", + "variability": "constant" + }) +}} + +### rsOAVVfMinF - **rsOAVVfMinF=*float*** +Type: float Minimum air volume flow rate fraction when RSYS is operating in OAV mode. When rsOAVType=VARIABLE, air flow rate is constrained to rsOAVVfMinF * rsOAVVfDs or greater. -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "0.2", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ x $\\le$ 1", + "default": "0.2", + "required": "No", + "variability": "constant" + }) +}} - **rsOAVFanPwr=*float*** +### rsOAVFanPwr + +Type: float RSYS OAV-mode fan power. -<%= member_table( - units: "W/cfm", - legal_range: "0 < x $\\le$ 5", - default: "per rsOAVTYPE FIXED: rsFanPwrC VARIABLE: NightBreeze vendor curve based on rsOAVvfDs", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "W/cfm", + "legal_range": "0 < x $\\le$ 5", + "default": "per rsOAVTYPE FIXED: rsFanPwrC VARIABLE: NightBreeze vendor curve based on rsOAVvfDs", + "required": "No", + "variability": "constant" + }) +}} + +### rsOAVTDbInlet -**rsOAVTDbInlet=*float*** +Type: float OAV inlet (source) air temperature. Supply air temperature at the zone is generally higher due to fan heat. Duct losses, if any, also alter the supply air temperature. -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\ge$ 0", - default: "Dry-bulb temperature from weather file", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "Dry-bulb temperature from weather file", + "required": "No", + "variability": "hourly" + }) +}} -**rsOAVTdiff=*float*** +### rsOAVTdiff + +Type: float OAV temperature differential. When operating in OAV mode, the zone set point temperature is max( znTD, inletT+rsOAVTdiff). Small values can result in inadvertent zone heating, due to fan heat. -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "5 ^o^F", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $>$ 0", + "default": "5 ^o^F", + "required": "No", + "variability": "hourly" + }) +}} + +### rsOAVReliefZn -**rsOAVReliefZn=*znName*** +Type: znName Name of zone to which relief air is directed during RSYS OAV operation, typically an attic zone. Relief air flow is included in the target zone's pressure and thermal balance. -<%= member_table( - units: "", - legal_range: "*name of ZONE*", - default: "*none*", - required: "if rsOAVType $\ne$ NONE", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of ZONE*", + "default": "*none*", + "required": "if rsOAVType $\ne$ NONE", + "variability": "constant" + }) +}} -**rsParElec=*float*** +### rsParElec + +Type: float Parasitic electrical power. rsParElec is unconditionally accumulated to end use AUX of rsElecMtr (if specified) and has no other effect. -<%= member_table( - units: "W", - legal_range: "", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "W", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} + +### rsParFuel -**rsParFuel=*float*** +Type: float Parasitic fuel use. rsParFuel is unconditionally accumulated to end use AUX of sFuelMtr (if specified) and has no other effect. -<%= member_table( - units: "Btuh", - legal_range: "", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "Btuh", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} -**rsRhIn=*float*** +### rsRhIn + +Type: float Entering air relative humidity (for model testing). -<%= member_table( - units: "W/cfm", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "Derived from entering air state", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "W/cfm", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "Derived from entering air state", + "required": "No", + "variability": "constant" + }) +}} + +### rsTdbOut -**rsTdbOut=*float*** +Type: float Air dry-bulb temperature at the outdoor portion of this system. -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\ge$ 0", - default: "From weather file", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "From weather file", + "required": "No", + "variability": "hourly" + }) +}} -**endRSYS** +### endRSYS Optionally indicates the end of the RSYS definition. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[rsys](#p_rsys) -- @[RSYSRes](#p_rsysres) (accumulated results) +- @[rsys][p_rsys] +- @[RSYSRes][p_rsysres] (accumulated results) diff --git a/doc/src/records/sgdist.md b/doc/src/docs/input-data/sgdist.md similarity index 58% rename from doc/src/records/sgdist.md rename to doc/src/docs/input-data/sgdist.md index 049a23677..4244a42cd 100644 --- a/doc/src/records/sgdist.md +++ b/doc/src/docs/input-data/sgdist.md @@ -4,18 +4,23 @@ SGDIST creates a subobject of the current window that distributes a specified fr Via members sgFSO and sgFSC, the fraction of the insolation distributed to the surface can be made dependent on whether the zone's shades are open or closed (see ZONE member znSC). -**sgName** +### sgName Name of solar gain distribution (follows "SGDIST" if given). -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**sgSurf=*sfName*** +### sgSurf + +Type: sfName Name of surface to which gain is targeted. @@ -26,67 +31,87 @@ If there is more than surface with the specified name: if one of the surfaces is --> The specified surface must be modeled with the Delayed model. If gain is targeted to a Quick model surface, a warning message is issued and the gain is redirected to the air of the associated zone. -<%= member_table( - units: "", - legal_range: "name of a *SURFACE*", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *SURFACE*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} -**sgSide=*choice*** +### sgSide -Designates the side of the surface to which the gain is to be targeted: +Type: choice -<%= csv_table(< false) -INTERIOR, Apply gain to interior of surface -EXTERIOR, Apply gain to exterior of surface -END -%> +Designates the side of the surface to which the gain is to be targeted: -<%= member_table( - units: "", - legal_range: "INTERIOR, EXTERIOR", - default: "Side of surface in zone containing window; or INTERIOR if both sides are in zone containing window.", - required: "Yes", - variability: "constant") %> +{{ + csv_table("INTERIOR, Apply gain to interior of surface +EXTERIOR, Apply gain to exterior of surface") +}} + +{{ + member_table({ + "units": "", + "legal_range": "INTERIOR, EXTERIOR", + "default": "Side of surface in zone containing window; or INTERIOR if both sides are in zone containing window.", + "required": "Yes", + "variability": "constant" + }) +}} -**sgFSO=*float*** +### sgFSO + +Type: float Fraction of solar gain directed to specified surface when the owning window's interior shading is in the open position (when the window's zone's shade closure (znSC) is 0). -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1,and sum of window's sgFSO's $\\le$ 1", - default: "*none*", - required: "Yes", - variability: "monthly-hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1,and sum of window's sgFSO's $\\le$ 1", + "default": "*none*", + "required": "Yes", + "variability": "monthly-hourly" + }) +}} + +### sgFSC -**sgFSC=*float*** +Type: float Fraction of solar gain directed to specified surface when the owning window's interior shading is in the closed position. If the zone's shades are partly closed (znSC between 0 and 1), a proportional fraction between sgFSO and sgFSC is used. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1, and sum of window's sgFSC's $\\le$ 1", - default: "*sgFSO*", - required: "No", - variability: "monthly-hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1, and sum of window's sgFSC's $\\le$ 1", + "default": "*sgFSO*", + "required": "No", + "variability": "monthly-hourly" + }) +}} -**endSGDist** +### endSGDist Optionally indicates the end of the solar gain distribution definition. Alternatively, the end of the solar gain distribution definition can be indicated by END or by just beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[sgdist](#p_sgdist) +- @[sgdist][p_sgdist] diff --git a/doc/src/docs/input-data/shade.md b/doc/src/docs/input-data/shade.md new file mode 100644 index 000000000..251d2f5e0 --- /dev/null +++ b/doc/src/docs/input-data/shade.md @@ -0,0 +1,246 @@ +# SHADE + +SHADE constructs a subobject associated with the current WINDOW that represents fixed shading devices (overhangs and/or fins). A window may have at most one SHADE and only windows in vertical surfaces may have SHADEs. A SHADE can describe an overhang, a left fin, and/or a right fin; absence of any of these is specified by omitting or giving 0 for its depth. SHADE geometry can vary on a monthly basis, allowing modeling of awnings or other seasonal shading strategies. + + +### shName + +Name of shade; follows the word "SHADE" if given. + +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### ohDepth + +Type: float + +Depth of overhang (from plane of window to outside edge of overhang). A zero value indicates no overhang. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### ohDistUp + +Type: float + +Distance from top of window to bottom of overhang. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### ohExL + +Type: float + +Distance from left edge of window (as viewed from the outside) to the left end of the overhang. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### ohExR + +Type: float + +Distance from right edge of window (as viewed from the outside) to the right end of the overhang. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### ohFlap + +Type: float + +Height of flap hanging down from outer edge of overhang. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### lfDepth + +Type: float + +Depth of left fin from plane of window. A zero value indicates no fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### lfTopUp + +Type: float + +Vertical distance from top of window to top of left fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### lfDistL + +Type: float + +Distance from left edge of window to left fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### lfBotUp + +Type: float + +Vertical distance from bottom of window to bottom of left fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### rfDepth + +Type: float + +Depth of right fin from plane of window. A 0 value indicates no fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### rfTopUp + +Type: float + +Vertical distance from top of window to top of right fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### rfDistR + +Type: float + +Distance from right edge of window to right fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### rfBotUp + +Type: float + +Vertical distance from bottom of window to bottom of right fin. + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0", + "required": "No", + "variability": "monthly-hourly" + }) +}} + +### endShade + +Optional to indicate the end of the SHADE definition. Alternatively, the end of the shade definition can be indicated by END or the declaration of another object. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[shade][p_shade] diff --git a/doc/src/records/shadex.md b/doc/src/docs/input-data/shadex.md similarity index 62% rename from doc/src/records/shadex.md rename to doc/src/docs/input-data/shadex.md index c031e3942..b83f7eaf8 100644 --- a/doc/src/records/shadex.md +++ b/doc/src/docs/input-data/shadex.md @@ -1,59 +1,75 @@ # SHADEX -SHADEX describes an object that shades other building surfaces using an advanced shading model. Advanced shading calculations are provided only for [PVARRAYs](#pvarray). Advanced shading must be enabled via [Top exShadeModel](#top-model-control-items). +SHADEX describes an object that shades other building surfaces using an advanced shading model. Advanced shading calculations are provided only for [PVARRAYs][pvarray]. Advanced shading must be enabled via [Top exShadeModel][top-model-control-items]. -**sxName** +### sxName Name of photovoltaic array. Give after the word SHADEX. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**sxMounting=*choice*** +### sxMounting -Specifies the mounting location of the shade. sxMounting=Site indicates the SHADEX position is fixed and is not modified if the building is rotated. The position of SHADEXs with sxMounting=Building are modified to include the effect of building rotation specified via [Top bldgAz](#bldgAzm) +Type: choice -<%= member_table( - units: "", - legal_range: "Building or Site", - default: "Site", - required: "No", - variability: "constant") %> +Specifies the mounting location of the shade. sxMounting=Site indicates the SHADEX position is fixed and is not modified if the building is rotated. The position of SHADEXs with sxMounting=Building are modified to include the effect of building rotation specified via [Top bldgAzm][bldgazm] -**sxVertices=*list of up to 36 floats*** +{{ + member_table({ + "units": "", + "legal_range": "Building or Site", + "default": "Site", + "required": "No", + "variability": "constant" + }) +}} + +### sxVertices + +Type: *list of up to 36 floats* Vertices of a polygon representing the shape of the shading object. The values that follow sxVertices are a series of X, Y, and Z values for the vertices of the polygon. The coordinate system is defined from a viewpoint facing north. X and Y values convey east-west and north-south location respectively relative to an arbitrary origin (positive X value are to the east; positive Y values are to the north). Z values convey height relative to the building 0 level and positive values are upward. -The vertices are specified in counter-clockwise order when facing the shading object from the south. The number of values provided must be a multiple of 3. The defined polygon must be planar and have no crossing edges. When sxType=Building, the effective position of the polygon reflects building rotation specified by [TOP bldgAzm](#top-general-data-items). +The vertices are specified in counter-clockwise order when facing the shading object from the south. The number of values provided must be a multiple of 3. The defined polygon must be planar and have no crossing edges. When sxType=Building, the effective position of the polygon reflects building rotation specified by [TOP bldgAzm][top-general-data-items]. For example, to specify a rectangular shade "tree" that is 10 x 40 ft, facing south, and 100 ft to the south of the nominal building origin -- sxVertices = 5, -100, 0, 15, -100, 0, 15, -100, 40, 5, -100, 40 -<%= member_table( - units: "ft", - legal_range: "unrestricted", - default: "*none*", - required: "9, 12, 15, 18, 21, 24, 27, 30, 33 or 36 values", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "unrestricted", + "default": "*none*", + "required": "9, 12, 15, 18, 21, 24, 27, 30, 33 or 36 values", + "variability": "constant" + }) +}} -**endSHADEX** +### endSHADEX Optionally indicates the end of the SHADEX definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[SHADEX](#p_shadex) +- @[SHADEX][p_shadex] diff --git a/doc/src/records/surface.md b/doc/src/docs/input-data/surface.md similarity index 57% rename from doc/src/records/surface.md rename to doc/src/docs/input-data/surface.md index 4a3f14cdb..4c1486201 100644 --- a/doc/src/records/surface.md +++ b/doc/src/docs/input-data/surface.md @@ -2,268 +2,353 @@ Surface constructs a ZONE subobject of class SURFACE that represents a surrounding or interior surface of the zone. Internally, SURFACE generates a QUICK surface (U-value only), a DELAYED (massive) surface (using the finite-difference mass model), interzone QUICK surface, or interzone DELAYED surface, as appropriate for the specified construction and exterior conditions. -**sfName** +### sfName Name of surface; give after the word SURFACE. -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**sfType=*choice*** +### sfType + +Type: choice Type of surface: -<%= csv_table(< false) -FLOOR, Surface defines part or all of the 'bottom' of the zone; it is horizontal with inside facing up. The outside of the surface is not adjacent to the current zone. +{{ + csv_table("FLOOR, Surface defines part or all of the 'bottom' of the zone; it is horizontal with inside facing up. The outside of the surface is not adjacent to the current zone. WALL, Surface defines a 'side' of the zone; its outside is not adjacent to the current zone. -CEILING, Surface defines part or all of the 'top' of the zone with the inside facing down. The outside of the surface is not adjacent to the current zone. -END -%> +CEILING, Surface defines part or all of the 'top' of the zone with the inside facing down. The outside of the surface is not adjacent to the current zone.") +}} sfType is used extensively for default determination and input checking, but does not have any further internal effect. The Floor, Wall, and Ceiling choices identify surfaces that form boundaries between the zone and some other condition. -<%= member_table( - units: "", - legal_range: "FLOOR WALL CEILING", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "FLOOR WALL CEILING", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### sfArea -**sfArea=*float*** +Type: float Gross area of surface. (CSE computes the net area for simulation by subtracting the areas of any windows and doors in the surface.). -<%= member_table( - units: "ft^2^", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "ft^2^", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### sfTilt -**sfTilt=*float*** +Type: float Surface tilt from horizontal. Values outside the range 0 to 360 are first normalized to that range. The default and allowed range depend on sfType, as follows: - ------------------ ------------------------------------------- - sfType = FLOOR *sfTilt*=180, default = 180 (fixed value) - sfType = WALL 60 $<$ *sfTilt* $<$ 180, default = 90 - sfType = CEILING 0 $\leq$ *sfTilt* $\leq$ 60, default = 0 - ------------------ ------------------------------------------- +{{ + csv_table("sfType = FLOOR, *sfTilt*=180, default = 180 (fixed value) +sfType = WALL, 60 $<$ *sfTilt* $<$ 180, default = 90 +sfType = CEILING, 0 $\leq$ *sfTilt* $\leq$ 60, default = 0") +}} -<%= member_table( - units: "degrees", - legal_range: "Dependent upon *sfType* See above", - default: "Dependent upon *sfType* See above", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "degrees", + "legal_range": "Dependent upon *sfType*. See above.", + "default": "Dependent upon *sfType*. See above.", + "required": "No", + "variability": "constant" + }) +}} -**sfAzm=*float*** +### sfAzm + +Type: float Azimuth of surface with respect to znAzm. The azimuth used in simulating a surface is bldgAzm + znAzm + sfAzm; the surface is rotated if any of those are changed. Values outside the range 0 to 360 are normalized to that range. Required for non-horizontal surfaces. -<%= member_table( - units: "degrees", - legal_range: "unrestricted", - default: "*none*", - required: "Required if *sfTilt* $\\neq$ 0 and *sfTilt* $\\neq$ 180", - variability: "constant") %> +{{ + member_table({ + "units": "degrees", + "legal_range": "unrestricted", + "default": "*none*", + "required": "Required if *sfTilt* $\\neq$ 0 and *sfTilt* $\\neq$ 180", + "variability": "constant" + }) +}} + +### sfModel -**sfModel=*choice*** +Type: choice Provides user control over how CSE models conduction for this surface. -<%= csv_table(< false) -QUICK, Surface is modeled using a simple conductance. Heat capacity effects are ignored. Either sfCon or sfU (next) can be specified. +{{ + csv_table("QUICK, Surface is modeled using a simple conductance. Heat capacity effects are ignored. Either sfCon or sfU (next) can be specified. DELAYED, DELAYED\_HOUR, DELAYED\_SUBHOUR, Surface is modeled using a multi-layer finite difference technique that represents heat capacity effects. If the time constant of the surface is too short to accurately simulate, a warning message is issued and the Quick model is used. The program **cannot** use the finite difference model if sfU rather than sfCon is specified. AUTO, Program selects Quick or the appropriate Delayed automatically according to the time constant of the surface (if sfU is specified, Quick is selected). FD (or FORWARD\_DIFFERENCE), Selects the forward difference model (used with short time steps and the CZM/UZM zone model). -KIVA, Uses a two-dimensional finite difference model to simulate heat flow through foundation surfaces. -END -%> - -<%= member_table( - legal_range: "QUICK, DELAYED, DELAYED\_HOUR, DELAYED\_SUBOUR, AUTO, 2D_FND", - default: "AUTO", - required: "No", - variability: "constant") %> +KIVA, Uses a two-dimensional finite difference model to simulate heat flow through foundation surfaces.") +}} + +{{ + member_table({ + "legal_range": "QUICK, DELAYED, DELAYED\_HOUR, DELAYED\_SUBOUR, AUTO, 2D_FND", + "default": "AUTO", + "required": "No", + "variability": "constant" + }) +}} Either sfU or sfCon must be specified, but not both. -**sfU=*float*** +### sfU + +Type: float Surface U-value (NOT including surface (air film) conductances). For surfaces for which no heat capacity is to be modeled, allows direct entry of U-value without defining a CONSTRUCTION. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "Determined from *sfCon*", - required: "if *sfCon* not given and if *sfExCnd* is not GROUND", - variability: "constant") %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "Determined from *sfCon*", + "required": "if *sfCon* not given and if *sfExCnd* is not GROUND", + "variability": "constant" + }) +}} -**sfCon=*conName*** +### sfCon + +Type: conName Name of CONSTRUCTION of the surface. -<%= member_table( - units: "", - legal_range: "Name of a *CONSTRUCTION*", - default: "*none*", - required: "if *sfU* not given and if *sfExCnd* is not GROUND", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "Name of a *CONSTRUCTION*", + "default": "*none*", + "required": "if *sfU* not given and if *sfExCnd* is not GROUND", + "variability": "constant" + }) +}} Note: When *sfExCnd* is GROUND, *sfCon* may be omitted to indicate: - exposed earth (when *sfType* is FLOOR), or - bare foundation wall (when *sfType* is WALL) -- the foundation wall -**sfLThkF=*float*** +### sfLThkF + +Type: float Sublayer thickness adjustment factor for FORWARD\_DIFFERENCE conduction model used with sfCon surfaces. Material layers in the construction are divided into sublayers as needed for numerical stability. sfLThkF allows adjustment of the thickness criterion used for subdivision. A value of 0 prevents subdivision; the default value (0.5) uses layers with conservative thickness equal to half of an estimated safe value. Fewer (thicker) sublayers improves runtime at the expense of accurate representation of rapid changes. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0.5", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "0.5", + "required": "No", + "variability": "constant" + }) +}} -**sfExCnd=*choice*** +### sfExCnd + +Type: choice Specifies the thermal conditions assumed at surface exterior, and at exterior of any subobjects (windows or doors) belonging to current surface. The conditions accounted for are dry bulb temperature and incident solar radiation. -<%= csv_table(< false) -AMBIENT, Exterior surface is exposed to the 'weather' as read from the weather file. Solar gain is calculated using solar geometry, sfAzm, sfTilt, and sfExAbs. +{{ + csv_table("AMBIENT, Exterior surface is exposed to the 'weather' as read from the weather file. Solar gain is calculated using solar geometry, sfAzm, sfTilt, and sfExAbs. SPECIFIEDT, Exterior surface is exposed to solar radiation as in AMBIENT, but the dry bulb temperature is calculated with a user specified function (sfExT). sfExAbs can be set to 0 to eliminate solar effects. ADJZN, Exterior surface is exposed to another zone, whose name is specified by sfAdjZn. Solar gain is 0 unless gain is targeted to the surface with SGDIST below. GROUND, The surface is in contact with the ground. Details of the two-dimensional foundation design are defined by sfFnd. Only floor and wall surfaces may use this option. -ADIABATIC, Exterior surface heat flow is 0. Thermal storage effects of delayed surfaces are modeled. -END -%> +ADIABATIC, Exterior surface heat flow is 0. Thermal storage effects of delayed surfaces are modeled.") +}} + +### sfExAbs -**sfExAbs=*float*** +Type: float Surface exterior absorptivity. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.5", - required: "Required if *sfExCnd* = AMBIENT or *sfExCnd* = SPECIFIEDT", - variability: "monthly-hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.5", + "required": "Required if *sfExCnd* = AMBIENT or *sfExCnd* = SPECIFIEDT", + "variability": "monthly-hourly" + }) +}} + +### sfInAbs -**sfInAbs=*float*** +Type: float Surface interior solar absorptivity. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\le$ 1", - default: "sfType = CEILING, 0.2; sfType = WALL, 0.6; sfType = FLOOR, 0.8", - required: "No", - variability: "monthly-hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\le$ 1", + "default": "sfType = CEILING, 0.2; sfType = WALL, 0.6; sfType = FLOOR, 0.8", + "required": "No", + "variability": "monthly-hourly" + }) +}} -**sfExEpsLW=*float*** +### sfExEpsLW + +Type: float Surface exterior long wave (thermal) emittance. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.9", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.9", + "required": "No", + "variability": "constant" + }) +}} + +### sfInEpsLW -**sfInEpsLW=*float*** +Type: float Surface interior long wave (thermal) emittance. -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.9", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.9", + "required": "No", + "variability": "constant" + }) +}} -**sfExT=*float*** +### sfExT + +Type: float Exterior air temperature. -<%= member_table( - units: "^o^F", - legal_range: "*unrestricted*", - default: "*none*", - required: "Required if *sfExCnd* = SPECIFIEDT", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*unrestricted*", + "default": "*none*", + "required": "Required if *sfExCnd* = SPECIFIEDT", + "variability": "hourly" + }) +}} + +### sfAdjZn -**sfAdjZn=*znName*** +Type: znName Name of adjacent zone; used only when sfExCnd is ADJZN. Can be the same as the current zone. -<%= member_table( - units: "", - legal_range: "name of a *ZONE*", - default: "*none*", - required: "Required when
*sfExCnd* = ADJZN", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "name of a *ZONE*", + "default": "*none*", + "required": "Required when
*sfExCnd* = ADJZN", + "variability": "constant" + }) +}} -**sfGrndRefl=*float*** +### sfGrndRefl + +Type: float Ground reflectivity for this surface. -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "grndRefl", - required: "No", - variability: "Monthly - Hourly") %> +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "grndRefl", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### sfInH -**sfInH=*float*** +Type: float Inside surface (air film) conductance. Ignored for sfModel = Forward\_Difference. Default depends on the surface type. -<%= csv_table(< false) -sfType = FLOOR or CEILING, 1.32 -other, 1.5 -END -%> +{{ + csv_table("sfType = FLOOR or CEILING, 1.32 +other, 1.5") +}} -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "*See above*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "*See above*", + "required": "No", + "variability": "constant" + }) +}} -**sfExH=*float*** +### sfExH + +Type: float Outside combined surface (air film) conductance. Ignored for sfModel = Forward\_Difference. The default value is dependent upon the exterior conditions: -<%= csv_table(< false) -sfExCnd = AMBIENT, dflExH (Top-level member, described above) +{{ + csv_table("sfExCnd = AMBIENT, dflExH (Top-level member, described above) sfExCnd = SPECIFIEDT, dflExH (described above) sfExCnd = ADJZN, 1.5 -sfExCnd = ADIABATIC, not applicable -END -%> - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "see above", - required: "No", - variability: "constant") %> +sfExCnd = ADIABATIC, not applicable") +}} + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "see above", + "required": "No", + "variability": "constant" + }) +}} When sfModel = Forward\_Difference, several models are available for calculating inside and outside surface convective coefficients. Inside surface faces can be exposed only to zone conditions. Outside faces may be exposed either to ambient conditions or zone conditions, based on sfExCnd. Only UNIFIED and INPUT are typically used. The other models were used during CSE development for comparison. For details, see CSE Engineering Documentation. -<%= csv_table(< true) -Model, Exposed to ambient, Exposed to zone +{{ + csv_table("Model, Exposed to ambient, Exposed to zone UNIFIED, default CSE model, default CSE model INPUT, hc = sfExHcMult, hc = sfxxHcMult AKBARI, Akbari model, n/a @@ -272,92 +357,122 @@ WINKELMANN, Winkelmann model, n/a DOE2, DOE2 model, n/a MILLS, n/a, Mills model ASHRAE, n/a, ASHRAE handbook values -TARP, n/a, TARP model -END -%> +TARP, n/a, TARP model", True) +}} + +### sfExHcModel -**sfExHcModel=*choice*** +Type: choice Selects the model used for exterior surface convection when sfModel = Forward\_Difference. -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "UNIFIED", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "UNIFIED", + "required": "No", + "variability": "constant" + }) +}} -**sfExHcLChar=*float*** +### sfExHcLChar + +Type: float Characteristic length of surface, used in derivation of forced exterior convection coefficients in some models when outside surface is exposed to ambient. See sfExHcModel. -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "10", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "10", + "required": "No", + "variability": "constant" + }) +}} + +### sfExHcMult -**sfExHcMult=*float*** +Type: float Exterior convection coefficient adjustment factor. When sfExHcModel=INPUT, hc=sfExHcMult. For other sfExHcModel choices, the model-derived hc is multiplied by sfExHcMult. -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} -**sfExRf=*float*** +### sfExRf + +Type: float Exterior surface roughness factor. Used only when surface is exposed to ambient (i.e. with wind exposure). Typical values: -<%= csv_table(< true) -Roughness Index, sfExRf, Example +{{ + csv_table("Roughness Index, sfExRf, Example 1 (very rough), 2.17, Stucco 2 (rough), 1.67, Brick 3 (medium rough), 1.52, Concrete 4 (Medium smooth), 1.13, Clear pine 5 (Smooth), 1.11, Smooth plaster -6 (Very Smooth), 1, Glass -END -%> +6 (Very Smooth), 1, Glass", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "sfExHcModel = WINKELMANN: 1.66 else 2.17", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "", - default: "sfExHcModel = WINKELMANN: 1.66 else 2.17", - required: "No", - variability: "constant") %> +### sfInHcModel -**sfInHcModel=*choice*** +Type: choice Selects the model used for the inside (zone) surface convection when sfModel = Forward\_Difference. -<%= member_table( - units: "", - legal_range: "*choices above (see sfExHcModel)*", - default: "UNIFIED", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above (see sfExHcModel)*", + "default": "UNIFIED", + "required": "No", + "variability": "constant" + }) +}} - **sfInHcMult=*float*** +### sfInHcMult + +Type: float Interior convection coefficient adjustment factor. When sfInHcModel=INPUT, hc=sfInHcMult. For other sfInHcModel choices, the model-derived hc is multiplied by sfInHcMult. When sfInHcModel=UNIFIED, natural (buoyancy-driven) and forced convection coefficient values are combined according to TOP inHcCombinationMethod, then sfInHcMult is applied. -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### sfInHcFrcCoeffs -**sfInHcFrcCoeffs=*float array*** +Type: float array Specifies 3 coefficients for an alternative inside surface forced convection model (applicable only for sfInHCModel=UNIFIED). When given, the inside surface forced convection coefficient for this surface is derived as follows: @@ -367,114 +482,147 @@ where hConvF is the convection adjustment factor (derived from elevation, see To The default hcFrc value (used when sfInHcFrCoeff is not provided) is hConvF * znHcFrcF * ACH ^ 0.8. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "", - default: "*see above*", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "", + "default": "*see above*", + "required": "No", + "variability": "subhourly" + }) +}} The items below give values associated with CSE's model for below grade surfaces (sfExCnd=GROUND). See CSE Engineering Documentation for technical details. -**sfFnd=*fdName*** +### sfFnd + +Type: fdName Name of FOUNDATION applied to ground-contact Floor SURFACEs; used only for Floor SURFACEs when sfExCnd is GROUND. -<%= member_table( - legal_range: "Name of a *Foundation*", - default: "*none*", - required: "when
*sfExCnd* = GROUND and
*sfType* = Floor", - variability: "constant") %> +{{ + member_table({ + "legal_range": "Name of a *Foundation*", + "default": "*none*", + "required": "when
*sfExCnd* = GROUND and
*sfType* = Floor", + "variability": "constant" + }) +}} + +### sfFndFloor -**sfFndFloor=*sfName*** +Type: sfName Name of adjacent ground-contact Floor SURFACE; used only for Wall SURFACEs when sfExCnd is GROUND. -<%= member_table( - legal_range: "Name of a *Surface*", - default: "*none*", - required: "when
*sfExCnd* = GROUND and
*sfType* = Wall", - variability: "constant") %> +{{ + member_table({ + "legal_range": "Name of a *Surface*", + "default": "*none*", + "required": "when
*sfExCnd* = GROUND and
*sfType* = Wall", + "variability": "constant" + }) +}} + +### sfHeight -**sfHeight=*float*** +Type: float Needed for foundation wall height, otherwise ignored. Maybe combine with sfDepthBG? -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "*none*", - required: "when *sfType* is WALL and *sfExtCnd* is GROUND", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "x $>$ 0", + "default": "*none*", + "required": "when *sfType* is WALL and *sfExtCnd* is GROUND", + "variability": "constant" + }) +}} -**sfExpPerim=*float*** +### sfExpPerim + +Type: float Exposed perimeter of foundation floors. -<%= member_table( - units: "ft", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "when *sfType* is FLOOR, *sfFnd* is set, and *sfExtCnd* is GROUND", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "x $\\geq$ 0", + "default": "*none*", + "required": "when *sfType* is FLOOR, *sfFnd* is set, and *sfExtCnd* is GROUND", + "variability": "constant" + }) +}} + +### sfDepthBG -**sfDepthBG=*float*** +Type: float *Note: sfDepthBG is used as part of the simple ground model, which is no longer supported. Use sfHeight with sfFnd instead.* Depth below grade of surface. For walls, sfDepthBG is measured to the lower edge. For floors, sfDepthBG is measured to the bottom face. -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} *Note: The following data members are part of the simple ground model, which is no longer supported. Use sfFnd instead.* -**sfExCTGrnd=*float*** +### sfExCTGrnd, sfExCTaDbAvg07, sfExCTaDbAvg14, sfExCTaDbAvg31, sfExCTaDbAvgYr -**sfExCTaDbAvg07=*float*** - -**sfExCTaDbAvg14=*float*** - -**sfExCTaDbAvg31=*float*** - -**sfExCTaDbAvgYr=*float*** +Type: float Conductances from outside face of surface to the weather file ground temperature and the moving average outdoor dry-bulb temperatures for 7, 14, 31, and 365 days. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $\\ge$ 0", - default: "see above", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "see above", + "required": "No", + "variability": "constant" + }) +}} + +### sfExRConGrnd -**sfExRConGrnd=*float*** +Type: float Resistance overall construction resistance. TODO: full documentation. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**endSURFACE** +### endSURFACE Optional to indicates the end of the surface definition. Alternatively, the end of the surface definition can be indicated by END, or by beginning another SURFACE or other object definition. If used, should follow the definitions of the SURFACE's subobjects -- DOORs, WINDOWs, SHADEs, SGDISTs, etc. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**humMeth=*choice*** +### humMeth + +Type: choice Developmental zone humidity computation method choice for CNE models (no effect for CSE models). -<%= csv_table(< false) -ROB, Rob's backward difference method. Works well within limitations of backward difference approach. -PHIL, Phil's central difference method. Should be better if perfected*coma* but initialization at air handler startup is unresolved*coma and ringing has been observed. -END -%> +{{ + csv_table("ROB, Rob's backward difference method. Works well within limitations of backward difference approach. +PHIL, Phil's central difference method. Should be better if perfected*coma* but initialization at air handler startup is unresolved*coma and ringing has been observed.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "ROB, PHIL", + "default": "ROB", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "ROB, PHIL", - default: "ROB", - required: "No", - variability: "constant") %> +### dflExH -**dflExH=*float*** +Type: float Default exterior surface (air film) conductance used for opaque and glazed surfaces exposed to ambient conditions in the absence of explicit specification. -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "2.64", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "2.64", + "required": "No", + "variability": "constant" + }) +}} -**bldgAzm=*float*** +### bldgAzm + +Type: float Reference compass azimuth (0 = north, 90 = east, etc.). All zone orientations (and therefore surface orientations) are relative to this value, so the entire building can be rotated by changing bldgAzm only. If a value outside the range 0^o^ $\leq$ *x* $<$ 360^o^ is given, it is normalized to that range. -<%= member_table( - units: "^o^ (degrees)", - legal_range: "unrestricted", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^ (degrees)", + "legal_range": "unrestricted", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### elevation -**elevation=*float*** +Type: float Elevation of the building site. Used internally for the computation of barometric pressure and air density of the location. -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0 (sea level)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $\\ge$ 0", + "default": "0 (sea level)", + "required": "No", + "variability": "constant" + }) +}} + +### runTitle -**runTitle=*string*** +Type: string Run title for the simulation. Appears in report footers, export headers, and in the title lines to the INP, LOG, and ERR built-in reports (these appear by default in the primary report file; the ERR report also appears in the error message file, if one is created). -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "blank (no title", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "blank (no title", + "required": "No", + "variability": "constant" + }) +}} -**runSerial=*int*** +### runSerial + +Type: int Run serial number for the simulation. Increments on each run in a session; appears in report footers. -<%= member_table( - units: "", - legal_range: "0 $\leq$ *x* $\leq$ 999", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\leq$ *x* $\leq$ 999", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} ## TOP Daylight Saving Time Items Daylight savings starts by default at 2:00 a.m. of the second Sunday in March. Internally, hour 3 (2:00-3:00 a.m.) is skipped and reports for this day show only 23 hours. Daylight savings ends by default at 2:00 a.m. of the first Sunday of November; for this day 25 hours are shown on reports. CSE fetches weather data using standard time but uses daylight savings time to calculate variable expressions (and thus all schedules). -**DT=*choice*** +### DT + +Type: choice Whether Daylight Savings Time is to be used for the current run. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} + +### DTbegDay -**DTbegDay=*date*** +Type: date Start day for daylight saving time (assuming DT=Yes) -<%= member_table( - units: "", - legal_range: "*date*", - default: "*second Sunday in March*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "*second Sunday in March*", + "required": "No", + "variability": "constant" + }) +}} -**DTendDay=*date*** +### DTendDay + +Type: date End day for daylight saving time (assuming DT=Yes) -<%= member_table( - units: "", - legal_range: "*date*", - default: "*first Sunday in November*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*date*", + "default": "*first Sunday in November*", + "required": "No", + "variability": "constant" + }) +}} ## TOP Model Control Items -**ventAvail=*choice*** +### ventAvail + +Type: choice Indicates availability of outdoor ventilation strategies. CSE cannot model simultaneously-operating alternative ventilation strategies. For example, an RSYS central fan integrated (CFI) OAV system is never modeled while whole house fan ventilation is available. ventAvail controls which ventilation mode, if any, is available for the current hour. Note that mode availability means that the strategy could operate but may not operate due to other control assumptions. -<%= csv_table(< true) -Choice, Ventilation Strategy Available +{{ + csv_table("Choice, Ventilation Strategy Available NONE, None WHOLEBUILDING, IZXFER (window and whole-house fan) -RSYSOAV, RSYS central fan integrated (CFI) outside air ventilation (OAV) -END -%> +RSYSOAV, RSYS central fan integrated (CFI) outside air ventilation (OAV)", True) +}} As noted, ventAvail is evaluated hourly, permitting flexible control strategy modeling. The following example specifies that RSYSOAV (CFI) ventilation is available when the seven day moving average temperature is above 68 ^o^F, otherwise whole building ventilation is available between 7 and 11 PM, otherwise no ventilation. @@ -348,143 +488,188 @@ As noted, ventAvail is evaluated hourly, permitting flexible control strategy mo : ($hour >= 19 && $hour <= 23) ? WHOLEBUILDING : NONE -<%= member_table( - units: "", - legal_range: "*Choices above*", - default: "WHOLEBUILDING", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "*Choices above*", + "default": "WHOLEBUILDING", + "required": "No", + "variability": "hourly" + }) +}} + +### exShadeModel -**exShadeModel=*choice*** +Type: choice -Specifies advanced exterior shading model used to evaluate shading of [PVARRAYs](#pvarray) by [SHADEXs](#shadex) or other PVARRAYs. Advanced shading is not implemented for building surfaces and this setting has no effect on walls or windows. +Specifies advanced exterior shading model used to evaluate shading of [PVARRAYs][pvarray] by [SHADEXs][shadex] or other PVARRAYs. Advanced shading is not implemented for building surfaces and this setting has no effect on walls or windows. -<%= csv_table(< true) -**Choice**, **Effect** +{{ + csv_table("**Choice**, **Effect** PENUMBRA, Calculate shading using the Penumbra model -NONE, Disable advanced shading calculations -END -%> +NONE, Disable advanced shading calculations", True) +}} -<%= member_table( - units: "", - legal_range: "*Choices above*", - default: "PENUMBRA", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*Choices above*", + "default": "PENUMBRA", + "required": "No", + "variability": "constant" + }) +}} -**slrInterpMeth=*choice*** +### slrInterpMeth + +Type: choice Solar interpolation method. -<%= csv_table(< true) -Choice +{{ + csv_table("Choice CSE -TRNSYS -END -%> +TRNSYS", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "See table above", + "default": "CSE", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "See table above", - default: "CSE", - required: "No", - variability: "constant") %> +### ANTolAbs -**ANTolAbs=*float*** +Type: float AirNet absolute convergence tolerance. Ideally, calculated zone air pressures should be such that the net air flow into each zone is 0 -- that is, there should be a perfect mass balance. The iterative AirNet solution techniques are deemed converged when netAirMassFlow < max( ANTolAbs, ANTolRel*totAirMassFlow). -<%= member_table( - units: "lbm/sec", - legal_range: "*x* $>$ 0", - default: "0.00125 (about 1 cfm)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lbm/sec", + "legal_range": "*x* $>$ 0", + "default": "0.00125 (about 1 cfm)", + "required": "No", + "variability": "constant" + }) +}} -**ANTolRel=*float*** +### ANTolRel + +Type: float AirNet relative convergence tolerance. See AnTolAbs just above. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "0.0001", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "0.0001", + "required": "No", + "variability": "constant" + }) +}} + +### ANPressWarn -**ANPressWarn=*float*** +Type: float AirNet pressure warning threshold. A warning message is issued when the absolute value of the AirNet-calculated zone pressure exceeds ANPressWarn. Note the default for ANPressWarn conservatively large. 10 lb/ft2 is about 500 pascals -- a pressure that is probably impossible in a building. The intent of this value is to alert the user to incorrect modeling inputs while avoiding excessive messages. -<%= member_table( - units: "lb/ft2", - legal_range: "x $\\gt$ 0", - default: "10", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lb/ft2", + "legal_range": "x $\\gt$ 0", + "default": "10", + "required": "No", + "variability": "constant" + }) +}} + +### ANPressErr -**ANPressErr=*float*** +Type: float AirNet pressure error threshold. The simulation terminates with a message if the absolute value of any AirNet-calculated zone pressure exceeds ANPressErr. Note the default value for ANPressErr is physically unrealistic. 30 lb/ft2 is about 1500 pascals -- a pressure that would never be possible in a building. The intent of this value is to prevent simulation crashes due to numerical errors in AirNet calculations. -<%= member_table( - units: "lb/ft2", - legal_range: "x $\\gt$ 0", - default: "30", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lb/ft2", + "legal_range": "x $\\gt$ 0", + "default": "30", + "required": "No", + "variability": "constant" + }) +}} The ASHWAT complex fenestration model used when WINDOW wnModel=ASHWAT yields several heat transfer results that are accurate over local ranges of conditions. Several values control when these value are recalculated. If any of the specified values changes more than the associated threshold, a full ASHWAT calculation is triggered. Otherwise, prior results are used. ASHWAT calculations are computationally expensive and conditions often change only incrementally between time steps. -**AWTrigT=*float*** +### AWTrigT + +Type: float ASHWAT temperature change threshold -- full calculation is triggered by a change of either indoor or outdoor environmental (combined air and radiant) temperature that exceeds AWTrigT. -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $>$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### AWTrigSlr -**AWTrigSlr=*float*** +Type: float ASHWAT solar change threshold -- full calculation is triggered by a fractional change of incident solar radiation that exceeds AWTrigSlr. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "0.05", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "0.05", + "required": "No", + "variability": "constant" + }) +}} -**AWTrigH=*float*** +### AWTrigH + +Type: float ASHWAT convection coefficient change threshold -- full calculation is triggered by a fractional change of inside surface convection coefficient that exceeds AWTrigH. -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "0.1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $>$ 0", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} ## TOP Weather Data Items The following system variables (4.6.4) are determined from the weather file for each simulated hour: -<%= csv_table(< false) -\$radBeam, beam irradiance on tracking surface (integral for hour, Btu/ft^2^). +{{ + csv_table("\$radBeam, beam irradiance on tracking surface (integral for hour, Btu/ft^2^). \$radDiff, diffuse irradiance on a horizontal surface (integral for hour, Btu/ft^2^). \$tDbO, dry bulb temp (^o^F). \$tWbO, wet bulb temp (^o^F). \$wO, humidity ratio \$windDirDeg, wind direction (degrees, NOT RADIANS; 0=N, 90=E). -\$windSpeed, wind speed (mph). -END -%> +\$windSpeed, wind speed (mph).") +}} The following are the terms determined from the weather file for internal use, and can be referenced with the probes shown. @@ -492,319 +677,428 @@ The following are the terms determined from the weather file for internal use, a @Top.windSpeedSquaredWind speed squared (mph2). -**wfName=*string*** +### wfName + +Type: string Weather file path name for simulation. The file should be in the current directory, in the directory CSE.EXE was read from, or in a directory on the operating system PATH. Weather file formats supported are CSW, EPW, and ET1. Only full-year weather files are supported. Note: Backslash (\\) characters in path names must be doubled to work properly (e.g. "\\\\wthr\\\\mywthr.epw"). Forward slash (/) may be used in place of backslash without doubling. -<%= member_table( - units: "", - legal_range: "file name,path optional", - default: "*none*", - required: "Yes", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "file name,path optional", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### skyModel -**skyModel=*choice*** +Type: choice Selects sky model used to determine relative amounts of direct and diffuse irradiance. -<%= csv_table(< false) -ISOTROPIC, traditional isotropic sky model -ANISOTROPIC, Hay anisotropic model -END -%> +{{ + csv_table("ISOTROPIC, traditional isotropic sky model +ANISOTROPIC, Hay anisotropic model") +}} -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "ANISOTROPIC", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "ANISOTROPIC", + "required": "No", + "variability": "constant" + }) +}} -**skyModelLW=*choice*** +### skyModelLW + +Type: choice Selects the model used to derive sky temperature used in long-wave (thermal) radiant heat exchange calculations for SURFACEs exposed to ambient conditions. See the RACM alorithms documentation for technical details. -<%= csv_table(< true) -**Choice**, **Description** +{{ + csv_table("**Choice**, **Description** DEFAULT, Default: tSky from weather file if available else Berdahl-Martin BERDAHLMARTIN, Berdahl-Martin (tSky depends on dew point, cloud cover, and hour) DRYBULB, tSky = dry-bulb temperature (for testing) BLAST, Blast model (tSky depends on dry-bulb) -IRHORIZ, Derives tSky from horizonal infrared data from the weather file (available on some EPW files only). Caution: minimal error checking! Missing weather file IR values are not handled correctly. -END -%> - -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "DEFAULT", - required: "No", - variability: "constant") %> +IRHORIZ, Derives tSky from horizonal infrared data from the weather file (available on some EPW files only). Caution: minimal error checking! Missing weather file IR values are not handled correctly.", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "DEFAULT", + "required": "No", + "variability": "constant" + }) +}} The reference temperature and humidity are used to calculate a humidity ratio assumed in air specific heat calculations. The small effect of changing humidity on the specific heat of air is generally ignored in the interests of speed, but the user can control the humidity whose specific heat is used through the refTemp and refRH inputs. -**refTemp=*float*** +### refTemp + +Type: float Reference temperature (see above paragraph). -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\ge$ 0", - default: "60^o^", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "60^o^", + "required": "No", + "variability": "constant" + }) +}} + +### refRH -**refRH=*float*** +Type: float Reference relative humidity (see above). -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "0.6", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "0.6", + "required": "No", + "variability": "constant" + }) +}} + +### grndRefl -**grndRefl=*float*** +Type: float Global ground reflectivity, used except where other value specified with sfGrndRefl or wnGrndRefl. This reflectivity is used in computing the reflected beam and diffuse radiation reaching the surface in question. It is also used to calculate the solar boundary conditions for the exterior grade surface in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "0.2", - required: "No", - variability: "Monthly-Hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "0.2", + "required": "No", + "variability": "Monthly-Hourly" + }) +}} The following values modify weather file data, permitting varying the simulation without making up special weather files. For example, to simulate without the effects of wind, use windF = 0; to halve the effects of diffuse solar radiation, use radDiffF = 0.5. Note that the default values for windSpeedMin and windF result in modification of weather file wind values unless other values are specified. -**grndEmit=*float*** +### grndEmit + +Type: float Long-wave emittance of the exterior grade surface used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "", - legal_range: "0.0 $\le$ x $\le$ 1.0", - default: "0.8", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0.0 $\le$ x $\le$ 1.0", + "default": "0.8", + "required": "No", + "variability": "constant" + }) +}} -**grndRf** +### grndRf Ground surface roughness. Used for convection and wind speed corrections in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "ft", - legal_range: "x $\\geq$ 0.0", - default: "0.1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "x $\\geq$ 0.0", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} -**windSpeedMin=*float*** +### windSpeedMin + +Type: float Minimum value for wind speed -<%= member_table( - units: "mph", - legal_range: "*x* $\\ge$ 0", - default: "0.5", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "mph", + "legal_range": "*x* $\\ge$ 0", + "default": "0.5", + "required": "No", + "variability": "constant" + }) +}} + +### windF -**windF=*float*** +Type: float Wind Factor: multiplier for wind speeds read from weather file. windF is applied *after* windSpeedMin. Note that windF does *not* effect infiltration rates calculated by the Sherman-Grimsrud model (see e.g. ZONE.infELA). However, windF does modify AirNet flows (see IZXFER). -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0.25", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "0.25", + "required": "No", + "variability": "constant" + }) +}} -**terrainClass=*int*** +### terrainClass + +Type: int Specifies characteristics of ground terrain in the project region. -<%= csv_table(< false) -1, ocean or other body of water with at least 5 km unrestricted expanse +{{ + csv_table("1, ocean or other body of water with at least 5 km unrestricted expanse 2, flat terrain with some isolated obstacles (buildings or trees well separated) 3, rural areas with low buildings, trees, etc. 4, urban, industrial, or forest areas -5, center of large city -END -%> - -<%= member_table( - units: "", - legal_range: "1 $\\leq$ *x* $\\leq$ 5", - default: "4", - required: "No", - variability: "constant") %> +5, center of large city") +}} + +{{ + member_table({ + "units": "", + "legal_range": "1 $\\leq$ *x* $\\leq$ 5", + "default": "4", + "required": "No", + "variability": "constant" + }) +}} -**radBeamF=*float*** +### radBeamF + +Type: float Multiplier for direct normal (beam) irradiance -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} -**radDiffF=*float*** +### radDiffF + +Type: float Multiplier for diffuse horizonal irradiance. -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*x* $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### hConvMod -**hConvMod=*choice*** +Type: choice Enable/disable convection convective coefficient pressure modification factor. $$0.24 + 0.76 \cdot P_{Location}/P_{SeaLevel}$$ -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "YES", + "required": "No", + "variability": "constant" + }) +}} -**inHcCombinationMethod=*choice*** +### inHcCombinationMethod + +Type: *choice* Selects the method for combining inside face (zone-facing) forced and natural (buoyancy-driven) convection coefficients for surfaces using the UNIFIED convection model. This is a development aid not typically used in production runs. -<%= csv_table(< true) -Method, hcComb + +{{ + csv_table("Method, hcComb SUM, hcNat + hcFrc QUADRATURE, sqrt(hcNat^2 + hcFrc^2) -WEIGHTED, hcNat when ACH<0.5 - , hcFrc when ACH>3.0 - , else weighted combination -END -%> +WEIGHTED, hcNat when ACH<0.5
hcFrc when ACH>3.0
else weighted combination", True) +}} + +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "SUM", + "required": "No", + "variability": "constant" + }) +}} -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "SUM", - required: "No", - variability: "constant") %> -**soilDiff=*float*** +### soilDiff + +Type: float *Note: soilDiff is used as part of the simple ground model, which is no longer supported. Use soilCond, soilSpHt, and SoilDens instead.* Soil diffusivity, used in derivation of ground temperature. CSE calculates a ground temperature at 10 ft depth for each day of the year using dry-bulb temperatures from the weather file and soilDiff. Ground temperature is used in heat transfer calculations for SURFACEs with sfExCnd=GROUND. Note: derivation of mains water temperature for DHW calculations involves a ground temperature based on soil diffusivity = 0.025 and does not use this soilDiff. -<%= member_table( - units: "ft^2^/hr", - legal_range: "*x* $>$ 0", - default: "0.025", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft^2^/hr", + "legal_range": "*x* $>$ 0", + "default": "0.025", + "required": "No", + "variability": "constant" + }) +}} + +### soilCond -**soilCond=*float*** +Type: float Soil conductivity. Used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "Btuh-ft/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "1.0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btuh-ft/ft^2^-^o^F", + "legal_range": "*x* $>$ 0", + "default": "1.0", + "required": "No", + "variability": "constant" + }) +}} -**soilSpHt=*float*** +### soilSpHt + +Type: float Soil specific heat. Used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "Btu/lb-^o^F", - legal_range: "*x* $>$ 0", - default: "0.1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "Btu/lb-^o^F", + "legal_range": "*x* $>$ 0", + "default": "0.1", + "required": "No", + "variability": "constant" + }) +}} -**soilDens=*float*** +### soilDens + +Type: float Soil density. Used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "lb/ft^3^", - legal_range: "*x* $>$ 0", - default: "115", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lb/ft^3^", + "legal_range": "*x* $>$ 0", + "default": "115", + "required": "No", + "variability": "constant" + }) +}} -**farFieldWidth=*float*** +### farFieldWidth + +Type: float Far-field width. Distance from foundation to the lateral, zero-flux boundary condition. Used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "130", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "130", + "required": "No", + "variability": "constant" + }) +}} -**deepGrndCnd=*choice*** +### deepGrndCnd + +Type: choice Deep-ground boundary condition type. Choices are WATERTABLE (i.e., a defined temperature) or ZEROFLUX. -<%= member_table( - legal_range: "WATERTABLE, ZEROFLUX", - default: "ZEROFLUX", - required: "No", - variability: "constant") %> +{{ + member_table({ + "legal_range": "WATERTABLE, ZEROFLUX", + "default": "ZEROFLUX", + "required": "No", + "variability": "constant" + }) +}} + +### deepGrndDepth -**deepGrndDepth=*float*** +Type: float Deep-ground depth. Distance from exterior grade to the deep-ground boundary. Used in two-dimensional finite difference calculations for FOUNDATIONs. -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "130", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "130", + "required": "No", + "variability": "constant" + }) +}} -**deepGrndT=*float*** +### deepGrndT + +Type: float Deep-ground temperature. Used when deepGrndCnd=WATERTABLE. -<%= member_table( - units: "F", - legal_range: "*x* $>$ 0", - default: "Annual average drybulb temperature", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "F", + "legal_range": "*x* $>$ 0", + "default": "Annual average drybulb temperature", + "required": "No", + "variability": "hourly" + }) +}} @@ -812,17 +1106,16 @@ Deep-ground temperature. Used when deepGrndCnd=WATERTABLE. CSE supports an optional comma-separated (CSV) text file that provides hourly TDV values for electricity and fuel. TDV values are read along with the weather file and the values merged with weather data. Several daily statistics are calculated for use via probes. The file has no other effect on the simulation. Only full-year TDV files are supported. -The format of a TDV file is the same as an [IMPORTFILE](#importfile) with the proviso that the 4 line header is not optional and certain header items must have specified values. In the following table, non-italic items must be provided as shown (with optional quotes). +The format of a TDV file is the same as an [IMPORTFILE][importfile] with the proviso that the 4 line header is not optional and certain header items must have specified values. In the following table, non-italic items must be provided as shown (with optional quotes). -<%= csv_table(< true) -**Line** **Contents** **Notes** +{{ + csv_table("**Line** **Contents** **Notes** 1, TDV Data (TDV/Btu), *runNumber*, *runNumber* is not checked 2, *timestamp* optionally in quotes accessible via @TOP.TDVFileTimeStamp 3, *title*, hour *title* (in quotes if it contains commas) accessible via @TOP.TDVFileTitle 4, tdvElec, tdvFuel comma separated column names (optionally in quotes)\ not checked -5 .., *valElec*,*valFuel* comma separated numerical values (8760 or 8784 rows) tdvElec is always in column 1, tdvFuel always in column 2 column names in row 4 do not determine order -END -%> +5 .., *valElec*,*valFuel* comma separated numerical values (8760 or 8784 rows) tdvElec is always in column 1, tdvFuel always in column 2 column names in row 4 do not determine order", True) +}} Example TDV file -- @@ -845,8 +1138,8 @@ Note: additional columns can be included and are ignored. The table below shows probes available for accessing TDV data in expressions. Except as noted, daily values are updated based on standard time, so they may be inaccurate by small amounts when daylight savings time is in effect. -<%= csv_table(< true) -**Probe**, **Variability**, **Description** +{{ + csv_table("**Probe**, **Variability**, **Description** @Weather.tdvElec, Hour, current hour electricity TDV @Weather.tdvFuel, Hour, current hour fuel TDV @Weather.tdvElecPk, Day, current day peak electricity TDV (includes future hours). Updated at hour 23 during daylight savings. @@ -856,147 +1149,206 @@ The table below shows probes available for accessing TDV data in expressions. E @weather.tdvElecHrRank[], Day, hour ranking of TDVElec values. tdvElecHrRank[ 1] is the hour having the highest TDVElec, tdvElecHrRank[ 2] is the next highest, etc. The hour values are adjusted when dayight savings time is in effect, so they remain consistent with system variable $hour. @weatherFile.tdvFileTimeStamp, Constant, TDV file timestamp (line 2 of header) @weatherFile.tdvFileTitle, Constant, TDV file title (line 3 of header) -@Top.tdvFName, Constant, TDV file full path -END -%> +@Top.tdvFName, Constant, TDV file full path", True) +}} + +### TDVfName -**TDVfName=*string*** +Type: string Note: Backslash (\\) characters in path names must be doubled to work properly (e.g. "\\\\data\\\\mytdv.tdv"). Forward slash (/) may be used in place of backslash without doubling. -<%= member_table( - units: "", - legal_range: "file name, path optional", - default: "(no TDV file)", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "file name, path optional", + "default": "(no TDV file)", + "required": "No", + "variability": "constant" + }) +}} ## TOP Report Data Items These items are used in page-formatted report output files. See REPORTFILE, Section 5.245.21, and REPORT, Section 5.25. -**repHdrL=*string*** +### repHdrL + +Type: string Report left header. Appears at the upper left of each report page unless page formatting (rfPageFmt) is OFF. If combined length of repHdrL and repHdrR is too large for the page width, one or both will be truncated. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**repHdrR=*string*** +### repHdrR + +Type: string Report right header. Appears at the upper right of each report page unless page formatting (rfPageFmt) is OFF. If combined length of repHdrL and repHdrR is too large for the page width, one or both will be truncated. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### repLPP -**repLPP=*int*** +Type: int Total lines per page to be assumed for reports. Number of lines used for text (including headers and footers) is repLPP - repTopM - repBotM. -<%= member_table( - units: "lines", - legal_range: "*x* $\\ge$ 50", - default: "66", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lines", + "legal_range": "*x* $\\ge$ 50", + "default": "66", + "required": "No", + "variability": "constant" + }) +}} + +### repTopM -**repTopM=*int*** +Type: int Number of lines to be skipped at the top of each report page (prior to header). -<%= member_table( - units: "lines", - legal_range: "0 $\\geq$ *x* $\\geq$ 12", - default: "3", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lines", + "legal_range": "0 $\\geq$ *x* $\\geq$ 12", + "default": "3", + "required": "No", + "variability": "constant" + }) +}} -**repBotM=*int*** +### repBotM + +Type: int Number of lines reserved at the bottom of each report page. repBotM determines the position of the footer on the page (blank lines after the footer are not actually written). -<%= member_table( - units: "lines", - legal_range: "0 $\\geq$ *x* $\\geq$ 12", - default: "3", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "lines", + "legal_range": "0 $\\geq$ *x* $\\geq$ 12", + "default": "3", + "required": "No", + "variability": "constant" + }) +}} + +### repCPL -**repCPL=*int*** +Type: int Characters per line for report headers and footers, user defined reports, and error messages. CSE writes simple ASCII files and assumes a fixed (not proportional) spaced printer font. Many of the built-in reports now (July 1992) assume a line width of 132 columns. -<%= member_table( - units: "characters", - legal_range: "78 $\\leq$ *x* $\\leq$ 132", - default: "78", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "characters", + "legal_range": "78 $\\leq$ *x* $\\leq$ 132", + "default": "78", + "required": "No", + "variability": "constant" + }) +}} + +### repTestPfx -**repTestPfx=*string*** +Type: string Report test prefix. Appears at beginning of report lines that are expected to differ from prior runs. This is useful for "hiding" lines from text comparison utilities in automated testing schemes. Note: the value specified with command line -x takes precedence over this input. -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} ## TOP Autosizing -**doAutoSize=*choice*** +### doAutoSize + +Type: choice Controls invocation of autosizing phase prior to simulation. -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "NO, unless AUTOSIZE commands in input", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "YES, NO", + "default": "NO, unless AUTOSIZE commands in input", + "required": "No", + "variability": "constant" + }) +}} + +### auszTol -**auszTol=*float*** +Type: float Autosize tolerance. Sized capacity results are deemed final when successive design day calculations produce results within auszTol of the prior iteration. -<%= member_table( - units: "", - legal_range: "", - default: ".005", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": ".005", + "required": "No", + "variability": "constant" + }) +}} -**heatDsTDbO=*float*** +### heatDsTDbO + +Type: float Heating outdoor dry bulb design temperature used for autosizing heating equipment. -<%= member_table( - units: "^o^F", - legal_range: "", - default: "*none*", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "hourly" + }) +}} + +### heatDsTWbO -**heatDsTWbO=*float*** +Type: float Heating outdoor design dry bulb temperature used for autosizing heating equipment. -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\ge$ 0", - default: "derived assuming RH=.7", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* $\\ge$ 0", + "default": "derived assuming RH=.7", + "required": "No", + "variability": "hourly" + }) +}} CSE provides 3 mutually-exclusive methods for specifying cooling design conditions. Each resulting design day is simulated repeatedly until results (e.g. equipment capacities) converge to stable values. Multiple days are typically used to ensure the a range of temperatures and sun positions are considered. @@ -1004,103 +1356,143 @@ CSE provides 3 mutually-exclusive methods for specifying cooling design conditio - Design days (from weather file). One or more dates are specified. Actual days from the weather file are simulated. - Monthly design data. Deprecated method using conditions found in ET1 format weather files. -**coolDsCond=*list of up to 12 DESCONDs*** +### coolDsCond + +Type: *list of up to 12 DESCONDs* Specifies cooling design conditions for cooling autosizing. A comma-separated list of up to 12 DESCOND names can be provided. Each day will be simulated repeatedly using weather conditions generated from DESCOND values. -<%= member_table( - units: "", - legal_range: "*name of DESCOND*", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "*name of DESCOND*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**coolDsDay=*list of up to 12 days*** +### coolDsDay + +Type: *list of up to 12 days* Specifies cooling design days for cooling autosizing. Each day will be simulated repeatedly using weather file conditions for that day. -<%= member_table( - units: "dates", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "dates", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### coolDsMo -**coolDsMo=*list of up to 12 months*** +Type: *list of up to 12 months* Deprecated method for specifying design days for cooling autosizing. Design conditions are taken from ET1 weather file header, however, the limited availale ET1 files do not contain design condition information. -<%= member_table( - units: "months", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "months", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} ## TOP Debug Reporting -**verbose=*int*** +### verbose + +Type: int Controls verbosity of screen remarks. Most possible remarks are generated during autosizing of CNE models. Little or no effect in CSE models. TODO: document options -<%= member_table( - units: "", - legal_range: "0 - 5", - default: "1", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "0 - 5", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} The following dbgPrintMask values provide bitwise control of addition of semi-formated internal results to the run report file. The values and format of debugging reports are modified as required for testing purposes. -**dbgPrintMaskC=*int*** +### dbgPrintMaskC + +Type: int Constant portion of debug reporting control. -<%= member_table( - units: "", - legal_range: "", - default: "0", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### dbgPrintMask -**dbgPrintMask=*int*** +Type: int Hourly portion of debug reporting control (generally an expression that evaluates to non-0 only on days or hours of interest). -<%= member_table( - units: "", - legal_range: "", - default: "0", - required: "No", - variability: "hourly") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "hourly" + }) +}} -**dbgFlag=*int*** +### dbgFlag + +Type: int Allows passing an input value to ad-hoc debugging code. No permanent use; no impact on results. -<%= member_table( - units: "", - legal_range: "", - default: "0", - required: "No", - variability: "subhourly") %> +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "0", + "required": "No", + "variability": "subhourly" + }) +}} + +### doCoverage -**doCoverage=*choice*** +Type: choice Enables expression code coverage reporting. Development aid. -<%= member_table( - units: "", - legal_range: "NO, YES", - default: "*NO*", - required: "No", - variability: "constant") %> +{{ + member_table({ + "units": "", + "legal_range": "NO, YES", + "default": "*NO*", + "required": "No", + "variability": "constant" + }) +}} **Related Probes:** -- @[top](#p_top) -- @[weatherFile](#p_weatherfile) -- @[weather](#p_weather) -- @[weatherNextHour](#p_weathernexthour) +- @[top][p_top] +- @[weatherFile][p_weatherfile] +- @[weather][p_weather] +- @[weatherNextHour][p_weathernexthour] diff --git a/doc/test/resources/towerplant.md b/doc/src/docs/input-data/towerplant.md similarity index 51% rename from doc/test/resources/towerplant.md rename to doc/src/docs/input-data/towerplant.md index 4662bae5f..811e7fea3 100644 --- a/doc/test/resources/towerplant.md +++ b/doc/src/docs/input-data/towerplant.md @@ -10,72 +10,123 @@ All the towers in a TOWERPLANT are identical, except that under LEAD staging, th There is no provision for scheduling a TOWERPLANT: it operates whenever the heat rejection pump in one or more of its associated CHILLERs or HPLOOP heat exchangers operates. However, the setpoint for the water leaving the TOWERPLANT is hourly schedulable. -**towerplantName** +### towerplantName Name of TOWERPLANT object, given immediately after the word TOWERPLANT to begin the object's input. The name is used to refer to the TOWERPLANT in COOLPLANTs and HPLOOPs. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "", + "required": "Yes", + "variability": "constant" + }) +}} -**tpTsSp=*float*** + +### tpTsSp + +Type: float Setpoint temperature for water leaving towers. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No hourly +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "85", + "required": "No", + "variability": "hourly" + }) +}} -**tpMtr=*name of a METER*** +### tpMtr + +Type: *name of a METER* METER object by which TOWERPLANT's fan input energy is to be recorded, in category "Aux". If omitted, energy use is not recorded, and thus cannot be reported. Towerplants have no modeled input energy other than for their fans (the heat rejection pumps are part of the CHILLER and HPLOOP objects). - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *name of a METER* *none* No constant +{{ + member_table({ + "units": "", + "legal_range": "*name of a METER*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} -**tpStg=*choice*** +### tpStg -How tower fans are staged to meet the load: +Type: choice - ----------- ---------------------------------------------------------- - TOGETHER All fans operate at the same speed or cycle on and off - together. +How tower fans are staged to meet the load: - LEAD A single "Lead" tower's fan is modulated as required and - as many additional fans as necessary run at their (single) - full speed. - ----------- ---------------------------------------------------------- +{{ + csv_table("TOGETHER, All fans operate at the same speed or cycle on and off together. +LEAD, A single \"Lead\" tower's fan is modulated as required and as many additional fans as necessary run at their (single) full speed.") +}} Whenever the heat rejection pump in a CHILLER or HPLOOP heat exchanger is on, the water flows through all towers in the TOWERPLANT, regardless of the number of fans operating. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - TOGETHER, LEAD TOGETHER No constant +{{ + member_table({ + "units": "", + "legal_range": "TOGETHER, LEAD", + "default": "TOGETHER", + "required": "No", + "variability": "constant" + }) +}} + +### ctN -**ctN=*integer*** +Type: integer Number of towers in the TOWERPLANT. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 1 No constant +{{ + member_table({ + "units": "", + "legal_range": "*x* > 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} -**ctType=*choice*** +### ctType + +Type: choice Cooling tower fan control type: ONESPEED, TWOSPEED, or VARIABLE. This applies to all towers under TOGETHER staging. For LEAD staging, *ctType* applies only to the lead tower; additional towers have ONESPEED fans. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------ ------------- -------------- ----------------- - ONESPEED, TWOSPEED, VARIABLE ONESPEED No constant +{{ + member_table({ + "units": "", + "legal_range": "ONESPEED, TWOSPEED, VARIABLE", + "default": "ONESPEED", + "required": "No", + "variability": "constant" + }) +}} + +### ctLoSpd -**ctLoSpd=*float*** +Type: float Low speed for TWOSPEED fan, as a fraction of full speed cfm. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1 0.5 No constant +{{ + member_table({ + "units": "", + "legal_range": "0 < *x* $\le$ 1", + "default": "0.5", + "required": "No", + "variability": "constant" + }) +}} Note: full speed fan cfm is given by *ctVfDs*, below. @@ -83,23 +134,39 @@ The rest of the input variables apply to each tower in the group; the towers are The following two inputs permit computation of the tower fan electrical energy consumption: -**ctShaftBhp=*float*** +### ctShaftBhp + +Type: float Shaft brake horsepower of each tower fan motor. The default value is the sum of the rejected (condenser) heats (including pump heat) at design conditions of the most powerful stage of each connected COOLPLANT, plus the design capacity of each connected HPLOOP heat exchanger, all divided by 290,000 and by the number of cooling towers in the TOWERPLANT. - **Units** **Lgl Range** **Default** **Req'd** **Variability** - ----------- --------------- ----------------------------- ----------- ----------------- - Bhp *x* > 0 (sum of loads)/290000/*cTn* No constant +{{ + member_table({ + "units": "Bhp", + "legal_range": "*x* > 0", + "default": "(sum of loads)/290000/*cTn*", + "required": "No", + "variability": "constant" + }) +}} + +### ctMotEff -**ctMotEff=*float*** +Type: float Motor (and drive, if any) efficiency for tower fans. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 .88 No constant +{{ + member_table({ + "units": "", + "legal_range": "*x* > 0", + "default": ".88", + "required": "No", + "variability": "constant" + }) +}} The next four items specify the coefficients of polynomial curves relating fan power consumption to average speed (cfm) for the various fan types. For the non-variable speed cases CSE uses linear polynomials of the form @@ -109,147 +176,277 @@ where *p* is the power consumption as a fraction of full speed power consumption For each linear polynomial, two *float* expressions are given, separated by a comma. The first expression is the constant, *a*. The second expression is the coefficient of the average speed, *b*. Except for *ctFcLo*, *a* and *b* should add up to 1, to make the relative power consumption 1 when *spd* is 1; otherwise, CSE will issue a warning message and normalize them. -**ctFcOne=*a, b*** +### ctFcOne + +Type: *a, b* Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for ONESPEED fan. For the one-speed case, the relative average speed *spd* is the fraction of the time the fan is on. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *a + b = 1.0* 0, 1 No constant +{{ + member_table({ + "units": "", + "legal_range": "*a + b = 1.0*", + "default": "0, 1", + "required": "No", + "variability": "constant" + }) +}} + +### ctFcLo -**ctFcLo=*a, b*** +Type: *a, b* Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for low speed of TWOSPEED fan, when *spd* $\le$ *ctLoSpd*. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------- -------------- ----------------- - *a + b = 1.0* 0, *ctLoSpd^2^* No constant +{{ + member_table({ + "units": "", + "legal_range": "*a + b = 1.0*", + "default": "0, *ctLoSpd^2^*", + "required": "No", + "variability": "constant" + }) +}} -**ctFcHi=*a, b*** +### ctFcHi + +Type: *a, b* Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for high speed of TWOSPEED fan, when *spd* > *ctLoSpd*. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------------- -------------- ----------------- - *a + b = 1.0* *-ctLoSpd^2^ - ctLoSpd, ctLoSpd^2^ + ctLoSpd + 1* No constant +{{ + member_table({ + "units": "", + "legal_range": "*a + b = 1.0*", + "default": "*-ctLoSpd^2^ - ctLoSpd, ctLoSpd^2^ + ctLoSpd + 1*", + "required": "No", + "variability": "constant" + }) +}} + +### ctFcVar -**ctFcVar=*a, b, c, d*** +Type: *a, b, c, d* For VARIABLE speed fan, four *float* values for coefficients of cubic fan power consumption polynomial of the form $p = a + b \cdot \text{spd} + c \cdot \text{spd}^2 + d \cdot \text{spd}^3$. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - *a + b + c + d = 1.0* 0, 0, 0, 1 No constant +{{ + member_table({ + "units": "", + "legal_range": "*a + b + c + d = 1.0*", + "default": "0, 0, 0, 1", + "required": "No", + "variability": "constant" + }) +}} The next six items specify the tower performance under one set of conditions, the "design conditions". The conditions should be chosen to be representative of full load operating conditions. -**ctCapDs=*float*** +### ctCapDs + +Type: float Design capacity: amount of heat extracted from water under design conditions by one tower. The default value is the sum of the rejected (condenser) heats (including pump heat) at design conditions of the most powerful stage of each connected COOLPLANT, plus the design capacity of each connected HPLOOP heat exchanger, all divided by the number of towers. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - Btuh *x* $\neq$ 0 (sum of loads)/*ctN* No constant +{{ + member_table({ + "units": "Btuh", + "legal_range": "*x* $\neq$ 0", + "default": "(sum of loads)/*ctN*", + "required": "No", + "variability": "constant" + }) +}} + +### ctVfDs -**ctVfDs=*float*** +Type: float Design air flow, per tower; also the fan full-speed cfm specification. The default value is the sum of the loads (computed as for *ctCapDs*, just above) divided by 51, divided by the number of cooling towers. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - cfm *x* > 0 (sum of loads)/51/*ctN* No constant +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* > 0", + "default": "(sum of loads)/51/*ctN*", + "required": "No", + "variability": "constant" + }) +}} -**ctGpmDs=*float*** +### ctGpmDs + +Type: float Design water flow, per tower. The default is the sum of the flows of the connected heat rejection pumps, using the largest stage for COOLPLANTs, divided by the number of towers. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - gpm *x* > 0 (sum of pumps)/*ctN* No constant +{{ + member_table({ + "units": "gpm", + "legal_range": "*x* > 0", + "default": "(sum of pumps)/*ctN*", + "required": "No", + "variability": "constant" + }) +}} + +### ctTDbODs -**ctTDbODs=*float*** +Type: float Design outdoor drybulb temperature (needed to convert *ctVfDs* from cfm to lb/hr). - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 93.5 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "93.5", + "required": "No", + "variability": "constant" + }) +}} -**ctTWbODs=*float*** +### ctTWbODs + +Type: float Design outdoor wetbulb temperature. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 78 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "78", + "required": "No", + "variability": "constant" + }) +}} + +### ctTwoDs -**ctTwoDs=*float*** +Type: float Design leaving water temperature. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "85", + "required": "No", + "variability": "constant" + }) +}} The following six items allow optional specification of tower performance under another set of conditions, the "off design" conditions. If given, they allow CSE to compute the tower's relation between flows and heat transfer; in this case, *ctK* (below) may not be given. -**ctCapOd=*float*** +### ctCapOd + +Type: float Off-design capacity, per tower. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - Btuh *x* $\neq$ 0 (sum of loads)/*ctN* No constant +{{ + member_table({ + "units": "Btuh", + "legal_range": "*x* $\neq$ 0", + "default": "(sum of loads)/*ctN*", + "required": "No", + "variability": "constant" + }) +}} + +### ctVfOd -**ctVfOd=*float*** +Type: float Off-design air flow, per tower. Must differ from design air flow; thus *ctVfDs* and *ctVfOd* cannot both be defaulted if off-design conditions are being given. The off-design air and water flows must be chosen so that maOd/mwOd $\neq$ maDs/mwDs. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------------- ------------------------- -------------- ----------------- - cfm *x* > 0; *x* $\neq$ *ctVfDs* (sum of loads)/51/*ctN* No constant +{{ + member_table({ + "units": "cfm", + "legal_range": "*x* > 0; *x* $\neq$ *ctVfDs*", + "default": "(sum of loads)/51/*ctN*", + "required": "No", + "variability": "constant" + }) +}} -**ctGpmOd=*float*** +### ctGpmOd + +Type: float Off-design water flow, per tower. Must differ from design water flow; thus, both cannot be defaulted if off-design conditions are being given. Value must be chosen so that maOd/mwOd $\neq$ maDs/mwDs. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------- ---------------------- -------------- ----------------- - gpm *x* > 0; *x* $\neq$ *ctGpmDs* (sum of pumps)/*ctN* No constant +{{ + member_table({ + "units": "gpm", + "legal_range": "*x* > 0; *x* $\neq$ *ctGpmDs*", + "default": "(sum of pumps)/*ctN*", + "required": "No", + "variability": "constant" + }) +}} + +### ctTDbOOd -**ctTDbOOd=*float*** +Type: float Off-design outdoor drybulb temperature. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 93.5 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "93.5", + "required": "No", + "variability": "constant" + }) +}} -**ctTWbOOd=*float*** +### ctTWbOOd + +Type: float Off-design outdoor wetbulb temperature. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 78 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "78", + "required": "No", + "variability": "constant" + }) +}} + +### ctTwoOd -**ctTwoOd=*float*** +Type: float Off-design leaving water temperature. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "85", + "required": "No", + "variability": "constant" + }) +}} The following item allows explicit specification of the relationship between flows and heat transfer, when the preceding "off design" inputs are not given. If omitted, it will be computed from the "off design" inputs if given, else the default value of 0.4 will be used. -**ctK=*float*** +### ctK + +Type: float Optional. Exponent in the formula @@ -257,50 +454,86 @@ $$\text{ntuA} = k \cdot (mwi/ma)^{ctK}$$ where ntuA is the number of transfer units on the air side, mwi and ma are the water and air flows respectively, and k is a constant. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------------------------------- -------------- ----------------- - 0 < *x* < 1 *from "Od" members if given, else* 0.4 No constant +{{ + member_table({ + "units": "", + "legal_range": "0 < *x* < 1", + "default": "*from \"Od\" members if given, else* 0.4", + "required": "No", + "variability": "constant" + }) +}} + +### ctStkFlFr -**ctStkFlFr=*float*** +Type: float Fraction of air flow which occurs when tower fan is off, due to stack effect (convection). Cooling due to this air flow occurs in all towers whenever the water flow is on, and may, by itself, cool the water below the setpoint *tpTsSp*. Additional flow, when fan is on, is proportional to fan speed. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .18 No constant +{{ + member_table({ + "units": "", + "legal_range": "0 $\le$ *x* $\le$ 1", + "default": ".18", + "required": "No", + "variability": "constant" + }) +}} The following items allow CSE to compute the effect of makeup water on the leaving water temperature. -**ctBldn=*float*** +### ctBldn + +Type: float Blowdown rate: fraction of inflowing water that is bled from the sump down the drain, to reduce the buildup of impurities that don't evaporate. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .01 No constant +{{ + member_table({ + "units": "", + "legal_range": "0 $\le$ *x* $\le$ 1", + "default": ".01", + "required": "No", + "variability": "constant" + }) +}} + +### ctDrft -**ctDrft=*float*** +Type: float Drift rate: fraction of inflowing water that is blown out of tower as droplets without evaporating. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0 No constant +{{ + member_table({ + "units": "", + "legal_range": "0 $\le$ *x* $\le$ 1", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} -**ctTWm=*float*** +### ctTWm + +Type: float Temperature of makeup water from mains, used to replace water lost by blowdown, drift, and evaporation. Blowdown and drift are given by the preceding two inputs; evaporation is computed. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 60 No constant +{{ + member_table({ + "units": "^o^F", + "legal_range": "*x* > 0", + "default": "60", + "required": "No", + "variability": "constant" + }) +}} -**endTowerplant** +### endTowerplant Optionally indicates the end of the TOWERPLANT definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - +*Related Probes:** +- @[towerPlant][p_towerplant] diff --git a/doc/src/docs/input-data/window.md b/doc/src/docs/input-data/window.md new file mode 100644 index 000000000..cdc15b7e5 --- /dev/null +++ b/doc/src/docs/input-data/window.md @@ -0,0 +1,527 @@ +# WINDOW + +WINDOW defines a subobject belonging to the current SURFACE that represents one or more identical windows. The azimuth, tilt, and exterior conditions of the window are the same as those of the surface to which it belongs. The total window area (*wnHt* $\cdot$ *wnWid* $\cdot$ *wnMult*) is deducted from the gross surface area. A surface may have any number of windows. + +Windows may optionally have operable interior shading that reduces the overall shading coefficient when closed. + +### wnName + +Name of window: follows the word "WINDOW" if given. + +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### wnHeight + +Type: float + +Overall height of window (including frame). + +{{ + member_table({ + "units": "ft", + "legal_range": "x $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### wnWidth + +Type: float + +Overall width of window (including frame). + +{{ + member_table({ + "units": "ft", + "legal_range": "x $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### wnArea + +Type: float + +Overall area of window (including frame). + +{{ + member_table({ + "units": "ft^2^", + "legal_range": "x $>$ 0", + "default": "*wnHeight* \* *wnWidth*", + "required": "No", + "variability": "constant" + }) +}} + +### wnMult + +Type: float + +Area multiplier; can be used to represent multiple identical windows. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### wnModel + +Type: choice + +Selects window model + +{{ + member_table({ + "units": "", + "legal_range": "SHGC, ASHWAT", + "default": "SHGC", + "required": "No", + "variability": "constant" + }) +}} + +### wnGt + +Type: choice + +GLAZETYPE for window. Provides many defaults for window properties as cited below. + +### wnU + +Type: float + +Window conductance (U-factor without surface films, therefore not actually a U-factor but a C-factor). + +Preferred Approach: To use accurately with standard winter rated U-factor from ASHRAE or NFRC enter as: + + wnU = (1/((1/U-factor)-0.85) + +Where 0.85 is the sum of the interior (0.68) and exterior (0.17) design air film resistances assumed for rating window U-factors. Enter wnInH (usually 1.5=1/0.68) instead of letting it default. Enter the wnExH or let it default. It is important to use this approach if the input includes gnFrad for any gain term. Using approach 2 below will result in an inappropriate internal gain split at the window. + +Approach 2. Enter wnU=U-factor and let the wnInH and wnExH default. Tnormally this approach systematically underestimates the window U-factor because it adds the wnExfilm resistance to 1/U-factor thereby double counting the exterior film resistance. This approach will also yield incorrect results for gnFrad internal gain since the high wnInH will put almost all the gain back in the space. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "x $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### wnUNFRC + +Type: float + +Fenestration system (including frame) U-factor evaluated at NFRC heating conditions. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "x $>$ 0", + "default": "gtUNFRC", + "required": "Required when *wnModel* = ASHWAT", + "variability": "constant" + }) +}} + +### wnExEpsLW + +Type: float + +Window exterior long wave (thermal) emittance. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.84", + "required": "No", + "variability": "constant" + }) +}} + +### wnInEpsLW + +Type: float + +Window interior long wave (thermal) emittance. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\le$ *x* $\\le$ 1", + "default": "0.84", + "required": "No", + "variability": "constant" + }) +}} + +### wnInH + +Type: float + +Window interior surface (air film) conductance. + +Preferred Approach: Enter the appropriate value for each window, normally: + + wnInH = 1.5 + + where 1.5 = 1/0.68 the standard ASHRAE value. + +The large default value of 10,000 represents a near-0 resistance, for the convenience of those who wish to include the interior surface film in wnU according to approach 2 above. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "x $>$ 0", + "default": "10000", + "required": "No", + "variability": "constant" + }) +}} + +### wnExH + +Type: float + +Window exterior surface (air film) conductance. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "x $>$ 0", + "default": "same as owning surface", + "required": "No", + "variability": "constant" + }) +}} + +Several models are available for calculating inside and outside surface convective coefficients. Inside surface faces can be exposed only to zone conditions. Outside faces may be exposed either to ambient conditions or zone conditions, based on wnExCnd. Only UNIFIED and INPUT are typically used. The other models were used during CSE development for comparison. For details, see CSE Engineering Documentation. + +{{ + csv_table("Model, Exposed to ambient, Exposed to zone +UNIFIED, default CSE model, default CSE model +INPUT , hc = wnExHcMult, hc = wnxxHcMult +AKBARI , Akbari model, n/a +WALTON , Walton model, n/a +WINKELMANN, Winkelmann model, n/a +MILLS , n/a , Mills model +ASHRAE , n/a , ASHRAE handbook values", True) +}} + +### wnExHcModel + +Type: choice + +Selects the model used for exterior surface convection. + +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "UNIFIED", + "required": "No", + "variability": "constant" + }) +}} + +### wnExHcLChar + +Type: float + +Characteristic length of surface, used in derivation of forced exterior convection coefficients in some models when outside face is exposed to ambient (i.e. to wind). + +{{ + member_table({ + "units": "ft", + "legal_range": "x $>$ 0", + "default": "10", + "required": "No", + "variability": "constant" + }) +}} + +### wnExHcMult + +Type: float + +Exterior convection coefficient adjustment factor. When wnExHcModel=INPUT, hc=wnExHcMult. For other wnExHcModel choices, the model-derived hc is multiplied by wnExHcMult. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### wnInHcModel + +Type: choice + +Selects the model used for the inside (zone) surface convection when wnModel = Forward\_Difference. + +{{ + member_table({ + "units": "", + "legal_range": "*choices above (see wnExHcModel)*", + "default": "UNIFIED", + "required": "No", + "variability": "constant" + }) +}} + +### wnInHcMult + +Type: float + +Interior convection coefficient adjustment factor. When wnInHcModel=INPUT, hc=wnInHcMult. For other wnInHcModel choices, the model-derived hc is multiplied by wnInHcMult. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\ge$ 0", + "default": "1", + "required": "No", + "variability": "subhourly" + }) +}} + +### wnInHcFrcCoeffs + +Type: *float array* + +Specifies 3 coefficients for an alternative inside surface forced convection model (applicable only for wnInHCModel=UNIFIED). When given, the inside surface forced convection coefficient for this surface is derived as follows: + + hcFrc = hConvF * (wnInHcFrcCoeffs[ 1] + wnInHcFrcCoeffs[ 2] * ACH ^ wnInHcFrcCoeffs[ 3]) + +where hConvF is the convection adjustment factor (derived from elevation, see Top hConvMod) and ACH is the zone air change rate per hour from the prior simulation step (including heat pump water heater evaporator air flow). This formulation is dangerously flexible, so caution is advised when selecting coefficient values. + +The default hcFrc value (used when wnInHcFrCoeff is not provided) is hConvF * znHcFrcF * ACH ^ 0.8. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": "", + "default": "*inherited from parent surface*", + "required": "No", + "variability": "subhourly" + }) +}} + +### wnSHGC + +Type: float + +Rated Solar Heat Gain Coefficient (SHGC) for the window assembly. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 < x < 1", + "default": "gtSHGC", + "required": "No", + "variability": "constant" + }) +}} + +### wnFMult + +Type: float + +Frame area multiplier = areaGlaze / areaAssembly + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 < x < 1", + "default": "gtFMult or 1", + "required": "No", + "variability": "constant" + }) +}} + +### wnSMSO + +Type: float + +SHGC multiplier with shades open. Overrides gtSMSO. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "gtSMSO or 1", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### wnSMSC + +Type: float + +SHGC multiplier with shades closed. Overrides gtSMSC + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\leq$ *x* $\leq$ 1", + "default": "wnSMSO or gtSMSC", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### wnNGlz + +Type: int + +Number of glazings in the window (bare glass only, not including any interior or exterior shades). + +{{ + member_table({ + "units": "", + "legal_range": "0 $<$ *x* $\leq$ 4", + "default": "gtNGLZ", + "required": "Required when *wnModel* = ASHWAT", + "variability": "constant" + }) +}} + +### wnExShd + +Type: choice + +Exterior shading type (ASHWAT only). + +{{ + member_table({ + "units": "", + "legal_range": "NONE, INSCRN", + "default": "gtExShd", + "required": "No", + "variability": "constant" + }) +}} + +### wnInShd + +Type: choice + +Interior shade type (ASHWAT only). + +{{ + member_table({ + "units": "", + "legal_range": "NONE, DRAPEMED", + "default": "gtInShd", + "required": "No", + "variability": "constant" + }) +}} + +### wnDirtLoss + +Type: float + +Glazing dirt loss factor. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### wnGrndRefl + +Type: float + +Ground reflectivity for this window. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "sfGrndRefl", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### wnVfSkyDf + +Type: float + +View factor from this window to sky for diffuse radiation. For the shading effects of an overhang, a wnVfSkyDf value smaller than the default would be used + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ x $\\leq$ 1", + "default": "0.5 - 0.5 cos(tilt) = .5 for vertical surface", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### wnVfGrndDf + +Type: float + +View factor from this window to ground for diffuse radiation. For the shading effects of a fin(s), both wnVfSkyDf and wnVfGrndDf would be used. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ x $\\leq$ 1", + "default": "0.5 + 0.5 .5 for vertical surface", + "required": "No", + "variability": "Monthly - Hourly" + }) +}} + +### endWINDOW + +Optionally indicates the end of the window definition. Alternatively, the end of the window definition can be indicated by END or the declaration of another object. END or endWindow, if used, should follow any subobjects of the window (SHADEs and/or SGDISTs). + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[window][p_window] +- @[xsurf][p_xsurf] diff --git a/doc/src/docs/input-data/zone.md b/doc/src/docs/input-data/zone.md new file mode 100644 index 000000000..54e77fbe9 --- /dev/null +++ b/doc/src/docs/input-data/zone.md @@ -0,0 +1,616 @@ +# ZONE + +ZONE constructs an object of class ZONE, which describes an area of the building to be modeled as having a uniform condition. ZONEs are large, complex objects and can have many subobjects that describe associated surfaces, shading devices, HVAC equipment, etc. + +## ZONE General Members + +### znName + +Name of zone. Enter after the word ZONE; no "=" is used. + +{{ + member_table({ + "units": "", + "legal_range": "*63 characters*", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### znModel + +Type: choice + +Selects model for zone. + +{{ + csv_table("CNE, Older central difference model based on original CALPAS methods. Not fully supported and not suitable for current compliance applications. +CZM, Conditioned zone model. Forward-difference, short time step methods are used. +UZM, Unconditioned zone model. Identical to CZM except heating and cooling are not supported. Typically used for attics, garages, and other ancillary spaces.") +}} + +{{ + member_table({ + "units": "", + "legal_range": "*choices above*", + "default": "CNE", + "required": "No", + "variability": "constant" + }) +}} + +### znArea + +Type: float + +Nominal zone floor area. + +{{ + member_table({ + "units": "ft^2^", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### znVol + +Type: float + +Nominal zone volume. + +{{ + member_table({ + "units": "ft^3^", + "legal_range": "*x* $>$ 0", + "default": "*none*", + "required": "Yes", + "variability": "constant" + }) +}} + +### znAzm + +Type: float + +Zone azimuth with respect to bldgAzm. All surface azimuths are relative to znAzm, so that the zone can be rotated by changing this member only. Values outside the range 0^o^ to 360^o^ are normalized to that range. + +{{ + member_table({ + "units": "degrees", + "legal_range": "unrestricted", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### znFloorZ + +Type: float + +Nominal zone floor height relative to arbitrary 0 level. Used re determination of vent heights + +{{ + member_table({ + "units": "ft", + "legal_range": "unrestricted", + "default": "0", + "required": "No", + "variability": "constant" + }) +}} + +### znCeilingHt + +Type: float + +Nominal zone ceiling height relative to zone floor (typically 8 – 10 ft). + +{{ + member_table({ + "units": "ft", + "legal_range": "*x* $>$ 0", + "default": "*znVol* / *znArea*", + "required": "No", + "variability": "constant" + }) +}} + +### znEaveZ + +Type: float + +Nominal eave height above ground level. Used re calculation of local surface wind speed. This in turn influences outside convection coefficients in some surface models and wind-driven air leakage. + +{{ + member_table({ + "units": "ft", + "legal_range": "x $>$ 0", + "default": "*znFloorZ + infStories\*8*", + "required": "No", + "variability": "constant" + }) +}} + +### znCAir + +Type: float + +Zone "air" heat capacity: represents heat capacity of air, furniture, "light" walls, and everything in zone except surfaces having heat capacity (that is, non-QUICK surfaces). + +{{ + member_table({ + "units": "Btu/^o^F", + "legal_range": "x $\\geq$ 0", + "default": "3.5 \* *znArea*", + "required": "No", + "variability": "constant" + }) +}} + +### znHcAirX + +Type: float + +Zone air exchange rate used in determination of interior surface convective coefficients. This item is generally used only for model testing. + +{{ + member_table({ + "units": "ACH", + "legal_range": "x $>$ 0", + "default": "as modeled", + "required": "No", + "variability": "subhourly" + }) +}} + +### znHcFrcF + +Type: float + +Zone surface forced convection factor. Default interior surface convective transfer is modeled as a combination of forced and natural convection. hcFrc = znHcFrcF * ACH^.8, where ACH = znHcAirX + heat pump water heater evaporator air exchange rate See CSE Engineering Documentation. + +{{ + member_table({ + "units": "Btuh/ft^2^-^o^F", + "legal_range": ".2", + "default": ".2", + "required": "No", + "variability": "hourly" + }) +}} + +### znHIRatio + +Type: float + +Zone hygric inertia ratio. In zone moisture balance calculations, the effective dry-air mass = znHIRatio * (zone dry air mass). This enhancement can be used to represente the moisture storage capacity of zone surfaces and contents. + +{{ + member_table({ + "units": "", + "legal_range": "x $>$ 0", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### znSC + +Type: float + +Zone shade closure. Determines insolation through windows (see WINDOW members *wnSCSO* and *wnSCSC*) and solar gain distribution: see SGDIST members *sgFSO* and *sgFSC*. 0 represents shades open; 1 represents shades closed; intermediate values are allowed. An hourly variable CSE expression may be used to schedule shade closure as a function of weather, time of year, previous interval HVAC use or zone temperature, etc. + +{{ + member_table({ + "units": "", + "legal_range": "0 $\\leq$ *x* $\\leq$ 1", + "default": "1 when cooling was used in *previous* hour, else 0", + "required": "No", + "variability": "hourly" + }) +}} + +### znTH + +Type: float + +Heating set point used (and required) when znModel=CZM and zone has no terminals. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "0 < znTH < znTC", + "default": "*none*", + "required": "Per above", + "variability": "subhourly" + }) +}} + +### znTD + +Type: float + +Desired set point (temperature maintained with ventilation if possible) for znModel=CZM. Must be specified when zone ventilation is active. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "x > 0; znTH < znTD < znTC", + "default": "*none*", + "required": "if venting", + "variability": "subhourly" + }) +}} + +### znTC + +Type: float + +Cooling set point used (and required) when znModel=CZM and zone has no terminals. + +{{ + member_table({ + "units": "^o^F", + "legal_range": "0 < znTC > znTH", + "default": "*none*", + "required": "Per above", + "variability": "subhourly" + }) +}} + +znModel = CZM zone heating and cooling is provided either via an RSYS HVAC system, by "magic" heat transfers specified by znQxxx items, or via TERMINAL (s). One of these must be defined. + +### znRSys + +Type: rsysName + +Name of RSYS providing heating, cooling, and optional central fan integrated ventilation to this zone. + +{{ + member_table({ + "units": "", + "legal_range": "*RSYS name*", + "default": "(no RSYS)", + "required": "No", + "variability": "constant" + }) +}} + +### znQMxH + +Type: float + +Heating capacity at current conditions + +{{ + member_table({ + "units": "Btuh", + "legal_range": "x $\\geq$ 0", + "default": "*none*", + "required": "No", + "variability": "hourly" + }) +}} + +### znQMxHRated + +Type: float + +Rated heating capacity + +{{ + member_table({ + "units": "Btuh", + "legal_range": "x $\\geq$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +### znQMxC + +Type: float + +Cooling capacity at current conditions + +{{ + member_table({ + "units": "Btuh", + "legal_range": "x $\\leq$ 0", + "default": "*none*", + "required": "No", + "variability": "hourly" + }) +}} + +### znQMxCRated + +Type: float + +Rated cooling capacity + +{{ + member_table({ + "units": "Btuh", + "legal_range": "x $\\leq$ 0", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +## ZONE Infiltration + +The following control a simplified air change plus leakage area model. The Sherman-Grimsrud model is used to derive air flow rate from leakage area and this rate is added to the air changes specified with infAC. Note that TOP.windF does *not* modify calculated infiltration rates, since the Sherman-Grimsrud model uses its own modifiers. See also AirNet models available via IZXFER. + +### infAC + +Type: float + +Zone infiltration air changes per hour. + +{{ + member_table({ + "units": "1/hr", + "legal_range": "x $\\geq$ 0", + "default": "0.5", + "required": "No", + "variability": "hourly" + }) +}} + +### infELA + +Type: float + +Zone effective leakage area (ELA). + +{{ + member_table({ + "units": "in^2^", + "legal_range": "x $\\geq$ 0", + "default": "0.0", + "required": "No", + "variability": "hourly" + }) +}} + +### infShld + +Type: int + +Zone local shielding class, used in derivation of local wind speed for ELA infiltration model, wind-driven AirNet leakage, and exterior surface coefficients. infShld values are -- + +{{ + csv_table("1, no obstructions or local shielding + 2, light local shielding with few obstructions + 3, moderate local shielding, some obstructions within two house heights + 4, heavy shielding, obstructions around most of the perimeter + 5, very heavy shielding, large obstructions surrounding the perimeter within two house heights") +}} + +{{ + member_table({ + "units": "", + "legal_range": "1 $\\leq$ *x* $\\leq$ 5", + "default": "3", + "required": "No", + "variability": "constant" + }) +}} + +### infStories + +Type: int + +Number of stories in zone, used in ELA model. + +{{ + member_table({ + "units": "", + "legal_range": "1 $\\leq$ *x* $\\leq$ 3", + "default": "1", + "required": "No", + "variability": "constant" + }) +}} + +### znWindFLkg + +Type: float + +Wind speed modifier factor. The weather file wind speed is multiplied by this factor to yield a local wind speed for use in infiltration and convection models. + +{{ + member_table({ + "units": "", + "legal_range": "x $\\geq$ 0", + "default": "derived from znEaveZ and infShld", + "required": "No", + "variability": "constant" + }) +}} + +### znAFMtr + +Type: afMtrName + +Name of an AFMETER object, if any, to which zone AirNet air flows are recorded. *ZnAFMtr* defines a pressure boundary for accounting purposes. Multiple zones having the same AFMETER are treated as a single volume -- interzone flows within that volume are not recorded. For example, to obtain "building total" flow data, a common AFMETER could be assigned to several conditioned zones but not to adjacent unconditioned zones such as attic spaces. + +{{ + member_table({ + "units": "", + "legal_range": "*name of an AFMETER*", + "default": "*not recorded*", + "required": "No", + "variability": "constant" + }) +}} + +### znLoadMtr + +Type: ldMtrName + +Name of a LOADMETER object, if any, to which zone heating and cooling loads are recorded. + +{{ + member_table({ + "units": "", + "legal_range": "*name of a LOADMETER*", + "default": "*not recorded*", + "required": "No", + "variability": "constant" + }) +}} + +## ZONE Exhaust Fan + +Presence of an exhaust fan in a zone is indicated by specifying a non-zero design flow value (xfanVfDs). + +Zone exhaust fan model implementation is incomplete as of July, 2011. The current code calculates energy use but does not account for the effects of air transfer on room heat balance. IZXFER provides a more complete implementation. + +### xfanFOn + +Type: float + +Exhaust fan on fraction. On/off control assumed, so electricity requirement is proportional to run time. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ x $\\leq$ 1", + "default": "1", + "required": "No", + "variability": "hourly" + }) +}} + +Example: The following would run an exhaust fan 70% of the time between 8 AM and 5 PM: + + xfanFOn = select( (\$hour >= 7 && \$hour < 5), .7, + default, 0 ); + + +### xfanVfDs + +Type: float + +Exhaust fan design flow; 0 or not given indicates no fan. + +{{ + member_table({ + "units": "cfm", + "legal_range": "x $\\geq$ 0", + "default": "0, no fan", + "required": "If fan present", + "variability": "constant" + }) +}} + +### xfanPress + +Type: float + +Exhaust fan external static pressure. + +{{ + member_table({ + "units": "inches", + "legal_range": "0.05 $\\leq$ *x* $\\leq$ 1.0", + "default": "0.3", + "required": "No", + "variability": "constant" + }) +}} + +Only one of xfanElecPwr, xfanEff, and xfanShaftBhp may be given: together with xfanVfDs and xfanPress, any one is sufficient for CSE to detemine the others and to compute the fan heat contribution to the air stream. + +### xfanElecPwr + +Type: float + +Fan input power per unit air flow (at design flow and pressure). + +{{ + member_table({ + "units": "W/cfm", + "legal_range": "x $>$ 0", + "default": "derived from xfanEff", + "required": "If xfanEff and xfanShaftBhp not present", + "variability": "constant" + }) +}} + +### xfanEff + +Type: float + +Exhaust fan/motor/drive combined efficiency. + +{{ + member_table({ + "units": "fraction", + "legal_range": "0 $\\leq$ x $\\leq$ 1", + "default": "0.08", + "required": "No", + "variability": "constant" + }) +}} + +### xfanShaftBhp + +Type: float + +Fan shaft power at design flow and pressure. + +{{ + member_table({ + "units": "BHP", + "legal_range": "x $>$ 0", + "default": "derived from xfanElecPwr and xfanVfDs", + "required": "If xfanElecPwr not present", + "variability": "constant" + }) +}} + +### xfanMtr + +Type: mtrName + +Name of METER object, if any, by which fan's energy use is recorded (under end use category "fan"). + +{{ + member_table({ + "units": "", + "legal_range": "*name of a METER*", + "default": "*not recorded*", + "required": "No", + "variability": "constant" + }) +}} + +### endZone + +Indicates the end of the zone definition. Alternatively, the end of the zone definition can be indicated by the declaration of another object or by "END". If END or endZone is used, it should follow the definitions of the ZONE's subobjects such as GAINs, SURFACEs, TERMINALs, etc. + +{{ + member_table({ + "units": "", + "legal_range": "", + "default": "*none*", + "required": "No", + "variability": "constant" + }) +}} + +**Related Probes:** + +- @[zone][p_zone] +- @[znRes][p_znres] (accumulated results) diff --git a/doc/src/input-structure.md b/doc/src/docs/input-structure.md similarity index 54% rename from doc/src/input-structure.md rename to doc/src/docs/input-structure.md index 93aa3e2ea..bfd92f55f 100644 --- a/doc/src/input-structure.md +++ b/doc/src/docs/input-structure.md @@ -2,7 +2,7 @@ **DRAFT:** In the following, any text annotated with ?? indicates areas of uncertainty or probable change. As the program and input language develop, these matters will be resolved. -## Introduction {#introduction-1} +## Introduction The CSE Input Language is the fundamental interface to the CSE program. The language has been designed with three objectives in mind: @@ -57,16 +57,6 @@ TODO: review hierarchy SHADE SGDIST DOOR -<% if inactive_CNE_records %> - PERIMETER - TERMINAL - AIRHANDLER - HEATPLANT - BOILER - COOLPLANT - TOWERPLANT - HPLOOP -<% end %> REPORTFILE REPORT REPORTCOL @@ -90,7 +80,7 @@ A statement specifying a data member consists of the data member's name, an = si znVol = 100000; -specifies that the zone has a volume of 100000 cubic feet. (If the statement occurs outside of the description of a ZONE, an error message occurs.) All of the member names for each class are described in the [input data](#input-data) section; most of them begin with an abbreviation of the class name for clarity. +specifies that the zone has a volume of 100000 cubic feet. (If the statement occurs outside of the description of a ZONE, an error message occurs.) All of the member names for each class are described in the [input data][input-data] section; most of them begin with an abbreviation of the class name for clarity. The description of a zone or any object except Top can be terminated with the word "END"; but this is not essential; CSE will assume the ZONE ends when you start another ZONE or any object not a subobject of ZONE, or when you specify a member of a higher level class (Top for ZONE), or give an action-command such as RUN. @@ -148,11 +138,11 @@ The following is a brief CSE input file, annotated with comments intended to exe Terminates ZONE North, since action-commands terminate all objects being constructed. */ -\*\* See [Form of the CSE Data](#form-of-the-cse-data) +\*\* See [Form of the CSE Data][form-of-the-cse-data] ### Expressions -- Overview -*Expressions* are the parts of statements that specify values -- numeric values, string values, object name values, and choice values. Expressions are composed of operators and operands, in a manner similar to many programming languages. The available operators and operands will be described in the section on [operators](#operators). +*Expressions* are the parts of statements that specify values -- numeric values, string values, object name values, and choice values. Expressions are composed of operators and operands, in a manner similar to many programming languages. The available operators and operands will be described in the section on [operators][operators]. Unlike most programming languages, CSE expressions have Variation. *Variation* is how often a value changes during the simulation run -- hourly, daily, monthly, yearly (i.e. does not change during run), etc. For instance, the operand `$hour` represents the hour of the day and has "hourly" variation. An expression has the variation of its fastest-varying component. @@ -263,13 +253,13 @@ A line of the form where there is no space between the identifier and the (, is a macro with parameters given by the identifier list. The expansion of macros with parameters is discussed below. -Macros may also be defined *on the CSE command line*, making it possible to vary a run without changing the input files at all. As described in the [command line](#command-line) section, macros are defined on the CSE command line using the `-D` switch in the forms +Macros may also be defined *on the CSE command line*, making it possible to vary a run without changing the input files at all. As described in the [command line][command-line] section, macros are defined on the CSE command line using the `-D` switch in the forms -D_identifier_ -D_identifier_=_token-sequence_ -The first form simply defines the name with no token-sequence; this is convenient for testing with `#ifdef`, `#ifndef`, or `defined()`, as described in the section on [conditional inclusion of tex](#conditional-inclusion-of-text). The second form allows an argument list and token sequence. The entire command line argument must be enclosed in quotes if it contains any spaces. +The first form simply defines the name with no token-sequence; this is convenient for testing with `#ifdef`, `#ifndef`, or `defined()`, as described in the section on [conditional inclusion of tex][conditional-inclusion-of-text]. The second form allows an argument list and token sequence. The entire command line argument must be enclosed in quotes if it contains any spaces. A macro definition is forgotten when an `#undef` directive is encountered: @@ -321,7 +311,7 @@ For an example of the use `#include`s, please see the preprocessor examples at t Conditional text inclusion provides a facility for selectively including or excluding groups of input file lines. The lines so included or excluded may be either CSE input language text *or other preprocessor directives*. The latter capability is very powerful. -Several conditional inclusion directive involve integer constant expressions. Constant integer expressions are formed according the rules discussed in the section on [expressions](#expressions) with the following changes: +Several conditional inclusion directive involve integer constant expressions. Constant integer expressions are formed according the rules discussed in the section on [expressions][expressions] with the following changes: 1. Only constant integer operands are allowed. @@ -440,11 +430,11 @@ This macro can be used whenever a U-value is required (e.g. SURFACE ... sfU=UWin ## CSE Input Language Statements -This section describes the general form of CSE input language statements that define objects, assign values to the data members of objects, and initiate actions. The concepts of objects and the class hierarchy were introduced in the section on [form of CSE data](#form-of-the-cse-data). Information on statements for specific CSE input language classes and their members is the subject of the [input data](#input-data) section. +This section describes the general form of CSE input language statements that define objects, assign values to the data members of objects, and initiate actions. The concepts of objects and the class hierarchy were introduced in the section on [form of CSE data][form-of-the-cse-data]. Information on statements for specific CSE input language classes and their members is the subject of the [input data][input-data] section. ### Object Statements -As we described in a [previous section](#statements-overview), the description of an object is introduced by a statement containing at least the class name, and usually your chosen name for the particular object. In addition, this section will describe several optional qualifiers and modifying clauses that permit defining similar objects without repeating all of the member details, and reopening a previously given object description to change or add to it. +As we described in a [previous section][statements-overview], the description of an object is introduced by a statement containing at least the class name, and usually your chosen name for the particular object. In addition, this section will describe several optional qualifiers and modifying clauses that permit defining similar objects without repeating all of the member details, and reopening a previously given object description to change or add to it. Examples of the basic object-beginning statement: @@ -454,7 +444,7 @@ Examples of the basic object-beginning statement: LAYER; -As described in [the section on nested objects](#nested-objects), such a statement is followed by statements giving the object's member values or describing subobjects of the object. The object description ends when you begin another object that is not of a subclass of the object, or when a member of an embedding (higher level) object previously begun is given, or when END is given. +As described in [the section on nested objects][nested-objects], such a statement is followed by statements giving the object's member values or describing subobjects of the object. The object description ends when you begin another object that is not of a subclass of the object, or when a member of an embedding (higher level) object previously begun is given, or when END is given. #### Object Names @@ -477,7 +467,7 @@ We suggest always quoting object names so you won't have to worry about disallow Duplicate names result in error messages. Object names must be distinct between objects of the same class which are subobjects of the same object. For example, all ZONE names must be distinct, since all ZONEs are subobjects of Top. It is permissible to have SURFACEs with the same name in different ZONEs -- but it is a good idea to keep all of your object names distinct to minimize the chance of an accidental mismatch or a confusing message regarding some other error. -For some classes, such as ZONE, a name is required for each object. This is because several other statements refer to specific ZONEs, and because a name is needed to identify ZONEs in reports. For other classes, the name is optional. The specific statement descriptions in the [Input Data](#input-data) Section 5 say which names are required. We suggest always using object names even where not required; one reason is because they allow CSE to issue clearer error messages. +For some classes, such as ZONE, a name is required for each object. This is because several other statements refer to specific ZONEs, and because a name is needed to identify ZONEs in reports. For other classes, the name is optional. The specific statement descriptions in the [Input Data][input-data] Section 5 say which names are required. We suggest always using object names even where not required; one reason is because they allow CSE to issue clearer error messages. The following *reserved words will not work as object names unless enclosed in quotes*: @@ -513,7 +503,7 @@ ALTER can be used to facilitate making similar runs. For example, to evaluate th wnHeight = 4; wnWidth = 12; // make window smaller RUN; // perform simulation and print reports again -ALTER also lets you access the predefined "Primary" REPORTFILE and EXPORTFILE objects which will be described in the [Input Data](#input-data) Section: +ALTER also lets you access the predefined "Primary" REPORTFILE and EXPORTFILE objects which will be described in the [Input Data][input-data] Section: ALTER REPORTFILE "Primary"; /* open description of object automatically supplied by CSE -- no other way to access */ @@ -563,11 +553,11 @@ USETYPE followed by the type name is used in creating an object of a type previo sfArea = 8 * 30; // area of each wall is different sfAdjZn = "East"; // zone on other side of wall -Any differences from the type, and any required information not given in the type, must then be specified. Any member specified in the type may be respecified in the object unless FROZEN (see [this section](#freeze)) in the type (normally, a duplicate specification for a member results in an error message). +Any differences from the type, and any required information not given in the type, must then be specified. Any member specified in the type may be respecified in the object unless FROZEN (see [this section][freeze]) in the type (normally, a duplicate specification for a member results in an error message). #### DEFTYPE -DEFTYPE is used to begin defining a TYPE for a class. When a TYPE is created, no object is created; rather, a partial or complete object description is stored for later use with DEFTYPE. TYPES facilitate creating multiple similar objects, as well as storing commonly used descriptions in a file to be \#included in several different files, or to be altered for multiple runs in comparative studies without changing the including files. Example (boldface for emphasis only): +DEFTYPE is used to begin defining a TYPE for a class. When a TYPE is created, no object is created; rather, a partial or complete object description is stored for later use with DEFTYPE. TYPES facilitate creating multiple similar objects, as well as storing commonly used descriptions in a file to be #included in several different files, or to be altered for multiple runs in comparative studies without changing the including files. Example (boldface for emphasis only): DEFTYPE SURFACE "BaseWall" // common characteristics of all walls @@ -607,43 +597,43 @@ END, optionally followed by an object name, can be used to unequivocally termina ### Member Statements -As introduced in the section on [statements](#statements-overview), statements which assign values to members are of the general form: +As introduced in the section on [statements][statements-overview], statements which assign values to members are of the general form: *memberName* = *expression*; The specific member names for each class of objects are given in Section 5; many have already been shown in examples. -Depending on the member, the appropriate type for the expression giving the member value may be numeric (integer or floating point), string, object name, or multiple-choice. Expressions of all types will be described in detail in the section on [expressions](#expressions). +Depending on the member, the appropriate type for the expression giving the member value may be numeric (integer or floating point), string, object name, or multiple-choice. Expressions of all types will be described in detail in the section on [expressions][expressions]. -Each member also has its *variability* (also given in the [input data](#input-data) section), or maximum acceptable *variation*. This is how often the expression for the value can change during the simulation -- hourly, daily, monthly, no change (constant), etc. The "variations" were introduced in the [expressions overview](#expressions-overview) section and will be further detailed in a [section on variation frequencies](#variation-frequencies-revisited). +Each member also has its *variability* (also given in the [input data][input-data] section), or maximum acceptable *variation*. This is how often the expression for the value can change during the simulation -- hourly, daily, monthly, no change (constant), etc. The "variations" were introduced in the [expressions overview][expressions-overview] section and will be further detailed in a [section on variation frequencies][variation-frequencies-revisited]. Four special statements, AUTOSIZE, UNSET, REQUIRE, and FREEZE, add flexibility in working with members. #### AUTOSIZE -AUTOSIZE followed by a member name, sets the member to be sized by CSE. The option to AUTOSIZE a member will be shown under its legal range where it is described in the [input data](#input-data) section. AUTOSIZE is only applicable to members describing HVAC system airflows and heating/cooling capacities. If AUTOSIZE is used for any member in the input, input describing design day conditions must also be specified (see [TOP Autosizing](#top-autosizing)). +AUTOSIZE followed by a member name, sets the member to be sized by CSE. The option to AUTOSIZE a member will be shown under its legal range where it is described in the [input data][input-data] section. AUTOSIZE is only applicable to members describing HVAC system airflows and heating/cooling capacities. If AUTOSIZE is used for any member in the input, input describing design day conditions must also be specified (see [TOP Autosizing][top-autosizing]). #### UNSET -UNSET followed by a member name is used when it is desired to delete a member value previously given. UNSETing a member resets the object to the same internal state it was in before the member was originally given. This makes it legal to specify a new value for the member (normally, a duplicate specification results in an error message); if the member is required (as specified in the [input data](#input-data) section), then an error message will occur if RUN is given without re specifying the member. +UNSET followed by a member name is used when it is desired to delete a member value previously given. UNSETing a member resets the object to the same internal state it was in before the member was originally given. This makes it legal to specify a new value for the member (normally, a duplicate specification results in an error message); if the member is required (as specified in the [input data][input-data] section), then an error message will occur if RUN is given without re specifying the member. Situations where you really might want to specify a member, then later remove it, include: - After a RUN command has completed one simulation run, if you wish to specify another simulation run without CLEARing and giving all the data again, you may need to UNSET some members of some objects in order to re specify them or because they need to be omitted from the new run. In this case, use ALTER(s) to reopen the object(s) before UNSETing. -- In defining a TYPE (see [this section](#deftype)), you may wish to make sure certain members are not specified so that the user must give them or omit them if desired. If the origin of the type (possibly a sequence of DEFTYPEs, LIKEs, and/or COPYs) has defined unwanted members, get rid of them with UNSET. +- In defining a TYPE (see [this section][deftype]), you may wish to make sure certain members are not specified so that the user must give them or omit them if desired. If the origin of the type (possibly a sequence of DEFTYPEs, LIKEs, and/or COPYs) has defined unwanted members, get rid of them with UNSET. -Note that UNSET is only for deleting *members* (names that would be followed with an = and a a value when being defined). To delete an entire *object*, use DELETE (see [this section](#delete)). +Note that UNSET is only for deleting *members* (names that would be followed with an = and a a value when being defined). To delete an entire *object*, use DELETE (see [this section][delete]). #### REQUIRE -REQUIRE followed by a member name makes entry of that member mandatory if it was otherwise optional; it is useful in defining a TYPE (see [this section](#deftype)) when you desire to make sure the user enters a particular member, for example to be sure the TYPE is applied in the intended manner. REQUIRE by itself does not delete any previously entered value, so if the member already has a value, you will need to UNSET it. ?? *verify* +REQUIRE followed by a member name makes entry of that member mandatory if it was otherwise optional; it is useful in defining a TYPE (see [this section][deftype]) when you desire to make sure the user enters a particular member, for example to be sure the TYPE is applied in the intended manner. REQUIRE by itself does not delete any previously entered value, so if the member already has a value, you will need to UNSET it. ?? *verify* #### FREEZE -FREEZE followed by a member name makes it illegal to UNSET or redefine that member of the object. Note that FREEZE is unnecessary most of the time since CSE issues an error message for duplicate definitions without an intervening UNSET, unless the original definition came from a TYPE (see [this section](#deftype)). Situations where you might want to FREEZE one or more members include: +FREEZE followed by a member name makes it illegal to UNSET or redefine that member of the object. Note that FREEZE is unnecessary most of the time since CSE issues an error message for duplicate definitions without an intervening UNSET, unless the original definition came from a TYPE (see [this section][deftype]). Situations where you might want to FREEZE one or more members include: -- When defining a TYPE (see [this section](#deftype)). Normally, the member values in a type are like defaults; they can be freely overridden by member specifications at each use. If you wish to insure a TYPE is used as intended, you may wish to FREEZE members to prevent accidental misuse. +- When defining a TYPE (see [this section][deftype]). Normally, the member values in a type are like defaults; they can be freely overridden by member specifications at each use. If you wish to insure a TYPE is used as intended, you may wish to FREEZE members to prevent accidental misuse. - When your are defining objects for later use or for somebody else to use (perhaps in a file to be included) and you wish to guard against misuse, you may wish to FREEZE members. Of course, this is not foolproof, since there is at present no way to allow use of predefined objects or types without allowing access to the statements defining them. @@ -669,87 +659,37 @@ Probably the CSE input language's most powerful characteristic is its ability to But for many object members, CSE accepts *live expressions* that *vary* according to time of day, weather, zone temperatures, etc. (etc., etc., etc.!). Live expressions permit simulation of many relationships without special-purpose features in the language. Live expressions support controlling setpoints, scheduling HVAC system operation, resetting air handler supply temperature according to outdoor temperature, and other necessary and foreseen functions without dedicated language features; they will also support many unforeseen user-generated functionalities that would otherwise be unavailable. -Additional expression flexibility is provided by the ability to access all of the input data and much of the internal data as operands in expressions (*probes*, see [this section](#probes)). +Additional expression flexibility is provided by the ability to access all of the input data and much of the internal data as operands in expressions (*probes*, see [this section][probes]). As in a programming language, CSE expressions are constructed from operators and operands; unlike most programming languages, CSE determines how often an expression's operands change and automatically compute and store the value as often as necessary. -Expressions in which all operands are known when the statement is being decoded (for example, if all values are constants) are *always* allowed, because the input language processor immediately evaluates them and presents the value to the rest of the program in the same manner as if a single number had been entered. *Most* members also accept expressions that can be evaluated as soon as the run's input is complete, for example expressions involving a reference to another member that has not been given yet. Expressions that vary during the run, say at hourly or daily intervals, are accepted by *many* members. The *variability* or maximum acceptable variation for each member is given in the descriptions in the [input data](#input-data) section, and the *variation* of each non-constant expression component is given in its description in this section. +Expressions in which all operands are known when the statement is being decoded (for example, if all values are constants) are *always* allowed, because the input language processor immediately evaluates them and presents the value to the rest of the program in the same manner as if a single number had been entered. *Most* members also accept expressions that can be evaluated as soon as the run's input is complete, for example expressions involving a reference to another member that has not been given yet. Expressions that vary during the run, say at hourly or daily intervals, are accepted by *many* members. The *variability* or maximum acceptable variation for each member is given in the descriptions in the [input data][input-data] section, and the *variation* of each non-constant expression component is given in its description in this section. Interaction of expressions and the preprocessor: Generally, they don't interact. The preprocessor is a text processor which completes its work by including specified files, deleting sections under false \#if's, remembering define definitions, replacing macro calls with the text of the definition, removing preprocessor directives from the text after interpreting them, etc., *then* the resulting character stream is analyzed by the input language statement compiler. However, the if statement takes an integer numeric expression argument. This expression is similar to those described here except that it can only use constant operands, since the preprocessor must evaluate it before deciding what text to feed to the input statement statement compiler. ### Expression Types -The type of value to which an expression must evaluate is specified in each member description (see the [input data](#input-data) section) or other context in which an expression can be used. Each expression may be a single constant or may be made up of operators and operands described in the rest of this section, so long as the result is the required type or can be converted to that type by CSE, and its variation is not too great for the context. The possible types are: +The type of value to which an expression must evaluate is specified in each member description (see the [input data][input-data] section) or other context in which an expression can be used. Each expression may be a single constant or may be made up of operators and operands described in the rest of this section, so long as the result is the required type or can be converted to that type by CSE, and its variation is not too great for the context. The possible types are: - ------------------ ----------------------------------------------------- - *float* A real number (3.0, 5.34, -2., etc.). Approximately 7 - digits are carried internally. If an int is given - where a real is required, it is automatically - converted. - *int* An integer or whole number (-1, 0, 1, 2 etc.). If a - real is given, an error may result, but we should - change it to convert it (discarding any fractional - part). - *Boolean* Same as int; indicates that a 0 value will be - interpreted as "false" and any non-0 value will be - interpreted as "true". - - *string* A string of characters; for example, some text - enclosed in quotes. - - *object name* Name of an object of a specified class. Differs from - *string* in that the name need not be enclosed in - quotes if it consists only of letters, digits, \_, - and \$, begins with a non-digit, and is different - from all reserved words now in or later added to the - language (see [Object Names](#object-names)). - - The object may be defined after it is referred to. An - expression using conditional operators, functions, - etc. may be used provided its value is known when the - RUN action command is reached.; no members requiring - object names accept values that vary during the - simulation. - - *choice* One of several choices; a list of the acceptable - values is given wherever a *choice* is required. The - choices are usually listed in CAPITALS but may be - entered in upper or lower case as desired. As with - object names, quotes are allowed but not required. - - Expressions may be used for choices, subject to the - variability of the context. - - *date* May be entered as a 3-letter month abbreviation - followed by an *int* for the day of the month, or an - *int* for the Julian day of the year (February is - assumed to have 28 days). Expressions may be used - subject to variability limitations. Examples: - - `Jan 23 // January 23` - - `23 // January 23` - - `32 // February 1` - ------------------ ----------------------------------------------------- +{{ + csv_table(" *float*, A real number (3.0, 5.34, -2., etc.). Approximately 7 digits are carried internally. If an int is given where a real is required , it is automatically converted. + *int*, An integer or whole number (-1, 0, 1, 2 etc.). If a real is given, an error may result, but we should change it to convert it (discarding any fractional part). + *Boolean*, Same as int; indicates that a 0 value will be interpreted as \"false\" and any non-0 value will be interpreted as \"true\". + *string*, A string of characters; for example, some text enclosed in quotes. + *object name*, Name of an object of a specified class. Differs from *string* in that the name need not be enclosed in quotes if it consists only of letters, digits, \_, and \$, begins with a non-digit, and is different from all reserved words now in or later added to the language (see [Object Names][object-names]).
The object may be defined after it is referred to. An expression using conditional operators, functions, etc. may be used provided its value is known when the RUN action command is reached.; no members requiring object names accept values that vary during the simulation. + *choice*, One of several choices; a list of the acceptable values is given wherever a *choice* is required. The choices are usually listed in CAPITALS but may be entered in upper or lower case as desired. As with object names, quotes are allowed but not required.
Expressions may be used for choices, subject to the variability of the context. + *date*, May be entered as a 3-letter month abbreviation followed by an *int* for the day of the month, or an *int* for the Julian day of the year (February is assumed to have 28 days). Expressions may be used subject to variability limitations. Examples:
    `Jan 23 // January 23`
    `23 // January 23`
    `32 // February 1`") +}} +[](){ #numeric-any-type } These words are used in following descriptions of contexts that can accept more than one basic type: - ------------------ ----------------------------------------------------- - *numeric* *float* or *int*. When floats and ints are intermixed - with the same operator or function, the result is - float. - - *anyType* Any type; the result is the same type as the - argument. If floats and ints are intermixed, the - result is float. If strings and valid choice names - are intermixed, the result is *choice*. Other - mixtures of types are generally illegal, except in - expressions for a few members that will accept either - one of several choices or a numeric value. - ------------------ ----------------------------------------------------- +{{ + csv_table("*numeric*, *float* or *int*; When floats and ints are intermixed with the same operator or function, the result is float. +*anyType*, Any type; the result is the same type as the argument. If floats and ints are intermixed, the result is float. If strings and valid choice names are intermixed, the result is *choice*. Other mixtures of types are generally illegal, except in expressions for a few members that will accept either one of several choices or a numeric value.") +}} The next section describes the syntax of constants of the various data types; then, we will describe the available operators, then other operand types such as system variables and built-in functions. @@ -757,757 +697,697 @@ The next section describes the syntax of constants of the various data types; th This section reviews how to enter ordinary non-varying numbers and other values. - ------------------ ----------------------------------------------------- - *int* optional - sign followed by digits. Don't use a - decimal point if your intent is to give an *int* - quantity -- the decimal point indicates a *float* to - CSE. Hexadecimal and Octal values may be given by - prefixing the value with 0x and 0O respectively (yes, - that really is a zero followed by an 'O'). +{{ + csv_table("*int*, optional - sign followed by digits. Don't use a decimal point if your intent is to give an *int* quantity -- the decimal point indicates a *float* to CSE. Hexadecimal and Octal values may be given by prefixing the value with `0x` and `0O` respectively (yes, that really is a zero followed by an 'O'). + *float*, optional - sign, digits, and decimal point. Very large or small values can be entered by following the number with an \"e\" and a power of ten. Examples:
    `1.0 1. .1 -5534.6 123.e25 4.56e-23`
The decimal point indicates a float as opposed to an int.
Generally it doesn't matter as CSE converts ints to floats as required, but be careful when dividing: CSE interprets \"2/3\" as integer two divided by integer 3, which will produce an integer 0 before CSE notices any need to convert to *float*. If you mean .6666667, say 2./3, 2/3., or .6666667. + *feet and inches*, Feet and inches may be entered where a *float* number of feet is required by typing the feet (or a 0 if none), a single quote ', then the inches. (Actually this is an operator meaning \"divide the following value by 12 and add it to the preceding value\", so expressions can work with it.) Examples:
    `3'6 0'.5 (10+20)'(2+3)` + *string*, \"Text\" -- desired characters enclosed in double quotes.
Maximum length 80 characters (make 132??). To put a \" within the \"'s, precede it with a backslash.
Certain control codes can be represented with letters preceded with a backslash as follows:
    `\\e escape`
    `\\t tab`
    `\\f form feed`
    `\\r carriage return`
    `\\n newline or line feed` + *object name*, Same as *string*, or without quotes if name consists only of letters, digits, \_, and \$, begins with a non-digit, and is different from all reserved words now in or later added to the language (see [Object Names][object-names]). Control character codes (ASCII 0-31) are not allowed. + *choice*, Same as string; quotes optional on choice words valid for the member. Capitalization does not matter. + *date*,Julian day of year (as *int* constant), or month abbreviation
    `Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec`
followed by the *int* day of month. (Actually, the month names are operators implemented to add the starting day of the month to the following *int* quantity).") +}} - *float* optional - sign, digits and decimal point. Very large - or small values can be entered by following the - number with an "e" and a power of ten. Examples; - -     `1.0 1. .1 -5534.6 123.e25 4.56e-23` - - The decimal point indicates a float as opposed to an - int. Generally it doesn't matter as CSE converts ints - to floats as required, but be careful when dividing: - CSE interprets "2/3" as integer two divided by - integer 3, which will produce an integer 0 before CSE - notices any need to convert to *float*. If you mean - .6666667, say 2./3, 2/3., or .6666667. +### Operators - *feet and inches* Feet and inches may be entered where a *float* number - of feet is required by typing the feet (or a 0 if - none), a single quote ', then the inches. (Actually - this is an operator meaning "divide the following - value by 12 and add it to the preceding value", so - expressions can work with it.) Examples: +For *floats* and *ints*, the CSE input language recognizes a set of operators based closely on those found in the C programming language. The following table describes the available numeric operators. The operators are shown in the order of execution (precedence) when no ()'s are used to control the order of evaluation; thin lines separate operators of equal precedence. -     `3'6 0'.5 (10+20)'(2+3)` +--- +**Feet-Inches Separator** `'` +: `a ' b` yields `a + b/12` - *string* "Text" -- desired characters enclosed in double - quotes. Maximum length 80 characters (make 132??). To - put a " within the "'s, precede it with a backslash. - Certain control codes can be represented with letters - preceded with a backslash as follows: + Example: `4'6 = 4.5` -     `\\e escape` +**Unary plus** `+` +: The familiar "positive", as in `+3`. Does nothing; rarely used. -     `\\t tab` +**Unary minus** `-` +: The familiar "minus", as in `-3`. + + Example: `-(-3) = +3` -     `\\f form feed` +**Logical NOT** `!` +: Changes `0` to `1` and any non-`0` value to `0`. -     `\\r carriage return` + Examples: `!0 = 1`, `!17 = 0` -     `\\n newline or line feed` +**One's Complement** `~` +: Complements each bit in an *int* value. - *object name* Same as *string*, or without quotes if name consists - only of letters, digits, \_, and \$, begins with a - non-digit, and is different from all reserved words - now in or later added to the language (see - [Object Names](#object-names)). Control character codes - (ASCII 0-31) are not allowed. +**Multiplication** `*` +: Multiplication + + Examples: `3*4 = 12`, `3.24*18.54 = 60.07` - *choice* Same as string; quotes optional on choice words valid - for the member. Capitalization does not matter. - *date* Julian day of year (as *int* constant), or month - abbreviation +**Division** `/` +: Division + + Examples: `4/2 = 2`, `3.24/1.42 = 2.28` -     `Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec` + !!! danger "CAUTION!" + Integer division truncates toward 0: `3/2 = 1`, `3/-2 = -1`, `-3/2 = -1`, `2/3 = 0` + +**Modulus** `%` +: Yields the remainder after division, e.g. `7%2 = 1`. The result has the same sign as the left operand (e.g.`(-7)%2 = -1`). `%` is defined for both integer and floating point operands (unlike ANSI C). - followed by the *int* day of month. (Actually, the - month names are operators implemented to add the - starting day of the month to the following *int* - quantity). - ------------------ ----------------------------------------------------- +**Addition** `+` +: Yields the sum of the operands -### Operators + Example: `5+3=8` -For *floats* and *ints*, the CSE input language recognizes a set of operators based closely on those found in the C programming language. The following table describes the available numeric operators. The operators are shown in the order of execution (precedence) when no ()'s are used to control the order of evaluation; thin lines separate operators of equal precedence. +**Subtraction** `-` +: Yields the difference of the operands - ------------------------------------------------------------------------ - **Operator** **Name** **Notes and Examples** - -------------- -------------------- ------------------------------------ - ' Feet-Inches a ' b yields a + b/12; thus 4'6 = - Separator 4.5. + Example: `5-3=2` - + Unary plus The familiar "positive", as in +3. - Does nothing; rarely used. +**Right Shift** `>>` +: `a >> b` yields `a` shifted right `b` bit positions - - Unary minus The familiar "minus", as in -3. - -(-3) = +3 etc. + Example: `8 >> 2 = 2` - ! Logical NOT Changes 0 to 1 and any non-0 value - to 0. !0 = 1, !17 = 0. +**Left Shift** `<<` +: `a << b` yields `a` shifted left `b` bit positions + + Example: `8 << 2 = 32` - \~ One's complement Complements each bit in an *int* - value. +**Less than** `<` +: `a < b` yields 1 if `a` is less than `b`, otherwise 0 - \* Multiplication Multiplication, e.g. 3\*4 = 12; - 3.24\*18.54 = 60.07 +**Less than or equal** `<=` +: `a <= b` yields 1 if `a` is less than or equal to `b`, otherwise 0 - / Division Division, e.g. 4/2 = 2, 3.24/1.42 = - 2.28. Integer division truncates - toward 0 (e.g. 3/2 = 1, 3/-2 = -1, - -3/2 = -1, 2/3 = 0) CAUTION! +**Greater than or equal** `>=` +: `a >= b` yields 1 if `a` is greater than or equal to `b`, otherwise 0 - % Modulus Yields the remainder after division, - e.g. 7%2 = 1. The result has the - same sign as the left operand - (e.g.(-7)%2 = -1). % is defined for - both integer and floating point - operands (unlike ANSI C). +**Greater than** `>` +: `a > b` yields 1 if `a` is greater than `b`, otherwise 0 - + Addition Yields the sum of the operands, e.g. - 5+3 = 8 +**Equal** `==` +: `a == b` yields 1 if `a` is *exactly* (bit wise) equal to `b`, otherwise 0 - - Subtraction Yields the difference of the - operands, e.g. 5-3 = 2 +**Not equal** `==` +: `a != b` yields 1 if `a` is not equal to `b`, otherwise 0 - >> Right shift a >> b yields a shifted right - b bit positions, e.g. 8>>2 = 2 +**Bitwise AND** `&` +: `a & b` yields the bitwise AND of the operands - << Left shift a << b yields a shifted left b - bit positions, e.g. 8<<2 = 32 + Example: `6 & 2 = 2` - < Less than a < b yields 1 if a is less than - b, otherwise 0 +**Bitwise EXCLUSIVE OR** `^` +: `a ^ b` yields the bitwise XOR of the operands - <= Less than or equal a <= b yields 1 if a is less than - or equal to b, otherwise 0 + Example: `6 ^ 2 = 4` - >= Greater than or a >= b yields 1 if a is greater - equal than or equal to b, otherwise 0 +**Bitwise INCLUSIVE OR** `|` +: `a | b` yields the bitwise IOR of the operands - > Greater than a > b yields 1 if a is greater - than b, otherwise 0 + Example: `6 | 2 = 6` - == Equal a == b yields 1 if a is *exactly* - (bit wise) equal to b, otherwise 0 +**Logical AND** `&&` +: `a && b` yields 1 if both `a` and `b` are non-zero, otherwise 0. + `&&` guarantees left to right evaluation: if the first operand evaluates to 0, the second operand is not evaluated and the result is 0. - != Not equal a != b yields 1 if a is not equal to - b, otherwise 0 +**Logical OR** `||` +: `a || b` yields 1 if either `a` or `b` is true (non-0), otherwise 0. + `||` guarantees left to right evaluation: if the first operand evaluates to non-zero, the second operand in not evaluated and the result is 1. - & Bitwise and a & b yields the bitwise AND of the - operands, e.g. 6 & 2 = 2. +**Conditional** `?:` +: `a ? b : c` yields `b` if `a` is true (non-0), otherwise `c`. + +--- - \^ Bitwise exclusive or a \^ b yields the bitwise XOR of the - operands, e.g. 6 \^ 2 = 4. +*Dates* are stored as *ints* (the value being the Julian day of the year), so all numeric operators could be used. The month abbreviations are implemented as operators that add the first day of the month to the following *int* value; CSE does not disallow their use in other numeric contexts. - | Bitwise inclusive or a | b yields the bitwise IOR of the - operands, e.g. 6 | 2 = 6. +For *strings*, *object names*, and *choices*, the CSE input language currently has no operators except the `?:` conditional operator and the concat() function. Note, though, that the choose, choose1, select, and hourval functions described below work with strings, object names, and choice values as well as numbers. - && Logical AND a && b yields 1 if both a and b are - non-zero, otherwise 0. && guarantees - left to right evaluation: if the - first operand evaluates to 0, the - second operand is not evaluated and - the result is 0. +### System Variables - || Logical OR a || b yields 1 if either a or b is - true (non-0), otherwise 0. || - guarantees left to right evaluation: - if the first operand evaluates to - non-zero, the second operand in not - evaluated and the result is 1. +*System Variables* are built-in operands with useful values. To avoid confusion with other words, they begin with a `$`. Descriptions of the CSE system variables follow. Capitalization shown need not be matched. Most system variables change during a simulation run, resulting in the *variations* shown; they cannot be used where the context will not accept variation at least this fast. (The [Input Data Section][input-data] gives the *variability*, or maximum acceptable variation, for each object member.) + +{{ + csv_table("$dayOfYear, Day of year of simulation, 1 - 365; 1 corresponds to Jan-1. (Note that this is not the day of the simulation unless begDay is Jan-1.)
**Variation:** daily. +$month, Month of year, 1 - 12.
**Variation:** monthly. +$dayOfMonth, Day of month, 1 - 31.
**Variation:** daily. +$hour, Hour of day, 1 - 24, in local time; 1 corresponds to midnight - 1 AM.
**Variation:** hourly. +$hourST, Hour of day, 1 - 24, in standard time; 1 corresponds to midnight - 1 AM.
**Variation:** hourly. +$subhour, Subhour of hour, 1 - N (number of subhours).
**Variation:** subhourly. +$dayOfWeek, Day of week, 1 - 7; 1 corresponds to Sunday, 2 to Monday, etc. Note that $dayOfWeek is 4 (Wed) during autosizing.
**Variation:** daily. +$DOWH, Day of week 1-7 except 8 on every observed holiday. Note that $DOWH is 4 (Wed) during autosizing.
**Variation:** daily. +$isHoliday, 1 on days that a holiday is observed (regardless of the true date of the holiday); 0 on other days.
**Variation:** daily. +$isHoliTrue, 1 on days that are the true date of a holiday, otherwise 0.
**Variation:** daily. +$isWeHol, 1 on weekend days or days that are observed as holidays.
**Variation:** daily. +$isWeekend, 1 on Saturday and Sunday, 0 on any day from Monday to Friday.
**Variation:** daily. +$isWeekday, 1 on Monday through Friday, 0 on Saturday and Sunday.
**Variation:** daily. +$isBegWeek, 1 for any day immediately following a weekend day or observed holiday that is neither a weekend day or an observed holiday.
**Variation:** daily. +$isWorkDay, 1 on non-holiday Monday through Friday, 0 on holidays, Saturday and Sunday.
**Variation:** daily. +$isNonWorkDay, 1 on Saturday, Sunday and observed holidays, 0 on non-holiday Monday through Friday.
**Variation:** daily. +$isBegWorkWeek, 1 on the first workday after a non-workday, 0 all other days.
**Variation:** daily. +$isDT, 1 if Daylight Saving time is in effect, 0 otherwise.
**Variation:** hourly. +$autoSizing, 1 during autosizing calculations, 0 during main simulation.
**Variation:** for each phase. +$dsDay, Design day type, 0 during main simulation, 1 during heating autosize, 2 during cool autosize.
**Variation:** daily.") +}} + +**Weather variables**: the following allow access to the current hour's weather conditions in you CSE expressions. Units of measure are shown in parentheses. All have **Variation:** hourly. + +{{ + csv_table("$radBeam, Solar beam irradiance (on a sun-tracking surface) this hour (Btu/ft2) +$radDiff, Solar diffuse irradiance (on horizontal surface) this hour (Btu/ft2) +$tDbO, Outdoor drybulb temperature this hour (degrees F) +$tWbO, Outdoor wetbulb temperature this hour (degrees F) +$wO, Outdoor humidity ratio this hour (lb H2O/lb dry air) +$windDirDeg, Wind direction (compass degrees) +$windSpeed, Wind speed (mph)") +}} + +@nested-dl +### Built-in Functions - ? : Conditional a ? b : c yields b if a is true - (non-0), otherwise c. - ------------------------------------------------------------------------ +Built-in functions perform a number of useful scheduling and conditional operations in expressions. Built-in functions have the combined variation of their arguments; for *hourval*, the minimum result variation is hourly. For definitions of [*numeric*][numeric-any-type] and [*anyType*][numeric-any-type], see [Expression Types][expression-types]. -*Dates* are stored as *ints* (the value being the Julian day of the year), so all numeric operators could be used. The month abbreviations are implemented as operators that add the first day of the month to the following *int* value; CSE does not disallow their use in other numeric contexts. +--- -For *strings*, *object names*, and *choices*, the CSE input language currently has no operators except the ?: conditional operator and the concat() function. Note, though, that the choose, choose1, select, and hourval functions described below work with strings, object names, and choice values as well as numbers. +#### `brkt` -### System Variables +**Function** +: limits a value to be in a given range -*System Variables* are built-in operands with useful values. To avoid confusion with other words, they begin with a \$. Descriptions of the CSE system variables follow. Capitalization shown need not be matched. Most system variables change during a simulation run, resulting in the *variations* shown; they cannot be used where the context will not accept variation at least this fast. (The [Input Data Section](#input-data) gives the *variability*, or maximum acceptable variation, for each object member.) +**Syntax** +: *numeric* **brkt**( *numeric min, numeric val, numeric max* ) - ---------------- --------------------------------------------------------- - \$dayOfYear Day of year of simulation, 1 - 365; 1 corresponds to - Jan-1. (Note that this is not the day of the simulation - unless begDay is Jan-1.) **Variation:** daily. +**Remark** +: If *val* is less than *min*, returns *min*; if *val* is greater than *max,* returns *max*; if *val* is in between, returns *val*. - \$month Month of year, 1 - 12. **Variation**: monthly. +**Example** +: In an AIRHANDLER object, the following statement would specify a supply temperature equal to 130 minus the outdoor air temperature, but not less than 55 nor greater than 80: + + ``` + ahTsSp = brkt(55, 130 - $tDbO, 80); + ``` + + This would produce a 55-degree setpoint in hot weather, an 80-degree setpoint in cold weather, and a transition from 55 to 70 as the outdoor temperature moved from 75 to 50. - \$dayOfMonth Day of month, 1 - 31. **Variation**: daily. +--- - \$hour Hour of day, 1 - 24, in local time; 1 corresponds to midnight - 1 AM. - **Variation**: hourly. - \$hourST Hour of day, 1 - 24, in standard time; 1 corresponds to midnight - 1 AM. - **Variation**: hourly. +#### `fix` - \$subhour Subhour of hour, 1 - N (number of subhours). - **Variation**: subhourly. +**Function** +: converts *float* to *int* - \$dayOfWeek Day of week, 1 - 7; 1 corresponds to Sunday, 2 to - Monday, etc. Note that \$dayOfWeek is 4 (Wed) during autosizing. **Variation:** daily. +**Syntax** +: *int* **fix**( *float val* ) - \$DOWH Day of week 1-7 except 8 on every observed holiday. - Note that \$DOWH is 4 (Wed) during autosizing **Variation**: daily. +**Remark** +: *val* is converted to *int* by truncation. - \$isHoliday 1 on days that a holiday is observed (regardless of the - true date of the holiday); 0 on other days. - **Variation**: daily. +**Examples** +: + ``` + fix(1.3) // 1 + fix(1.99) // 1 + fix(-4.4) // -4 + ``` - \$isHoliTrue 1 on days that are the true date of a holiday, otherwise - 0. **Variation**: daily. +--- - \$isWeHol 1 on weekend days or days that are observed as holidays. - **Variation:** daily. +#### `toFloat` - \$isWeekend 1 on Saturday and Sunday, 0 on any day from Monday to - Friday. **Variation:** daily. +**Function** +: converts *int* to *float* - \$isWeekday 1 on Monday through Friday, 0 on Saturday and Sunday. - **Variation:** daily. +**Syntax** +: *float* **toFloat**( *int val* ) - \$isBegWeek 1 for any day immediately following a weekend day or - observed holiday that is neither a weekend day or an - observed holiday. **Variation:** daily. +--- - \$isWorkDay 1 on non-holiday Monday through Friday, 0 on holidays, - Saturday and Sunday. **Variation:** daily. +#### `min` - \$isNonWorkDay 1 on Saturday, Sunday and observed holidays, 0 on - non-holiday Monday through Friday. **Variation:** - daily. +**Function** +: returns the lowest quantity from a list of values. - \$isBegWorkWeek 1 on the first workday after a non-workday, 0 all - other days. **Variation:** daily. +**Syntax** +: *numeric* **min**( *numeric value1, numeric value2, ...* + *numeric valuen* ) - \$isDT 1 if Daylight Saving time is in effect, 0 otherwise. - **Variation:** hourly. +**Remark** +: there can be any number of arguments separated by commas; + if floats and ints are intermixed, the result is float. - \$autoSizing 1 during autosizing calculations, 0 during main - simulation. **Variation:** for each phase. +--- - \$dsDay Design day type, 0 during main simulation, 1 during - heating autosize, 2 during cool autosize. - **Variation:** daily. - ---------------- --------------------------------------------------------- +#### `max` -**Weather variables**: the following allow access to the current hour's weather conditions in you CSE expressions. Units of measure are shown in parentheses. All have **Variation**: hourly. +**Function** +: returns the highest quantity from a list of values. - ----------------- ------------------------------------------------------ - \$radBeam Solar beam irradiance (on a sun-tracking surface) this hour - (Btu/ft2) +**Syntax** +: *numeric* **max** ( *numeric value1, numeric value2,* ..., *numeric valuen* ) - \$radDiff Solar diffuse irradiance (on horizontal surface) this hour - (Btu/ft2) +--- - \$tDbO Outdoor drybulb temperature this hour (degrees F) +#### `choose` - \$tWbO Outdoor wetbulb temperature this hour (degrees F) +**Function** +: returns the nth value from a list. If *arg0* is 0, *value0* is returned; for 1, *value1* is returned, etc. - \$wO Outdoor humidity ratio this hour (lb H2O/lb dry air) - \$windDirDeg Wind direction (compass degrees) +**Syntax** +: *anyType* **choose** ( *int arg0, anyType value0, anyType* *value1, ... anyType valuen* ) or *anyType* **choose** ( *int arg0, anyType value0, ... anyType* *valuen*, **default** *valueDef*) - \$windSpeed Wind speed (mph) - ----------------- ------------------------------------------------------ -### Built-in Functions +**Remarks** +: Any number of *value* arguments may be given. If **default** and another value is given, this value will be used if *arg0* is less than 0 or too large; otherwise, an error will occur. -Built-in functions perform a number of useful scheduling and conditional operations in expressions. Built-in functions have the combined variation of their arguments; for *hourval*, the minimum result variation is hourly. For definitions of *numeric* and *anyType*, see [Expression Types](#expression-types). +--- -#### brkt +#### `choose1` - -------------- --------------------------------------------------------- - **Function** limits a value to be in a given range +**Function** +: same as choose except *arg0* is 1-based. Choose1 returns the second argument *value1* for *arg0* = 1, the third argument *value2* when *arg0* = 2, etc. - **Syntax** *numeric* **brkt**( *numeric min, numeric val, numeric - max*) +**Syntax** +: *anyType* **choose1** ( *int arg0, anyType value1, anyType* *value2, ... anyType valuen* ) or *anyType* **choose1** ( *int arg0, anyType value1,* ... *anyType valuen,* **default** *valueDef*) - **Remark** If *val* is less than *min*, returns *min*; if *val* is - greater than *max,* returns *max*; if *val* is in - between, returns *val*. +**Remarks** +: **choose1** is a function that is well suited for use with daily system variables. For example, if a user wanted to denote different values for different days of the week, the following use of **choose1** could be implemented: - **Example** In an AIRHANDLER object, the following statement would - specify a supply temperature equal to 130 minus the - outdoor air temperature, but not less than 55 nor greater - than 80: + `tuTC = choose1($dayOfWeek, MonTemp, TueTemp, ...)` -     `ahTsSp = brkt( 55, 130 - $tDbO, 80);` + !!! tip + For hourly data, the **hourval** function would be a better choice, because it doesn't require the explicit declaration of the `$hour` system variable. - This would produce a 55-degree setpoint in hot weather, - an 80-degree setpoint in cold weather, and a transition - from 55 to 70 as the outdoor temperature moved from 75 to - 50. - -------------- --------------------------------------------------------- +--- -#### fix +#### `select` - -------------- --------------------------------------------------------- - **Function** converts *float* to *int* +**Function** +: contains Boolean-value pairs; returns the value associated with the first Boolean that evaluates to true (non-0). - **Syntax** *int* **fix**( *float val* ) +**Syntax** +: *anyType* ( *Boolean arg1, anyType value1, Boolean arg2,* *anyType value2, ...* **default** *anyType*) (the **default** part is optional) - **Remark** *val* is converted to *int* by truncation -- **fix**( - 1.3) and **fix**( 1.99) both return 1. **fix**( -4.4) - returns -4. - -------------- --------------------------------------------------------- +**Remark** +: **select** is a function that simulates if-then logic during simulation (for people familiar with C, it works much like a series of imbedded conditionals: (a?b:(a?b:c)) ). -#### toFloat +**Example** +: `select` can be used to simulate a **dynamic** (run-time) **if-else** **statement**: - -------------- --------------------------------------------------------- - **Function** converts *int* to *float* - **Syntax** *float* **toFloat**( *int val* ) - -------------- --------------------------------------------------------- + gnPower = select( $isHoliday, HD_GAIN, // if ($isHoliday) + default WD_GAIN) // else -#### min + This technique can be combined with other functions to + schedule items on a hourly and daily basis. For example, an + internal gain that has different schedules for holidays, + weekdays, and weekends could be defined as follows: - -------------- --------------------------------------------------------- - **Function** returns the lowest quantity from a list of values. + // 24-hour lighting power schedules for weekend, weekday, holiday: + #define WE_LIGHT hourval( .024, .022, .021, .021, .021, .026, \ +              .038, .059, .056, .060, .059, .046, \ +              .045, .005, .005, .005, .057, .064, \ +              .064, .052, .050, .055, .044, .027 ) - **Syntax** *numeric* **min**( *numeric value1, numeric value2, ...* - *numeric valuen* ) + #define WD_LIGHT hourval( .024, .022, .021, .021, .021, .026, \ +              .038, .059, .056, .060, .059, .046, \ +              .045, .005, .005, .005, .057, .064, \ +              .064, .052, .050, .055, .044, .027 ) - **Remark** there can be any number of arguments separated by commas; - if floats and ints are intermixed, the result is float. - -------------- --------------------------------------------------------- + #define HD_LIGHT hourval( .024, .022, .021, .021, .021, .026, \ +              .038, .059, .056, .060, .059, .046, \ +              .045, .005, .500, .005, .057, .064, \ +              .064, .052, .050, .055, .044, .027 ) -#### max + // set power member of zone's GAIN object for lighting + gnPower = BTU_Elec( ZAREA*0.1 ) * // .1 kW/ft2 times... - -------------- --------------------------------------------------------- - **Function** returns the highest quantity from a list of values. +     select( $isHoliday, HD_LIGHT, // Holidays +         $isWeekend, WE_LIGHT, // Saturday & Sunday +         default WD_LIGHT ); // Week Days - **Syntax** *numeric* **max** ( *numeric value1, numeric value2,* ... - *numeric valuen* ) - -------------- --------------------------------------------------------- + In the above, three subexpressions using **hourval** (next) + are first defined as macros, for ease of reading and later + change. Then, gnPower (the power member of a GAIN object) + is set, using **select** to choose the appropriate one of + the three **hourval** calls for the type of day. The + expression for gnPower is a *live expression* with hourly + variation, that is, CSE will evaluate it an set gnPower to + the latest value each hour of the simulation. The variation + comes from **hourval**, which varies hourly (also, + `$isHoliday` and `$isWeekend` vary daily, but the faster + variation determines the variation of the result). -#### choose +--- - -------------- --------------------------------------------------------- - **Function** returns the nth value from a list. If *arg0* is 0, - *value0* is returned; for 1, *value1* is returned, etc. +#### `hourval` - **Syntax** *anyType* **choose** ( *int arg0, anyType value0, - anyType* *value1, ... anyType valuen* ) or *anyType* - **choose** ( *int arg0, anyType value0, ... anyType* - *valuen*, **default** *valueDef*) +**Function** +: from a list of 24 values, returns the value corresponding to the hour of day. - **Remarks** Any number of *value* arguments may be given. If - **default** and another value is given, this value will - be used if *arg0* is less than 0 or too large; otherwise, - an error will occur. - -------------- --------------------------------------------------------- +**Syntax** +: *anyType hourval ( anyType value1, anyType value2,* …, *anyType value24* ) -#### choose1 + *anyType hourval ( anyType value1, anyType value2*, …, **default** *anyType*) - ------------- ---------------------------------------------------------- - **Function** same as choose except *arg0* is 1-based. Choose1 returns - the second argument *value1* for *arg0* = 1, the third - argument *value2* when *arg0* = 2, etc. +**Remark** +: **hourval** is evaluated at runtime and uses the hour of the day being simulated to choose the corresponding value from the 24 suppplied values. - **Syntax** *anyType* **choose1** ( *int arg0, anyType value1, - anyType* *value2, ... anyType valuen* ) or *anyType* - **choose1** ( *int arg0, anyType value1,* ... *anyType - valuen,* **default** *valueDef*) + If less than 24 *value* arguments are given, **default** and another value (or expression) should be supplied to be used for hours not explicitly specified. - **Remarks** **choose1** is a function that is well suited for use with - daily system variables. For example, if a user wanted to - denote different values for different days of the week, - the following use of **choose1** could be implemented: +**Example** +: see **select**, just above. -     `tuTC = choose1(\$dayOfWeek, MonTemp, TueTemp, ...)` +--- - Note that for hourly data, the **hourval** function would - be a better choice, because it doesn't require the - explicit declaration of the \$hour system variable. - ------------- ---------------------------------------------------------- +#### `abs` -#### select +**Function** +: converts numeric to its absolute value - ------------ ----------------------------------------------------------- - **Function** contains Boolean-value pairs; returns the value associated - with the first Boolean that evaluates to true (non-0). +**Syntax** +: numeric **abs**( numeric val) - **Syntax** *anyType* ( *Boolean arg1, anyType value1, Boolean arg2,* - *anyType value2, ...* **default** *anyType*) (the - **default** part is optional) +--- - **Remark** **select** is a function that simulates if-then logic - during simulation (for people familiar with C, it works - much like a series of imbedded conditionals: (a?b:(a?b:c)) - ). +#### `sqrt` - **Examples** Select can be used to simulate a **dynamic** (run-time) - **if-else** **statement**: +**Function** +: Calculates and returns the positive square root of *val* ( *val* must be $\geq$ 0). - `gnPower = select( $isHoliday, HD_GAIN, // if ($isHoliday) - ` +**Syntax** +: *float* **sqrt** ( *float val*) - `default WD_GAIN) // else` +--- - This technique can be combined with other functions to - schedule items on a hourly and daily basis. For example, an - internal gain that has different schedules for holidays, - weekdays, and weekends could be defined as follows: +#### `exp` - `// 24-hour lighting power schedules for weekend, weekday, - holiday:` +**Function** +: Calculates and returns the exponential of *val* (=e*^val^*) - `#define WE_LIGHT hourval( .024, .022, .021, .021, .021, . - 026, \` +**Syntax** +: *float* **exp**( *float val*) -              `.038, .059, .056, .060, .059, .046, \` +--- -              `.045, .005, .005, .005, .057, .064, \` +#### `logE` -              `.064, .052, .050, .055, .044, .027 )` +**Function** +: Calculates and returns the base e logarithm of *val* ( *val* + must be $\geq$ 0). - `#define WD_LIGHT hourval( .024, .022, .021, .021, .021, . - 026, \` +**Syntax** +: *float* **logE**( *float val*) -              `.038, .059, .056, .060, .059, .046, \` +--- -              `.045, .005, .005, .005, .057, .064, \` +#### `log10` -              `.064, .052, .050, .055, .044, .027 )` +**Function** +: Calculates and returns the base 10 logarithm of *val* ( *val* must be $\geq$ 0). - `#define HD_LIGHT hourval( .024, .022, .021, .021, .021, . - 026, \` +**Syntax** +: *float* **log10**( *float val*) -              `.038, .059, .056, .060, .059, .046, \` +--- -              `.045, .005, .500, .005, .057, .064, \` +#### `sin` -              `.064, .052, .050, .055, .044, .027 )` +**Function** +: Calculates and returns the sine of *val* (val in radians) - `// set power member of zone's GAIN object for lighting` +**Syntax** +: *float* **sin**( *float val*) - `gnPower = BTU_Elec( ZAREA*0.1 ) * // .1 kW/ft2 ti - mes...` +--- -     `select( $isHoliday, HD_LIGHT, // Holidays` +#### `sind` -        `$isWeekend, WE_LIGHT, // Saturday & Sunday` +**Function** +: Calculates and returns the sine of *val* (val in degrees) -        `default WD_LIGHT ); // Week Days` +**Syntax** +: *float* **sind**( *float val*) - In the above, three subexpressions using **hourval** (next) - are first defined as macros, for ease of reading and later - change. Then, gnPower (the power member of a GAIN object) - is set, using **select** to choose the appropriate one of - the three **hourval** calls for the type of day. The - expression for gnPower is a *live expression* with hourly - variation, that is, CSE will evaluate it an set gnPower to - the latest value each hour of the simulation. The variation - comes from **hourval**, which varies hourly (also, - \$isHoliday and \$isWeekend vary daily, but the faster - variation determines the variation of the result). - ------------ ----------------------------------------------------------- +--- -#### hourval +#### `asin` - ------------ ----------------------------------------------------------- - **Function** from a list of 24 values, returns the value corresponding - to the hour of day. +**Function** +: Calculates and returns (in radians) the arcsine of *val* - **Syntax** *anyType hourval ( anyType value1, anyType value2,* … - *anyType value24* ) +**Syntax** +: *float* **asin**( *float val*) - *anyType hourval ( anyType value1, anyType value2*, … - **default** *anyType*) +--- - **Remark** **hourval** is evaluated at runtime and uses the hour of - the day being simulated to choose the corresponding value - from the 24 suppplied values. +#### `asind` - If less than 24 *value* arguments are given, **default** - and another value (or expression) should be supplied to be - used for hours not explicitly specified. +**Function** +: Calculates and returns (in degrees) the arcsine of *val* - **Example** see **select**, just above. - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **asind**( *float val*) -#### abs +--- - ------------ ----------------------------------------------------------- - **Function** converts numeric to its absolute value - **Syntax** numeric **abs**( numeric val) - ------------ ----------------------------------------------------------- +#### `cos` -#### sqrt +**Function** +: Calculates and returns the cosine of *val* (val in radians) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the positive square root of *val* - ( *val* must be $\geq$ 0). +**Syntax** +: *float* **cos**( *float val*) - **Syntax** *float* **sqrt** ( *float val*) - ------------ ----------------------------------------------------------- +--- -#### exp +#### `cosd` - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the exponential of *val* (= - e*^val^*) +**Function** +: Calculates and returns the cosine of *val* (val in degrees) - **Syntax** *float* **exp**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **cosd**( *float val*) -#### logE +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the base e logarithm of *val* ( *val* - must be $\geq$ 0). +#### `acos` - **Syntax** *float* **logE**( *float val*) - ------------ ----------------------------------------------------------- +**Function** +: Calculates and returns (in radians) the arccosine of *val* -#### log10 +**Syntax** +: *float* **acos**( *float val*) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the base 10 logarithm of *val* - ( *val* must be $\geq$ 0). +--- - **Syntax** *float* **log10**( *float val*) - ------------ ----------------------------------------------------------- +#### `acosd` -#### sin +**Function** +: Calculates and returns (in degrees) the arccosine of *val* - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the sine of *val* (val in radians) - **Syntax** *float* **sin**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **acosd**( *float val*) -#### sind +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the sine of *val* (val in degrees) - **Syntax** *float* **sind**( *float val*) - ------------ ----------------------------------------------------------- +#### `tan` -#### asin +**Function** +: Calculates and returns the tangent of *val* (val in radians) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in radians) the arcsine of *val* - **Syntax** *float* **asin**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **tan**( *float val*) -#### asind +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in degrees) the arcsine of *val* - **Syntax** *float* **asind**( *float val*) - ------------ ----------------------------------------------------------- +#### `tand` -#### cos +**Function** +: Calculates and returns the tangent of *val* (val in degrees) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the cosine of *val* (val in radians) - **Syntax** *float* **cos**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **tand**( *float val*) -#### cosd +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the cosine of *val* (val in degrees) - **Syntax** *float* **cosd**( *float val*) - ------------ ----------------------------------------------------------- +#### `atan` -#### acos +**Function** +: Calculates and returns (in radians) the arctangent of *val* - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in radians) the arccosine of *val* - **Syntax** *float* **acos**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **atan**( *float val*) -#### acosd +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in degrees) the arccosine of *val* - **Syntax** *float* **acosd**( *float val*) - ------------ ----------------------------------------------------------- +#### `atand` -#### tan +**Function** +: Calculates and returns (in degrees) the arctangent of *val* - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the tangent of *val* (val in - radians) +**Syntax** +: *float* **atand**( *float val*) - **Syntax** *float* **tan**( *float val*) - ------------ ----------------------------------------------------------- +--- -#### tand +#### `atan2` - ------------ ----------------------------------------------------------- - **Function** Calculates and returns the tangent of *val* (val in - degrees) +**Function** +: Calculates and returns (in radians) the arctangent of y/x (handling x = 0) - **Syntax** *float* **tand**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **atan2**( *float y, float x*) -#### atan +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in radians) the arctangent of *val* - **Syntax** *float* **atan**( *float val*) - ------------ ----------------------------------------------------------- +#### `atan2d` -#### atand +**Function** +: Calculates and returns (in degrees) the arctangent of y/x (handling x = 0) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in degrees) the arctangent of *val* - **Syntax** *float* **atand**( *float val*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **atan2d**( *float y, float x*) -#### atan2 +--- - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in radians) the arctangent of y/x - (handling x = 0) +#### `pow` - **Syntax** *float* **atan2**( *float y, float x*) - ------------ ----------------------------------------------------------- +**Function** +: Calculates and returns *val* raised to the *x*th power (=*val*^x^). *val* and *x* cannot both be 0. If *val* < 0, *x* must be integral. -#### atan2d +**Syntax** +: *float* **pow**( *float val, numeric x*) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns (in degrees) the arctangent of y/x - (handling x = 0) +--- - **Syntax** *float* **atan2d**( *float y, float x*) - ------------ ----------------------------------------------------------- +#### `enthalpy` -#### pow +**Function** +: Returns enthalpy of moist air (Btu/lb) for dry bulb temperature (F) and humidity ratio (lb/lb) - ------------ ----------------------------------------------------------- - **Function** Calculates and returns *val* raised to the *x*th power (= - *val*^x^). *val* and *x* cannot both be 0. If *val* < 0, - *x* must be integral. +**Syntax** +: *float* **enthalpy**( *float tDb, float w*) - **Syntax** *float* **pow**( *float val, numeric x*) - ------------ ----------------------------------------------------------- +--- -#### enthalpy +#### `wFromDbWb` - ------------ ----------------------------------------------------------- - **Function** Returns enthalpy of moist air (Btu/lb) for dry bulb - temperature (F) and humidity ratio (lb/lb) +**Function** +: Returns humidity ratio (lb/lb) of moist air from dry bulb and wet bulb temperatures (F) - **Syntax** *float* **enthalpy**( *float tDb, float w*) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **wFromDbWb**( *float tDb, float tWb*) -#### wFromDbWb +--- - ------------ ----------------------------------------------------------- - **Function** Returns humidity ratio (lb/lb) of moist air from dry bulb - and wet bulb temperatures (F) +#### `wFromDbRh` - **Syntax** *float* **wFromDbWb**( *float tDb, float tWb*) - ------------ ----------------------------------------------------------- +**Function** +: Returns humidity ratio (lb/lb) of moist air from dry bulb temperature (F) and relative humidity (0 – 1) -#### wFromDbRh +**Syntax** +: *float* **wFromDbRh**( *float tDb, float rh*) - ------------ ----------------------------------------------------------- - **Function** Returns humidity ratio (lb/lb) of moist air from dry bulb - temperature (F) and relative humidity (0 – 1) +--- - **Syntax** *float* **wFromDbRh**( *float tDb, float rh*) - ------------ ----------------------------------------------------------- +#### `rhFromDbW` -#### rhFromDbW +**Function** +: Returns relative humidity (0 – 1) of moist air from dry bulb temperature (F) and humidity ratio (lb/lb). - ------------ ----------------------------------------------------------- - **Function** Returns relative humidity (0 – 1) of moist air from dry bulb - temperature (F) and humidity ratio (lb/lb). +**Syntax** +: *float* **rhFromDbW**( *float tDb, float w*) - **Syntax** *float* **rhFromDbW**( *float tDb, float w*) +**Remark** +: The return value is constrained to 0 <= rh <= 1 (that is, physically impossible combinations of tDb and w are silently tolerated). - **Remark** The return value is constrained to 0 <= rh <= 1 - (that is, physically impossible combinations of tDb and w are silently tolerated). - ------------ ----------------------------------------------------------- +--- +#### `concat` -#### concat +**Function** +: Returns *string* concatenation of arguments - ------------- ---------------------------------------------------------------- - **Function** Returns *string* concatenation of arguments +**Syntax** +: *string* **concat**( *string s1, string s2, ... string sn*) - **Syntax** *string* **concat**( *string s1, string s2, ... string sn*) - ------------- ---------------------------------------------------------------- +**Example** +: Assuming Jan 1 falls on Thurs and the simulation day is May 3:
+ **concat**( @Top.dateStr, " falls on a ", select( $isWeekend, "weekend", default "weekday")) + returns "Sun 03-May falls on a weekend" - *example:* - Assuming Jan 1 falls on Thurs and the simulation day is May 3 -- +--- - concat( @Top.dateStr, " falls on a ", select( $isWeekend, "weekend", default "weekday")) +#### `import` - returns "Sun 03-May falls on a weekend" - -#### import +**Function** +: Returns *float* read from an import file. - ------------- ---------------------------------------------------------------- - **Function** Returns *float* read from an import file. +**Syntax** +: *float* **import**( *string importFile, string colName*)\ + *float* **import**( *string importFile, int colN*) - **Syntax** *float* **import**( *string importFile, string colName*)\ - *float* **import**( *string importFile, int colN*) +**Remark** +: Columns can be referenced by name or 1-based index. + + See [IMPORTFILE][importfile] for details on use of import() - **Remark** Columns can be referenced by name or 1-based index.\ - See [IMPORTFILE](#importfile) for details on use of import() - ------------ --------------------------------------------------------------- +--- +#### `importStr` -#### importStr +**Function** +: Returns *string* read from an import file. - ------------- ----------------------------------------------------------------- - **Function** Returns *string* read from an import file. +**Syntax** +: *string* **importStr**( *string importFile, string colName*)\ + *string* **importStr**( *string importFile, int colN*) - **Syntax** *string* **importStr**( *string importFile, string colName*)\ - *string* **importStr**( *string importFile, int colN*) +**Remark** +: See [IMPORTFILE][importfile] for details on use of importStr() - **Remark** See [IMPORTFILE](#importfile) for details on use of importStr() - ------------- ----------------------------------------------------------------- +--- -#### contin +#### `contin` - ------------ ----------------------------------------------------------- - **Function** Returns continuous control value, e.g. for lighting control +**Function** +: Returns continuous control value, e.g. for lighting control - **Syntax** *float* **contin**( *float* mpf, *float* mlf, *float* sp, - *float* val) +**Syntax** +: *float* **contin**( *float* mpf, *float* mlf, *float* sp, *float* val) - **Remark** **contin** is evaluated at runtime and returns a value in - the range 0 – 1 ??? +**Remark** +: **contin** is evaluated at runtime and returns a value in the range 0 – 1 ??? - **Example** -- - - ------------ ----------------------------------------------------------- + -#### stepped +--- - ------------ ----------------------------------------------------------- - **Function** Returns stepped reverse-acting control value, e.g. for - lighting control +#### `stepped` - **Syntax** *float* **stepped**( *int* nsteps, *float* sp, *float* val) +**Function** +: Returns stepped reverse-acting control value, e.g. for lighting control - **Remark** **stepped** is evaluated at runtime and returns a value in - the range 0 – 1. If val <= 0, 1 is returned; if val - >= sp, 0 is returned; otherwise, a stepped intermediate - value is returned (see example) - ------------ ----------------------------------------------------------- +**Syntax** +: *float* **stepped**( *int* nsteps, *float* sp, *float* val) -*example:* +**Remark** +: **stepped** is evaluated at runtime and returns a value in the range 0 – 1. If val <= 0, 1 is returned; if val >= sp, 0 is returned; otherwise, a stepped intermediate value is returned (see example) -**stepped**( 3, 12, val) returns +**Example** +: $$ + \textbf{stepped}(3, 12, \text{val}) = \begin{cases} + 1 & \text{if } \text{val} < 4 \\ + 0.667 & \text{if } 4 \leq \text{val} < 8 \\ + 0.333 & \text{if } 8 \leq \text{val} < 12 \\ + 0 & \text{if } \text{val} \geq 12 + \end{cases} + $$ - *val* *result* - --------------------- ---------- - val $<$ 4 1 - 4 $\leq$ val $<$ 8 .667 - 8 $\leq$ val $<$ 12 .333 - val $\geq$ 12 0 + + +--- ### User-defined Functions @@ -1534,7 +1414,7 @@ The tradeoffs between using a user-defined function and a preprocessor macro (`# 3. Type checking: the declared types of the function and its arguments allow CSE to perform additional checks. -Note that while macros require line-splicing ("\\")to extend over one line, functions do not require it: +Note that while macros require line-splicing ("\\") to extend over one line, functions do not require it: // Function returning number of days in ith month of year: DOY FUNCTION MonthLU (integer i) = choose1 ( i , Jan 31, Feb 28, Mar 31, @@ -1549,57 +1429,54 @@ Note that while macros require line-splicing ("\\")to extend over one line, func ### Probes -*Probes* provide a universal means of referencing data within the simulator. Probes permit using the inputtable members of each object, as described in the [Input Data](#input-data) Section, as operands in expressions. In addition, most internal members can be probed; we will describe how to find their names shortly. +*Probes* provide a universal means of referencing data within the simulator. Probes permit using the inputtable members of each object, as described in the [Input Data][input-data] Section, as operands in expressions. In addition, most internal members can be probed; we will describe how to find their names shortly. -Three general ways of using probes are: +#### Ways To Use Probes -1. During input, to implement things like "make this window's width equal to 10% of the zone floor area" by using the zone's floor area in an expression: +The three general ways of using probes are: - +1. During input, to implement things like "make this window's width equal to 10% of the zone floor area" by using the zone's floor area in an expression: wnWidth = @zone[1].znArea * 0.1; -Here "`@zone[1].znArea`" is the probe. + Here "`@zone[1].znArea`" is the probe. 2. During simulation. Probing during simulation, to make inputs be functions of conditions in the building or HVAC systems, is limited because most of the members of interest are updated *after* CSE has evaluated the user's expressions for the subhour or other time interval -- this is logically necessary since the expressions are inputs. (An exception is the weather data, but this is also available through system variables such as \$tDbO.) -However, a number of *prior subhour* values are available for probing, making it possible to implement relationships like "the local heat output of this terminal is 1000 Btuh if the zone temperature last subhour was below 65, else 500": + However, a number of *prior subhour* values are available for probing, making it possible to implement relationships like "the local heat output of this terminal is 1000 Btuh if the zone temperature last subhour was below 65, else 500": tuMnLh = @znres["North"].S.prior.tAir < 65 ? 1000 : 500; 3. For output reports, allowing arbitrary data to be reported at subhourly, hourly, daily, monthly, or annual intervals. The REPORT class description describes the user-defined report type (UDT), for which you write the expression for the value to be reported. With probes, you can thus report almost any datum within CSE -- not just those values chosen for reporting when the program was designed. Even values calculated during the current subhour simulation can be probed and reported, because expressions for reports are evaluated after the subhour's calculations are performed. -Examples: - +!!! example colVal = @airHandler["Hot"].ts; // report air handler supply temp colVal = @terminal[NorthHot].cz; // terminal air flow to zone (Btuh/F) +#### General form + The general form of a probe is -    @ *className* \[ *objName* \] . *member* +    @ *className* [ *objName* ] . *member* + + +`className` +: is the CLASS being probed -The initial @ is always necessary. And don't miss the period after the \]. +`objName` +: is the name of the specific object of the class; alternately, a numeric subscript is allowed. Generally, the numbers correspond to the objects in the order created. \[ *objName* \] can be omitted for the TOP class, which has only one member, Top. -*className* is the CLASS being probed +`member` +: is the name of the particular member being probed. This must be exactly correct. For some inputtable members, the probe name is not the same as the input name given in the [Input Data][input-data] Section, and there are many probe-able members not described in the [Input Data][input-data] section. - ------------ ----------------------------------------------------------- - *objName* is the name of the specific object of the class; - alternately, a numeric subscript is allowed. Generally, the - numbers correspond to the objects in the order created. \[ - *objName* \] can be omitted for the TOP class, which has - only one member, Top. +!!! tip + The initial `@` is always necessary. And don't miss the period after the `]`. - *member* is the name of the particular member being probed. This - must be exactly correct. For some inputtable members, the - probe name is not the same as the input name given in the - [Input Data](#input-data) Section, and there are many - probe-able members not described in the - [Input Data](#input-data) section. - ------------ ----------------------------------------------------------- +#### probes.txt How do you find out what the probe-able member names are? CSE will display the a list of the latest class and member names if invoked with the -p switch. Use the command line - CSE -p >probes.txt + CSE -p > probes.txt to put the displayed information into the file PROBES.TXT, then print the file or examine it with a text editor. @@ -1623,7 +1500,7 @@ A portion of the `-p` output looks like: In the above "exportCol" and "holiday" are class names, and "name", "colHead", "colGap", . . . are member names for class exportCol. Some members have multiple names separated by .'s, or they may contain an additional subscript. To probe one of these, type all of the names and punctuation exactly as shown (except capitalization may differ); if an additional subscript is shown, give a number in the specified range. An "I" designates an "input" parameter, an R means "runtime" parameter. The "owner" is the class of which this class is a subclass. -The data type and variation of each member is also shown. Note that *variation*, or how often the member changes, is shown here. (*Variability*, or how often an expression assigned to the member may change, is given for the input table members in the [Input Data](#input-data) Section). Members for which an "end of" variation is shown can be probed only for use in reports. A name described as "un-probe-able" is a structure or something not convertible to an integer, float, or string. +The data type and variation of each member is also shown. Note that *variation*, or how often the member changes, is shown here. (*Variability*, or how often an expression assigned to the member may change, is given for the input table members in the [Input Data][input-data] Section). Members for which an "end of" variation is shown can be probed only for use in reports. A name described as "un-probe-able" is a structure or something not convertible to an integer, float, or string. -[Operation](#operation) documents the operational aspects of CSE, such as command line switches, file naming conventions, and how CSE finds files it needs. +[Operation][operation] documents the operational aspects of CSE, such as command line switches, file naming conventions, and how CSE finds files it needs. -[Input Structure](#input-structure) documents the CSE input language in general. +[Input Structure][input-structure] documents the CSE input language in general. -[Input Data](#input-data) describes all of the specific input language statements. +[Input Data][input-data] describes all of the specific input language statements. -[Output Reports](#output-reports) will describe the output reports. +[Output Reports][output-reports] will describe the output reports. -Lastly, [Probe Definitions](#probe-definitions) lists all available probes. +Lastly, [Probe Definitions][probe-definitions] lists all available probes. ", "", text) + + excluded_level = None + for line in text.splitlines(): + match = heading_re.match(line) + if not match: + continue + + level = len(match.group(1)) + heading = match.group(2).strip() + + if heading in AUTOREF_CONFIG["exclude_headings"]: + continue + + if excluded_level: + if level > excluded_level: + continue + else: + excluded_level = None + + if heading in AUTOREF_CONFIG["exclude_subheadings_of"]: + excluded_level = level + + slug = slugify(heading) + text_to_slug[heading] = slug + slug_levels[slug] = level + +# Sort and compile all headings found by walking docs *.md files. +escaped = sorted((re.escape(text) for text in text_to_slug), key=len, reverse=True) +combined_pattern = re.compile( + rf""" + (?\n' if not header else "") + + "| " + + " | ".join(header_row) + + " |\n" + + "| " + + " | ".join("------" for _ in header_row) + + " |\n" + + ( + "\n".join( + ("| " + " | ".join(f"{c}" for c in row) + " |") for row in body_rows + ) + if len(body_rows) > 0 + else "" + ) + ) + + return table + + @env.macro + def csv_table_from_file(file_path, header=False): + full_path = Path(__file__).parent.resolve().joinpath(file_path) + csv_content = "" + + try: + with open(full_path, "r") as file: + csv_content = file.read() + except FileNotFoundError: + print(f"Error: File not found at path: {file_path}") + except Exception as e: + print(f"An error occurred: {e}") + + return csv_table(csv_content, header) + + @env.macro + def member_table(args): + fallback = "—" + units = args.get("units", fallback) + legal_range = args.get("legal_range", fallback) + default = args.get("default", fallback) + required = args.get("required", "No") + variability = args.get("variability", "constant") + + table = ( + '
\n' + + "| " + + " | ".join( + f"{c}" + for c in ["Units", "Legal Range", "Default", "Required", "Variability"] + ) + + " |\n" + + "| " + + " | ".join("------" for _ in 5 * [""]) + + " |\n" + + "| " + + " | ".join( + f"{c if c is not None else fallback}" + for c in [units, legal_range, default, required, variability] + ) + + " |\n" + ) + + return table diff --git a/doc/src/mkdocs.yml b/doc/src/mkdocs.yml new file mode 100644 index 000000000..bc9f87d74 --- /dev/null +++ b/doc/src/mkdocs.yml @@ -0,0 +1,60 @@ +site_author: CSE Authors +site_description: Documentation Website for CSE +site_dir: ../build +site_name: CSE Documentation +site_url: "https://cse-sim.github.io/cse/" +copyright: "© 2025 The CSE Authors. All rights reserved." +watch: + - main.py +theme: + name: material + features: + - content.code.copy + - toc.follow + - navigation.instant + - navigation.indexes + - navigation.footer + # favicon: assets/favicon.ico + # logo: assets/logo.svg + # palette: + # primary: blue grey + # accent: blue +repo_name: cse +repo_url: https://github.com/cse-sim/cse +plugins: + - autorefs: + resolve_closest: true + - macros + - search + - awesome-nav +hooks: + - hooks.py +markdown_extensions: + - admonition + - attr_list + - def_list + - pymdownx.arithmatex: + generic: true + - pymdownx.blocks.caption + - pymdownx.caret + - pymdownx.critic + - pymdownx.details + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.tilde +extra_css: + - https://unpkg.com/katex@0/dist/katex.min.css + - assets/stylesheets/extra_styles.css +extra_javascript: + - https://unpkg.com/katex@0/dist/katex.min.js + - https://unpkg.com/katex@0/dist/contrib/auto-render.min.js + - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js + - assets/javascript/extra_js.js diff --git a/doc/src/output-reports.md b/doc/src/output-reports.md deleted file mode 100644 index 46cd174be..000000000 --- a/doc/src/output-reports.md +++ /dev/null @@ -1,242 +0,0 @@ -# Output Reports - -CSE report data is accumulated during simulation and written to the report file at the end of the run. Some reports are generated by default and cannot be turned off. There are a set of predefined reports which may be requested in the input. The user may also define custom reports which include many CSE internal variables. Reports may accumulate data on an a variety of frequencies including subhourly, hourly, daily, monthly, and annual (run) intervals. - -## Units - -The default units for CSE reports are: - - ------------- --------------------------------------------------------- - Energy mBtu, millions of Btu (to convert to kWh divide by 292) - Temperature degrees Farenheit - Air Flow cfm (cubic feet per minute) - ------------- --------------------------------------------------------- - -## Time - -Hourly reports show hour 1 through 24 where hour 1 includes the time period from midnight to 1 AM. By default, CSE specifies that January first is a Thursday and the simulation occurs on a non-leap year. Daylight savings is in effect from the second Sunday of March on which CSE skips hour 3 until the first Sunday of November when CSE simulates 25 hours. These calendar defaults can be modified as required. - -## METER Reports - -A Meter Report displays the energy use of a METER object, a user-defined "device" that records energy consumption of equipment as simulated by CSE. CSE allows the user to define as many meters as desired and to assign any energy using device to any meter. - -Meters account for energy use in pre-defined categories, called *end uses, that are documented with METER.* - -## Air Flow Meter Report - -An Air Flow Meter Report displays air flow values accumulated by an AFMETER that is associated with one or more ZONEs. The report provides insight into the results of the AirNet pressure model. - -AFMETER maintains values for subhour, hour, day, month, and year intervals. Values are standard cfm (0.075 lb/ft3). Values for intervals longer than subhour are averages. - -Flows are categorized by 1) direction of flow (+ = into zone(s), - = out of zone(s)); IZXFER izAFCat tags; and 3) type of source or sink of the flow (ambient, unconditioned zone, conditioned zone). - -The following items are displayed (using the abbreviations shown in the report headings). The "+/-" notation indicates that two columns are included, one for each direction of flow. For example, "InfX+/-" means the report includes columns "InfX+" (infiltration flows into the zone) and "InfX-" (infiltration flows out of the zone). - ----------- ------------------------------------------------------------- -Tot+/- Total flows - -Unkn+/- Uncategorized flows (generally this shows 0) - -InfX+/- Infiltration flows from/to ambient (izAFCat = InfilEx) - -VntX+/- Natural vent exchanges from/to ambient (izAFCat = VentEx) - -FanX+/- Forced vent and DOAS flows to/from ambient (izAFCat = FanEx) - -InfU+/- Infiltration flows from/to unconditioned zones (izAFCat = InfilIz) - -VntU+/- Natural vent flows from/to unconditioned zones (izAFCat = VentIz) - -FanU+/- Forced vent flows from/to unconditioned zones (izAFCat = FanIz) - -InfC+/- Infiltration flows from/to conditioned zones (izAFCat = InfilIz) - -VntC+/- Natural vent flows from/to conditioned zones (izAFCat = VentIz) - -FanC+/- Forced vent flows from/to conditioned zones (izAFCat = FanIz) - -Duct+/- Duct leakage flows - -HVAC+/- HVAC air flows at zone (i.e. at registers) ----------- ------------------------------------------------------------- - - -## Energy Balance Report - -The Energy Balance Report displays the temperature and sensible and latent heat flows into and out of the air of a single zone. Sign conventions assume that a positive flow increases the air temperature. Heat flow from a warm mass element such as a concrete wall into the zone air is defined as a positive flow, heat flow from air into mass is negative. Solar gain into the zone is defined as a positive heat flow. Solar gain that is incident on and absorbed directly into a mass element is shown as both a positve in the SOLAR column (gain to the zone) and a negative in the MASS column (lost from the zone to the mass). - -In a real building zone energy and moisture flows must balance due to the laws of physics. CSE uses approximate solutions for the energy and moisture balances and displays the net balance which is a measure of internal calculation error. - -The following items are displayed (using the abbreviations shown in the report headings): - - ---------- ------------------------------------------------------------- - Tair Air temperature in the zone (since CSE uses combined films - this is technically the effective temperature and includes - radiant effects). - - WBair Wet Bulb temperature in the zone. - - Cond Heat flow through light weight surfaces from or to the - outdoors. - - InfS Sensible infiltration heat flow from outdoors. - - Slr Solar gain through glazing (net) and solar gains absorbed by - light surfaces and transmitted into the zone air. - - IgnS Sensible internal gains from lights, equipment, people, etc. - - Mass Net heat flow to (negative) and from (positive) the mass - elements of the zone. - - Izone Net heat flows to other zones in the building. - - MechS Net heat flows from heating, cooling and ventilation. - - BALS The balance (error) calculated by summing the sensible gains - and losses. - - InfL Latent infiltration heat flow. - - IgnL Latent internal gains. - - AirL Latent heat absorbed (negative) or released (positive) by - changes in the room air moisture content. - - MechL Latent heat added or removed by cooling or ventilation. - - BalL The balance (error) calculated by summing the sensible gains - and losses. - ---------- ------------------------------------------------------------- - -## Air Handler Load Report - -The Air Handler Load Report displays conditions and loads at the peak load hours for the air handler for a single zone. The following items are displayed: - - ---------- ------------------------------------------------------------- - PkVf Peak flow (cfm) at supply fan - VfDs Supply fan design flow (same as peak for E10 systems) - PkQH Peak heat output from heating coil. - Hcapt Rated capacity of heat coil - ---------- ------------------------------------------------------------- - -The rest are about the cooling coil. Most of the columns are values at the time of peak part load ratio (plr). Note that, for example, the peak sensible load is the sensible load at the time of peak part load ratio, even if there was a higher sensible load at another time when the part load ratio was smaller. - - ------ ----------------------------------------------------------------- - PkMo Month of cooling coil peak plr, 1-12 - - Dy Day of month 1-31 of peak - - Hr Hour of day 1-24 of cooling coil peak plr. - - Tout Outdoor drybulb temperature at time of cooling coil peak plr. - - Wbou Outdoor wetbulb similarly - - Ten Cooling coil entering air temperature at time of peak plr. - - Wben Entering wetbulb similarly - - Tex Exiting air temperature at plr peak - - WbexExiting air wetbulb similarly - - -PkQs Sensible load at time of peak plr, shown positive. - - -PkQl Latent load likewise - - -PkQC Total load -- sum of PkQs and PkQl - - CPlr Peak part load ratio: highest fraction of coil's capacity used, - reflecting both fraction of maximum output under current - conditions used when on and fraction of the time the fan is on. - The maximum output under actual conditions can vary considerably - from the rated capacity for DX coils. The fraction of maximum - output used can only be 1.0 if the sensible and total loads - happen to occur in the same ratio as the sensible and total - capacities. The time the fan is on can be less than 1.0 for - residential systems in which the fan cycles on with the - compressor. For example, if at the cooling peak the coil ran at - .8 power with the fan on .9 of the time, a CPlr of .72 would be - reported. The preceding 12 columns are values at the time this - peak occured. - - Ccapt Cooling coil rated total capacity - - Ccaps Rated sensible capacity. - ------ ----------------------------------------------------------------- - -## Air Handler Report - -The Air Handler Load Report displays conditions and heat flows in the air handler for the time period specified. It is important to note that the air handler report only accumulates data if the air handler is on during an hour. The daily and monthly values are averages of the hours the air handler was on and DO NOT INCLUDE OFF HOUR VALUES. The following items are displayed: - - ---------- ------------------------------------------------------------- - Tout Outdoor drybulb temperature during hours the air handler was - on. - - Wbou Outdoor wetbulb temperature similarly. - - Tret Return air dry bulb temperature during hours the air handler - was on before return duct losses or leaks. - - Wbre Return air wetbulb similarly - - po Fraction outside air including economizer damper leakage, but - not return duct leakage. - - Tmix Mixed air dry bulb temperature -- after return air combined - with outside air; after return fan, but before supply fan and - coil(s). - - Wbmi Mixed air wet bulb temperature, similarly. - - Tsup Supply air dry bulb temperature to zone terminals -- after - coil(s) and air handler supply duct leak and loss; (without - in zone duct losses after terminals). - - WBsu Supply air wet bulb temperature similarly. - - HrsOn Hours during which the fan operated at least part of the - time. - - FOn Fraction of the time the fan was on during the hours it - operated (HrsOn). CHECK FOR VAV, IS IT FLOW OR TIME - - VF Volumetric flow, measured at mix point/supply fan/coils; - includes air that leaks out of supply duct and is thus non-0 - even when zone terminals are taking no flow - - Qheat Heat energy added to air stream by heat coil, if any, - MEASURED AT COIL not as delivered to zones (see Qload). - - Qsens, Sensible, latent, and total heat added to air stream - Qlat and (negative values) by cooling coil, MEASURED AT COIL, - Qcool including heat cancelled by fan heat and duct losses, and - heat added to air lost through supply duct leak. - - Qout Net heat taken from outdoor air. Sum of sensible and latent, - measured RELATIVE TO CURRENT RETURN AIR CONDITIONS. - - Qfan Heat added to air stream by supply fan, plus return fan if - any -- but not relief fan.. - - Qloss Heat added to air stream by supply and return duct leaks and - conductive loss. Computed in each case as the sensible and - latent heat in the air stream relative to return air - conditions after the leak or loss, less the same value before - the leak or loss. - - Qload Net energy delivered to the terminals -- Sensible and latent - energy, measured relative to return air conditions. INCLUDES - DUCT LOSSES after terminals; thus will differ from sum of - zone qMech's + qMecLat's. - - Qbal Sum of all the 'Q' columns, primarily a development aid. Zero - indicates consistent and accurate computation; the normal - printout is something like .0000, indicating that the value - was too small to print in the space alloted, but not - precisely zero, due to computational tolerances and internal - round-off errors. - ---------- ------------------------------------------------------------- - - diff --git a/doc/src/parsers/__init__.py b/doc/src/parsers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/doc/src/parsers/base.py b/doc/src/parsers/base.py new file mode 100644 index 000000000..a4797b360 --- /dev/null +++ b/doc/src/parsers/base.py @@ -0,0 +1,73 @@ +import json +import re +import yaml + +from abc import ABC, abstractmethod +from pathlib import Path +from typing import TypeVar, Generic + +T = TypeVar("T") + + +class BaseParser(ABC, Generic[T]): + def __init__(self, path: Path): + if not path: + raise Exception("Provide the path to the file to be parsed.") + + self.path = path + self.raw_text = "" + self.clean_text = "" + self.result = None + + def read(self): + with open(self.path, "r") as f: + self.raw_text = f.read() + + def strip_falsy_blocks(self, text: str): + return re.sub(r"^\s*#if\s+0\b.*?^\s*#endif\b.*?$", "", text, flags=re.MULTILINE) + + def strip_block_comments(self, text: str): + return re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL | re.MULTILINE) + + def strip_inline_comments(self, text: str): + return re.sub(r"//.*$", "", text) + + def prepare_clean_text(self): + if not self.raw_text: + self.read() + self.clean_text = self._prepare_clean_text() + return self.clean_text + + @abstractmethod + def _prepare_clean_text(self) -> str: + pass + + def parse(self): + if not self.clean_text: + self.prepare_clean_text() + self.result = self._parse() + return self.result + + @abstractmethod + def _parse(self) -> T: + pass + + def to_json(self, output_path=None): + if not self.result: + self.parse() + + if not output_path: + raise Exception("Specify the output path for the to_json method.") + + with open(output_path, "w") as f: + json.dump(self.result, f, indent=2) + + def to_yaml(self, output_path=None): + if not self.result: + self.parse() + + if not output_path: + raise Exception("Specify the output path for the to_yaml method.") + + with open(output_path, "w") as f: + yaml.dump(self.result, f, default_flow_style=False, sort_keys=False) diff --git a/doc/src/parsers/cndefns.py b/doc/src/parsers/cndefns.py new file mode 100644 index 000000000..4998e9c06 --- /dev/null +++ b/doc/src/parsers/cndefns.py @@ -0,0 +1,75 @@ +import re + +from typing import Literal, Dict, List, TypedDict, Tuple + +from .base import BaseParser + +type BlockKey = Literal["OPTIONS"] | Literal["DEFINES"] + +type ParsedDefineLine = Tuple[str, int | str] + + +class DefinitionsResult(TypedDict): + bool: List[str] + kvp: Dict[str, int | str] + + +class DefinitionsParser(BaseParser[DefinitionsResult]): + def get_block_by_key(self, key: BlockKey, text: str): + pattern = re.compile( + rf"^//-{{10,}}\s*{re.escape(key)}\s*-{{10,}}.*?\n" + r"(.*?)" + r"(?=^//-{{10,}}|\Z)", + flags=re.MULTILINE | re.DOTALL, + ) + match = pattern.search(text) + + if not match: + raise Exception(f"Could not find the {key} block.") + + return match.group(1).strip() + + def parse_define_line(self, line) -> Tuple[str, int | str]: + line = self.strip_inline_comments(line).strip() + + match = re.match(r"^#define\s+(\w+)(?:\s+(.*))?$", line) + + if not match: + return None, None + + key, raw_value = match.groups() + + if raw_value is None: + return key, True + + raw_value = raw_value.strip() + + try: + value = int(raw_value) + except ValueError: + value = raw_value.strip('"').strip("'") + + return key, value + + def _prepare_clean_text(self): + return self.raw_text + + def _parse(self): + result: DefinitionsResult = {"bool": [], "kvp": {}} + + keys: List[BlockKey] = ["OPTIONS", "DEFINES"] + + for key in keys: + block = self.get_block_by_key(key, self.clean_text) + for line in block.splitlines(): + parsed_key, parsed_value = self.parse_define_line(line) + + if not parsed_key: + continue + + if parsed_value: + result["bool"].append(parsed_key) + else: + result["kvp"][parsed_key] = parsed_value + + return result diff --git a/doc/src/parsers/cnfields.py b/doc/src/parsers/cnfields.py new file mode 100644 index 000000000..6a5e44a97 --- /dev/null +++ b/doc/src/parsers/cnfields.py @@ -0,0 +1,59 @@ +import re + +from typing import List, TypedDict + +from .base import BaseParser + + +class BaseField(TypedDict): + typename: str + datatype: str + limits: str + units: str + + +class Field(BaseField, total=False): + comments: List[str] + + +type FieldsResult = List[Field] + + +class FieldsParser(BaseParser[FieldsResult]): + def _prepare_clean_text(self): + # We want to keep inline comments, since those can be saved in field["comments"]. + return self.strip_block_comments(self.raw_text) + + def _parse(self): + result: FieldsResult = [] + for line in self.clean_text.splitlines(): + stripped = line.strip() + if not stripped or stripped.startswith("//"): + continue + + tokens: List[str] = re.split(r"\s+", stripped, maxsplit=4) + # A line must have a value for each of the four named columns. + if len(tokens) < 4: + continue + + typename, datatype, limits, units = tokens[:4] + comment = None + + # TODO: Support for comments longer than one end-of-line? + comment_match = re.search(r"//(.*)$", line) + if comment_match: + comment: str = comment_match.group(1).strip() + + field: Field = { + "typename": typename.upper(), + "datatype": datatype, + "limits": limits, + "units": units, + } + + if comment: + field["comments"] = [comment] + + result.append(field) + + return result diff --git a/doc/src/parsers/cnrecs.py b/doc/src/parsers/cnrecs.py new file mode 100644 index 000000000..6cdf41a63 --- /dev/null +++ b/doc/src/parsers/cnrecs.py @@ -0,0 +1,628 @@ +import re + +from pathlib import Path +from typing import Literal, List, Set, Dict, TypedDict + +from .base import BaseParser +from .cnfields import FieldsResult +from .cndefns import DefinitionsResult + + +# TODO:Better definition for Field +class Field(TypedDict, total=False): + name: str + type: str + # could make this a union of string literals + # Can this be derived from FIELD_VARIABILITY_DIRECTIVES? + variability_directives: List[str] + # Can hide/noname be derived from bool directives constant? + hide: bool + noname: bool + # Can array/est be derived from kvp directives constant? + array: str + nest: str + + +# class FieldGroup() +class FieldGroup(TypedDict, total=False): + members: List[Field] + comments: List[str] + + +type RecordType = Literal["RAT", "SUBSTRUCT"] + + +class Record(TypedDict, total=False): + id: str + name: str + type: RecordType + field_groups: List[FieldGroup] + record_comments: List[str] + + +type RecordsResult = Dict[str, Record] + + +RECORD_BLOCK_PATTERN = re.compile( + r"^\s*(RECORD)\s+([a-zA-Z_0-9-]+)\s+" r"(.*?)" r"^\s*\*END.*?$", + re.MULTILINE | re.DOTALL, +) + +RECORD_HEADER_PATTERN = re.compile( + r""" + ^RECORD\s+ + (?P[a-zA-Z_0-9]+)\s+ + "(?P.*?)"\s+ + \*(?PRAT|SUBSTRUCT)\b + (?P.*) + """, + re.VERBOSE | re.IGNORECASE, +) + +RECORD_HEADER_BOOL_DIRECTIVES = {"hideall"} +RECORD_HEADER_KVP_DIRECTIVES = {"baseclass"} + +RECORD_BOOL_DIRECTIVES = {"excon", "exdes", "ovrcopy"} +RECORD_KVP_DIRECTIVES = {"prefix"} + +FIELD_BOOL_DIRECTIVES = {"hide", "noname"} +FIELD_KVP_DIRECTIVES = { + "array", + "nest", +} +FIELD_VARIABILITY_DIRECTIVES = { + "s", + "h", + "mh", + "d", + "m", + "r", + "y", + "e", + "p", + "f", + "i", + "z", +} + + +# Inline block means it is a block comment that starts and ends on the same line. +# Example: This line has /* block comment */ an inline block comment. +COMMENT_TOKEN_PATTERN = re.compile( + r"(?P/\*.*?\*/)|(?P//)|(?P/\*)|(?P\*/)" +) + + +def parse_content_and_comments(line: str, in_block_comment=False): + content = [] + comments = [] + + if line.strip() == "": + return [], [], in_block_comment + + for match in COMMENT_TOKEN_PATTERN.finditer(line): + if in_block_comment: + if match.group("inline_block") or match.group("block_end"): + leading_comment = line[: match.end() - 2] + + # Don't append blank lines, so the if-statement uses .strip(). + # But for now, we do want to preserve comment white space, + # so the actual value (without .strip()) is stored. + if leading_comment.strip(): + comments += [leading_comment] + nested_content, nested_comments, in_block_comment = ( + parse_content_and_comments(line[match.end() :]) + ) + comments += nested_comments + content += nested_content + in_block_comment = False + + else: + comments += [line] + break + + else: + if match.group("inline_start"): + leading_content = line[: match.start()].strip() + trailing_comment = line[match.start() + 2 :] + + if leading_content: + content += [leading_content] + + if trailing_comment.strip(): + comments += [trailing_comment] + break + elif match.group("inline_block"): + leading_content = line[: match.start()].strip() + middle_comment = line[match.start() + 2 : match.end() - 2] + + if leading_content: + content += [leading_content] + + if middle_comment.strip(): + comments += [middle_comment] + + nested_content, nested_comments, in_block_comment = ( + parse_content_and_comments(line[match.end() :]) + ) + content += nested_content + comments += nested_comments + elif match.group("block_start"): + leading_content = line[: match.start()].strip() + trailing_comment = line[match.start() + 2 :] + + if leading_content: + content += [leading_content] + + if trailing_comment.strip(): + comments += [trailing_comment] + in_block_comment = True + elif match.group("block_end"): + raise Exception( + "End block comment token cannot appear first if not already in a block comment." + ) + break # ensure that if there are no matches from pattern.find_iter that we go to else block + else: + if in_block_comment and line.strip(): + comments += [line] + elif line.strip(): + content += [line.strip()] + + return content, comments, in_block_comment + + +def make_field_dict_from_pending_tokens( + type_name_pair, + pending_variability_directives, + pending_boolean_directives, + pending_kvp_directives, +): + result = {} + + if list(type_name_pair.keys())[0]: + result["type"] = list(type_name_pair.keys())[0] + + if list(type_name_pair.values())[0]: + result["name"] = list(type_name_pair.values())[0] + + if len(pending_variability_directives) > 0: + result["variability_directives"] = pending_variability_directives + if len(pending_boolean_directives) > 0: + for boolean_directive in pending_boolean_directives: + result[boolean_directive] = True + if len(pending_kvp_directives) > 0: + for kvp in pending_kvp_directives: + result[list(kvp.keys())[0]] = list(kvp.values())[0] + + return result + + +def parse_field_directives( + line: str, field_pattern: re.Pattern, member_types: Set[str], first_line_of_record +): + field_match = field_pattern.match(line) + + if field_match: + field_data = {} + tokens = [t for t in line.split(" ") if t.strip()] + + variability_directives = [] + boolean_directives = [] + kvp_directives = [] + + field_array = [] + + i = 0 + while i < len(tokens): + token = tokens[i] + next_token = tokens[i + 1] if i + 1 < len(tokens) else None + + if ( + token.startswith("*") + and token[1:].lower() in FIELD_VARIABILITY_DIRECTIVES + ): + # could use set, but would prefer to maintain order in list. Probably an ordered set is a thing in python? + if token[1:].lower() in variability_directives: + i += 1 + continue + + variability_directives.append(token[1:].lower()) + + elif token.startswith("*") and token[1:].lower() in FIELD_BOOL_DIRECTIVES: + boolean_directives.append(token[1:].lower()) + + elif token.startswith("*") and token[1:].lower() in FIELD_KVP_DIRECTIVES: + if next_token is None: + raise Exception( + "A kvp directive appeared without a corresponding value." + ) + + kvp_directives.append({token[1:].lower(): next_token}) + i += 1 + + elif token.upper() in member_types: + field_data["type"] = token.upper() + if next_token is None: + raise Exception( + "A field type appeared without a corresponding field name." + ) + + field_array.append( + make_field_dict_from_pending_tokens( + {token.upper(): next_token}, + variability_directives, + boolean_directives, + kvp_directives, + ) + ) + variability_directives = [] + boolean_directives = [] + kvp_directives = [] + + i += 1 + + else: + field_array.append( + make_field_dict_from_pending_tokens( + {"": token}, + variability_directives, + boolean_directives, + kvp_directives, + ) + ) + variability_directives = [] + boolean_directives = [] + kvp_directives = [] + + i += 1 + + if any( + [ + len(variability_directives) > 0, + len(boolean_directives) > 0, + len(kvp_directives) > 0, + ] + ): + raise Exception( + f"If a line containes variability, boolean, or kvp directives, it must also contain a field name and/or type.\n{line}\n{first_line_of_record}" + ) + + return field_array + + +def get_field_start_pattern(field_types: Set[str]) -> re.Pattern: + # Combine known directives and member types into a single list + directives = FIELD_BOOL_DIRECTIVES.union( + FIELD_KVP_DIRECTIVES, FIELD_VARIABILITY_DIRECTIVES + ) + + # Prefix directives with literal * + directive_patterns = [r"\*" + re.escape(d) for d in directives] + member_patterns = [re.escape(m) for m in field_types] + + # Combine and build the full pattern + all_patterns = directive_patterns + member_patterns + pattern = r"^\s*(?:" + "|".join(all_patterns) + r")\b" + + return re.compile(pattern, re.IGNORECASE) + + +def remove_multiline_comments(text: str): + """Remove all multiline comments (i.e., /*...*/).""" + pattern = re.compile(r"/\*.*?\*/", re.DOTALL) + + return pattern.sub(" ", text) + + +def remove_inline_comments(text: str): + cleaned_lines = [line.split("//", 1)[0].rstrip() for line in text.splitlines()] + return "\n".join(cleaned_lines) + + +def remove_comments(text: str): + return remove_inline_comments(remove_multiline_comments(text)) + + +def parse_directives( + text: str, bool_directives: Set[str], kvp_directives: Set[str] +) -> dict: + directives = {} + + tokens = re.findall(r"\*([a-zA-Z0-9_]+)(?:\s+([a-zA-Z0-9_]+))?", text) + + for key, value in tokens: + key_lower = key.lower() + if key_lower in bool_directives: + directives[key_lower] = True + elif key_lower in kvp_directives: + directives[key_lower] = value.strip() if value else None + + return directives if len(tokens) > 0 else None + + +def parse_declare_directive(text: str): + match = re.match(r'\s*\*declare\s+"(.*?)"', text) + + if match: + return {"declare": match.group(1)} + + +def parse_define_statement(text: str): + match = re.match(r"#define\s+(.*)", text) + + if match: + return {"define": match.group(1)} + + +def parse_record(text, field_types: Set[str]): + data = {} + + lines = text.splitlines() + index = 0 + in_block_comment = False + pending_comments = [] + pending_fields = [] + + elapsed_lines = 0 + + while index < len(lines): + line = lines[index] + + content, comments, in_block_comment = parse_content_and_comments( + line, in_block_comment + ) + + merged_line_content = " ".join(content) + + header_match = RECORD_HEADER_PATTERN.match(merged_line_content) + if header_match: + data["id"] = header_match.group("id") + data["name"] = header_match.group("name") + data["type"] = header_match.group("type") + + parsed_record_header_directives = parse_directives( + merged_line_content, + RECORD_HEADER_BOOL_DIRECTIVES, + RECORD_HEADER_KVP_DIRECTIVES, + ) + + data = {**data, **parsed_record_header_directives} + + if len(comments) > 0: + data["record_comments"] = comments + + next_in_block_comment = in_block_comment + while index + 1 < len(lines): + next_line_content, next_line_comments, next_in_block_comment = ( + parse_content_and_comments(lines[index + 1], next_in_block_comment) + ) + + # Capture all comments until either a blank line or line with real content is encountered. + if len(next_line_content) == 0 and len(next_line_comments) > 0: + if "record_comments" in data: + data["record_comments"] += next_line_comments + else: + data["record_comments"] = next_line_comments + in_block_comment = next_in_block_comment + index += 1 + else: + break + + if len(content) == 0 and len(comments) > 0: + pending_comments += comments + index += 1 + elapsed_lines = 0 + continue + + if len(content) == 0 and len(comments) == 0: + # + if "field_groups" not in data: + data["field_groups"] = [] + + if len(pending_fields) > 0: + field_group = {"members": pending_fields} + + if len(pending_comments) > 0: + field_group["comments"] = pending_comments + + data["field_groups"] += [field_group] + pending_comments = [] + pending_fields = [] + + # If a pending comment is more than one line away when + # the next parsed field directive appearsh, do not assume + # it is related. + if elapsed_lines > 1: + pending_comments = [] + elapsed_lines = 0 + + record_directive = parse_directives( + merged_line_content, RECORD_BOOL_DIRECTIVES, RECORD_KVP_DIRECTIVES + ) + + if record_directive and len(record_directive.keys()) > 1: + raise Exception( + "Parser expects at most one record directive (or declare directive) per line" + ) + + if record_directive: + if len(pending_comments) > 0 and len(pending_fields) == 0: + pending_comments = [] + + next_in_block_comment = in_block_comment + while index + 1 < len(lines): + next_line_content, next_line_comments, next_in_block_comment = ( + parse_content_and_comments(lines[index + 1], next_in_block_comment) + ) + + # Capture all comments until either a blank line or line with real content is encountered. + if len(next_line_content) == 0 and len(next_line_comments) > 0: + comments += next_line_comments + in_block_comment = next_in_block_comment + index += 1 + else: + break + + key = next(iter(record_directive)) + value = record_directive[key] + if len(comments) > 0: + data = {**data, key: {"value": value, "comments": comments}} + else: + data = {**data, **record_directive} + + define_statement = parse_define_statement(merged_line_content) + + if define_statement: + next_in_block_comment = in_block_comment + while index + 1 < len(lines): + next_line_content, next_line_comments, next_in_block_comment = ( + parse_content_and_comments(lines[index + 1], next_in_block_comment) + ) + + # Capture all comments until either a blank line or line with real content is encountered. + if len(next_line_content) == 0 and len(next_line_comments) > 0: + comments += next_line_comments + in_block_comment = next_in_block_comment + index += 1 + else: + break + + if len(comments) > 0: + define_statement["comments"] = comments + + pending_fields.append(define_statement) + + # Fields + + declare_directive = parse_declare_directive(line) + if declare_directive: + next_in_block_comment = in_block_comment + while index + 1 < len(lines): + next_line_content, next_line_comments, next_in_block_comment = ( + parse_content_and_comments(lines[index + 1], next_in_block_comment) + ) + + # Capture all comments until either a blank line or line with real content is encountered. + if len(next_line_content) == 0 and len(next_line_comments) > 0: + comments += next_line_comments + in_block_comment = next_in_block_comment + index += 1 + else: + break + + if len(comments) > 0: + declare_directive["comments"] = comments + + pending_fields.append(declare_directive) + + field_pattern = get_field_start_pattern(field_types) + + field_directives = parse_field_directives( + merged_line_content, field_pattern, field_types, lines[0] + ) + if len(field_directives or []) > 0: + next_in_block_comment = in_block_comment + while index + 1 < len(lines): + next_line_content, next_line_comments, next_in_block_comment = ( + parse_content_and_comments(lines[index + 1], next_in_block_comment) + ) + + # Capture all comments until either a blank line or line with real content is encountered. + if len(next_line_content) == 0 and len(next_line_comments) > 0: + comments += next_line_comments + in_block_comment = next_in_block_comment + index += 1 + else: + break + + if len(comments) > 0: + for directive in field_directives: + directive["comments"] = comments + + pending_fields += field_directives + + # If line is empty or we are at end of record block, attach any pending + # fields as a new field group. + if (len(content) == 0 and len(comments) == 0) or ( + index == len(lines) - 1 and len(pending_fields) > 0 + ): + # + if "field_groups" not in data: + data["field_groups"] = [] + + if len(pending_fields) > 0: + field_group = {"members": pending_fields} + + if len(pending_comments) > 0: + field_group["comments"] = pending_comments + + data["field_groups"] += [field_group] + pending_comments = [] + pending_fields = [] + + index += 1 + + return data + + +class RecordsParser(BaseParser[RecordsResult]): + def __init__( + self, path: Path, definitions: DefinitionsResult, fields: FieldsResult + ): + super().__init__(path) + self.definition_flags = definitions["bool"] + self.field_types = {field["typename"] for field in fields} + + def _prepare_clean_text(self): + text = re.sub(r"#if\s+0\b.*?#endif\b", "", self.raw_text, flags=re.DOTALL) + + pattern = re.compile( + r"""(?msx) + ^\s* \# + (?: + ifdef \s+ (?P[A-Za-z_][A-Za-z0-9_]*) + | if \s+ defined \s* \( \s* (?P[A-Za-z_][A-Za-z0-9_]*) \s* \) + ) + [^\n]* \n + (?P .*? ) + (?: ^\s* \#else[^\n]* \n + (?P .*? ) + )? + ^\s* \#endif[^\n]* \n? + """, + re.MULTILINE | re.DOTALL | re.VERBOSE, + ) + + output: str = text + offset = 0 + + for match in pattern.finditer(text): + def_name = match.group("ifdef_def") or match.group("defined_def") + if_block = match.group("if_block") + else_block = match.group("else_block") or "" + + # Case-insensitive "startswith" matching + if not any( + def_name.lower().startswith(allowed.lower()) + for allowed in self.definition_flags + ): + replacement = else_block + else: + replacement = if_block + + start, end = match.start(), match.end() + output = output[: start - offset] + replacement + output[end - offset :] + offset += end - start - len(replacement) + + return output + + def _parse(self): + records = RECORD_BLOCK_PATTERN.findall(self.clean_text) + + result: RecordsResult = {} + for record in records: + record_parsed = parse_record(" ".join(record), self.field_types) + + result[record[1]] = record_parsed + + return result diff --git a/doc/src/parsers/util/process-raw-cnrecs.py b/doc/src/parsers/util/process-raw-cnrecs.py new file mode 100644 index 000000000..8b05e2b4e --- /dev/null +++ b/doc/src/parsers/util/process-raw-cnrecs.py @@ -0,0 +1,26 @@ +from pathlib import Path +import re + + +def clean(text: str): + return "\n".join( + re.sub(r"[ \t]+", " ", line).strip().lower() + for line in text.splitlines() + if (line.strip() and not line.startswith("//====")) + ) + + +if __name__ == "__main__": + root_dir = Path(__file__).parent.parent + src_dir = root_dir / "example_src" + out_dir = root_dir / "example_out" + + with open(src_dir / "CNRECS.DEF", "r") as file: + cnrecs_raw = file.read() + + without_whitespace = clean(cnrecs_raw) + + target_path_no_white_space = out_dir / "original_cnrecs_no-whitespace.def" + + with open(target_path_no_white_space, "w") as file: + file.write(without_whitespace) diff --git a/doc/src/parsers/util/rewrite-parsed.py b/doc/src/parsers/util/rewrite-parsed.py new file mode 100644 index 000000000..fff783f1b --- /dev/null +++ b/doc/src/parsers/util/rewrite-parsed.py @@ -0,0 +1,233 @@ +from pathlib import Path +import re +from typing import Dict, Any + +import yaml + +RECORD_HEADER_BOOL_DIRECTIVES = ["hideall"] +RECORD_HEADER_KVP_DIRECTIVES = ["baseclass"] + +RECORD_BOOL_DIRECTIVES = ["excon", "exdes", "ovrcopy"] +RECORD_KVP_DIRECTIVES = ["prefix"] + + +FIELD_BOOL_DIRECTIVES = {"hide", "noname"} +FIELD_KVP_DIRECTIVES = { + "array", + "nest", +} +FIELD_VARIABILITY_DIRECTIVES = { + "s", + "h", + "mh", + "d", + "m", + "r", + "y", + "e", + "p", + "f", + "i", + "z", +} + + +def get_record_header_directives_string(record): + directives_str = "" + + bool_directives = [ + f"*{directive}" + for directive in RECORD_HEADER_BOOL_DIRECTIVES + if directive in record + ] + + kvp_directives = [ + f"*{key} {record[key]}" for key in RECORD_HEADER_KVP_DIRECTIVES if key in record + ] + + directives_str += " ".join(bool_directives + kvp_directives) + + return directives_str + + +def get_record_directives_string(record): + directives_str = "" + + bool_directives = [] + for directive in RECORD_BOOL_DIRECTIVES: + if directive not in record: + continue + + value = record[directive] + + if isinstance(value, bool): + bool_directives.append(f"*{directive}") + else: + value_as_str = f"*{directive}" + "\n".join( + [f" //{comment}" for comment in value["comments"]] + ) + bool_directives.append(value_as_str) + + kvp_directives = [] + for directive in RECORD_KVP_DIRECTIVES: + if directive not in record: + continue + + value = record[directive] + + if isinstance(value, str): + kvp_directives.append(f"*{directive} {value}") + else: + value_as_str = f"*{directive} {value['value']}" + "\n".join( + [f" //{comment}" for comment in value["comments"]] + ) + kvp_directives.append(value_as_str) + + directives_str += "\n\t".join(kvp_directives + bool_directives) + + return directives_str + + +def get_data_member_string(member: Dict): + data_member_string = "" + + keys = member.keys() + + if "variability_directives" in keys: + if any( + [ + directive not in FIELD_VARIABILITY_DIRECTIVES + for directive in member["variability_directives"] + ] + ): + raise Exception("Unrecognized variabilty directive") + + data_member_string = " ".join( + [ + f"*{variability_directive}" + for variability_directive in member["variability_directives"] + ] + ) + + bool_directives = [] + for directive in FIELD_BOOL_DIRECTIVES: + if directive not in member: + continue + + value = member[directive] + + if isinstance(value, bool): + bool_directives.append(f"*{directive}") + + kvp_directives = [] + for directive in FIELD_KVP_DIRECTIVES: + if directive not in member: + continue + + value = member[directive] + + kvp_directives.append(f"*{directive} {value}") + + if len(bool_directives + kvp_directives) > 0: + data_member_string += " " + " ".join(bool_directives + kvp_directives) + + if "type" in keys: + data_member_string += " " + member["type"] + + if "name" in keys: + data_member_string += " " + member["name"] + + if "comments" in keys: + data_member_string += "\n\t\t\t\t".join( + [f" //{comment}" for comment in member["comments"]] + ) + + data_member_string += "\n" + + return data_member_string + + +def get_field_group_string(field_group: Dict): + field_group_string = "" + + if "comments" in field_group: + field_group_string += "\n".join( + f" //{comment}" for comment in field_group["comments"] + ) + + field_group_string += "\n" + + if "members" in field_group: + for member in field_group["members"]: + if "declare" in member: + field_group_string += f'\t*declare "{member["declare"]}"' + + if "comments" in member: + field_group_string += "\n".join( + f" //{comment}" for comment in member["comments"] + ) + + field_group_string += "\n" + + elif "define" in member: + field_group_string += f"\t#define {member['define']}" + + if "comments" in member: + field_group_string += "\n".join( + f" //{comment}" for comment in member["comments"] + ) + + field_group_string += "\n" + else: + field_group_string += "\t" + get_data_member_string(member) + + return field_group_string + + +def remove_whitespace_and_blank_lines(text: str): + return "\n".join( + re.sub(r"[ \t]+", " ", line).strip().lower() + for line in text.splitlines() + if (line.strip() and not line.startswith("//====")) + ) + + +if __name__ == "__main__": + root_dir = Path(__file__).parent.parent + out_dir = root_dir / "example_out" + + with open(out_dir / "new_parser_parsed_cnrecs.yml", "r") as file: + parsed_cnrecs: Dict[str, Any] = yaml.safe_load(file) + + new_str = [] + + for record in parsed_cnrecs.values(): + new_str += ["//" + "=" * 40] + new_str += [ + f'RECORD {record["id"]} "{record["name"]}" *{record["type"]} {get_record_header_directives_string(record)} {"\t//" + record["record_comments"][0] if "record_comments" in record else ""}' + ] + if "record_comments" in record and len(record["record_comments"]) > 1: + new_str += [ + "\n".join(["//" + comment for comment in record["record_comments"][1:]]) + ] + new_str += [""] + new_str += ["\t" + get_record_directives_string(record)] + new_str += [""] + + if "field_groups" in record: + for field_group in record["field_groups"]: + new_str += [get_field_group_string(field_group)] + + new_str += [f"*END\t\t// {record['id']}"] + + target_path = out_dir / "rebuilt_cnrecs_new.def" + target_path_no_white_space = out_dir / "rebuilt_cnrecs_new_no-whitespace.def" + + with_whitespace = "\n".join(new_str) + without_whitespace = remove_whitespace_and_blank_lines(with_whitespace) + + with open(target_path, "w") as file: + file.write("\n".join(new_str)) + + with open(target_path_no_white_space, "w") as file: + file.write(without_whitespace) diff --git a/doc/src/records/airhandler.md b/doc/src/records/airhandler.md deleted file mode 100644 index 3d220b744..000000000 --- a/doc/src/records/airhandler.md +++ /dev/null @@ -1,1795 +0,0 @@ -# AIRHANDLER - -AIRHANDLER defines a central air handling system, containing a fan or fans, optional heating and cooling coils, and optional outside air intake and exhaust. AIRHANDLERs are subobjects of TOP, and deliver air to one or more ZONEs through TERMINAL(s). AIRHANDLER objects can be used to model fan ventilation and forced air heating and cooling. Dual duct systems are modeled with two AIRHANDLERs (one for hot air and one for cool air) and two TERMINALs in each zone. Figure 2 shows…. \[need a sentence that explains the figure.\] - -![Insert Figure Title](media/image1.png) - -AIRHANDLER is designed primarily to model a central system that supplies hot or cold air at a centrally determined temperature (the "Supply Temperature Setpoint") to Variable Air Volume (VAV) terminals in the zones. Some additional variations are also supported: - -1. The AIRHANDLER can model a constant volume, fan-always-on system, where the supply temperature varies to meet the load of a single zone (that is, the thermostat controls the heating and/or cooling coil, but not the fan). This is done by setting the terminal minimum flow, *tuVfMn,* equal to the maximum flow, *tuVfMxH* for heating and/or *tuVfMxC* for cooling, and using a supply temperature control method that adjusts the temperature to the load (*ahTsSp* = WZ, CZ, or ZN2, described below). - -2. The AIRHANDLER can model constant volume, fan cycling systems where the fan cycles with a single zone thermostat, running at full flow enough of the time to meet the load and shutting completely off the rest of the time, rather than running at variable flow to adjust to the demand from the zones. - - This variation is invoked by specifying *ahFanCycles*= YES (usually with *ahTsSp*=ZN, described below). The user should be aware that this is done by treating fractional flow as equivalent to fractional on-time in most of the program, adjusting for the higher flow and less than 100% duty cycle only in a few parts of the model known to be non-linear, such as computation of cooling coil performance, fan heat, and duct leakage. For example, the outside air inputs, designed for VAV modeling, won't work in the expected manner unless you keep this modeling method in mind. - -3. The AIRHANDLER can supply hot air, cold air, or shut off according to the requirements of a single zone. This variation is invoked by giving *ahTsSp* = ZN or ZN2, both described further below. - -**ahName** - -Name of air handler: give after the word AIRHANDLER. Required for reference in TERMINALs. - - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "", - required: "Yes", - variability: "constant") - %> - -**ahSched=*choice*** - -Air handler schedule; OFF or ON, hourly schedulable by using CSE expression. - -<%= csv_table(< false) - OFF, supply fan off; air handler not operating. Old date? Note: (future) Taylor setback/setup control in effect, when implemented. - ON, supply fan runs, at varying volume according to TERMINAL demand (except if *ahFanCycles* = YES, fan cycles on and off at full volume). -END -%> - - -The following might be used to run an air handler between 8 AM and 5 PM: - - ahSched = select( (\$hour > 8 && \$hour <= 5), ON, - default, OFF ); - - -<%= member_table( - units: "", - legal_range: "ON/OFF", - default: "ON", - required: "No", - variability: "hourly") - %> - -**ahFxVfFan=*float*** - -Fan flow rate multiplier for autosized fan(s). The default value (1.1) specifies 10% oversizing. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1.1", - required: "No", - variability: "constant") %> - -## AIRHANDLER Supply Air Temperature Controller - -**ahTsSp=*float or choice*** - -Supply temperature setpoint numeric value OR\* choice of control method (WZ, CZ, RA, ZN, or ZN2): - -<%= csv_table(< false) - *float*, A numeric value specifies the supply temperature setpoint. An expression can be used to make dependent on time, weather, etc. - WZ, Warmest Zone: for cooling, sets the supply temperature setpoint each sub??hour so that the control zone (see*ahWzCzns*) requiring the coolest supply temperature can meet its load with its VAV damper 90% of the way from its minimum opening to its maximum, that is, at a flow of: *tuVfMn* + .9(*tuVfMxC* - \* tuVfMn\*). - CZ, Coolest Zone: analogous to WZ, but for heating - RA, Supply temperature setpoint value is controlled by return air temperature (this cannot be done with a CSE expression without lagging a subhour). See *ahTsRaMn* and *ahTsRaMx*. - ZN, Causes air handler to switch between heating, OFF, and cooling as required by the load of a single zone. When the zone thermostat (modeled through the *tuTC* and *tuTH* inputs) calls for neither heating nor cooling, the air handler shuts down, including stopping its fan(s). Changes *ahFanCycles* default to YES, to simulate a constant volume, fan cycling system. - , Supply temperature setpoint value when *ahFanCycles* = YES is taken from *ahTsMn* for cooling, from *ahTsMx* for heating (actual temperatures expected to be limited by coil capacity since fan is running at full flow). When *ahFanCycles* = NO, the setpoint is determined to allow meeting the load, as for WZ and CZ. - , When the zone is calling for neither heat nor cold, the air handler shuts down, including stopping its fan(s), regardless of the *ahFanCycles* value. - ZN2, Causes air handler to switch between heating, cooling, and FAN ONLY operation as required by the load of a single zone. To model a constant volume system where the fan runs continuously, use ZN2 and set the terminal minimum flow (*tuVfMn*) equal to the maximum (*tuVfMxC* and/or *tuVfMxH*). - , When *ahTsSp* is ZN2, the supply temperature setpoint is determined to allow meeting the load, as for WZ and CZ, described above. -END -%> - -Only when *ahTsSp* is ZN or ZN2 does AIRHANDLER switches between heating and cooling supply temperatures according to demand. In other cases, there is but a single setpoint value or control method (RA, CZ, or WZ); if you want the control method or numeric value to change according to time of day or year, outside temperature, etc., your CSE input must contain an appropriate conditional expression for *ahTsSp*. - -Unless *ahTsSp* is ZN or ZN2, the AIRHANDLER does not know whether it is heating or cooling, and will use either the heating coil or cooling coil, if available, as necessary, to keep the supply air at the single setpoint temperature. The coil schedule members, described below, allow you to disable present coils when you don't want them to operate, as to prevent cooling supply air that is already warm enough when heating the zones. For example, in an AIRHANDLER with both heating and cooling coils, if you are using a conditional expression based on outdoor temperature to change *ahTsSp* between heating and cooling values, you may use expressions with similar conditions for *ahhcSched* and *ahccSched* to disable the cooling coil when heating and vice versa. (Expressions would also be used in the TERMINALS to activate their heating or cooling setpoints according to the same conditions.) - -Giving *ahTsSp* is disallowed for an air handler with no economizer, no heat coil and no cooling coil. Such an AIRHANDLER object is valid as a ventilator; its supply temperature is not controlled. but rather determined by the outside temperature and/or the return air temperature. - - -<%= member_table( - units: "^o^F", - legal_range: "*number*, RA\*, WZ, CZ, ZN\*\*, ZN2\*\*,", - default: "0", - required: "Yes, if coil(s) or economizer present", - variability: "hourly") - %> - -\* ahTsRaMn, ahTsRaMx, ahTsMn, and ahTsMx are *required* input for this choice. - -\*\* only a single ZONE may be used with these choices. - -<%= csv_table(< true) -**To Model**, **Use**, **Comments** -VAV heating *OR* cooling system, *ahTsSp* = *numeric expression, * WZ, CZ, or RA, CSE models this most directly -VAV system that both heats and cools (single duct), Use a conditional expression to change *ahTsSp* between heating and cooling values on the basis of outdoor temperature, date, or some other condition., Also use expressions to disable the unwanted coil and change each zone's setpoints according to same as *ahTsSp*. For example, when heating, use *ahccSched* = OFF and *tuTC *= 999; and when cooling, use *ahhcSched* = OFF and *tuTH* = -99. -Dual duct heating cooling system, Use two AIRHANDLERs -Single zone VAV system that heats or cools per zone thermostat, *ahTsSp* = ZN2, Supply fan runs, at flow *tuVfMn*, even when neither heating nor cooling. Supply temp setpoint determined as for CZ or WZ. -Single zone constant volume system that heats or cools per zone thermostat, e.g. PSZ., *ahTsSp* = *ZN2*; *tuVfMn* = *tuVfMxH* = *tuVfMxC*, Supply fan circulates air even if neither heating nor cooling. Supply temp setpoint determined as for CZ or WZ. All *tuVf*'s same forces constant volume. -Single zone constant volume, fan cycling system that heats or cools per zone thermostat, e.g. PTAC, RESYS, or furnace., *ahTsSp*= ZN; *ahTsMx* = heat supply temp setpoint; *ahTsMn* = cool supply temp setpoint; *tuVfMn*= 0; tuVfMxH = tuVfMxC normally; *sfanVfDs* >= max( *tuVfMxH, tuVfMxC)* to minimize confusion about flow modeled., *AhFanCycles* defaults to YES. Supply fan off when not heating or cooling. Flow when fan on is *tuVfMxH* or *tuVfMxC* as applicable (or *sfanVfDs \* sfanVfMxF* if smaller). -END -%> - - : Using AIRHANDLER to Model Various Systems - - -**ahFanCycles=*choice*** - -Determines whether the fan cycles with the zone thermostat. - -<%= csv_table(< false) -YES, Supply fan runs only for fraction of the subhour that the zone requests heating or cooling. When running, supply fan runs at full flow (i.e. constant volume), as determined by the more limiting of the air handler and terminal specifications. Use with a single zone only. Not allowed with *ahTsSp* = ZN2. -NO, Normal CSE behavior for simulating VAV systems with continuously running (or scheduled), variable flow supply fans. (For constant volume, fan always on modeling, use NO, and make *tuVfMn* equal to *tuVfMxH/C*.) -END -%> - -<%= member_table( - units: "", - legal_range: "YES, NO", - default: "YES when *ahTsSp*=ZN, NO otherwise", - required: "No", - variability: "hourly") - %> - -**ahTsMn=*float*** - -Minimum supply temperature. Also used as cooling supply temperature setpoint value under *ahTsSp* = ZN. - -<%= member_table( - units: "^o^F", - legal_range: "*no limit*; typically: 40 $\\le$ *x* $\\le$ 140^o^", - default: "0^o^F", - required: "Only for *ahTsSp*=RA", - variability: "hourly") - %> - - - -<%= member_table( - units: "^o^F", - legal_range: "*no limit*; typically: 40 $\\le$ *x* $\\le$ 140^o^", - default: "999^o^ F", - required: "Only for *asTsSp*=RA; recommend giving for *ahTsSp*=ZN", - variability: "hourly") %> - -**ahTsMx=*float*** - -Maximum supply temperature. Also used as heating supply temperature setpoint value under *ahTsSp* = ZN. - - -**ahWzCzns=*zone names* or *ALL* or *ALL\_BUT zone names*** - -**ahCzCzns=*zone names* or *ALL* or *ALL\_BUT zone names*** - -Specify zones monitored to determine supply temperature setpoint value (control zones), under *ahTsSp*=WZ and CZ respectively. - -<%= csv_table(< false) -*zone names*, A list of zone names, with commas between them. Up to 15 names may be given. -ALL\_BUT, May be followed by a a comma and list of up to 14 zone names; all zones on air handler other than these are the control zones. -ALL, Indicates that all zones with terminals connected to the air handler are control zones. -END -%> - -A comma must be entered between zone names and after the word ALL\_BUT. - - - -<%= member_table( - units: "", - legal_range: "*name(s) of ZONEs* ALL ALL\_BUT *zone Name(s)*", - default: "ALL", - required: "No", - variability: "hourly") %> - -**ahTsDsC=*float*** - -Cooling design supply temperature, for sizing coil vs fan. - -<%= member_table( - units: "^o^F", - legal_range: "x $>$ 0", - default: "*ahTsMn*", - required: "No", - variability: "hourly") %> - -**ahTsDsH=*float*** - -Heating design supply temperature, for sizing coil vs fan. - -<%= member_table( - units: "^o^F", - legal_range: "x $>$ 0", - default: "*ahTsMx*", - required: "No", - variability: "hourly") %> - -**ahCtu=*terminal name*** - -Terminal monitored to determine whether to heat or cool under ZN and ZN2 supply temperature setpoint control. Development aid feature; believe there is no need to give this since ahTsSp = ZN or ZN2 should only be used with one zone. - -<%= member_table( - units: "", - legal_range: "name of a TERMINAL", - default: "AIRHANDLER's TERMINAL, if only one", - required: "If *ahTsSp* = ZN with more than 1 TERMINAL", - variability: "hourly") %> - - - -*AhTsRaMn* and *ahTsRaMx* are used when *ahTsSp* is RA. - -**ahTsRaMn=*float*** - -Return air temperature at which the supply temperature setpoint is at the *maximum* supply temperature, *ahTsMx*. - -**ahTsRaMx=*float*** - -Return air temperature at which the supply temperature setpoint is at the *minimum* supply temperature, *ahTsMn*. - -When the return air temperature is between *ahTsRaMn*and *ahTsRaMx*, the supply temperature setpoint has a proportional value between *ahTsMx* and *ahTsMn*. - -If return air moves outside the range *ahTsRaMn* to *ahTsRaMx*, the supply temperature setpoint does not change further. - -<%= member_table( - units: "^o^F", - legal_range: "*no limit*; typically: 40 $\\le$ *x* $\\le$ 140^o^", - default: "*none*", - required: " Only for *ahTsSp*=RA", - variability: "hourly") %> - -## AIRHANDLER Supply fan - -All AIRHANDLERs have supply fans. - -**sfanType=*choice*** - -Supply fan type/position. A BLOWTHRU fan is located in the air path before the coils; a DRAWTHRU fan is after the coils. - -<%= member_table( - units: "", - legal_range: "DRAWTHRU, BLOWTHRU", - default: "DRAWTHRU", - required: "No", - variability: "constant") %> - -**sfanVfDs=*float*** - -Design or rated (volumetric) air flow at rated pressure. Many fans will actually blow a larger volume of air at reduced pressure: see sfanVfMxF (next). - -<%= member_table( - units: "cfm", - legal_range: "*AUTOSIZE* or *x* $\\ge$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**sfanVfMxF=*float*** - -Overrun factor: maximum factor by which fan will exceed rated flow (at reduced pressure, not explicitly modeled). CSE delivers flows demanded by terminals until total flow at supply fan reaches sfanVfDs \* sfanVsMxF, then reduces maximum flows to terminals, keeping them in proportion to terminal design flows, to keep total flow at that value. - -We recommend giving 1.0 to eliminate overrun in constant volume modeling. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 1.0", - default: "1.3", - required: "No", - variability: "constant") %> - -**sfanPress*=float*** - -Design or rated pressure. The work done by the fan is computed as the product of this pressure and the current flow, except that the flow is limited to sfanVfDs. That is, in overrun (see *sfanVfMxF*) it is assumed that large VAV terminal damper openings allow the pressure to drop in proportion to the flow over rated. This work is added to the air as heat at the fan, and is termed "fan heat". Setting sfanPress to zero will eliminate simulated fan heat for theoretical simulation of a coil only. - -<%= member_table( - units: "inches H~2~O", - legal_range: "*x* $\\gt$ 0", - default: "3", - required: "No", - variability: "constant") %> - -Prior text: At most, one of the next two items may be given: in combination with sfanVfDs and sfanPress, either is sufficient to compute the other. SfanCurvePy is then used to compute the mechanical power at the fan shaft at partial loads; sfanMotEff allows determining the electrical input from the shaft power. - -New possible text (after addition of sfanElecPwr): Only one of sfanElecPwr, sfanEff, and sfanShaftBhp may be given: together with sfanVfDs and xfanPress, any one is sufficient for CSE to determine the others and to compute the fan heat contribution to the air stream. - -**sfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - -<%= member_table( - units: "W/cfm", - legal_range: "*x* $\\gt$ 0", - default: "derived from sfanEff and sfanShaftBhp", - required: "If sfanEff and sfanShaftBhp not present", - variability: "constant") %> - -**sfanEff=*float*** - -Fan efficiency at design flow and pressure, as a fraction. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "derived from *sfanShaftBhp* if given, else 0.65", - required: "No", - variability: "constant") %> - -**sfanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - -<%= member_table( - units: "bhp", - legal_range: "*x* $\\gt$ 0", - default: "derived from *sfanEff*.", - required: "No", - variability: "constant") %> - -**sfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of *sfanVfDs*; 0 $\le$ x $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - -<%= member_table( - units: "", - legal_range: "", - default: "*0, 1, 0, 0, 0 (linear)*", - required: "No", - variability: "constant") %> - -**sfanMotEff=*float*** - -Motor/drive efficiency. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.9", - required: "No", - variability: "constant") %> - -**sfanMotPos=*choice*** - -Motor/drive position: determines disposition of fan motor heat (input energy in excess of work done by fan; the work done by the fan is the "fan heat", always added to air flow). - -<%= csv_table(< false) -IN\_FLOW, add fan motor heat to supply air at the fan position. -IN\_RETURN, add fan motor heat to the return air flow. -EXTERNAL, discard fan motor heat -END -%> - -**sfanMtr=*mtrName*** - -Name of meter, if any, to record energy used by supply fan. End use category used is "Fan". - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -## AIRHANDLER Return/Relief fan - -A return/relief fan is optional. Its presence is established by setting *rfanType* to a value other than NONE. For additional information on the return/relief fan members, refer to the description of the corresponding supply fan member above. - -**rfanType=*choice*** - -relief fan type/position. - -<%= csv_table(< false) -RETURN, fan is at air handler; all return air passes through it. -RELIEF, fan is in exhaust path. Air being exhausted to the outdoors passes through fan; return air being recirculated does not pass through it. -NONE, no return/relief fan in this AIRHANDLER. -END -%> - -<%= member_table( - units: "", - legal_range: "NONE, RETURN, RELIEF", - default: "NONE", - required: "Yes, if fan present", - variability: "constant") %> - -**rfanVfDs=*float*** - -design or rated (volumetric) air flow. - -<%= member_table( - units: "cfm", - legal_range: "*AUTOSIZE* or *x* $\\gt$ 0", - default: "*sfanVfDs - oaVfDsMn*", - required: "No", - variability: "constant") %> - -**rfanVfMxF=*float*** - -factor by which fan will exceed design flow (at reduced pressure). - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 1.0", - default: "1.3", - required: "No", - variability: "constant") %> - -**rfanPress=*float*** - -design or rated pressure. - -<%= member_table( - units: "inches H~2~O", - legal_range: "*x* $\\gt$ 0", - default: "0.75", - required: "No", - variability: "constant") %> - -*At most, one of the next three?? items may be defined: ??* rework re rfanElecPwr - -**rfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - -<%= member_table( - units: "W/cfm", - legal_range: "*x* $>$ 0", - default: "derived from rfanEff and rfanShaftBhp", - required: "If rfanEff and rfanShaftBhp not present", - variability: "constant") %> - -**rfanEff=*float*** - -Fan efficiency at design flow and pressure. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "derived from *rfanShaftBhp* if given, else 0.65", - required: "No", - variability: "constant") %> - -**rfanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - -<%= member_table( - units: "bhp", - legal_range: "*x* $\\gt$ 0", - default: "derived from *rfanEff*", - required: "No", - variability: "constant") %> - -**rfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of *rfanVfDs*; 0 $\le$ x $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - -<%= member_table( - units: "", - legal_range: "", - default: "*0, 1, 0, 0, 0 (linear)*", - required: "No", - variability: "constant") %> - -**rfanMotEff=*float*** - -Motor/drive efficiency. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.9", - required: "No", - variability: "constant") %> - -**rfanMotPos=*choice*** - -Motor/drive position. - -<%= member_table( - units: "", - legal_range: "IN\_FLOW, EXTERNAL", - default: "IN\_FLOW", - required: "No", - variability: "constant") %> - -**rfanMtr=*mtrName*** - -Name of meter, if any, to record power consumption of this return fan. May be same or different from meter used for other fans and coils in this and other air handlers. "Fan" end use category is used. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -## AIRHANDLER Heating coil/Modeling Furnaces - -Heating coils are optional devices that warm the air flowing through the AIRHANDLER, including electric resistance heaters, hot water coils supplied by a HEATPLANT, the heating function of an air source heat pump, and furnaces. - -Furnaces are modeled as AIRHANDLERs with heat "coils" that model the heating portion of a gas or oil forced hot air furnace. Notes on modeling a furnace with a CSE AIRHANDLER: - -- Give *ahhcType* = GAS or OIL. -- Give *ahhcAux's* to model the power consumption of pilot, draft fan, etc. -- Use *ahTsSp* = ZN, which implies *ahFanCyles* = YES, to model constant volume, fan cycling (as opposed to VAV) operation. -- Use *ahTsMx* = an appropriate value around 140 or 180 to limit the supply temperature, simulating the furnace's high temperature cutout (the default *ahTsMx*of 999 is too high!). -- Use a single TERMINAL on the AIRHANDLER. -- To eliminate confusion about the fan cfm (which, precisely, under *ahFanCyles* = YES, is the smaller of the terminal maximum or the supply fan maximum including overrun), give the same value for TERMINAL *tuVfMxH* and AIRHANDLER *sfanVfDs*, and give *sfanVfMxF* = 1.0 to eliminate overrun. -- You will usually want to use *oaVfDsMn* = 0 (no outside air), and no economizer. - -The heating function of an air source heat pump is modeled with an AIRHANDLER with heat coil type AHP. There are several additional heat coil input variables (names beginning with *ahp-*) described later in the heat coil section. Also, a heat pump generally has a crankcase heater, which is specified with the crankcase heater inputs (*cch-*), described later in the AIRHANDLER Section 0. If the heat pump also performs cooling, its cooling function is modeled by specifying a suitable cooling coil in the same AIRHANDLER. Use *ahccType* = DX until a special cooling coil type for heat pumps is implemented. It is the user's responsibility to specify consistent heating and cooling coil inputs when the intent is to model a heat pump that both heats and cools, as CSE treats the heat coil and the cool coil as separate devices. - -The next four members apply to all heat coil types, except as noted. - -To specify that an AIRHANDLER has a heating coil and thus heating capability, give an *ahhcType* other than NONE. - -**ahhcType=*choice*** - -Coil type choice: - -<%= csv_table(< false) -ELECTRIC, electric resistance heat: 100% efficient, can deliver its full rated capacity at any temperature and flow. -HW, hot water coil, supplied by a HEATPLANT object. -GAS or OIL, 'coil' type that models heating portion of a forced hot air furnace. Furnace 'coil' model uses inputs for full-load efficiency and part-load power input; model must be completed with appropriate auxiliaries, *ahTsSp*, etc. See notes above. - , GAS and OIL are the same here -- the differences between gas- and oil-fired furnaces is in the auxiliaries (pilot vs. draft fan, etc.), which you specify separately. -AHP, heating function of an air source heat pump. -NONE, AIRHANDLER has no heat coil, thus no heating capability. -END -%> - -<%= member_table( - units: "", - legal_range: "ELECTRIC, HW, GAS OIL, AHP, NONE", - default: "NONE", - required: "Yes, if coil is present", - variability: "constant") %> - -**ahhcSched=*choice*** - -Heat coil schedule; choice of AVAIL or OFF, hourly variable. Use an appropriate ahhcSched expression if heat coil is to operate only at certain times of the day or year or only under certain weather conditions, etc. - -<%= csv_table(< false) -AVAIL, heat coil available: will operate as necessary to heat supply air to supply temperature setpoint, up to the coil's capacity. -OFF, coil will not operate, no matter how cold supply air is. A HW coil should be scheduled off whenever its HEATPLANT is scheduled off (*hpSched*) to insure against error messages. -END -%> - -<%= member_table( - units: "", - legal_range: "AVAIL, OFF", - default: "AVAIL", - required: "No", - variability: "hourly") %> - -**ahhcCapTRat=*float*** - -Total heating (output) capacity. For an ELECTRIC, AHP, GAS, or OIL coil, this capacity is always available. For an HW heating coil, when the total heat being requested from the coil's HEATPLANT would overload the HEATPLANT, the capacity of all HW coils connected to the plant (in TERMINALs as well as AIRHANDLERs) is reduced proportionately until the requested total heat is within the HEATPLANT's capacity. For AHP, this value represents the AHRI rated capacity at 47 ^o^F outdoor temperature. - -<%= member_table( - units: "Btuh", - legal_range: "*AUTOSIZE* or *x* $\\ge$ 0", - default: "*none*", - required: "Yes, if coil present", - variability: "hourly") %> - -**ahhcFxCap=*float*** - -Capacity sizing multiplier for autoSized heating coils. The default value (1.1) specifies 10% oversizing. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1.1", - required: "No", - variability: "constant") %> - -**ahhcMtr=*mtrName*** - -Name of meter to accumulate energy use by this heat coil. The input energy used by the coil is accumulated in the end use category "Htg"; for a heat pump, the energy used by the supplemental resistance heaters (regular and defrost) is accumulated under the category "hp". Not allowed when*ahhcType\* is HW, as an HW coil's energy comes from its HEATPLANT, and the HEATPLANT's BOILERs accumulate input energy to meters. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -The following input is used only when *ahhcType* is HW: - -**ahhcHeatplant=*Heatplant name*** - -Name of HEATPLANT supporting hot water coil. - -<%= member_table( - units: "", - legal_range: "*name of a HEATPLANT*", - default: "*none*", - required: "if *ahhcType* is HW", - variability: "constant") %> - -The following inputs are used only for furnaces (*ahhcType* = GAS or OIL). - -One of the next two items, but not both, **must** be given for furnaces: - -**ahhcEirR=*float*** - -Rated energy input ratio (input energy/output energy) at full power. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 1", - default: "*none*", - required: "if *ahhcEirR* not given and *ahhcType* is GAS or OIL", - variability: "hourly") %> - -**ahhcEffR=*float*** - -Rated efficiency (output energy/input energy; 1/ahhcEirR) at full power - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "*none*", - required: "if *ahhcEirR* not given and *ahhcType* is GAS or OIL", - variability: "hourly") %> - -**ahhcPyEi=$k_0$, $k_1$, $k_2$, $k_3$** - -Coefficients of cubic polynomial function of (subhour average) part-load-ratio (plrAv) to adjust the full-load furnace energy input for part load operation. Enter, separated by commas, in order, the constant part, the coefficient of plrAv, the coefficient of plrAv squared, and the coefficient of plrAv cubed. CSE will normalize the coefficients if necessary to make the polynomial value be 1.0 when the part load ratio is 1.0. - -The default, from DOE2, is equivalent to: - - ahhcPyEi = .01861, 1.094209, -.112819, 0.; - -which corresponds to the quadratic polynomial: - -$$\text{pyEi}(\text{plrAv}) = 0.01861 + 1.094209 \cdot \textbf{plrAv} - 0.112819 \cdot \textbf{plrAv}^2$$ - -Note that the value of this polynomial adjusts the energy input, not the energy input ratio, for part load operation. - -<%= member_table( - units: "", - legal_range: "", - default: "0.01861, 1.094209, -0.112819, 0.0.", - required: "No", - variability: "constant") %> - -**ahhcStackEffect=*float*** - -Fraction of unused furnace capacity that must be used to make up for additional infiltration caused by stack effect of a hot flue when the (indoor) furnace is NOT running, only in subhours when furnace runs PART of the subhour, per DOE2 model. - -This is an obscure feature that will probably never be used, included only due to indecisiveness on the part of most members of the committee designing this program. The first time reader should skip this section, or read it only as an example of deriving an expression to implement a desired relationship. - -The stack effect is typically a function of the square root of the difference between the outdoor temperature and the assumed stack temperature. - -For example, the following is a typical example for furnace stack effect: - - ahhcStackEffect = @Top.tDbO >= 68. ? 0. - : (68. - @Top.tDbO) - * sqrt(200.-@Top.tDbO) - / (10*68*sqrt(200)); - -The code "`@Top.tDbO >= 68 ? 0. : ...`" insures that the value will be 0, not negative, when it is warmer than 68 out (if the furnace were to run when the value was negative, a run-time error would terminate the run). - -The factor "`(68. - @Top.tDbO)`" reflects the fact that the energy requirement to heat the infiltrating air is proportional to how much colder it is than the indoor temperature. Note that its permitted to use a constant for the indoor temperature because if it is below setpoint, the furnace will be running all the time, and there will be no unused capacity and the value of ahhcStackEffect will be moot. - -The factor "`sqrt(200.-@Top.tDbO)`" represents the volume of infiltrated air that is typically proportional to the square root of the driving temperature difference, where 200 is used for the estimated effective flue temperature. - -The divisor "`/ (10*68*sqrt(200))`" is to make the value 0.1 when tDbO is 0, that is, to make the stack effect loss use 10% of unused load when it is 0 degrees out. The actual modeling engineer must know enough about his building to be able to estimate the additional infiltration load at some temperature. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0", - required: "No", - variability: "hourly") %> - -The following heat coil input members, beginning with *ahp-*, are used when modeling the heating function of an air source heat pump with the air handler heat coil, that is, when *ahhcType*= AHP is given. Also, see the "AIRHANDLER Crankcase Heater" section with regard to specifying the heat pump's crankcase heater. - -**ahpCap17=*float*** - -AHRI steady state (continuous operation) rated capacity at 70 degrees F indoor (return) air temp, and 17 degrees F outdoor temp, respectively. These values reflect no cycling, frost, or defrost degradation. To help you find input errors, the program issues an error message if ahpCap17 >= ahhcCapTRat. - -<%= member_table( - units: "Btuh", - legal_range: "*x* $\\gt$ 0", - default: "*none*", - required: "Yes, for AHP coil", - variability: "constant") %> - -**ahpCapRat1747=*float*** - -The ratio of AHRI steady state (continuous operation) rated capacities at 17 and 47 degrees F outdoor temp. This is used to determine *ahpCap35* when *ahhcCapTRat* is AUTOSIZEd. - -<%= member_table( - units: "", - legal_range: "*x* $\\gt$ 0", - default: "0.6184", - required: "No", - variability: "constant") %> - -**ahpCapRat9547=*float*** - -Ratio of ahccCapTRat to ahhcCapTRat. This ratio is used for defaulting of AUTOSIZEd heat pump heating and cooling capacities such that they have consistent values as is required given that a heat pump is a single device. If not given, ahpCapRat9547 is determined during calculations using the relationship ahccCapTRat = 0.98 * ahhcCapTRat + 180 (derived via correlation of capacities of a set of real units). - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "See above", - required: "No", - variability: "constant") %> - -**ahpCap35=*float*** - -AHRI steady state (continuous operation) rated capacity at 35 F outdoor temp, reflecting frost buildup and defrost degradation but no cycling. Unlikely to be available for input; if not given, will be defaulted to *ahpFd35Df* (next description) times a value determined by linear interpolation between the given *ahpCap17* and *ahhcCapTRat* values. If *ahpCap35* is given, CSE will issue an error message if it is greater than value determined by linear interpolation between *ahpCap17* and *ahhcCapTRat*. - -<%= member_table( - units: "Btuh", - legal_range: "*x* $\\gt$ 0", - default: "from ahpFd35Df", - required: "No", - variability: "constant") %> - -**ahpFd35Df=*float*** - -Default frost/defrost degradation factor at 35 F: reduction of output at unchanged input, due to defrosting and due to frost on outdoor coil. Used in determining default value for *ahpCap35* (preceding description); not used if *ahpCap35* is given. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.85", - required: "No", - variability: "constant") %> - -**ahpCapIa=*float*** - -Capacity correction factor for indoor (return) air temperature, expressed as a fraction reduction in capacity per degree above 70F. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.004", - required: "No", - variability: "constant") %> - -**ahpCapSupH=*float*** - -Output capacity of the supplemental reheat coil used when heat pump alone cannot meet the load or to offset the defrost cooling load. Energy consumed by this heater is accumulated in category "HPBU" of ahhcMeter (whereas energy consumption of the heat pump compressor is accumulated under category "Htg"). - -<%= member_table( - units: "Btu/hr", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") %> - -**ahpEffSupH=*float*** - -Efficiency of the supplemental reheat coil. Use values other than the default for gas supplemental heaters. - -<%= member_table( - units: "", - legal_range: "*x* $\\gt$ 0", - default: "1.0", - required: "No", - variability: "hourly") %> - -**ahpSupHMtr=*mtrName*** - -Specifies a meter for recording supplemental heater energy use. End use category "HPBU" is used. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -The next seven inputs specify frost buildup and defrosting and their effect on capacity. - -**ahpTFrMn=*float*** - -**ahpTFrMx=*float*** - -**ahpTFrPk=*float*** - -Lowest, highest, and peak temperatures for frost buildup and defrost effects. Capacity reduction due to frost and defrosting consists of a component due to frost buildup on the outdoor coil, plus a component due to lost heating during the time the heat pump is doing reverse cycle defrosting (heating the outdoor coil to melt off the frost, which cools the indoor coil). The effects of Frost Buildup and of time spent defrosting are computed for different temperature ranges as follows: - -- Above *ahpTFrMx*: no frost buildup, no defrosting. - -- At *ahpTFrMx* OR *ahpTFrMn*: defrosting time per *ahpDfrFMn* (next description); no frost buildup effect. - -- At *ahpTFrPk*: defrosting time per *ahpDfrFMx*, plus additional output reduction due to effect of frost buildup, computed by linear extrapolation from *ahpCap35* or its default. - -- Between *ahpTFrPk* and *ahpTFrMn* or *ahpTFrMx*: defrost time and defrost buildup degradation linearly interpolated between values at *ahpTFrPk* and values at *ahpTFrMn* or *ahpTFrMx*. - -- Below *ahpTFrMn*: no frost buildup effect; time defrosting remains at *ahpDfrFMn*. - -In other words, the curve of capacity loss due to frost buildup follows straight lines from its high point at *ahpTFrPk* to zero at *ahpTFrMn* and *ahpTFrMx*, and remains zero outside the range *ahpTFrMn* to *ahpTFrMx*. The height of the high point is determined to match the *ahpCap35* input value or its default. The curve of time spent defrosting is described in other words in the description of *ahpDfrFMn* and *ahpDfrFMx*, next. - -An error will occur unless *ahpTFrMn* < *ahpTFrPk* < *ahpTFrMx* and *ahpTFrMn* < 35 < *ahpTFrMx*. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\gt$ 0", - default: "*ahpTFrMn*: 17, *ahpTFrMx*: 47, *ahpTFrPk*: 42", - required: "No", - variability: "constant") %> - -**ahpDfrFMn=*float*** - -**ahpDfrFMx=*float*** - -Minimum and maximum fraction of time spent in reverse cycle defrost cooling. - -The fraction of the time spent defrosting depends on the outdoor temperature, as follows: at or below *ahpTFrMn*, and at (but not above) *ahpTFrMx*, *ahpDfrFMn* is used. *ahpDfrFMx* is used at *ahpTFrMx*. Linear interpolation is used between *ahpTFrMn* or *ahpTFrMx* and *ahpTFrMx*. No time is spent defrosting above *ahpTFrMx*. - -In other words, the curve of time spent defrosting versus outdoor temperature has the value *ahpDfrFMn* up to *ahpTFrMn*, then rises in a straight line to *ahpDfrFMx* at *ahpTFrMx*, then falls in a straight line back to *ahpDfrFMn* at *ahpTFrMx*, then drops directly to zero for all higher temperatures. - -During the fraction of the time spent defrosting, the heat pump's input remains constant and the output is changed as follows: - -- Usual heat output is not delivered to load. - -- Cold output due to reverse cycle operation is delivered to load. See *ahpDfrCap*. - -- An additional resistance heater is operated; and its heat output is delivered to load. See *ahpDfrRh*. - -The program will issue an error message if *ahpDfrFMx* $\le$ *ahpDfrFMn*. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "*ahpDfrFMn*: .0222, (2 minutes/90 minutes), *ahpDfrFMx*:.0889, (8 minutes / 90 minutes)", - required: "No", - variability: "constant") %> - -**ahpDfrCap=*float*** - -Cooling capacity (to air handler supply air) during defrosting. Program separately computes the lost heating capacity during defrosting, but effects of switchover transient should be included in *ahpDfrCap*. - -<%= member_table( - units: "Btuh", - legal_range: "*x* $\\neq$ 0", - default: "2 $\\cdot$ *ahpCap17*", - required: "No", - variability: "constant") %> - -**ahpTOff=*float*** - -**ahpTOn=*float*** - -Heat pump low temperature cutout setpoints. Heat pump is disabled (only the supplemental resistance heater operates) when outdoor temperature falls below *ahpTOff*, and is re-enabled when temperature rises above *ahpTOn*. Different values may be given to simulate thermostat differential. *ahpTOff* must be $\le$ *ahpTOn*; equal values are accepted. - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "*ahpTOff*: 5, *ahpTOn*: 12", - required: "No", - variability: "constant") %> - -The next four inputs specify the heating power input for an air source heat pump: - -**ahpCOP47=*float*** - -**ahpCOP17=*float*** - -Steady state (full power, no cycling) coeffient of performance for compressor and crankcase heater at 70 degrees F indoor (return) air temp and 47 and 17 degrees F outdoor temp, respectively. - -<%= member_table( - units: "kW", - legal_range: "*x* $\\gt$ 0", - default: "*none*", - required: "Yes, for AHP coil", - variability: "constant") %> - -**ahpInIa=*float*** - -Indoor (return) air temp power input correction factor: fraction increase in steady-state input per degree above 70 F, or decrease below 70F. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.004", - required: "No", - variability: "constant") %> - -**ahpCd=*float*** - -AHRI cycling degradation coefficient: ratio of fraction drop in system coefficient of performance (COP) to fraction drop in capacity when cycling, from steady-state values, in AHRI 47 F cycling performance tests. A value of .25 means that if the heat pump is cycled to drop its output to 20% of full capacity (i.e. by the fraction .8), its COP will drop by .8 \* .25 = .2. Here COP includes all energy inputs: compressor, crankcase heater, defrost operation, etc. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.25", - required: "No", - variability: "constant") %> - -The following four air handler heat coil members allow specification of auxiliary input power consumption associated with the heat coil (or furnace) under the indicated conditions. The single description box applies to all four. - -**ahhcAux=*float*** - -Auxiliary energy used by the heating coil. - -<%= member_table( - units: "Btu/hr", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> - -**ahhcAuxMtr=*mtrName*** - -Specifies a meter for recording auxiliary energy use. End use category "Aux" is used. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -## AIRHANDLER Cooling coil - -A cooling coil is an optional device that remove heat and humidity from the air passing through the AIRHANDLER. Available cooling coil types include chilled water (CHW), supported by a COOLPLANT that supplies cold water, and Direct Expansion (DX), supported by a dedicated compressor and condenser that are modeled integrally with the DX coil. No plant is used with DX coils. - -The following five members are used for all cool coil types except as noted. Presence of a cool coil in the AIRHANDLER is indicated by giving an *ahccType value* other than NONE. - -**ahccType*=choice*** - -Cool coil type choice: - -<%= csv_table(< false) -ELECTRIC, Testing artifice: removes heat at 100% efficiency up to rated capacity at any flow and temperature; removes no humidity. Use in research runs to isolate effects of coil models from other parts of the CSE program. -CHW, CHilled Water coil, using a cold water from a COOLPLANT. -DX, Direct Expansion coil, with dedicated compressor and condenser modeled integrally. -NONE, AIRHANDLER has no cooling coil and no cooling capability. -END -%> - -<%= member_table( - units: "", - legal_range: "ELECTRIC, DX, CHW, NONE", - default: "NONE", - required: "Yes, if coil present", - variability: "constant") %> - -**ahccSched*=choice*** - -Cooling coil schedule choice, hourly variable. Use a suitable CSE expression for ahccSched if cooling coil is to operate only at certain times, only in hot weather, etc. - -<%= csv_table(< false) -AVAIL, Cooling coil will operate as necessary (within its capacity) to cool the supply air to the supply temperature setpoint. -OFF, Cooling coil will not operate no matter how hot the supply air is. To avoid error messages, a CHW coil should be scheduled OFF whenever its COOLPLANT is scheduled OFF. -END -%> - -<%= member_table( - units: "", - legal_range: "AVAIL, OFF", - default: "AVAIL", - required: "No", - variability: "constant") %> - -**ahccCapTRat=*float*** - -Total rated capacity of coil: sum of its "sensible" (heat-removing) and "latent" (moisture removing) capacities. Not used with CHW coils, for which capacity is implicitly specified by water flow (ahccGpmDs*) and transfer unit (*ahccNtuoDs\* and *ahccNtuiDs*) inputs, described below. - -For coil specification conditions (a.k.a. rating conditions or design conditions), see *ahccDsTDbEn*, *ahccDsTWbEn*, *ahccDsTDbCnd*and *ahccVfR*below (see index). - -<%= member_table( - units: "Btuh", - legal_range: "*AUTOSIZE* or *x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**ahccCapSRat=*float*** - -Sensible (heat-removing) rated capacity of cooling coil. Not used with CHW coils. - -<%= member_table( - units: "Btuh", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**ahccSHRRat=*float*** - -Rated sensible heat ratio (*ahccCapSRat*/*ahccCapTRat*) for cooling coil. Default based on correlation to *ahccVfRperTon*. Not used with CHW coils. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "based on *ahccVfRperTon*", - required: "No", - variability: "constant") %> - -**ahccFxCap=*float*** - -Capacity sizing multiplier for autoSized cooling coils. The default value (1.1) specifies 10% oversizing. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1.1", - required: "No", - variability: "constant") %> - -**ahccMtr=*mtrName*** - -Name of meter, if any, to record energy use of air handler cool coil. End use category "Clg" is used. Not used with CHW coils, because the input energy use for a CHW coil is recorded by the COOLPLANT's CHILLERs. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -The following six members are used with DX cooling coils. - -**ahccMinTEvap=*float*** - -Minimum (effective surface) temperature of coil (evaporator). Represents refrigerant setpoint, or cutout to prevent freezing. Coil model will reduce output to keep simulated coil from getting colder than this, even though it lets supply air get warmer than setpoint. Should default be 35?? - -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "40^o^F", - required: "No", - variability: "constant") %> - -**ahccK1=*float*** - -Exponent in power relationship expressing coil effectiveness as a function of relative air flow. Used as K1 in the relationship ntu = ntuR \* relCfmk1, which says that the "number of transfer units" (on the coil outside or air side) varies with the relative air flow raised to the K1 power. Used with CHW as well as DX coils; for a CHW coil, ntuR in the formula is *ahccNtuoDs*. - -<%= member_table( - units: "", - legal_range: "*x* $<$ 0", - default: "-0.4", - required: "No", - variability: "constant") %> - -**ahccBypass=*float*** - -Fraction of air flow which does NOT flow through DX cooling coil, for better humidity control. Running less of the air through the coil lets the coil run colder, resulting in greater moisture removal right??. - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\le$ 1", - default: "0", - required: "No", - variability: "constant") %> - -The next three members are used in determining the energy input to a DX coil under various load conditions. The input is derived from the full load energy input ratio for four segments of the part load curve. In the following the part load ratio (plr) is the ratio of the actual sensible + latent load on the coil to the coil's capacity. The coil's capacity is ahccCaptRat, adjusted by the coil model for differences between entering air temperature, humidity, and flow rate and the coil rating conditions. The coil may run at less than capacity even at full fan flow, depending on the air temperature change needed, the moisture content of the entering air, and the relative values of between *sfanVfDs* and *ahccVfR*. - -<%= csv_table(< false) -full load, plr (part load ratio) = 1.0 - , Full-load power input is power output times *ahhcEirR.* -compressor unloading region, 1.0 > plr $\\ge$ *ahhcMinUnldPlr* - , Power input is the full-load input times the value of the *pydxEirUl* polynomial (below) for the current plr, i.e. pydxEirUl(plr). -false loading region, *ahccMinUnldPlr* > plr $\\ge$ *ahccMinFsldPlr* - , Power input in this region is constant at the value for the low end of the compressor unloading region, i.e. pydxEirUl(ahccMinUnldPlr). -cycling region, *ahccMinFsldPlr* > plr $\\ge$ 0 - , In this region the compressor runs at the low end of the false loading region for the necessary fraction of the time, and the power input is the false loading value correspondingly prorated, i.e. pydxEirUl(ahccMinUnldPlr) \* plr / ahccMinFsldPlr. -END -%> - -The default values for the following three members are the DOE2 PTAC (Window air conditioner) values. - -**ahccEirR=*float*** - -DX compressor energy input ratio (EIR) at full load under rated conditions; defined as the full-load electric energy input divided by the rated capacity, both in Btuh; same as the reciprocal of the Coefficient Of Performance (COP). Polynomials given below are used by CSE to adjust the energy input for part load and for off rated flow and temperature conditions. The default value includes outdoor (condenser) fan energy, but not indoor (air handler supply) fan energy. - -<%= member_table( - units: "", - legal_range: "", - default: "0.438", - required: "No", - variability: "constant") %> - -**ahccMinUnldPlr=*float*** - -Compressor part load ratio (total current load/current capacity) at/above which "Compressor unloading" is used and pydxEirUl (below) is used to adjust the full-load power input to get the current part load power input. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "1 (no unloading)", - required: "No", - variability: "constant") %> - -**ahccMinFsldPlr=*float*** - -"False Loading" is used between this compressor part load ratio and the plr where unloading is activated (*ahccMinUnldPlr*). In this region, input remains at *pydxEirUl*(*ahccMinUnldPlr).*For plr's less than *ahccMinFsldPlr*, cycling is used, and the power input goes to 0 in a straight line. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ *ahccMinUnldPlr*", - default: "*ahccMinUnldPlr* (no false loading)", - required: "No", - variability: "constant") %> - -The following four inputs specify polynomials to approximate functions giving DX coil capacity and power (energy) input as functions of entering temperatures, relative (to ahccVfR) flow, and relative load (plr). In each case several *float* values may be given, for use as coefficients of the polynomial. The values are ordered from constant to coefficient of highest power. If fewer than the maximum number of values are given, zeroes are used for the trailing (high order) coefficients. - -Examples: - - pydxCaptT = 2.686, -0.01667, 0, 0.006, 0, 0; - - pydxCaptT = 2.686, -0.01667, 0, 0.006; // same - - pydxEirUl = .9, 1.11, .023, -.00345; - -If the polynomial does not evaluate to 1.0 when its inputs are equal to the rating conditions (1.0 for relative flows and plr), CSE will normalize your coefficients by dividing them by the non-1.0 value. - -Some of the polynomials are biquadratic polynomials whose variables are the entering air wetbulb and drybulb temperatures. These are of the form - -$$z = a + bx + cx^2 + dy + ey^2 + fxy$$ - -where a through f are user-inputtable coefficients, x is the entering wetbulb temperature, y is the entering drybulb temperature, and the polynomial value, z, is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual entering air temperatures. - -Other polynomials are cubic polynomials whose variable is the air flow or load as a fraction of full flow or load.. These are of the form - -$$z = a + bx + cx^2+ dx^3$$ - -where a, b, c, and d are user-inputtable coefficients, $x$ is the variable, and the value $z$ is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual flow or load. - -The default values for the polynomial coefficients are the DOE2 PTAC values. - -**pydxCaptT=a, b, c, d, e, f** - -Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust *ahccCaptRat* for the actual entering air temperatures. The condenser temperature is the outdoor drybulb, but not less than 70. See discussion in preceding paragraphs. - -<%= member_table( - units: "", - legal_range: "", - default: "1.1839345, -0.0081087, 0.00021104, -0.0061425, 0.00000161, -0.0000030", - required: "No", - variability: "constant") %> - -**pydxCaptF=a=a, b, c, d** - -Coefficients of cubic polynomial function of relative flow (entering air cfm/*ahccVfR*) whose value is used to adjust *ahccCaptRat* for the actual flow. See discussion in preceding paragraphs. - -<%= member_table( - units: "", - legal_range: "", - default: "0.8, 0.2, 0.0, 0.0", - required: "No", - variability: "constant") %> - -**pydxCaptFLim=*float*** - -Upper limit for value of pydxCaptF. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1.05", - required: "No", - variability: "constant") %> - -**pydxEirT=*a, b, c, d, e, f*** - -Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust *ahccEirR* for the actual entering air temperatures. The condenser temperature is the outdoor air drybulb, but not less than 70. If the entering air wetbulb is less than 60, 60 is used, in this function only. See discussion in preceding paragraphs. - -<%= member_table( - units: "", - legal_range: "", - default: "-0.6550461, 0.03889096, -0.0001925, 0.00130464, 0.00013517, -0.0002247", - required: "No", - variability: "constant") %> - -**pydxEirUl=*a, b, c, d*** - -Coefficients of cubic polynomial function of part load ratio used to adjust energy input to part load conditions, in the compressor unloading part load region (1 $\ge$ plr $\ge$ *ahccMinUnldPlr*) as described above. See discussion of polynomials in preceding paragraphs. - -This polynomial adjusts the full load energy input to part load, not the ratio of input to output, despite the "Eir" in its name. - -<%= member_table( - units: "", - legal_range: "", - default: "0.125, 0.875, 0.0, 0.0", - required: "No", - variability: "constant") %> - -The following four members are used only with CHW coils. In addition, *ahccK1,* described above, is used. - -**ahccCoolplant=*name*** - -name of COOLPLANT supporting CHW coil. COOLPLANTs contain CHILLERs, and are described in Section 5.21. - -<%= member_table( - units: "", - legal_range: "*name of a COOLPLANT*", - default: "*none*", - required: "for CHW coil", - variability: "constant") %> - -**ahccGpmDs=*float*** - -Design (i.e. maximum) water flow through CHW coil. - -<%= member_table( - units: "gpm", - legal_range: "*x* $\\ge$ 0", - default: "*none*", - required: "Yes, for CHW coil", - variability: "constant") %> - -**ahccNtuoDs=*float*** - -CHW coil outside number of transfer units at design air flow (ahccVfR*, below). See*ahccK1\* above with regard to transfer units at other air flows. - -<%= member_table( - units: "", - legal_range: "*x* $\\gt$ 0", - default: "2", - required: "No", - variability: "constant") %> - -**ahccNtuiDs=*float*** - -CHW coil inside number of transfer units at design water flow (ahccGpmDs, above). - -<%= member_table( - units: "", - legal_range: "*x* $\\gt$ 0", - default: "2", - required: "No", - variability: "constant") %> - -The following four members let you give the specification conditions for the cooling coil: the rating conditions, design conditions, or other test conditions under which the coil's performance is known. The defaults are AHRI (Air-Conditioning and Refrigeration Institute) standard rating conditions. - -**ahccDsTDbEn=*float*** - -Design (rating) entering air dry bulb temperature, used with DX and CHW cooling coils. With CHW coils, this input is used only as the temperature at which to convert *ahccVfR* from volume to mass. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\gt$ 0", - default: "80^o^F (AHRI)", - required: "No", - variability: "constant") %> - -**ahccDsTWbEn=*float*** - -Design (rating) entering air wet bulb temperature, for CHW coils. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\gt$ 0", - default: "67^o^F (AHRI)", - required: "No", - variability: "constant") %> - -**ahccDsTDbCnd=*float*** - -Design (rating) condenser temperature (outdoor air temperature) for DX coils. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $\\gt$ 0", - default: "95^o^F (AHRI)", - required: "No", - variability: "constant") %> - -**ahccVfR=*float*** - -Design (rating) (volumetric) air flow rate for DX or CHW cooling coil. The AHRI specification for this test condition for CHW coils is "450 cfm/ton or less", right?? - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\gt$ 0", - default: "DX coil: *ahccVfRperTon* CHW coil: *sfanVfDs*", - required: "No", - variability: "constant") %> - -The following four members permit specification of auxiliary input power use associated with the cooling coil under the conditions indicated. - -**ahccVfRperTon=*float*** - -Design default *ahccVfR* per ton (12000 Btuh) of *ahhcCapTRat*. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "400.0", - required: "No", - variability: "constant") %> - -**ahccAux=*float*** - -Auxiliary energy used by the cooling coil. - -<%= member_table( - units: "Btu/hr", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> - -**ahccAuxMtr=*mtrName*** - -Specifies a meter for recording auxiliary energy use. End use category "Aux" is used. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -## AIRHANDLER Outside Air - -Outside air introduced into the air hander supply air can be controlled on two levels. First, a *minimum*fraction or volume of outside air may be specified. By default, a minimum volume of .15 cfm per square foot of zone area is used. Second, an *economizer* may be specified. The simulated economizer increases the outside air above the minimum when the outside air is cooler or has lower enthalpy than the return air, in order to reduce cooling coil energy usage. By default, there is no economizer. - -**oaMnCtrl=*choice*** - -Minimum outside air flow control method choice, VOLUME or FRACTION. Both computations are based on the minimum outside air flow, *oaVfDsMn*; if the control method is FRACTION, the outside air flow is pro-rated when the air handler is supplying less than its design cfm. In both cases the computed minimum cfm is multiplied by a schedulable fraction, *oaMnFrac*, to let you vary the outside air or turn in off when none is desired. - -<%= csv_table(< false) -VOLUME, Volume (cfm) of outside air is regulated: - , min\_oa\_flow = oaMnFrac \* oaVfDsMn -FRACTION, Fraction of outside air in supply air is regulated. The fraction is oaVfDsMn divided by sfanVfDs, the air handler supply fan design flow. The minimum cfm of outside air is thus computed as - , min\_oa\_flow = oaMnFrac \* curr\_flow \* oaVfDsMn / sfanVfDs - , where curr\_flow is the current air handler cfm. -END -%> - -If the minimum outside air flow is greater than the total requested by the terminals served by the air handler, then 100% outside air at the latter flow is used. To insure minimum outside air cfm to the zones, use suitable terminal minimum flows (*tuVfMn*) as well as air handler minimum outside air specifications. - -<%= member_table( - units: "", - legal_range: "VOLUME, FRACTION", - default: "VOLUME", - required: "No", - variability: "constant") %> - -**oaVfDsMn=*float*** - -Design minimum outside air flow. If *oaMnCtrl* is FRACTION, then this is the minimum outside air flow at full air handler flow. See formulas in *oaMnCtrl* description, just above. - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "0.15 times total area of zones served", - required: "No", - variability: "constant") %> - -**oaMnFrac=*float*** - -Fraction of minimum outside air to use this hour, normally 1.0. Use a CSE expression that evaluates to 0 for hours you wish to disable the minimum outside air flow, for example to suppress ventilation during the night or during warm-up hours. Intermediate values may be used for intermediate outside air minima. See formulas in *oaMnCtrl* description, above. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "1.0", - required: "No", - variability: "hourly") %> - -CAUTION: the minimum outside air flow only applies when the supply fan is running; it won't assure meeting minimum ventilation requirements when used with ahFanCycles = YES (constant volume, fan cycling). - -**oaZoneLeak=*float*** - -For the purposes of airnet zone pressure modeling ONLY, *oaZoneLeak* specifies the fraction of supply air that is assumed to leak from zone(s) (as opposed to returning to the airhandler via the return duct). For example, if the supply air volume is 500 cfm and *oaZoneLeak* is 0.4, the values passed to airnet are 500 cfm inflow and 300 cfm outflow. The 200 cfm difference is distributed to other zone leaks according to their pressure/flow characteristics. - -The default assumption is that airhandlers with return or relief fans provide balanced zone flows while half the supply flow leaks from zones served by supply-fan-only airhandlers. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "no return/relief fan: 0.5 else 0", - required: "No", - variability: "hourly") %> - - -If an *oaEcoType* choice other than NONE is given, an economizer will be simulated. The economizer will be enabled when the outside temperature is below oaLimT *AND* the outside air enthalpy is below oaLimE. When enabled, the economizer adjusts the economizer dampers to increase the outside air mixed with the return air until the mixture is cooler than the air handler supply temperature setpoint, if possible, or to maximum outside air if the outside air is not cool enough. - -CAUTIONS: the simulated economizer is just as dumb as the hardware being simulated. Two considerations particularly require attention. First, if enabled when the outside air is warmer than the return air, it will do the worst possible thing: use 100% outside air. Prevent this by being sure your oaLimT or oaLimE input disables the economizer when the outside air is too warm -- or leave the oaLimT = RA default in effect. - -Second, the economizer will operate even if the air handler is heating, resulting in use of more than minimum outside air should the return air get above the supply temperature setpoint. Economizers are intended for cooling air handlers; if you heat and cool with the same air handler, consider disabling the economizer when heating by scheduling a very low *oaLimT* or *oaLimE*. - - -**oaEcoType=*choice*** - -Type of economizer. Choice of: - -<%= csv_table(< false) -NONE, No economizer; outside air flow is the minimum. -INTEGRATED, Coil and economizer operate independently. -NONINTEGRATED, Coil does not run when economizer is using all outside air: simulates interlock in some equipment designed to prevent coil icing due to insufficient load, right? -TWO\_STAGE, Economizer is disabled when coil cycles on. *NOT IMPLEMENTED* as of July 1992. -END -%> - -**oaLimT=*float* or *RA*** - -Economizer outside air temperature high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air temperature is greater than *oaLimT*. A number may be entered, or "RA" to specify the current Return Air temperature. *OaLimT* may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. - -<%= member_table( - units: "^o^F", - legal_range: "*number* or RA", - default: "RA (return air temperature)", - required: "No", - variability: "hourly") %> - -**oaLimE=*float* or *RA*** - -Economizer outside air enthalpy high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air enthalpy is greater than *oaLimE*. A number may be entered, or "RA" to specify the current Return Air enthalpy. *OaLimE* may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. - -<%= member_table( - units: "Btu/^o^F", - legal_range: "*number* or RA", - default: "999 (enthalpy limit disabled)", - required: "No", - variability: "hourly") %> - -*oaOaLeak* and *oaRaLeak* specify leakages in the economizer dampers, when present. The leaks are constant-cfm flows, expressed as fractions of the maximum possible flow. Thus, when the current flow is less than the maximum possible, the range of operation of the economizer is reduced. When the two damper leakages add up to more than the current air handler flow, outside and return air are used in the ratio of the two leakages and the economizer, if enabled, is ineffective. - -**oaOaLeak=*float*** - -Outside air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. If an economizer is present, *oaOaLeak* is a fraction of the supply fan design cfm, *sfanVfDs*. Otherwise, *oaOaLeak* is a fraction of the design minimum outside air flow *oaVfDsMn*. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0.1", - required: "No", - variability: "constant") %> - -**oaRaLeak=*float*** - -Return air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. Expressed as a fraction of the supply fan design cfm, *sfanVfDs*. Not used when no economizer is being modeled. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0.1", - required: "No", - variability: "constant") %> - -## AIRHANDLER Heat Recovery - -The following data members are used to describe a heat exchanger for recovering heat from exhaust air. Heat recovery added to the model when a value for *oaHXSenEffHDs* is provided. - -**oaHXVfDs=*float*** - -Heat exchanger design or rated flow. - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\gt$ 0", - default: "*oaVfDsMn*", - required: "No", - variability: "constant") %> - -**oaHXf2=*float*** - -Heat exchanger flow fraction (of design flow) used for second set of effectivenesses. - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\lt$ 1.0", - default: "0.75", - required: "No", - variability: "constant") %> - -**oaHXSenEffHDs=*float*** - -Heat exchanger sensible effectiveness in heating mode at the design flow rate. Specifying input triggers modeling of heat recovery. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - required: "when modeling heat recovery", - variability: "constant") %> - -**oaHXSenEffHf2=*float*** - -Heat exchanger sensible effectiveness in heating mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffHDs=*float*** - -Heat exchanger latent effectiveness in heating mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffHf2=*float*** - -Heat exchanger latent effectiveness in heating mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXSenEffCDs=*float*** - -Heat exchanger sensible effectiveness in cooling mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXSenEffCf2=*float*** - -Heat exchanger sensible effectiveness in cooling mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffCDs=*float*** - -Heat exchanger latent effectiveness in cooling mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffCf2=*float*** - -Heat exchanger latent effectiveness in cooling mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXBypass=*choice*** - -Yes/No choice for enabling heat exchanger bypass. If selected, the outdoor air will bypass the heat exchanger when otherwise the heat exchanger would require more heating or cooling energy to meet the respective setpoints. - -<%= member_table( - units: "", - legal_range: "NO, YES", - default: "NO", - required: "No", - variability: "constant") %> - -**oaHXAuxPwr=*float*** - -Auxiliary power required to operate the heat recovery device (e.g., wheel motor, contorls). - -<%= member_table( - units: "W", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "subhourly") %> - -**oaHXAuxMtr=*mtrName*** - -Name of meter, if any, to record energy used by auxiliary components of the heat recovery system. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -## AIRHANDLER Leaks and Losses - -*AhSOLeak* and *ahRoLeak* express air leaks in the common supply and return ducts, if any, that connect the air handler to the conditioned space. For leakage after the point where a duct branches off to an individual zone, see TERMINAL member *tuSRLeak*. These inputs model leaks in constant pressure (or vacuum) areas nearer the supply fan than the terminal VAV dampers; thus, they are constant volume regardless of flow to the zones. Hence, unless 0 leakage flows are specified, the air handler cfm is greater than the sum of the terminal cfm's, and the air handler cfm is non-0 even when all terminal flows are 0. Any heating or cooling energy applied to the excess cfm is lost to the outdoors. - -If unequal leaks are specified, at present (July 1992) CSE will use the average of the two specifications for both leaks, as the modeled supply and return flows must be equal. A future version may allow unequal flows, making up the difference in exfiltration or infiltration to the zones. - -**ahSOLeak=*float*** - -Supply duct leakage to outdoors, expressed as a fraction of supply fan design flow (*sfanVfDs*). Use 0 if the duct is indoors. A constant-cfm leak is modeled, as the pressure is constant when the fan is on. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.01", - required: "No", - variability: "constant") %> - -**ahROLeak=*float*** - -Return duct leakage FROM outdoors, expressed as a fraction of *sfanVfDs*. Use 0 if the duct is indoors. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.01", - required: "No", - variability: "constant") %> - -*AhSOLoss* and *ahROLoss* represent conductive losses from the common supply and return ducts to the outdoors. For an individual zone's conductive duct loss, see TERMINAL member *tuSRLoss*. Losses here are expressed as a fraction of the temperature difference which is lost. For example, if the supply air temperature is 120, the outdoor temperature is 60, and the pertinent loss is .1, the effect of the loss as modeled will be to reduce the supply air temperature by 6 degrees ( .1 \* (120 - 60) ) to 114 degrees. CSE currently models these losses a constant *TEMPERATURE LOSSes* regardless of cfm. - -**ahSOLoss=*float*** - -Supply duct loss/gain to the outdoors. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.1", - required: "No", - variability: "constant") %> - -**ahROLoss=*float*** - -Return duct heat loss/gain to the outdoors. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.1", - required: "No", - variability: "constant") %> - -## AIRHANDLER Crankcase Heater - -A "crankcase heater" is an electric resistance heater in the crankcase of the compressor of heat pumps and dx cooling coils. The function of the crankcase heater is to keep the compressor's oil warmer than the refrigerant when the compressor is not operating, in order to prevent refrigerant from condensing into and remaining in the oil, which impairs its lubricating properties and shortens the life of the compressor. Manufacturers have come up with a number of different methods for controlling the crankcase heater. The crankcase heater can consume a significant part of the heat pump's energy input; thus, it is important to model it. - -In CSE a heat pump is modeled as though it were separate heating and cooling coils. However, the crankcase heater may operate (or not, according to its control method) whether the heat pump is heating, or cooling, or, in particular, doing neither, so it is modeled as a separate part of the air handler, not associated particularly with heating or cooling. - -When modeling an air source heat pump (ahhcType = AHP), these variables should be used to specify the crankcase heater, insofar as non-default inputs are desired. - -Appropriateness of use of these inputs when specifying a DX system without associated heat pump heating is not clear to me (Rob) as of 10-23-92; on the one hand, the DX compressor probably has a crankcase heater; on the other hand, the rest of the DX model is supposed to be complete in itself, and adding a crankcase heater here might produce excessive energy input; on the third hand, the DX model does not include any energy input when the compressor is idle; ... . - -**cchCM=*choice*** - -Crankcase heater presence and control method. Choice of: - -<%= csv_table(< false) -NONE, No crankcase heater present -CONSTANT, Crankcase heater input always *cchPMx* (below). -PTC, Proportional control based on oil temp when compressor does not run in subhour (see *cchTMx*, *cchMn*, and *cchDT*). If compressor runs at all in subhour, the oil is assumed to be hotter than *cchTMn* and crankcase heater input is *cchPMn*. (PTC stands for 'Positive Temperature Coefficient' or 'Proportional Temperature Control'.) -TSTAT, Control based on outdoor temperature, with optional differential, during subhours when compressor is off; crankcase heater does not operate if compressor runs at all in subhour. See *cchTOn*, *cchTOff*. -CONSTANT\_CLO -PTC\_CLO, Same as corresponding choices above except zero crankcase heater input during fraction of time compressor is on ('Compressor Lock Out'). There is no TSTAT\_CLO because under TSTAT the crankcase heater does not operate anyway when the compressor is on. -END -%> - -<%= member_table( - units: "", - legal_range: "CONSTANT CONSTANT_CLO PTC PTC_CLO TSTAT NONE", - default: "PTC_CLO if *ahhcType* is AHP else NONE ", - required: "No", - variability: "constant") %> - -**cchPMx=*float*** - -Crankcase resistance heater input power; maximum power if *cchCM* is PTC or PTC\_CLO. - -<%= member_table( - units: "kW", - legal_range: "*x* $\\gt$ 0", - default: ".4 kW", - required: "No", - variability: "constant") %> - -**cchPMn=*float*** - -Crankcase heater minimum input power if *cchCM* is PTC or PTC\_CLO, disallowed for other *cchCM's*. > 0. - -<%= member_table( - units: "kW", - legal_range: "*x* $\\gt$ 0", - default: ".04 kW", - required: "No", - variability: "constant") %> - -**cchTMx=*float*** - -**cchTMn=*float*** - -For *cchCM* = PTC or PTC\_CLO, the low temperature (max power) and high temperature (min power) setpoints. In subhours when the compressor does not run, crankcase heater input is *cchPMx* when oil temperature is at or below *cchTMx*, *cchPMn* when oil temp is at or above *cchTMn*, and varies linearly (proportionally) in between. *cchTMn* must be $\ge$ *cchTMx*. See *cchDT* (next). - -(Note that actual thermostat setpoints probably cannot be used for *cchTMx* and *cchTMn* inputs, because the model assumes the difference between the oil temperature and the outdoor temperature is constant (*cchDT*) regardless of the heater power. - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "*cchTMn*: 0; *cchTMx*: 150", - required: "No", - variability: "constant") %> - -**cchDT=*float*** - -For *cchCM* = PTC or PTC\_CLO, how much warmer than the outdoor temp CSE assumes the crankcase oil to be in subhours when the compressor does not run. If the compressor runs at all in the subhour, the oil is assumed to be warmer than *cchTMn*. - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "20^o^F", - required: "No", - variability: "constant") %> - -**cchTOn=*float*** - -**cchTOff=*float*** - -For *cchCM* = TSTAT, in subhours when compressor does not run, the crankcase heater turn-on and turn-off outdoor temperatures, respectively. Unequal values may be given to simulate thermostat differential. When the compressor runs at all in a subhour, the crankcase heater is off for the entire subhour. - -<%= member_table( - units: "^o^F", - legal_range: "*cchTOff* $\\ge$ *cchTOn*", - default: "*cchTOn*: 72^o^F; *chcTOff*: *chcTOn*", - required: "No", - variability: "constant") %> - -**cchMtr=*name of a METER*** - -METER to record crankcase heater energy use, category "Aux"; not recorded if not given. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**endAirHandler** - -Indicates the end of the air handler definition. Alternatively, the end of the air handler definition can be indicated by the declaration of another object. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> - -**Related Probes:** - -- @[airHandler](#p_airhandler) -- @[ahRes](#p_ahres) (accumulated results) diff --git a/doc/src/records/boiler.md b/doc/src/records/boiler.md deleted file mode 100644 index d5b04fa21..000000000 --- a/doc/src/records/boiler.md +++ /dev/null @@ -1,251 +0,0 @@ -# BOILER - -BOILERs are subObjects of HEATPLANTs (preceding Section 5.20). BOILERs supply heat, through their associated HEATPLANT, to HW coils and heat exchangers. - -Each boiler has a pump. The pump operates whenever the boiler is in use; the pump generates heat in the water, which is added to the boiler's output. The pump heat is independent of load -- the model assumes a bypass valve keeps the water flow constant when the loads are using less than full flow -- except that the heat is assumed never to exceed the load. - -**boilerName** - -Name of BOILER object, given immediately after the word BOILER. The name is used to refer to the boiler in heat plant stage commands. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**blrCap=*float*** - -Heat output capacity of this BOILER. - -<%= member_table( - units: "Btuh", - legal_range: "*x* $\\gt$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**blrEffR=*float*** - -Boiler efficiency at steady-state full load, as a fraction. 1.0 may be specified to model a 100% efficient boiler. - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\le$ 1.0", - default: "0.8", - required: "No", - variability: "constant") %> - -**blrEirR=*float*** - -Boiler Energy Input Ratio: alternate method of specifying efficiency. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 1.0", - default: "1/*blrEffR*", - required: "No", - variability: "constant") %> - -**blrPyEi=*a, b, c, d*** - -Coefficients of cubic polynomial function of part load ratio (load/capacity) to adjust full-load energy input for part load operation. Up to four floats may be given, separated by commas, lowest order (i.e. constant term) coefficient first. If the given coefficients result in a polynomial whose value is not 1.0 when the input variable, part load ratio, is 1.0, a warning message will be printed and the coefficients will be normalized to produce value 1.0 at input 1.0. - -<%= member_table( - units: "", - legal_range: "", - default: ".082597, .996764, 0.79361, 0.", - required: "No", - variability: "constant") %> - -**blrMtr=*name of a METER*** - -Meter to which Boiler's input energy is accumulated; if omitted, input energy is not recorded. - -<%= member_table( - units: "", - legal_range: "name of a METER", - default: "*none*", - required: "No", - variability: "constant") %> - -**blrpGpm=*float*** - -Boiler pump flow in gallons per minute: amount of water pumped from this boiler through the hot water loop supplying the HEATPLANT's loads (HW coils and heat exchangers) whenever boiler is operating. - -<%= member_table( - units: "gpm", - legal_range: "*x* $\\gt$ 0", - default: "blrCap/10000", - required: "No", - variability: "constant") %> - -**blrpHdloss=*float*** - -Boiler pump head loss (pressure). 0 may be specified to eliminate pump heat and pump energy input. - -<%= member_table( - units: "ft H2O", - legal_range: "*x* $\\ge$ 0", - default: "114.45\*", - required: "No", - variability: "constant") %> - -\* may be temporary value for 10-31-92 version; prior value of 35 may be restored. - -**blrpMotEff=*float*** - -Boiler pump motor efficiency. - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\le$ 1.0", - default: ".88", - required: "No", - variability: "constant") %> - -**blrpHydEff=*float*** - -Boiler pump hydraulic efficiency - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\le$ 1.0", - default: ".70", - required: "No", - variability: "constant") %> - -**blrpMtr=*name of a METER*** - -Meter to which pump electrical input energy is accumulated. If omitted, pump input energy use is not recorded. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*none*", - required: "No", - variability: "constant") %> - -The following four members permit specification of auxiliary input power use associated with the boiler under the conditions indicated. - -<%= csv_table(< false) -blrAuxOn=*float*, Auxiliary power used when boiler is running, in proportion to its subhour average part load ratio (plr). -blrAuxOff=*float*, Auxiliary power used when boiler is not running, in proportion to 1 - plr. -blrAuxFullOff=*float*, Auxiliary power used only when boiler is off for entire subhour; not used if the boiler is on at all during the subhour. -blrAuxOnAtAll=*float*, Auxiliary power used in full value if boiler is on for any fraction of subhour. -END -%> - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> - -The following four allow specification of meters to record boiler auxiliary energy use through blrAuxOn, blrAuxOff, blrFullOff, and blrAuxOnAtAll, respectively. End use category "Aux" is used. - -**blrAuxOn=*float*** - -Additional input energy used in proportion to part load ratio when coil on, as for induced draft fan, hourly variable for unforeseen applications. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "0.0", - required: "No", - variability: "hourly") %> - -**blrAuxOnMtr=*mtrName*** - -Meter to which to charge *auxOn*. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**blrAuxOff=*float*** - -Additional input energy when off for part or all of subhour. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "0.0", - required: "No", - variability: "hourly") %> - -**blrAuxOffMtr=*mtrName*** - -Meter to which to charge *auxOff*. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**blrAuxFullOff=*float*** - -Additional input energy when off for an entire subhour. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "0.0", - required: "No", - variability: "hourly") %> - -**blrAuxFullOffMtr=*mtrName*** - -Meter to which to charge *blrAuxFullOff*. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**blrAuxOnAtall=*float*** - -Additional input energy used in coil on for any part of subhour, for unforeseen uses. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "0.0", - required: "No", - variability: "hourly") %> - -**blrAuxOnAtAllMtr=*mtrName*** - -MTR for "auxOnAtall" - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**endBoiler** - -Optionally indicates the end of the boiler definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> - - -**Related Probes:** - -- @[boiler](#p_boiler) diff --git a/doc/src/records/descond.md b/doc/src/records/descond.md deleted file mode 100644 index 15b95eace..000000000 --- a/doc/src/records/descond.md +++ /dev/null @@ -1,126 +0,0 @@ -# DESCOND - -Specifies conditions for a cooling design day. When referenced in TOP coolDsCond (see [TOP Autosizing](#top-autosizing)), DESCOND members are used to generate a 24 hour design day used during cooling autosizing. Note that coolDsCond can reference more than one DESCOND, allowing multiple design conditions to be used for autosizing. For example, both summer and fall days could be specified to ensure a range of sun angles are considered. Any DESCONDs that are not referenced in coolDsCond have no effect. - -**desCondName** - -Object name, given after “DESCOND”. Required for referencing from Top coolDsCond. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**dcDay=*date*** - -Calendar date for this design cooling condition. - -<%= member_table( - units: "", - legal_range: "1-365", - default: "200", - required: "No", - variability: "constant") %> - -**dcDB=*float*** - -Design dry-bulb temperature (maxiumum temperature on design day). - -<%= member_table( - units: "^o^F", - legal_range: "no-limitations?", - default: "0.0", - required: "No", - variability: "constant") %> - - -**dcMCDBR=*float*** - -Coincident daily dry-bulb range. - -<%= member_table( - units: "^o^F", - legal_range: "no-limitations?", - default: "**none**", - required: "No", - variability: "constant") %> - -**dcMCWB=*float*** - -Coincident wet-bulb design temperature. - -<%= member_table( - units: "^o^F", - legal_range: "no-limitations?", - default: "**none**", - required: "No", - variability: "constant") %> - -**dcMCWBR=*float*** - -Coincident daily wet-bulb range. - -<%= member_table( - units: "^o^F", - legal_range: "no-limitations?", - default: "**none**", - required: "No", - variability: "constant") %> - -**dcWindSpeed=*float*** - -Wind speed for design conditions. - -<%= member_table( - units: "mph", - legal_range: "x $\\geq$ 0", - default: "0.0", - required: "No", - variability: "constant") %> - -DESCOND provides two mutually-exclusive methods for specifying design day direct beam and diffuse horizontal irradiance values. Both use the ASHRAE clear sky model. Consult the ASHRAE *Handbook of Fundamentals* Climatic Data chapter for model documentation. - -- Pseudo optical depth. dcTauB and dcTauD define the taub and taud parameters in the clear sky model. -- Solar noon irradiance. CSE uses dcEbnSlrNoon and dcEdhSlrNoon to back-calculate taub and taud. - -At most one of these methods can be used within a given DESCOND. If all solar-related values are omitted, the generated design day has 0 irradiance for all hours. - - -**dcTauB=*float*** \ -**dcTauD=*float*** - -ASHRAE clear sky model beam and diffuse pseudo optical depths. These values are available by month for many locations in ASHRAE design weather data. Cannot be given if dcEbnSlrNoon and dcEdhSlrNoon are specified. - -<%= member_table( - units: "", - legal_range: "", - default: "0 irradiance", - required: "No", - variability: "constant") %> - - -**dcEbnSlrNoon=*float*** \ -**dcEdhSlrNoon=*float*** - -Solar noon direct beam and diffuse horizontal irradiance. Cannot be given if dcTauB and dcTauD are specified. - -<%= member_table( - units: "Btuh/ft^2^", - legal_range: "x $\\geq$ 0", - default: "0 irradiance", - required: "No", - variability: "constant") %> - -**endDesCond** - -Optionally indicates the end of the descond definition. - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "") %> \ No newline at end of file diff --git a/doc/src/records/dhwheater-doc.md b/doc/src/records/dhwheater-doc.md deleted file mode 100644 index 54e52a0bb..000000000 --- a/doc/src/records/dhwheater-doc.md +++ /dev/null @@ -1,637 +0,0 @@ -**whName** - -Optional name of water heater; give after the word “DHWHEATER” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**whMult=*integer*** - -Number of identical water heaters of this type. Any value $>1$ is equivalent to repeated entry of the same DHWHEATER. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**whType=*choice*** - -Type of water heater. This categorization is based on CEC and federal rating standards that change from time to time. - -<%= csv_table(< false) - SMALLSTORAGE, A storage water heater having an energy factor (EF) rating. Generally, a gas-fired storage water heater with input of 75,000 Btuh or less, an oil-fired storage water heater with input of 105,000 Btuh or less, an electric storage water heater with input of 12 kW or less, or a heat pump water heater rated at 24 amps or less. - LARGESTORAGE, Any storage water heater that is not SMALLSTORAGE. - SMALLINSTANTANEOUS, A water heater that has an input rating of at least 4,000 Btuh per gallon of stored water. Small instantaneous water heaters include: gas instantaneous water heaters with an input of 200,000 Btu per hour or less, oil instantaneous water heaters with an input of 210,000 Btu per hour or less, and electric instantaneous water heaters with an input of 12 kW or less. - LARGEINSTANTANEOUS, An instantaneous water heater that does not conform to the definition of SMALLINSTANTANEOUS, an indirect fuel-fired water heater, or a hot water supply boiler. - INSTANTANEOUSUEF, An instantaneous water heater having a UEF rating (as opposed to EF). -END -%> - - <%= member_table( - units: "", - legal_range: "*Codes listed above*", - default: "SMALLSTORAGE", - required: "No", - variability: "constant") - %> - -**whHeatSrc=*choice*** - -Heat source for water heater. CSE implements uses efficiency-based models for -all whTypes (as documented in RACM, App. B). In addition, the detailed Ecotope HPWH model is -available for electric (air source heat pump and resistance) SMALLSTORAGE water heaters. - -<%= csv_table(< false) - RESISTANCE, Electric resistance heating element Deprecated for whType=SMALLSTORAGE (use RESISTANCEX) - RESISTANCEX, Electric resistance heating element, detailed HPWH model - ASHP, Air source heat pump, EF model Deprecated for whType=SMALLSTORAGE (use ASHPX) - ASHPX, Air source heat pump, detailed HPWH model - FUEL, Fuel-fired burner -END -%> - -<%= member_table( - units: "", - legal_range: "*Codes listed above*", - default: "FUEL", - required: "No", - variability: "constant") - %> - -**whResType=*choice*** - -Resistance heater type, valid only if whHeatSrc is equal to RESISTANCEX, else ignored. These choices are supported by the detailed HPWH model. Except for Generic, all heater characteristics are set by HPWH based on whResType. - -<%= member_table( - units: "", - legal_range: "Typical\nSwingTank", - default: "Typical", - required: "No", - variability: "constant") %> - -**whHeatingCap=*float*** - -Nominal heating capacity, available only for a limited HPWH types. - -<%= member_table( - units: "Btuh", - legal_range: "x $>$ 0", - default: "0", - required: "No", - variability: "constant") %> - -**whVol=*float*** - -Storage tank volume. Must be omitted or 0 for instantaneous whTypes. Used by HPWH model (whHeatSrc=RESISTANCEX or whHeatSrc=ASHPX). Required when whHeatSrc=RESISTANCEX or whHeatSrc=ASHPX with whASHPType=GENERIC. For all other configurations, whVol is documentation-only. - -<%= member_table( - units: "gal", - legal_range: "$\\ge$ 0.1 (caution: small values may cause runtime errors)", - default: "per whASHPType if HPWH else 50", - required: "For some HPWH configurations, see above", - variability: "constant") - %> - -**whVolRunning=*float*** - -Running storage volume is the volume above aquastat. Requires the total volume based on aquastat position. Ecotope's HPWH tank and heater. - -<%= member_table( - units: "gal", - legal_range: "x $>$ 0", - default: "0", - required: "No", - variability: "constant") %> - - -**whEF=*float*** - -Rated energy factor that specifies DHWHEATER efficiency under test conditions. Used -by CSE to derive annual water heating efficiency and/or other characteristics as described -below. Calculation methods are documented in RACM, Appendix B. - -<%= csv_table(< true) - Configuration, whEF default, Use - whType=SMALLSTORAGE, whHeatSrc=RESISTANCE or FUEL, 0.82, Derivation of whLDEF - whType=SMALLSTORAGE, whHeatSrc=ASHP, 0.82, Derivation of whLDEFnote inappropriate default (deprecated, use ASHPX) - whType=SMALLSTORAGE, whHeatSrc=ASHPX, whASHPType=GENERIC, (req'd), Tank losses Overall efficiency - whType=SMALLSTORAGE, whHeatSrc=RESISTANCEX, (req'd), Tank losses Note: maximum whEF=0.98. - whType=SMALLINSTANTANEOUS, whHeatSrc=RESISTANCE or FUEL, 0.82, Annual efficiency = whEF*0.92 - Any other, (unused) -END -%> - -<%= member_table( - units: "", - legal_range: "$>$ 0 *Caution: maximum not checked. Unrealistic values will cause runtime errors and/or invalid results*", - default: "*See above*", - required: "*See above*", - variability: "constant") - %> - -**whLDEF=*float*** - -Load-dependent energy factor for DHWHEATERs with whType=SMALLSTORAGE and whHeatSrc=FUEL -or whHeatSrc=RESISTANCE. If not given, whLDEF is derived using a preliminary simulation -activated via DHWSYS wsCalcMode=PRERUN. See RACM Appendix B. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "Calculated via DHWSYS PreRun mechanism", - required: "When whType = SMALLSTORAGE and PreRun not used", - variability: "constant") - %> - -**whUEF=*float*** - -Water heater Uniform Energy Factor efficiency rating. Required when whType=INSTANTANEOUSUEF. When specified with -whType=SMALLSTORAGE and whHeatSrc=ASHPX, the compressor performance will be adjusted to match the value input here. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "*none*", - required: "when whType= INSTANTANEOUSUEF", - variability: "constant") - %> - -**whAnnualElec=*float*** - -Annual electricity use assumed in UEF rating derivation. Used when whType=INSTANTANEOUSUEF. - -<%= member_table( - units: "kWh", - legal_range: "x $\\ge$ 0", - default: "*none*", - required: "when whType= INSTANTANEOUSUEF", - variability: "constant") - %> - -**whAnnualFuel=*float*** - -Annual fuel use assumd in UEF rating derivation, used when whType=INSTANTANEOUSUEF. - -<%= member_table( - units: "therms", - legal_range: "x $\\ge$ 0", - default: "*none*", - required: "when whType= INSTANTANEOUSUEF", - variability: "constant") - %> - -**whRatedFlow=*float*** - -Maximum flow rate assumed in UEF rating derivation. Used when whType=INSTANTANEOUSUEF. - -<%= member_table( - units: "gpm", - legal_range: "x $>$ 0", - default: "*none*", - required: "when whType= INSTANTANEOUSUEF", - variability: "constant") - %> - -**whStbyElec=*float*** - -Instantaneous water heater standby power (electricity consumed when heater is not operating). Used when whType=INSTANTANEOUSUEF. - -<%= member_table( - units: "W", - legal_range: "x $\\ge$ 0", - default: "4", - required: "No", - variability: "constant") - %> - -**whLoadCFwdF=*float*** - -Instanteous water heater load carry forward factor -- approximate number of hours the heater is allowed to meet water heating demand that is unmet on a 1 minute basis, used when whType=INSTANTANEOUSUEF. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**whZone=*znName*** - -Name of zone where water heater is located, used only in detailed HPWH models (whHeatSrc=ASHPX or whHeatSrc=RESISTANCEX), otherwise no effect. Zone conditions are used for tank heat loss calculations. Heat losses from the DHWHEATER are included in the zone heat balance. whZone also provides the default for whASHPSrcZn (see below). - -whZone and whTEx cannot both be specified. - -<%= member_table( - units: "", - legal_range: "name of a ZONE", - default: "Not in a zone (heat losses discarded)", - required: "No", - variability: "constant") - %> - -**whTEx=*float*** - -Water heater surround temperature, used only in detailed HPWH models (whHeatSrc=ASHPX or whHeatSrc=RESISTANCEX), otherwise no effect. When whTEx is specified, tank heat losses are calculated using whTEx and modify tank water temperatures, but the lost heat has no external effect. - -whZone and whTEx cannot both be specified. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\ge$ 0", - default: "whZone air temperature if specified, else 70 ^o^F", - required: "No", - variability: "hourly") - %> - -**whASHPType=*choice*** - -Air source heat pump type, valid only if whHeatSrc=ASHPX. These choices are supported by the detailed HPWH model. Except for Generic, all heater characteristics are set by HPWH based on whASHPType. - -<%= csv_table(< true) -"Choice","Specified type" -"Generic","General generic (parameterized by wh_EF and wh_vol)" -"AOSmithPHPT60","60 gallon Voltex" -"AOSmithPHPT80","80 gallon Voltex" -"AOSmithHPTU50","50 gallon AOSmith HPTU" -"AOSmithHPTU66","66 gallon AOSmith HPTU" -"AOSmithHPTU80","80 gallon AOSmith HPTU" -"AOSmithHPTU80DR","80 gallon AOSmith HPTU (demand reduction variant)" -"AOSmithCAHP120","120 gallon AOSmith" -"Sanden40","Sanden 40 gallon CO2 external heat pump" -"Sanden80","Sanden 80 gallon CO2 external heat pump" -"Sanden120","Sanden 120 gallon CO2 external heat pump" -"SandenGS3","Sanden GS3 compressor CO2 external" -"GE2012","2012 era GeoSpring" -"GE2014","2014 80 gal GE model run in the efficiency mode" -"GE2014_80DR","2014 80 gal GE model run in the efficiency mode (demand reduction variant)" -"GE2014StdMode","2014 50 gal GE run in standard mode" -"GE2014StdMode80","2014 80 gal GE run in standard mode" -"RheemHB50","newish Rheem (2014 model?)" -"RheemHBDR2250","50 gallon, 2250 W resistance Rheem HB Duct Ready" -"RheemHBDR4550","50 gallon, 4500 W resistance Rheem HB Duct Ready" -"RheemHBDR2265","65 gallon, 2250 W resistance Rheem HB Duct Ready" -"RheemHBDR4565","65 gallon, 4500 W resistance Rheem HB Duct Ready" -"RheemHBDR2280","80 gallon, 2250 W resistance Rheem HB Duct Ready" -"RheemHBDR4580","80 gallon, 4500 W resistance Rheem HB Duct Ready" -"Rheem2020Prem40","40 gallon, Rheem 2020 Premium" -"Rheem2020Prem50","50 gallon, Rheem 2020 Premium" -"Rheem2020Prem65","65 gallon, Rheem 2020 Premium" -"Rheem2020Prem80","80 gallon, Rheem 2020 Premium" -"Rheem2020Build40","40 gallon, Rheem 2020 Builder" -"Rheem2020Build50","50 gallon, Rheem 2020 Builder" -"Rheem2020Build65","65 gallon, Rheem 2020 Builder" -"Rheem2020Build80","80 gallon, Rheem 2020 Builder" -"RheemPlugInShared40","40 gal Rheem plug-in 120V shared circuit (no resistance elements)" -"RheemPlugInShared50","50 gal Rheem plug-in 120V shared circuit (no resistance elements)" -"RheemPlugInShared65","65 gal Rheem plug-in 120V shared circuit (no resistance elements)" -"RheemPlugInShared80","80 gal Rheem plug-in 120V shared circuit (no resistance elements)" -"RheemPlugInDedicated40","40 gal Rheem plug-in 120V dedicated circuit (no resistance elements)" -"RheemPlugInDedicated50","50 gal Rheem plug-in 120V dedicated circuit (no resistance elements)" -"Stiebel220E","Stiebel Eltron (2014 model?)" -"AOSmithSHPT50","AOSmith add'l models (added 3-24-2017)" -"AOSmithSHPT66","AOSmith add'l models (added 3-24-2017)" -"AOSmithSHPT80","AOSmith add'l models (added 3-24-2017)" -"GenericTier1","Generic Tier 1" -"GenericTier2","Generic Tier 2" -"GenericTier3","Generic Tier 3" -"Generic","General generic (parameterized by EF and vol)" -"UEF2Generic","Experimental UEF=2" -"WorstCaseMedium","UEF2Generic alias (supports pre-existing test cases)" -"BasicIntegrated","Typical integrated HPWH" -"ResTank","Resistance heater (no compressor). Superceded by whHeatSrc=RESITANCEX" -"ResTankNoUA","Resistance heater (no compressor) with no tank losses. Superseded by whHeatSrc=RESISTANCEX." -"AOSmithHPTU80DR","80 gallon AOSmith HPTU with fixed backup setpoint (experimental for demand response testing)" -"AOSmithSHPT50","50 gal AOSmith SHPT" -"AOSmithSHPT66","66 gal AOSmith SHPT" -"AOSmithSHPT80","80 gal AOSmith SHPT" -"AOSmithHPTS40","40 gal AOSmith HPTS" -"AOSmithHPTS50","50 gal AOSmith HPTS" -"AOSmithHPTS66","66 gal AOSmith HPTS" -"AOSmithHPTS80","80 gal AOSmith HPTS" -"ColmacCxV5_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxA10_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxA15_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxA20_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxA25_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxA30_SP","Colmac CxA-xx modular external HPWHs (single pass mode)" -"ColmacCxV5_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"ColmacCxA10_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"ColmacCxA15_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"ColmacCxA20_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"ColmacCxA25_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"ColmacCxA30_MP","Colmac CxA-xx modular external HPWHs (multi-pass mode)" -"NyleC25A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC60A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC90A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC125A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC185A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC250A_SP","Nyle Cxx external HPWHs (SP = single pass mode)" -"NyleC60A_CWP_SP","Nyle Cxx external SP HPWHs with cold weather package" -"NyleC90A_CWP_SP","Nyle Cxx external SP HPWHs with cold weather package" -"NyleC125A_CWP_SP","Nyle Cxx external SP HPWHs with cold weather package" -"NyleC185A_CWP_SP","Nyle Cxx external SP HPWHs with cold weather package" -"NyleC250A_CWP_SP","Nyle Cxx external SP HPWHs with cold weather package" -"NyleC60A_MP","Nyle Cxx external HPWHs (MP = multi-pass mode)" -"NyleC90A_MP","Nyle Cxx external HPWHs (MP = multi-pass mode)" -"NyleC125A_MP","Nyle Cxx external HPWHs (MP = multi-pass mode)" -"NyleC185A_MP","Nyle Cxx external HPWHs (MP = multi-pass mode)" -"NyleC250A_MP","Nyle Cxx external HPWHs (MP = multi-pass mode)" -"NyleC60A_CWP_MP","Nyle Cxx external MP HPWHs w/ cold weather package" -"NyleC90A_CWP_MP","Nyle Cxx external MP HPWHs w/ cold weather package" -"NyleC125A_CWP_MP","Nyle Cxx external MP HPWHs w/ cold weather package" -"NyleC185A_CWP_MP","Nyle Cxx external MP HPWHs w/ cold weather package" -"NyleC250A_CWP_MP","Nyle Cxx external MP HPWHs w/ cold weather package" -"Rheem_HPHD60HNU_MP","Rheem HPHD60 MP external MP HPWHs" -"Rheem_HPHD60VNU_MP","Rheem HPHD60 MP external MP HPWHs" -"Rheem_HPHD135HNU_MP","Rheem HPHD135 MP external MP HPWHs" -"Rheem_HPHD135VNU_MP","Rheem HPHD135 MP external MP HPWHs" -"Scalable_SP","single pass scalable type for autosized standard design" -"Scalable_MP","multipass scalable type for autosized standard design" -"AquaThermAire","Villara AquaThermAire HPWH" -"GenericUEF217","65-gal tank meeting Federal standard minimum requirement" -"AWHSTier3Generic40","A 40-gal tank meeting Advanced Water Heating Specification Tier-3 minimum requirements" -"AWHSTier3Generic50","A 50-gal tank meeting Advanced Water Heating Specification Tier-3 minimum requirements" -"AWHSTier3Generic65","A 65-gal tank meeting Advanced Water Heating Specification Tier-3 minimum requirements" -"AWHSTier3Generic80","A 80-gal tank meeting Advanced Water Heating Specification Tier-3 minimum requirements" -"AWHSTier4Generic40","A 40-gal tank meeting Advanced Water Heating Specification Tier-4 minimum requirements" -"AWHSTier4Generic50","A 50-gal tank meeting Advanced Water Heating Specification Tier-4 minimum requirements" -"AWHSTier4Generic65","A 65-gal tank meeting Advanced Water Heating Specification Tier-4 minimum requirements" -"AWHSTier4Generic80","A 80-gal tank meeting Advanced Water Heating Specification Tier-4 minimum requirements" -"BradfordWhiteAeroThermRE2H50","Bradford White 50-gal AeroTherm2023" -"BradfordWhiteAeroThermRE2H65","Bradford White 65-gal AeroTherm2023" -"BradfordWhiteAeroThermRE2H80","Bradford White 80-gal AeroTherm2023" -"LG_APHWC50","LG 50-gal integrated HPWH" -"LG_APHWC80","LG 580-gal integrated HPWH" -END -%> - -<%= member_table( - units: "", - legal_range: "*Codes listed above*", - default: "*none*", - required: "When whHeatSrc=ASHPX", - variability: "constant") - %> - -**whASHPSrcZn=*znName*** - -Name of zone that serves as heat pump heat source used when whHeatSrc=ASHPX. Heat removed from the zone is added to the heated water and is included in zone heat balance (that is, heat pump operation cools the zone). - -whASHPSrcZn and whASHPSrcT cannot both be specified. - -<%= member_table( - units: "", - legal_range: "name of a ZONE", - default: "whZoneIf no zone is specified by input or default, heat extracted by ASHP has no effect.", - required: "No", - variability: "constant") - %> - -**whASHPSrcT=*float*** - -Heat pump source air temperature used when whHeatSrc=ASHPX. Heat removed from this source is added to the heated water but has no other effect. - -whASHPSrcZn and whASHPSrcT cannot both be specified. - -The logic to determine the temperature of the heat pump source air is: - -~~~ - if whASHPSrcT is specified - use whASHPSrcT - else if whASHPSRCZn is specified - use whASHPSrcZn air temp - else if whZone is specified - use whZone air temp - else - use 70 F -~~~ - -To model a heat pump that uses outdoor air as its heat source, omit whASHPSrcZn and specify whASHPSrcT = $tDbO. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\ge$ 0", - default: "70 ^o^F (used only when whASHPSrcZn and whZone not specified)", - required: "No", - variability: "hourly") - %> - -**whASHPResUse=*float*** - - Specifies activation temperature difference for resistance heating, used only when whHeatSrc=ASHPX and whASHPType=GENERIC. Refer to HPWH engineering documentation for model details. - -<%= member_table( - units: "^o^C", - legal_range: "x $\\ge$ 0", - default: "7.22", - required: "No", - variability: "constant") - %> - -**whResHtPwr=*float*** - - Specifies resistance upper element power, used only with whHeatSrc=RESISTANCEX. - -<%= member_table( - units: "W", - legal_range: "x $\\ge$ 0", - default: "4500", - required: "No", - variability: "constant") - %> - -**whResHtPwr2=*float*** - - Specifies resistance lower element power, used only with whHeatSrc=RESISTANCEX. - -<%= member_table( - units: "W", - legal_range: "x $\\ge$ 0", - default: "whResHtPwr", - required: "No", - variability: "constant") - %> - -**whUA=*float*** - -HPWH-type total UA (not per tank) - -<%= member_table( - units: "Btuh/F", - legal_range: "x $\\geq$ 0", - default: "HPWH default", - required: "No", - variability: "constant") %> - -**whInsulR=*float*** - -Tank insulation resistance for heat pump water heater. - -<%= member_table( - units: "hr-F/Btuh", - legal_range: "x $>$ 0", - default: "-1", - required: "No", - variability: "constant") %> - -**whInHtSupply=*float***\ -**whInHtLoopRet=*float*** - - Fractional tank height of inlets for supply water and DHWLOOP return, used only with HPWH types (whHeatSrc=RESISTANCEX or whHeatSrc=ASHPX). 0 indicates the bottom of the water heater tank and 1 specifies the top. Inlet height influences tank layer mixing and can impact heat pump COP and/or heating activation frequency. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "HPWH default (0?) ", - required: "No", - variability: "constant") - %> - -**whtankCount=*float*** - -Number of storage tanks per DHWHEATER, re built-up whType=Builtup, does *not* reflect wh_mult (wh_mult=2, wh_tankCount=3 -> 6 tanks). - -<%= member_table( - units: "#", - legal_range: "x $\\geq$ 1", - default: "1", - required: "No", - variability: "constant") %> - -**whEff=*float*** - -Water heating efficiency, used in modeling whType=LARGESTORAGE and whType=LARGEINSTANTANEOUS. - -<%= member_table( - units: "", - legal_range: "0 $<$ whEff $\\leq$ 1", - default: ".82", - required: "No", - variability: "constant") - %> - -**whSBL=*float*** - -Standby loss, used in modeling whType=LARGESTORAGE. - -<%= member_table( - units: "Btuh", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") - %> - -**whPilotPwr=*float*** - -Pilot light consumption, included in fuel energy use of DHWHEATERs with whHeatSrc=FUEL. - -<%= member_table( - units: "Btuh", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**whParElec=*float*** - -Parasitic electricity power, included in electrical energy use of all DHWHEATERs. - -<%= member_table( - units: "W", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**whFAdjElec=*float***\ -**whFAdjFuel=*float*** - -Water heater energy use modifiers. Multiplies calculated use of electricity (whFAdjElec) and fuel (whFAdjFuel). All components of energy use -- primary, backup, XBU (extra backup), and other auxiliary -- are modified before they are accumulated to whElecMtr and whFuelMtr. - -<%= member_table( - units: "", - legal_range: "$\\ge$ 0", - default: "1", - required: "No", - variability: "subhourly") - %> - -**whElecMtr=*mtrName*** - -Name of METER object, if any, by which DHWHEATER electrical energy use is recorded (under end use DHW). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*Parent DHWSYS wsElecMtr*", - required: "No", - variability: "constant") - %> - -**whxBUEndUse=*choice*** - -Specifies the whElecMtr end use, if any, to which extra backup energy is accumulated. In some water heater types, extra backup energy is modeled to maintain output temperature at wsTUse. By default, extra backup energy is included in end use dhwBU. whxBUEndUse allows specification of an alternative end use to which extra backup energy is accumulated. - -<%= member_table( - units: "", - legal_range: "*end use code* ", - default: "(extra backup accums to dhwBU)", - required: "No", - variability: "constant") - %> - -**whFuelMtr =*mtrName*** - -Name of METER object, if any, by which DHWHEATER fuel energy use is recorded (under end use DHW). - -<%= member_table( - units: "*name of a METER*", - legal_range: "*Parent DHWSYS wsFuelMtr*", - default: "", - required: "No", - variability: "constant") - %> - -**whTankTInit =*comma-separated list of 12 floats*** - -A list of 12 initial values for HPWH tank model layer temperatures, in bottom-to-top order. If given, these values are used to initialize tank layer temperatures at the beginning of the warmup period. Initialization is not repeated at the beginning of the main simulation. - -whTankTInit is allowed only for HPWH-based types (whHeatSrc=ASHPX or whHeatSrc=ResistanceX). - -whTankTInit is intended for use in empirical validation studies where the initial tank state needs to match measured data. whTankTInit should not be generally used. In the absence of whTankTInit, layer temperatures are initialized to the water heater setpoint inherited from the parent DHWSYS. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\gt$ 0", - default: "", - required: "No", - variability: "constant") - %> - -**endDHWHEATER** - -Optionally indicates the end of the DHWHEATER definition. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "") - %> - -**Related Probes:** - -- @[DHWHeater](#p_dhwheater) diff --git a/doc/src/records/dhwloop.md b/doc/src/records/dhwloop.md deleted file mode 100644 index adfbdb9e4..000000000 --- a/doc/src/records/dhwloop.md +++ /dev/null @@ -1,117 +0,0 @@ -# DHWLOOP - -DHWLOOP constructs one or more objects representing a domestic hot water circulation loop. The actual pipe runs in the DHWLOOP are specified by any number of DHWLOOPSEGs (see below). Circulation pumps are specified by DHWLOOPPUMPs (also below). - -**wlName** - -Optional name of loop; give after the word “DHWLOOP” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> - -**wlMult=*integer*** - -Number of identical loops of this type. Any value $>1$ is equivalent to repeated entry of the same DHWLOOP (and all child objects). - -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "constant") %> - -**wlFlow=*float*** - -Loop flow rate (when operating). - -<%= member_table( - units: "gpm", - legal_range: "*x* $\\ge$ 0", - default: "6", - required: "No", - variability: "hourly") %> - -**wlTIn1=*float*** - -Inlet temperature of first DHWLOOPSEG. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "DHWSYS wsTUse", - required: "No", - variability: "hourly") %> - -**wlRunF=*float*** - -Fraction of hour that loop circulation operates. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "hourly") %> - -**wlFUA=*float*** - -DHWLOOPSEG pipe heat loss adjustment factor. DHWLOOPSEG UA is derived (from wgSize, wgLength, wgInsulK, wgInsulThk, and wgExH) and multiplied by wlFUA. Note: does not apply to child DHWLOOPBRANCHs (see wbFUA). - -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "constant") %> - -**wlLossMakeupPwr=*float*** - -Specifies electrical power available to make up losses from DHWLOOPSEGs (loss from DHWLOOPBRANCHs is not included). Separate loss makeup is typically used in multi-unit HPWH systems to avoid inefficiencies associated with high condenser temperatures. Loss-makeup energy is calculated hourly and is the smaller of loop losses and wlLossMakeupPwr. The resulting electricity use (including the effect of wlLossMakeupEff) is accumulated to the METER specified by wlElecMtr (end use dhwMFL). No other effect, such as heat gain to surroundings, is modeled. - -<%= member_table( - units: "W", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") %> - -**wlLossMakeupEff=*float*** - -Specifies the efficiency of loss makeup heating if any. No effect when wlLossMakeupPwr is 0. - -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "hourly") %> - -**wlElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWLOOP electrical energy use is recorded (under end use dhwMFL). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*Parent DHWSYS wsElecMtr*", - required: "No", - variability: "constant") %> - -**endDHWLoop** - -Optionally indicates the end of the DHWLOOP definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "") %> - -**Related Probes:** - -- @[DHWLoop](#p_dhwloop) diff --git a/doc/src/records/dhwloopbranch.md b/doc/src/records/dhwloopbranch.md deleted file mode 100644 index 1e6050e70..000000000 --- a/doc/src/records/dhwloopbranch.md +++ /dev/null @@ -1,194 +0,0 @@ -# DHWLOOPBRANCH - -DHWLOOPBRANCH constructs one or more objects representing a branch pipe from the preceding DHWLOOPSEG. A DHWLOOPSEG can have any number of DHWLOOPBRANCHs to represent pipe runs with differing sizes, insulation, or surrounding conditions. - -**wbName** - -Optional name of segment; give after the word “DHWLOOPBRANCH” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wbMult=*float*** - -Specifies the number of identical DHWLOOPBRANCHs. Note may be non-integer. - -<%= member_table( - units: "", - legal_range: "*x* $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wbLength=*float*** - -Length of branch. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") - %> - -**wbSize=*float*** - -Nominal size of pipe. CSE assumes the pipe outside diameter = size + 0.125 in. - -<%= member_table( - units: "in", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**wbInsulK=*float*** - -Pipe insulation conductivity - -<%= member_table( - units: "Btuh-ft/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "0.02167", - required: "No", - variability: "constant") - %> - -**wbInsulThk=*float*** - -Pipe insulation thickness - -<%= member_table( - units: "in", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wbExH=*float*** - -Combined radiant/convective exterior surface conductance between insulation (or pipe if no insulation) and surround. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "*x* $>$ 0", - default: "1.5", - required: "No", - variability: "hourly") - %> - -**wbExCnd=*choice*** - -Specify exterior conditions. - -<%= csv_table(< true) -Choice, Description -ADIABATIC, Adiabatic on other side -AMBIENT, Ambient exterior -SPECT, Specify temperature -ADJZN, Adjacent zone -GROUND, Ground conditions -END -%> - -<%= member_table( - units: "", - legal_range: "See table above", - default: "SPECT", - required: "No", - variability: "constant") %> - -**wbAdjZn=*float*** - -Boundary conditions for adjacent zones. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "0.0", - required: "No", - variability: "runly") %> - -**wbExTX=*float*** - -External boundary conditions. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "70.0", - required: "No", - variability: "runly") %> - -**wbFUA=*float*** - -Adjustment factor applied to branch UA. UA is derived (from wbSize, wbLength, wbInsulK, wbInsulThk, and wbExH) and then multiplied by wbFUA. Used to represent e.g. imperfect insulation. Note that parent DHWLOOP wlFUA does not apply to DHWLOOPBRANCH (only DHWLOOPSEG) - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wbExT=*float*** - -Surrounding equivalent temperature. - -<%= member_table( - units: "^o^F", - legal_range: "*x* $>$ 0", - default: "*70*", - required: "No", - variability: "hourly") - %> - -**wbFlow=*float*** - -Branch flow rate assumed during draw. - -<%= member_table( - units: "gpm", - legal_range: "*x* $\\ge$ 0", - default: "2", - required: "No", - variability: "hourly") - %> - -**wbFWaste=*float*** - -Number of times during the hour when the branch volume is discarded. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**endDHWLOOPBRANCH** - -Optionally indicates the end of the DHWLOOPBRANCH definition. - -<%= member_table( - units: "", - legal_range: "*none*", - default: "*none*", - required: "No", - variability: "") - %> - -**Related Probes:** - -- @[DHWLoopBranch](#p_dhwloopbranch) diff --git a/doc/src/records/dhwlooppump.md b/doc/src/records/dhwlooppump.md deleted file mode 100644 index 0ee89a820..000000000 --- a/doc/src/records/dhwlooppump.md +++ /dev/null @@ -1,79 +0,0 @@ -# DHWLOOPPUMP - -DHWLOOPPUMP constructs an object representing a pump serving part a DHWLOOP. The model is identical to DHWPUMP *except* that that the electricity use calculation reflects wlRunF of the parent DHWLOOP. - -**wlpName** - -Optional name of pump; give after the word “DHWLOOPPUMP” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wlpMult=*integer*** - -Number of identical pumps of this type. Any value $>1$ is equivalent to repeated entry of the same DHWPUMP. - -<%= member_table( - units: "", - legal_range: "x $>$ 0 ", - default: "1", - required: "No", - variability: "constant") - %> - -**wlpPwr=*float*** - -Pump power. - -<%= member_table( - units: "W", - legal_range: "x $>$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**wlpLiqHeatF=*float*** - -Fraction of pump power that heats circulating liquid. The remainder is discarded. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 1", - default: "1", - required: "No", - variability: "hourly") - %> - -**wlpElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWLOOPPUMP electrical energy use is recorded (under end use dhwMFL). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*Parent DHWLOOP wlElecMtr*", - required: "No", - variability: "constant") - %> - -**endDHWLOOPPUMP** - -Optionally indicates the end of the DHWPUMP definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[DHWLoopPump](#p_dhwlooppump) diff --git a/doc/src/records/dhwloopseg.md b/doc/src/records/dhwloopseg.md deleted file mode 100644 index 3b91b3077..000000000 --- a/doc/src/records/dhwloopseg.md +++ /dev/null @@ -1,133 +0,0 @@ -# DHWLOOPSEG - -DHWLOOPSEG constructs one or more objects representing a segment of the preceeding DHWLOOP. A DHWLOOP can have any number of DHWLOOPSEGs to represent the segments of the loop with possibly differing sizes, insulation, or surrounding conditions. - -**wgName** - -Optional name of segment; give after the word “DHWLOOPSEG” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wgTy=*choice*** - -Specifies the type of segment. RETURN segments, if any, must follow SUPPLY segments. - -<%= csv_table(< false) - SUPPLY, Indicates a supply segment (flow is sum of circulation and draw flow, child DHWLOOPBRANCHs permitted). - RETURN, Indicates a return segment (flow is only due to circulation, child DHWLOOPBRANCHs not allowed) -END -%> - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**wgLength=*float*** - -Length of segment. - -<%= member_table( - units: "ft", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") - %> - -**wgSize=*float*** - -Nominal size of pipe. CSE assumes the pipe outside diameter = size + 0.125 in. - -<%= member_table( - units: "in", - legal_range: "x $>$ 0", - default: "1", - required: "Yes", - variability: "constant") - %> - -**wgInsulK=*float*** - -Pipe insulation conductivity - -<%= member_table( - units: "Btuh-ft/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "0.02167", - required: "No", - variability: "constant") - %> - -**wgInsulThk=*float*** - -Pipe insulation thickness - -<%= member_table( - units: "in", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wgExH=*float*** - -Combined radiant/convective exterior surface conductance between insulation (or pipe if no insulation) and surround. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "1.5", - required: "No", - variability: "hourly") - %> - -**wgExT=*float*** - -Surrounding equivalent temperature. - -<%= member_table( - units: "^o^F", - legal_range: "x $>$ 0", - default: "70", - required: "No", - variability: "hourly") - %> - -**wgFNoDraw=*float*** - -Fraction of hour when no draw occurs. - -<%= member_table( - units: "^o^F", - legal_range: "x $>$ 0", - default: "70", - required: "No", - variability: "hourly") - %> - -**endDHWLoopSeg** - -Optionally indicates the end of the DHWLOOPSEG definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "") - %> - -**Related Probes:** - -- @[DHWLoopSeg](#p_dhwloopseg) diff --git a/doc/src/records/dhwpump.md b/doc/src/records/dhwpump.md deleted file mode 100644 index d019fdb42..000000000 --- a/doc/src/records/dhwpump.md +++ /dev/null @@ -1,67 +0,0 @@ -# DHWPUMP - -DHWPUMP constructs an object representing a domestic hot water circulation pump (or more than one if identical). - -**wpName** - -Optional name of pump; give after the word “DHWPUMP” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wpMult=*integer*** - -Number of identical pumps of this type. Any value $>1$ is equivalent to repeated entry of the same DHWPUMP. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wpPwr=*float*** - -Pump power. - -<%= member_table( - units: "W", - legal_range: "x $>$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**wpElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWPUMP electrical energy use is recorded (under end use DHW). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*Parent DHWSYS wsElecMtr*", - required: "No", - variability: "constant") - %> - -**endDHWPump** - -Optionally indicates the end of the DHWPUMP definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "") - %> - -**Related Probes:** - -- @[DHWPump](#p_dhwpump) diff --git a/doc/src/records/dhwsolarcollector.md b/doc/src/records/dhwsolarcollector.md deleted file mode 100644 index 9777620d2..000000000 --- a/doc/src/records/dhwsolarcollector.md +++ /dev/null @@ -1,214 +0,0 @@ -# DHWSOLARCOLLECTOR - -Solar Collector Array. May be multiple collectors on the same DHWSOLARSYS system. All inlets come from the DHWSOLARTANK. - -Uses SRCC Ratings. - -**scArea=*float*** - -Collector area. - -<%= member_table( - units: "ft^2", - legal_range: "$>$ 0", - default: "0", - required: "Yes", - variability: "constant") %> - -**scMult** - -Number of identical collectors, default 1 - -<%= member_table( - units: "", - legal_range: "$>$ 0", - default: "1", - required: "No", - variability: "constant") %> - -**scTilt=*float*** - -Array tilt. - -<%= member_table( - units: "deg", - legal_range: "", - default: "0", - required: "Yes", - variability: "constant") %> - -**scAzm=*float*** - -Array azimuth. - -<%= member_table( - units: "deg", - legal_range: "", - default: "0", - required: "Yes", - variability: "constant") %> - -**scFRUL=*float*** - -Fit slope - -<%= member_table( - units: "Btuh/ft^2-^o^F", - legal_range: "", - default: "-0.727", - required: "No", - variability: "constant") %> - -**scFRTA=*float*** - -Fit y-intercept - -<%= member_table( - units: "*none*", - legal_range: "$>$ 0", - default: "0.758", - required: "No", - variability: "constant") %> - -**scTestMassFlow=*flaot*** - -Mass flow rate for collector loop SRCC rating. - -<%= member_table( - units: "lb/h-ft^2^", - legal_range: "x $>$ 0", - default: "14.79", - required: "No", - variability: "constant") %> - -**scKta60=*float*** - -Incident angle modifier at 60 degree, from SRCC rating. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "0.72", - required: "No", - variability: "constant") %> - -**scOprMassFlow=*float*** - -Collector loop operating mass flow rate. - -<%= member_table( - units: "lb/h-ft^2^", - legal_range: "x $>$ 0", - default: "0.0", - required: "No", - variability: "constant") %> - -**scPipingLength=*float*** - -Collector piping length. - -<%= member_table( - units: "ft", - legal_range: "x $\\geq$ 0", - default: "0.0", - required: "No", - variability: "Hourly and at the end of interval") %> - -**scPipingInsulK=*float*** - -Collector piping insulation conductivity. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "0.02167", - required: "No", - variability: "Hourly and at the end of interval") %> - -**scPipingInsulThk=*float*** - -Collector piping insulation thickness. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "1.0", - required: "No", - variability: "Hourly and at the end of interval") %> - -**scPipingExH=*float*** - -Collector piping heat transfer coefficient. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1.5", - required: "No", - variability: "Hourly and at the end of interval") %> - -**scPipingExT=*float*** - -Collector piping surround temperature. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\geq$ 32", - default: "70.0", - required: "No", - variability: "hourly") %> - -**scPumpPwr=*float*** - -<%= member_table( - units: "Btu/h", - legal_range: "x $\\ge$ 0", - default: "from *scPumpflow*", - required: "No", - variability: "constant") - %> - -**scPumpLiqHeatF=*float*** - -Fraction of scPumpPwr added to liquid stream, the remainder is discarded. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "1.0", - required: "No", - variability: "Every run") %> - -**scPumpOnDeltaT=*float*** - -Temperature difference between the tank and collector outlet where pump turns on - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "10.0", - required: "No", - variability: "constant") %> - -**scPumpOffDeltaT=*float*** - -Temperature difference between the tank and collector outlet where pump turns off - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "5.0", - required: "No", - variability: "constant") %> - -**endDHWSOLARCOLLECTOR** - -Optionally indicates the end of the DHWSOLARCOLLECTOR definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "") %> - diff --git a/doc/src/records/dhwsolarsys.md b/doc/src/records/dhwsolarsys.md deleted file mode 100644 index 28784f227..000000000 --- a/doc/src/records/dhwsolarsys.md +++ /dev/null @@ -1,146 +0,0 @@ -# DHWSOLARSYS - -Solar water heating system. - -- DHWSOLARSYS - - DHWSOLARCOLLECTOR - - DHWSOLARTANK - -May have any number of solar collectors, but only one tank. - -May have no tank for direct system? What if system has multiple primary tanks? - -**swElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWSOLARSYS electrical energy use is recorded (under end use ???). - -<%= member_table( - units: "^o^F", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**swSCFluidSpHt=*float*** - -Specific heat for the collector fluid. - -<%= member_table( - units: "Btu/lbm-^o^F", - legal_range: "x $>$ 0", - default: "0.9", - required: "No", - variability: "constant") %> - -**swSCFluidDens=*float*** - -Density for the collector fluid. - -<%= member_table( - units: "lb/ft^3^", - legal_range: "x $>$ 0", - default: "64.0", - required: "No", - variability: "constant") %> - -**swEndUse** - -End use of pump energy; defaults to "DHW". - -**swParElec=*float*** - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "hourly") - %> - -**swTankHXEff=*float*** - -Tank heat exchanger effectiveness. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ x $\\le$ 0.99", - default: "0", - required: "No", - variability: "hourly") - %> - -**swTankTHxLimit=*float*** - -Temperature limit for the tank collector. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\geq$ 0", - default: "180.0", - required: "No", - variability: "constant") %> - -**swTankUA=*float*** - -Heat transfer coefficient for the tank multiplied by area. - -<%= member_table( - units: "Btuh/^o^F", - legal_range: "", - default: "", - required: "No", - variability: "constant") %> - -**swTankVol=*float*** - -<%= member_table( - units: "gal", - legal_range: "", - default: "", - required: "No", - variability: "constant") %> - -**swTankInsulR=*float*** - -Total tank insulation resistance, built-in plus exterior wrap. - -<%= member_table( - units: "ft^2^-^o^F/Btuh", - legal_range: "", - default: "", - required: "No", - variability: "constant") %> - -**swTankZone=*znName*** - -Pointer to tank zone location, use sw_tankTEx if NULL - -<%= member_table( - units: "", - legal_range: "*Name of ZONE*", - default: "", - required: "No", - variability: "constant") %> - -**swTankTEx=*float*** - -Surrounding temperature. - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "", - required: "No", - variability: "hourly") %> - -**endDHWSOLARSYS** - -Optionally indicates the end of the DHWSOLARSYS definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "") %> - diff --git a/doc/src/records/dhwtank.md b/doc/src/records/dhwtank.md deleted file mode 100644 index 5ee16ac0f..000000000 --- a/doc/src/records/dhwtank.md +++ /dev/null @@ -1,130 +0,0 @@ -# DHWTANK - -DHWTANK constructs an object representing one or more unfired water storage tanks in a DHWSYS. DHWTANK heat losses contribute to the water heating load. - -**wtName** - -Optional name of tank; give after the word “DHWTANK” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wtMult=*integer*** - -Number of identical tanks of this type. Any value $>1$ is equivalent to repeated entry of the same DHWTANK. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -Tank heat loss is calculated hourly (note that default heat loss is 0) -- - -$$\text{qLoss} = \text{wtMult} \cdot (\text{wtUA} \cdot (\text{wtTTank} - \text{wtTEx}) + \text{wtXLoss})$$ - -**wtUA=*float*** - -Tank heat loss coefficient. - -<%= member_table( - units: "Btuh/^o^F", - legal_range: "x $\\ge$ 0", - default: "Derived from wtVol and wtInsulR", - required: "No", - variability: "constant") - %> - -**wtVol=*float*** - -Specifies tank volume. - -<%= member_table( - units: "gal", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") - %> - -**wtInsulR=*float*** - -Specifies total tank insulation resistance. The input value should represent the total resistance from the water to the surroundings, including both built-in insulation and additional exterior wrap insulation. - -<%= member_table( - units: "ft^2^-^o^F/Btuh", - legal_range: "x $\\ge$ 0.01", - default: "0", - required: "No", - variability: "constant") - %> - -**wtZone=*znName*** - -Zone location of DHWTANK regarding tank loss. The value of zero only valid if wtTEx is being used. Half of the heat losses go to zone air and the other goes to half radiant. - -<%= member_table( - units: "", - legal_range: "*Name of ZONE*", - default: "0", - required: "No", - variability: "constant") %> - -**wtTEx=*float*** - -Tank surround temperature. - -<%= member_table( - units: "^o^F", - legal_range: "x $\\ge$ 0", - default: "70", - required: "No", - variability: "hourly") - %> - -**wtTTank=*float*** - -Tank average water temperature. - -<%= member_table( - units: "^o^F", - legal_range: "$>$ 32 ^o^F", - default: "Parent DHWSYSTEM wsTUse", - required: "No", - variability: "hourly") - %> - -**wtXLoss=*float*** - -Additional tank heat loss. To duplicate CEC 2016 procedures, this value should be used to specify the fitting loss of 61.4 Btuh. - -<%= member_table( - units: "Btuh", - legal_range: "(any)", - default: "0", - required: "No", - variability: "hourly") - %> - -**endDHWTank** - -Optionally indicates the end of the DHWTANK definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[DHWTank](#p_dhwtank) diff --git a/doc/src/records/doas.md b/doc/src/records/doas.md deleted file mode 100644 index 89c16c284..000000000 --- a/doc/src/records/doas.md +++ /dev/null @@ -1,486 +0,0 @@ -# DOAS - -DOAS (Dedicated Outdoor Air System) provides centralized supply and/or exhuast ventilation air to IZXFER objects with the **izNVType** = AIRNETDOAS. The supply air may be preconditioned using heat recovery and/or tempering coils. - - -**oaName** - -Name of DOAS. - -## DOAS Supply Fan Data Members - -**oaSupFanVfDs=*float*** - -Supply fan design or rated flow at rated pressure. - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "Sum of referencing IZXFER supply flows", - required: "No", - variability: "constant") %> - -**oaSupFanPress=*float*** - -Design or rated fan pressure. - -<%= member_table( - units: "inches H~2~O", - legal_range: "*x* $>$ 0", - default: "0.3", - required: "No", - variability: "constant") %> - -Only one of oaSupFanElecPwr, oaSupFanEff, and oaSupFanShaftBhp may be given. - -**oaSupFanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - -<%= member_table( - units: "W/cfm", - legal_range: "*x* $>$ 0", - default: "derived from oaSupFanEff and oaSupFanShaftBhp", - required: "If oaSupFanEff and oaSupFanShaftBhp not present", - variability: "constant") %> - -**oaSupFanEff=*float*** - -Fan efficiency at design flow and pressure, as a fraction. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "derived from *oaSupFanShaftBhp* if given, else 0.08", - required: "No", - variability: "constant") %> - -**oaSupFanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - -<%= member_table( - units: "bhp", - legal_range: "*x* $>$ 0", - default: "derived from *oaSupFanEff*.", - required: "No", - variability: "constant") %> - -**oaSupFanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of oaSupFanVfDs; 0 $\le$ $x$ $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "*0, 1, 0, 0, 0 (linear)*", - required: "No", - variability: "constant") %> - -**oaSupFanMtr=*mtrName*** - -Name of meter, if any, to record energy used by supply fan. End use category used is specified by oaSupFanEndUse (next). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**oaSupFanEndUse=*choice*** - -End use to which fan energy is recorded (in METER specified by oaSupFanMtr). See METER for available end use choices. - -<%= member_table( - units: "", - legal_range: "*end use choice*", - default: "Fan", - required: "No", - variability: "constant") %> - -**oaTEx=*float*** - -Alternative supply fan source air dry bulb temperature. If given, oaTEx overrides the outdoor dry-bulb temperature read from the weather file or derived from design conditions. - -Caution: oaTEx is not checked for reasonableness. - -<%= member_table( - units: "^o^F", - legal_range: "", - default: "Outdoor dry-bulb", - required: "No", - variability: "subhourly") %> - -**oaWEx=*float*** - -Alternative supply fan source air air humidity ratio. If given, oaWEx overrides the outdoor humidity ratio derived from weather file data or design conditions. - -Caution: oaWEx is not checked against saturation -- there is no verification that the value provided is physically possible. - -<%= member_table( - units: "", - legal_range: "$\\gt$ 0", - default: "Outdoor humidity ratio", - required: "No", - variability: "subhourly") %> - -## DOAS Exhaust Fan Data Members - -**oaExhFanVfDs=*float*** - -Exhaust fan design or rated flow at rated pressure. - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\ge$ 0", - default: "Sum of referencing IZXFER exhaust flows", - required: "No", - variability: "constant") %> - -**oaExhFanPress=*float*** - -Design or rated fan pressure. - -<%= member_table( - units: "inches H~2~O", - legal_range: "*x* $>$ 0", - default: "0.3", - required: "No", - variability: "constant") %> - -Only one of oaExhFanElecPwr, oaExhFanEff, and oaExhFanShaftBhp may be given. - -**oaExhFanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - -<%= member_table( - units: "W/cfm", - legal_range: "*x* $>$ 0", - default: "derived from oaExhFanEff and oaExhFanShaftBhp", - required: "If oaExhFanEff and oaExhFanShaftBhp not present", - variability: "constant") %> - -**oaExhFanEff=*float*** - -Fan efficiency at design flow and pressure, as a fraction. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "derived from *oaExhFanShaftBhp* if given, else 0.08", - required: "No", - variability: "constant") %> - -**oaExhFanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - -<%= member_table( - units: "bhp", - legal_range: "*x* $>$ 0", - default: "derived from *oaExhFanEff*.", - required: "No", - variability: "constant") %> - -**oaExhFanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of oaExhFanVfDs; 0 $\le$ $x$ $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "*0, 1, 0, 0, 0 (linear)*", - required: "No", - variability: "constant") %> - -**oaExhFanMtr=*mtrName*** - -Name of meter, if any, to record energy used by exhaust fan. End use category used is specified by oaExhFanEndUse (next). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**oaExhFanEndUse=*choice*** - -End use to which fan energy is recorded (in METER specified by oaExhFanMtr). See METER for available end use choices. - -<%= member_table( - units: "", - legal_range: "*end use choice*", - default: "Fan", - required: "No", - variability: "constant") %> - -## DOAS Tempering Coils Data Members - -**oaSupTH=*float*** - -Heating setpoint for tempering and/or heat exchanger bypass. - -<%= member_table( - units: "^o^F", - default: "68", - required: "No", - variability: "subhourly") %> - -**oaEIRH=*float*** - -Energy Input Ratio of the heating coil. This is the inverse of the coil efficiency or COP. A value of zero indicates that the coil does not use energy (e.g., hot water coils). Specifying input triggers the modeling of a heating coil. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "when modeling heating coil", - variability: "subhourly") %> - -**oaCoilHMtr=*mtrName*** - -Name of meter, if any, to record energy used by the heating coil. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**oaSupTC=*float*** - -Cooling setpoint for tempering and/or heat exchanger bypass. - -<%= member_table( - units: "^o^F", - default: "68", - required: "No", - variability: "subhourly") %> - -**oaEIRC=*float*** - -Energy Input Ratio of the cooling coil. This is the inverse of the coil efficiency or COP. A value of zero indicates that the coil does not use energy (e.g., chilled water coils). Specifying input triggers the modeling of a cooling coil. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "when modeling cooling coil", - variability: "subhourly") %> - -**oaSHRtarget=*float*** - -Sensible Heat Ratio of the cooling coil. If the required sensible capacity of the coil and the entered SHR do not produce a valid psychrometric state, the SHR is adjusted and reported through the SHR probe. - -<%= member_table( - units: "", - legal_range: "*x* $\\gt$ 0", - default: "1.0", - required: "No", - variability: "subhourly") %> - -**oaCoilCMtr=*mtrName*** - -Name of meter, if any, to record energy used by the cooling coil. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**oaLoadMtr=*ldMtrName*** - -Name of load meter, if any, to record load met by the heating coil or cooling coil. - -<%= member_table( - units: "", - legal_range: "*name of a LOADMETER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - - -## DOAS Heat Recovery Data Members - -**oaHXVfDs=*float*** - -Heat exchanger design or rated flow. - -<%= member_table( - units: "cfm", - legal_range: "*x* $\\gt$ 0", - default: "Average of supply and exhaust fan design flows", - required: "No", - variability: "constant") %> - -**oaHXf2=*float*** - -Heat exchanger flow fraction (of design flow) used for second set of effectivenesses. - -<%= member_table( - units: "", - legal_range: "0 $\\lt$ *x* $\\lt$ 1.0", - default: "0.75", - required: "No", - variability: "constant") %> - -**oaHXSenEffHDs=*float*** - -Heat exchanger sensible effectiveness in heating mode at the design flow rate. Specifying input triggers modeling of heat recovery. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - required: "when modeling heat recovery", - variability: "constant") %> - -**oaHXSenEffHf2=*float*** - -Heat exchanger sensible effectiveness in heating mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffHDs=*float*** - -Heat exchanger latent effectiveness in heating mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffHf2=*float*** - -Heat exchanger latent effectiveness in heating mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXSenEffCDs=*float*** - -Heat exchanger sensible effectiveness in cooling mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXSenEffCf2=*float*** - -Heat exchanger sensible effectiveness in cooling mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffCDs=*float*** - -Heat exchanger latent effectiveness in cooling mode at the design flow rate. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXLatEffCf2=*float*** - -Heat exchanger latent effectiveness in cooling mode at the second flow rate (**oaHXf2**). - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1.0", - default: "0", - required: "No", - variability: "constant") %> - -**oaHXBypass=*choice*** - -Yes/No choice for enabling heat exchanger bypass. If selected, the outdoor air will bypass the heat exchanger when otherwise the heat exchanger would require more heating or cooling energy to meet the respective setpoints. - -<%= member_table( - units: "", - legal_range: "NO, YES", - default: "NO", - required: "No", - variability: "constant") %> - -**oaHXAuxPwr=*float*** - -Auxiliary power required to operate the heat recovery device (e.g., wheel motor, contorls). - -<%= member_table( - units: "W", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "subhourly") %> - -**oaHXAuxMtr=*mtrName*** - -Name of meter, if any, to record energy used by auxiliary components of the heat recovery system. - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") %> - -**endDOAS** - -Indicates the end of the DOAS definition. Alternatively, the end of the DOAS definition can be indicated by the declaration of another object or by "END". - -<%= member_table( - default: "*N/A*", - required: "No", - variability: "constant") %> - -**Related Probes:** - -- @[doas](#p_doas) \ No newline at end of file diff --git a/doc/src/records/ductseg.md b/doc/src/records/ductseg.md deleted file mode 100644 index d77fd47da..000000000 --- a/doc/src/records/ductseg.md +++ /dev/null @@ -1,238 +0,0 @@ -# DUCTSEG - -DUCTSEG defines a duct segment. Each RSYS has at most one return duct segment and at most one supply duct segment. That is, DUCTSEG input may be completely omitted to eliminate duct losses. - -**dsName** - -Optional name of duct segment; give after the word “DUCTSEG” if desired. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**dsTy=*choice*** - -Duct segment type. - -<%= member_table( - units: "", - legal_range: "SUPPLY, RETURN", - default: "", - required: "Yes", - variability: "constant") - %> - -The surface area of a DUCTSEG depends on its shape. 0 surface area is legal (leakage only). DUCTSEG shape is modeled either as flat or round -- - -- dsExArea specified: Flat. Interior and exterior areas are assumed to be equal (duct surfaces are flat and corner effects are neglected). -- dsExArea *not* specified: Round. Any two of dsInArea, dsDiameter, and dsLength must be given. Insulation thickness is derived from dsInsulR and dsInsulMat and this thickness is used to calculate the exterior surface area. Overall inside-to-outside conductance is also calculated including suitable adjustment for curvature. - -**dsBranchLen=*float*** - -Average branch length. - -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "-1.0", - required: "No", - variability: "constant") %> - -**dsBranchCount=*integer*** - -Number of branches. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "-1", - required: "No", - variability: "constant") %> - -**dsBranchCFA=*float*** - -Floor area served per branch - -<%= member_table( - units: "ft^2^", - legal_range: "x $>$ 0", - default: "-1.0", - required: "No", - variability: "constant") %> - -**dsAirVelDs=*float*** - -Specified air velocity design. - -<%= member_table( - units: "fpm", - legal_range: "x $>$ 0", - default: "-1.0", - required: "No", - variability: "constant") %> - -**dsExArea=*float*** - -Duct segment surface area at outside face of insulation for flat duct shape, see above. - -<%= member_table( - units: "ft^2^", - legal_range: "x $\\ge$ 0", - default: "*none*", - required: "No", - variability: "constant") - %> - -**dsInArea=*float*** - -Duct segment inside surface area (at duct wall, duct wall thickness assumed negligible) for round shaped duct. - -<%= member_table( - units: "ft^2^", - legal_range: "x $\\ge$ 0", - default: "Derived from dsDiameter and dsLength", - required: "(see above reduct shape)", - variability: "constant") - %> - - -**dsDiameter=*float*** - -Duct segment round duct diameter (duct wall thickness assumed negligible) - -<%= member_table( - units: "ft", - legal_range: "x $\\ge$ 0", - default: "Derived from dsInArea and dsLength", - required: "(see above reduct shape)", - variability: "constant") - %> - -**dsLength=*float*** - -Duct segment length. - -<%= member_table( - units: "ft", - legal_range: "x $\\ge$ 0", - default: "Derived from dsInArea and dsDiameter", - required: "(see above reduct shape)", - variability: "constant") - %> - -**dsExCnd=*choice*** - -Conditions surrounding duct segment. - -<%= member_table( - units: "", - legal_range: "ADIABATIC, AMBIENT, SPECIFIEDT, ADJZN", - default: "ADJZN", - required: "No", - variability: "constant") - %> - -**dsAdjZn=*znName*** - -Name of zone surrounding duct segment; used only when dsExCon is ADJZN. Can be the same as a zone served by the RSYS owning the duct segment. - -<%= member_table( - units: "", - legal_range: "name of a *ZONE*", - default: "*none*", - required: "Required when *dsExCon* = ADJZN", - variability: "constant") - %> - -**dsEpsLW=*float*** - -Exposed (i.e. insulation) outside surface exterior long wave (thermal) emittance. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.9", - required: "No", - variability: "constant") - %> - -**dsExT=*float*** - -Air dry-bulb temperature surrounding duct segment. - -<%= member_table( - units: "^o^F", - legal_range: "*unrestricted*", - default: "*none*", - required: "Required if *sfExCnd* = SPECIFIEDT", - variability: "hourly") - %> - -**dsInsulR=*float*** - -Insulation thermal resistance *not including* surface conductances. dsInsulR and dsInsulMat are used to calculate insulation thickness (see below). Duct insulation is modeled as a pure conductance (no mass). - -<%= member_table( - units: "ft^2^-^o^F-hr / Btu", - legal_range: "x $\\ge$ 0", - default: "0", - required: "No", - variability: "constant") - %> - -**dsInsulMat=*matName*** - -Name of insulation MATERIAL. The conductivity of this material at 70 ^o^F is combined with dsInsulR to derive the duct insulation thickness. If omitted, a typical fiberglass material is assumed having conductivity of 0.025 Btu/hr-ft^2^-F at 70 ^o^F and a conductivity coefficient of .00418 1/F (see MATERIAL). In addition, insulation conductivity is adjusted during the simulation in response its average temperature. As noted with dsInsulR, duct insulation is modeled as pure conductance -- MATERIAL matDens and matSpHt are ignored. - -<%= member_table( - units: "", - legal_range: "name of a *MATERIAL*", - default: "fiberglass", - required: "No", - variability: "constant") - %> - -**dsLeakF=*float*** - -Duct leakage. Return duct leakage is modeled as if it all occurs at the segment inlet. Supply duct leakage is modeled as if it all occurs at the outlet. - -<%= member_table( - units: "", - legal_range: "0 $<$ x $\\le$ 1", - default: "*none*", - required: "No", - variability: "constant") - %> - -**dsExH=*float*** - -Outside (exposed) surface convection coefficient. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $\\ge$ 0", - default: ".54", - required: "No", - variability: "subhourly") - %> - -**endDuctSeg** - -Optionally indicates the end of the DUCTSEG definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[ductSeg](#p_ductseg) -- @[izXfer](#p_izxfer) (generated as "\-DLkI" for supply or "\-DLkO" for return) diff --git a/doc/src/records/exportcol.md b/doc/src/records/exportcol.md deleted file mode 100644 index d9a6e0e34..000000000 --- a/doc/src/records/exportcol.md +++ /dev/null @@ -1,105 +0,0 @@ -# EXPORTCOL - -Each EXPORTCOL defines a single datum of a User Defined Table (UDT) export; EXPORTCOLs are not used with other export types. - -Use as many EXPORTCOLs as there are values to be shown in each row of the user-defined export. The values will appear in the order defined in each data row output. Be sure to include values needed to identify the data, such as the month, day, and hour, as appropriate -- these are NOT automatically supplied in user-defined exports. - -EXPORTCOL members are similar to the corresponding REPORTCOL members. See Section 5.265.1.5 for further discussion. - -**colName** - -Name of EXPORTCOL. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**colExport=*exName*** - -Name of export to which this column belongs. If the EXPORTCOL is given within an EXPORT object, then *colExport* defaults to that export. - -<%= member_table( - units: "", - legal_range: "name of an *EXPORT*", - default: "*current export, if any*", - required: "Unless in an *EXPORT*", - variability: "constant") - %> - -**colVal=*expression*** - -Value to show in this position in each row of export. - -<%= member_table( - units: "", - legal_range: "*any numeric or string expression*", - default: "*none*", - required: "Yes", - variability: "subhour /end interval") - %> - -**colHead=*string*** - -Text used for field name in export header. - -<%= member_table( - units: "", - legal_range: "", - default: "*colName* or blank", - required: "No", - variability: "constant") - %> - -**colWid=*int*** - -Maximum width. Leading and trailing spaces and non-significant zeroes are removed from export data to save file space. Specifying a *colWid* less than the default may reduce the maximum number of significant digits output. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "13", - required: "No", - variability: "constant") - %> - -**colDec=*int*** - -Number of digits after decimal point. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "*flexible format*", - required: "No", - variability: "constant") - %> - -**colJust=*choice*** - -Specifies positioning of data within column: - -<%= csv_table(< false) - Left, Left justified - Right, Right justified -END -%> - -**endExportCol** - -Optionally indicates the end of the EXPORTCOL. Alternatively, the end of the definition can be indicated by END or by beginning another object. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[exportCol](#p_exportcol) diff --git a/doc/src/records/inverse.md b/doc/src/records/inverse.md deleted file mode 100644 index 6fd39bc09..000000000 --- a/doc/src/records/inverse.md +++ /dev/null @@ -1,68 +0,0 @@ -# Inverse - -Function inverter - -**ivFREQ=*Choice*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "runly") %> - -**ivX=*float*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "constant") %> - -**ivX0=*float*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "runly") %> - -**ivY=*float*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "constant") %> - -**ivY0=*float*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "runly") %> - -**ivYTarg=*float*** - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "runly") %> - -**endInverse** - -Optionally indicates the end of the inverse definition. - -<%= member_table( - units: "", - legal_range: "", - default: "**none**", - required: "No", - variability: "") %> \ No newline at end of file diff --git a/doc/src/records/perimeter.md b/doc/src/records/perimeter.md deleted file mode 100644 index 795fd5ea8..000000000 --- a/doc/src/records/perimeter.md +++ /dev/null @@ -1,52 +0,0 @@ -# PERIMETER - -PERIMETER defines a subobject belonging to the current zone that represents a length of exposed edge of a (slab on grade) floor. - -**prName** - -Optional name of perimeter. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> - -**prLen=*float*** - -Length of exposed perimeter. - -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**prF2=*float*** - -Perimeter conduction per unit length. - -<%= member_table( - units: "Btuh/ft-^o^F", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") %> - -**endPerimeter** - -Optionally indicates the end of the perimeter definition. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> - -**Related Probes:** - -- @[perimeter](#p_perimeter) -- @[xsurf](#p_xsurf) diff --git a/doc/src/records/reportcol.md b/doc/src/records/reportcol.md deleted file mode 100644 index 95b66979d..000000000 --- a/doc/src/records/reportcol.md +++ /dev/null @@ -1,107 +0,0 @@ -# REPORTCOL - -Each REPORTCOL defines a single column of a User Defined Table (UDT) report. REPORTCOLs are not used with report types other than UDT. - -Use as many REPORTCOLs as there are values to be shown in each row of the user-defined report. The values will appear in columns, ordered from left to right in the order defined. Be sure to include any necessary values to identify the row, such as the day of month, hour of day, etc. CSE supplies *NO* columns automatically. - -**colName** - -Name of REPORTCOL. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> - -**colReport=*rpName*** - -Name of report to which current report column belongs. If REPORTCOL is given within a REPORT object, then *colReport* defaults to that report. - -<%= member_table( - units: "", - legal_range: "name of a *REPORT*", - default: "*current report, if any*", - required: "Unless in a *REPORT*", - variability: "constant") %> - -**colVal=*expression*** - -Value to show in this column of report. - -<%= member_table( - units: "", - legal_range: "*any numeric or string expression*", - default: "*none*", - required: "Yes", - variability: "subhour /end interval") %> - -**colHead=*string*** - -Text used for column head. - -<%= member_table( - units: "", - legal_range: "", - default: "*colName* or blank", - required: "No", - variability: "constant") %> - -**colGap=*int*** - -Space between (to left of) column, in character positions. Allows you to space columns unequally, to emphasize relations among columns or to improve readability. If the total of the *colGaps* and *colWids* in the report's REPORTCOLs is substantially less than the REPORT's *rpCPL* (characters per line, see REPORT), CSE will insert additional spaces between columns. To suppress these spaces, use a smaller *rpCPL* or use *rpCPL* = -1. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "1", - required: "No", - variability: "constant") %> - -**colWid=*int*** - -Column width. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "10", - required: "No", - variability: "constant") %> - -**colDec=*int*** - -Number of digits after decimal point. - -<%= member_table( - units: "", - legal_range: "*x* $\\ge$ 0", - default: "*flexible format*", - required: "No", - variability: "constant") %> - -**colJust=*choice*** - -Specifies positioning of data within column: - -<%= csv_table(< false) - Left, Left justified - Right, Right justified -END -%> - -**endReportCol** - -Optionally indicates the end of the report column definition. Alternatively, the end of the report column definition can be indicated by END or by beginning another REPORTCOL or other object. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> - -**Related Probes:** - -- @[reportCol](#p_reportcol) diff --git a/doc/src/records/shade.md b/doc/src/records/shade.md deleted file mode 100644 index 4c1482225..000000000 --- a/doc/src/records/shade.md +++ /dev/null @@ -1,175 +0,0 @@ -# SHADE - -SHADE constructs a subobject associated with the current WINDOW that represents fixed shading devices (overhangs and/or fins). A window may have at most one SHADE and only windows in vertical surfaces may have SHADEs. A SHADE can describe an overhang, a left fin, and/or a right fin; absence of any of these is specified by omitting or giving 0 for its depth. SHADE geometry can vary on a monthly basis, allowing modeling of awnings or other seasonal shading strategies. - - -**shName** - -Name of shade; follows the word "SHADE" if given. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") %> - -**ohDepth=*float*** - -Depth of overhang (from plane of window to outside edge of overhang). A zero value indicates no overhang. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**ohDistUp=*float*** - -Distance from top of window to bottom of overhang. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**ohExL=*float*** - -Distance from left edge of window (as viewed from the outside) to the left end of the overhang. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**ohExR=*float*** - -Distance from right edge of window (as viewed from the outside) to the right end of the overhang. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**ohFlap=*float*** - -Height of flap hanging down from outer edge of overhang. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**lfDepth=*float*** - -Depth of left fin from plane of window. A zero value indicates no fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**lfTopUp=*float*** - -Vertical distance from top of window to top of left fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**lfDistL=*float*** - -Distance from left edge of window to left fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**lfBotUp=*float*** - -Vertical distance from bottom of window to bottom of left fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**rfDepth=*float*** - -Depth of right fin from plane of window. A 0 value indicates no fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**rfTopUp=*float*** - -Vertical distance from top of window to top of right fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**rfDistR=*float*** - -Distance from right edge of window to right fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**rfBotUp=*float*** - -Vertical distance from bottom of window to bottom of right fin. - -<%= member_table( - units: "ft", - legal_range: "*x* $\\ge$ 0", - default: "0", - required: "No", - variability: "monthly-hourly") %> - -**endShade** - -Optional to indicate the end of the SHADE definition. Alternatively, the end of the shade definition can be indicated by END or the declaration of another object. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") %> - -**Related Probes:** - -- @[shade](#p_shade) diff --git a/doc/src/records/towerplant.md b/doc/src/records/towerplant.md deleted file mode 100644 index 08f79d0e4..000000000 --- a/doc/src/records/towerplant.md +++ /dev/null @@ -1,308 +0,0 @@ -# TOWERPLANT - -A TOWERPLANT object simulates a group of cooling towers which operate together to cool water for one or more CHILLERs and/or HPLOOP heat exchangers. There can be more than one TOWERPLANT in a simulation. Each CHILLER or hploop heat exchanger contains a pump (the "heat rejection pump") to circulate water through its associated TOWERPLANT. The circulating water is cooled by evaporation and conduction to the air; cooling is increased by operating fans in the cooling towers as necessary. These fans are the only energy consuming devices simulated in the TOWERPLANT. - -The TOWERPLANT models the leaving water temperature as a function of the entering water temperature, flow, outdoor air temperature, and humidity. The fans are operated as necessary to achieve a specified leaving water temperature setpoint, or as close to it as achievable. - -Two methods of staging the cooling tower fans in a TOWERPLANT are supported: "TOGETHER", under which all the tower fans operate together, at the same speed or cycling on and off at once, and "LEAD", in which a single "lead" tower's fan modulates for fine control of leaving water temperature, and as many additional towers fans as necessary operate at fixed speed. The water flows through all towers even when their fans are off; sometimes this will cool the water below setpoint with no fans operating. - -All the towers in a TOWERPLANT are identical, except that under LEAD staging, the towers other than the lead tower have one-speed fans. The group of towers can thus be described by giving the description of one tower, the number of towers, and the type of staging to be used. All of this information is given by TOWERPLANT members, so there is no need for individual TOWER objects. - -There is no provision for scheduling a TOWERPLANT: it operates whenever the heat rejection pump in one or more of its associated CHILLERs or HPLOOP heat exchangers operates. However, the setpoint for the water leaving the TOWERPLANT is hourly schedulable. - -**towerplantName** - -Name of TOWERPLANT object, given immediately after the word TOWERPLANT to begin the object's input. The name is used to refer to the TOWERPLANT in COOLPLANTs and HPLOOPs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant - -**tpTsSp=*float*** - -Setpoint temperature for water leaving towers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No hourly - -**tpMtr=*name of a METER*** - -METER object by which TOWERPLANT's fan input energy is to be recorded, in category "Aux". If omitted, energy use is not recorded, and thus cannot be reported. Towerplants have no modeled input energy other than for their fans (the heat rejection pumps are part of the CHILLER and HPLOOP objects). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *name of a METER* *none* No constant - -**tpStg=*choice*** - -How tower fans are staged to meet the load: - - ----------- ---------------------------------------------------------- - TOGETHER All fans operate at the same speed or cycle on and off - together. - - LEAD A single "Lead" tower's fan is modulated as required and - as many additional fans as necessary run at their (single) - full speed. - ----------- ---------------------------------------------------------- - -Whenever the heat rejection pump in a CHILLER or HPLOOP heat exchanger is on, the water flows through all towers in the TOWERPLANT, regardless of the number of fans operating. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - TOGETHER, LEAD TOGETHER No constant - -**ctN=*integer*** - -Number of towers in the TOWERPLANT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 1 No constant - -**ctType=*choice*** - -Cooling tower fan control type: ONESPEED, TWOSPEED, or VARIABLE. This applies to all towers under TOGETHER staging. For LEAD staging, *ctType* applies only to the lead tower; additional towers have ONESPEED fans. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------ ------------- -------------- ----------------- - ONESPEED, TWOSPEED, VARIABLE ONESPEED No constant - -**ctLoSpd=*float*** - -Low speed for TWOSPEED fan, as a fraction of full speed cfm. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1 0.5 No constant - -Note: full speed fan cfm is given by *ctVfDs*, below. - -The rest of the input variables apply to each tower in the group; the towers are identical except for the single-speed fan on non-lead towers when *tpStg* is LEAD. - -The following two inputs permit computation of the tower fan electrical energy consumption: - -**ctShaftBhp=*float*** - -Shaft brake horsepower of each tower fan motor. - -The default value is the sum of the rejected (condenser) heats (including pump heat) at design conditions of the most powerful stage of each connected COOLPLANT, plus the design capacity of each connected HPLOOP heat exchanger, all divided by 290,000 and by the number of cooling towers in the TOWERPLANT. - - **Units** **Lgl Range** **Default** **Req'd** **Variability** - ----------- --------------- ----------------------------- ----------- ----------------- - Bhp *x* > 0 (sum of loads)/290000/*cTn* No constant - -**ctMotEff=*float*** - -Motor (and drive, if any) efficiency for tower fans. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 .88 No constant - -The next four items specify the coefficients of polynomial curves relating fan power consumption to average speed (cfm) for the various fan types. For the non-variable speed cases CSE uses linear polynomials of the form - -$$p = a + b \cdot \text{spd}$$ - -where *p* is the power consumption as a fraction of full speed power consumption, and *spd* is the average speed as a fraction of full speed. The linear relationship reflects the fact that the fans cycle to match partial loads. A non-0 value may be given for the constant part *a* to reflect start-stop losses. For the two speed fan, separate polynomials are used for low and high speed operation; the default coefficients assume power input varies with the cube of speed, that is, at low speed (*ctLoSpd*) the relative power input is *ctLoSpd3*. For the variable speed case a cubic polynomial is used. - -For each linear polynomial, two *float* expressions are given, separated by a comma. The first expression is the constant, *a*. The second expression is the coefficient of the average speed, *b*. Except for *ctFcLo*, *a* and *b* should add up to 1, to make the relative power consumption 1 when *spd* is 1; otherwise, CSE will issue a warning message and normalize them. - -**ctFcOne=*a, b*** - -Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for ONESPEED fan. For the one-speed case, the relative average speed *spd* is the fraction of the time the fan is on. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *a + b = 1.0* 0, 1 No constant - -**ctFcLo=*a, b*** - -Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for low speed of TWOSPEED fan, when *spd* $\le$ *ctLoSpd*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------- -------------- ----------------- - *a + b = 1.0* 0, *ctLoSpd^2^* No constant - -**ctFcHi=*a, b*** - -Coefficients of linear fan power consumption polynomial $p = a + b \cdot \text{spd}$ for high speed of TWOSPEED fan, when *spd* > *ctLoSpd*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------------- -------------- ----------------- - *a + b = 1.0* *-ctLoSpd^2^ - ctLoSpd, ctLoSpd^2^ + ctLoSpd + 1* No constant - -**ctFcVar=*a, b, c, d*** - -For VARIABLE speed fan, four *float* values for coefficients of cubic fan power consumption polynomial of the form $p = a + b \cdot \text{spd} + c \cdot \text{spd}^2 + d \cdot \text{spd}^3$. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - *a + b + c + d = 1.0* 0, 0, 0, 1 No constant - -The next six items specify the tower performance under one set of conditions, the "design conditions". The conditions should be chosen to be representative of full load operating conditions. - -**ctCapDs=*float*** - -Design capacity: amount of heat extracted from water under design conditions by one tower. - -The default value is the sum of the rejected (condenser) heats (including pump heat) at design conditions of the most powerful stage of each connected COOLPLANT, plus the design capacity of each connected HPLOOP heat exchanger, all divided by the number of towers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - Btuh *x* $\neq$ 0 (sum of loads)/*ctN* No constant - -**ctVfDs=*float*** - -Design air flow, per tower; also the fan full-speed cfm specification. - -The default value is the sum of the loads (computed as for *ctCapDs*, just above) divided by 51, divided by the number of cooling towers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - cfm *x* > 0 (sum of loads)/51/*ctN* No constant - -**ctGpmDs=*float*** - -Design water flow, per tower. - -The default is the sum of the flows of the connected heat rejection pumps, using the largest stage for COOLPLANTs, divided by the number of towers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - gpm *x* > 0 (sum of pumps)/*ctN* No constant - -**ctTDbODs=*float*** - -Design outdoor drybulb temperature (needed to convert *ctVfDs* from cfm to lb/hr). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 93.5 No constant - -**ctTWbODs=*float*** - -Design outdoor wetbulb temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 78 No constant - -**ctTwoDs=*float*** - -Design leaving water temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No constant - -The following six items allow optional specification of tower performance under another set of conditions, the "off design" conditions. If given, they allow CSE to compute the tower's relation between flows and heat transfer; in this case, *ctK* (below) may not be given. - -**ctCapOd=*float*** - -Off-design capacity, per tower. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - Btuh *x* $\neq$ 0 (sum of loads)/*ctN* No constant - -**ctVfOd=*float*** - -Off-design air flow, per tower. Must differ from design air flow; thus *ctVfDs* and *ctVfOd* cannot both be defaulted if off-design conditions are being given. The off-design air and water flows must be chosen so that maOd/mwOd $\neq$ maDs/mwDs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------------- ------------------------- -------------- ----------------- - cfm *x* > 0; *x* $\neq$ *ctVfDs* (sum of loads)/51/*ctN* No constant - -**ctGpmOd=*float*** - -Off-design water flow, per tower. Must differ from design water flow; thus, both cannot be defaulted if off-design conditions are being given. Value must be chosen so that maOd/mwOd $\neq$ maDs/mwDs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------- ---------------------- -------------- ----------------- - gpm *x* > 0; *x* $\neq$ *ctGpmDs* (sum of pumps)/*ctN* No constant - -**ctTDbOOd=*float*** - -Off-design outdoor drybulb temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 93.5 No constant - -**ctTWbOOd=*float*** - -Off-design outdoor wetbulb temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 78 No constant - -**ctTwoOd=*float*** - -Off-design leaving water temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No constant - -The following item allows explicit specification of the relationship between flows and heat transfer, when the preceding "off design" inputs are not given. If omitted, it will be computed from the "off design" inputs if given, else the default value of 0.4 will be used. - -**ctK=*float*** - -Optional. Exponent in the formula - -$$\text{ntuA} = k \cdot (mwi/ma)^{ctK}$$ - -where ntuA is the number of transfer units on the air side, mwi and ma are the water and air flows respectively, and k is a constant. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------------------------------- -------------- ----------------- - 0 < *x* < 1 *from "Od" members if given, else* 0.4 No constant - -**ctStkFlFr=*float*** - -Fraction of air flow which occurs when tower fan is off, due to stack effect (convection). Cooling due to this air flow occurs in all towers whenever the water flow is on, and may, by itself, cool the water below the setpoint *tpTsSp*. Additional flow, when fan is on, is proportional to fan speed. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .18 No constant - -The following items allow CSE to compute the effect of makeup water on the leaving water temperature. - -**ctBldn=*float*** - -Blowdown rate: fraction of inflowing water that is bled from the sump down the drain, to reduce the buildup of impurities that don't evaporate. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .01 No constant - -**ctDrft=*float*** - -Drift rate: fraction of inflowing water that is blown out of tower as droplets without evaporating. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0 No constant - -**ctTWm=*float*** - -Temperature of makeup water from mains, used to replace water lost by blowdown, drift, and evaporation. Blowdown and drift are given by the preceding two inputs; evaporation is computed. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 60 No constant - -**endTowerplant** - -Optionally indicates the end of the TOWERPLANT definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - -**Related Probes:** - -- @[towerPlant](#p_towerplant) diff --git a/doc/src/records/window.md b/doc/src/records/window.md deleted file mode 100644 index 38b1e9871..000000000 --- a/doc/src/records/window.md +++ /dev/null @@ -1,409 +0,0 @@ -# WINDOW - -WINDOW defines a subobject belonging to the current SURFACE that represents one or more identical windows. The azimuth, tilt, and exterior conditions of the window are the same as those of the surface to which it belongs. The total window area (*wnHt* $\cdot$ *wnWid* $\cdot$ *wnMult*) is deducted from the gross surface area. A surface may have any number of windows. - -Windows may optionally have operable interior shading that reduces the overall shading coefficient when closed. - -**wnName** - -Name of window: follows the word "WINDOW" if given. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wnHeight=*float*** - -Overall height of window (including frame). - -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**wnWidth=*float*** - -Overall width of window (including frame). - -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**wnArea=*float*** - -Overall area of window (including frame). - -<%= member_table( - units: "ft^2^", - legal_range: "x $>$ 0", - default: "*wnHeight* \* *wnWidth*", - required: "No", - variability: "constant") - %> - -**wnMult=*float*** - -Area multiplier; can be used to represent multiple identical windows. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**wnModel=*choice*** - -Selects window model - -<%= member_table( - units: "", - legal_range: "SHGC, ASHWAT", - default: "SHGC", - required: "No", - variability: "constant") - %> - -**wnGt=*choice*** - -GLAZETYPE for window. Provides many defaults for window properties as cited below. - -**wnU=*float*** - -Window conductance (U-factor without surface films, therefore not actually a U-factor but a C-factor). - -Preferred Approach: To use accurately with standard winter rated U-factor from ASHRAE or NFRC enter as: - - wnU = (1/((1/U-factor)-0.85) - -Where 0.85 is the sum of the interior (0.68) and exterior (0.17) design air film resistances assumed for rating window U-factors. Enter wnInH (usually 1.5=1/0.68) instead of letting it default. Enter the wnExH or let it default. It is important to use this approach if the input includes gnFrad for any gain term. Using approach 2 below will result in an inappropriate internal gain split at the window. - -Approach 2. Enter wnU=U-factor and let the wnInH and wnExH default. Tnormally this approach systematically underestimates the window U-factor because it adds the wnExfilm resistance to 1/U-factor thereby double counting the exterior film resistance. This approach will also yield incorrect results for gnFrad internal gain since the high wnInH will put almost all the gain back in the space. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**wnUNFRC=*float*** - -Fenestration system (including frame) U-factor evaluated at NFRC heating conditions. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "gtUNFRC", - required: "Required when *wnModel* = ASHWAT", - variability: "constant") - %> - -**wnExEpsLW=*float*** - -Window exterior long wave (thermal) emittance. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.84", - required: "No", - variability: "constant") - %> - -**wnInEpsLW=*float*** - -Window interior long wave (thermal) emittance. - -<%= member_table( - units: "", - legal_range: "0 $\\le$ *x* $\\le$ 1", - default: "0.84", - required: "No", - variability: "constant") - %> - -**wnInH=*float*** - -Window interior surface (air film) conductance. - -Preferred Approach: Enter the appropriate value for each window, normally: - - wnInH = 1.5 - - where 1.5 = 1/0.68 the standard ASHRAE value. - -The large default value of 10,000 represents a near-0 resistance, for the convenience of those who wish to include the interior surface film in wnU according to approach 2 above. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "10000", - required: "No", - variability: "constant") - %> - -**wnExH=*float*** - -Window exterior surface (air film) conductance. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "x $>$ 0", - default: "same as owning surface", - required: "No", - variability: "constant") - %> - -Several models are available for calculating inside and outside surface convective coefficients. Inside surface faces can be exposed only to zone conditions. Outside faces may be exposed either to ambient conditions or zone conditions, based on wnExCnd. Only UNIFIED and INPUT are typically used. The other models were used during CSE development for comparison. For details, see CSE Engineering Documentation. - -<%= csv_table(< true) -Model, Exposed to ambient, Exposed to zone -UNIFIED, default CSE model, default CSE model -INPUT , hc = wnExHcMult, hc = wnxxHcMult -AKBARI , Akbari model, n/a -WALTON , Walton model, n/a -WINKELMANN, Winkelmann model, n/a -MILLS , n/a , Mills model -ASHRAE , n/a , ASHRAE handbook values -END -%> - -**wnExHcModel=*choice*** - -Selects the model used for exterior surface convection. - -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "UNIFIED", - required: "No", - variability: "constant") - %> - -**wnExHcLChar=*float*** - -Characteristic length of surface, used in derivation of forced exterior convection coefficients in some models when outside face is exposed to ambient (i.e. to wind). - -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "10", - required: "No", - variability: "constant") - %> - -**wnExHcMult=*float*** - -Exterior convection coefficient adjustment factor. When wnExHcModel=INPUT, hc=wnExHcMult. For other wnExHcModel choices, the model-derived hc is multiplied by wnExHcMult. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "subhourly") - %> - -**wnInHcModel=*choice*** - -Selects the model used for the inside (zone) surface convection when wnModel = Forward\_Difference. - -<%= member_table( - units: "", - legal_range: "*choices above (see wnExHcModel)*", - default: "UNIFIED", - required: "No", - variability: "constant") - %> - -**wnInHcMult=*float*** - -Interior convection coefficient adjustment factor. When wnInHcModel=INPUT, hc=wnInHcMult. For other wnInHcModel choices, the model-derived hc is multiplied by wnInHcMult. - -<%= member_table( - units: "", - legal_range: "x $\\ge$ 0", - default: "1", - required: "No", - variability: "subhourly") - %> - -**wnInHcFrcCoeffs=*float array*** - -Specifies 3 coefficients for an alternative inside surface forced convection model (applicable only for wnInHCModel=UNIFIED). When given, the inside surface forced convection coefficient for this surface is derived as follows: - - hcFrc = hConvF * (wnInHcFrcCoeffs[ 1] + wnInHcFrcCoeffs[ 2] * ACH ^ wnInHcFrcCoeffs[ 3]) - -where hConvF is the convection adjustment factor (derived from elevation, see Top hConvMod) and ACH is the zone air change rate per hour from the prior simulation step (including heat pump water heater evaporator air flow). This formulation is dangerously flexible, so caution is advised when selecting coefficient values. - -The default hcFrc value (used when wnInHcFrCoeff is not provided) is hConvF * znHcFrcF * ACH ^ 0.8. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: "", - default: "*inherited from parent surface*", - required: "No", - variability: "subhourly") %> - -**wnSHGC=*float*** - -Rated Solar Heat Gain Coefficient (SHGC) for the window assembly. - -<%= member_table( - units: "fraction", - legal_range: "0 < x < 1", - default: "gtSHGC", - required: "No", - variability: "constant") - %> - -**wnFMult=*float*** - -Frame area multiplier = areaGlaze / areaAssembly - -<%= member_table( - units: "fraction", - legal_range: "0 < x < 1", - default: "gtFMult or 1", - required: "No", - variability: "constant") - %> - -**wnSMSO=*float*** - -SHGC multiplier with shades open. Overrides gtSMSO. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "gtSMSO or 1", - required: "No", - variability: "Monthly - Hourly") - %> - -**wnSMSC=*float*** - -SHGC multiplier with shades closed. Overrides gtSMSC - -<%= member_table( - units: "fraction", - legal_range: "0 $\leq$ *x* $\leq$ 1", - default: "wnSMSO or gtSMSC", - required: "No", - variability: "Monthly - Hourly") - %> - -**wnNGlz=*int*** - -Number of glazings in the window (bare glass only, not including any interior or exterior shades). - -<%= member_table( - units: "", - legal_range: "0 $<$ *x* $\leq$ 4", - default: "gtNGLZ", - required: "Required when *wnModel* = ASHWAT", - variability: "constant") - %> - -**wnExShd=*choice*** - -Exterior shading type (ASHWAT only). - -<%= member_table( - units: "", - legal_range: "NONE, INSCRN", - default: "gtExShd", - required: "No", - variability: "constant") - %> - -**wnInShd=*choice*** - -Interior shade type (ASHWAT only). - -<%= member_table( - units: "", - legal_range: "NONE, DRAPEMED", - default: "gtInShd", - required: "No", - variability: "constant") - %> - -**wnDirtLoss=*float*** - -Glazing dirt loss factor. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "*none*", - required: "No", - variability: "constant") - %> - -**wnGrndRefl=*float*** - -Ground reflectivity for this window. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "sfGrndRefl", - required: "No", - variability: "Monthly - Hourly") - %> - -**wnVfSkyDf=*float*** - -View factor from this window to sky for diffuse radiation. For the shading effects of an overhang, a wnVfSkyDf value smaller than the default would be used - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ x $\\leq$ 1", - default: "0.5 - 0.5 cos(tilt) = .5 for vertical surface", - required: "No", - variability: "Monthly - Hourly") - %> - -**wnVfGrndDf=*float*** - -View factor from this window to ground for diffuse radiation. For the shading effects of a fin(s), both wnVfSkyDf and wnVfGrndDf would be used. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ x $\\leq$ 1", - default: "0.5 + 0.5 .5 for vertical surface", - required: "No", - variability: "Monthly - Hourly") - %> - -**endWINDOW** - -Optionally indicates the end of the window definition. Alternatively, the end of the window definition can be indicated by END or the declaration of another object. END or endWindow, if used, should follow any subobjects of the window (SHADEs and/or SGDISTs). - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[window](#p_window) -- @[xsurf](#p_xsurf) diff --git a/doc/src/records/zone.md b/doc/src/records/zone.md deleted file mode 100644 index 96381beff..000000000 --- a/doc/src/records/zone.md +++ /dev/null @@ -1,531 +0,0 @@ -# ZONE - -ZONE constructs an object of class ZONE, which describes an area of the building to be modeled as having a uniform condition. ZONEs are large, complex objects and can have many subobjects that describe associated surfaces, shading devices, HVAC equipment, etc. - -## ZONE General Members - -**znName** - -Name of zone. Enter after the word ZONE; no "=" is used. - -<%= member_table( - units: "", - legal_range: "*63 characters*", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**znModel=*choice*** - -Selects model for zone. - -<%= csv_table(< false) -CNE, Older central difference model based on original CALPAS methods. Not fully supported and not suitable for current compliance applications. -CZM, Conditioned zone model. Forward-difference, short time step methods are used. -UZM, Unconditioned zone model. Identical to CZM except heating and cooling are not supported. Typically used for attics, garages, and other ancillary spaces. -END -%> - -<%= member_table( - units: "", - legal_range: "*choices above*", - default: "CNE", - required: "No", - variability: "constant") - %> - -**znArea=*float*** - -Nominal zone floor area. - -<%= member_table( - units: "ft^2^", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**znVol=*float*** - -Nominal zone volume. - -<%= member_table( - units: "ft^3^", - legal_range: "*x* $>$ 0", - default: "*none*", - required: "Yes", - variability: "constant") - %> - -**znAzm=*float*** - -Zone azimuth with respect to bldgAzm. All surface azimuths are relative to znAzm, so that the zone can be rotated by changing this member only. Values outside the range 0^o^ to 360^o^ are normalized to that range. - -<%= member_table( - units: "degrees", - legal_range: "unrestricted", - default: "0", - required: "No", - variability: "constant") - %> - -**znFloorZ=*float*** - -Nominal zone floor height relative to arbitrary 0 level. Used re determination of vent heights - -<%= member_table( - units: "ft", - legal_range: "unrestricted", - default: "0", - required: "No", - variability: "constant") - %> - -**znCeilingHt=*float*** - -Nominal zone ceiling height relative to zone floor (typically 8 – 10 ft). - -<%= member_table( - units: "ft", - legal_range: "*x* $>$ 0", - default: "*znVol* / *znArea*", - required: "No", - variability: "constant") - %> - -**znEaveZ=*float*** - -Nominal eave height above ground level. Used re calculation of local surface wind speed. This in turn influences outside convection coefficients in some surface models and wind-driven air leakage. - -<%= member_table( - units: "ft", - legal_range: "x $>$ 0", - default: "*znFloorZ + infStories\*8*", - required: "No", - variability: "constant") - %> - -**znCAir=*float*** - -Zone "air" heat capacity: represents heat capacity of air, furniture, "light" walls, and everything in zone except surfaces having heat capacity (that is, non-QUICK surfaces). - -<%= member_table( - units: "Btu/^o^F", - legal_range: "x $\\geq$ 0", - default: "3.5 \* *znArea*", - required: "No", - variability: "constant") - %> - -**znHcAirX=*float*** - -Zone air exchange rate used in determination of interior surface convective coefficients. This item is generally used only for model testing. - -<%= member_table( - units: "ACH", - legal_range: "x $>$ 0", - default: "as modeled", - required: "No", - variability: "subhourly") - %> - -**znHcFrcF=*float*** - -Zone surface forced convection factor. Default interior surface convective transfer is modeled as a combination of forced and natural convection. hcFrc = znHcFrcF * ACH^.8, where ACH = znHcAirX + heat pump water heater evaporator air exchange rate See CSE Engineering Documentation. - -<%= member_table( - units: "Btuh/ft^2^-^o^F", - legal_range: ".2", - default: ".2", - required: "No", - variability: "hourly") - %> - -**znHIRatio=*float*** - -Zone hygric inertia ratio. In zone moisture balance calculations, the effective dry-air mass = znHIRatio * (zone dry air mass). This enhancement can be used to represente the moisture storage capacity of zone surfaces and contents. - -<%= member_table( - units: "", - legal_range: "x $>$ 0", - default: "1", - required: "No", - variability: "constant") - %> - -**znSC=*float*** - -Zone shade closure. Determines insolation through windows (see WINDOW members *wnSCSO* and *wnSCSC*) and solar gain distribution: see SGDIST members *sgFSO* and *sgFSC*. 0 represents shades open; 1 represents shades closed; intermediate values are allowed. An hourly variable CSE expression may be used to schedule shade closure as a function of weather, time of year, previous interval HVAC use or zone temperature, etc. - -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "1 when cooling was used in *previous* hour, else 0", - required: "No", - variability: "hourly") - %> - -**znTH=*float*** - -Heating set point used (and required) when znModel=CZM and zone has no terminals. - -<%= member_table( - units: "^o^F", - legal_range: "0 < znTH < znTC", - default: "*none*", - required: "Per above", - variability: "subhourly") - %> - -**znTD=*float*** - -Desired set point (temperature maintained with ventilation if possible) for znModel=CZM. Must be specified when zone ventilation is active. - -<%= member_table( - units: "^o^F", - legal_range: "x > 0; znTH < znTD < znTC", - default: "*none*", - required: "if venting", - variability: "subhourly") - %> - -**znTC=*float*** - -Cooling set point used (and required) when znModel=CZM and zone has no terminals. - -<%= member_table( - units: "^o^F", - legal_range: "0 < znTC > znTH", - default: "*none*", - required: "Per above", - variability: "subhourly") - %> - -znModel = CZM zone heating and cooling is provided either via an RSYS HVAC system, by "magic" heat transfers specified by znQxxx items, or via TERMINAL (s). One of these must be defined. - -**znRSys=*rsysName*** - -Name of RSYS providing heating, cooling, and optional central fan integrated ventilation to this zone. - -<%= member_table( - units: "", - legal_range: "*RSYS name*", - default: "(no RSYS)", - required: "No", - variability: "constant") - %> - -**znQMxH=*float*** - -Heating capacity at current conditions - -<%= member_table( - units: "Btuh", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "hourly") - %> - -**znQMxHRated=*float*** - -Rated heating capacity - -<%= member_table( - units: "Btuh", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "constant") - %> - -**znQMxC=*float*** - -Cooling capacity at current conditions - -<%= member_table( - units: "Btuh", - legal_range: "x $\\leq$ 0", - default: "*none*", - required: "No", - variability: "hourly") - %> - -**znQMxCRated=*float*** - -Rated cooling capacity - -<%= member_table( - units: "Btuh", - legal_range: "x $\\leq$ 0", - default: "*none*", - required: "No", - variability: "constant") - %> - -<% if comfort_model %> -The following provide parameters for comfort calculations - -**znComfClo=*float*** - -Occupant clothing resistance, used only when a comfort model is enabled. - -<%= member_table( - units: "clo", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "subhourly") - %> - -**znComfMet=*float*** - -Occupant metabolic rate, used only when a comfort model is enabled. - -<%= member_table( - units: "met", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "hourly") - %> - -**znComfAirV=*float*** - -Nominal air velocity used for comfort model, used only when a comfort model is enabled. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "*none*", - required: "No", - variability: "Hourly") - %> - -**znComfRh=*float*** - -Nominal zone relative humidity used for comfort model, used only when a comfort model is enabled. - -<%= member_table( - units: "", - legal_range: "0 $\\leq$ *x* $\\leq$ 1", - default: "*none*", - required: "No", - variability: "hourly") - %> - -<% end %> - -## ZONE Infiltration - -The following control a simplified air change plus leakage area model. The Sherman-Grimsrud model is used to derive air flow rate from leakage area and this rate is added to the air changes specified with infAC. Note that TOP.windF does *not* modify calculated infiltration rates, since the Sherman-Grimsrud model uses its own modifiers. See also AirNet models available via IZXFER. - -**infAC=*float*** - -Zone infiltration air changes per hour. - -<%= member_table( - units: "1/hr", - legal_range: "x $\\geq$ 0", - default: "0.5", - required: "No", - variability: "hourly") - %> - -**infELA=*float*** - -Zone effective leakage area (ELA). - -<%= member_table( - units: "in^2^", - legal_range: "x $\\geq$ 0", - default: "0.0", - required: "No", - variability: "hourly") - %> - -**infShld=*int*** - -Zone local shielding class, used in derivation of local wind speed for ELA infiltration model, wind-driven AirNet leakage, and exterior surface coefficients. infShld values are -- - -<%= csv_table(< false) - 1, no obstructions or local shielding - 2, light local shielding with few obstructions - 3, moderate local shielding, some obstructions within two house heights - 4, heavy shielding, obstructions around most of the perimeter - 5, very heavy shielding, large obstructions surrounding the perimeter within two house heights -END -%> - -<%= member_table( - units: "", - legal_range: "1 $\\leq$ *x* $\\leq$ 5", - default: "3", - required: "No", - variability: "constant") - %> - -**infStories=*int*** - -Number of stories in zone, used in ELA model. - -<%= member_table( - units: "", - legal_range: "1 $\\leq$ *x* $\\leq$ 3", - default: "1", - required: "No", - variability: "constant") - %> - -**znWindFLkg=*float*** - -Wind speed modifier factor. The weather file wind speed is multiplied by this factor to yield a local wind speed for use in infiltration and convection models. - -<%= member_table( - units: "", - legal_range: "x $\\geq$ 0", - default: "derived from znEaveZ and infShld", - required: "No", - variability: "constant") - %> - -**znAFMtr=*afMtrName*** - -Name of an AFMETER object, if any, to which zone AirNet air flows are recorded. *ZnAFMtr* defines a pressure boundary for accounting purposes. Multiple zones having the same AFMETER are treated as a single volume -- interzone flows within that volume are not recorded. For example, to obtain "building total" flow data, a common AFMETER could be assigned to several conditioned zones but not to adjacent unconditioned zones such as attic spaces. - -<%= member_table( - units: "", - legal_range: "*name of an AFMETER*", - default: "*not recorded*", - required: "No", - variability: "constant") - %> - -**znLoadMtr=*ldMtrName*** - -Name of a LOADMETER object, if any, to which zone heating and cooling loads are recorded. - -<%= member_table( - units: "", - legal_range: "*name of a LOADMETER*", - default: "*not recorded*", - required: "No", - variability: "constant") - %> - -## ZONE Exhaust Fan - -Presence of an exhaust fan in a zone is indicated by specifying a non-zero design flow value (xfanVfDs). - -Zone exhaust fan model implementation is incomplete as of July, 2011. The current code calculates energy use but does not account for the effects of air transfer on room heat balance. IZXFER provides a more complete implementation. - -**xfanFOn=*float*** - -Exhaust fan on fraction. On/off control assumed, so electricity requirement is proportional to run time. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ x $\\leq$ 1", - default: "1", - required: "No", - variability: "hourly") - %> - -Example: The following would run an exhaust fan 70% of the time between 8 AM and 5 PM: - - xfanFOn = select( (\$hour >= 7 && \$hour < 5), .7, - default, 0 ); - - -**xfanVfDs=*float*** - -Exhaust fan design flow; 0 or not given indicates no fan. - -<%= member_table( - units: "cfm", - legal_range: "x $\\geq$ 0", - default: "0, no fan", - required: "If fan present", - variability: "constant") - %> - -**xfanPress=*float*** - -Exhaust fan external static pressure. - -<%= member_table( - units: "inches", - legal_range: "0.05 $\\leq$ *x* $\\leq$ 1.0", - default: "0.3", - required: "No", - variability: "constant") - %> - -Only one of xfanElecPwr, xfanEff, and xfanShaftBhp may be given: together with xfanVfDs and xfanPress, any one is sufficient for CSE to detemine the others and to compute the fan heat contribution to the air stream. - -**xfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - -<%= member_table( - units: "W/cfm", - legal_range: "x $>$ 0", - default: "derived from xfanEff", - required: "If xfanEff and xfanShaftBhp not present", - variability: "constant") - %> - -**xfanEff=*float*** - -Exhaust fan/motor/drive combined efficiency. - -<%= member_table( - units: "fraction", - legal_range: "0 $\\leq$ x $\\leq$ 1", - default: "0.08", - required: "No", - variability: "constant") - %> - -**xfanShaftBhp=*float*** - -Fan shaft power at design flow and pressure. - -<%= member_table( - units: "BHP", - legal_range: "x $>$ 0", - default: "derived from xfanElecPwr and xfanVfDs", - required: "If xfanElecPwr not present", - variability: "constant") - %> - -**xfanMtr=*mtrName*** - -Name of METER object, if any, by which fan's energy use is recorded (under end use category "fan"). - -<%= member_table( - units: "", - legal_range: "*name of a METER*", - default: "*not recorded*", - required: "No", - variability: "constant") - %> - -**endZone** - -Indicates the end of the zone definition. Alternatively, the end of the zone definition can be indicated by the declaration of another object or by "END". If END or endZone is used, it should follow the definitions of the ZONE's subobjects such as GAINs, SURFACEs, TERMINALs, etc. - -<%= member_table( - units: "", - legal_range: "", - default: "*none*", - required: "No", - variability: "constant") - %> - -**Related Probes:** - -- @[zone](#p_zone) -- @[znRes](#p_znres) (accumulated results) diff --git a/doc/src/tables/input-data--member-table-definition.csv b/doc/src/tables/input-data--member-table-definition.csv deleted file mode 100644 index 63ee491ee..000000000 --- a/doc/src/tables/input-data--member-table-definition.csv +++ /dev/null @@ -1,6 +0,0 @@ -"*Units*","units of measure (lb., ft, Btu, etc.) where applicable" -"*Legal*","limits of valid range for numeric inputs; valid choices" -"*Range*","for *choice* members, etc." -"*Default*","value assumed if member not given; applicable only if not required" -"*Required*","YES if you must give this member" -"*Variability*","how often the given expression can change: hourly, daily, etc. See sections on [expressions](#expressions-overview), [statements](#member-statements), and [variation frequencies](#variation-frequencies-revisited)" diff --git a/doc/src/web-page.yaml b/doc/src/web-page.yaml deleted file mode 100644 index 81287ffaf..000000000 --- a/doc/src/web-page.yaml +++ /dev/null @@ -1,19 +0,0 @@ -description: "CSE Website" -tag: "website" -metadata: - title: "California Simulation Engine" -url-multipage: ~ -url-singlepage: ~ -url-pdf: ~ -media-dir: ~ -cross-link?: false -build-singlepage-html?: false -build-multipage-html?: true -build-pdf?: false -html-template: "../config/template/site-template.html" -build-table-of-contents?: false -html-navigation?: false -css-files: - - "/css/base.css" -sections: - - [1, "index.md"] diff --git a/doc/test/coverage_check_test.rb b/doc/test/coverage_check_test.rb deleted file mode 100644 index 098d13993..000000000 --- a/doc/test/coverage_check_test.rb +++ /dev/null @@ -1,528 +0,0 @@ -require_relative 'test_helper' -require 'coverage_check' -require 'set' - -class CoverageCheckTest < TC - include CoverageCheck - def setup - @coolplant_path = File.expand_path('../resources/coolplant.md', __FILE__) - @airhandler_path = File.expand_path('../resources/airhandler.md', __FILE__) - @cullist_path = File.expand_path('../resources/cullist-snippet.txt', __FILE__) - @cullist_full_path = File.expand_path('../resources/cullist.txt', __FILE__) - @all_records_path = Dir[File.expand_path('../resources/*.md', __FILE__)] - end - def test_MdHead - line = "3" - expected = nil - actual = MdHeader[line] - assert_nil(actual) - # - line = "# A Header" - expected = "A Header" - actual = MdHeader[line] - assert_equal(expected, actual) - end - def test_DataItemHeader - line = "3" - expected = nil - actual = DataItemHeader[line] - assert_nil(actual) - # - line = "**sfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$**" - expected = "sfanCurvePy" - actual = DataItemHeader[line] - assert_equal(expected, actual) - # - line = " **Units** **Legal Range** **Default** **Required** **Variability**" - expected = nil - actual = DataItemHeader[line] - assert_nil(actual) - # - line = "**ahTsSp=*float or choice***" - expected = "ahTsSp" - actual = DataItemHeader[line] - assert_equal(expected, actual) - # - line = "*AhTsRaMn* and *ahTsRaMx* are used when *ahTsSp* is RA." - expected = nil - actual = DataItemHeader[line] - assert_nil(actual) - end - def test_DataItemHeader_parses_grouped_items - # see https://github.com/cse-sim/cse/issues/65 - # and https://github.com/cse-sim/cse/issues/81 - items = [ - ["**wsFaucetCount=*integer***\\", "wsFaucetCount"], - ["**wsShowerCount=*integer***\\", "wsShowerCount"], - ["**wsBathCount=*integer***\\", "wsBathCount"], - # introduce whitespace at the end of the line; should still work - ["**wsCWashrCount=*integer***\\ ", "wsCWashrCount"], - ["**wsDWashrCount=*integer***", "wsDWashrCount"]] - items.each do |item| - line, expected = item - actual = DataItemHeader[line] - assert_equal(expected, actual) - end - end - def test_ParseRecordDocument - content = File.read(@coolplant_path) - expected = { - "COOLPLANT" => Set.new([ - "coolplantName", - "cpSched", - "cpTsSp", - "cpPipeLossF", - "cpTowerplant", - "cpStage1", - "cpStage2 through cpStage7 same", - "endCoolplant", - ]) - } - actual = ParseRecordDocument[content] - assert_equal(expected, actual) - end - def test_ReadRecordDocument - expected = { - "COOLPLANT" => Set.new([ - "coolplantName", - "cpSched", - "cpTsSp", - "cpPipeLossF", - "cpTowerplant", - "cpStage1", - "cpStage2 through cpStage7 same", - "endCoolplant", - ]) - } - actual = ReadRecordDocument[@coolplant_path] - assert_equal(expected, actual) - end - def test_ReadAllRecordDocuments - actual = ReadAllRecordDocuments[[@airhandler_path, @coolplant_path]] - expected = { - "AIRHANDLER" => Set.new([ - "ahName", - "ahSched" - ]), - "AIRHANDLER Supply Air Temperature Controller" => Set.new([ - "ahTsSp", - "ahFanCycles", - "ahTsMn", - "ahTsMx", - "ahWzCzns", - "ahCzCzns", - "ahCtu", - "ahTsRaMx", - "ahTsRaMx", - ]), - "AIRHANDLER Supply fan" => Set.new([ - "sfanType", - "sfanVfDs", - "sfanVfMxF", - "sfanPress", - "sfanElecPwr", - "sfanEff", - "sfanShaftBhp", - "sfanCurvePy", - "sfanMotEff", - "sfanMotPos", - "sfanMtr", - ]), - "AIRHANDLER Return/Relief fan" => Set.new([ - "rfanType", - "rfanVfDs", - "rfanVfMxF", - "rfanPress", - "rfanElecPwr", - "rfanEff", - "rfanShaftBhp", - "rfanCurvePy", - "rfanMotEff", - "rfanMotPos", - "rfanMtr", - ]), - "AIRHANDLER Heating coil/Modeling Furnaces" => Set.new([ - "ahhcType", - "ahhcSched", - "ahhcCapTRat", - "ahhcMtr", - "ahhcHeatplant", - "ahhcEirR", - "ahhcEffR", - "ahhcPyEi", - "ahhcStackEffect", - "ahpCap17", - "ahpCap35", - "ahpCap47", - "ahpFd35Df", - "ahpCapIa", - "ahpSupRh", - "ahpTFrMn", - "ahpTFrMx", - "ahpTFrPk", - "ahpDfrFMn", - "ahpDfrFMx", - "ahpDfrCap", - "ahpDfrRh", - "ahpTOff", - "ahpTOn", - "ahpIn17", - "ahpIn47", - "ahpInIa", - "ahpCd", - "ahhcAuxOn", - "ahhcAuxOff", - "ahhcAuxFullOff", - "ahhcAuxOnAtAll", - "ahhcAuxOnMtr", - "ahhcAuxOffMtr", - "ahhcAuxFullOffMtr", - "ahhcAuxOnAtAllMtr", - ]), - "AIRHANDLER Cooling coil" => Set.new([ - "ahccType", - "ahccSched", - "ahccCapTRat", - "ahccCapSRat", - "ahccMtr", - "ahccMinTEvap", - "ahccK1", - "ahccBypass", - "ahccEirR", - "ahccMinUnldPlr", - "ahccMinFsldPlr", - "pydxCaptT", - "pydxCaptF", - "pydxEirT", - "pydxEirUl", - "ahccCoolplant", - "ahccGpmDs", - "ahccNtuoDs", - "ahccNtuiDs", - "ahccDsTDbEn", - "ahccDsTWbEn", - "ahccDsTDbCnd", - "ahccVfR", - "ahccAuxOn", - "ahccAuxOff", - "ahccAuxFullOff", - "ahccAuxOnAtAll", - "ahccAuxOnMtr", - "ahccAuxOffMtr", - "ahccAuxFullOffMtr", - "ahccAuxOnAtAllMtr", - ]), - "AIRHANDLER Outside Air" => Set.new([ - "oaMnCtrl", - "oaVfDsMn", - "oaMnFrac", - "oaEcoType", - "oaLimT", - "oaLimE", - "oaOaLeak", - "oaRaLeak", - ]), - "AIRHANDLER Leaks and Losses" => Set.new([ - "ahSOLeak", - "ahROLeak", - "ahSOLoss", - "ahROLoss", - ]), - "AIRHANDLER Crankcase Heater" => Set.new([ - "cchCM", - "cchPMx", - "cchPMn", - "cchTMx", - "cchTMn", - "cchDT", - "cchTOn", - "cchTOff", - "cchMtr", - "endAirHandler", - ]), - "COOLPLANT" => Set.new([ - "coolplantName", - "cpSched", - "cpTsSp", - "cpPipeLossF", - "cpTowerplant", - "cpStage1", - "cpStage2 through cpStage7 same", - "endCoolplant", - ]) - } - expected.keys.each do |k| - assert(actual.include?(k), "actual doesn't include #{k}") - assert_equal(expected[k], actual[k]) - end - actual.keys.each do |k| - assert(expected.include?(k), "expected doesn't include #{k}") - assert_equal(expected[k], actual[k]) - end - assert_equal(expected, actual) - end - def test_ParseCulList - content = File.read(@cullist_path) - expected = { - "Top" => Set.new(["doAutoSize", "doMainSim"]), - "material" => Set.new(["matThk", "matCond"]) - } - actual = ParseCulList[content] - assert_equal(expected, actual) - end - def test_ReadCulList - expected = { - "Top" => Set.new(["doAutoSize", "doMainSim"]), - "material" => Set.new(["matThk", "matCond"]) - } - actual = ReadCulList[@cullist_path] - assert_equal(expected, actual) - end - def test_SetDifferences - # - s1 = Set.new(["A", "B", "C"]) - s2 = Set.new(["B", "C", "D"]) - actual = SetDifferences[s1, s2, false] - expected = { - :in_1st_not_2nd => Set.new(["A"]), - :in_2nd_not_1st => Set.new(["D"]) - } - assert_equal(expected, actual) - # - s1 = Set.new(["1","2","3"]) - s2 = Set.new(["1","2","3"]) - actual = SetDifferences[s1, s2, false] - expected = nil - assert_nil(actual) - # - s1 = Set.new(["A","B","C"]) - s2 = Set.new(["a","b","c"]) - actual = SetDifferences[s1, s2, false] - expected = nil - assert_nil(actual) - # - s1 = Set.new(["A","B","C"]) - s2 = Set.new(["a","b","c"]) - actual = SetDifferences[s1, s2, true] - expected = { - :in_1st_not_2nd => Set.new(["A","B","C"]), - :in_2nd_not_1st => Set.new(["a","b","c"]) - } - assert_equal(expected, actual) - end - def test_AdjustMap - ris = { - "A" => Set.new(["a"]), - "A B" => Set.new(["b"]), - "A B C" => Set.new(["c"]) - } - expected = { - "A" => Set.new(["a", "b", "c"]) - } - actual = AdjustMap[ris] - assert_equal(expected, actual) - end - def test_DiffsToString - m = { - :a=>Set.new(["a"]), - :b=>Set.new(["b"]) - } - expected = "Stuff:\nin a but not in b:\n- a\nin b but not in a:\n- b\n" - actual = DiffsToString[m,"Stuff",:a,:b,"a","b"] - assert_equal(expected, actual) - end - def test_RecordInputSetDifferencesToString - diffs = { - :records_in_1st_not_2nd => nil, - :records_in_2nd_not_1st => nil, - :field_set_differences => { - "coolsys" => { - :in_2nd_not_1st => Set.new(["csName"]), - :in_1st_not_2nd => nil - } - } - } - assert("".class == RecordInputSetDifferencesToString[diffs].class) - end - def test_RecordInputSetDifferences - ris1 = { - "Top" => Set.new(["a", "b", "c"]), - "Bottom" => Set.new(["a", "b", "c"]) - } - ris2 = { - "Top" => Set.new(["a", "B", "c"]), - "Bottom" => Set.new(["a", "b", "C"]) - } - actual = RecordInputSetDifferences[ris1, ris2, false] - expected = nil - assert_nil(actual) - # - actual = RecordInputSetDifferences[ris1, ris2, true] - expected = { - records_in_1st_not_2nd: nil, - records_in_2nd_not_1st: nil, - field_set_differences: { - "Top" => { - in_1st_not_2nd: Set.new(["b"]), - in_2nd_not_1st: Set.new(["B"]) - }, - "Bottom" => { - in_1st_not_2nd: Set.new(["c"]), - in_2nd_not_1st: Set.new(["C"]) - } - } - } - assert_equal(expected, actual) - # - ris1 = { - "Top" => Set.new(["a", "b", "c"]), - "Bottom" => Set.new(["a", "b", "c"]) - } - ris2 = { - "Top" => Set.new(["a", "b", "c"]), - "Side" => Set.new(["a", "b", "c"]) - } - actual = RecordInputSetDifferences[ris1, ris2, true] - expected = { - records_in_1st_not_2nd: Set.new(["Bottom"]), - records_in_2nd_not_1st: Set.new(["Side"]) - } - assert_equal(expected, actual) - # - ris1 = { - "Top" => Set.new(["b", "c"]), - "Bottom" => Set.new(["a", "b", "c"]) - } - ris2 = { - "Top" => Set.new(["a", "b", "c"]), - "Bottom" => Set.new(["b", "c", "d"]) - } - actual = RecordInputSetDifferences[ris1, ris2, true] - expected = { - records_in_1st_not_2nd: nil, - records_in_2nd_not_1st: nil, - field_set_differences: { - "Top" => {in_1st_not_2nd: Set.new, in_2nd_not_1st: Set.new(["a"])}, - "Bottom" => { - in_1st_not_2nd: Set.new(["a"]), in_2nd_not_1st: Set.new(["d"]) - } - } - } - assert_equal(expected, actual) - ris1 = ReadCulList[@cullist_full_path] - ris2 = ReadAllRecordDocuments[@all_records_path] - actual = RecordInputSetDifferences[ris1, ris2, false] - assert(!actual.nil?) - ris3 = AdjustMap[ris2] - actual = RecordInputSetDifferences[ris1, ris3, false] - assert(!actual.nil?) - end - def test_DropNameFields - input = {"A"=>Set.new(["a","b","cName","c","d"])} - actual = DropNameFields[input] - expected = {"A"=>Set.new(["a","b","c","d"])} - assert_equal(expected, actual) - end - def test_DropNameFieldsIfNotInRef - # Case insensitive - input = {"A"=>Set.new(["a","b","cName","c","d","dName"])} - ref = {"A"=>Set.new(["a","b","c","d","dname"])} - actual = DropNameFieldsIfNotInRef[input, ref] - expected = {"A"=>Set.new(["a","b","c","d","dName"])} - assert_equal(expected, actual) - # Case sensitive - input = {"A"=>Set.new(["a","b","cName","c","d","dName"])} - ref = {"A"=>Set.new(["a","b","c","cName","d","dname"])} - actual = DropNameFieldsIfNotInRef[input, ref, true] - expected = {"A"=>Set.new(["a","b","c","cName","d"])} - assert_equal(expected, actual) - end - def test_casing_with_RecordInputSetDifferences - ris1 = { - "A" => Set.new(["aa", "ab", "ac"]), - "B" => Set.new(["ba", "bb", "bc"]) - } - ris3 = { - "a" => Set.new(["AA", "AB", "AC"]), - "b" => Set.new(["BA", "BB", "BC"]) - } - case_sensitive = false - records_to_ignore = ["A"] - data_fields_to_ignore = {"a"=>Set.new(["ac"])} - diffs = RecordInputSetDifferences[ - ris1, ris3, case_sensitive, - records_to_ignore, - data_fields_to_ignore - ] - assert(diffs.nil?) - diffs = RecordInputSetDifferences[ - ris3, ris1, false, - records_to_ignore, - data_fields_to_ignore - ] - assert(diffs.nil?) - records_to_ignore = [] - data_fields_to_ignore = {} - diffs = RecordInputSetDifferences[ - ris1, ris3, case_sensitive, - records_to_ignore, - data_fields_to_ignore - ] - assert(diffs.nil?) - ris1 = { - "A" => Set.new(["aa", "ab", "ac", "ad"]), - "B" => Set.new(["ba", "bb", "bc"]) - } - ris3 = { - "a" => Set.new(["AA", "AB", "AC"]), - "b" => Set.new(["BA", "BC"]) - } - records_to_ignore = ["B"] - data_fields_to_ignore = {"a"=>Set.new(["ad"])} - diffs = RecordInputSetDifferences[ - ris1, ris3, case_sensitive, - records_to_ignore, - data_fields_to_ignore - ] - assert(diffs.nil?) - ris1 = { - "A" => Set.new(["aa", "ab", "ac"]), - "B" => Set.new(["ba", "bc"]) - } - ris3 = { - "a" => Set.new(["AA", "AB", "AC", "AD"]), - "b" => Set.new(["BA", "BB", "BC"]) - } - records_to_ignore = ["B"] - data_fields_to_ignore = {"a"=>Set.new(["ad"])} - diffs = RecordInputSetDifferences[ - ris1, ris3, case_sensitive, - records_to_ignore, - data_fields_to_ignore - ] - assert(diffs.nil?) - ris1 = { - "A" => Set.new(["aa", "ab", "ac", "ae"]), - "B" => Set.new(["ba", "bc"]) - } - ris3 = { - "a" => Set.new(["AA", "AB", "AC", "AD"]), - "b" => Set.new(["BA", "BB", "BC"]) - } - records_to_ignore = ["B"] - data_fields_to_ignore = {"a"=>Set.new(["ad"])} - expected = { - records_in_1st_not_2nd: nil, - records_in_2nd_not_1st: nil, - field_set_differences: { - "a" => {in_1st_not_2nd: Set.new(["ae"]), in_2nd_not_1st: Set.new()}, - } - } - actual = RecordInputSetDifferences[ - ris1, ris3, case_sensitive, - records_to_ignore, - data_fields_to_ignore - ] - assert_equal(expected, actual) - end -end diff --git a/doc/test/rakefile_test.rb b/doc/test/rakefile_test.rb deleted file mode 100644 index 190fdeb70..000000000 --- a/doc/test/rakefile_test.rb +++ /dev/null @@ -1,16 +0,0 @@ -require_relative 'test_helper' -require_relative '../rakefile.rb' - -class RakefileTest < TC - def test_UpdateOutlineCount - assert_equal(UpdateOutlineCount[[0], 1], [1]) - assert_equal(UpdateOutlineCount[[1,1,3], 2], [1,2]) - assert_equal(UpdateOutlineCount[[1,1,3], 3], [1,1,4]) - assert_equal(UpdateOutlineCount[[1,1,3], 1], [2]) - assert_equal(UpdateOutlineCount[[1,1,3], 4], [1,1,3,1]) - assert_equal(UpdateOutlineCount[[1,1,3], 5], [1,1,3,1,1]) - end - def test_OutlineCountToStr - assert_equal(OutlineCountToStr[[1,1,3]], "1.1.3") - end -end diff --git a/doc/test/resources/airhandler.md b/doc/test/resources/airhandler.md deleted file mode 100644 index 933fa1dd6..000000000 --- a/doc/test/resources/airhandler.md +++ /dev/null @@ -1,1547 +0,0 @@ -# AIRHANDLER - -AIRHANDLER defines a central air handling system, containing a fan or fans, optional heating and cooling coils, and optional outside air intake and exhaust. AIRHANDLERs are subobjects of TOP, and deliver air to one or more ZONEs through TERMINAL(s). AIRHANDLER objects can be used to model fan ventilation and forced air heating and cooling. Dual duct systems are modeled with two AIRHANDLERs (one for hot air and one for cool air) and two TERMINALs in each zone. Figure 2 shows…. \[need a sentence that explains the figure.\] - -![Insert Figure Title](media/image1.png) - -AIRHANDLER is designed primarily to model a central system that supplies hot or cold air at a centrally determined temperature (the "Supply Temperature Setpoint") to Variable Air Volume (VAV) terminals in the zones. Some additional variations are also supported: - -1. The AIRHANDLER can model a constant volume, fan-always-on system, where the supply temperature varies to meet the load of a single zone (that is, the thermostat controls the heating and/or cooling coil, but not the fan). This is done by setting the terminal minimum flow, *tuVfMn,* equal to the maximum flow, *tuVfMxH* for heating and/or *tuVfMxC* for cooling, and using a supply temperature control method that adjusts the temperarute to the load (*ahTsSp* = WZ, CZ, or ZN2, described below). - -2. The AIRHANDLER can model constant volume, fan cycling systems where the fan cycles with a single zone thermostat, running at full flow enough of the time to meet the load and shutting completely off the rest of the time, rather than running at variable flow to adjust to the demand from the zones. - - This variation is invoked by specifying *ahFanCycles*= YES (usually with *ahTsSp*=ZN, described below). The user should be aware that this is done by treating fractional flow as equivalent to fractional on-time in most of the program, adjusting for the higher flow and less than 100% duty cycle only in a few parts of the model known to be non-linear, such as computation of cooling coil performance, fan heat, and duct leakage. For example, the outside air inputs, designed for VAV modeling, won't work in the expected manner unless you keep this modeling method in mind. - -3. The AIRHANDLER can supply hot air, cold air, or shut off according to the requirements of a single zone. This variation is invoked by giving *ahTsSp* = ZN or ZN2, both described further below. - -**ahName** - -Name of air handler: give after the word AIRHANDLER. Required for reference in TERMINALs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes - -**ahSched=*choice*** - -Air handler schedule; OFF or ON, hourly schedulable by using CSE expression. - - ------ --------------------------------------- - OFF supply fan off; air handler not - operating. Old date? Note: (future) - Taylor setback/setup control in effect, - when implemented. - - ON supply fan runs, at varying volume - according to TERMINAL demand (except if - *ahFanCycles* = YES, fan cycles on and - off at full volume). - ------ --------------------------------------- - -The following might be used to run an air handler between 8 AM and 5 PM: - - ahSched = select( (\$hour > 8 && \$hour <= 5), ON, - default, OFF ); - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ON/OFF ON No hourly - -## AIRHANDLER Supply Air Temperature Controller - -**ahTsSp=*float or choice*** - -Supply temperature setpoint numeric value OR\* choice of control method (WZ, CZ, RA, ZN, or ZN2): - - ---------- --------------------------------------- - *float* A numeric value specifies the supply - temperature setpoint. An expression can - be used to make dependent on time, - weather, etc. - - WZ Warmest Zone: for cooling, sets the - supply temperature setpoint each - sub??hour so that the control zone (see - *ahWzCzns*) requiring the coolest - supply temperature can meet its load - with its VAV damper 90% of the way from - its minimum opening to its maximum, - that is, at a flow of: *tuVfMn* + - .9(*tuVfMxC* - \* tuVfMn\*). - - CZ Coolest Zone: analogous to WZ, but for - heating - - RA Supply temperature setpoint value is - controlled by return air temperature - (this cannot be done with a CSE - expression without lagging a subhour). - See *ahTsRaMn* and *ahTsRaMx*. - - ZN Causes air handler to switch between - heating, OFF, and cooling as required - by the load of a single zone. When the - zone thermostat (modeled through the - *tuTC* and *tuTH* inputs) calls for - neither heating nor cooling, the air - handler shuts down, including stopping - its fan(s). Changes *ahFanCycles* - default to YES, to simulate a constant - volume, fan cycling system. - - Supply temperature setpoint value when - *ahFanCycles* = YES is taken from - *ahTsMn* for cooling, from *ahTsMx* for - heating (actual temperatures expected - to be limited by coil capacity since - fan is running at full flow). When - *ahFanCycles* = NO, the setpoint is - determined to allow meeting the load, - as for WZ and CZ. - - When the zone is calling for neither - heat nor cold, the air handler shuts - down, including stopping its fan(s), - regardless of the *ahFanCycles* value. - - ZN2 Causes air handler to switch between - heating, cooling, and FAN ONLY - operation as required by the load of a - single zone. To model a constant volume - system where the fan runs continuously, - use ZN2 and set the terminal minimum - flow (*tuVfMn*) equal to the maximum - (*tuVfMxC* and/or *tuVfMxH*). - - When *ahTsSp* is ZN2, the supply - temperature setpoint is determined to - allow meeting the load, as for WZ and - CZ, described above. - ---------- --------------------------------------- - -Only when *ahTsSp* is ZN or ZN2 does AIRHANDLER switches between heating and cooling supply temperatures according to demand. In other cases, there is but a single setpoint value or control method (RA, CZ, or WZ); if you want the control method or numeric value to change according to time of day or year, outside temperature, etc., your CSE input must contain an appropriate conditional expression for *ahTsSp*. - -Unless *ahTsSp* is ZN or ZN2, the AIRHANDLER does not know whether it is heating or cooling, and will use either the heating coil or cooling coil, if available, as necessary, to keep the supply air at the single setpoint temperature. The coil schedule members, described below, allow you to disable present coils when you don't want them to operate, as to prevent cooling supply air that is already warm enough when heating the zones. For example, in an AIRHANDLER with both heating and cooling coils, if you are using a conditional expression based on outdoor temperature to change *ahTsSp* between heating and cooling values, you may use expressions with similar conditions for *ahhcSched* and *ahccSched* to disable the cooling coil when heating and vice versa. (Expressions would also be used in the TERMINALS to activate their heating or cooling setpoints according to the same conditions.) - -Giving *ahTsSp* is disallowed for an air handler with no economizer, no heat coil and no cooling coil. Such an AIRHANDLER object is valid as a ventilator; its supply temperature is not controlled. but rather determined by the outside temperature and/or the return air temperature. - - --------------------------------------------------------------------------- - **Unit** **Legal** **Default** **Required** **Variability** - **Range** - -------- --------------- ------------- ------------------ ----------------- - ^o^F *number*, RA\*, 0 YES, if coil(s) hourly - WZ, CZ, or economizer - ZN\*\*, present - ZN2\*\* - --------------------------------------------------------------------------- - -\* ahTsRaMn, ahTsRaMx, ahTsMn, and ahTsMx are *required* input for this choice. - -\*\* only a single ZONE may be used with these choices. - - ----------------------------------------------------------------------- - **To Model** **Use** **Comments** - ----------------------- ----------------------- ----------------------- - VAV heating *OR* *ahTsSp* = *numeric CSE models this most - cooling system expression,* WZ, CZ, or directly - RA - - VAV system that both Use a conditional Also use expressions to - heats and cools (single expression to change disable the unwanted - duct) *ahTsSp* between coil and change each - heating and cooling zone's setpoints - values on the basis of according to same - outdoor temperature, condition as *ahTsSp*. - date, or some other For example, when - condition. heating, use - *ahccSched* = OFF and - *tuTC *= 999; and when - cooling, use - *ahhcSched* = OFF and - *tuTH* = -99. - - Dual duct heating / Use two AIRHANDLERs - cooling system - - Single zone VAV system *ahTsSp* = ZN2 Supply fan runs, at - that heats or cools per flow *tuVfMn*, even - zone thermostat when neither heating - nor cooling. Supply - temp setpoint - determined as for CZ or - WZ. - - Single zone constant *ahTsSp* = *ZN2*; Supply fan circulates - volume system that *tuVfMn* = *tuVfMxH* = air even if neither - heats or cools per zone *tuVfMxC* heating nor cooling. - thermostat, e.g. PSZ. Supply temp setpoint - determined as for CZ or - WZ. All *tuVf*'s same - forces constant volume. - - Single zone constant *ahTsSp*= ZN; *ahTsMx* *AhFanCycles* defaults - volume, fan cycling = heat supply temp to YES. Supply fan off - system that heats or setpoint; *ahTsMn* = when not heating or - cools per zone cool supply temp cooling. Flow when fan - thermostat,e.g. PTAC, setpoint; *tuVfMn*= 0; on is *tuVfMxH* or - RESYS, or furnace. tuVfMxH = tuVfMxC *tuVfMxC* as applicable - normally; *sfanVfDs* (or *sfanVfDs \* - >= max( *tuVfMxH, sfanVfMxF* if smaller). - tuVfMxC)* to minimize - confusion about flow - modeled. - ----------------------------------------------------------------------- - - : Using AIRHANDLER to Model Various Systems - - -**ahFanCycles=*choice*** - -Determines whether the fan cycles with the zone thermostat. - - ------ --------------------------------------- - YES Supply fan runs only for fraction of - the subhour that the zone requests - heating or cooling. When running, - supply fan runs at full flow (i.e. - constant volume), as determined by the - more limiting of the air handler and - terminal specifications. Use with a - single zone only. Not allowed with - *ahTsSp* = ZN2. - - NO Normal CSE behavior for simulating VAV - systems with continuously running (or - scheduled), variable flow supply fans. - (For constant volume, fan always on - modeling, use NO, and make *tuVfMn* - equal to *tuVfMxH/C*.) - ------ --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------ -------------- ----------------- - YES,NO YES when *ahTsSp*=ZN, NO otherwise No hourly - -**ahTsMn=*float*** - -Minimum supply temperature. Also used as cooling supply temperature setpoint value under *ahTsSp* = ZN. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------------------------------- ------------- ---------------------- ----------------- - ^o^F *no limit*; typically: 40 $\le$ *x* $\le$ 140^o^ 0^o^F Only for *ahTsSp*=RA hourly - - - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ----------- ---------------- --------------- - ^o^F *no limit*; 999^o^ F Only for hourly - typically: *ahTsSp*=RA; - 40 $\le$ recommend giving - *x* $\le$ for *ahTsSp*=ZN - 140^o^ - - ------------------------------------------------------------------ - -**ahTsMx=*float*** - -Maximum supply temperature. Also used as heating supply temperature setpoint value under *ahTsSp* = ZN. - - -**ahWzCzns=*zone names* or *ALL* or *ALL\_BUT zone names*** - -**ahCzCzns=*zone names* or *ALL* or *ALL\_BUT zone names*** - -Specify zones monitored to determine supply temperature setpoint value (control zones), under *ahTsSp*=WZ and CZ respectively. - - --------------- --------------------------------------- - *zone names* A list of zone names, with commas - between them. Up to 15 names may be - given. - - ALL\_BUT May be followed by a a comma and list - of up to 14 zone names; all zones on - air handler other than these are the - control zones. - - ALL Indicates that all zones with terminals - connected to the air handler are - control zones. - --------------- --------------------------------------- - -A comma must be entered between zone names and after the word ALL\_BUT. - - - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------------------ ------------- -------------- ----------------- - *name(s) of ZONEs* ALL ALL\_BUT *zone Name(s)* ALL NO hourly - -**ahCtu=*terminal name*** - -Terminal monitored to determine whether to heat or cool under ZN and ZN2 supply temperature setpoint control. Development aid feature; believe there is no need to give this since ahTsSp = ZN or ZN2 should only be used with one zone. - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ------------ ---------------- --------------- - name of a AIRHANDLER's If *ahTsSp* = ZN hourly - TERMINAL TERMINAL, if with more than 1 - only one TERMINAL - - ----------------------------------------------------------------- - - - -*AhTsRaMn* and *ahTsRaMx* are used when *ahTsSp* is RA. - -**ahTsRaMx=*float*** - -Return air temperature at which the supply temperature setpoint is at the *maximum* supply temperature, *ahTsMx*. - -**ahTsRaMx=*float*** - -Return air temperature at which the supply temperature setpoint is at the *minimum* supply temperature, *ahTsMn*. - -When the return air temperature is between *ahTsRaMn*and *ahTsRaMx*, the supply temperature setpoint has a proportional value between *ahTsMx* and *ahTsMn*. - -If return air moves outside the range *ahTsRaMn* to *ahTsRaMx*, the supply temperature setpoint does not change further. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------------------------------- ------------- ---------------------- ----------------- - ^o^F *no limit*; typically: 40 $\le$ *x* $\le$ 140^o^ *none* Only for *ahTsSp*=RA hourly - -## AIRHANDLER Supply fan - -All AIRHANDLERs have supply fans. - -**sfanType=*choice*** - -Supply fan type/position. A BLOWTHRU fan is located in the air path before the coils; a DRAWTHRU fan is after the coils. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - DRAWTHRU, BLOWTHRU DRAWTHRU No constant - -**sfanVfDs=*float*** - -Design or rated (volumetric) air flow at rated pressure. Many fans will actually blow a larger volume of air at reduced pressure: see sfanVfMxF (next). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - cfm *x* $\ge$ 0 *none* Yes constant - -**sfanVfMxF=*float*** - -Overrun factor: maximum factor by which fan will exceed rated flow (at reduced pressure, not explicitly modeled). CSE delivers flows demanded by terminals until total flow at supply fan reaches sfanVfDs \* sfanVsMxF, then reduces maximum flows to terminals, keeping them in proportion to terminal design flows, to keep total flow at that value. - -We recommend giving 1.0 to eliminate overrun in constant volume modeling. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 1.0 1.3 No constant - -**sfanPress*=float*** - -Design or rated pressure. The work done by the fan is computed as the product of this pressure and the current flow, except that the flow is limited to sfanVfDs. That is, in overrun (see *sfanVfMxF*) it is assumed that large VAV terminal damper openings allow the pressure to drop in proportion to the flow over rated. This work is added to the air as heat at the fan, and is termed "fan heat". Setting sfanPress to zero will eliminate simulated fan heat for theoretical simulation of a coil only. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------- ----------------- ------------- -------------- ----------------- - inches H~2~O *x* $>$ 0 3 No constant - -Prior text: At most, one of the next two items may be given: in combination with sfanVfDs and sfanPress, either is sufficient to compute the other. SfanCurvePy is then used to compute the mechanical power at the fan shaft at partial loads; sfanMotEff allows determining the electrical input from the shaft power. - -New possible text (after addition of sfanElecPwr): Only one of sfanElecPwr, sfanEff, and sfanShaftBhp may be given: together with sfanVfDs and xfanPress, any one is sufficient for CSE to detemine the others and to compute the fan heat contribution to the air stream. - -**sfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - - ------------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- -------------------- ---------------- --------------- - W/cfm *x* $>$ 0 derived from sfanEff If sfanEff and constant - and sfanShaftBhp sfanShaftBhp not - present - ------------------------------------------------------------------------- - -**sfanEff=*float*** - -Fan efficiency at design flow and pressure, as a fraction. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------------------------------------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 derived from *sfanShaftBhp* if given, else 0.65 No constant - -**sfanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - bhp *x* $>$ 0 derived from *sfanEff*. No constant - -**sfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of *sfanVfDs*; 0 $\le$ x $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *0, 1, 0, 0, 0 (linear)* No constant - -**sfanMotEff=*float*** - -Motor/drive efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.9 No constant - -**sfanMotPos=*float*** - -Motor/drive position: determines disposition of fan motor heat (input energy in excess of work done by fan; the work done by the fan is the "fan heat", always added to air flow). - - ------------ --------------------------------------- - IN\_FLOW add fan motor heat to supply air at the - fan position. - - IN\_RETURN add fan motor heat to the return air - flow. - - EXTERNAL discard fan motor heat - ------------ --------------------------------------- - -**sfanMtr=*mtrName*** - -Name of meter, if any, to record energy used by supply fan. End use category used is "Fan". - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -## AIRHANDLER Return/Relief fan - -A return/relief fan is optional. Its presence is established by setting *rfanType* to a value other than NONE. For additional information on the return/relief fan members, refer to the description of the corresponding supply fan member above. - -**rfanType=*choice*** - -relief fan type/position. - - --------- --------------------------------------- - RETURN fan is at air handler; all return air - passes through it. - - RELIEF fan is in exhaust path. Air being - exhausted to the outdoors passes - through fan; return air being - recirculated does not pass through it. - - NONE no return/relief fan in this - AIRHANDLER. - --------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- --------------------- ----------------- - NONE, RETURN, RELIEF NONE Yes, if fan present constant - -**rfanVfDs=*float*** - -design or rated (volumetric) air flow. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------- -------------- ----------------- - cfm *x* $>$ 0 *sfanVfDs - oaVfDsMn* No constant - -**rfanVfMxF=*float*** - -factor by which fan will exceed design flow (at reduced pressure). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 1.0 1.3 No constant - -**rfanPress=*float*** - -design or rated pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------- ----------------- ------------- -------------- ----------------- - inches H~2~O *x* $>$ 0 0.75 No constant - -*At most, one of the next three?? items may be defined: ??* rework re rfanElecPwr - -**rfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - - ------------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- -------------------- ---------------- --------------- - W/cfm *x* $>$ 0 derived from rfanEff If rfanEff and constant - and rfanShaftBhp rfanShaftBhp not - present - ------------------------------------------------------------------------- - -**rfanEff=*float*** - -Fan efficiency at design flow and pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------------------------------------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 derived from *rfanShaftBhp* if given, else 0.65 No constant - -**rfanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - bhp *x* $>$ 0 derived from *rfanEff*. No constant - -**rfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of *rfanVfDs*; 0 $\le$ x $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *0, 1, 0, 0, 0 (linear)* No constant - -**rfanMotEff=*float*** - -Motor/drive efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.9 No constant - -**rfanMotPos=*choice*** - -Motor/drive position. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - IN\_FLOW, EXTERNAL IN\_FLOW No constant - -**rfanMtr=*mtrName*** - -Name of meter, if any, to record power consumption of this return fan. May be same or different from meter used for other fans and coils in this and other air handlers. "Fan" end use category is used. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -## AIRHANDLER Heating coil/Modeling Furnaces - -Heating coils are optional devices that warm the air flowing through the AIRHANDLER, including electric resistance heaters, hot water coils supplied by a HEATPLANT, the heating function of an air source heat pump, and furnaces. - -Furnaces are modeled as AIRHANDLERs with heat "coils" that model the heating portion of a gas or oil forced hot air furnace. Notes on modeling a furnace with a CSE AIRHANDLER: - -- Give *ahhcType* = GAS or OIL. -- Give *ahhcAux's* to model the power consumption of pilot, draft fan, etc. -- Use *ahTsSp* = ZN, which implies *ahFanCyles* = YES, to model constant volume, fan cycling (as opposed to VAV) operation. -- Use *ahTsMx* = an appropriate value around 140 or 180 to limit the supply temperature, simulating the furnace's high temperature cutout (the default *ahTsMx*of 999 is too high!). -- Use a single TERMINAL on the AIRHANDLER. -- To eliminate confusion about the fan cfm (which, precisely, under *ahFanCyles* = YES, is the smaller of the terminal maximum or the supply fan maximum including overrun), give the same value for TERMINAL *tuVfMxH* and AIRHANDLER *sfanVfDs*, and give *sfanVfMxF* = 1.0 to eliminate overrun. -- You will usually want to use *oaVfDsMn* = 0 (no outside air), and no economizer. - -The heating function of an air source heat pump is modeled with an AIRHANDLER with heat coil type AHP. There are several additional heat coil input variables (names beginning with *ahp-*) described later in the heat coil section. Also, a heat pump generally has a crankcase heater, which is specified with the crankcase heater inputs (*cch-*), described later in the AIRHANDLER Section 0. If the heat pump also performs cooling, its cooling function is modeled by specifying a suitable cooling coil in the same AIRHANDLER. Use *ahccType* = DX until a special cooling coil type for heat pumps is implemented. It is the user's responsibility to specify consistent heating and cooling coil inputs when the intent is to model a heat pump that both heats and cools, as CSE treats the heat coil and the cool coil as separate devices. - -The next four members apply to all heat coil types, except as noted. - -To specify that an AIRHANDLER has a heating coil and thus heating capability, give an *ahhcType* other than NONE. - -**ahhcType=*choice*** - -Coil type choice: - - ------------- --------------------------------------- - ELECTRIC electric resistance heat: 100% - efficient, can deliver its full rated - capacity at any temperature and flow. - - HW hot water coil, supplied by a HEATPLANT - object. - - GAS or OIL "coil" type that models heating portion - of a forced hot air furnace. Furnace - "coil" model uses inputs for full-load - efficiency and part-load power input; - model must be completed with - appropriate auxiliaries, *ahTsSp,* etc. - See notes above. - - GAS and OIL are the same here -- the - differences between gas- and oil-fired - furnaces is in the auxiliaries (pilot - vs. draft fan, etc.), which you specify - separately. - - AHP heating function of an air source heat - pump. - - NONE AIRHANDLER has no heat coil, thus no - heating capability. - ------------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------- ------------- ------------------------- ----------------- - ELECTRIC, HW, GAS OIL, AHP, NONE NONE Yes, if coil is present constant - -**ahhcSched=*choice*** - -Heat coil schedule; choice of AVAIL or OFF, hourly variable. Use an appropriate ahhcSched expression if heat coil is to operate only at certain times of the day or year or only under certain weather conditions, etc. - - -------- --------------------------------------- - AVAIL heat coil available: will operate as - necessary to heat supply air to supply - temperature setpoint, up to the coil's - capacity. - - OFF coil will not operate, no matter how - cold supply air is. A HW coil should be - scheduled off whenever its HEATPLANT is - scheduled off (*hpSched*) to insure - against error messages. - -------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - AVAIL, OFF AVAIL No hourly - -**ahhcCapTRat=*float*** - -Total heating (output) capacity. For an ELECTRIC, GAS, or OIL coil, this capacity is always available. For an HW heating coil, when the total heat being requested from the coil's HEATPLANT would overload the HEATPLANT, the capacity of all HW coils connected to the plant (in TERMINALs as well as AIRHANDLERs) is reduced proportionately until the requested total heat is within the HEATPLANT's capacity. Not used if *ahhcType* = AHP (see *ahpCap17* and *ahpCap47*). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------------------------------------- ----------------- - Btuh *x* $\ge$ 0 *none* Yes, if coil present, except coil type AHP hourly - -**ahhcMtr=*mtrName*** - -Name of meter to accumulate energy use by this heat coil. The input energy used by the coil is accumulated in the end use category "Htg"; for a heat pump, the en*ergy used by the supplemental resistance heaters (regular and defrost) is accumulated under the category "hp". Not allowed when*ahhcType\* is HW, as an HW coil's energy comes from its HEATPLANT, and the HEATPLANT's BOILERs accumulate input energy to meters. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -The following input is used only when *ahhcType* is HW: - -**ahhcHeatplant=*Heatplant name*** - -Name of HEATPLANT supporting hot water coil. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- --------------------- ----------------- - *name of a HEATPLANT* *none* if *ahhcType* is HW constant - -The following inputs are used only for furnaces (*ahhcType* = GAS or OIL). - -One of the next two items, but not both, **must** be given for furnaces: - -**ahhcEirR=*float*** - -Rated energy input ratio (input energy/output energy) at full power. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------------------------------------------ ----------------- - *x* $\ge$ 1 *none* if *ahhcEirR* not given and *ahhcType* is GAS or OIL hourly - -**ahhcEffR=*float*** - -Rated efficiency (output energy/input energy; 1/ahhcEirR) at full power - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- ------------------------------------------------------ ----------------- - 0 $\le$ *x* $\le$ 1 *none* if *ahhcEirR* not given and *ahhcType* is GAS or OIL hourly - -**ahhcPyEi=$k_0$, $k_1$, $k_2$, $k_3$** - -Coefficients of cubic polynomial function of (subhour average) part-load-ratio (plrAv) to adjust the full-load furnace energy input for part load operation. Enter, separated by commas, in order, the constant part, the coefficient of plrAv, the coefficient of plrAv squared, and the coefficient of plrAv cubed. CSE will normalize the coefficients if necessary to make the polynomial value be 1.0 when the part load ratio is 1.0. - -The default, from DOE2, is equivalent to: - - ahhcPyEi = .01861, 1.094209, -.112819, 0.; - -which corresponds to the quadratic polynomial: - -$$\text{pyEi}(\text{plrAv}) = 0.01861 + 1.094209 \cdot \textbf{plrAv} - 0.112819 \cdot \textbf{plrAv}^2$$ - -Note that the value of this polynomial adjusts the energy input, not the energy input ratio, for part load operation. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------ -------------- ----------------- - 0.01861, 1.094209, -0.112819, 0.0. No constant - -**ahhcStackEffect=*float*** - -Fraction of unused furnace capacity that must be used to make up for additional infiltration caused by stack effect of a hot flue when the (indoor) furnace is NOT running, only in subhours when furnace runs PART of the subhour, per DOE2 model. - -This is an obscure feature that will probably never be used, included only due to indecisiveness on the part of most members of the committee designing this program. The first time reader should skip this section, or read it only as an example of deriving an expression to implement a desired relationship. - -The stack effect is typically a function of the square root of the difference between the outdoor temperature and the assumed stack temperature. - -For example, the following is a typical example for furnace stack effect: - - ahhcStackEffect = @Top.tDbO >= 68. ? 0. - : (68. - @Top.tDbO) - * sqrt(200.-@Top.tDbO) - / (10*68*sqrt(200)); - -The code "`@Top.tDbO >= 68 ? 0. : ...`" insures that the value will be 0, not negative, when it is warmer than 68 out (if the furnace were to run when the value was negative, a run-time error would terminate the run). - -The factor "`(68. - @Top.tDbO)`" reflects the fact that the energy requirement to heat the infiltrating air is proportional to how much colder it is than the indoor temperature. Note that its permitted to use a constant for the indoor temperature because if it is below setpoint, the furnace will be running all the time, and there will be no unused capacity and the value of ahhcStackEffect will be moot. - -The factor "`sqrt(200.-@Top.tDbO)`" represents the volume of infiltrated air that is typically proportional to the square root of the driving temperature difference, where 200 is used for the estimated effective flue temperature. - -The divisor "`/ (10*68*sqrt(200))`" is to make the value 0.1 when tDbO is 0, that is, to make the stack effect loss use 10% of unused load when it is 0 degrees out. The actual modeling engineer must know enough about his building to be able to estimate the additional infiltration load at some temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0 No hourly - -The following heat coil input members, beginning with *ahp-*, are used when modeling the heating function of an air source heat pump with the air handler heat coil, that is, when *ahhcType*= AHP is given. Also, see the "AIRHANDLER Crankcase Heater" section with regard to specifying the heat pump's crankcase heater. - -The next six inputs give the heat pump's steady state heating output capacity. - -**ahpCap17=*float*** - -**ahpCap47=*float*** - -ARI steady state (continuous operation) rated capacities at 70 degrees F indoor (return) air temp, and 17 and 47 degrees F outdoor temp, respectively. These values reflect no cycling, frost, or defrost degradation. To help you find input errors, the program issues an error message if ahpCap17 >= ahpCap47. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------- ----------------- - Btuh *x* $>$ 0 Yes, for AHP coil constant - -**ahpCap35=*float*** - -ARI steady state (continuous operation) rated capacity at 35 F outdoor temp, reflecting frost buildup and defrost degradation but no cycling. Unlikely to be available for input; if not given, will be defaulted to *ahpFd35Df* (next description) times a value determined by linear interpolation between the given *ahpCap17* and *ahpCap47* values. If *ahpCap35* is given, CSE will issue an error message if it is greater than value determined by linear interpolation between *ahpCap17* and *ahpCap47*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------- -------------- ----------------- - Btuh *x* $>$ 0 from ahpFd35Df No constant - -**ahpFd35Df=*float*** - -Default frost/defrost degradation factor at 35 F: reduction of output at unchanged input, due to defrosting and due to frost on outdoor coil. Used in determining default value for *ahpCap35* (preceding description); not used if *ahpCap35* is given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .85 No constant - -**ahpCapIa=*float*** - -Capacity correction factor for indoor (return) air temperature, expressed as a fraction reduction in capacity per degree above 70F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .004 No constant - -**ahpSupRh=*float*** - -Input (and output) power of supplemental resistance reheat coil used when heat pump alone cannot meet the load. This power input is in kW, not Btuh as for most CSE power inputs. Energy consumed by this heater, as well as the defrost supplemental resistance heater, is accumulated in category "hp" of ahhcMeter (whereas energy consumption of the heat pump compressor is accumulated under category "Htg"). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - kW *x* $>$ 0 10 kW No constant - -The next seven inputs specify frost buildup and defrosting and their effect on capacity. - -**ahpTFrMn=*float*** - -**ahpTFrMx=*float*** - -**ahpTFrPk=*float*** - -Lowest, highest, and peak temperatures for frost buildup and defrost effects. Capacity reduction due to frost and defrosting consists of a component due to frost buildup on the outdoor coil, plus a component due to lost heating during the time the heat pump is doing reverse cycle defrosting (heating the outdoor coil to melt off the frost, which cools the indoor coil). The effects of Frost Buildup and of time spent defrosting are computed for different temperature ranges as follows: - -- Above *ahpTFrMx*: no frost buildup, no defrosting. - -- At *ahpTFrMx* OR *ahpTFrMn*: defrosting time per *ahpDfrFMn* (next description); no frost buildup effect. - -- At *ahpTFrPk*: defrosting time per *ahpDfrFMx*, plus additional output reduction due to effect of frost buildup, computed by linear extrapolation from *ahpCap35* or its default. - -- Between *ahpTFrPk* and *ahpTFrMn* or *ahpTFrMx*: defrost time and defrost buildup degradation linearly interpolated between values at *ahpTFrPk* and values at *ahpTFrMn* or *ahpTFrMx*. - -- Below *ahpTFrMn*: no frost buildup effect; time defrosting remains at *ahpDfrFMn*. - -In other words, the curve of capacity loss due to frost buildup follows straight lines from its high point at *ahpTFrPk* to zero at *ahpTFrMn* and *ahpTFrMx*, and remains zero outside the range *ahpTFrMn* to *ahpTFrMx*. The height of the high point is determined to match the *ahpCap35* input value or its default. The curve of time spent defrosting is described in other words in the description of *ahpDfrFMn* and *ahpDfrFMx*, next. - -An error will occur unless *ahpTFrMn* < *ahpTFrPk* < *ahpTFrMx* and *ahpTFrMn* < 35 < *ahpTFrMx*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------------------ -------------- ----------------- - ^o^F *x* > 0 *ahpTFrMn*: 17, *ahpTFrMx*: 47, *ahpTFrPk*: 42 No constant - -**ahpDfrFMn=*float*** - -**ahpDfrFMx=*float*** - -Minimum and maximum fraction of time spent in reverse cycle defrost cooling. - -The fraction of the time spent defrosting depends on the outdoor temperature, as follows: at or below *ahpTFrMn*, and at (but not above) *ahpTFrMx*, *ahpDfrFMn* is used. *ahpDfrFMx* is used at *ahpTFrMx*. Linear interpolation is used between *ahpTFrMn* or *ahpTFrMx* and *ahpTFrMx*. No time is spent defrosting above *ahpTFrMx*. - -In other words, the curve of time spent defrosting versus outdoor temperature has the value *ahpDfrFMn* up to *ahpTFrMn*, then rises in a straight line to *ahpDfrFMx* at *ahpTFrMx*, then falls in a straight line back to *ahpDfrFMn* at *ahpTFrMx*, then drops directly to zero for all higher temperatures. - -During the fraction of the time spent defrosting, the heat pump's input remains constant and the output is changed as follows: - -- Usual heat output is not delivered to load. - -- Cold output due to reverse cycle operation is delivered to load. See *ahpDfrCap*. - -- An additional resistance heater is operated; and its heat output is delivered to load. See *ahpDfrRh*. - -The program will issue an error message if *ahpDfrFMx* $\le$ *ahpDfrFMn*. - - --------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ---------- ------------- ------------ --------------- - 0 $\le$ *ahpDfrFMn*: No constant - *x* $\le$ .0222, - 1 (2 minutes/90 - minutes), - *ahpDfrFMx*: - .0889, (8 - minutes / 90 - minutes) - - --------------------------------------------------------------- - -**ahpDfrCap=*float*** - -Cooling capacity (to air handler supply air) during defrosting. Program separately computes the lost heating capacity during defrosting, but effects of switchover transient should be included in *ahpDfrCap*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - Btuh *x* $\neq$ 0 2 $\cdot$ *ahpCap17* No constant - -**ahpDfrRh=*float*** - -Input (and output) power of resistance reheat coil activated during defrost. Input is in kW, not Btuh as most CSE power inputs. Energy used by this heater is accumulated in *ahhcMeter* category "hp". - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - kW *x* > 0 5 kW No constant - -Inputs for air source heat pump low temperature cutout: - -**ahpTOff=*float*** - -**ahpTOn=*float*** - -Heat pump low temperature cutout setpoints. Heat pump is disabled (only the supplemental resistance heater operates) when outdoor temperature falls below *ahpTOff*, and is re-enabled when temperature rises above *ahpTOn*. Different values may be given to simulate thermostat differential. *ahpTOff* must be $\le$ *ahpTOn*; equal values are accepted. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------------- -------------- ----------------- - ^o^F *ahpTOff*: 5, *ahpTOn*: 12 No constant - -The next four inputs specify the heating power input for an air source heat pump: - -**ahpIn17=*float*** - -**ahpIn47=*float*** - -Steady state (full power, no cycling) power input for compressor and crankcase heater at 70 degrees F indoor (return) air temp and 17 and 47 degrees F outdoor temp respectively. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------- ----------------- - kW *x* > 0 Yes, for AHP coil constant - -**ahpInIa=*float*** - -Indoor (return) air temp power input correction factor: fraction increase in steady-state input per degree above 70 F, or decrease below 70F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .004 No constant - -**ahpCd=*float*** - -ARI cycling degradation coefficient: ratio of fraction drop in system coefficient of performance (COP) to fraction drop in capacity when cycling, from steady-state values, in ARI 47 F cycling performance tests. A value of .25 means that if the heat pump is cycled to drop its output to 20% of full capacity (i.e. by the fraction .8), its COP will drop by .8 \* .25 = .2. Here COP includes all energy inputs: compressor, crankcase heater, defrost operation, etc. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .25 No constant - -The following four air handler heat coil members allow specification of auxiliary input power consumption associated with the heat coil (or furnace) under the indicated conditions. The single description box applies to all four. - -**ahhcAuxOn=*float*** - -Auxiliary power used when running, in proportion to subhour average part load ratio (plrAv). Example use: oil furnace induced draft fan. - -**ahhcAuxOff=*float*** - -Auxiliary power used when coil is not running, in proportion to 1 - plrAv. - -**ahhcAuxFullOff=*float*** - -Auxiliary power used only when coil is off for entire subhour; not used if the coil is on at all during a subhour. Example use: Gas furnace pilot under DOE2 model, where pilot is included in main energy input if furnace runs at all in subhour. - -**ahhcAuxOnAtAll=*float*** - -Auxiliary power used in full value if coil is on for any fraction of a subhour. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 0 No hourly - -The following four members specify meters for recording auxiliary energy use through ahhcAuxOn, ahhcAuxOff, ahhcAuxFullOff, and ahhcAuxOnAtAll, respectively. End use category "Aux" is used. - -**ahhcAuxOnMtr=*mtrName*** - -**ahhcAuxOffMtr=*mtrName*** - -**ahhcAuxFullOffMtr=*mtrName*** - -**ahhcAuxOnAtAllMtr=*mtrName*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -## AIRHANDLER Cooling coil - -A cooling coil is an optional device that remove heat and humidity from the air passing through the AIRHANDLER. Available cooling coil types include chilled water (CHW), supported by a COOLPLANT that supplies cold water, and Direct Expansion (DX), supported by a dedicated compressor and condenser that are modeled integrally with the DX coil. No plant is used with DX coils. - -The following five members are used for all cool coil types except as noted. Presence of a cool coil in the AIRHANDLER is indicated by giving an *ahccType value* other than NONE. - -**ahccType*=choice*** - -Cool coil type choice: - - ----------- --------------------------------------- - ELECTRIC Testing artifice: removes heat at 100% - efficiency up to rated capacity at any - flow and temperature; removes no - humidity. Use in research runs to - isolate effects of coil models from - other parts of the CSE program. - - CHW CHilled Water coil, using a cold water - from a COOLPLANT. - - DX Direct Expansion coil, with dedicated - compressor and condenser modeled - integrally. - - NONE AIRHANDLER has no cooling coil and no - cooling capability. - ----------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ------------- ---------------------- ----------------- - ELECTRIC, DX, CHW, NONE NONE Yes, if coil present constant - -**ahccSched*=choice*** - -Cooling coil schedule choice, hourly variable. Use a suitable CSE expression for ahccSched if cooling coil is to operate only at certain times, only in hot weather, etc. - - -------- --------------------------------------- - AVAIL Cooling coil will operate as necessary - (within its capacity) to cool the - supply air to the supply temperature - setpoint. - - OFF Cooling coil will not operate no matter - how hot the supply air is. To avoid - error messages, a CHW coil should be - scheduled OFF whenever its COOLPLANT is - scheduled OFF. - -------- --------------------------------------- - -**ahccCapTRat=*float*** - -Total rated capacity of coil: sum of its "sensible" (heat-removing) and "latent" (moisture removing) capacities. Not used with CHW coils, for which capacity is implicitly specified by water flow (ahccGpmDs*) and transfer unit (*ahccNtuoDs\* and *ahccNtuiDs*) inputs, described below. - -For coil specification conditions (a.k.a. rating conditions or design conditions), see *ahccDsTDbEn*, *ahccDsTWbEn*, *ahccDsTDbCnd*and *ahccVfR*below (see index). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* > 0 *none* Yes constant - -**ahccCapSRat=*float*** - -Sensible (heat-removing) rated capacity of cooling coil. Not used with CHW coils. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* > 0 *none* Yes constant - -**ahccMtr=*mtrName*** - -Name of meter, if any, to record energy use of air handler cool coil. End use category "Clg" is used. Not used with CHW coils, because the input energy use for a CHW coil is recorded by the COOLPLANT's CHILLERs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -The following six members are used with DX cooling coils. - -**ahccMinTEvap=*float*** - -Minimum (effective surface) temperature of coil (evaporator). Represents refrigerant setpoint, or cutout to prevent freezing. Coil model will reduce output to keep simulated coil from getting colder than this, even though it lets supply air get warmer than setpoint. Should default be 35?? - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 40^o^F No constant - -**ahccK1=*float*** - -Exponent in power relationship expressing coil effectiveness as a function of relative air flow. Used as K1 in the relationship ntu = ntuR \* relCfmk1, which says that the "number of transfer units" (on the coil outside or air side) varies with the relative air flow raised to the K1 power. Used with CHW as well as DX coils; for a CHW coil, ntuR in the formula is *ahccNtuoDs*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* < 0 -0.4 No constant - -**ahccBypass=*float*** - -Fraction of air flow which does NOT flow through DX cooling coil, for better humidity control. Running less of the air through the coil lets the coil run colder, resulting in greater moisture removal right??. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1 0 No constant - -The next three members are used in determining the energy input to a DX coil under various load conditions. The input is derived from the full load energy input ratio for four segments of the part load curve. In the following the part load ratio (plr) is the ratio of the actual sensible + latent load on the coil to the coil's capacity. The coil's capacity is ahccCaptRat, adjusted by the coil model for differences between entering air temperature, humidity, and flow rate and the coil rating conditions. The coil may run at less than capacity even at full fan flow, depending on the air temperature change needed, the moisture content of the entering air, and the relative values of between *sfanVfDs* and *ahccVfR*. - - ------------------------------ --------------------------------------- - full load plr (part load ratio) = 1.0 - - Full-load power input is power output - times *ahhcEirR.* - - compressor unloading region 1.0 > plr $\ge$ *ahhcMinUnldPlr* - - Power input is the full-load input - times the value of the *pydxEirUl* - polynomial (below) for the current plr, - i.e. pydxEirUl(plr). - - false loading region *ahccMinUnldPlr* > plr $\ge$ - *ahccMinFsldPlr* - - Power input in this region is constant - at the value for the low end of the - compressor unloading region, i.e. - pydxEirUl(ahccMinUnldPlr). - - cycling region *ahccMinFsldPlr* > plr $\ge$ 0 - - In this region the compressor runs at - the low end of the false loading region - for the necessary fraction of the time, - and the power input is the false - loading value correspondingly prorated, - i.e. pydxEirUl(ahccMinUnldPlr) \* plr / - ahccMinFsldPlr. - ------------------------------ --------------------------------------- - -The default values for the following three members are the DOE2 PTAC (Window air conditioner) values. - -**ahccEirR=*float*** - -DX compressor energy input ratio (EIR) at full load under rated conditions; defined as the full-load electric energy input divided by the rated capacity, both in Btuh; same as the reciprocal of the Coefficient Of Performance (COP). Polynomials given below are used by CSE to adjust the energy input for part load and for off rated flow and temperature conditions. The default value includes outdoor (condenser) fan energy, but not indoor (air handler supply) fan energy. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 0.438 No hourly - -**ahccMinUnldPlr=*float*** - -Compressor part load ratio (total current load/current capacity) at/above which "Compressor unloading" is used and pydxEirUl (below) is used to adjust the full-load power input to get the current part load power input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------------ -------------- ----------------- - 0 $\le$ *x* $\le$ 1 1 (no unloading) No constant - -**ahccMinFsldPlr=*float*** - -"False Loading" is used between this compressor part load ratio and the plr where unloading is activated (*ahccMinUnldPlr*). In this region, input remains at *pydxEirUl*(*ahccMinUnldPlr).*For plr's less than *ahccMinFsldPlr*, cycling is used, and the power input goes to 0 in a straight line. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------ ------------------------------------- -------------- ----------------- - 0 $\le$ *x* $\le$ *ahccMinUnldPlr* *ahccMinUnldPlr* (no false loading) No constant - -The following four inputs specify polynomials to approximate functions giving DX coil capacity and power (energy) input as functions of entering temperatures, relative (to ahccVfR) flow, and relative load (plr). In each case several *float* values may be given, for use as coefficients of the polynomial. The values are ordered from constant to coefficient of highest power. If fewer than the maximum number of values are given, zeroes are used for the trailing (high order) coefficients. - -Examples: - - pydxCaptT = 2.686, -0.01667, 0, 0.006, 0, 0; - - pydxCaptT = 2.686, -0.01667, 0, 0.006; // same - - pydxEirUl = .9, 1.11, .023, -.00345; - -If the polynomial does not evaluate to 1.0 when its inputs are equal to the rating conditions (1.0 for relative flows and plr), CSE will normalize your coefficients by dividing them by the non-1.0 value. - -Some of the polynomials are biquadratic polynomials whose variables are the entering air wetbulb and drybulb temperatures. These are of the form - -$$z = a + bx + cx^2 + dy + ey^2 + fxy$$ - -where a through f are user-inputtable coefficients, x is the entering wetbulb temperature, y is the entering drybulb temperature, and the polynomial value, z, is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual entering air temperatures. - -Other polynomials are cubic polynomials whose variable is the air flow or load as a fraction of full flow or load.. These are of the form - -$$z = a + bx + cx^2+ dx^3$$ - -where a, b, c, and d are user-inputtable coefficients, $x$ is the variable, and the value $z$ is a factor by which the coil's capacity, power input, etc. at rated conditions is multiplied to adjust it for the actual flow or load. - -The default values for the polynomial coefficients are the DOE2 PTAC values. - -**pydxCaptT=a, b, c, d, e, f** - -Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust *ahccCaptRat* for the actual entering air temperatures. The condenser temperature is the outdoor drybulb, but not less than 70. See discussion in preceding paragraphs. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - 1.1839345, No constant - -0.0081087, - 0.00021104, - -0.0061425, - 0.00000161, - -0.0000030 - - ------------------------------------------------------------ - -**pydxCaptF=a=a, b, c, d** - -Coefficients of cubic polynomial function of relative flow (entering air cfm/*ahccVfR*) whose value is used to adjust *ahccCaptRat* for the actual flow. See discussion in preceding paragraphs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------- -------------- ----------------- - 0.8, 0.2, 0.0, 0.0 No constant - -**pydxEirT=*a, b, c, d, e, f*** - -Coefficients of biquadratic polynomial function of entering air wetbulb and condenser temperatures whose value is used to adjust *ahccEirR* for the actual entering air temperatures. The condenser temperature is the outdoor air drybulb, but not less than 70. If the entering air wetbulb is less than 60, 60 is used, in this function only. See discussion in preceding paragraphs. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - -0.6550461, No constant - 0.03889096, - -0.0001925, - 0.00130464, - 0.00013517, - -0.0002247 - - ------------------------------------------------------------ - -**pydxEirUl=*a, b, c, d*** - -Coefficients of cubic polynomial function of part load ratio used to adjust energy input to part load conditions, in the compressor unloading part load region (1 $\ge$ plr $\ge$ *ahccMinUnldPlr*) as described above. See discussion of polynomials in preceding paragraphs. - -This polynomial adjusts the full load energy input to part load, not the ratio of input to output, despite the "Eir" in its name. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------ -------------- ----------------- - 0.125, 0.875, 0.0, 0.0 No constant - -The following four members are used only with CHW coils. In addition, *ahccK1,* described above, is used. - -**ahccCoolplant=*name*** - -name of COOLPLANT supporting CHW coil. COOLPLANTs contain CHILLERs, and are described in Section 5.21. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - *name of a COOLPLANT* for CHW coil constant - -**ahccGpmDs=*float*** - -Design (i.e. maximum) water flow through CHW coil. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------- ----------------- - gpm *x* > 0 Yes, for CHW coil constant - -**ahccNtuoDs=*float*** - -CHW coil outside number of transfer units at design air flow (ahccVfR*, below). See*ahccK1\* above with regard to transfer units at other air flows. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 2 No constant - -**ahccNtuiDs=*float*** - -CHW coil inside number of transfer units at design water flow (ahccGpmDs, above). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 2 No constant - -The following four members let you give the specification conditions for the cooling coil: the rating conditions, design conditions, or other test conditions under which the coil's performance is known. The defaults are ARI (Air-Conditioning and Refrigeration Institute) standard rating conditions. - -**ahccDsTDbEn=*float*** - -Design (rating) entering air dry bulb temperature, used with DX and CHW cooling coils. With CHW coils, this input is used only as the temperature at which to convert *ahccVfR* from volume to mass. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - ^o^F *x* > 0 80^o^F (ARI) No constant - -**ahccDsTWbEn=*float*** - -Design (rating) entering air wet bulb temperature, for CHW coils. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - ^o^F *x* > 0 67^o^F (ARI) No constant - -**ahccDsTDbCnd=*float*** - -Design (rating) condenser temperature (outdoor air temperature) for DX coils. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - ^o^F *x* > 0 95^o^F (ARI) No constant - -**ahccVfR=*float*** - -Design (rating) (volumetric) air flow rate for DX or CHW cooling coil. The ARI specification for this test condition for CHW coils is "450 cfm/ton or less", right?? - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------------------------- -------------- ----------------- - cfm *x* > 0 DX coil: 400cfm/ton\* CHW coil: *sfanVfDs* No constant - -\* a "ton" is 12,000 Btuh of rated capacity (*ahccCaptRat*). - -The following four members permit specification of auxiliary input power use associated with the cooling coil under the conditions indicated. - -**ahccAuxOn=*float*** - -Auxiliary power used when coil is running, in proportion to its subhour average part load ratio (plrAv). - -**ahccAuxOff=*float*** - -Auxiliary power used when coil is not running, in proportion to 1 - plrAv. - -**ahccAuxFullOff=*float*** - -Auxiliary power used only when coil is off for entire subhour; not used if the coil is on at all during the subhour. - -**ahccAuxOnAtAll=*float*** - -Auxiliary power used in full value if coil is on for any fraction of a subhour. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 0 No hourly - -The following four allow specification of meters to record cool coil auxiliary energy use through ahccAuxOn, ahccAuxOff, ahccFullOff, and ahccAuxOnAtAll, respectively. End use category "Aux" is used. - -**ahccAuxOnMtr=*mtrName*** - -**ahccAuxOffMtr=*mtrName*** - -**ahccAuxFullOffMtr=*mtrName*** - -**ahccAuxOnAtAllMtr=*mtrName*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -## AIRHANDLER Outside Air - -Outside air introduced into the air hander supply air can be controlled on two levels. First, a *minimum*fraction or volume of outside air may be specified. By default, a minimum volume of .15 cfm per square foot of zone area is used. Second, an *economizer* may be specified. The simulated economizer increases the outside air above the minimum when the outside air is cooler or has lower enthalpy than the return air, in order to reduce cooling coil energy usage. By default, there is no economizer. - -**oaMnCtrl=*choice*** - -Minimum outside air flow control method choice, VOLUME or FRACTION. Both computations are based on the minimum outside air flow, *oaVfDsMn*; if the control method is FRACTION, the outside air flow is pro-rated when the air handler is supplying less than its design cfm. In both cases the computed minimum cfm is multiplied by a schedulable fraction, *oaMnFrac*, to let you vary the outside air or turn in off when none is desired. - - ----------- --------------------------------------- - VOLUME Volume (cfm) of outside air is - regulated: - - min\_oa\_flow = oaMnFrac \* oaVfDsMn - - FRACTION Fraction of outside air in supply air - is regulated. The fraction is oaVfDsMn - divided by sfanVfDs, the air handler - supply fan design flow. The minimum cfm - of outside air is thus computed as - - min\_oa\_flow = oaMnFrac \* curr\_flow - \* oaVfDsMn / sfanVfDs - - where curr\_flow is the current air - handler cfm. - ----------- --------------------------------------- - -If the minimum outside air flow is greater than the total requested by the terminals served by the air handler, then 100% outside air at the latter flow is used. To insure minimum outside air cfm to the zones, use suitable terminal minimum flows (*tuVfMn*) as well as air handler minimum outside air specifications. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------ ------------- -------------- ----------------- - VOLUME, FRACTION VOLUME No constant - -**oaVfDsMn=*float*** - -Design minimum outside air flow. If *oaMnCtrl* is FRACTION, then this is the minimum outside air flow at full air handler flow. See formulas in *oaMnCtrl* description, just above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------- -------------- ----------------- - cfm *x* $\ge$ 0 0.15 times total area of zones served No constant - -**oaMnFrac=*float*** - -Fraction of minimum outside air to use this hour, normally 1.0. Use a CSE expression that evaluates to 0 for hours you wish to disable the minimum outside air flow, for example to suppress ventilation during the night or during warm-up hours. Intermediate values may be used for intermediate outside air minima. See formulas in *oaMnCtrl* description, above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 1.0 No hourly - -CAUTION: the minimum outside air flow only applies when the supply fan is running; it won't assure meeting minimum ventilation requirements when used with ahFanCycles = YES (constant volume, fan cycling). - -If an *oaEcoType* choice other than NONE is given, an economizer will be simulated. The economizer will be enabled when the outside temperature is below oaLimT *AND* the outside air enthalpy is below oaLimE. When enabled, the economizer adjusts the economizer dampers to increase the outside air mixed with the return air until the mixture is cooler than the air handler supply temperature setpoint, if possible, or to maximum outside air if the outside air is not cool enough. - -CAUTIONS: the simulated economizer is just as dumb as the hardware being simulated. Two considerations particularly require attention. First, if enabled when the outside air is warmer than the return air, it will do the worst possible thing: use 100% outside air. Prevent this by being sure your oaLimT or oaLimE input disables the economizer when the outside air is too warm -- or leave the oaLimT = RA default in effect. - -Second, the economizer will operate even if the air handler is heating, resulting in use of more than minimum outside air should the return air get above the supply temperature setpoint. Economizers are intended for cooling air handlers; if you heat and cool with the same air handler, consider disabling the economizer when heating by scheduling a very low *oaLimT* or *oaLimE*. - - -**oaEcoType=*choice*** - -Type of economizer. Choice of: - - ---------------- --------------------------------------- - NONE No economizer; outside air flow is the - minimum. - - INTEGRATED Coil and economizer operate - independently. - - NONINTEGRATED Coil does not run when economizer is - using all outside air: simulates - interlock in some equipment designed to - prevent coil icing due to insufficient - load, right? - - TWO\_STAGE Economizer is disabled when coil cycles - on. *NOT IMPLEMENTED* as of July 1992. - ---------------- --------------------------------------- - -**oaLimT=*float*** - -or RAEconomizer outside air temperature high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air temperature is greater than *oaLimT*. A number may be entered, or "RA" to specify the current Return Air temperature. *OaLimT* may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------------- -------------- ----------------- - ^o^F *number*or RA RA (return air temperature) No hourly - -**oaLimE=*float*** - -or RAEconomizer outside air enthalpy high limit. The economizer is disabled (outside air flow is reduced to a minimum) when the outside air enthalpy is greater than *oaLimE*. A number may be entered, or "RA" to specify the current Return Air enthalpy. *OaLimE* may be scheduled to a low value, for example -99, if desired to disable the economizer at certain times. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------- -------------- ----------------- - Btu/^o^F *number* or RA 999 (enthalpy limit disabled) No hourly - -*oaOaLeak* and *oaRaLeak* specify leakages in the economizer dampers, when present. The leaks are constant-cfm flows, expressed as fractions of the maximum possible flow. Thus, when the current flow is less than the maximum possible, the range of operation of the economizer is reduced. When the two damper leakages add up to more than the current air handler flow, outside and return air are used in the ratio of the two leakages and the economizer, if enabled, is ineffective. - -**oaOaLeak=*float*** - -Outside air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. If an economizer is present, *oaOaLeak* is a fraction of the supply fan design cfm, *sfanVfDs*. Otherwise, *oaOaLeak* is a fraction of the design minimum outside air flow *oaVfDsMn*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1.0 0.1 No constant - -**oaRaLeak=*float*** - -Return air damper leakage to mixed air. Puts a minimum on return air flow and thus a maximum on outside air flow, to mixed air. Expressed as a fraction of the supply fan design cfm, *sfanVfDs*. Not used when no economizer is being modeled. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1.0 0.1 No constant - -## AIRHANDLER Leaks and Losses - -*AhSOLeak* and *ahRoLeak* express air leaks in the common supply and return ducts, if any, that connect the air handler to the conditioned space. For leakage after the point where a duct branches off to an individual zone, see TERMINAL member *tuSRLeak*. These inputs model leaks in constant pressure (or vacuum) areas nearer the supply fan than the terminal VAV dampers; thus, they are constant volume regardless of flow to the zones. Hence, unless 0 leakage flows are specified, the air handler cfm is greater than the sum of the terminal cfm's, and the air handler cfm is non-0 even when all terminal flows are 0. Any heating or cooling energy applied to the excess cfm is lost to the outdoors. - -If unequal leaks are specified, at present (July 1992) CSE will use the average of the two specifications for both leaks, as the modeled supply and return flows must be equal. A future version may allow unequal flows, making up the difference in exfiltration or infiltration to the zones. - -**ahSOLeak=*float*** - -Supply duct leakage to outdoors, expressed as a fraction of supply fan design flow (*sfanVfDs*). Use 0 if the duct is indoors. A constant-cfm leak is modeled, as the pressure is constant when the fan is on. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.01 No constant - -**ahROLeak=*float*** - -Return duct leakage FROM outdoors, expressed as a fraction of *sfanVfDs*. Use 0 if the duct is indoors. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.01 No constant - -*AhSOLoss* and *ahROLoss* represent conductive losses from the common supply and return ducts to the outdoors. For an individual zone's conductive duct loss, see TERMINAL member *tuSRLoss*. Losses here are expressed as a fraction of the temperature difference which is lost. For example, if the supply air temperature is 120, the outdoor temperature is 60, and the pertinent loss is .1, the effect of the loss as modeled will be to reduce the supply air temperature by 6 degrees ( .1 \* (120 - 60) ) to 114 degrees. CSE currently models these losses a constant *TEMPERATURE LOSSes* regardless of cfm. - -**ahSOLoss=*float*** - -Supply duct loss/gain to the outdoors. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.1 No constant - -**ahROLoss=*float*** - -Return duct heat loss/gain to the outdoors. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.1 No constant - -## AIRHANDLER Crankcase Heater - -A "crankcase heater" is an electric resistance heater in the crankcase of the compressor of heat pumps and dx cooling coils. The function of the crankcase heater is to keep the compressor's oil warmer than the refrigerant when the compressor is not operating, in order to prevent refrigerant from condensing into and remaining in the oil, which impairs its lubricating properties and shortens the life of the compressor. Manufacturers have come up with a number of different methods for controlling the crankcase heater. The crankcase heater can consume a significant part of the heat pump's energy input; thus, it is important to model it. - -In CSE a heat pump is modeled as though it were separate heating and cooling coils. However, the crankcase heater may operate (or not, according to its control method) whether the heat pump is heating, or cooling, or, in particular, doing neither, so it is modeled as a separate part of the air handler, not associated particularly with heating or cooling. - -When modeling an air source heat pump (ahhcType = AHP), these variables should be used to specify the crankcase heater, insofar as non-default inputs are desired. - -Appropriateness of use of these inputs when specifying a DX system without associated heat pump heating is not clear to me (Rob) as of 10-23-92; on the one hand, the DX compressor probably has a crankcase heater; on the other hand, the rest of the DX model is supposed to be complete in itself, and adding a crankcase heater here might produce excessive energy input; on the third hand, the DX model does not include any energy input when the compressor is idle; ... . - -**cchCM=*choice*** - -Crankcase heater presence and control method. Choice of: - - ------------- -------------------------------------------------------- - NONE No crankcase heater present - - CONSTANT Crankcase heater input always *cchPMx* (below). - - PTC Proportional control based on oil temp when compressor - does not run in subhour (see *cchTMx*, *cchMn*, and - *cchDT*). If compressor runs at all in subhour, the oil - is assumed to be hotter than *cchTMn* and crankcase - heater input is *cchPMn*. (PTC stands for "Positive - Temperature Coefficient" or "Proportional Temperature - Control".) - - TSTAT Control based on outdoor temperature, with optional - differential, during subhours when compressor is off; - crankcase heater does not operate if compressor runs at - all in subhour. See *cchTOn*, *cchTOff*. - - CONSTANT\_CLO - - PTC\_CLO Same as corresponding choices above except zero - crankcase heater input during fraction of time - compressor is on ("Compressor Lock Out"). There is no - TSTAT\_CLO because under TSTAT the crankcase heater does - not operate anyway when the compressor is on. - ------------- -------------------------------------------------------- - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------------- ----------- ------------ --------------- - CONSTANT\ PTC\_CLO if No constant - CONSTANT\_CLO\ *ahhcType* - PTC\ is AHP, - PTC\_CLO\ else NONE - TSTAT\ - NONE - - ------------------------------------------------------------------ - -**cchPMx=*float*** - -Crankcase resistance heater input power; maximum power if *cchCM* is PTC or PTC\_CLO. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - kW *x* > 0 .4 kW No constant - -**cchPMn=*float*** - -Crankcase heater minimum input power if *cchCM* is PTC or PTC\_CLO, disallowed for other *cchCM's*. > 0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - kW *x* > 0 .04 kW No constant - -**cchTMx=*float*** - -**cchTMn=*float*** - -For *cchCM* = PTC or PTC\_CLO, the low temperature (max power) and high temperature (min power) setpoints. In subhours when the compressor does not run, crankcase heater input is *cchPMx* when oil temperature is at or below *cchTMx*, *cchPMn* when oil temp is at or above *cchTMn*, and varies linearly (proportionally) in between. *cchTMn* must be $\ge$ *cchTMx*. See *cchDT* (next). - -(Note that actual thermostat setpoints probably cannot be used for *cchTMx* and *cchTMn* inputs, because the model assumes the difference between the oil temperature and the outdoor temperature is constant (*cchDT*) regardless of the heater power. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------------- -------------- ----------------- - ^o^F *cchTMn*: 0; *cchTMx*: 150 No constant - -**cchDT=*float*** - -For *cchCM* = PTC or PTC\_CLO, how much warmer than the outdoor temp CSE assumes the crankcase oil to be in subhours when the compressor does not run. If the compressor runs at all in the subhour, the oil is assumed to be warmer than *cchTMn*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F 20^o^F No constant - -**cchTOn=*float*** - -**cchTOff=*float*** - -For *cchCM* = TSTAT, in subhours when compressor does not run, the crankcase heater turn-on and turn-off outdoor temperatures, respectively. Unequal values may be given to simulate thermostat differential. When the compressor runs at all in a subhour, the crankcase heater is off for the entire subhour. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------- --------------------------------------- -------------- ----------------- - ^o^F *cchTOff* $\ge$ *cchTOn* *cchTOn*: 72^o^F; *chcTOff*: *chcTOn* No constant - -**cchMtr=*name of a METER*** - -METER to record crankcase heater energy use, category "Aux"; not recorded if not given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endAirHandler** - -Indicates the end of the air handler definition. Alternatively, the end of the air handler definition can be indicated by the declaration of another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/boiler.md b/doc/test/resources/boiler.md deleted file mode 100644 index 0f8b71dcd..000000000 --- a/doc/test/resources/boiler.md +++ /dev/null @@ -1,141 +0,0 @@ -# BOILER - -BOILERs are subObjects of HEATPLANTs (preceding Section 5.20). BOILERs supply heat, through their associated HEATPLANT, to HW coils and heat exchangers. - -Each boiler has a pump. The pump operates whenever the boiler is in use; the pump generates heat in the water, which is added to the boiler's output. The pump heat is independent of load -- the model assumes a bypass valve keeps the water flow constant when the loads are using less than full flow -- except that the heat is assumed never to exceed the load. - -**boilerName** - -Name of BOILER object, given immediately after the word BOILER. The name is used to refer to the boiler in heat plant stage commands. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant - -**blrCap=*float*** - -Heat output capacity of this BOILER. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* > 0 Yes constant - -**blrEffR=*float*** - -Boiler efficiency at steady-state full load, as a fraction. 1.0 may be specified to model a 100% efficient boiler. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .80 No constant - -**blrEirR=*float*** - -Boiler Energy Input Ratio: alternate method of specifying efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - x $\ge$ 1.0 1/*blrEffR* No constant - -**blrPyEi=*a, b, c, d*** - -Coefficients of cubic polynomial function of part load ratio (load/capacity) to adjust full-load energy input for part load operation. Up to four floats may be given, separated by commas, lowest order (i.e. constant term) coefficient first. If the given coefficients result in a polynomial whose value is not 1.0 when the input variable, part load ratio, is 1.0, a warning message will be printed and the coefficients will be normalized to produce value 1.0 at input 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------- -------------- ----------------- - .082597, .996764, 0.79361, 0. No constant - -**blrMtr=*name of a METER*** - -Meter to which Boiler's input energy is accumulated; if omitted, input energy is not recorded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - name of a METER *none* No constant - -**blrpGpm=*float*** - -Boiler pump flow in gallons per minute: amount of water pumped from this boiler through the hot water loop supplying the HEATPLANT's loads (HW coils and heat exchangers) whenever boiler is operating. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - gpm *x* > 0 blrCap/10000 No constant - -**blrpHdloss=*float*** - -Boiler pump head loss (pressure). 0 may be specified to eliminate pump heat and pump energy input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft H2O *x* $\ge$ 0 114.45\* No constant - -\* may be temporary value for 10-31-92 version; prior value of 35 may be restored. - -**blrpMotEff=*float*** - -Boiler pump motor efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .88 No constant - -**blrpHydEff=*float*** - -Boiler pump hydraulic efficiency - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .70 No constant - -**blrpMtr=*name of a METER*** - -Meter to which pump electrical input energy is accumulated. If omitted, pump input energy use is not recorded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *name of a METER* *none* No constant - -The following four members permit specification of auxiliary input power use associated with the boiler under the conditions indicated. - - --------------------------- ------------------------------------------- - blrAuxOn=*float* Auxiliary power used when boiler is - running, in proportion to its subhour - average part load ratio (plr). - - blrAuxOff=*float* Auxiliary power used when boiler is not - running, in proportion to 1 - plr. - - blrAuxFullOff=*float* Auxiliary power used only when boiler is - off for entire subhour; not used if the - boiler is on at all during the subhour. - - blrAuxOnAtAll=*float* Auxiliary power used in full value if - boiler is on for any fraction of subhour. - --------------------------- ------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 0 No hourly - -The following four allow specification of meters to record boiler auxiliary energy use through blrAuxOn, blrAuxOff, blrFullOff, and blrAuxOnAtAll, respectively. End use category "Aux" is used. - -**blrAuxOnMtr=*mtrName*** - -**blrAuxOffMtr=*mtrName*** - -**blrAuxFullOffMtr=*mtrName*** - -**blrAuxOnAtAllMtr=*mtrName*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endBoiler** - -Optionally indicates the end of the boiler definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/chiller.md b/doc/test/resources/chiller.md deleted file mode 100644 index a3521a340..000000000 --- a/doc/test/resources/chiller.md +++ /dev/null @@ -1,300 +0,0 @@ -# CHILLER - -CHILLERs are subobjects of COOLPLANTs (Section 5.21). CHILLERs supply coldness, in the form of chilled water, via their COOLPLANT, to CHW (CHilled Water) cooling coils in AIRHANDLERs. CHILLERs exhaust heat through the cooling towers in their COOLPLANT's TOWERPLANT. Each COOLPLANT can contain multiple CHILLERs; chiller operation is controlled by the scheduling and staging logic of the COOLPLANT, as described in the previous section. - -Each chiller has primary and secondary pumps that operate when the chiller is on. The pumps add heat to the primary and secondary loop water respectively; this heat is considered in the modeling of the loop's water temperature. - -**chillerName** - -Name of CHILLER object, given immediately after the word CHILLER. This name is used to refer to the chiller in *cpStage* commands. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant - -The next four inputs allow specification of the CHILLER's capacity (amount of heat it can remove from the primary loop water) and how this capacity varies with the supply (leaving) temperature of the primary loop water and the entering temperature of the condenser (secondary loop) water. The chiller capacity at any supply and condenser temperatures is *chCapDs* times the value of *chPyCapT* at those temperatures. - -**chCapDs=*float*** - -Chiller design capacity, that is, the capacity at *chTsDs* and *chTcndDs* (next). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* != 0 Yes constant - -**chTsDs=*float*** - -Design supply temperature: temperature of primary water leaving chiller at which capacity is *chCapDs*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 44 No constant - -**chTcndDs=*float*** - -Design condenser temperature: temperature of secondary water entering chiller condenser at which capacity is *chCapDs*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 85 No constant - -**chPyCapT=*a, b, c, d, e, f*** - -Coefficients of bi-quadratic polynomial function of supply (ts) and condenser (tcnd) temperatures that specifies how capacity varies with these temperatures. This polynomial is of the form - -$$a + b \cdot ts + c \cdot ts^2 + d \cdot tcnd + e \cdot tcnd^2 + f \cdot ts \cdot tcnd$$ - -Up to six *float* values may be entered, separated by commas; CSE will use zero for omitted trailing values. If the polynomial does not evaluate to 1.0 when ts is chTsDs and tcnd is chTcndDs, a warning message will be issued and the coefficients will be adjusted (normalized) to make the value 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------------------- -------------- ----------------- - -1.742040, .029292, .000067, .048054, .000291, -.000106 No constant - -The next three inputs allow specification of the CHILLER's full-load energy input and how it varies with supply and condenser temperature. Only one of *chCop* and *chEirDs* should be given. The full-load energy input at any supply and condenser temperatures is the chiller's capacity at these temperatures, times *chEirDs* (or 1/*chCop*), times the value of *chPyEirT* at these temperatures. - -**chCop=*float*** - -Chiller full-load COP (Coefficient Of Performance) at *chTsDs*and *chTcndDs*. This is the output energy divided by the electrical input energy (in the same units) and reflects both motor and compressor efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* > 0 4.2 No constant - -**chEirDs=*float*** - -Alternate input for COP: Full-load Energy Input Ratio (electrical input energy divided by output energy) at design temperatures; the reciprocal of *chCop*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------- -------------- ----------------- - *x* > 0 *chCop* is defaulted No constant - -**chPyEirT=*a, b, c, d, e, f*** - -Coefficients of bi-quadratic polynomial function of supply (ts) and condenser (tcnd) temperatures that specifies how energy input varies with these temperatures. This polynomial is of the form - -$$a + b \cdot ts + c \cdot ts^2 + d \cdot tcnd + e \cdot tcnd^2 + f \cdot ts \cdot tcnd$$ - -Up to six *float* values may be entered, separated by commas; CSE will use zero for omitted trailing values. If the polynomial does not evaluate to 1.0 when ts is chTsDs and tcnd is chTcndDs, a warning message will be issued and the coefficients will be adjusted (normalized) to make the value 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------------------- -------------- ----------------- - 3.117600, -.109236, .001389, .003750, .000150, -.000375 No constant - -The next three inputs permit specification of the CHILLER's part load energy input. In the following the part load ratio (plr) is defined as the actual load divided by the capacity at the current supply and condenser temperatures. The energy input is defined as follows for four different plr ranges: - - --------------- ------------------------------------------------------- - full loadplr (part load ratio) = 1.0 - - Power input is full-load input, as described above. - - compressor 1.0 > plr $\ge$ *chMinUnldPlr* - unloading - region - - Power input is the full-load input times the value of - the *chPyEirUl* polynomial for the current plr, that - is, *chPyEirUl*(plr). - - false loading *chMinUnldPlr* > plr > *chMinFsldPlr* - region - - Power input in this region is constant at the value for - the low end of the compressor unloading region, i.e. - *chPyEirUl*(*chMinUnldPlr*). - - cycling region *chMinFsldPlr* > plr $\ge$ 0 - - In this region the chiller runs at the low end of the - false loading region for the necessary fraction of the - time, and the power input is the false loading value - correspondingly prorated, i.e. - *chPyEirUl*(*chMinUnldPlr*) plr / *chMinFsldPlr*. - --------------- ------------------------------------------------------- - -These plr regions are similar to those for a DX coil & compressor in an AIRHANDLER, Section 0. - -**chPyEirUl=*a, b, c, d*** - -Coefficients of cubic polynomial function of part load ratio (plr) that specifies how energy input varies with plr in the compressor unloading region (see above). This polynomial is of the form - -$$a + b \cdot plr + c \cdot plr^2 + d \cdot plr^3$$ - -Up to four *float* values may be entered, separated by commas; CSE will use zero for omitted trailing values. If the polynomial does not evaluate to 1.0 when plr is 1.0, a warning message will be issued and the coefficients will be adjusted (normalized) to make the value 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------- -------------- ----------------- - .222903, .313387, .463710, 0. No constant - -**chMinUnldPlr=*float*** - -Minimum compressor unloading part load ratio (plr); maximum false loading plr. See description above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.1 No constant - -**chMinFsldPlr=*float*** - -Minimum compressor false loading part load ratio (plr); maximum cycling plr. See description above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ *chMinFsldPlr* 0.1 No constant - -**chMotEff=*float*** - -Fraction of CHILLER compressor motor input power which goes to the condenser. For an open-frame motor and compressor, where the motor's waste heat goes to the air, enter the motor's efficiency: a fraction around .8 or .9. For a hermetic compressor, where the motor's waste heat goes to the refrigerant and thence to the condenser, use 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1 1.0 No constant - -**chMeter=*name*** - -Name of METER to which to accumulate CHILLER's electrical input energy. Category "Clg" is used. Note that two additional commands, *chppMtr* and *chcpMtr*, are used to specify meters for recording chiller pump input energy. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- -------------- -------------- ----------------- - *name of a METER* not recorded No constant - -The next six inputs specify this CHILLER's *PRIMARY PUMP*, which pumps chilled water from the chiller through the CHW coils connected to the chiller's COOLPLANT. - -**chppGpm=*float*** - -Chiller primary pump flow in gallons per minute: amount of water pumped from this chiller through the primary loop supplying the COOLPLANT's loads (CHW coils) whenever chiller is operating. Any excess flow over that demanded by coils is assumed to go through a bypass valve. If coil flows exceed *chppGpm*, CSE assumes the pressure drops and the pump "overruns" to deliver the extra flow with the same energy input. The default is one gallon per minute for each 5000 Btuh of chiller design capacity. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------ -------------- ----------------- - gpm *x* > 0 *chCapDs* / 5000 No constant - -**chppHdloss=*float*** - -Chiller primary pump head loss (pressure). 0 may be specified to eliminate pump heat and pump energy input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft H2O *x* $\ge$ 0 57.22\* No constant - -\* May be temporary default for 10-31-92 version; prior value (65) may be restored. - -**chppMotEff=*float*** - -Chiller primary pump motor efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .88 No constant - -**chppHydEff=*float*** - -Chiller primary pump hydraulic efficiency - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .70 No constant - -**chppOvrun=*float*** - -Chiller primary pump maximum overrun: factor by which flow demanded by coils can exceed *chppGpm*. The primary flow is not simulated in detail; *chppOvrun* is currently used only to issue an error message if the sum of the design flows of the coils connected to a COOLPLANT exceeds the sum of the products of *chppGpm* and *chppOvrun* for the chiller's in the plants most powerful stage. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 1.0 1.3 No constant - -**chppMtr=*name of a METER*** - -Meter to which primary pump electrical input energy is accumulated. If omitted, pump input energy use is not recorded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *name of a METER* *none* No constant - -The next five inputs specify this CHILLER's *CONDENSER PUMP*, also known as the *SECONDARY PUMP* or the *HEAT REJECTION PUMP*. This pump pumps water from the chiller's condenser through the cooling towers in the COOLPLANT's TOWERPLANT. - -**chcpGpm=*float*** - -Chiller condenser pump flow in gallons per minute: amount of water pumped from this chiller through the cooling towers when chiller is operating. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------ -------------- ----------------- - gpm *x* > 0 *chCapDs* / 4000 No constant - -**chcpHdloss=*float*** - -Chiller condenser pump head loss (pressure). 0 may be specified to eliminate pump heat and pump energy input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft H2O *x* $\ge$ 0 45.78\* No constant - -\* May be temporary default for 10-31-92 version; prior value (45) may be restored. - -**chcpMotEff=*float*** - -Chiller condenser pump motor efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .88 No constant - -**chcpHydEff=*float*** - -Chiller condenser pump hydraulic efficiency - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - 0 < *x* $\le$ 1.0 .70 No constant - -**chcpMtr=*name of a METER*** - -Meter to which condenser pump electrical input energy is accumulated. If omitted, pump input energy use is not recorded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *name of a METER* *none* No constant - -The following four members permit specification of auxiliary input power use associated with the chiller under the conditions indicated. - -**chAuxOn=*float*** - -Auxiliary power used when chiller is running, in proportion to its subhour average part load ratio (plr). - -**chAuxOff=*float*** - -Auxiliary power used when chiller is not running, in proportion to 1 - plr. - -**chAuxFullOff=*float*** - -Auxiliary power used only when chiller is off for entire subhour; not used if the chiller is on at all during the subhour. - -**chAuxOnAtAll=*float*** - -Auxiliary power used in full value if chiller is on for any fraction of subhour. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 0 No hourly - -The following four allow specification of meters to record chiller auxiliary energy use through chAuxOn, chAuxOff, chFullOff, and chAuxOnAtAll, respectively. End use category "Aux" is used. - -**chAuxOnMtr=*mtrName*** - -**chAuxOffMtr=*mtrName*** - -**chAuxFullOffMtr=*mtrName*** - -**chAuxOnAtAllMtr=*mtrName*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endChiller** - -Optionally indicates the end of the CHILLER definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/construction.md b/doc/test/resources/construction.md deleted file mode 100644 index 4c2172e65..000000000 --- a/doc/test/resources/construction.md +++ /dev/null @@ -1,34 +0,0 @@ -# CONSTRUCTION - -CONSTRUCTION constructs an object of class CONSTRUCTION that represents a light weight or massive ceiling, wall, floor, or mass assembly (mass assemblies cannot, obviously, be lightweight). Once defined, CONSTRUCTIONs can be referenced from SURFACEs (below). A defined CONSTRUCTION need not be referenced. Each CONSTRUCTION is optionally followed by LAYERs, which define the constituent LAYERs of the construction. - -**conName** - -Name of construction. Required for reference from SURFACE and DOOR objects, below. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* Yes constant - -**conU=*float*** - -U-value for the construction (NOT including surface (air film) conductances; see SURFACE statements). If omitted, one or more LAYERs must immediately follow to specify the LAYERs that make up the construction. If specified, no LAYERs can follow. - - -------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - ----------- --------- ----------- ------------ --------------- - Btuh/ft^2^- *x* $>$ 0 calculated if omitted, constant - ^o^F from LAYERs LAYERs must - follow - - -------------------------------------------------------------- - -**endConstruction** - -Optional to indicates the end of the CONSTRUCTION. Alternatively, the end of the CONSTRUCTION definition can be indicated by "END" or by beginning another object If END or endConstruction is used, it should follow the construction's LAYER subobjects, if any. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - diff --git a/doc/test/resources/coolplant.md b/doc/test/resources/coolplant.md deleted file mode 100644 index 61f86d7ee..000000000 --- a/doc/test/resources/coolplant.md +++ /dev/null @@ -1,93 +0,0 @@ -# COOLPLANT - -A COOLPLANT contains one or more CHILLER subobjects (Section 5.21.1). Each COOLPLANT supports one or more CHilled Water (CHW) cooling coils in AIRHANDLERs, and is supported by a TOWERPLANT (Section 5.22). The piping circuit connecting the cold-water (evaporator) side of the CHILLERs to the CHW coils is referred to as the *primary loop*; the piping connecting the warm-water (condenser) side of the CHILLERs to the cooling towers in the TOWERPLANT is referred to as the *secondary loop*. Flows in these loops are established primary and secondary (or heat rejection) by pumps in each CHILLER; these pumps operate when the CHILLER operates. - -The modeling of the CHW coils, COOLPLANTs, and CHILLERs includes modeling the supply temperature of the water in the primary loop, that is, the water supplied from the COOLPLANT's operating CHILLER(s) to the CHW coils. If the (negative) heat demanded by the connected coils exceeds the plant's capacity, the temperature rises and the available power is distributed among the AIRHANDLERs according to the operation of the CHW coil model. - -The primary water flow through each CHILLER is always at least that CHILLER's specified primary pump capacity -- it is assumed that any flow in excess of that used by the coils goes through a bypass value. When the coils request more flow than the pump's capacity, it is assumed the pressure drops and the pump can deliver the greater flow at the same power input and while imparting the same heat to the water. The primary water flow is not simulated during the run, but an error occurs before the run if the total design flow of the CHW coils connected to a COOLPLANT exceeds the pumping capacity of the CHILLERs in the plant's most powerful stage. - -The CHILLERs in the COOLPLANT can be grouped into *STAGES* of increasing capacity. The COOLPLANT uses the first stage that can meet the load. The load is distributed amoung the CHILLERs in the active stage so that each operates at the same fraction of its capacity; CHILLERs not in the active stage are turned off. - -For each COOLPLANT, primary loop piping loss is modeled, as a heat gain equal to a constant fraction of the CHILLER capacity of the COOLPLANT's most powerful stage. This heat gain is added to the load whenever the plant is operating; as modeled, the heat gain is independent of load, weather, which stage is operating, or any other variables. No secondary loop piping loss is modeled. - -**coolplantName** - -Name of COOLPLANT object, given immediately after the word COOLPLANT. This name is used to refer to the coolPlant in *ahhcCoolplant* commands. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant - -**cpSched=*choice*** - -Coolplant schedule: hourly variable choice of OFF, AVAIL, or ON. - - ------- -------------------------------------------------------------- - OFF COOLPLANT will not supply chilled water regardless of demand. - All loads (CHW coils) should be scheduled off when the plant - is off; an error will occur if a coil calls for chilled water - when its plant is off. - - AVAIL COOLPLANT will operate when one or more loads demand chilled - water. - - ON COOLPLANT runs unconditionally. When no load wants chilled - water, least powerful (first) stage runs anyway. - ------- -------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - OFF, AVAIL, or ON AVAIL No hourly - -**cpTsSp=*float*** - -Coolplant primary loop supply temperature setpoint: setpoint temperature for chilled water supplied to coils. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* > 0 44 No hourly - -**cpPipeLossF=*float*** - -Coolplant pipe loss: heat assumed gained from primary loop piping connecting chillers to loads whenever the COOLPLANT is operating, expressed as a fraction of the chiller capacity of the plant's most powerful stage. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .01 No constant - -**cpTowerplant=*name*** - -TOWERPLANT that cools the condenser water for the chillers in this COOLPLANT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - *name of a TOWERPLANT* Yes constant - -**cpStage1=chillerName, chillerName, chillerName, ...** - -**cpStage1=ALL\_BUT, chillerName, chillerName, chillerName, ...** - -**cpStage1=ALL** - -**cpStage2 through cpStage7 *same*** - -The commands *cpStage1* through *cpStage7* allow specification of up to seven *STAGES* in which chillers are activated as the load increases. CSE will use the first stage that can meet the load; if no stage will meet the load (output the heat requested by the coils at *cpTsSp*), the last COOLPLANT stage is used. - -Each stage may be specified with a list of up to seven names of CHILLERs in the COOLPLANT, or with the word ALL, meaning all of the COOLPLANT's CHILLERs, or with the word ALL\_BUT and a list of up to six names of CHILLERs. Each stage should be more powerful than the preceding one. If you have less than seven stages, you may skip some of the commands *cpStage1* through *cpStage7* -- the used stage numbers need not be contiguous. - -If none of *cpStage1* through *cpStage7* are given, CSE supplies a single default stage containing all chillers. - -A comma must be entered between chiller names and after the word ALL\_BUT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------------------- ------------------ -------------- ----------------- - 1 to 7 names; ALL\_BUT and 1 to 6 names; ALL *cpStage1* = ALL No constant - -**endCoolplant** - -Optionally indicates the end of the COOLPLANT definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - diff --git a/doc/test/resources/cullist-snippet.txt b/doc/test/resources/cullist-snippet.txt deleted file mode 100644 index d1520841f..000000000 --- a/doc/test/resources/cullist-snippet.txt +++ /dev/null @@ -1,14 +0,0 @@ - -CSE 0.816 for Win32 console -Command line: -c - -Top - doAutoSize - doMainSim - - -material Parent: Top - matThk - matCond - - diff --git a/doc/test/resources/cullist.txt b/doc/test/resources/cullist.txt deleted file mode 100644 index b57eb66f1..000000000 --- a/doc/test/resources/cullist.txt +++ /dev/null @@ -1,909 +0,0 @@ - -CSE 0.816 for Win32 console -Command line: -c - -Top - doAutoSize - doMainSim - begDay - endDay - jan1DoW - wuDays - nSubSteps - skipDayStart - skipDayStep - wfName - elevation - refTemp - refRH - grndRefl - soilDiff - tol - humTolF - ebTolMon - ebTolDay - ebTolHour - ebTolSubhr - AWTrigT - AWTrigSlr - AWTrigH - ANTolAbs - ANTolRel - bldgAzm - skymodel - skymodelLW - dhwModel - humMeth - dflExH - workDayMask - DT - DTbegDay - DTendDay - terrainClass - windSpeedMin - windF - radBeamF - radDiffF - verbose - dbgPrintMask - dbgPrintMaskC - ventAvail - auszTol - heatDsTDbO - heatDsTWbO - coolDsMo - coolDsDay - runSerial - runTitle - BinResFile - BinResFileHourly - BinResFileName - repHdrL - repHdrR - repCpl - repLpp - repTopM - repBotM - repTestPfx - run - clear - - -material Parent: Top - matThk - matCond - matCondT - matCondCT - matSpHt - matDens - matRNom - endMaterial - - -construction Parent: Top - conU - endConstruction - - -layer Parent: construction - lrThk - lrMat - lrFrmMat - lrFrmFrac - endLayer - - -glazeType Parent: Top - gtSHGC - gtSMSO - gtSMSC - gtFMult - gtPySHGC - gtDMSHGC - gtDMRBSol - gtU - gtUNFRC - gtModel - gtNGlz - gtExShd - gtInShd - gtDirtLoss - endGlazeType - - -zone Parent: Top - znModel - znArea - znVol - znFloorZ - znCeilingHt - znCAir - znHIRatio - znAzm - znSC - znTH - znTD - znTC - znQMxH - znQMxHRated - znQMxC - znQMxCRated - znRsys - znHcFrcF - znHcAirX - infAC - infELA - infShld - infStories - znEaveZ - znWindFLkg - xfanFOn - xfanVfDs - xfanPress - xfanEff - xfanShaftBhp - xfanElecPwr - xfanMtr - endZone - - -surface Parent: zone - sfType - sfArea - sfTilt - sfAzm - sfModel - sfDepthBG - sfCon - sfU - sfLThkF - sfInH - sfExH - sfExCnd - sfExT - sfExT - sfExAbs - sfExRf - sfInAbs - sfExEpsLW - sfInEpsLW - sfExHcModel - sfExHcLChar - sfExHcMult - sfExCTaDbAvgYr - sfExCTaDbAvg31 - sfExCTaDbAvg14 - sfExCTaDbAvg07 - sfExCTGrnd - sfExRConGrnd - sfInHcModel - sfInHcMult - sfAdjZn - sfGrndRefl - endSurface - - -window Parent: surface - wnArea - wnWidth - wnHeight - wnMult - wnGt - wnSHGC - wnFMult - wnUNFRC - wnModel - wnNGlz - wnExShd - wnInShd - wnDirtLoss - wnU - wnInH - wnExH - wnExEpsLW - wnInEpsLW - wnExHcModel - wnExHcLChar - wnExHcMult - wnInHcModel - wnInHcMult - wnSMSO - wnSMSC - wnGrndRefl - wnVfSkyDf - wnVfGrndDf - endWindow - - -sgdist Parent: window - sgSurf - sgSide - sgFSO - sgFSC - endSgdist - - -shade Parent: window - ohDepth - ohDistUp - ohExL - ohExR - ohFlap - lfDepth - lfTopUp - lfDistL - lfBotUp - rfDepth - rfTopUp - rfDistR - rfBotUp - endShade - - -door Parent: surface - drArea - drModel - drCon - drU - drLThkF - drInH - drExH - drExAbs - drInAbs - drExEpsLW - drInEpsLW - drExHcModel - drExHcLChar - drExHcMult - drInHcModel - drInHcMult - endDoor - - -perimeter Parent: zone - prLen - prF2 - endPerimeter - - -terminal Parent: zone - tuTLh - tuQMnLh - tuQMxLh - tuPriLh - tuLhNeedsFlow - tuhcType - tuhcCaptRat - tuhcHeatplant - tuhcMtr - tuTH - tuTC - tuVfMn - tuAh - tuVfMxH - tuVfMxC - tuVfDs - tuVfMxHC - tuOversize - tuPriH - tuPriC - tuSRLeak - tuSRLoss - tfanSched - tfanOffLeak - tfanType - tfanVfDs - tfanPress - tfanEff - tfanMtr - tfanCurvePy - endTerminal - - -gain Parent: zone - gnZone - gnPower - gnMeter - gnEndUse - gnFrLat - gnFrRad - gnFrZn - gnFrPl - gnFrRtn - gnDlFrPow - gnCtrlDHWSYS - gnCtrlDHWEndUse - endGain - - -izXfer Parent: Top - izZn1 - izZn2 - izHConst - izNVType - izALo - izAHi - izL1 - izL2 - izStairAngle - izHD - izNVEff - izCpr - izExp - izVfMin - izVfMax - izASEF - izLEF - izVfExhRat - izEATR - izFanVfDs - izFanPress - izFanEff - izFanShaftBhp - izFanElecPwr - izFanMtr - izFanEndUse - izFanCurvePy - endIzxfer - - -rsys Parent: Top - rsType - rsDesc - rsPerfMap - rsFanTy - rsFanMotTy - rsModeCtrl - rsElecMtr - rsFuelMtr - rsTdDesH - rsTdDesC - rsFxCapH - rsFxCapAuxH - rsFxCapC - rsAFUE - rsCapH - rsHSPF - rsCap47 - rsCOP47 - rsCap35 - rsCOP35 - rsCap17 - rsCOP17 - rsCdH - rsCapAuxH - rsCOPAuxH - rsASHPLockOutT - rsFanPwrH - rsSEER - rsEER - rsCapC - rsFChg - rsFSize - rsCdC - rsVFPerTon - rsFanPwrC - rsParElec - rsParFuel - rsRhIn - rsTdbOut - rsDSEH - rsDSEC - rsOAVType - rsOAVReliefZn - rsOAVTDbInlet - rsOAVTdiff - rsOAVVfDs - rsOAVVfMinF - rsOAVFanPwr - endRSYS - - -ductSeg Parent: rsys - dsTy - dsExArea - dsInArea - dsDiameter - dsLength - dsExCnd - dsAdjZn - dsExT - dsEpsLW - dsInsulR - dsInsulMat - dsLeakF - dsExH - endDuctSeg - - -dhwdayuse Parent: Top - wduMult - endDHWDAYUSE - - -dhwuse Parent: dhwdayuse - wuHWEndUse - wuStart - wuFlow - wuDuration - wuTemp - wuHotF - wuHeatRecEF - wuEventID - endDHWUSE - - -dhwmeter Parent: Top - endDHWMETER - - -dhwsys Parent: Top - wsCentralDHWSYS - wsLoadShareDHWSYS - wsCalcMode - wsMult - wsTInlet - wsUse - wsTUse - wsTSetpoint - wsDayUse - wsWHhwMtr - wsFXhwMtr - wsParElec - wsSDLM - wsDSM - wsSSF - wsWF - wsElecMtr - wsFuelMtr - endDHWSYS - - -dhwheater Parent: dhwsys - whMult - whType - whHeatSrc - whZone - whTEx - whASHPType - whASHPSrcZn - whASHPSrcT - whASHPResUse - whVol - whEF - whResHtPwr - whResTHPwr2 - whLDEF - whHPAF - whEff - whSBL - whPilotPwr - whParElec - whElecMtr - whFuelMtr - endDHWHEATER - - -dhwtank Parent: dhwsys - wtMult - wtUA - wtVol - wtInsulR - wtTEx - wtTTank - wtXLoss - endDHWTANK - - -dhwpump Parent: dhwsys - wpMult - wpElecMtr - wpPwr - endDHWPUMP - - -dhwloop Parent: dhwsys - wlMult - wlFlow - wlTIn1 - wlRunF - wlFUA - endDHWLOOP - - -dhwloopSeg Parent: dhwloop - wgTy - wgLength - wgSize - wgInsulK - wgInsulThk - wgExH - wgExT - wgFNoDraw - endDHWLOOPSEG - - -dhwloopBranch Parent: dhwloopSeg - wbMult - wbLength - wbSize - wbInsulK - wbInsulThk - wbExH - wbExT - wbFlow - wbFWaste - endDHWLOOPBRANCH - - -dhwloopPump Parent: dhwloop - wlpMult - wlpElecMtr - wlpPwr - endDHWLOOPPUMP - - -pvarray Parent: Top - pvElecMtr - pvEndUse - pvDCSysSize - pvModuleType - pvCoverRefrInd - pvTempCoeff - pvArrayType - pvTilt - pvAzm - pvGrndRefl - pvGCR - pvDCtoACRatio - pvInverterEff - pvSysLosses - pvUsePVWatts - endPVARRAY - - -airHandler Parent: Top - ahSched - fanOversize - sfanType - sfanVfDs - sfanVfMxF - sfanPress - sfanEff - sfanShaftBhp - sfanElecPwr - sfanMotEff - sfanMotPos - sfanCurvePy - sfanMtr - rfanType - rfanVfDs - rfanVfMxF - rfanPress - rfanEff - rfanShaftBhp - rfanElecPwr - rfanMotEff - rfanMotPos - rfanCurvePy - rfanMtr - cchCM - cchPMx - cchPMn - cchTMx - cchTMn - cchDT - cchTOn - cchTOff - cchMtr - coilOversize - ahhcType - ahhcSched - ahhcCaptRat - ahhcHeatplant - ahhcEffR - ahhcEirR - ahhcPyEi - ahhcStackEffect - ahhcMtr - ahhcAuxOn - ahhcAuxOnMtr - ahhcAuxOff - ahhcAuxOffMtr - ahhcAuxOnAtall - ahhcAuxOnAtallMtr - ahhcAuxFullOff - ahhcAuxFullOffMtr - ahpCap17 - ahpCap47 - ahpCap35 - ahpFd35Df - ahpCapIa - ahpSupRh - ahpTFrMn - ahpTFrMx - ahpTFrPk - ahpDfrFMn - ahpDfrFMx - ahpDfrCap - ahpDfrRh - ahpTOff - ahpTOn - ahpIn17 - ahpIn47 - ahpInIa - ahpCd - ahccSHR - ahccType - ahccSched - ahccCaptRat - ahccCapsRat - ahccK1 - ahccMinTEvap - ahccDsTDbCnd - ahccDsTDbEn - ahccDsTWbEn - ahccVfR - ahccVfRperTon - ahccEirR - ahccMinUnldPlr - ahccMinFsldPlr - pydxCaptT - pydxCaptF - pydxCaptFLim - pydxEirT - pydxEirUl - ahccCoolplant - ahccGpmDs - ahccNtuoDs - ahccNtuiDs - ahccBypass - ahFanCycles - ahccMtr - ahccAuxOn - ahccAuxOnMtr - ahccAuxOff - ahccAuxOffMtr - ahccAuxOnAtall - ahccAuxOnAtallMtr - ahccAuxFullOff - ahccAuxFullOffMtr - ahTsSp - ahTsMn - ahTsMx - ahTsRaMn - ahTsRaMx - ahTsDsH - ahTsDsC - ahCtu - ahWzCzns - ahCzCzns - oaMnCtrl - oaMnFrac - oaVfDsMn - oaEcoType - oaLimT - oaLimE - oaOaLeak - oaRaLeak - ahSOLeak - ahROLeak - ahSOLoss - ahROLoss - endAirhandler - - -meter Parent: Top - mtrRate - mtrDemandRate - endMeter - - -reportCol Parent: Top - colReport - colHead - colGap - colWid - colDec - colJust - colVal - endReportcol - - -exportCol Parent: Top - colExport - colHead - colWid - colDec - colJust - colVal - endExportcol - - -report Parent: Top - rpReportfile - rpZone - rpMeter - rpAh - rpDHWMeter - rpTu - rpType - rpFreq - rpDayBeg - rpDayEnd - rpBtuSf - rpCond - rpTitle - rpCpl - rpHeader - rpFooter - endReport - - -export Parent: Top - exExportfile - exZone - exMeter - exAh - exDHWMeter - exTu - exType - exFreq - exDayBeg - exDayEnd - exBtuSf - exCond - exTitle - exHeader - exFooter - endExport - - -reportfile Parent: Top - rfFileName - rfFileStat - rfPageFmt - endReportFile - - -exportfile Parent: Top - xfFileName - xfFileStat - endExportFile - - -importfile Parent: Top - imFileName - imTitle - imFreq - imHeader - imBinary - endImportFile - - -heatPlant Parent: Top - hpSched - hpPipeLossF - hpStage1 - hpStage2 - hpStage3 - hpStage4 - hpStage5 - hpStage6 - hpStage7 - endHeatplant - - -boiler Parent: heatPlant - blrCap - blrEffR - blrEirR - blrPyEi - blrMtr - blrpGpm - blrpHdLoss - blrpMotEff - blrpHydEff - blrpMtr - blrAuxOn - blrAuxOnMtr - blrAuxOff - blrAuxOffMtr - blrAuxOnAtall - blrAuxOnAtallMtr - blrAuxFullOff - blrAuxFullOffMtr - endBoiler - - -coolPlant Parent: Top - cpSched - cpTsSp - cpPipeLossF - cpTowerplant - cpStage1 - cpStage2 - cpStage3 - cpStage4 - cpStage5 - cpStage6 - cpStage7 - endCoolplant - - -chiller Parent: coolPlant - chCapDs - chTsDs - chTcndDs - chPyCapT - chCop - chEirDs - chPyEirT - chPyEirUl - chMinUnldPlr - chMinFsldPlr - chMotEff - chMtr - chppGpm - chppHdLoss - chppMotEff - chppHydEff - chppOvrunF - chppMtr - chcpGpm - chcpHdLoss - chcpMotEff - chcpHydEff - chcpMtr - chAuxOn - chAuxOnMtr - chAuxOff - chAuxOffMtr - chAuxOnAtall - chAuxOnAtallMtr - chAuxFullOff - chAuxFullOffMtr - endChiller - - -towerPlant Parent: Top - ctN - tpStg - tpTsSp - tpMtr - ctType - ctLoSpd - ctShaftBhp - ctMotEff - ctFcOne - ctFcLo - ctFcHi - ctFcVar - ctCapDs - ctVfDs - ctGpmDs - ctTDbODs - ctTWbODs - ctTwoDs - ctCapOd - ctVfOd - ctGpmOd - ctTDbOOd - ctTWbOOd - ctTwoOd - ctK - ctStkFlFr - ctBldn - ctDrft - ctTWm - endTowerplant - - -holiday Parent: Top - hdDateTrue - hdDateObs - hdOnMonday - hdCase - hdDow - hdMon - endHoliday diff --git a/doc/test/resources/dhwheater.md b/doc/test/resources/dhwheater.md deleted file mode 100644 index d01f99198..000000000 --- a/doc/test/resources/dhwheater.md +++ /dev/null @@ -1,246 +0,0 @@ -# DHWHEATER - -DHWHEATER constructs an object representing a domestic hot water heater (or several if identical). - -**whName** - -Optional name of water heater; give after the word “DHWHEATER” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**whMult=*integer*** - -Number of identical water heaters of this type. Any value $>1$ is equivalent to repeated entry of the same DHWHEATER. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**whType=*choice*** - -Specifies type of water heater. - - --------------------- --------------------------------------- - SMALLSTORAGE A gas-fired storage water heater with - input of 75,000 Btuh or less, an - oil-fired storage water heater with - input of 105,000 Btuh or less, an - electric storage water heater with - input of 12 kW or less, or a heat pump - water heater rated at 24 amps or less. - - LARGESTORAGE Any storage water heater that is not - SMALLSTORAGE. - - SMALLINSTANTANEOUS A water heater that has an input rating - of at least 4,000 Btuh per gallon of - stored water. Small instantaneous water - heaters include: gas instantaneous - water heaters with an input of 200,000 - Btu per hour or less, oil instantaneous - water heaters with an input of 210,000 - Btu per hour or less, and electric - instantaneous water heaters with an - input of 12 kW or less. - - LARGEINSTANTANEOUS An instantaneous water heater that does - not conform to the definition of - SMALLINSTANTANEOUS, an indirect - fuel-fired water heater, or a hot water - supply boiler. - --------------------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- -------------- -------------- ----------------- - *Codes listed above* SMALLSTORAGE No constant - -**whHeatSrc=*choice*** - -Specifies heat source for water heater. - - ------------- --------------------------------------- - RESISTANCE Electric resistance heating element. - - ASHP Air source heat pump - - ASHPX Air source heat pump (detailed HPWH - model) - - FUEL Fuel-fired burner - ------------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - *Codes listed above* FUEL No constant - -**whVol=*float*** - -Specifies tank volume. Documentation only. Must be omitted or 0 for instantaneous whTypes. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - gal $\ge$ 0 0 No constant - -**whEF=*float*** - -Rated energy factor, used in modeling whType SMALLSTORAGE and SMALLINSTANTANEOUS. - - ----------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - ---------- --------- ----------- -------------------- ----------------- - $>$ 0 .82 When whType = constant - SMALLSTORAGE and - whLDEF not - specified or - SMALLINSTANTANEOUS - - ----------------------------------------------------------------------- - -**whLDEF=*float*** - -Load-dependent energy factor, used in modeling whType SMALLSTORAGE. - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- -------------- -------------- ---------------- - $>$ 0 Calculated via When whType = constant - DHWSYS PreRun SMALLSTORAGE - mechanism and PreRun not - used - - ------------------------------------------------------------------ - -**whZone=*znName*** - -Name of zone where water heater is located. Zone conditions are for tank heat loss calculations and default for whASHPSrcZn (see below). No effect unless whHeatSrc = ASHPX. whZone and whTEx cannot both be specified. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - name of a ZONE Not in zone No constant - -**whTEx=*float*** - -Water heater surround temperature. No effect unless whHeatSrc=ASHPX. whZone and whTEx cannot both be specified. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------------- -------------- ----------------- - ^o^F $\ge$ 0 whZone air temperature if specified, else 70 ^o^F No hourly - -**whASHPType=*choice*** - -Specifies type of air source heat pump, valid only if whHeatSrc=ASHPX. These choice are those supported by Ecotope HPWH model. - - ------------------ --------------------------------------- - Voltex60 - - Voltex80 - - GEGeospring - - BasicIntegrated Typical integrated HPWH - - ResTank Resistance-only water heater (no - compressor) - ------------------ --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- ---------------------- ----------------- - *Codes listed above* -- When whHeatSrc=ASHPX constant - -**whASHPSrcZn=*znName*** - -Name of zone that serves as heat source when whHeatSrc = ASHPX. Used for tank heat loss calculations and default for whASHPSrcZn. Illegal unless whHeatSrc = ASHPX. whASHPSrcZn and whASHPSrcT cannot both be specified. - - ----------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability - **Range** ** - ----------- --------------- --------------- ------------- ------------- - name of a ZONE Same as whZone No constant - if whASHPSrcT - not specified. - If no zone is - specified by - input or - default, heat - extracted by - ASHP has no - effect. - ----------------------------------------------------------------------- - -**whASHPSrcT=*float*** - -ASHP source air temperature. Illegal unless whHeatSrc=ASHPX. whASHPSrcZn and whASHPSrcT cannot both be specified. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------------------------------------- -------------- ----------------- - ^o^F $\ge$ 0 whASHPZn air temperature if specified, else 70 ^o^F No hourly - -**whHPAF=*float*** - -Heat pump adjustment factor, used when modeling whType=SMALLSTORAGE and whHeatSrc=ASHP. This value should be derived according to App B Table B-6. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ----------------------------------------------- ----------------- - $>$ 0 1 When whType=SMALLSTORAGE and whHeatSrc = ASHP constant - -**whEff=*float*** - -Water heating efficiency, used in modeling LARGESTORAGE and LARGEINSTANTANEOUS. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 < whEff $\leq$ 1 .82 No constant - -**whSBL=*float*** - -Standby loss, used in modeling LARGESTORAGE - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh $\ge$ 0 0 No constant - -**whPilotPwr=*float*** - -Pilot light consumption, included in energy use of DHWHEATERs with whHeatSrc=FUEL. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh $\ge$ 0 0 No hourly - -**whParElec=*float*** - -Parasitic electricity power, included in energy use of all DHWHEATERs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W $\ge$ 0 0 No hourly - -whElecMtr=*mtrName* - -Name of METER object, if any, by which DHWHEATER electrical energy use is recorded (under end use DHW). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- --------------------------- -------------- ----------------- - *name of a METER* *Parent DHWSYS wsElecMtr* No constant - -**whFuelMtr =*mtrName*** - -Name of METER object, if any, by which DHWHEATER fuel energy use is recorded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- --------------------------- -------------- ----------------- - *name of a METER* *Parent DHWSYS wsFuelMtr* No constant - -**endDHW** - -HeaterOptionally indicates the end of the DHWHEATER definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwloop.md b/doc/test/resources/dhwloop.md deleted file mode 100644 index b67d567cb..000000000 --- a/doc/test/resources/dhwloop.md +++ /dev/null @@ -1,59 +0,0 @@ -# DHWLOOP - -DHWLOOP constructs one or more objects representing a domestic hot water circulation loop. The actual pipe runs in the DHWLOOP are specified by any number of DHWLOOPSEGs (see below). Circulation pumps are specified by DHWLOOPPUMPs (also below). - -**wlName** - -Optional name of loop; give after the word “DHWLOOP” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wlMult=*integer*** - -Number of identical loops of this type. Any value $>1$ is equivalent to repeated entry of the same DHWLOOP (and all child objects). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wlFlow=*float*** - -Loop flow rate (when operating). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - gpm $\ge$ 0 6 No hourly - -**wlTIn1=*float*** - -Inlet temperature of first DHWLOOPSEG. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $>$ 0 130 No hourly - -**wlRunF=*float*** - -Fraction of hour that loop circulation operates. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - -- $\ge$ 0 1 No hourly - -**wlFUA=*float*** - -DHWLOOPSEG pipe heat loss adjustment factor. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - -- $>$ 0 1 No constant - -**endDHWLoop** - -Optionally indicates the end of the DHWLOOP definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No diff --git a/doc/test/resources/dhwloopbranch.md b/doc/test/resources/dhwloopbranch.md deleted file mode 100644 index da63fac26..000000000 --- a/doc/test/resources/dhwloopbranch.md +++ /dev/null @@ -1,91 +0,0 @@ -# DHWLOOPBRANCH - -DHWLOOPBRANCH constructs one or more objects representing a branch pipe from the preceeding DHWLOOPSEG. A DHWLOOPSEG can have any number of DHWLOOPBRANCHs to represent pipe runs with differing sizes, insulation, or surrounding conditions. - -wbNameOptional name of segment; give after the word “DHWLOOPBRANCH” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wbMult=*float*** - -Specifies the number of identical DHWLOOPBRANCHs. Note may be non-integer. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - -- $>$ 0 1 No constant - -**wbLength=*float*** - -Length of branch. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft $\ge$ 0 0 No constant - -**wbSize=*float*** - -Nominal size of pipe. CSE assumes the pipe outside diameter = size + 0.125 in. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - in $>$ 0 -- Yes constant - -**wbInsulK=*float*** - -Pipe insulation conductivity - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------------ ----------------- ------------- -------------- ----------------- - Btuh-ft/ft^2^-^o^F $>$ 0 0.02167 No constant - -**wbInsulThk=*float*** - -Pipe insulation thickness - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - in $\ge$ 0 1 No constant - -**wbExH=*float*** - -Combined radiant/convective exterior surface conductance between insulation (or pipe if no insulation) and surround. - - **Units** **Legal Range** **Default** **Required** **Variability** - --------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F $>$ 0 1.5 No hourly - -**wbExT=*float*** - -Surrounding equivalent temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $>$ 0 70 No hourly - -**wbFlow=*float*** - -Branch flow rate during draw. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - gpm $\ge$ 0 2 No hourly - -**wgFWaste=*float*** - -Number of times during the hour when the branch volume is discarded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $\ge$ 0 0 No hourly - -**endDHWLoopBranch** - -Optionally indicates the end of the DHWLOOPBRANCH definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwlooppump.md b/doc/test/resources/dhwlooppump.md deleted file mode 100644 index 14856758f..000000000 --- a/doc/test/resources/dhwlooppump.md +++ /dev/null @@ -1,45 +0,0 @@ -# DHWLOOPPUMP - -DHWLOOPPUMP constructs an object representing a pump serving part a DHWLOOP. The model is identical to DHWPUMP *except* that that the electricity use calculation reflects wlRunF of the parent DHWLOOP. - -**wlpName** - -Optional name of pump; give after the word “DHWLOOPPUMP” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wlpMult=*integer*** - -Number of identical pumps of this type. Any value $>1$ is equivalent to repeated entry of the same DHWPUMP. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wlpPwr=*float*** - -Pump power. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W $>$ 0 0 No hourly - -**wlpElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWLOOPPUMP electrical energy use is recorded (under end use DHW). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- --------------------------- -------------- ----------------- - *name of a METER* *Parent DHWSYS wsElecMtr* No constant - -**endDHWPump** - -Optionally indicates the end of the DHWPUMP definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwloopseg.md b/doc/test/resources/dhwloopseg.md deleted file mode 100644 index b89b20090..000000000 --- a/doc/test/resources/dhwloopseg.md +++ /dev/null @@ -1,95 +0,0 @@ -# DHWLOOPSEG - -DHWLOOPSEG constructs one or more objects representing a segment of the preceeding DHWLOOP. A DHWLOOP can have any number of DHWLOOPSEGs to represent the segments of the loop with possibly differing sizes, insulation, or surrounding conditions. - -**wgName** - -Optional name of segment; give after the word “DHWLOOPSEG” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wgTy=*choice*** - -Specifies the type of segment - - --------- --------------------------------------- - SUPPLY Indicates a supply segment (flow is sum - of circulation and draw flow, child - DHWLOOPBRANCHs permitted). - - RETURN Indicates a return segment (flow is - only due to circulation, child - DHWLOOPBRANCHs not allowed) - --------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - -- -- Yes constant - -**wgLength=*float*** - -Length of segment. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft $\ge$ 0 0 No constant - -**wgSize=*float*** - -Nominal size of pipe. CSE assumes the pipe outside diameter = size + 0.125 in. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - in $>$ 0 1 Yes constant - -**wgInsulK=*float*** - -Pipe insulation conductivity - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------------ ----------------- ------------- -------------- ----------------- - Btuh-ft/ft^2^-^o^F $>$ 0 0.02167 No constant - -**wgInsulThk=*float*** - -Pipe insulation thickness - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - in $\ge$ 0 1 No constant - -**wgExH=*float*** - -Combined radiant/convective exterior surface conductance between insulation (or pipe if no insulation) and surround. - - **Units** **Legal Range** **Default** **Required** **Variability** - --------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F $>$ 0 1.5 No hourly - -**wgExT=*float*** - -Surrounding equivalent temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $>$ 0 70 No hourly - -**wgFNoDraw=*float*** - -Fraction of hour when no draw occurs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $>$ 0 70 No hourly - -**endDHWLoopSeg** - -Optionally indicates the end of the DHWLOOPSEG definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwpump.md b/doc/test/resources/dhwpump.md deleted file mode 100644 index 508bc230b..000000000 --- a/doc/test/resources/dhwpump.md +++ /dev/null @@ -1,45 +0,0 @@ -# DHWPUMP - -DHWPUMP constructs an object representing a domestic hot water circulation pump (or more than one if identical). - -**wpName** - -Optional name of pump; give after the word “DHWPUMP” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wpMult=*integer*** - -Number of identical pumps of this type. Any value $>1$ is equivalent to repeated entry of the same DHWPUMP. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wpPwr=*float*** - -Pump power. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W $>$ 0 0 No hourly - -**wpElecMtr=*mtrName*** - -Name of METER object, if any, to which DHWPUMP electrical energy use is recorded (under end use DHW). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- --------------------------- -------------- ----------------- - *name of a METER* *Parent DHWSYS wsElecMtr* No constant - -**endDHWPump** - -Optionally indicates the end of the DHWPUMP definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwsys.md b/doc/test/resources/dhwsys.md deleted file mode 100644 index 32e3007a8..000000000 --- a/doc/test/resources/dhwsys.md +++ /dev/null @@ -1,139 +0,0 @@ -# DHWSYS - -DHWSYS constructs an object representing a domestic hot water system consisting of one or more hot water heaters, storage tanks, loops, and pumps (DHWHEATER, DHWTANK, DHWLOOP, and DHWPUMP, see below) and a distribution system characterized by loss parameters. This model is based on Appendix B of the 2016 Residential ACM Reference Manual. This version is preliminary, revisions are expected. - -The parent-child structure of DHWSYS components is determined by input order. For example, DHWHEATERs belong to DHWSYS that preceeds them in the input file. The following hierarchy shows the relationship among components. Note that any of the commands can be repeated any number of times. - -- DHWSYS - - DHWHEATER - - DHWTANK - - DHWPUMP - - DHWLOOP - - DHWLOOPPUMP - - DHWLOOPSEG - - DHWLOOPBRANCH - -No actual controls are modeled. For example, if several DHWHEATERs are included in a DHWSYS, an equal fraction of the required hot water is assumed to be produced by each heater, even if they are different types or sizes. Thus a DHWSYS is in some ways just a collection of components, rather than a physically realistic system. - -**wsName** - -Optional name of system; give after the word “DHWSYS” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wsMult=*integer*** - -Number of identical systems of this type (including all child objects). Any value $> 1$ is equivalent to repeated entry of the same DHWSYSs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wsTInlet=*float*** - -Specifies cold (mains) water temperature supplied to DHWHEATERs in this DHWSYS. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------ -------------- ----------------- - ^o^F $>$ 32 ^o^F Mains temp from weather file No hourly - -**wsUse=*float*** - -Specifies hourly hot water use (at the point of use) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - gal $\ge$ 0 0 No hourly - -**wsTUse=*float*** - -Specifies hot water use temperature (at the point of use) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $>$ 32 ^o^F 130 No hourly - -**wsParElec=*float*** - -Specifies electrical parasitic power to represent recirculation pumps or other system-level electrical devices. Calculated energy use is accumulated to the METER specified by wsElecMtr (end use DHW). No other effect, such as heat gain to surroundings, is modeled. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W $>$ 0 0 No hourly - -**wsSDLM=*float*** - -Specifies the standard distribution loss multiplier. See App B Eqn 4. To duplicate CEC 2016 methods, this value should be set according to the value derived with App B Eqn 5. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wsDSM=*float*** - -Specifies the distribution system multiplier. See App B Eqn 4. To duplicate CEC 2016 methods, wsDSM should be set to the appropriate value from App B Table B-2. Note the NCF (non-compliance factor) included in App B Eqn 4 is *not* a CSE input and thus must be applied externally to wsDSM. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -**wsSSF=*float*** - -Specifies the solar savings fraction. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $\ge$ 0 0 No hourly - -**wsHRDL=*float*** - -Specifies the hourly recirculation distribution loss. TODO: the implementation will be expanded to evaluate HRDL during the simulation to allow use of hourly values. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $\ge$ 0 0 No constant - -**wsElecMtr=*mtrName*** - -Name of METER object, if any, by which DHWSYS\* electrical energy use is recorded (under end use DHW). In addition, wsElecMtr provides the default whElectMtr selection for all DHWHEATERs and DHWPUMPs in this DHWSYS. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**wsFuelMtr =*mtrName*** - -Name of METER object, if any, by which DHWSYS’s fuel energy use is reco\*rded (under end use DWH). DHWSYS fuel use is usually (always?) 0, so the primary use of this input is to specify the default whFuelMtr choice for DHWHEATERs in this DHWSYS. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**wsCalcMode=*choice*** - - ----------- --------------------------------------- - PRERUN Calculate hot water heating load; at - end of run, derive whLDEF for all child - DHWHEATERs for which that value is - required and defaulted. This procedure - emulates methods used in the T24DHW.DLL - implementation of CEC DHW procedures. - - SIMULATE Perform full modeling calculations - ----------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - *Codes listed above* SIMULATE No - -**endDHWSys** - -Optionally indicates the end of the DHWSYS definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/dhwtank.md b/doc/test/resources/dhwtank.md deleted file mode 100644 index 2f84719e1..000000000 --- a/doc/test/resources/dhwtank.md +++ /dev/null @@ -1,81 +0,0 @@ -# DHWTANK - -DHWTANK constructs an object representing one or more unfired water storage tanks in a DHWSYS. DHWTANK heat losses contribute to the water heating load. - -**wtName** - -Optional name of tank; give after the word “DHWTANK” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wtMult=*integer*** - -Number of identical tanks of this type. Any value $>1$ is equivalent to repeated entry of the same DHWTANK. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - $>$ 0 1 No constant - -Tank heat loss is calculated hourly (note that default heat loss is 0) -- - -$$\text{qLoss} = \text{wtMult} \cdot (\text{wtUA} \cdot (\text{wtTTank} - \text{wtTEx}) + \text{wtXLoss})$$ - -**wtUA=*float*** - -Tank heat loss coefficient. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------- -------------- ----------------- - Btuh/^o^F $\ge$ 0 Derived from wtVol and wtInsulR No constant - -**wtVol=*float*** - -Specifies tank volume. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - gal $\ge$ 0 0 No constant - -**wtInsulR=*float*** - -Specifies total tank insulation resistance. The input value should represent the total resistance from the water to the surroundings, including both built-in insulation and additional exterior wrap insulation. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - ft^2^-^o^F/Btuh $\ge$ .01 0 No constant - -**wtTEx=*float*** - -Tank surround temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F $\ge$ 0 70 No hourly - -**wtTTank=*float*** - -Tank average water temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - ^o^F $>$ 32 ^o^F Parent DHWSYSTEM wsTUse No hourly - -**wtXLoss=*float*** - -Additional tank heat loss. To duplicate CEC 2016 procedures, this value should be used to specify the fitting loss of 61.4 Btuh. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh (any) 0 No hourly - -**endDHWTank** - -Optionally indicates the end of the DHWTANK definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/door.md b/doc/test/resources/door.md deleted file mode 100644 index 487913efb..000000000 --- a/doc/test/resources/door.md +++ /dev/null @@ -1,148 +0,0 @@ -# DOOR - -DOOR constructs a subobject belonging to the current SURFACE. The azimuth, tilt, ground reflectivity and exterior conditions associated with the door are the same as those of the owning surface, although the exterior surface conductance and the exterior absorptivity can be altered. - -**drName** - -Name of door. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**drArea=*float*** - -Overall area of door. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $>$ 0 *none* Yes constant - -**drModel=*choice*** - -Provides user control over how program models this door: - - ----------------------------------- ----------------------------------- - QUICK Surface is modeled using a simple - conductance. Heat capacity effects - are ignored. Either drCon or drU - (next) can be specified. - - DELAYED, DELAYED\_HOUR, Surface is modeled using a - DELAYED\_SUBOUR multi-layer finite difference - technique which represents heat - capacity effects. If the time - constant of the door is too short - to accurately simulate, a warning - message is issued and the Quick - model is used. drCon (next) must be - specified -- the program cannot use - the finite difference model if drU - rather than drCon is specified. - - AUTO Program selects Quick or - appropriate Delayed automatically - according to the time constant of - the surface (if drU is specified, - Quick is selected). - - FORWARD\_DIFFERENCE Selects the forward difference - model (used with short time steps - and the CZM zone model) - ----------------------------------- ----------------------------------- - - --------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - ------ ------------ ----------- ------------ --------------- - QUICK, AUTO No constant - DELAYED - DELAYED - \_HOUR, - DELAYED - \_SUBOUR, - AUTO, - FORWARD - \_DIFFERENCE - - --------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - QUICK, DELAYED, AUTO Auto No constant - -Either drCon or drU must be specified, but not both. - -**drCon=*conName*** - -Name of construction for door. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------- ------------- -------------------- ----------------- - name of a *CONSTRUCTION* *None* unless *drU* given constant - -**drU=*float*** - -Door U-value, NOT including surface (air film) conductances. Allows direct entry of U-value, without defining a CONSTRUCTION, when no heat capacity effects are to be modeled. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------- ---------------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 Determined from *drCon* if *drCon* not given constant - -**drInH=*float*** - -Door interior surface (air film) conductance. Ignored if drModel = Forward\_Difference - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------ -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 same as owning surface No constant - -**drExH=*float*** - -Door exterior surface (air film) conductance. Ignored if drModel = Forward\_Difference - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------ -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 same as owning surface No constant - -**drExAbs=*float*** - -Door exterior solar absorptivity. Applicable only if sfExCon of owning surface is AMBIENT or SPECIFIEDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------ -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 same as owning surface No monthly-hourly - -**drInAbs=*float*** - -Door interior solar absorptivity. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.5 No monthly-hourly - -**drExEpsLW=*float*** - -Door exterior long wave (thermal) emittance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.9 No constant - -**drInEpsLW=*float*** - -Door interior long wave (thermal) emittance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.9 No constant - -**endDoor** - -Indicates the end of the door definition. Alternatively, the end of the door definition can be indicated by the declaration of another object or by END. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/ductseg.md b/doc/test/resources/ductseg.md deleted file mode 100644 index 3f8fc7607..000000000 --- a/doc/test/resources/ductseg.md +++ /dev/null @@ -1,149 +0,0 @@ -# DUCTSEG - -DUCTSEG defines a duct segment. Each RSYS has at most one return duct segment and at most one supply duct segment. That is, DUCTSEG input may be completely omitted to eliminate duct losses. - -**dsTy=*choice*** - -Duct segment type. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - SUPPLY, RETURN Yes constant - -The surface area of a DUCTSEG depends on its shape. 0 surface area is legal (leakage only). DUCTSEG shape is modeled either as flat or round -- - -- dsExArea specified: Flat. Interior and exterior areas are assumed to be equal (duct surfaces are flat and corner effects are neglected). -- dsExArea *not* specified: Round. Any two of dsInArea, dsDiameter, and dsLength must be given. Insulation thickness is derived from dsInsulR and dsInsulMat and this thickness is used to calculate the exterior surface area. Overall inside-to-outside conductance is also calculated including suitable adjustment for curvature. - -**dsExArea=*float*** - -Duct segment surface area at outside face of insulation for flat duct shape, see above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $\ge$ 0 No constant - -**dsInArea=*float*** - -Duct segment inside surface area (at duct wall, duct wall thickness assumed negligible) for round shaped duct. - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ------------- ------------- --------------- - ft^2^ *x* $\ge$ 0 Derived from (see above re constant - dsDiameter duct shape) - and dsLength - - ----------------------------------------------------------------- - -**dsDiameter=*float*** - -Duct segment round duct diameter (duct wall thickness assumed negligible) - - ---------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ------------ ------------- --------------- - ft *x* $\ge$ 0 Derived from (see above re constant - dsInArea and duct shape) - dsLength - - ---------------------------------------------------------------- - -**dsLength=*float*** - -Duct segment length. - - ---------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ------------ ------------- --------------- - ft *x* $\ge$ 0 Derived from (see above re constant - dsInArea and duct shape) - dsDiameter - - ---------------------------------------------------------------- - -**dsExCnd=*choice*** - -Conditions surrounding duct segment. - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ------------- ------------- --------------- - ADIABATIC, ADJZN No constant - AMBIENT, - SPECIFIEDT, - ADJZN - - ------------------------------------------------------------------ - -**dsAdjZn=*znName*** - -Name of zone surrounding duct segment; used only when dsExCon is ADJZN. Can be the same as a zone served by the RSYS owning the duct segment. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------ ------------- --------------------------------- ----------------- - name of a *ZONE* *none* Required when *dsExCon* = ADJZN constant - -**dsEpsLW=*float*** - -Exposed (i.e. insulation) outside surface exterior long wave (thermal) emittance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.9 No constant - -**dsExT=*float*** - -Air dry-bulb temperature surrounding duct segment. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------------------------ ----------------- - ^o^F *unrestricted* *none* Required if *sfExCon* = SPECIFIEDT hourly - -Duct insulation is modeled as a pure conductance (no mass). - -**dsInsulR=*float*** - -Insulation thermal resistance *not including*surface conductances. dsInsulR and dsInsulMat are used to calculate insulation thickness (see below). - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------------ ----------------- ------------- -------------- ----------------- - ft^2^-F-hr / Btu *x* $\ge$ 0 0 No constant - -**dsInsulMat=*matName*** - -Name of insulation MATERIAL. The conductivity of this material at 70 ^o^F is combined with dsInsulR to derive the duct insulation thickness. If omitted, a typical fiberglass material is assumed having conductivity of 0.025 Btu/hr-ft^2^-F at 70 ^o^F and a conductivity coefficient of .00418 1/F (see MATERIAL). In addition, insulation conductivity is adjusted during the simulation in response its average temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - name of a *MATERIAL* fiberglass No constant - -**dsLeakF=*float*** - -Duct leakage. Return duct leakage is modeled as if it all occurs at the segment inlet. Supply duct leakage is modeled as if it all occurs at the outlet. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 0 $<$ x $\le$ 1 No constant - -**dsExH=*float*** - -Outside (exposed) surface convection coefficient. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 .54 No subhourly - -**endDuctSeg** - -Optionally indicates the end of the DUCTSEG definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No - - diff --git a/doc/test/resources/export.md b/doc/test/resources/export.md deleted file mode 100644 index 917db1e2d..000000000 --- a/doc/test/resources/export.md +++ /dev/null @@ -1,160 +0,0 @@ -# EXPORT - -Exports contain the same information as CSE reports, but in a "comma-quote" format intended for reading into a spreadsheet or other program for further processing, plotting, special print formatting, etc. - -No exports are generated by default; each desired export must be specified with an EXPORT object. - -Each row of an export contains several values, separated by commas, with quotes around string values. The row is terminated with a carriage return/line feed character pair. The first fields of the row identify the data. Multiple fields are used as necessary to identify the data. For example, the rows of an hourly ZEB export begin with the month, day of month, and hour of day. In contrast, reports, being subject to a width limitation, use only a single column of each row to identify the data; additional identification is put in the header. For example, an hourly ZEB Report shows the hour in a column and the day and month in the header; the header is repeated at the start of each day. The header of an export is never repeated. - -Depending on your application, if you specify multiple exports, you may need to place each in a separate file. Generate these files with EXPORTFILE, preceding section. You may also need to suppress the export header and/or footer, with *exHeader* and/or *exFooter*, described in this section. - -Input for EXPORTs is similar to input for REPORTs; refer to the REPORT description in Section 5.25 for further discussion of the members shown here. - -**exName** - -Name of export. Give after the word EXPORT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**exExportfile=*fname*** - -Name of export file to which current export will be written. If omitted, if EXPORT is within an EXPORTFILE object, report will be written to that export file, or else to the automatically-supplied EXPORTFILE "Primary", which by default uses the name of the input file with the extension .csv. - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------ ------------- ------------ --------------- - name of an current No constant - *EXPORTFILE* *EXPORTFILE*, - if any, else - "Primary" - - ----------------------------------------------------------------- - -**exType=*choice*** - -Choice indicating export type. See descriptions in Section 5.22, REPORT. While not actually disallowed, use of *exType* = ERR, LOG, INP, or ZDD is unexpected. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------------- ------------- -------------- ----------------- - ZEB, ZST, MTR, AH, UDT, or SUM Yes constant - -**exFreq=*choice*** - -Export Frequency: specifies interval for generating rows of export data: - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------------------------- ------------- -------------- ----------------- - YEAR, MONTH, DAY, HOUR, HOURANDSUB, SUBHOUR Yes constant - -**exDayBeg=*date*** - -Initial day of export. Exports for which *exFreq* = YEAR do not allow specification of *exDayBeg* and *exDayEnd*; for MONTH exports, these members are optional and default to include the entire run; for DAY and shorter-interval exports, *exDayBeg* is required and *exDayEnd* defaults to *exDayBeg*. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - *date* first day Required for constant - of *exTypes* - simulation ZEB, ZST, - if *exFreq* MTR, AH, - = MONTH and UDT if - *exFreq* is - DAY, HOUR, - HOURANDSUB, - or SUBHOUR - - ------------------------------------------------------------ - -**exDayEnd=*date*** - -Final day of export period, except for YEAR exports. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------------------------------ -------------- ----------------- - *date* last day of simulation if *exFreq*= MONTH, else *exDayBeg* No constant - -**exZone=*znName*** - -Name of ZONE for which a ZEB, ZST, or ZDD export is being requested; ALL and SUM are also allowed except with *exType* = ZST. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------- ------------- ------------------------------------------- ----------------- - name of a *ZONE*, ALL, SUM Required for *exTypes* ZDD, ZEB, and ZST. constant - -**exMeter=*mtrName*** - -Specifies meter(s) whose data is to be exported, for *exType*=MTR. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------------- ------------- --------------------------- ----------------- - name of a *METER*, ALL, SUM Required for *exType*=MTR constant - -**exAh=ah*Name*** - -Specifies air handler(s) to be exported, for *exType*=AH. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------------------- ------------- -------------------------- ----------------- - name of an *AIRHANDLER*, ALL, SUM Required for *exType*=AH constant - -**exBtuSf=*float*** - -Scale factor used for exported energy values. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------------------------------- -------------- ----------------- - *any multiple of ten* 1,000,000: energy exported in MBtu. No constant - -**exCond=*expression*** - -Conditional exporting flag. If given, export rows are generated only when value of expression is non-0. Allowed with *exTypes* ZEB, ZST, MTR, AH, and UDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------- ----------------------- -------------- -------------------------- - *any numeric expression* 1 (exporting enabled) No subhour /end of interval - -**exTitle=*string*** - -Title for use in export header of User-Defined export. Disallowed if *exType* is not UDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------- -------------- ----------------- - "User-defined Export" No constant - -**exHeader=*choice*** - -Use NO to suppress the export header which gives the export type, zone, meter, or air handler being exported, time interval, column headings, etc. You might do this if the export is to be subsequently imported to a program that is confused by the header information. - -If not suppressed, the export header shows, in four lines: - -*runTitle* and *runSerial* (see Section 5.1);the run date and timethe export type ("Energy Balance", "Statistics", etc., or *exTitle* if given)and frequency ("year", "day", etc.)a list of field names in the order they will be shown in the data rows("Mon", "Day", "Tair", etc.) - -The *specific* month, day, etc. is NOT shown in the export header (as it is shown in the report header), because it is shown in each export row. - -The field names may be used by a program reading the export to identify the data in the rows which follow; if the program does this, it will not require modification when fields are added to or rearranged in the export in a future version of CSE. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO YES No constant - -**exFooter=*choice*** - -Use NO to suppress the blank line otherwise output as an export "footer". (Exports do not receive the total lines that most reports receive as footers.) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO YES No constant - -**endExport** - -Optionally indicates the end of the export definition. Alternatively, the end of the export definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/exportcol.md b/doc/test/resources/exportcol.md deleted file mode 100644 index 3d0bb6f51..000000000 --- a/doc/test/resources/exportcol.md +++ /dev/null @@ -1,65 +0,0 @@ -# EXPORTCOL - -Each EXPORTCOL defines a single datum of a User Defined Table (UDT) export; EXPORTCOLs are not used with other export types. - -Use as many EXPORTCOLs as there are values to be shown in each row of the user-defined export. The values will appear in the order defined in each data row output. Be sure to include values needed to identify the data, such as the month, day, and hour, as appropriate -- these are NOT automatically supplied in user-defined exports. - -EXPORTCOL members are similar to the corresponding REPORTCOL members. See Section 5.265.1.5 for further discussion. - -**colName** - -Name of EXPORTCOL. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**colExport=*exName*** - -Name of export to which this column belongs. If the EXPORTCOL is given within an EXPORT object, then *colExport* defaults to that export. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- -------------------------- ----------------------- ----------------- - name of an *EXPORT* *current export, if any* Unless in an *EXPORT* constant - -**colVal=*expression*** - -Value to show in this position in each row of export. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------ ------------- -------------- ----------------------- - *any numeric or string expression* Yes subhour /end interval - -**colHead=*string*** - -Text used for field name in export header. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------- -------------- ----------------- - *colName* or blank No constant - -**colWid=*int*** - -Maximum width. Leading and trailing spaces and non-significant zeroes are removed from export data to save file space. Specifying a *colWid* less than the default may reduce the maximum number of significant digits output. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 13 No constant - -**colDec=*int*** - -Number of digits after decimal point. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------- -------------- ----------------- - *x* $\ge$ 0 *flexible format* No constant - -**endExportCol** - -Optionally indicates the end of the EXPORTCOL. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/exportfile.md b/doc/test/resources/exportfile.md deleted file mode 100644 index 76e27899e..000000000 --- a/doc/test/resources/exportfile.md +++ /dev/null @@ -1,52 +0,0 @@ -# EXPORTFILE - -EXPORTFILE allows optional specification of different or additional files to receive CSE EXPORTs. - -EXPORTs contain the same information as reports, but formatted for reading by other programs rather than by people. By default, CSE generates no exports. Exports are specified via the EXPORT object, described in Section 5.28 (next). As for REPORTs, CSE automatically supplies a primary export file; it has the same name and path as the input file, and extension .csv. - -Input for EXPORTFILEs and EXPORTs is similar to that for REPORTFILEs and REPORTs, except that there is no page formatting. Refer to their preceding descriptions (Sections 5.24 and 5.25) for more additional discussion. - -**xfName** - -Name of EXPORTFILE object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* No constant - -**xfFileName=*string*** - -path name of file to be written. If no path is specified, the file is written in the current directory. If no extension is specified, .csv is used. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------------ ------------- -------------- ----------------- - *file name, path and extension optional* No constant - -**xfFileStat=*choice*** - -What CSE should do if file *xfFileName* already exists: - - ----------------- ---------------------------------------------------- - OVERWRITE Overwrite pre-existing file. - - NEW Issue error message if file exists. - - APPEND Append new output to present contents of existing - file. - ----------------- ---------------------------------------------------- - -If the specified file does not exist, it is created and *xfFileStat* has no effect. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - OVERWRITE, NEW, APPEND OVERWRITE No constant - -**endExportFile** - -Optionally indicates the end of the export file definition. Alternatively, the end of the Export file definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/gain.md b/doc/test/resources/gain.md deleted file mode 100644 index 75ddb7c4d..000000000 --- a/doc/test/resources/gain.md +++ /dev/null @@ -1,123 +0,0 @@ -# GAIN - -A GAIN object adds sensible and/or latent heat to the ZONE, and/or adds arbitrary energy use to a METER. GAINs are subobjects of ZONEs and are normally given within the input for their ZONE (also see ALTER). As many GAINs as desired (or none) may be given for each ZONE. - -Each gain has an amount of power (gnPower), which may optionally be accumulated to a METER (gnMeter). The power may be distributed to the zone, plenum, or return as sensible heat with an optionl fraction radiant, or to the zone as latent heat (moisture addition), or not. - -**gnName** - -Name of gain; follows the word GAIN if given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**gnPower=*float*** - -Rate of heat addition to zone. Negative gnPower values may be used to represent heat removal. Expressions containing functions are commonly used with this member to schedule the gain power on a daily and/or hourly basis. Refer to the functions section in Section 4 for details and examples. - -All gains, including electrical, are specified in Btuh units. But note that internal gain and meter reporting is in MBtu (millions of Btu) by default even though input is in Btuh. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - Btuh *no restrictions* *none* Yes hourly - -**gnMeter=*choice*** - -Name of meter by which this GAIN's gnPower is recorded. If omitted, gain is assigned to no meter and energy use is not accounted in CSE simulation reports; thus, gnMeter should only be omitted for "free" energy sources. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - meter name *none* No constant - -**gnEndUse=*choice*** - -Meter end use to which the GAIN's energy use should be accumulated. - - ------- ------------------------------------------------------------- - Clg Cooling - Htg Heating (includes heat pump compressor) - HPHTG Heat pump backup heat - DHW Domestic (service) hot water - DHWBU Domestic (service) hot water heating backup (HPWH resistance) - FANC Fans, AC and cooling ventilation - FANH Fans, heating - FANV Fans, IAQ venting - FAN Fans, other purposes - AUX HVAC auxiliaries such as pumps - PROC Process - LIT Lighting - RCP Receptacles - EXT Exterior lighting - REFR Refrigeration - DISH Dishwashing - DRY Clothes drying - WASH Clothes washing - COOK Cooking - USER1 User-defined category 1 - USER2 User-defined category 2 - PV Photovoltaic power generation - ------- ------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- ------------------------------ ----------------- - *Codes listed above* *none* Required if gnMeter is given constant - -The gnFrZn, gnFrPl, and gnFrRtn members allow you to allocate the gain among the zone, the zone's plenum, and the zone's return air flow. Values that total to more than 1.0 constitute an error. If they total less than 1, the unallocated portion of the gain is recorded by the meter (if specified) but not transferred into the building. By default, all of the gain not directed to the return or plenum goes to the zone. - -**gnFrZn=*float*** - -Fraction of gain going to zone. gnFrLat (below) gives portion of this gain that is latent, if any; the remainder is sensible. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------ ---------------------------------- -------------- ----------------- - gnFrZn + gnFrPl + gnFrRtn $\leq$ 1 *1 - gnFrLat - gnFrPl - gnFrRtn* No hourly - -**gnFrPl=*float*** - -Fraction of gain going to plenum. Plenums are not implementented as of August, 2012. Any gain directed to the plenum is discarded. - -**gnFrRtn=*float*** - -Fraction of gain going to return. The return fraction model is not implemented as of August, 2012. Any gain directed to the return is discarded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------ ------------- -------------- ----------------- - gnFrZn + gnFrPl + gnFrRtn $\leq$ 1 0. No hourly - -The gain to the zone may be further divided into convective sensible, radiant sensible and latent heat via the gnFrRad and gnFrLat members; the plenum and return gains are assumed all convective sensible. - - -**Gain Modeling in CR zone** - -In the CNE zone mode, the radiant internal gain is distributed to the surfaces in the zone, rather than going directly to the zone "air" heat capacity (znCAir). A simple model is used -- all surfaces are assumed to be opaque and to have the same (infrared) absorptivity -- even windows. Along with the assumption that the zone is spherical (implicit in the current treatment of solar gains), this allows distribution of gains to surfaces in proportion to their area, without any absorptivity or transmissivity calculations. The gain for windows and quick-model surfaces is assigned to the znCAir, except for the portion which conducts through the surface to the other side rather than through the surface film to the adjacent zone air; the gain to massive (delayed-model) surfaces is assigned to the side of surface in the zone with the gain. - -**Gain Modeling in CNE zones** - -In the CNE zone mode, the radiant internal gain is distributed to the surfaces in the zone, rather than going directly to the zone "air" heat capacity (znCAir). A simple model is used -- all surfaces are assumed to be opaque and to have the same (infrared) absorptivity -- even windows. Along with the assumption that the zone is spherical (implicit in the current treatment of solar gains), this allows distribution of gains to surfaces in proportion to their area, without any absorptivity or transmissivity calculations. The gain for windows and quick-model surfaces is assigned to the znCAir, except for the portion which conducts through the surface to the other side rather than through the surface film to the adjacent zone air; the gain to massive (delayed-model) surfaces is assigned to the side of surface in the zone with the gain. - -Radiant internal gains are included in the IgnS (Sensible Internal Gain) column in the zone energy balance reports. (They could easily be shown in a separate IgnR column if desired.) Any energy transfer shows two places in the ZEB report, with opposite signs, so that the result is zero -- otherwise it wouldn't be an energy balance. The rest of the reporting story for radiant internal gains turns out to be complex. The specified value of the radiant gain (gnPower \* gnFrZn \* gnFrRad) shows in the IgnS column. To the extent that the gain heats the zone, it also shows negatively in the Masses column, because the zone CAir is lumped with the other masses. To the extent that the gain heats massive surfaces, it also shows negatively in the masses column. To the extent that the gain conducts through windows and quick-model surfaces, it shows negatively in the Conduction column. If the gain conducts through a quick-model surface to another zone, it shows negatively in the Izone (Interzone) column, positively in the Izone column of the receiving zone, and negatively in the receiving zone's Masses or Cond column. - -**gnFrRad=*float*** - -Fraction of total gain going to zone (gnFrZn) that is radiant rather than convective or latent. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 0. No hourly - -**gnFrLat=*float*** - -Fraction of total gain going to zone (gnFrZn) that is latent heat (moisture addition). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 0. No hourly - -**endGain** - -Optional to indicate the end of the GAIN definition. Alternatively, the end of the gain definition can be indicated by END or by the declaration of another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant diff --git a/doc/test/resources/glazetype.md b/doc/test/resources/glazetype.md deleted file mode 100644 index cd780dd05..000000000 --- a/doc/test/resources/glazetype.md +++ /dev/null @@ -1,147 +0,0 @@ -# GLAZETYPE - -GLAZETYPE constructs an object of class GLAZETYPE that represents a glazing type for use in WINDOWs. - -**gtName** - -Name of glazetype. Required for reference fromWINDOW objects, below. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* Yes constant - -**gtModel=*choice*** - -Selects model to be used for WINDOWs based on this GLAZETYPE. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - SHGC ASHWAT SHGC No constant - -**gtU=*float*** - -Glazing conductance (U-factor without surface films, therefore not actually a U-factor but a C-factor). Used as wnU default; an error message will be issued if the U value is not given in the window (wnU) nor in the glazeType (gtU). Preferred Approach: To use accurately with standard winter rated U-factor from ASHRAE or NFRC enter as: - - gtU = (1/((1/U-factor)-0.85) - -Where 0.85 is the sum of the interior (0.68) and exterior (0.17) design air film resistances assumed for rating window U-factors. Enter wnInH (usually 1.5=1/0.68) instead of letting it default. Enter the wnExH or let it default. It is important to use this approach if the input includes gnFrad for any gain term. Using approach 2 below will result in an inappropriate internal gain split at the window. - -Approach 2. Enter gtU=U-factor and let the wnInH and wnExH default. This approach systematically underestimates the window U-factor because it adds the wnExfilm resistance to 1/U-factor thereby double counting the exterior film resistance. This approach will also yield incorrect results for gnFrad internal gain since the high wnInH will put almost all the gain back in the space. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 *none* No constant - -**gtUNFRC=*float*** - -Fenestration system (including frame) U-factor evaluated at NFRC heating conditions. For ASHWAT windows, a value for the NFRC U-factor is required, set via gtUNFRC or wnUNFRC. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 *none* No constant - -**gtSHGC=*float*** - -Glazing Solar Heat Gain Coefficient: fraction of normal beam insolation which gets through glass to space inside. We recommend using this to represent the glass normal transmissivity characteristic only, before shading and framing effects - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ----------------- - fraction *0* $\leq$ *x* $\leq$ *1* *none* Yes Constant - -**gtSMSO=*float*** - -SHGC multiplier with shades open. May be overriden in the specific window input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ------------------ - fraction *0* $\leq$ *x* $\leq$ *1* 1.0 No Monthly - Hourly - -**gtSMSC=*float*** - -SHGC multiplier with shades closed. May be overriden in the specific window input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- -------------------- -------------- ------------------ - fraction *0* $\leq$ *x* $\leq$ *1* gtSMSO (no shades) No Monthly - Hourly - -**gtFMult=*float*** - -Framing multiplier used if none given in window, for example .9 if frame and mullions reduce the solar gain by 10%. Default of 1.0 implies frame/mullion effects allowed for in gtSHGC's or always specified in Windows. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ------------------ - fraction *0* $\leq$ *x* $\leq$ *1* gtSHGCO No Monthly - Hourly - -**gtPySHGC =*float*** - -Four float values separated by commas. Coefficients for incidence angle SHGC multiplier polynomial applied to gtSHGC to determine beam transmissivity at angles of incidence other than 90 degrees. The values are coefficients for first through fourth powers of the cosine of the incidence angle; there is no constant part. An error message will be issued if the coefficients do not add to one. They are used in the following computation: - -    angle = incidence angle of beam radiation, measured from normal to glass. - -    cosI = cos( angle) - -    angMult = a\*cosI + b\*cosI\^2 + c\*cosI\^3 + d\*cosI\^4 - -    beamXmisvty = gtSHGCO \* angMult (shades open) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - float *any* none Yes Constant - -**gtDMSHGC=*float*** - -SHGC diffuse multiplier, applied to gtSHGC to determine transmissivity for diffuse radiation. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ----------------- - fraction *0* $\leq$ *x* $\leq$ *1* none yes Constant - -**gtDMRBSol=*float*** - -SHGC diffuse multiplier, applied to qtSHGC to determine transmissivity for diffuse radiation reflected back out the window. Misnamed as a reflectance. Assume equal to DMSHGC if no other data available. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ----------------- - fraction *0* $\leq$ *x* $\leq$ *1* none yes Constant - -**gtNGlz=*int*** - -Number of glazings in the Glazetype (bare glass only, not including any interior or exterior shades). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - *0* $<$ *x* $\leq$ *4* 2 no Constant - -**gtExShd=*choice*** - -Exterior shading type (ASHWAT only). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NONE INSCRN NONE no Constant - -**gtInShd=*choice*** - -Interior shade type (ASHWAT only). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NONE DRAPEMED NONE no Constant - -**gtDirtLoss=*float*** - -Glazing dirt loss factor. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ----------------- - fraction *0* $\leq$ *x* $\leq$ *1* 0 no Constant - -**endGlazeType** - -Optional to indicates the end of the Glazetype. Alternatively, the end of the GLAZETYPE definition can be indicated by "END" or by beginning another object - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/heatplant.md b/doc/test/resources/heatplant.md deleted file mode 100644 index f2b878638..000000000 --- a/doc/test/resources/heatplant.md +++ /dev/null @@ -1,72 +0,0 @@ -# HEATPLANT - -A HEATPLANT contains one or more BOILER subobjects (Section 5.20.1) and supports one or more Hot Water (HW) coils in TERMINALs and/or AIRHANDLERs, and/or heat exchangers in HPLOOPs (HPLOOPs are not implemented as of September 1992.). There can be more than one HEATPLANT in a simulation. - -BOILERs, HW coils, and heat exchangers are modeled with simple heat-injection models. There is no explicit modeling of circulating hot water temperatures and flows; it is always assumed the temperature and flow at each load (HW coil or heat exchanger) are sufficient to allow the load to transfer any desired amount of heat up to its capacity. When the total heat demand exceeds the plant's capacity, the model reduces the capacity of each load until the plant is not overloaded. The reduced capacity is the same fraction of rated capacity for all loads on the HEATPLANT; any loads whose requested heat is less than the reduced capacity are unaffected. - -The BOILERs in the HEATPLANT can be grouped into *STAGES* of increasing capacity. The HEATPLANT uses the first stage that can meet the load. The load is distributed among the BOILERs in the stage so that each operates at the same fraction of its rated capacity. - -For each HEATPLANT, piping loss is modeled, as a constant fraction of the BOILER capacity of the heatPlant's most powerful stage. This heat loss is added to the load whenever the plant is operating; as modeled, the heat loss is independent of load, weather, or any other variables. - -**heatplantName** - -Name of HEATPLANT object, given immediately after the word HEATPLANT. This name is used to refer to the heatPlant in *tuhcHeatplant* and *ahhcHeatplant* commands. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* Yes constant - -**hpSched=*choice*** - -Heat plant schedule: hourly variable choice of OFF, AVAIL, or ON. - - ------- -------------------------------------------------------------- - OFF HEATPLANT will not supply hot water regardless of demand. All - loads (HW coils and heat exchangers) should be scheduled off - when the plant is off; an error will occur if a coil calls for - heat when its plant is off. - - AVAIL HEATPLANT will operate when one or more loads demand heat. - - ON HEATPLANT runs unconditionally. When no load wants heat, least - powerful (first) stage runs. - ------- -------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - OFF, AVAIL, or ON AVAIL No hourly - -**hpPipeLossF=*float*** - -Heat plant pipe loss: heat assumed lost from piping connecting boilers to loads whenever the HEATPLANT is operating, expressed as a fraction of the boiler capacity of the plant's most powerful stage. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .01 No constant - -**hpStage1=boilerName, boilerName, boilerName, ...** - -**hpStage1=ALL\_BUT, boilerName, boilerName, boilerName, ...** - -**hpStage1=ALL** - -**hpStage2 through hpStage7 *same*** - -The commands *hpStage1* through *hpStage7* allow specification of up to seven *STAGES* in which BOILERs are activated as the load increases. Each stage may be specified with a list of up to seven names of BOILERs in the HEATPLANT, or with the word ALL, meaning all of the HEATPLANT's BOILERs, or with the word ALL\_BUT and a list of up to six names of BOILERs. Each stage should be more powerful than the preceding one. If you have less than seven stages, you may skip some of the commands *hpStage1* through *hpStage7* -- the used stage numbers need not be contiguous. - -If none of *hpStage1* through *hpStage7* are given, CSE supplies a single default stage containing all boilers. - -A comma must be entered between boiler names and after the word ALL\_BUT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------------------------- ------------------ -------------- ----------------- - 1 to 7 names;ALL\_BUT and 1 to 6 names;ALL *hpStage1* = ALL No constant - -**endHeatplant** - -Optionally indicates the end of the HEATPLANT definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - diff --git a/doc/test/resources/holiday.md b/doc/test/resources/holiday.md deleted file mode 100644 index e47a1b6ef..000000000 --- a/doc/test/resources/holiday.md +++ /dev/null @@ -1,150 +0,0 @@ -# HOLIDAY - -HOLIDAY objects define holidays. Holidays have no inherent effect, but input expressions can test for holidays via the \$DOWH, \$isHoliday, \$isHoliTrue, \$isWeHol, and \$isBegWeek system variables (4.6.4). - -Examples and the list of default holidays are given after the member descriptions. - - -**hdName** - -Name of holiday: must follow the word HOLIDAY. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- --------------- ----------------- - *63 characters* *none* Yes constant - -A holiday may be specified by date or via a rule such as "Fourth Thursday in November". To specify by date, give hdDateTrue, and also hdDateObs or hdOnMonday if desired. To specify by rule, give all three of hdCase, hdMon, and hdDow. - -**hdDateTrue*=date*** - -The true date of a holiday, even if not celebrated on that day. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *date* *blank* No constant - -**hdDateObs*=date*** - -The date that a holiday will be observed. Allowed only if hdDateTrue given and hdOnMonday not given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - *date* *hdDateTrue* No constant - -**hdOnMonday=*choice*** - -If YES, holiday is observed on the following Monday if the true date falls on a weekend. Allowed only if hdDateTrue given and hdDateObs not given. - -Note: there is no provision to celebrate a holiday that falls on a Saturday on *Friday* (as July 4 was celebrated in 1992). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES NO YES No constant - -**hdCase=*choice*** - -Week of the month that the holiday is observed. hdCase, hdMon, and hdDow may be given only if hdDateTrue, hdDateObs, and hdOnMonday are not given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------------- ------------- -------------- ----------------- - FIRST SECOND THIRD FOURTH LAST FIRST No constant - -**hdMon=*choice*** - -Month that the holiday is observed. - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- -------------- ----------- ------------ --------------- - JAN, FEB, MAR, *none* required if constant - APR, MAY, JUN, hdCase given - JUL, AUG, SEP, - OCT, NOV, DEC - - ----------------------------------------------------------------- - -**hdDow*=choice*** - -Day of the week that the holiday is observed. - - ------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ---------- ----------- ------------ --------------- - SUNDAY, MONDAY required if constant - MONDAY, hdCase given - TUESDAY, - WEDNESDAY, - THURSDAY, - FRIDAY, - SATURDAY - - ------------------------------------------------------------- - -**endHoliday** - -Indicates the end of the holiday definition. Alternatively, the end of the holiday definition can be indicated by "END" or simply by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - -Examples of valid HOLIDAY object specifications: - -- Holiday on May first, observed date moved to following Monday if the first falls on a weekend (hdOnMonday defaults Yes). - - - HOLIDAY MAYDAY; - hdDateTrue = May 1; - -- Holiday on May 1, observed on May 3. - - - HOLIDAY MAYDAY; - hdDateTrue = May 1; - hdDateObs = May 3; - -- Holiday observed on May 1 even if on a weekend. - - - HOLIDAY MAYDAY; - hdDateTrue = May 1; - hdOnMonday = No; - -- Holiday observed on Wednesday of third week of March - - - HOLIDAY HYPOTHET; - hdCase = third; - hdDow = Wed; - hdMon = MAR - -As with reports, Holidays are automatically generated for a standard set of Holidays. The following are the default holidays automatically defined by CSE: - - ----------------- -------------------------- - New Year's Day \*January 1 - M L King Day \*January 15 - President's Day 3rd Monday in February - Memorial Day last Monday in May - Fourth of July \*July 4 - Labor Day 1st Monday in September - Columbus Day 2nd Monday in October - Veterans Day \*November 11 - Thanksgiving 4th Thursday in November - Christmas \*December 25 - ----------------- -------------------------- - -\* *observed on the following Monday if falls on a weekend, except as otherwise noted:* - -If a particular default holiday is not desired, it can be removed with a DELETE statement: - - DELETE HOLIDAY Thanksgiving - - DELETE HOLIDAY "Columbus Day" // Quotes necessary (due to space) - - DELETE HOLIDAY "VETERANS DAY" // No case-sensitivity - -Note that the name must be spelled *exactly* as listed above. diff --git a/doc/test/resources/hploop.md b/doc/test/resources/hploop.md deleted file mode 100644 index f178b15c0..000000000 --- a/doc/test/resources/hploop.md +++ /dev/null @@ -1,3 +0,0 @@ -# HPLOOP - -To be written. diff --git a/doc/test/resources/importfile.md b/doc/test/resources/importfile.md deleted file mode 100644 index d4fbc645c..000000000 --- a/doc/test/resources/importfile.md +++ /dev/null @@ -1,102 +0,0 @@ -# IMPORTFILE - -IMPORTFILE allows specification of a file from which external data can be accessed using the [import()](#import) and [importStr()](#importstr) functions. This allows external values to be referenced in expressions. Any number of IMPORTFILEs can be defined and any number of import()/importStr() references can be made to a give IMPORTFILE. - -Import files are text files containing an optional header and comma-separated data fields. With -the header present, the structure of an import file matches that of an [EXPORT](#export) file. This makes it convenient to import unmodified files EXPORTed from prior runs. The file structure is as follows (noting that the header in lines 1-4 should not be present when imHeader=NO) -- - - Line Contents Notes - --------- ----------------------- -------------------------------------- - 1 *runTitle*, *runNumber* read but not checked - 2 *timestamp* in quotes, read but not checked - 3 *title*, *freq* should match imTitle and imFreq - 4 *colName1*,*colName2*,... comma separated column names in quotes - 5 .. *val1*,*val2*,... comma separated values (string values in quotes) - - -Example import file imp1.csv - - "Test run",001 - "Fri 04-Nov-16 10:54:37 am" - "Daily Data","Day" - "Mon","Day","Tdb","Twb" - 1,1,62.2263,53.2278 - 1,2,61.3115,52.8527 - 1,3,60.4496,52.4993 - 1,4,60.2499,52.4174 - 1,5,60.9919,52.7216 - 1,6,61.295,52.8459 - 1,7,62.3178,53.2654 - 1,8,62.8282,53.4747 - (... continues for 365 data lines ...) - -Example IMPORTFILE use (reading from imp1.csv) - - // ... various input statements ... - - IMPORTFILE Example imFileName="imp1.csv" imFreq=Day imTitle="Daily Data" - ... - // Compute internal gain based on temperature read from import file. - // result is 3000 W per degree temperature is above 60. - // Note gnPower can have hourly variability, but here varies daily. - GAIN gnPower = 3000 * max( 0, import(Example,"Tdb") - 60) / 3.412 - ... - -Notes - - * As usual, file order is not important -- IMPORTFILEs can be referenced before they are defined. - * Columns are referenced by 1-based index or column names (assuming file header is present). - In the example above, "Tdb" could be replaced by 3. - - - -**imName** - -Name of IMPORTFILE object (for reference from Import()). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* No constant - -**imFileName=*string*** - -Gives path name of file to be read. If directory is specified, CSE first looks for the file the current directory and searches include paths specified by the -I command line parameter (if any). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------------ ------------- -------------- ----------------- - *file name, path optional* Yes constant - -**imTitle=*string*** - -Title expected to be found on line 3 of the import file. A warning is issued if a non-blank imTitle does not match the import file title. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - Text string (blank) No constant - -**imFreq=*choice*** - -Specifies the interval at which CSE reads from the import file. Data is read at the beginning of the indicated interval and buffered in memory for access in expressions via import() or importStr(). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ------------- -------------- ----------------- - YEAR, MONTH, DAY, or HOUR Yes constant - - -**imHeader=*choice*** - -Indicates whether the import file include a 4 line header, as described above. If NO, the import file -should contain only comma-separated data rows and data items can be referenced only by 1-based column number. - -**Units** **Legal Range** **Default** **Required** **Variability** ------------ ------------------------ ------------- -------------- ----------------- - YES NO YES No constant - - -**endImportFile** - -Optionally indicates the end of the import file definition. Alternatively, the end of the import file definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant diff --git a/doc/test/resources/izxfer.md b/doc/test/resources/izxfer.md deleted file mode 100644 index dbaaedd41..000000000 --- a/doc/test/resources/izxfer.md +++ /dev/null @@ -1,274 +0,0 @@ -# IZXFER - -IZXFER constructs an object that represents an interzone or zone/ambient heat transfer due to conduction and/or air transfer. The air transfer modeled by IZXFER transfers heat only; humidity transfer is not modeled as of July 2011. Note that SURFACE is the preferred way represent conduction between ZONEs. - -The AIRNET types are used in a multi-cell pressure balancing model that finds zone pressures that produce net 0 mass flow into each zone. The model operates in concert with the znType=CZM to represent ventilation strategies. During each time step, the pressure balance is found for two modes that can be thought of as “VentOff” (or infiltration-only) and “VentOn” (or infiltration+ventilation). The zone model then determines the ventilation fraction required to hold the desired zone temperature (if possible). - -**izName** - -Optional name of interzone transfer; give after the word "IZXFER" if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**izNVType=*choice*** - -Choice determining interzone ventilation - - ---------------- --------------------------------------- - NONE No interzone ventilation - - TWOWAY Uncontrolled flow in either direction - (using ASHRAE high/low vent model) - - AIRNETIZ Single opening to another zone (using - pressure balance AirNet model) - - AIRNETEXT Single opening to ambient (using - pressure balance AirNet model) - - AIRNETHORIZ Horizontal (large) opening between two - zones, used to represent e.g. - stairwells - - AIRNETEXTFAN Fan from exterior to zone (flow either - direction). - - AIRNETIZFAN Fan between two zones (flow either - direction). - - AIRNETEXTFLOW Specified flow from exterior to zone - (either direction). Behaves identically - to AIRNETEXTFAN except no electricity - is consumed and no fan heat is added to - the air stream. - - AIRNETIZFLOW Specicified flow between two zones - (either direction). Behaves identically - to AIRNETIZFAN except no electricity is - consumed and no fan heat is added to - the air stream - ---------------- --------------------------------------- - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- -------------- ----------- ------------ --------------- - NONE, TWOWAY, None No constant - AIRNET, - AIRNETEXT, - AIRNETHORIZ, - AIRNETEXTFAN, - AIRNETIZFAN, - AIRNETEXTFLOW, - AIRNETIZFLOW - - ----------------------------------------------------------------- - -**izZn1=*znName*** - -Name of primary zone. Flow rates $>$ 0 are into the primary zone. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - name of a ZONE Yes constant - -**izZn2=*znName*** - -Name of secondary zone. - - --------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- --------------- --------------- - name of a required unless constant - ZONE izNVType = - AIRNETEXT, - AIRNETEXTFAN, - or - AIRNETEXTFLOW - - --------------------------------------------------------------- - -Give izHConst for a conductive transfer between zones. Give izNVType other than NONE and the following variables for a convective (air) transfer between the zones or between a zone and outdoors. Both may be given if desired. ?? Not known to work properly as of July 2011 - -**izHConst=*float*** - -Conductance between zones. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btu/^o^F *x* $\ge$ 0 0 No hourly - -**izALo=*float*** - -Area of low or only vent (typically VentOff) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $\ge$ 0 0 No hourly - -**izAHi=*float*** - -Additional vent area (high vent or VentOn). If used in AIRNET, izAHi > izALo typically but this is not required. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $\ge$ 0 izALo No hourly - -**izL1=*float*** - -Length or width of AIRNETHORIZ opening - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- --------------------------- ----------------- - ft *x* $>$ 0 if izNVType = AIRNETHORIZ constant - -**izL2=*float*** - -width or length of AIRNETHORIZ opening - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- --------------------------- ----------------- - ft *x* $>$ 0 if izNVType = AIRNETHORIZ constant - -**izStairAngle=*float*** - -stairway angle for AIRNETHORIZ opening. Use 90 for open hole. Note that 0 prevents flow. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - degrees *x* $>$ 0 34 No constant - -**izHD=*float*** - -Vent center-to-center height difference (for TWOWAY) or vent height above nominal 0 level (for AirNet types) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft 0 No constant - -**izNVEff=*float*** - -Vent discharge coefficient coefficient. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.8 No constant - -**izfanVfDs=*float*** - -Fan design or rated flow at rated pressure - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ---------------- ----------------- - cfm *x* $\ge$ 0 0 (no fan) If fan present constant - -**izCpr=*float*** - -Wind pressure coefficient (for AIRNETEXT) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ?? *x* $\ge$ 0 0. No constant - -**izExp=*float*** - -Opening exponent - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - none *x* $>$ 0 0.5 No constant - -**izfanVfMin=*float*** - -Minimum volume flow rate (VentOff mode) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - cfm *x* $\ge$ 0 0 No subhourly - -**izfanVfMax=*float*** - -Maximum volume flow rate (VentOn mode) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - cfm *x* $\ge$ 0 0 No subhourly - -**izfanPress=*float*** - -Design or rated pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------- ----------------- ------------- -------------- ----------------- - inches H~2~O *x* $>$ 0 .3 No constant - -Only one of izfanElecPwr, izfanEff, and izfanShaftBhp may be given: together with izfanVfDs and izfanPress, any one is sufficient for CSE to detemine the others and to compute the fan heat contribution to the air stream. - -**izfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ------------- ---------------- --------------- - W/cfm *x* $>$ 0 derived from If izfanEff and constant - izfanEff and izfanShaftBhp - izfanShaftBhp not present - ------------------------------------------------------------------ - -**izfanEff=*float*** - -Fan efficiency at design flow and pressure, as a fraction. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- -------------------------------------------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 derived from *izfanShaftBhp* if given, else 0.08 No constant - -**izfanShaftBhp=*float*** - -Fan shaft brake horsepower at design flow and pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - bhp *x* $>$ 0 derived from *izfanEff*. No constant - -**izfanCurvePy=$k_0$, $k_1$, $k_2$, $k_3$, $x_0$** - -$k_0$ through $k_3$ are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow $x_0$. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of izfan*VfDs*; 0 $\le$ $x$ $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *0, 1, 0, 0, 0 (linear)* No constant - -**izfanMtr=*mtrName*** - -Name of meter, if any, to record energy used by supply fan. End use category used is "Fan". - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endIzxfer** - -Optionally indicates the end of the interzone transfer definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/layer.md b/doc/test/resources/layer.md deleted file mode 100644 index 7cc2d18a5..000000000 --- a/doc/test/resources/layer.md +++ /dev/null @@ -1,59 +0,0 @@ -# LAYER - -LAYER constructs a subobject of class LAYER belonging to the current CONSTRUCTION. LAYER is not recognized except immediately following CONSTRUCTION or another LAYER. The members represent one layer (that optionally includes framing) within the CONSTRUCTION. - -The layers should be specified in inside to outside order. A framed layer (lrFrmMat and lrFrmFrac given) is modeled by creating a homogenized material with weighted combined conductivity and volumetric heat capacity. Caution: it is generally preferable to model framed constructions using two separate surfaces (one with framing, one without). At most one framed layer (lrFrmMat and lrFrmFrac given) is allowed per construction. - -The layer thickness may be given by lrThk, or matThk of the material, or matThk of the framing material if any. The thickness must be specified at least one of these three places; if specified in more than one place and not consistent, an error message occurs. - -**lrName** - -Name of layer (follows "LAYER"). Required only if the LAYER is later referenced in another object, for example with LIKE or ALTER; however, we suggest naming all objects for clearer error messages and future flexibility. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *None* No constant - -**lrMat=*matName*** - -Name of primary MATERIAL in layer. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - name of a *MATERIAL* *none* Yes constant - -**lrThk=*float*** - -Thickness of layer. - - **Units** **Legal Range** **Default/Required** **Variability** - ----------- ----------------- ---------------------------------------------------------- ----------------- - ft *x* $>$ 0 Required if *matThk* not specified in referenced *lrMat* constant - -**lrFrmMat=*matName*** - -Name of framing MATERIAL in layer, if any. At most one layer with lrFrmMat is allowed per CONSTRUCTION. See caution above regarding framed-layer model. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------------- -------------- ----------------- - name of a MATERIAL *no framed layer* No constant - -**lrFrmFrac=*float*** - -Fraction of layer that is framing. Must be specified if frmMat is specified. See caution above regarding framed-layer model. - - --------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------ ----------- ------------ --------------- - 0 $\leq$ *x* *no framed Required if constant - $\leq$ 1 layer* *lrFrmMat* - specified, - else - disallowed - - --------------------------------------------------------------- - -**endLayer** - -Optional end-of-LAYER indicator; LAYER definition may also be indicated by "END" or just starting the definition of another LAYER or other object. diff --git a/doc/test/resources/material.md b/doc/test/resources/material.md deleted file mode 100644 index eb5d94bad..000000000 --- a/doc/test/resources/material.md +++ /dev/null @@ -1,79 +0,0 @@ -# MATERIAL - -MATERIAL constructs an object of class MATERIAL that represents a building material or component for later reference a from LAYER (see below). A MATERIAL so defined need not be referenced. MATERIAL properties are defined in a consistent set of units (all lengths in feet), which in some cases differs from units used in tabulated data. Note that the convective and air film resistances for the inside wall surface is defined within the SURFACE statements related to conductances. - -**matName** - -Name of material being defined; follows the word "MATERIAL". - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* Yes constant - -**matThk=*float*** - -Thickness of material. If specified, matThk indicates the discreet thickness of a component as used in construction assemblies. If omitted, matThk indicates that the material can be used in any thickness; the thickness is then specified in each LAYER using the material (see below). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $>$ 0 (omitted) No constant - -**matCond=*float*** - -Conductivity of material. Note that conductivity is *always* stated for a 1 foot thickness, even when matThk is specified; if the conductance is known for a specific thickness, an expression can be used to derive matCond. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------------- ----------------- ------------- -------------- ----------------- - Btuh-ft/ft^2^-^o^F *x* $>$ 0 *none* Yes constant - -**matCondT=*float*** - -Temperature at which matCond is rated. See matCondCT (next). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $>$ 0 70 ^o^F No constant - -**matCondCT=*float*** - -Coefficient for temperature adjustment of matCond in the forward difference surface conduction model. Each hour (not subhour), the conductivity of layers using this material are adjusted as followslrCond = matCond \* (1 + matCondCT\*(T~layer~ – matCondT)) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F^-1^ 0 No constant - -Note: A typical value of matCondCT for fiberglass batt insulation is 0.00418 F^-1^ - -**matSpHt=*float*** - -Specific heat of material. - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------- ----------------- ------------------------ -------------- ----------------- - Btu/lb-^o^F *x* $\ge$ 0 0 (thermally massless) No constant - -**matDens=*float*** - -Density of material. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------- -------------- ----------------- - lb/ft^3^ *x* $\ge$ 0 0 (massless) No constant - -**matRNom=*float*** - -Nominal R-value per foot of material. Appropriate for insulation materials only and *used for documentation only*. If specified, the current material is taken to have a nominal R-value that contributes to the reported nominal R-value for a construction. As with matCond, matRNom is *always* stated for a 1 foot thickness, even when matThk is specified; if the nominal R-value is known for a specific thickness, an expression can be used to derive matRNom. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - ft^2^-^o^F/Btuh *x* $>$ 0 (omitted) No constant - -**endMaterial** - -Optional to indicate the end of the material. Alternatively, the end of the material definition can be indicated by "END" or simply by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/meter.md b/doc/test/resources/meter.md deleted file mode 100644 index 22eb07a66..000000000 --- a/doc/test/resources/meter.md +++ /dev/null @@ -1,69 +0,0 @@ -# METER - -A METER object is a user-defined "device" that records energy consumption of equipment as simulated by CSE. The user defines METERs with the desired names, then assigns energy uses of specific equipment to the desired meters using commands described under each equipment type's class description (AIRHANDLER, TERMINAL, etc.). Additional energy use from equipment not simulated by CSE (except optionally for its effect on heating and cooling loads) can also be charged to METERs (see GAIN). The data accumulated by meters can be reported at hourly, daily, monthly, and annual (run) intervals by using REPORTs and EXPORTs of type MTR. - -Meters account for energy use in the following pre-defined categories, called *end uses*. The abbreviations in parentheses are used in MTR report headings (and for gnMeter input, below). - -- Total use -- Space Cooling Use (Clg) -- Space Heating Use - including heat pump compressor (Htg) -- Heat Pump Backup Heat (HPHtg) -- Domestic (Service) -- Hot Water Heating (DHW) -- Fans – AC and cooling ventilation (FanC) -- Fans – heating (FanH) -- Fans – IAQ venting (FanV) -- Fans -- other (Fan) -- HVAC Auxiliary - not including fans (Aux) -- Process Energy (Proc) -- Lighting (Lit) -- Receptacles (Rcp) -- Exterior (Ext) -- Refrigeration (Refr) -- Dish washing (Dish) -- Clothes drying (Dry) -- Clothes washing (Wash) -- Cooking (Cook) -- User defined 1 (User1) -- User defined 2 (User2) - -The user has complete freedom over how many meters are defined and how equipment is assigned to them. At one extreme, a single meter "Electricity" could be defined and have all of electrical uses assigned to it. On the other hand, definition of separate meters "Elect\_Fan1", "Elect\_Fan2", and so forth allows accounting of the electricity use for individual pieces of equipment. Various groupings are possible: for example, in a building with several air handlers, one could separate the energy consumption of the fans from the coils, or one could separate the energy use by air handler, or both ways, depending on the information desired from the run. - -The members which assign energy use to meters include: - -- GAIN: gnMeter, gnEndUse -- ZONE: xfanMtr -- IZXFER: izfanMtr -- RSYS: rsElecMtr, rsFuelMtr -- DHWSYS -- DHWHEATER -- DHWPUMP -- DHWLOOPPUMP -- TERMINAL: tuhcMtr, tfanMtr -- AIRHANDLER: sfanMtr, rfanMtr, ahhcMtr, ahccMtr, ahhcAuxOnMtr, ahhcAuxOffMtr, ahhcAuxFullOnMtr, ahhcAuxOnAtAllMtr, ahccAuxOnMtr, ahccAuxOffMtr, ahccAuxFullOnMtr, ahccAuxOnAtAllMtr -- BOILER: blrMtr, blrpMtr, blrAuxOnMtr, blrAuxOffMtr, blrAuxFullOnMtr, blrAuxOnAtAllMtr -- CHILLER: chMtr, chppMtr, chcpMtr, chAuxOnMtr, chAuxOffMtr, chAuxFullOnMtr, chAuxOnAtAllMtr -- TOWERPLANT: tpMtr - -The end use can be specified by the user only for GAINs; in other cases it is hard-wired to Clg, Htg, FanC, FanH, FanV, Fan, or Aux as appropriate. - -**mtrName** - -Name of meter: required for assigning energy uses to the meter elsewhere. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* Yes constant - - -**endMeter** - -Indicates the end of the meter definition. Alternatively, the end of the meter definition can be indicated by the declaration of another object or by END. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/perimeter.md b/doc/test/resources/perimeter.md deleted file mode 100644 index b113fe6ee..000000000 --- a/doc/test/resources/perimeter.md +++ /dev/null @@ -1,37 +0,0 @@ -# PERIMETER - -PERIMETER defines a subobject belonging to the current zone that represents a length of exposed edge of a (slab on grade) floor. - -**prName** - -Optional name of perimeter. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**prLen=*float*** - -Length of exposed perimeter. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $>$ 0 *none* Yes constant - -**prF2=*float*** - -Perimeter conduction per unit length. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------- ----------------- ------------- -------------- ----------------- - Btuh/ft-^o^F *x* $>$ 0 *none* Yes constant - -**endPerimeter** - -Optionally indicates the end of the perimeter definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/pvarray.md b/doc/test/resources/pvarray.md deleted file mode 100644 index 209e2327f..000000000 --- a/doc/test/resources/pvarray.md +++ /dev/null @@ -1,224 +0,0 @@ -# PVARRAY - -PVARRAY describes a photovoltaic panel system. The algorithms are based on the [PVWatts calculator](http://www.bwilcox.com/BEES/docs/Dobos%20-%20PVWatts%20v5.pdf). - -**pvName** - -Name of photovoltaic array. Give after the word PVARRAY. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**pvElecMeter=*choice*** - -Name of meter by which this PVARRAY's AC power out is recorded. Generated power is expressed as a negative value. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - meter name *none* No constant - -**pvEndUse=*choice*** - -Meter end use to which the PVARRAY's generated energy should be accumulated. - - ------- ------------------------------------------------------------- - Clg Cooling - Htg Heating (includes heat pump compressor) - HPHTG Heat pump backup heat - DHW Domestic (service) hot water - DHWBU Domestic (service) hot water heating backup (HPWH resistance) - FANC Fans, AC and cooling ventilation - FANH Fans, heating - FANV Fans, IAQ venting - FAN Fans, other purposes - AUX HVAC auxiliaries such as pumps - PROC Process - LIT Lighting - RCP Receptacles - EXT Exterior lighting - REFR Refrigeration - DISH Dishwashing - DRY Clothes drying - WASH Clothes washing - COOK Cooking - USER1 User-defined category 1 - USER2 User-defined category 2 - PV Photovoltaic power generation - ------- ------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------- ------------- -------------- ----------------- - *Codes listed above* PV No constant - -**pvDCSysSize=*float*** - -The rated photovoltaic system DC capacity/size as indicated by the nameplate. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - kW *x* ≥ 0 *none* Yes constant - -**pvModuleType=*choice*** - -Type of module to model. The module type determines the refraction index and temperature coefficient used in the simulation. Alternatively, the "Custom" module type may be used in conjunction with user-defined input for *pvCoverRefrInd* and *pvTempCoeff*. - - **Module Type** **pvCoverRefrInd** **pvTempCoeff** - --------------- ------------------ --------------- - Standard 1.0 -0.0026 - Premium 1.3 -0.0019 - ThinFilm 1.0 -0.0011 - Custom User-defined User-defined - - -------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ----------- ------------ --------------- - Standard \ Standard No constant - Premium \ - ThinFilm \ - Custom - - -------------------------------------------------------------- - -**pvCoverRefrInd=*float*** - -The refraction index for the coating applied to the module cover. A value of 1.0 represents refraction through air. Coatings have higher refraction indexes that capture more solar at lower angles of incidence. - - ------------------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - *x* ≥ 1.0 1.0 No constant - - ------------------------------------------------------------------------------ - -**pvTempCoeff=*float*** - -The temperature coefficient how the efficiency of the module varies with the cell temperature. Values are typically negative. - - ------------------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ------------- -------------- ----------------- - 1/^o^F *no restrictions* -0.0026 No constant - - ------------------------------------------------------------------------------ - -**pvArrayType=*choice*** - -The type of array describes mounting and tracking options. Roof mounted arrays have a higher installed nominal operating cell temperature (INOCT) of 120 ^o^F compared to the default of 113 ^o^F. Array self-shading is not currently calculated for adjacent rows of modules within an array. - - **Units** **Legal Range** **Default** **Required** **Variability** - --------- ---------------- ------------- ------------ --------------- - FixedOpenRack, FixedOpenRack No constant - FixedRoofMount, - OneAxisTracking, - TwoAxisTracking - - - -**pvTilt=*float*** - -The tilt of the photovoltaic array from horizontal. Values outside the range 0 to 360 are first normalized to that range. For one-axis tracking, defines the tilt of the rotation axis. Not used for two-axis tracking arrays. - - ------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - --------- --------------- ----------- ------------ --------------- - degrees unrestricted 0.0 No hourly - - ------------------------------------------------------------------ - -**pvAzm=*float*** - -Photovoltaic array azimuth (0 = north, 90 = east, etc.). If a value outside the range 0^o^ $\leq$ *x* $<$ 360^o^ is given, it is normalized to that range. For one-axis tracking, defines the azimuth of the rotation axis. Not used for two-axis tracking arrays. - - ------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - --------- --------------- ----------- ------------ --------------- - degrees unrestricted 0.0 No hourly - - ------------------------------------------------------------------ - -**pvGrndRefl=*float*** - -Ground reflectance used for calculating reflected solar incidence on the array. - - ------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - --------- --------------- ----------- ------------ --------------- - 0 < *x* 0.2 No hourly - $\le$ 1.0 - - ------------------------------------------------------------------ - - - -**pvDCtoACRatio=*float*** - -DC-to-AC ratio used to intentionally undersize the AC inverter. This is used to increase energy production in the beginning and end of the day despite the possibility of clipping peak sun hours. - - ------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - --------- --------------- ----------- ------------ --------------- - *x* > 0.0 1.1 No constant - - ------------------------------------------------------------------ - -**pvInverterEff=*float*** - -AC inverter efficiency at rated DC power. - - ------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ---------- ----------- ------------ --------------- - 0 < *x* 0.96 No constant - $\le$ 1.0 - - ------------------------------------------------------------- - -**pvSysLosses=*float*** - -Fraction of total DC energy lost. The total loss from a system is aggregated from several possible causes as illustrated below: - - **Loss Type** **Default Assumption** - ------------------------- ---------------------- - Soiling 0.02 - Shading 0.03 - Snow 0 - Mismatch 0.02 - Wiring 0.02 - Connections 0.005 - Light-induced degradation 0.015 - Nameplate rating 0.01 - Age 0 - Availability 0.03 - **Total** **0.14** - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - 0 < 0.14 No hourly - *x* - $\le$ 1.0 - - ------------------------------------------------------------ - -**endPVARRAY** - -Optionally indicates the end of the PVARRAY definition. Alternatively, the end of the definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant diff --git a/doc/test/resources/report.md b/doc/test/resources/report.md deleted file mode 100644 index a6103c7ec..000000000 --- a/doc/test/resources/report.md +++ /dev/null @@ -1,280 +0,0 @@ -# REPORT - -REPORT generates a report object to specify output of specific textual information about the results of the run, the input data, the error messages, etc. The various report types available are enumerated in the description of *rpType* in this section, and may be described at greater length in Section 6. - -REPORTs are output by CSE to files, via the REPORTFILE object (previous section). After CSE has completed, you may print the report file(s), examine them with a text editor or by TYPEing, process them with another program, etc., as desired. - -REPORTs that you do not direct to a different file are written to the automatically-supplied "Primary" report file, whose file name is (by default) the input file name with the extension changed to .REP. - -Each report consists of a report header, one or more data rows, and a report footer. The header gives the report type (as specified with *rpType*, described below), the frequency (as specified with *rpFreq)*, the month or date where appropriate, and includes headings for the report's columns where appropriate. - -Usually a report has one data row for each interval being reported. For example, a daily report has a row for each day, with the day of the month shown in the first column. - -The report footer usually contains a line showing totals for the rows in the report. - -The header-data-footer sequence is repeated as necessary. For example, a daily report extending over more than one month has a header-data-footer sequence for each month. The header shows the month name; the data rows show the day of the month; the footer contains totals for the month. - -In addition to the headers and footers of individual reports, the report file has (by default) *page headers* and *footers*, described in the preceding section. - -**Default Reports:** CSE generates the following reports by default for each run, in the order shown. They are output by default to the "Primary" report file. They may be ALTERed or DELETEd as desired, using the object names shown. - - ---------------------------------------------------------------------- - rpName rpType Additional members - ------------- ------------- ------------------------------------------ - Err ERR - - eb ZEB rpFreq=MONTH;\ - rpZone=SUM; - - Log LOG - - Inp INP - ---------------------------------------------------------------------- - - -Any reports specified by the user and not assigned to another file appear in the Primary report file between the default reports "eb" and "Log", in the order in which the REPORT objects are given in the input file. - -Because of the many types of reports supported, the members required for each REPORT depend on the report type and frequency in a complex manner. When in doubt, testing is helpful: try your proposed REPORT specification; if it is incomplete or overspecified, CSE will issue specific error messages telling you what additional members are required or what inappropriate members have been given and why. - -**rpName** - -Name of report. Give after the word REPORT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**rpReportfile=*rfname*** - -Name of report file to which current report will be written. If omitted, if REPORT is within a REPORTFILE object, report will be written to that report file, or else to REPORTFILE "Primary", which (as described in previous section) is automatically supplied and by default uses the file name of the input file with the extension .REP. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ---------------------------------------------- -------------- ----------------- - name of a *REPORTFILE* current *REPORTFILE*, if any, else "Primary" No constant - -**rpType=*choice*** - -Choice indicating report type. Report types may be described at greater length, with examples, in Section 6. - - ------- -------------------------------------------------------------- - ERR Error and warning messages. If there are any such messages, - they are also displayed on the screen *AND* written to a file - with the same name as the input file and extension .ERR. - Furthermore, \* \*many error messages are repeated in the INP - report. - - LOG Run "log". As of July 1992, contains only CSE version number; - should be enhanced or deleted.?? - - INP Input echo: shows the portion of the input file used to - specify this run. Does not repeat descriptions of objects left - from prior runs in the same session when CLEAR is not used. - - Error and warning messages relating to specific lines of the - input are repeated after or near the line to which they - relate, prefixed with "?". Lines not used due to a - preprocessor \#if command (Section 4.4.4) with a false - expression are prefixed with a "0" in the leftmost column; all - preprocessor command lines are prefixed with a "\#" in that - column. - - SUM Run summary. As of July 1992, *NOT IMPLEMENTED*: generates no - output and no error message. Should be defined and - implemented, or else deleted??. - - ZDD Zone data dump. Detailed dump of internal simulation values, - useful for verifying that your input is as desired. Should be - made less cryptic (July 1992)??. Requires *rpZone*. - - ZST Zone statistics. Requires *rpZone*. - - ZEB Zone energy balance. Requires *rpZone*. - - MTR Meter report. Requires *rpMeter*. - - AH Air handler report. Requires *rpAh*. - - AHSIZE Air handler autosizing report. Requires *rpAh*. - - AHLOAD Air handler load report. Requires *rpAh*. TODO - - TUSIZE Terminal autosizing report. Requires *rpTu.* - - TULOAD Terminal load. Requires *rpTu.* TODO - - UDT User-defined table. Data items are specified with REPORTCOL - commands (next section). Allows creating almost any desired - report by using CSE expressions to specify numeric or string - values to tabulate; "Probes" may be used in the expressions to - access CSE internal data. - ------- -------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *see above* Yes constant - -The next three members specify how frequently values are reported and the start and end dates for the REPORT. They are not allowed with *rpTypes* ERR, LOG, INP, SUM, and ZDD, which involve no time-varying data. - -**rpFreq=*choice*** - -Report Frequency: specifies interval for generating rows of report data: - - ------------------ --------------------------------------------------- - YEAR at run completion - - MONTH at end of each month (and at run completion if - mid-month) - - DAY at end of each day - - HOUR at end of each hour - - HOURANDSUB at end of each subhour AND at end of hour - - SUBHOUR at end of each subhour - ------------------ --------------------------------------------------- - -*RpFreq* values of HOURANDSUB and SUBHOUR are not supported with *rpType*'s of MTR and ZST, nor if *rpType* is ZEB or AH and *rpZone* or *rpAh* is SUM. - -We recommend using HOURly and more frequent reports sparingly, to report on only a few typical or extreme days, or to explore a problem once it is known what day(s) it occurs on. Specifying such reports for a full-year run will generate a huge amount of output and cause extremely slow CSE execution. - - -------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ----------- ------------ --------------- - YEAR, Required for constant - MONTH, *rpTypes* - DAY, HOUR, ZEB, ZST, - HOURANDSUB, MTR, AH, - SUBHOUR and UDT - - -------------------------------------------------------------- - -**rpDayBeg=*date*** - -Initial day of period to be reported. Reports for which *rpFreq* = YEAR do not allow specification of *rpDayBeg* and *rpDayEnd*; for MONTH reports, these members default to include all months in the run; for DAY and shorter-interval reports, *rpDayBeg* is required and *rpDayEnd* defaults to *rpDayBeg*. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - *date* first day Required for constant - of *rpTypes* - simulation ZEB, ZST, - if MTR, AH, - *rpFreq* = and UDT if - MONTH *rpFreq* is - DAY, HOUR, - HOURANDSUB, - or SUBHOUR - - ------------------------------------------------------------ - -**rpDayEnd=*date*** - -Final day of period to be reported, except for YEAR reports. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------------------------------ -------------- ----------------- - *date* last day of simulation if *rpFreq*= MONTH, else *rpDayBeg* No constant - -**rpZone=*znName*** - -Name of ZONE for which a ZEB, ZST, or ZDD report is being requested. For *rpType* ZEB or ZST, you may use *rpZone*=SUM to obtain a report showing only the sum of the data for all zones, or *rpZone*=ALL to obtain a report showing, for each time interval, a row of data for each zone plus a sum-of-zones row. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------- ------------- ------------------------------------------- ----------------- - name of a *ZONE*, ALL, SUM Required for *rpTypes* ZDD, ZEB, and ZST. constant - -**rpMeter=*mtrName*** - -Specifies meter(s) to be reported, for *rpType*=MTR. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------------- ------------- --------------------------- ----------------- - name of a *METER*, ALL, SUM Required for *rpType*=MTR constant - -**rpAh=ah*Name*** - -Specifies air handler(s) to be reported, for *rpType*=AH, AHSIZE, or AHLOAD. - - ---------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------- ----------- ------------ --------------- - name of an Required for constant - *AIRHANDLER*, *rpType*=AH, - ALL, SUM AHSIZE, or - AHSIZE - - ---------------------------------------------------------------- - -**rpTu=tu*Name*** - -Specifies air handler(s) to be reported, for *rpType*=TUSIZE or TULOAD. TODO - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------ ------------- ------------------------- ----------------- - name of a TERMINAL, ALL, SUM Required for *rpType*=? constant - -**rpBtuSf=*float*** - -Scale factor to be used when reporting energy values. Internally, all energy values are represented in Btu. This member allows scaling to more convenient units for output. *rpBtuSf* is not shown in the output, so if you change it, be sure the readers of the report know the energy units being used. *rpBtuSf* is not applied in UDT reports, but column values can be scaled as needed with expressions. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------------------------------- -------------- ----------------- - *any multiple of ten* 1,000,000: energy reported in MBtu. No constant - -**rpCond=*expression*** - -Conditional reporting flag. If given, report rows are printed only when value of expression is non-0. Permits selective reporting according to any condition that can be expressed as a CSE expression. Such conditional reporting can be used to shorten output and make it easy to find data of interest when you are only interested in the information under exceptional conditions, such as excessive zone temperature. Allowed with *rpTypes* ZEB, ZST, MTR, AH, and UDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------- ----------------------- -------------- -------------------------- - *any numeric expression* 1 (reporting enabled) No subhour /end of interval - -**rpCPL=*int*** - -Characters per line for a User-Defined report. If widths specified in REPORTCOLs (next section) add up to more than this, an error occurs; if they total substantially less, additional whitespace is inserted between columns to make the report more readable. Not allowed if *rpType* is not UDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ -------------------- -------------- ----------------- - 78 $\le$ *x* $\le$ 132 top level *repCPL* No constant - -**rpTitle=*string*** - -Title for use in report header of User-Defined report. Disallowed if *rpType* is not UDT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------- -------------- ----------------- - "User-defined Report" No constant - -**rpHeader=*choice*** - -Use NO to suppress the report header which gives the report type, zone, meter, or air handler being reported, time interval, column headings, etc. One reason to do this might be if you are putting only a single report in a report file and intend to later embed the report in a document or process it with some other program (but for the latter, see also EXPORT, below). - -Use with caution, as the header contains much of the identification of the data. For example, in an hourly report, only the hour of the day is shown in each data row; the day and month are shown in the header, which is repeated for each 24 data rows. - -See REPORTFILE member *rfPageFmt*, above, to control report *FILE* page headers and footers, as opposed to *REPORT* headers and footers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO YES No constant - -**rpFooter=*choice*** - -Use NO to suppress the report footers. The report footer is usually a row which sums hourly data for the day, daily data for the month, or monthly data for the year. For a report with *rpZone, rpMeter,*or *rpAh* = ALL, the footer row shows sums for all zones, meters, or air handlers. Sometimes the footer is merely a blank line. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO YES No constant - -**endReport** - -Optionally indicates the end of the report definition. Alternatively, the end of the report definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/reportcol.md b/doc/test/resources/reportcol.md deleted file mode 100644 index 696f87bf0..000000000 --- a/doc/test/resources/reportcol.md +++ /dev/null @@ -1,80 +0,0 @@ -# REPORTCOL - -Each REPORTCOL defines a single column of a User Defined Table (UDT) report. REPORTCOLs are not used with report types other than UDT. - -Use as many REPORTCOLs as there are values to be shown in each row of the user-defined report. The values will appear in columns, ordered from left to right in the order defined. Be sure to include any necessary values to identify the row, such as the day of month, hour of day, etc. CSE supplies *NO* columns automatically. - -**colName** - -Name of REPORTCOL. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**colReport=*rpName*** - -Name of report to which current report column belongs. If REPORTCOL is given within a REPORT object, then *colReport* defaults to that report. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- -------------------------- ---------------------- ----------------- - name of a *REPORT* *current report, if any* Unless in a *REPORT* constant - -**colVal=*expression*** - -Value to show in this column of report. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------------------ ------------- -------------- ----------------------- - *any numeric or string expression* Yes subhour /end interval - -**colHead=*string*** - -Text used for column head. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------- -------------- ----------------- - *colName* or blank No constant - -**colGap=*int*** - -Space between (to left of) column, in character positions. Allows you to space columns unequally, to emphasize relations among columns or to improve readability. If the total of the *colGaps* and *colWids* in the report's REPORTCOLs is substantially less than the REPORT's *rpCPL* (characters per line, previous section), CSE will insert additional spaces between columns. To suppress these spaces, use a smaller *rpCPL*. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 1 No constant - -**colWid=*int*** - -Column width. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 10 No constant - -**colDec=*int*** - -Number of digits after decimal point. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------- -------------- ----------------- - *x* $\ge$ 0 *flexible format* No constant - -**colJust=*choice*** - -Specifies positioning of data within column: - - ------- ----------------- - Left Left justified - Right Right justified - ------- ----------------- - -**endReportCol** - -Optionally indicates the end of the report column definition. Alternatively, the end of the report column definition can be indicated by END or by beginning another REPORTCOL or other object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/reportfile.md b/doc/test/resources/reportfile.md deleted file mode 100644 index 6eced9e13..000000000 --- a/doc/test/resources/reportfile.md +++ /dev/null @@ -1,92 +0,0 @@ -# REPORTFILE - -REPORTFILE allows optional specification of different or additional files to receive CSE reports. - -By default, CSE generates several "reports" on each run showing the simulated HVAC energy use, the input statements specifying the run, any error or warning messages, etc. Different or additional reports can be specified using the REPORT object, described in Section 5.25, next. - -All CSE reports are written to text files as plain ASCII text. The files may be printed (on most printers other than postscript printers) by copying them to your printer with the COPY command. Since many built-in reports are over 80 characters wide; you may want to set your printer for "compressed" characters or a small font first. You may wish to examine the report file with a text editor or LIST program before printing it. (?? Improve printing discussion) - -By default, the reports are output to a file with the same name as the input file and extension .REP, in the same directory as the input file. By default, this file is formatted into pages, and overwrites any existing file of the same name without warning. CSE automatically generates a REPORTFILE object called "Primary" for this report file, as though the following input had been given: - - REPORTFILE "Primary" - rfFileName = .REP; - // other members defaulted: rfFileStat=OVERWRITE; rfPageFmt=YES. - -Using REPORTFILE, you can specify additional report files. REPORTs specified within a REPORTFILE object definition are output by default to that file; REPORTs specified elsewhere may be directed to a specific report file with the REPORT member *rpReportFile*. Any number of REPORTFILEs and REPORTs may be used in a run or session. Any number of REPORTs can be directed to each REPORTFILE. - -Using ALTER (Section 4.5.1.2) with REPORTFILE, you can change the characteristics of the Primary report output file. For example: - - ALTER REPORTFILE Primary - rfPageFmt = NO; // do not format into pages - rfFileStat = NEW; // error if file exists - -**rfName** - -Name of REPORTFILE object, given immediately after the word REPORTFILE. Note that this name, not the fileName of the report file, is used to refer to the REPORTFILE in REPORTs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* No constant - -**rfFileName=*path*** - -path name of file to be written. If no path is specified, the file is written in the current directory. The default extension is .REP. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------------- ------------- -------------- ----------------- - file name, path and extension optional Yes constant - -**rfFileStat=*choice*** - -Choice indicating what CSE should do if the file specified by *rfFileName*already exists: - - ------------ --------------------------------------------------------- - OVERWRITE Overwrite pre-existing file. - - NEW Issue error message if file exists at beginning of - session. If there are several runs in session using same - file, output from runs after the first will append. - - APPEND Append new output to present contents of existing file. - ------------ --------------------------------------------------------- - -If the specified file does not exist, it is created and *rfFileStat* has no effect. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - OVERWRITE, NEW, APPEND OVERWRITE No constant - -**rfPageFmt=*Choice*** - -Choice controlling page formatting. Page formatting consists of dividing the output into pages (with form feed characters), starting a new page before each report too long to fit on the current page, and putting headers and footers on each page. Page formatting makes attractive printed output but is a distraction when examining the output on the screen and may inappropriate if you are going to further process the output with another program. - - ----- ---------------------------------------------------------------- - Yes Do page formatting in this report file. - - No Suppress page formatting. Output is continuous, uninterrupted by - page headers and footers or large blank spaces. - ----- ---------------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Yes, No Yes No constant - -Unless page formatting is suppressed, the page formats for all report files are controlled by the TOP members *repHdrL, repHdrR, repLPP, repTopM, repBotM,*and *repCPL*, described in Section 5.1. - -Each page header shows the *repHdrL* and *repHdrR* text, if given. - -Each page footer shows the input file name, run serial number within session (see *runSerial* in Section 5.1), user-input *runTitle* (see Section 5.1), date and time of run, and page number in file. - -Vertical page layout is controlled by *repLPP, repTopM,* and *repBotM* (Section 5.1). The width of each header and footer is controlled by *repCPL*. Since many built-in reports are now over 80 columns wide, you may want to use repCPL=120 or repCPL=132 to make the headers and footers match the text better. - -In addition to report file *page* headers and footers, individual REPORTs have *REPORT* headers and footers related to the report content. These are described under REPORT, Section 5.25. - -**endReportFile** - -Optionally indicates the end of the report file definition. Alternatively, the end of the report file definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/rsys.md b/doc/test/resources/rsys.md deleted file mode 100644 index 882570cef..000000000 --- a/doc/test/resources/rsys.md +++ /dev/null @@ -1,360 +0,0 @@ -# RSYS - -RSYS constructs an object representing an air-based residential HVAC system. - -**rsName** - -Optional name of HVAC system; give after the word “RSYS” if desired. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**rsType=*choice*** - -Specifies type of system. - - --------------- --------------------------------------- - ACFURNACE Compressor-based cooling and fuel-fired - heating. Primary heating input energy - is accumulated to end use HTG of meter - rsFuelMtr. - - ACRESISTANCE Compressor-based cooling and electric - (“strip”) heating. Primary heating - input energy is accumulated to end use - HTG of meter rsElecMtr. - - ASHP Air-source heat pump (compressor-based - heating and cooling). Primary - (compressor) heating input energy is - accumulated to end use HTG of meter - rsElecMtr. Auxililary heating input - energy is accumulated to end use HPHTG - of meter rsElecMtr. - - AC Compressor-based cooling; no heating. - - FURNACE Fuel-fired heating. Primary heating - input energy is accumulated to end use - HTG of meter rsFuelMtr. - - RESISTANCE Electric heating. Primary heating input - energy is accumulated to end use HTG of - meter rsElecMtr - --------------- --------------------------------------- - - ---------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------- ----------- ------------ --------------- - ACFURNACE, No constant - ACRESISTANCE, - ACFURNACE - ASHP, AC, - FURNACE, - RESISTANCE - - ---------------------------------------------------------------- - -**rsDesc=*string*** - -Text description of system, included as documentation in debugging reports such as those triggered by rsPerfMap=YES - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - string *blank* No constant - -**rsModeCtrl=*choice*** - -Specifies systems heating/cooling availability during simulation. - - ------- --------------------------------------- - OFF System is off (neither heating nor - cooling is available) - - HEAT System can heat (assuming rsType can - heat) - - COOL System can cool (assuming rsType can - cool) - - AUTO System can either heat or cool - (assuming rsType compatibility). First - request by any zone served by this RSYS - determines mode for the current time - step. - ------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - OFF, HEAT, COOL, AUTO AUTO No hourly - -**rsPerfMap=*choice*** - -Generate performance map(s) for this RSYS. Comma-separated text is written to file PM\_.csv. This is a debugging capabilitiy that is not necessarily maintained. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NO, YES NO No constant - -**rsFanTy=*choice*** - -Specifies fan (blower) position relative to cooling coil. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - BLOWTHRU, DRAWTHRU BLOWTHRU No constant - -**rsFanMotTy=*choice*** - -Specifies type of motor driving the fan (blower). This is used in the derivation of the coil-only cooling capacity for the RSYS. - - ----- -------------------------------------- - PSC Permanent split capacitor - BPM Brushless permanent magnet (aka ECM) - ----- -------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - PSC, BPM PSC No constant - -**rsElecMtr=*mtrName*** - -Name of METER object, if any, by which system’s electrical energy use is recorded (under appropriate end uses). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**rsFuelMtr =*mtrName*** - -Name of METER object, if any, by which system’s fuel energy use is recorded (under appropriate end uses). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**rsAFUE=*float*** - -Heating Annual Fuel Utilization Efficiency (AFUE). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------------------------- -------------- ----------------- - 0 $<$ x $\le$ 1 0.9 if furnace, 1.0 if resistance No constant - -**rsCapH=*float*** - -Heating capacity, used when rsType is ACFURNACE, ACRESISTANCE, FURNACE, or RESISTANCE. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ------------- -------------- ----------------- - Btu/hr *AUTOSIZE* or x $\ge$ 0 0 No constant - -**rsTdDesH=*float*** - -Nominal heating temperature rise (across system, not zone) used during autosizing (when capacity is not yet known). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------- -------------- ----------------- - ^o^F *x* $>$ 0 30 if ASHP else 50 No constant - -**rsFxCapH=*float*** - -Heating autosizing capacity factor. rsCapH is set to rsFxCapH $\times$ (peak design-day load). Peak design-day load is the heating capacity that holds zone temperature at the thermostat set point during the *last substep* of all hours of all design days. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1.4 No constant - -**rsFanPwrH=*float*** - -Heating fan power. Heating air flow is estimated based on a 50 ^o^F temperature rise. - - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W/cfm *x* $\ge$ 0 .365 No constant - -**rsHSPF=*float*** - -For rsType=ASHP, Heating Seasonal Performance Factor (HSPF). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------------- ----------------- - Btu/Wh *x* $>$ 0 Yes if rsType=ASHP constant - -**rsCap47=*float*** - -For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 47 ^o^F. If both rsCap47 and rsCapC are autosized, both are set to the larger consistent value. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ---------------------- -------------- ----------------- - Btu/Wh *AUTOSIZE* or *x* $>$ 0 Estimate from rsCapC no constant - -**rsCap35=*float*** - -For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 35 ^o^F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------------------ -------------- ----------------- - Btu/Wh *x* $>$ 0 Estimated from rsCap47 and rsCap17 no constant - -**rsCap17=*float*** - -For rsType=ASHP, rated heating capacity at outdoor dry-bulb temperature = 17 ^o^F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------ -------------- ----------------- - Btu/Wh *x* $>$ 0 Estimated from rsCap47 no constant - -**rsCOP47=*float*** - -For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 47 ^o^F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------- -------------- ----------------- - *x* $>$ 0 Estimated from rsHSPF, rsCap47, and rsCap17 no constant - -**rsCOP35=*float*** - -For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 35 ^o^F. - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------------- ------------ --------------- - *x* $>$ 0 Estimated from no constant - rsCap35, rsCap47, - rsCap17, rsCOP47, - and rsCOP17 - - ------------------------------------------------------------------ - -**rsCOP17=*float*** - -For rsType=ASHP, rated heating coefficient of performance at outdoor dry-bulb temperature = 17 ^o^F. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------------------------------- -------------- ----------------- - *x* $>$ 0 Estimated from rsHSPF, rsCap47, and rsCap17 no constant - -**rsCapAuxH=*float*** - -For rsType=ASHP, auxiliary electric (“strip”) heating capacity. If autosized, rsCapAuxH is set to the peak heating load in excess of heat pump capacity evaluated at the heating design temperature (Top.heatDsTDbO). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------- ------------- -------------- ----------------- - Btu/hr *AUTOSIZE* or *x* $\ge$ 0 0 no constant - -**rsCOPAuxH=*float*** - -For rsType=ASHP, auxiliary electric (“strip”) heating coefficient of performance. Energy use for auxiliary heat is accumulated to end use HPHTG of meter rsElecMtr (that is, auxiliary heat is assumed to be electric). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\ge$ 0 1.0 no constant - -**rsSEER=*float*** - -Cooling rated Seasonal Energy Efficiency Ratio (SEER). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btu/Wh *x* $>$ 0 Yes constant - -**rsEER=*float*** - -Cooling Energy Efficiency Ratio (EER) at standard AHRI rating conditions (outdoor drybulb of 95 ^o^F and entering air at 80 ^o^F drybulb and 67 ^o^F wetbulb). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------------- -------------- ----------------- - Btu/Wh *x* $>$ 0 Estimated from SEER no constant - -**rsCapC=*float*** - -Cooling capacity at standard AHRI rating conditions. If rsType=ASHP and both rsCapC and rsCap47 are autosized, both are set to the larger consistent value. - - ----------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - ---------- --------------- ------------ --------------- --------------- - Btu/hr *AUTOSIZE* or Yes if rsType constant - *x* $\le$ 0 (x includes - $>$ 0 coverted cooling - to $<$ 0) - ----------------------------------------------------------------------- - -**rsTdDesC=*float*** - -Nominal cooling temperature fall (across system, not zone) used during autosizing (when capacity is not yet known). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $<$ 0 -25 No constant - -**rsFxCapC=*float*** - -Cooling autosizing capacity factor. rsCapC is set to rsFxCapC $\times$ (peak design-day load). Peak design-day load is the cooling capacity that holds zone temperature at the thermostat set point during the *last substep* of all hours of all design days. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1.4 No constant - -**rsFChg=*float*** - -Refrigerant charge adjustment factor. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1 no constant - -**rsFSize=*float*** - -Compressor sizing factor. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1 no constant - -**rsVFPerTon=*float*** - -Standard air volumetric flow rate per nominal ton of cooling capacity. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - cfm/ton 150 $\le$ x $\le$ 500 350 no constant - -**rsFanPwrC=*float*** - -Cooling fan power. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - W/cfm *x* $\ge$ 0 .365 No constant - -**rsRhIn=*float*** - -Entering air relative humidity (for model testing). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- --------------------------------- -------------- ----------------- - W/cfm 0 $\le$ *x* $\le$ 1 Derived from entering air state No constant - -**rsTdbOut=*float*** - -Air dry-bulb temperature at the outdoor portion of this system. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------- -------------- ----------------- - ^o^F From weather file No hourly - -**endRSYS** - -Optionally indicates the end of the RSYS definition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant diff --git a/doc/test/resources/sgdist.md b/doc/test/resources/sgdist.md deleted file mode 100644 index bfbc79b78..000000000 --- a/doc/test/resources/sgdist.md +++ /dev/null @@ -1,84 +0,0 @@ -# SGDIST - -SGDIST creates a subobject of the current window that distributes a specified fraction of that window's solar gain to a specified delayed model (massive) surface. Any remaining solar gain (all of the window's solar gain if no SGDISTs are given) is added to the air of the zone containing the window. A window may have up to three SGDISTs; an error occurs if more than 100% of the window's gain is distributed. - -Via members sgFSO and sgFSC, the fraction of the insolation distributed to the surface can be made dependent on whether the zone's shades are open or closed (see ZONE member znSC). - -**sgName** - -Name of solar gain distribution (follows "SGDIST" if given). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -sgSurf=*sfName* - -Name of surface to which gain is targeted. - -If there is more than surface with the specified name: if one of the surfaces is in the current zone, it is used; otherwise, an error message is issued. - - -The specified surface must be modeled with the Delayed model. If gain is targeted to a Quick model surface, a warning message is issued and the gain is redirected to the air of the associated zone. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - name of a *SURFACE* *none* Yes constant - -**sgSide=*choice*** - -Designates the side of the surface to which the gain is to be targeted: - - ---------- ----------------------------------- - INTERIOR Apply gain to interior of surface - EXTERIOR Apply gain to exterior of surface - ---------- ----------------------------------- - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - INTERIOR, Side of Yes constant - EXTERIOR surface - in zone - containing - window; or - INTERIOR - if both - sides are - in zone - containing - window. - - ------------------------------------------------------------ - - -**sgFSO=*float*** - -Fraction of solar gain directed to specified surface when the owning window's interior shading is in the open position (when the window's zone's shade closure (znSC) is 0). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------------------------------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1,and sum of window's sgFSO's $\le$ 1 *none* Yes monthly-hourly - -**sgFSC=*float*** - -Fraction of solar gain directed to specified surface when the owning window's interior shading is in the closed position. If the zone's shades are partly closed (znSC between 0 and 1), a proportional fraction between sgFSO and sgFSC is used. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------------------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1, and sum of window's sgFSC's $\le$ 1 *sgFSO* No monthly-hourly - -**endSGDist** - -Optionally indicates the end of the solar gain distribution definition. Alternatively, the end of the solar gain distribution definition can be indicated by END or by just beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/shade.md b/doc/test/resources/shade.md deleted file mode 100644 index 4b5b22341..000000000 --- a/doc/test/resources/shade.md +++ /dev/null @@ -1,128 +0,0 @@ -# SHADE - -SHADE constructs a subobject associated with the current WINDOW that represents fixed shading devices (overhangs and/or fins). A window may have at most one SHADE and only windows in vertical surfaces may have SHADEs. A SHADE can describe an overhang, a left fin, and/or a right fin; absence of any of these is specified by omitting or giving 0 for its depth. SHADE geometry can vary on a monthly basis, allowing modeling of awnings or other seasonal shading strategies. - - -**shName** - -Name of shade; follows the word "SHADE" if given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**ohDepth=*float*** - -Depth of overhang (from plane of window to outside edge of overhang). A zero value indicates no overhang. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**ohDistUp=*float*** - -Distance from top of window to bottom of overhang. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**ohExL=*float*** - -Distance from left edge of window (as viewed from the outside) to the left end of the overhang. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**ohExR=*float*** - -Distance from right edge of window (as viewed from the outside) to the right end of the overhang. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**ohFlap=*float*** - -Height of flap hanging down from outer edge of overhang. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**lfDepth=*float*** - -Depth of left fin from plane of window. A zero value indicates no fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**lfTopUp=*float*** - -Vertical distance from top of window to top of left fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**lfDistL=*float*** - -Distance from left edge of window to left fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**lfBotUp=*float*** - -Vertical distance from bottom of window to bottom of left fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**rfDepth=*float*** - -Depth of right fin from plane of window. A 0 value indicates no fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**rfTopUp=*float*** - -Vertical distance from top of window to top of right fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**rfDistR=*float*** - -Distance from right edge of window to right fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**rfBotUp=*float*** - -Vertical distance from bottom of window to bottom of right fin. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $\ge$ 0 0 No monthly-hourly - -**endShade** - -Optional to indicate the end of the SHADE definition. Alternatively, the end of the shade definition can be indicated by END or the declaration of another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/surface.md b/doc/test/resources/surface.md deleted file mode 100644 index 2c1baa83d..000000000 --- a/doc/test/resources/surface.md +++ /dev/null @@ -1,304 +0,0 @@ -# SURFACE - -Surface constructs a ZONE subobject of class SURFACE that represents a surrounding or interior surface of the zone. Internally, SURFACE generates a QUICK surface (U-value only), a DELAYED (massive) surface (using the finite-difference mass model), interzone QUICK surface, or interzone DELAYED surface, as appropriate for the specified construction and exterior conditions. - -**sfName** - -Name of surface; give after the word SURFACE. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**sfType=*choice*** - -Type of surface: - - ------------- --------------------------------------------------------- - FLOOR Surface defines part or all of the "bottom" of the zone; - it is horizontal with inside facing up. The outside of - the surface is not adjacent to the current zone. - - WALL Surface defines a "side" of the zone; its outside is not - adjacent to the current zone. - - CEILING Surface defines part or all of the "top" of the zone with - the inside facing down. The outside of the surface is not - adjacent to the current zone. - ------------- --------------------------------------------------------- - -sfType is used extensively for default determination and input checking, but does not have any further internal effect. The Floor, Wall, and Ceiling choices identify surfaces that form boundaries between the zone and some other condition. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- -------------- ----------------- - FLOOR WALL CEILING *none* Yes constant - -**sfArea=*float*** - -Gross area of surface. (CSE computes the net area for simulation by subtracting the areas of any windows and doors in the surface.). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $>$ 0 *none* Yes constant - -**sfTilt=*float*** - -Surface tilt from horizontal. Values outside the range 0 to 360 are first normalized to that range. The default and allowed range depend on sfType, as follows: - - ------------------ ------------------------------------------- - sfType = FLOOR *sfTilt*=180, default = 180 (fixed value) - sfType = WALL 60 $<$ *sfTilt* $<$ 180, default = 90 - sfType = CEILING 0 $\leq$ *sfTilt* $\leq$ 60, default = 0 - ------------------ ------------------------------------------- - - **Units** **Legal Range / Default** **Required** **Variability** - ----------- ------------------------------------ -------------- ----------------- - degrees Dependent upon *sfType. See above* No constant - -**sfAzm=*float*** - -Azimuth of surface with respect to znAzm. The azimuth used in simulating a surface is bldgAzm + znAzm + sfAzm; the surface is rotated if any of those are changed. Values outside the range 0 to 360 are normalized to that range. Required for non-horizontal surfaces. - - --------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------ ----------- ------------ --------------- - degrees unrestricted *none* Required if constant - *sfTilt* - $\neq$ 0 - and *sfTilt* - $\neq$ 180 - - --------------------------------------------------------------- - -**sfModel=*choice*** - -Provides user control over how program models this surface: - - ----------------------------------- ----------------------------------- - QUICK Surface is modeled using a simple - conductance. Heat capacity effects - are ignored. Either sfCon or sfU - (next) can be specified. - - DELAYED, DELAYED\_HOUR, Surface is modeled using a - DELAYED\_SUBHOUR multi-layer finite difference - technique that represents heat - capacity effects. If the time - constant of the surface is too - short to accurately simulate, a - warning message is issued and the - Quick model is used. The program - **cannot** use the finite - difference model if sfU rather than - sfCon is specified. - - AUTO Program selects Quick or the - appropriate Delayed automatically - according to the time constant of - the surface (if sfU is specified, - Quick is selected). - - FD (or FORWARD\_DIFFERENCE) Selects the forward difference - model (used with short time steps - and the CZM zone model) - ----------------------------------- ----------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ---------------------------------------------------------- ------------- -------------- ----------------- - QUICK, DELAYED, DELAYED\_HOUR, DELAYED\_SUBOUR, AUTO, FD AUTO No constant - - -One of the following two parameters must be specified: - -**sfCon=*conName*** - -Name of CONSTRUCTION of the surface. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------------- ------------- -------------------- ----------------- - Name of a *CONSTRUCTION* *none* unless *sfU* given constant - -**sfU=*float*** - -Surface U-value (NOT including surface (air film) conductances). For surfaces for which no heat capacity is to be modeled, allows direct entry of U-value without defining a CONSTRUCTION. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------- ---------------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 Determined from *sfCon* if *sfCon* not given constant - -**sfExCnd=*choice*** - -Specifies the thermal conditions assumed at surface exterior, and at exterior of any subobjects (windows or doors) belonging to current surface. The conditions accounted for are dry bulb temperature and incident solar radiation. - - -------------- --------------------------------------- - AMBIENT Exterior surface is exposed to the - "weather" as read from the weather - file. Solar gain is calculated using - solar geometry, sfAzm, sfTilt, and - sfExAbs. - - SPECIFIEDT Exterior surface is exposed to solar - radiation as in AMBIENT, but the dry - bulb temperature is calculated with a - user specified function (sfExT). - sfExAbs can be set to 0 to eliminate - solar effects. - - ADJZN Exterior surface is exposed to another - zone, whose name is specified by - sfAdjZn. Solar gain is 0 unless gain is - targeted to the surface with SGDIST - below. - - ADIABATIC Exterior surface heat flow is 0. - Thermal storage effects of delayed - surfaces are modeled. - -------------- --------------------------------------- - -**sfInH=*float*** - -Inside surface (air film) conductance. Ignored for sfModel = Forward\_Difference. Default depends on the surface type. - - --------------------------- ------ - sfType = FLOOR or CEILING 1.32 - other 1.5 - --------------------------- ------ - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 *see above* No constant - -**sfExH=*float*** - -Outside surface (air film) conductance. Ignored for sfModel = Forward\_Difference. The default value is dependent upon the exterior conditions: - - ------------------------ --------------------------------------- - sfExCnd = AMBIENT dflExH (Top-level member, described - above) - - sfExCnd = SPECIFIEDT dflExH (described above) - - sfExCnd = ADJZN 1.5 - - sfExCnd = ADIABATIC not applicable - ------------------------ --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 see above No constant - -**sfExAbs=*float*** - -Surface exterior absorptivity. - - ------------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ----------- ----------------------- --------------- - (none) 0 $\le$ *x* 0.5 Required if *sfExCon* = monthly- - $\le$ 1 AMBIENT or *sfExCon* = hourly - SPECIFIEDT - ------------------------------------------------------------------------- - -**sfInAbs=*float*** - -Surface interior solar absorptivity. - - ---------------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------ ------------------------ ------------ --------------- - (none) 0 $\le$ *x* sfType = CEILING, 0.2;\ No monthly- - $\le$ 1 sfType = WALL, 0.6;\ hourly - sfType = FLOOR, 0.8 - ---------------------------------------------------------------------------- - -**sfExEpsLW=*float*** - -Surface exterior long wave (thermal) emittance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.9 No constant - -**sfInEpsLW=*float*** - -Surface interior long wave (thermal) emittance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - (none) 0 $\le$ *x* $\le$ 1 0.9 No constant - -**sfExT=*float*** - -Exterior air temperature. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ------------------------------------ ----------------- - ^o^F *unrestricted* *none* Required if *sfExCon* = SPECIFIEDT hourly - -**sfAdjZn=*znName*** - -Name of adjacent zone; used only when sfExCon is ADJZN. Can be the same as the current zone. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------ ------------- ------------------------------------- ----------------- - name of a *ZONE* *none* Required when
*sfExCon* = ADJZN constant - -**sfGrndRefl=*float*** - -Ground reflectivity for this surface. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ------------------ - fraction 0 $\leq$ *x* $\leq$ 1 grndRefl No Monthly - Hourly - -**endSurface** - -Optional to indicates the end of the surface definition. Alternatively, the end of the surface definition can be indicated by END, or by beginning another SURFACE or other object definition. If used, should follow the definitions of the SURFACE's subobjects -- DOORs, WINDOWs, SHADEs, SGDISTs, etc. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - -The following tables summarize the defaults and legal ranges of surface members for each sfType. "n.a." indicates "not applicable" and also "not allowed". - - ------------------------------------------------------------------------- - **Member** **WALL** **FLOOR** **CEILING** - ---------- ------------------------- ------------ ----------------------- - sfTilt optional, default=90, 60 n.a. (fixed optional, default=0, 0 - $<$ *sfTilt* $<$ 180 at 180) $\le$ *sfTilt* $\le$ 60 - - sfAzm **required** n.a. **required if sfTilt - $>$ 0** - ------------------------------------------------------------------------- - - ----------------------------------------------------------------------- - **Member** **WALL**/**FLOOR**/**CEILING** - ----------- ------------------------------------------------------------ - sfArea **required** - - sfCon **required unless sfU given** - - sfU **required unless sfCon given** - - sfInH optional, default = 1.5 - - sfExH optional, default per *sfExCon* - - sfExCnd optional, default = AMBIENT - - sfExAbs optional if *sfExCon* = AMBIENT or *sfExCon* = SPECIFIEDT - (default = .5), else n.a. - - sfExT **required if sfExCon = SPECIFIEDT; else n.a.** - - sfAdjZn **required if sfExCon = ADJZN; else n.a.** - - sfGrndRefl optional, default to grndRefl - ----------------------------------------------------------------------- - - diff --git a/doc/test/resources/terminal.md b/doc/test/resources/terminal.md deleted file mode 100644 index 77a45d6f3..000000000 --- a/doc/test/resources/terminal.md +++ /dev/null @@ -1,392 +0,0 @@ -# TERMINAL - -TERMINAL constructs an object to represent equipment that transfers energy to or from the current zone from a local heating device (coil, etc.) and/or one AIRHANDLER. A terminal serves a zone (and, internally, is owned by a zone). Up to three terminals can be defined for each zone. - -Only zones having znModel=CNE can be served by a terminal. - -A terminal can have local heating *capability,* using a simulated reheat coil, baseboard heater, etc. and/or air heating/cooling capability, using a simulated variable air volume (VAV) box connected to an AIRHANDLER (Section 0). Since a TERMINAL can only connect to a single air handler, use two terminals per zone to model systems where separate air handlers supply hot and cool air (dual duct). If a local heat capability utilizes the air flow (e.g. a reheat coil), model it in the terminal connected to the air handler; if a local heat capability is independent of air flow (e.g. electric baseboard heaters), it doesn't matter whether you model it with a separate terminal. - -Each capability can be *set output*, in which the output is constant or determined by external conditions such as in an outdoor reset baseboard situation or *set temperature*, in which the output is modulated to maintain the zone temperature at a set point. Set temperature operation is established by giving the setpoint for the capability (tuTLh, tuTH, tuTC); set output operation is established by specifying the local heat output (tuQMnLh) or air flow (tuVfMn) without specifying a setpoint. - -Hourly variable expressions may be used as desired to schedule setpoints and flow limits. Figure 1 shows \[need sentence describing the figure.\] - -![Insert Figure Title](media/image1.png) - -**tuName** - -Optional name of terminal; follows the word "TERMINAL" if given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* No constant - -## TERMINAL Local Heating - -These commands establish the TERMINAL's local heating capability and determine whether it operates in set output or set temperature fashion. Additional details of the local heating mechanism are given with commands described below under *terminal heating coil*. - -*Either tuTLh or tuQMnLh must be given to establish the TERMINAL's local heat capability:* - -**tuTLh=*float*** - -Local heating thermostat setpoint. Hourly expression may be used to schedule as desired. Giving this implies *set temperature* local heat from this terminal; omitting implies no local heat or, if tuQMnLh is given, set output local heat. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - ^o^F *x* $>$ 0 *no thermostat control* No hourly - -**tuQMnLh=*float*** - -Minimum local heat output or set local heat output. If tuTLh is given, this is the minimum output, used when the thermostat is not calling for (local) heat. If tuTLh is not given, giving tuQMnLh implies *set output* local heat and specifies the set output level. An hourly expression may be used to schedule as desired. - - --------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ----------- ---------------- -------------- --------------- - Btuh *x* $\ge$ 0 0 if tuTLh given For set output hourly - else no local local heat - heat - --------------------------------------------------------------------- - -The next three items are allowed only for thermostat controlled local heating (tuTLh given): - -**tuQMxLh=*float*** - -Maximum desired power, used when thermostat is calling for heat continuously, subject to coil capacity, and to HEATPLANT limitations where pertinent (see *tuhcCaptRat* description). If *tuQMxLh* is less than minimum power (tuQMnLh), the latter is used, effectively disabling setpoint control. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- --------------------- ----------------- - Btuh *x* $\ge$ 0 Yes, if tuTLh given hourly - -**tuPriLh=*int*** - -Setpoint priority: when there is more than one capability with the same setpoint, that with the highest priority is used first. The defaults for tuPriLh (100) and tuPriH (1) cause maximum air heat to be used before local heat, if both are pre\*sent and the setpoints are the same. Two or more equal setpoints with equal priorities in the ZONE cause an error, even if in different TERMINALs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 100 No constant - -**tuLhNeedsFlow=*choice*** - - ------- --------------------------------------- - YES local heat being modeled requires - terminal air flow (e.g. reheat coil). - Local heat is then disabled when there - is zero air flow through the terminal - (when simulated VAV damper set to 0 - flow, or when air handler fan and - terminal fan both off) - - NO no local heat or does not require air - flow (e.g. baseboard heaters). - ------- --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO NO No constant - -## TERMINAL Air Heating and Cooling - -These commands establish whether the TERMINAL has air capability (heat, cool, or both), and whether the capability operates in *set temperature* mode (tuTH and/or tuTLh given) or *set output* mode (tuVfMn given without tuTH and tuTLh). They further establish the setpoints, flow limits, leakages, and losses. - -Caution should be exercised in using air heat and air cooling in the same terminal. The supply air for both comes from the same air handler; it is up to you to make sure the terminal only calls for heat when the air handler is blowing hot air and only calls for cooling when the air handler is blowing cold air. This is done by carefully coordinating the variable expressions for terminal air heating and cooling setpoints (tuTH and tuTC here) and the air handler supply temperature setpoint (AIRHANDLER ahTsSp, Section 0). - -**tuAh=*ahName*** - -Name of air handler supplying this terminal. - - ----------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- ------------ ------------- ------------ --------------- - Btu/F name of an *If omitted*, No constant - *AIRHANDLER* terminal has - no air - heating nor - cooling - capability. - - ----------------------------------------------------------------- - -If both of the following (tuTH and tuTC) are specified, be careful not to accidentally permit the heating setpoint to be active when the air handler is blowing cold air, or vice versa. CSE's simulated thermostats and VAV boxes are at least as dumb as their real counterparts; if the thermostat calls for heat, the VAV damper will open even if the supply air is colder than the zone. To schedule deactivation of the air heating or cooling capability, schedule an extreme setpoint, such as 1 for heating or 199 for cooling. - -Giving neither tuTH nor tuTC implies that the terminal has no *set temperature* air capability; it will then have *set output* air capability if tuVfMn is given. - -**tuTH=*float*** - -Air heating thermostat set point; implies *set temperature* air capability. May be scheduled as desired with an hourly expression; to disable set temperature operation at certain times (as when air handler is scheduled to supply cold air), schedule a low temperature such as 1. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------------------- -------------- ----------------- - F *x* $\ge$ 0 No thermostat-controlled air heating No hourly - -**tuTC=*float*** - -Air cooling thermostat set point; implies *set temperature*air capability. May be scheduled as desired; to disable at certain times, schedule an extreme temperature such as 199. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------------------- -------------- ----------------- - F *x* $\ge$ 0 No thermostat-controlled air cooling No hourly - -**tuVfDs=*float*** - -Design air flow rate. ("Vf" in member names stands for "Volumetric Flow", to emphasize that flow is specified by volume at actual air temperature (cfm), not by mass (lb/hr), nor heat capacity (Btuh/F), etc.) - -The design air flow rate is used to apportion the available cfm among the terminals when the total flow demand of the terminals exceeds the air handler's supply fan capacity; it is unimportant (but may nevertheless be required) if the total of the tuVfMx's of the terminals on the air handler is not greater than the air handler's fan capacity including overrun. - -CSE will default tuVfDs to the largest of tuVfMn, tuVfMxH, and tuVfMxC unless a variable expression is given for any of them. Thus, you must given tuVfDs only when a variable minimum or maximum flow is used, or when you wish to override the default cfm apportionment under fan overload conditions. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - cfm *x* largest of Yes, if hourly - $\ge$ 0 tuVfMn, tuVfMn, - tuVfMxH, tuVfMxH, or - and tuVfMxC tuVfMxC is - if all are variable - constant - - ------------------------------------------------------------ - -**tuVfMn=*float*** - -Minimum terminal air flow rate or set output air flow rate. An hourly expression may be used to schedule the minimum or set output flow as desired. - -If neither tuTH nor tuTC is given, giving tuVfMn implies *set output* air capability for the terminal; the tvVfMn value is the set output cfm. - -If either setpoint (tuTH or tuTC) is given, tuVfMn is the cfm used when the thermostat is not calling for heat nor cold; it might be non-0, for example, to meet ventilation requirements. If tuVfMn is larger than tuVfMxH (when heating) or tuVfMxC (when cooling), it overrules them; thus a minimum (e.g. ventilation) requirement need not be considered in formulating expressions for the maximum flows. - - ------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ----------- ------------ --------------- - cfm *x* $\ge$ 0 if tuTH For set hourly - 0 or tuTC output air - given, operation - else no air - heat/cool - - ------------------------------------------------------------ - -**tuVfMxH=*float*** - -Maximum heating air flow rate, subject to air handler limitations. This terminal flow is used when the thermostat is calling for heat continuously. Hourly schedulable. If not greater than tuVfMn, the latter flow is used, thus disabling thermostat control. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ----------------- ----------------- - cfm *x* $\ge$ 0 *none* If *tuTH* given hourly - -**tuVfMxC=*float*** - -Maximum cooling air flow rate, before air handler limitations, used when the thermostat is calling for cooling continuously. tuVfMn overrides if larger. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ----------------- ----------------- - cfm *x* $\ge$ 0 *none* If *tuTC* given hourly - -**tuPriC=*int*** - -Cool setpoint priority. The lowest numbered priority is used first when there are equal setpoints in a zone; equal heat or cool setpoints with equal priority in same ZONE (even if on different TERMINALs) constitute an error. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1 No constant - -**tuPriH=*int*** - -Heat setpoint priority. Lowest numbered priority is used first when there are equal setpoints in a zone. Default for tuPriLh is larger, so that by default local heat is not used unless maximum air heat is insufficient, when both local heat and air heat are present in zone and have same setpoint. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1 No constant - -**tuSRLeak=*float*** - -Leakage of supply air to return, increasing supply volume and return temperature. Note that this is a fraction of current cfm, whereas air handler leak (before VAV dampers) is a fraction of *maximum* cfm. TfanOffLeak is added to this if terminal has a fan that is not running (future, 7-92). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.05 No constant - -**tuSRLoss=*float*** - -Supply air to return plenum heat loss as a fraction of supply air to return air temperature difference. Not allowed if return is ducted (no plenum). - -*NOT IMPLEMENTED as of July 1992 -- Plenums are unimplemented.* - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.1 No constant - -## TERMINAL Heating Coil - -These members are disallowed if terminal has no local heating capability, that is, if neither tuTLh nor tuQMnLh is given. - -**tuhcType=*choice*** - -Local heating coil type: - - ------------ --------------------------------------- - ELECTRIC Electric coil or heater, including - separate heaters such as electric - baseboards. 100% efficient; rated - capacity always available. - - HW Hot water coil, using hot water from a - HEATPLANT. Available capacity may be - limited by HEATPLANT total capacity as - well as by coil rated capacity. - ------------ --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------------------------------ -------------- ----------------- - ELECTRIC (future: HW) ELECTRIC, or NONE if no local heat No constant - -**tuhcCaptRat=*float*** - -Rated capacity of the heating coil. The coil will never supply more heat than its capacity, even if tuQMxLh and/or tuQMnLh is greater. For an ELECTRIC coil, the capacity is always the rated capacity. For an HW coil, the capacity is the rated capacity when the HEATPLANT can supply it; when the total heat demanded from the HEATPLANT by all the HW coils in TERMINALs and AIRHANDLERs exceeds the HEATPLANT's capacity, CSE reduces the capacities of all HW coils proportionately until the plant is not overloaded. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btu/hr *x* $>$ 0 *none* Yes constant - -**tuhcMtr=*mtrName*** - -Name of meter, if any, which accumulates input energy for this coil. End use category used is "Htg". Not allowed when tuhcType is HW, as the energy for an HW coil comes through a HEATPLANT; the input energy is accumulated to a meter by the HEATPLANT. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------- -------------- ----------------- - name of a METER *not recorded* No constant - -**tuhcHeatplant=heat*plantName*** - -Name of HEATPLANT for HW coil; disallowed for other coil types. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- ------------------- ----------------- - name of a HEATPLANT *none* If tuhcType is HW constant - -## TERMINAL Fan - -Presence of a terminal fan is indicated by specifying a tfanType value other than NONE. - -Terminal fans are *NOT IMPLEMENTED* as of July 1992. - -**tfanType=*choice*** - -Choice of: - - ------------ --------------------------------------- - NONE No fan in this TERMINAL (default); - input for other terminal fan members - disallowed. - - SERIES Fan runs whenever scheduled ON (see - tfanSched, next); if VAV cfm < - terminal fan cfm (tfanVfDs), the - additional flow comes from the return - air. - - PARALLEL Fan runs when scheduled ON (see - tfanSched) and terminal's simulated VAV - cfm is less than tfanVfDs plus tuVfMn - ?? plus tuVfMn??. Terminal fan cfm is - added to VAV cfm from AIRHANDLER to get - cfm to ZONE. - ------------ --------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- --------------------- ----------------- - NONE, SERIES, PARALLEL NONE Yes, if fan present constant - -**tfanSched=*choice*** - -Terminal fan schedule. May be scheduled with an hourly variable expression. - - ----------- --------------------------------------- - OFF fan does not run - - ON fan may run - - HEATING fan may run when local heat is in use - - VAV fan may run when AIRHANDLER supply fan - is on or when doing setback headting - and ssCtrl is ZONE\_HEAT or BOTH - (future). - ----------- --------------------------------------- - -A series fan (see tfanType) runs whenever on; a parallel fan runs only enough to keep terminal cfm at terminal minimum plus fan cfm; thus it may not run at all when the VAV flow from the AIRHANDLER is sufficient. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- ---------------------- ----------------- - OFF, ON, HEATING, VAV *none* Yes (if fan present) hourly - -**tfanOffLeak=*float*** - -Backdraft leakage when terminal fan off., as a fraction of tfanVfDs. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 .1 if fan present No constant - -**tfanVfDs=*float*** - -Terminal fan design flow rate. To specify .x times zone or terminal cfm, use a CSE expression. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ---------------------- ----------------- - cfm *x* $\le$ 0 *none* Yes (if fan present) constant - -**tfanPress=*float*** - -Terminal fan external static pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------ ----------------- ------------- -------------- ----------------- - inches H2O *x* $\ge$ 0 0.3 No constant - -**tfanEff=*float*** - -Terminal fan/motor/drive combined efficiency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - 0 $\le$ *x* $\le$ 1 0.08 No constant - -**tfanCurvePy=*k0, k1, k2, k3, x0*** - -*k0* through *k3* are the coefficients of a cubic polynomial for the curve relating fan relative energy consumption to relative air flow above the minimum flow *x0*. Up to five *floats* may be given, separated by commas. 0 is used for any omitted trailing values. The values are used as follows: - -$$z = k_0 + k_1 \cdot (x - x_0)| + k_2 \cdot (x - x_0)|^2 + k_3 \cdot (x - x_0)|^3$$ - -where: - -- $x$ is the relative fan air flow (as fraction of *tfanVfDs*; 0 $\le$ x $\le$ 1); -- $x_0$ is the minimum relative air flow (default 0); -- $(x - x_0)|$ is the "positive difference", i.e. $(x - x_0)$ if $x > x_0$; else 0; -- $z$ is the relative energy consumption. - -If $z$ is not 1.0 for $x$ = 1.0, a warning message is displayed and the coefficients are normalized by dividing by the polynomial's value for $x$ = 1.0. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *0, 1, 0, 0, 0 (linear)* No constant - -**tfanMtr=*mtrName*** - -Name of meter, if any, which is to record energy used by this terminal fan. The "fans" category is used. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endTerminal** - -Optional to indicates the end of terminal definition. Alternatively, the end of the door definition can be indicated by END or by beginning another object. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/top-members.md b/doc/test/resources/top-members.md deleted file mode 100644 index d4210791e..000000000 --- a/doc/test/resources/top-members.md +++ /dev/null @@ -1,463 +0,0 @@ -# TOP Members - -The top-level data items (TOP members) control the simulation process or contain data that applies to the modeled building as a whole. No statement is used to begin or create the TOP object; these statements can be given anywhere in the input (they do, however, terminate any other objects being specified -- ZONEs, REPORTs, etc.). - -## TOP General Data Items - -**doMainSim=*choice*** - -Specifies whether the simulation is performed when a Run command is encountered. See also doAutoSize. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NO,YES YES No constant - -**begDay=*date*** - -Date specifying the beginning day of the simulation performed when a Run command is encountered. See further discussion under endDay (next). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *date* Jan 1 No constant - -**endDay=*date*** - -Date specifying the ending day of the simulation performed when a Run command is encountered. - -The program simulates 365 days at most. If begDay and endDay are the same, 1 day is simulated. If begDay precedes endDay in calendar sequence, the simulation is performed normally and covers begDay through endDay inclusive. If begDay follows endDay in calendar sequence, the simulation is performed across the year end, with Jan 1 immediately following Dec 31. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *date* Dec 31 No constant - -**jan1DoW=*choice*** - -Day of week on which January 1 falls. - - ------------------------------------------------------------------------ - **Units** **Legal Range** **Default** **Required** **Variability** - ---------- ---------------- ------------ ------------- ----------------- - SUN\ THU No constant - MON\ - TUE\ - WED\ - THU\ - FRI\ - SAT - ------------------------------------------------------------------------ - -**workDayMask=*int* TODO** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Mon-fri? No constant - -**wuDays=*int*** - -Number of "warm-up" days used to initialize the simulator. Simulator initialization is required because thermal mass temperatures are set to arbitrary values at the beginning of the simulation. Actual mass temperatures must be established through simulation of a few days before thermal loads are accumulated. Heavier buildings require more warm-up; the default values are adequate for conventional construction. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\geq$ 0 7 No constant - -**nSubSteps=*int*** - -Number of subhour steps used per hour in the simulation. 4 is the time-honored value for models using CNE zones. A value of 30 is typically for CSE zone models. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 4 No constant - -**tol=*float*** - -Endtest convergence tolerance for internal iteration in CNE models (no effect for CSE models) Small values for the tolerance cause more accurate simulations but slower performance. The user may wish to use a high number during the initial design process (to quicken the runs) and then lower the tolerance for the final design (for better accuracy). Values other than .001 have not been explored. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 .001 No constant - -**humTolF=*float*** - -Specifies the convergence tolerance for humidity calculations in CNE models (no effect in for CSE models), relative to the tolerance for temperature calculations. A value of .0001 says that a humidity difference of .0001 is about as significant as a temperature difference of one degree. Note that this is multiplied internally by "tol"; to make an overall change in tolerances, change "tol" only. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 .0001 No - -**ebTolMon=*float*** - -Monthly energy balance error tolerance for internal consistency checks. Smaller values are used for testing the internal consistency of the simulator; values somewhat larger than the default may be used to avoid error messages when it is desired to continue working despite a moderate degree of internal inconsistency. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 0.0001 No constant - -**ebTolDay=*float*** - -Daily energy balance error tolerance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 0.0001 No constant - -**ebTolHour=*float*** - -Hourly energy balance error tolerance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 0.0001 No constant - -**ebTolSubhr=*float*** - -Sub-hourly energy balance error tolerance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 0.0001 No constant - -**humMeth=*choice*** - -Developmental zone humidity computation method choice for CNE models (no effect for CSE models). - - ------------ --------------------------------------------------------- - ROB Rob's backward difference method. Works well within - limitations of backward difference approach. - - PHIL Phil's central difference method. Should be better if - perfected, but initialization at air handler startup is - unresolved, and ringing has been observed. - ------------ --------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ROB, PHIL ROB No constant - -**dflExH=*float*** - -Default exterior surface (air film) conductance used for opaque and glazed surfaces exposed to ambient conditions in the absence of explicit specification. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 2.64 No constant - -**bldgAzm=*float*** - -Reference compass azimuth (0 = north, 90 = east, etc.). All zone orientations (and therefore surface orientations) are relative to this value, so the entire building can be rotated by changing bldgAzm only. If a value outside the range 0^o^ $\leq$ *x* $<$ 360^o^ is given, it is normalized to that range. - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------- ----------------- ------------- -------------- ----------------- - ^o^ (degrees) unrestricted 0 No constant - -**elevation=*float*** - -Elevation of the building site. Used internally for the computation of barometric pressure and air density of the location. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- --------------- -------------- ----------------- - ft *x* $\ge$ 0 0 (sea level) No constant - -**runTitle=*string*** - -Run title for the simulation. Appears in report footers, export headers, and in the title lines to the INP, LOG, and ERR built-in reports (these appear by default in the primary report file; the ERR report also appears in the error message file, if one is created). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------ -------------- ----------------- - *63 characters* blank (no title) No constant - -**runSerial=*int*** - -Run serial number for the simulation. Increments on each run in a session; appears in report footers. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 999 0 No constant - -## TOP Daylight Saving Time Items - -Daylight savings starts by default at 2:00 a.m. of the second Sunday in March. Internally, hour 3 (2:00-3:00 a.m.) is skipped and reports for this day show only 23 hours. Daylight savings ends by default at 2:00 a.m. of the first Sunday of November; for this day 25 hours are shown on reports. CSE fetches weather data using standard time but uses daylight savings time to calculate variable expressions (and thus all schedules). - -**DT=*choice*** - -Whether Daylight Savings Time is to be used for the current run. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO YES No constant - -**DTbegDay=*date*** - -Start day for daylight saving time (assuming DT=Yes) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *date* *second Sunday in March* No constant - -**DTendDay=*date*** - -End day for daylight saving time (assuming DT=Yes) - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------------- -------------- ----------------- - *date* *first Sunday in November* No constant - -## TOP Weather Data Items - - -The following system variables (4.6.4) are determined from the weather file for each simulated hour: - - ---------------- ----------------------------------------------------- - \$radBeam beam irradiance on tracking surface (integral for - hour, Btu/ft^2^). - - \$radDiff diffuse irradiance on a horizontal surface (integral - for hour, Btu/ft^2^). - - \$tDbO dry bulb temp (^o^F). - - \$tWbO wet bulb temp (^o^F). - - \$wO humidity ratio - - \$windDirDeg wind direction (degrees, NOT RADIANS; 0=N, 90=E). - - \$windSpeed wind speed (mph). - ---------------- ----------------------------------------------------- - -The following are the terms determined from the weather file for internal use, and can be referenced with the probes shown. - - @Top.depressWbWet bulb depression (F). - - @Top.windSpeedSquaredWind speed squared (mph2). - -**wfName=*string*** - -Weather file path name for simulation. The file should be in the current directory, in the directory CSE.EXE was read from, or in a directory on the operating system PATH. (?? Temporarily, backslash (\\) characters in path names must be doubled to work properly (e.g. "\\\\wthr\\\\cz01.cec"). This will be corrected.). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------- ------------- -------------- ----------------- - file name,path optional Yes constant - -**skyModel=*choice*** - -Selects sky model used to determine relative amounts of direct and diffuse irradiance. - - ------------- --------------------------------- - ISOTROPIC traditional isotropic sky model - ANISOTROPIC Hay anisotropic model - ------------- --------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - ISOTROPIC ANISOTROPIC ANISOTROPIC No constant - -The reference temperature and humidity are used to calculate a humidity ratio assumed in air specific heat calculations. The small effect of changing humidity on the specific heat of air is generally ignored in the interests of speed, but the user can control the humidity whose specific heat is used through the refTemp and refRH inputs. - -**refTemp=*float*** - -Reference temperature (see above paragraph). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $\geq$ 0 60^o^ No constant - -**refRH=*float*** - -Reference relative humidity (see above). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 0.6 No constant - -**grndRefl=*float*** - -Global ground reflectivity, used except where other value specified with sfGrndRefl or wnGrndRefl. This reflectivity is used in computing the reflected beam and diffuse radiation reaching the surface in question. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 0.2 No Monthly-Hourly - -The following values modify weather file data, permitting varying the simulation without making up special weather files. For example, to simulate without the effects of wind, use windF = 0; to halve the effects of diffuse solar radiation, use radDiffF = 0.5. Note that the default values for windSpeedMin and windF result in modification of weather file wind values unless other values are specified. - -**windSpeedMin=*float*** - -Minimum value for wind speed - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - mph *x* $\geq$ 0 0.5 No constant - -**windF=*float*** - -Wind Factor: multiplier for wind speeds read from weather file. windF is applied *after* windSpeedMin. Note that windF does *not* effect infiltration rates calculated by the Sherman-Grimsrud model (see e.g. ZONE.infELA). However, windF does modify AirNet flows (see IZXFER). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\geq$ 0 0.25 No constant - -**terrainClass=*int*** - -Specifies characteristics of ground terrain in the project region. - - ------------ --------------------------------------------------------- - 1 ocean or other body of water with at least 5 km - unrestriced expanse - - 2 flat terrain with some isolated obstacles (buildings or - trees well separated) - - 3 rural areas with low buildings, trees, etc. - - 4 urban, industrial, or forest areas - - 5 center of large city - ------------ --------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 1 $\leq$ *x* $\leq$ 5 4 No constant - - -**radBeamF=*float*** - -Multiplier for direct normal (beam) irradiance - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\geq$ 0 1 No constant - -**radDiffF=*float*** - -Multiplier for diffuse horizonal irradiance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $\geq$ 0 1 No constant - -## TOP Report Data Items - -These items are used in page-formatted report output files. See REPORTFILE, Section 5.245.21, and REPORT, Section 5.25. - -**repHdrL=*string*** - -Report left header. Appears at the upper left of each report page unless page formatting (rfPageFmt) is OFF. If combined length of repHdrL and repHdrR is too large for the page width, one or both will be truncated. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *blank* No constant?? - -**repHdrR=*string*** - -Report right header. Appears at the upper right of each report page unless page formatting (rfPageFmt) is OFF. If combined length of repHdrL and repHdrR is too large for the page width, one or both will be truncated. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------------- -------------- ----------------- - *blank*(no right header) No constant?? - -**repLPP=*int*** - -Total lines per page to be assumed for reports. Number of lines used for text (including headers and footers) is repLPP - repTopM - repBotM. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - lines *x* $\geq$ 50 66 No constant?? - -**repTopM=*int*** - -Number of lines to be skipped at the top of each report page (prior to header). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - lines 0 $\geq$ *x* $\geq$ 12 3 No constant - -**repBotM=*int*** - -Number of lines reserved at the bottom of each report page. repBotM determines the position of the footer on the page (blank lines after the footer are not actually written). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------------ ------------- -------------- ----------------- - lines 0 $\leq$ *x* $\leq$ 12 3 No constant - -**repCPL=*int*** - -Characters per line for report headers and footers, user defined reports, and error messages. CSE writes simple ASCII files and assumes a fixed (not proportional) spaced printer font. Many of the built-in reports now (July 1992) assume a line width of 132 columns. - - **Units** **Legal Range** **Default** **Required** **Variability** - ------------ -------------------------- ------------- -------------- ----------------- - characters 78 $\leq$ *x* $\leq$ 132 78 No constant - -**repTestPfx=*string*** - -Report test prefix. Appears at beginning of report lines that are expected to differ from prior runs. This is useful for “hiding” lines from text comparison utilities in automated testing schemes. Note: the value specified with command line -x takes precedence over this input. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *blank* No constant?? - -## TOP Autosizing - -**doAutoSize=*choice*** - -Controls invocation of autosizing step prior to simulation. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - YES, NO NO No constant - -**auszTol=*float*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - .01 No constant - -**heatDsTDbO=*float*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F 0 No hourly - -**heatDsTWbO=*float*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - F 0 No hourly - -**coolDsMo=*??*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - F .01 No hourly - -## TOP Debug Reporting - -**verbose=*int*** - -Controls verbosity of screen remarks. Most possible remarks are generated during autosizing of CNE models. Little or no effect in CSE models. TODO: document options - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 0 – 5 ? 1 No constant - -The following dbgPrintMask values provide bitwise control of addition of semi-formated internal results to the run report file. The values and format of debugging reports are modified as required for testing purposes. - -**dbgPrintMaskC=*int*** - -Constant portion of debug reporting control. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 0 No constant - -**dbgPrintMask=*int*** - -Hourly portion of debug reporting control (generally an expression that evaluates to non-0 only on days or hours of interest). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 0 No hourly - - diff --git a/doc/test/resources/window.md b/doc/test/resources/window.md deleted file mode 100644 index fd3c74c43..000000000 --- a/doc/test/resources/window.md +++ /dev/null @@ -1,201 +0,0 @@ -# WINDOW - -WINDOW defines a subobject belonging to the current SURFACE that represents one or more identical windows. The azimuth, tilt, and exterior conditions of the window are the same as those of the surface to which it belongs. The total window area (*wnHt* $\cdot$ *wnWid* $\cdot$ *wnMult*) is deducted from the gross surface area. A surface may have any number of windows. - -Windows may optionally have operable interior shading that reduces the overall shading coefficient when closed. - -**wnName** - -Name of window: follows the word "WINDOW" if given. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* No constant - -**wnHeight=*float*** - -Overall height of window (including frame). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $>$ 0 *none* Yes constant - -wnWidth=*float*Overall width of window (including frame). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft *x* $>$ 0 *none* Yes constant - -**wnArea=*float*** - -Overall area of window (including frame). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------------------- -------------- ----------------- - ft^2^ *x* $>$ 0 *wnHeight* \* *wnWidth* No constant - -**wnMult=*float*** - -Area multiplier; can be used to represent multiple identical windows. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *x* $>$ 0 1 No constant - -**wnModel=*choice*** - -Selects window model - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - SHGC, ASHWAT SHGC No constant - -wnGt=*choice* - -GLAZETYPE for window. Provides many defaults for window properties as cited below. - -**wnU=*float*** - -Window conductance (U-factor without surface films, therefore not actually a U-factor but a C-factor). - -Preferred Approach: To use accurately with standard winter rated U-factor from ASHRAE or NFRC enter as: - - wnU = (1/((1/U-factor)-0.85) - -Where 0.85 is the sum of the interior (0.68) and exterior (0.17) design air film resistances assumed for rating window U-factors. Enter wnInH (usually 1.5=1/0.68) instead of letting it default. Enter the wnExH or let it default. It is important to use this approach if the input includes gnFrad for any gain term. Using approach 2 below will result in an inappropriate internal gain split at the window. - -Approach 2. Enter wnU=U-factor and let the wnInH and wnExH default. Tnormally this approach systematically underestimates the window U-factor because it adds the wnExfilm resistance to 1/U-factor thereby double counting the exterior film resistance. This approach will also yield incorrect results for gnFrad internal gain since the high wnInH will put almost all the gain back in the space. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 *none* Yes constant - -**wnUNFRC=*float*** - -Fenestration system (including frame) U-factor evaluated at NFRC heating conditions. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------- ---------------------------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 gtUNFRC Required when *wnModel* = ASHWAT constant - -**wnInH=*float*** - -Window interior surface (air film) conductance. - -Preferred Approach: Enter the appropriate value for each window, normally: - - wnInH = 1.5 - - where 1.5 = 1/0.68 the standard ASHRAE value. - -The large default value of 10,000 represents a near-0 resistance, for the convenience of those who wish to include the interior surface film in wnU according to approach 2 above. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- --------------------------------------- -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 10000 No constant - -**wnExH=*float*** - -Window exterior surface (air film) conductance. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------------- ----------------- ------------------------ -------------- ----------------- - Btuh/ft^2^-^o^F *x* $>$ 0 same as owning surface No constant - -**wnSMSO=*float*** - -SHGC multiplier with shades open. Overrides gtSMSO. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ------------------ - fraction 0 $\leq$ *x* $\leq$ 1 gtSMSO or 1 No Monthly - Hourly - -**wnSMSC=*float*** - -SHGC multiplier with shades closed. Overrides gtSMSC - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------------ -------------- ------------------ - fraction 0 $\leq$ *x* $\leq$ 1 wnSMSO or gtSMSC No Monthly - Hourly - -**wnNGlz=*int*** - -Number of glazings in the window (bare glass only, not including any interior or exterior shades). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- -------------------- ------------- ---------------------------------- ----------------- - 0 $<$ *x* $\leq$ 4 gtNGLZ Required when *wnModel* = ASHWAT Constant - -**wnExShd=*choice*** - -Exterior shading type (ASHWAT only). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NONE, INSCRN gtExShd no Constant - -**wnInShd=*choice*** - -Interior shade type (ASHWAT only). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - NONE, DRAPEMED gtInShd no Constant - -**wnDirtLoss=*float*** - -Glazing dirt loss factor. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - fraction 0 $\leq$ *x* $\leq$ 1 0 no Constant - -**wnGrndRefl=*float*** - -Ground reflectivity for this window. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ------------------ - fraction 0 $\leq$ *x* $\leq$ 1 sfGrndRefl No Monthly - Hourly - -**wnVfSkyDf=*float*** - -View factor from this window to sky for diffuse radiation. For the shading effects of an overhang, a wnVfSkyDf value smaller than the default would be used - - ------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ------------ ------------ --------------- - fraction 0 $\leq$ 0.5 - 0.5 No Monthly - - *x* \* cos(tilt) Hourly - $\leq$ 1 = .5 for - vertical - surface - - ------------------------------------------------------------- - -**wnVfGrndDf=*float*** - -View factor from this window to ground for diffuse radiation. For the shading effects of a fin(s), both wnVfSkyDf and wnVfGrndDf would be used. - - ------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- ------------ ------------ --------------- - fraction 0 $\leq$ 0.5 + 0.5 \* No Monthly - - *x* cos(tilt) = Hourly - $\leq$ 1 .5 for - vertical - surface - - ------------------------------------------------------------- - -**endWindow** - -Optionally indicates the end of the window definition. Alternatively, the end of the window definition can be indicated by END or the declaration of another object. END or endWindow, if used, should follow any subobjects of the window (SHADEs and/or SGDISTs). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - - diff --git a/doc/test/resources/zone.md b/doc/test/resources/zone.md deleted file mode 100644 index c8d5d91d1..000000000 --- a/doc/test/resources/zone.md +++ /dev/null @@ -1,321 +0,0 @@ -# ZONE - -ZONE constructs an object of class ZONE, which describes an area of the building to be modeled as having a uniform condition. ZONEs are large, complex objects and can have many subobjects that describe associated surfaces, shading devices, HVAC equipment, etc. - -## ZONE General Members - -**znName** - -Name of zone. Enter after the word ZONE; no "=" is used. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *63 characters* *none* Yes constant - -**znModel=*choice*** - -Selects model for zone. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - CNE CZM UZM CNE No constant - -**znArea=*float*** - -Nominal zone floor area. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^2^ *x* $>$ 0 *none* Yes constant - -**znVol=*float*** - -Nominal zone volume. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft^3^ *x* $>$ 0 *none* Yes constant - -**znFloorZ=*float*** - -Nominal zone floor height relative to arbitrary 0 level. Used re determination of vent heights - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ft unrestricted *0* No constant - -**znCeilingHt=*float*** - -Nominal zone ceiling height relative to zone floor (typically 8 – 10 ft). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- -------------------- -------------- ----------------- - ft *x* $>$ 0 *znVol* / *znArea* No constant - -**znEaveZ=*float*** - -Nominal eave height above ground level. Used re calculation of local surface wind speed. This in turn influences outside convection coefficients in some surface models and wind-driven air leakage. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ---------------------------- -------------- ----------------- - ft *x* $\ge$ 0 *znFloorZ + infStories\*8* No constant - -**znCAir=*float*** - -Zone "air" heat capacity: represents heat capacity of air, furniture, "light" walls, and everything in zone except surfaces surfaces having heat capacity (that is, non-QUICK surfaces). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ----------------- -------------- ----------------- - Btu/^o^F *x* $\geq$ 0 3.5 \* *znArea* No constant - -**znAzm=*float*** - -Zone azimuth with respect to bldgAzm. All surface azimuths are relative to znAzm, so that the zone can be rotated by changing this member only. Values outside the range 0^o^ to 360^o^ are normalized to that range. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - degrees unrestricted 0 No constant - -**znSC=*float*** - -Zone shade closure. Determines insolation through windows (see WINDOW members *wnSCSO* and *wnSCSC*) and solar gain distribution: see SGDIST members *sgFSO* and *sgFSC*. 0 represents shades open; 1 represents shades closed; intermediate values are allowed. An hourly variable CSE expression may be used to schedule shade closure as a function of weather, time of year, previous interval HVAC use or zone temperature, etc. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ---------------------------------------------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 1 when cooling was used in *previous* hour, else 0 No hourly - -The following apply to *znModel* = CZM. - -**znTH=*float*** - -Heating set point - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $\geq$ 0 hourly - -**znTD=*float*** - -Desired set point (temperature maintained with ventilation if possible). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $\geq$ 0 hourly - -**znTC=*float*** - -Cooling set point - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ^o^F *x* $\geq$ 0 Hourly - -**znQMxH=*float*** - -Heating capacity at current conditions - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* $\geq$ 0 hourly - -**znQMxHRated=*float*** - -Rated heating capacity - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* $\geq$ 0 constant - -**znQMxC=*float*** - -Cooling capacity at current conditions - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* $\leq$ 0 hourly - -**znQMxCRated=*float*** - -Rated cooling capacity - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - Btuh *x* $\leq$ 0 constant - -The following provide parameters for comfort calculations - -**znComfClo=*float*** - -Occupant clothing resistance - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - clo subhourly ?? - -**znComfMet=*float*** - -Occupant metabolic rate - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - met *x* $\geq$ 0 hourly - -**znComfAirV=*float*** - -Nominal air velocity used for comfort model - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - ? *x* $\geq$ 0 No Hourly - -**znComfRh=*float*** - -Nominal zone relative humidity used for comfort model - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 0 $\leq$ *x* $\leq$ 1 No hourly - -## ZONE Infiltration - -The following control a simplified air change plus leakage area model. The Sherman-Grimsrud model is used to derive air flow rate from leakage area and this rate is added to the air changes specified with infAC. Note that TOP.windF does *not* modify calculated infiltration rates, since the Sherman-Grimsrud model uses its own modifiers. See also AirNet models available via IZXFER. - -**infAC=*float*** - -Zone infiltration air changes per hour. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 1/hr *x* $\geq$ 0 0.5 No hourly - -**infELA=*float*** - -Zone effective leakage area (ELA). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - in^2^ *x* $\geq$ 0 0.0 No hourly - -**infShld=*int*** - -Zone local shielding class, used in derivation of local wind speed for ELA infiltration model, wind-driven AirNet leakage, and exterior surface coefficients. infShld values are -- - - ---------- ----------------------------------------------------------- - 1 no obstructions or local shielding - - 2 light local shielding with few obstructions - - 3 moderate local shielding, some obstructions within two - house heights - - 4 heavy shielding, obstructions around most of the perimeter - - 5 very heavy shielding, large obstructions surrounding the - perimeter within two house heights - ---------- ----------------------------------------------------------- - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 1 $\leq$ *x* $\leq$ 5 3 No constant - -**infStories=*int*** - -Number of stories in zone, used in ELA model. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------------- ------------- -------------- ----------------- - 1 $\leq$ *x* $\leq$ 3 1 No constant - -**znWindFLkg=*floatTODO*** - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - 1 No constant - -## ZONE Exhaust Fan - -Presence of an exhaust fan in a zone is indicated by specifying a non-zero design flow value (xfanVfDs). - -Zone exhaust fan model implementation is incomplete as of July, 2011. The current code calculates energy use but does not account for the effects of air transfer on room heat balance. IZXFER provides a more complete implementation. - -**xfanFOn=*float*** - -Exhaust fan on fraction. On/off control assumed, so electricity requirement is proportional to run time. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - fraction 0 $\leq$ x $\leq$ 1 1 No hourly - -Example: The following would run an exhaust fan 70% of the time between 8 AM and 5 PM: - - xfanFOn = select( (\$hour >= 7 && \$hour < 5), .7, - default, 0 ); - -**xfanVfDs=*float*** - -Exhaust fan design flow; 0 or not given indicates no fan. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- ---------------- ----------------- - cfm *x* 0 0 (no fan) If fan present constant - -**xfanPress=*float*** - -Exhaust fan external static pressure. - - **Units** **Legal Range** **Default** **Required** **Variability** - -------------- ---------------------------- ------------- -------------- ----------------- - inches H~2~O 0.05 $\leq$ *x* $\leq$ 1.0 0.3 No constant - -Only one of xfanElecPwr, xfanEff, and xfanShaftBhp may be given: together with xfanVfDs and xfanPress, any one is sufficient for CSE to detemine the others and to compute the fan heat contribution to the air stream. - -**xfanElecPwr=*float*** - -Fan input power per unit air flow (at design flow and pressure). - - ------------------------------------------------------------------------- - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- -------------------- ---------------- --------------- - W/cfm *x* $>$ 0 derived from xfanEff If xfanEff and constant - and xfanShaftBhp xfanShaftBhp not - present - ------------------------------------------------------------------------- - -**xfanEff=*floatExhaust*** - -fan/motor/drive combined efficiency*.* - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- --------------------- ------------- -------------- ----------------- - fraction 0 $\leq$ x $\leq$ 1 0.08 No constant - -**xfanShaftBhp=*float*** - -Fan shaft power at design flow and pressure. - - ------------------------------------------------------------------ - **Units** **Legal** **Default** **Required** **Variability** - **Range** - --------- --------- --------------- -------------- --------------- - BHP *x* $>$ 0 derived from If xfanElecPwr constant - xfanElecPwr and not present - xfanVfDs - ------------------------------------------------------------------ - -**xfanMtr=*mtrName*** - -Name of METER object, if any, by which fan's energy use is recorded (under end use category "fan"). - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ------------------- ---------------- -------------- ----------------- - *name of a METER* *not recorded* No constant - -**endZone** - -Indicates the end of the zone definition. Alternatively, the end of the zone definition can be indicated by the declaration of another object or by "END". If END or endZone is used, it should follow the definitions of the ZONE's subobjects such as GAINs, SURFACEs, TERMINALs, etc. - - **Units** **Legal Range** **Default** **Required** **Variability** - ----------- ----------------- ------------- -------------- ----------------- - *N/A* No constant - diff --git a/doc/test/table_test.rb b/doc/test/table_test.rb deleted file mode 100644 index 08f0d6bb3..000000000 --- a/doc/test/table_test.rb +++ /dev/null @@ -1,124 +0,0 @@ -require_relative 'test_helper' -require 'table' -require 'template' - -class TableTest < TC - include Table - def test_context - t1 = Main.new(:context=>{"m"=>"a", "n"=>"b"}) - assert_equal(t1.m, "a") - assert_equal(t1.n, "b") - assert(t1.inspect != "c") - t2 = Main.new(:context=>{"m"=>"a", "n"=>"b", "inspect"=>"c"}) - assert_equal(t2.m, "a") - assert_equal(t2.n, "b") - assert_equal(t2.inspect, "c") - end - def test_context_is_only_on_instance - t1 = Main.new(:context=>{"m"=>"a"}) - t2 = Main.new(:context=>{"n"=>"a"}) - assert(t1.respond_to?(:m)) - assert(!t1.respond_to?(:n)) - assert(!t2.respond_to?(:m)) - assert(t2.respond_to?(:n)) - end - def test_render - b1 = MakeBinding.().({"m"=>"a", "n"=>"b"}) - expected = "Hi a and b" - actual = Template::RenderWithErb.("Hi <%= m %> and <%= n %>", b1) - assert_equal(actual, expected) - b2 = MakeBinding.().({"inspect"=>"a"}) - expected = "Hi a" - actual = Template::RenderWithErb.("Hi <%= inspect %>", b2) - assert_equal(actual, expected) - end - def test_rendering_a_csv_table - b1 = MakeBinding.().({}); - template = < false) -A,B,C -1,2,3 -END -%> -ENDEND - expected = < false) -A,B,C -1,2,"3,4,5" -END -%> -ENDEND - expected = < false) -CNE,"Older central difference model based on original CALPAS methods. Not fully supported and not suitable for current compliance applications." -CZM,"Conditioned zone model. Forward-difference, short time step methods are used." -UZM,"Unconditioned zone model. Identical to CZM except heating and cooling are not supported. Typically used for attics, garages, and other ancillary spaces." -END -%> -ENDEND - expected = <$ 0", - default: "derived from oaSupFanEff and oaSupFanShaftBhp", - required: "If oaSupFanEff and oaSupFanShaftBhp not present", - variability: "constant") %> -ENDEND - expected = <$ 0 derived from If oaSupFanEff constant - oaSupFanEff and and - oaSupFanShaftBhp oaSupFanShaftBhp - not present ---------------------------------------------------------------------- -END - actual = Template::RenderWithErb.(template, b1) - assert_equal(expected, actual) - end -end diff --git a/doc/test/template_test.rb b/doc/test/template_test.rb deleted file mode 100644 index b91658f20..000000000 --- a/doc/test/template_test.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_relative 'test_helper' -require 'template' -require 'fileutils' -require 'table' - -class TestTemplate < TC - include Template - def setup - @temp_path_in = "junk_in.txt" - File.write(@temp_path_in, "Hi <%= a %>") - @temp_path_in_1 = "junk_in_1.txt" - File.write(@temp_path_in_1, "<%= insert_file('doc/junk_in.txt') %>") - @temp_path_out= "junk_out.txt" - end - def teardown - FileUtils.rm(@temp_path_in) if File.exist?(@temp_path_in) - FileUtils.rm(@temp_path_in_1) if File.exist?(@temp_path_in_1) - FileUtils.rm(@temp_path_out) if File.exist?(@temp_path_out) - end - def test_rendering_a_template - expected = "Hi b" - actual = RenderWithErb.("Hi <%= a %>", MakeBinding.({"a"=>"b"})) - assert_equal(expected, actual) - end - def test_preproc_file - PreprocFile[].(@temp_path_in, @temp_path_out, nil, {"context"=>{"a"=>"b"}}) - expected = "Hi b" - actual = File.read(@temp_path_out) - assert_equal(expected, actual) - end - def test_preproc_file_with_include_file_that_contains_erb - b = Table::MakeBinding[] - PreprocFile[b].(@temp_path_in_1, @temp_path_out, nil, {"context"=>{"a"=>"b"}}) - expected = "Hi b" - actual = File.read(@temp_path_out) - assert_equal(expected, actual) - end -end diff --git a/doc/test/test_helper.rb b/doc/test/test_helper.rb deleted file mode 100644 index b6e3dc499..000000000 --- a/doc/test/test_helper.rb +++ /dev/null @@ -1,8 +0,0 @@ -$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) -require 'minitest/autorun' -begin - TC = Minitest::Test -rescue - # for older versions of Ruby - TC = Minitest::Unit::TestCase -end diff --git a/doc/test/xlink_test.rb b/doc/test/xlink_test.rb deleted file mode 100644 index 5d2792a32..000000000 --- a/doc/test/xlink_test.rb +++ /dev/null @@ -1,68 +0,0 @@ -require_relative 'test_helper' -require 'xlink' -require 'set' - -class XLinkTest < TC - include XLink - def test_OverString - rec_idx = {"STUFF"=>"index.html#stuff","JUNK"=>"index.html#junk"} - sec_path = [] - s = <= '3.13'", + "python_full_version < '3.13'", +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, +] + +[[package]] +name = "bracex" +version = "2.5.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "cse-documentation" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocs-awesome-nav" }, + { name = "mkdocs-macros-plugin" }, + { name = "mkdocs-material" }, + { name = "python-slugify" }, + { name = "pyyaml" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "beautifulsoup4", specifier = ">=4.13.4" }, + { name = "mkdocs-autorefs", specifier = ">=1.3.1" }, + { name = "mkdocs-awesome-nav", specifier = ">=3.1.1" }, + { name = "mkdocs-macros-plugin", specifier = ">=1.3.7" }, + { name = "mkdocs-material" }, + { name = "python-slugify", specifier = ">=8.0.4" }, + { name = "pyyaml", specifier = ">=6.0.2" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.9.9" }] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, +] + +[[package]] +name = "hjson" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/e5/0b56d723a76ca67abadbf7fb71609fb0ea7e6926e94fcca6c65a85b36a0e/hjson-3.1.0.tar.gz", hash = "sha256:55af475a27cf83a7969c808399d7bccdec8fb836a07ddbd574587593b9cdcf75", size = 40541 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/7f/13cd798d180af4bf4c0ceddeefba2b864a63c71645abc0308b768d67bb81/hjson-3.1.0-py3-none-any.whl", hash = "sha256:65713cdcf13214fb554eb8b4ef803419733f4f5e551047c9b711098ab7186b89", size = 54018 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "markdown" +version = "3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/f4/77e3cf5e7ba54dca168bc718688127844721982ae88b08684669c5b5752d/mkdocs_autorefs-1.3.1.tar.gz", hash = "sha256:a6d30cbcccae336d622a66c2418a3c92a8196b69782774529ad441abb23c0902", size = 2056416 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/19/f20edc082c1de2987dbaf30fcc514ed7a908d465a15aba7cba595c3b245a/mkdocs_autorefs-1.3.1-py3-none-any.whl", hash = "sha256:18c504ae4d3ee7f344369bb26cb31d4105569ee252aab7d75ec2734c2c8b0474", size = 2837887 }, +] + +[[package]] +name = "mkdocs-awesome-nav" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "natsort" }, + { name = "pydantic" }, + { name = "wcmatch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/e0/b2185370a35ecc042f648beec27a6d1a5d15d2ad46255d68201d2ba9cc38/mkdocs_awesome_nav-3.1.1.tar.gz", hash = "sha256:0665ab290a3c22b49e07151e3aca82d5d28a42aecf6e940bf295546565d156b5", size = 8656 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/03/84bdfc698c5307259b269c5c20b8d62c7f2f36667f0a10d4d311dc604546/mkdocs_awesome_nav-3.1.1-py3-none-any.whl", hash = "sha256:50eafd8042274feff2b995ecaa50c55c07807ff33210a064877f6f1aa8d6ee40", size = 12356 }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, +] + +[[package]] +name = "mkdocs-macros-plugin" +version = "1.3.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hjson" }, + { name = "jinja2" }, + { name = "mkdocs" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, + { name = "super-collections" }, + { name = "termcolor" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/65/61a746c56788867221aebf07fe4b6b4c08ac99cf341fd51d728c89d1456e/mkdocs_macros_plugin-1.3.7.tar.gz", hash = "sha256:17c7fd1a49b94defcdb502fd453d17a1e730f8836523379d21292eb2be4cb523", size = 33466 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/cf/f03331298ee50a4da6fb72ccec79078041158c1f8b5fc24835c1be42232e/mkdocs_macros_plugin-1.3.7-py3-none-any.whl", hash = "sha256:02432033a5b77fb247d6ec7924e72fc4ceec264165b1644ab8d0dc159c22ce59", size = 37799 }, +] + +[[package]] +name = "mkdocs-material" +version = "9.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/1e/65b4fda4debf5e337b2ad4e692423dba4f5c77f49c4dee170c47a7dbac25/mkdocs_material-9.6.3.tar.gz", hash = "sha256:c87f7d1c39ce6326da5e10e232aed51bae46252e646755900f4b0fc9192fa832", size = 3942608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/a4/e0da0bc6a7dbfda6a786427f82a0caa4dd1f163249a5a5e5dccbb50c5f1e/mkdocs_material-9.6.3-py3-none-any.whl", hash = "sha256:1125622067e26940806701219303b27c0933e04533560725d97ec26fd16a39cf", size = 8688709 }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, +] + +[[package]] +name = "natsort" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "pydantic" +version = "2.11.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, +] + +[[package]] +name = "pydantic-core" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/44/e6de2fdc880ad0ec7547ca2e087212be815efbc9a425a8d5ba9ede602cbb/pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b", size = 846846 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "ruff" +version = "0.9.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/c3/418441a8170e8d53d05c0b9dad69760dbc7b8a12c10dbe6db1e1205d2377/ruff-0.9.9.tar.gz", hash = "sha256:0062ed13f22173e85f8f7056f9a24016e692efeea8704d1a5e8011b8aa850933", size = 3717448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/c3/2c4afa9ba467555d074b146d9aed0633a56ccdb900839fb008295d037b89/ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367", size = 10027252 }, + { url = "https://files.pythonhosted.org/packages/33/d1/439e58487cf9eac26378332e25e7d5ade4b800ce1eec7dc2cfc9b0d7ca96/ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7", size = 10840721 }, + { url = "https://files.pythonhosted.org/packages/50/44/fead822c38281ba0122f1b76b460488a175a9bd48b130650a6fb6dbcbcf9/ruff-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ee162652869120ad260670706f3cd36cd3f32b0c651f02b6da142652c54941d", size = 10161439 }, + { url = "https://files.pythonhosted.org/packages/11/ae/d404a2ab8e61ddf6342e09cc6b7f7846cce6b243e45c2007dbe0ca928a5d/ruff-0.9.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa0f6b75082c9be1ec5a1db78c6d4b02e2375c3068438241dc19c7c306cc61a", size = 10336264 }, + { url = "https://files.pythonhosted.org/packages/6a/4e/7c268aa7d84cd709fb6f046b8972313142cffb40dfff1d2515c5e6288d54/ruff-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:584cc66e89fb5f80f84b05133dd677a17cdd86901d6479712c96597a3f28e7fe", size = 9908774 }, + { url = "https://files.pythonhosted.org/packages/cc/26/c618a878367ef1b76270fd027ca93692657d3f6122b84ba48911ef5f2edc/ruff-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf3369325761a35aba75cd5c55ba1b5eb17d772f12ab168fbfac54be85cf18c", size = 11428127 }, + { url = "https://files.pythonhosted.org/packages/d7/9a/c5588a93d9bfed29f565baf193fe802fa676a0c837938137ea6cf0576d8c/ruff-0.9.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3403a53a32a90ce929aa2f758542aca9234befa133e29f4933dcef28a24317be", size = 12133187 }, + { url = "https://files.pythonhosted.org/packages/3e/ff/e7980a7704a60905ed7e156a8d73f604c846d9bd87deda9cabfa6cba073a/ruff-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18454e7fa4e4d72cffe28a37cf6a73cb2594f81ec9f4eca31a0aaa9ccdfb1590", size = 11602937 }, + { url = "https://files.pythonhosted.org/packages/24/78/3690444ad9e3cab5c11abe56554c35f005b51d1d118b429765249095269f/ruff-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fadfe2c88724c9617339f62319ed40dcdadadf2888d5afb88bf3adee7b35bfb", size = 13771698 }, + { url = "https://files.pythonhosted.org/packages/6e/bf/e477c2faf86abe3988e0b5fd22a7f3520e820b2ee335131aca2e16120038/ruff-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df104d08c442a1aabcfd254279b8cc1e2cbf41a605aa3e26610ba1ec4acf0b0", size = 11249026 }, + { url = "https://files.pythonhosted.org/packages/f7/82/cdaffd59e5a8cb5b14c408c73d7a555a577cf6645faaf83e52fe99521715/ruff-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d7c62939daf5b2a15af48abbd23bea1efdd38c312d6e7c4cedf5a24e03207e17", size = 10220432 }, + { url = "https://files.pythonhosted.org/packages/fe/a4/2507d0026225efa5d4412b6e294dfe54725a78652a5c7e29e6bd0fc492f3/ruff-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9494ba82a37a4b81b6a798076e4a3251c13243fc37967e998efe4cce58c8a8d1", size = 9874602 }, + { url = "https://files.pythonhosted.org/packages/d5/be/f3aab1813846b476c4bcffe052d232244979c3cd99d751c17afb530ca8e4/ruff-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4efd7a96ed6d36ef011ae798bf794c5501a514be369296c672dab7921087fa57", size = 10851212 }, + { url = "https://files.pythonhosted.org/packages/8b/45/8e5fd559bea0d2f57c4e12bf197a2fade2fac465aa518284f157dfbca92b/ruff-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab90a7944c5a1296f3ecb08d1cbf8c2da34c7e68114b1271a431a3ad30cb660e", size = 11327490 }, + { url = "https://files.pythonhosted.org/packages/42/55/e6c90f13880aeef327746052907e7e930681f26a164fe130ddac28b08269/ruff-0.9.9-py3-none-win32.whl", hash = "sha256:6b4c376d929c25ecd6d87e182a230fa4377b8e5125a4ff52d506ee8c087153c1", size = 10227912 }, + { url = "https://files.pythonhosted.org/packages/35/b2/da925693cb82a1208aa34966c0f36cb222baca94e729dd22a587bc22d0f3/ruff-0.9.9-py3-none-win_amd64.whl", hash = "sha256:837982ea24091d4c1700ddb2f63b7070e5baec508e43b01de013dc7eff974ff1", size = 11355632 }, + { url = "https://files.pythonhosted.org/packages/31/d8/de873d1c1b020d668d8ec9855d390764cb90cf8f6486c0983da52be8b7b7/ruff-0.9.9-py3-none-win_arm64.whl", hash = "sha256:3ac78f127517209fe6d96ab00f3ba97cafe38718b23b1db3e96d8b2d39e37ddf", size = 10435860 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "soupsieve" +version = "2.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, +] + +[[package]] +name = "super-collections" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hjson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/05/d1b50919a0d206d77255217d96dea9ab34bd1eb965a21559380c48f9517e/super_collections-0.5.3.tar.gz", hash = "sha256:94c1ec96c0a0d5e8e7d389ed8cde6882ac246940507c5e6b86e91945c2968d46", size = 10178 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6d/58de58c521e7fb79bceb4da90d55250070bb4adfa3c870b82519a561c79d/super_collections-0.5.3-py3-none-any.whl", hash = "sha256:907d35b25dc4070910e8254bf2f5c928348af1cf8a1f1e8259e06c666e902cff", size = 8436 }, +] + +[[package]] +name = "termcolor" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/72/88311445fd44c455c7d553e61f95412cf89054308a1aa2434ab835075fc5/termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f", size = 13057 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/be/df630c387a0a054815d60be6a97eb4e8f17385d5d6fe660e1c02750062b4/termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8", size = 7755 }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154 }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +] + +[[package]] +name = "wcmatch" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bracex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, +] diff --git a/src/CNRECS.DEF b/src/CNRECS.DEF index 976d1c990..35a7f9fd6 100644 --- a/src/CNRECS.DEF +++ b/src/CNRECS.DEF @@ -1363,16 +1363,15 @@ RECORD XSURF "xsurf sub" *SUBSTRUCT // for PRI, SFI, XSRAT. *r TI iwshad // 0 if none or subscr in WSHADRAT of overhang/fin info for a shaded window *r TI xs_msi // 0, or mass (MsR) subscript for CTMXWALL. - *array XSMXTLRB *h *e - FLOAT xs_tLrB // layer boundary temps re probes + *array XSMXTLRB *h *e FLOAT xs_tLrB // layer boundary temps re probes // populated at end of hour // solar gain distributions: [partly] based on SGDIST inputs *r SI nsgdist // Number of SG distributions // SGDIST sgdist[ HSMXSGDIST]: - *array HSMXSGDIST // =8 (2-95), cndefns.h. explicit solar gain distribs - *r // min variation here: no members set at input time - *nest SGDIST sgdist // solar gain distribution (struct just above). set: cncult3.cpp:cnuSgDist(). + *r *array HSMXSGDIST *nest SGDIST sgdist // =8 (2-95), cndefns.h. explicit solar gain distribs + // *r -> min variation here: no members set at input time + // *nest SGDIST sgdist -> solar gain distribution (struct just above). set: cncult3.cpp:cnuSgDist(). *END // XSURF //============================================================================= RECORD PRI "perimeter" *RAT // perimeter input RAT @@ -1805,7 +1804,7 @@ RECORD COL "reportCol" *RAT // holds info for columns in user-defined table repo TI nxColi // for runtime: COL subscript of next column in this report, 0 if last one *END // COL //============================================================================= -RECORD DVRI "dvri" *hideall *RAT // Date-dependent Virtual Report Info -- at runtime (DvriB) +RECORD DVRI "dvri" *RAT *hideall // Date-dependent Virtual Report Info -- at runtime (DvriB) *prefix dv_ *ovrcopy *declare "void dv_vpDHWMtrRow( struct RXPORTINFO* rxt, TI dhwMtri=-1);" @@ -5685,8 +5684,8 @@ RECORD COIL "coil sub" *SUBSTRUCT // COIL SUB RECORD *h OFFAVAILVC sched // AVAIL when coil available, OFF when disabled, hourly, default AVAIL. // sensible cap'y: see COOLCOIL.capsRat. - *s *e // *s *e for probes, cuz autoSize changes it. hourly for input purposes. - POWER_NZ captRat // total rated cap'y (Btuh), RQD except AHP, ?CHW, hrly vbl for furnaces, const for DX coil. + *s *e POWER_NZ captRat // *s *e for probes, cuz autoSize changes it. hourly for input purposes. + // total rated cap'y (Btuh), RQD except AHP, ?CHW, hrly vbl for furnaces, const for DX coil. *f POWER captRat_As // captRat determined by autoSizing, w less vbly for easier use in probes in main sim. 6-95. *f POWER captRat_AsNov // raw captRat determined by autoSizing, before overSize added, for reports/probes. 7-95 // cnausz.cpp code ASSUMES x, x_As, x_AsNov together for access thru one ptr. cuprobe.cpp's name search also requires together. @@ -6622,8 +6621,7 @@ RECORD TU "terminal" *RAT // TERMINAL // neither sp given but min flow given-->continuous output at that flow regardless of zone temp. *h TEMP_GZ tuTH // air heating set point (F). hourly. default: no tstat-controlled air heating. *h TEMP_GZ tuTC // air cooling set point (F). hourly. default: no tstat-controlled air cooling. - *s *e AFLOW_GEZ - tuVfMn // min flow (cfm actual air); if no setpoints given, this is "specified output". hourly, dlf 0. + *s *e AFLOW_GEZ tuVfMn // min flow (cfm actual air); if no setpoints given, this is "specified output". hourly, dlf 0. *f AFLOW_GEZ tuVfMn_As // .. as autoSized (for constant volume), less variable, for probing. *f AFLOW_GEZ tuVfMn_AsNov // .. raw autoSized value before oversize added, for possible probes. //cnausz.cpp code ASSUMES x, x_As, x_AsNov together for access thru one ptr. cuprobe.cpp's name search also requires together. @@ -6631,8 +6629,8 @@ RECORD TU "terminal" *RAT // TERMINAL *i TI ai // 0 or AH ss (subscript) for air handler serving tu (input as air handler name). RQD if sp or Mn given. - *s *e // *s *e cuz autoSize changes it... inputtable hourly. 7-20-95. - AFLOW_GEZ tuVfMxH // heating max flow (cfm actual air) b4 ah limits, hourly, RQD if TuTH given else disallowed + *s *e AFLOW_GEZ tuVfMxH // *s *e cuz autoSize changes it... inputtable hourly. 7-20-95. + // heating max flow (cfm actual air) b4 ah limits, hourly, RQD if TuTH given else disallowed *f AFLOW_GEZ tuVfMxH_As // .. as determined by autoSizing, less variable, for probing. *f AFLOW_GEZ tuVfMxH_AsNov // .. raw autoSizing result before oversize added, for report/probes. //cnausz.cpp code ASSUMES x, x_As, x_AsNov together for access thru one ptr. cuprobe.cpp's name search also requires together. @@ -6872,6 +6870,7 @@ RECORD HEATPLANT "heatPlant" *RAT // heating plant: contains BOILERs, serves HW // autoSizing *s *e FLOAT qPk // peak load re error autosizing overload message *s *e FLOAT qPkAs // peak load on a converged autoSizing design day re error autosizing overload message + //prior values for runtime change-detection *s *e OFFONCH hpModePr *s *e POWER qPr