stardis

Perform coupled heat transfer calculations
git clone git://git.meso-star.fr/stardis.git
Log | Files | Refs | README | LICENSE

commit 422dd70fa30c032173bffe7c34ebdad7cd8a429a
parent 13e0561eb5ca3bc1ff2d9a2e49b4dd2810905c3b
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon,  6 Apr 2020 14:10:04 +0200

Continue documentation

Diffstat:
Mdoc/stardis-input.5.txt | 1205+++++++------------------------------------------------------------------------
Mdoc/stardis.1.txt.in | 32+++++++++++++++++---------------
2 files changed, 123 insertions(+), 1114 deletions(-)

diff --git a/doc/stardis-input.5.txt b/doc/stardis-input.5.txt @@ -20,1161 +20,168 @@ stardis-input(5) NAME ---- -stardis-input - solar plant description for stardis(1) +stardis-input - thermal system description for stardis(1) DESCRIPTION ----------- -The *stardis-input* is the format used by the *stardis*(1) program to -represent a solar plant. It relies on the YAML 1.1 data serialization standard -[1]; assuming that the file is compatible with the *stardis-input* semantic, a -solar plant can be described by using the whole YAML 1.1 functionalities -including compact notation and data tagging. - -A solar plant is composed of a *sun*, an optional *atmosphere* and a collection -of *geometries*, i.e. *shapes* with their associated *material*. Beside the raw -description of the aforementioned data, the *stardis-input* format provides -the *entity* item to efficiently structure the geometries in the scene. An -entity is a node in a tree data structure where the position of each child -entity is relative to the position of its parent. An entity can either -encapsulate a *geometry* or a *pivot* that controls the dynamic positioning of -its child entities with respect to the pivot constraints and the sun direction -submitted to the *stardis*(1) program. - +*stardis-input* is the format used by the *stardis*(1) program to discribe a +thermal system. It relies on a line-based ad-hoc syntax. + +A thermal system is composed of lines of text, each one describing either a +medium (solid or fluid) frontier, or a boundary (limit condition or connection +between two media). In either case, the description line includes a list of +file names that constitute the limit or boundary. The current version of +*stardis* only accepts triangle mesh geometry files in *VTK* format. + +There are no constraints on triangle partitions: a medium limit or a boundary +description can be split accross files and description lines, and a single +file or description line can describe more than one frontier (more than one +connex region). + +Any physical quantity involved in descriptions is expected in the +International System of Units (second, metre, kilogram, kelvin); the same +applies to *stardis(1)* outputs as described in *stardis-output(5)*. + +Finally, description lines can be submitted to the *stardis*(1) program in +any order and can be split accross more than one file, through multiple use +of the *-M* option. + GRAMMAR ------- +In what follows, some lines end in *\*. This is used as a convenience to +continue the explanation next line. However, this caracter cannot be used in +actual description files and actual description lines must be kept single-line. + [verse] _______ -<solar-plant> ::= - <sun> - - <item> - [ - <item> ... ] - [ - <atmosphere> ] - -<item> ::= <entity> - | <geometry> - | <material> - | <medium> - | <spectrum> - | <template> +<thermal-system> ::= <description-line> + [ <thermal-system> ] +<description-line> ::= [ <medium-frontier> ... ] + [ <medium-boundary> ... ] + [ <media-connection> ... ] + ------------------------------------- -<geometry> ::= geometry: - - <object> - [ - <object> ... ] - -<object> ::= <shape> - <material> - [ <transform> ] - -<x_pivot> ::= x_pivot: - <target> - [ ref_point: <real3> ] # Default is [0,0,0] +<medium-frontier> ::= <solid-frontier> + | <fluid-frontier> + +<solid-frontier> ::= SOLID <medium-name> <lambda> <rho> <cp> <delta> \ + <initial-temperature> <volumic-power> <triangle-sides> -<zx_pivot> ::= zx_pivot: - <target> - [ spacing: REAL ] # in [0, INF). Default 0 - [ ref_point: <real3> ] # Default is [0,0,0] - -<target> ::= target: - anchor: <anchor-identifier> - | direction: <real3> - | position: <real3> - | <sun> +<fluid-frontier> ::= FLUID <medium-name> <ka> <ks> <rho> <cp> \ + <initial-temperature> <triangle-sides> ------------------------------------- -<shape> ::= <cuboid> - | <cylinder> - | <hemisphere> - | <hyperbol> - | <parabol> - | <parabolic-cylinder> - | <plane> - | <sphere> - | <stl> - -<cuboid> ::= cuboid: - size: <real3> # in ]0, INF]^3 - -<cylinder> ::= cylinder: - height: REAL # in ]0, INF) - radius: REAL # in ]0, INF) - [ slices: INTEGER ] # in [4, 4096]. Default is 16 - [ stacks: INTEGER ] # in [1, 4096]. Default is 1 - -<hemisphere> ::= hemisphere: - radius: REAL # in ]0, INF) - [ clip: <polyclip-list> ] - [ slices: INTEGER ] # in [4, 4096] - -<hyperbol> ::= hyperbol: - focals: <hyperboloid-focals> - clip: <polyclip-list> - [ slices: INTEGER ] # in [4, 4096] - -<parabol> ::= parabol: - focal: REAL # in ]0, INF) - clip: <polyclip-list> - [ slices: INTEGER ] # in [4, 4096] - -<parabolic-cylinder> ::= parabolic-cylinder: - focal: REAL # in ]0, INF) - clip: <polyclip-list> - [ slices: INTEGER ] # in [4, 4096] - -<plane> ::= plane: - clip: <polyclip-list> - [ slices: INTEGER ] # in [1, 4096]. Default is 1 - -<sphere> ::= sphere: - radius: REAL # in ]0, INF) - [ slices: INTEGER ] # in [4, 4096]. Default is 16 - [ stacks: INTEGER ] # in [2, 4096]. Default is slices/2 - -<stl> ::= stl: - path: PATH - -<hyperboloid-focals> ::= real: REAL # in ]0, INF) - image: REAL # in ]0, INF) - ----------------------------------------- - -<polyclip-list> ::= - <polyclip> - [ - <polyclip> ... ] - -<polyclip> ::= operation: <AND|SUB> - <contour-descriptor> - -<contour-descriptor> ::= <circle-descriptor> - | <vertices-descriptor> - -<vertices-descriptor> ::= vertices: <vertices-list> - -<circle-descriptor> ::= circle: - radius: REAL # in ]0, INF) - [ center: <real2> ] # Default is 0,0 - [ segments: INTEGER ] # in [3, 4096]. Default is 64 - -<vertices-list> ::= - <real2> - - <real2> - - <real2> - [ - <real2> ... ] - ----------------------------------------- - -<material> ::= material: - <material-descriptor> - | <double-sided-mtl> - -<double-sided-mtl> ::= front: <material-descriptor> - back: <material-descriptor> - -<material-descriptor> ::= <dielectric> - | <matte> - | <mirror> - | <thin-dielectric> - | <virtual> - -<dielectric> ::= dielectric: - medium_i: <medium-descriptor> - medium_t: <medium-descriptor> - [ <normal-map> ] - -<matte> ::= matte: - reflectivity: <mtl-data> # in [0, 1] - [ <normal-map> ] - -<mirror> ::= mirror: - reflectivity: <mtl-data> # in [0, 1] - slope_error: <mtl-data> - [ microfacet: <normal-distrib> ] # Default is BECKMANN - [ <normal-map> ] - -<normal-distrib> ::= BECKMANN - | PILLBOX - -<virtual> ::= virtual: EMPTY-STRING - -<thin-dielectric> ::= thin_dielectric: - thickness: REAL # in [0, INF) - medium_i: <medium-descriptor> - medium_t: <medium-descriptor> - [ <normal-map> ] - -<normal-map> ::= normal_map: - path: PATH - ----------------------------------------- - -<medium> ::= medium: <medium-descriptor> - -<medium-descriptor> ::= refractive_index: <mtl-data> # in ]0, INF) - extinction: <mtl-data> # in [0, INF) - ----------------------------------------- - -<entity> ::= entity: <entity-data> - -<template> ::= template: <entity-data> - -<entity-data> ::= name: STRING - [ <geometry-data> | <x_pivot> | <zx_pivot> ] - [ <anchors> ] - [ <transform> ] - [ <children> ] - -<geometry-data> ::= primary: INTEGER # in [0, 1] - <geometry> - -<children> ::= children: - - <entity-data> - [ - <entity-data> ... ] - -<anchors> ::= anchors: - - <anchor-data> - [ - <anchor-data> ... ] - -<anchor-data> ::= name: STRING - <position-descriptor> - -<position-descriptor> ::= position: <real3> - | hyperboloid_image_focals: <hyperboloid_focals> +<medium-name> ::= STRING # no space allowed -<entity-identifier> ::= <self|STRING>[.STRING ... ] +<lambda> ::= REAL # in ]0, INF) -<anchor-identifier> ::= <entity-identifier>.STRING +<rho> ::= REAL # in ]0, INF) ----------------------------------------- +<cp> ::= REAL # in ]0, INF) -<sun> ::= sun: - dni: REAL # Direct Normal Irradiance in ]0, INF) - [ <spectrum> ] # Default is the smarts295 spectrum - [ <sun-shape> ] +<delta> ::= REAL # in ]0, INF) -<sun-shape> ::= <pillbox> | <gaussian> | <buie> +<initial-temperature> ::= REAL # in [0, INF) -<buie> ::= buie: - csr: REAL # in [1e-6, 0.849] +<volumic-power> ::= REAL # in (-INF , INF) -<pillbox> ::= pillbox: - half_angle: REAL # in ]0, 90] +<ka> ::= REAL # in [0, INF) -<gaussian> ::= gaussian: - std_dev: REAL # in ]0, INF) +<ks> ::= REAL # in [0, INF) ----------------------------------------- +<triangle-sides> ::= <side-specifier> <file-name> [ <triangle-sides> ] -<atmosphere> ::= atmosphere: - extinction: <mtl-data> # in [0, 1] - ----------------------------------------- - -<mtl-data> ::= REAL - | <spectrum-data-list> - -<transform> ::= transform: - translation: <real3> - rotation: <real3> - -<real2> ::= - REAL - - REAL - -<real3> ::= - REAL - - REAL - - REAL - -<spectrum> ::= spectrum: <spectrum-data-list> - -<spectrum-data-list> ::= - <spectrum-data> - [ - <spectrum-data> ... ] - -<spectrum-data> ::= wavelength: REAL # in [0, INF) - data: REAL # in [0, INF) -_______ - -SUN ---- +------------------------------------- -The *sun* describes the source of the solar plant. Its direction is not defined -into the *stardis-input*(5) file but is provided by the *stardis*(1) command. -This allows to use the same unmodified *stardis-input*(5) file for several -simulations with different sun directions. +<side-specifier> ::= FRONT | BACK | BOTH -The main *sun* property is its direct normal irradiance, or *dni* in W.m\^-2. -Its value is a scalar defining the direct irradiance received on a plane -perpendicular to the main sun direction. The optional *spectrum* parameter -describes the per wavelength distribution of the sun *dni*. Note that this -distribution is automatically normalized by *stardis*(1). If the *spectrum* -attribute is not defined, *stardis*(1) uses a default spectrum computed with -the SMARTS software [2] between 0.28 and 4 micro-meters. The total *dni* -(integrated over the spectral range) was set to 1000 W.m^-2. The standard -Mid-Latitude-Summer atmosphere was used with most of gases concentration set -as default (the CO2 concentration was assumed 400ppmv in the atmosphere -column). +<file-name> ::= STRING # no space allowed -Even if an atmosphere is provided, the atmospheric effects from the top of the -atmosphere to ground level are not computed using the atmosphere description. -As a result, the sun description (*dni* and optional *spectrum*) is expected to -include all the atmospheric effects (sun irradiance available at ground -level). +------------------------------------- -The *sun-shape* parameter controls the angular distribution of the sun light -intensity across the sun's disk. If not defined, the distribution is assumed to -be a dirac distribution (infinite directional source). The available sun -shapes are: +<medium-boundary> ::= <h-boundary-for-solid> + | <h-boundary-for-fluid> + | <t-boundary-for-solid> + | <t-boundary-for-fluid> + | <f-boundary-for-solid> + +<h-boundary-for-solid> ::= H_BOUNDARY_FOR_SOLID <boundary-name> <emissivity> \ + <specular-fraction> <hc> <external-temperature> <triangles> -*pillbox*:: - The *pillbox* distribution defines an uniform intensity over the sun's disk. - Its single *half_angle* parameter is the sun's disk half-angle in degrees, that - is linked to the apparent size of the sun. A typical half_angle is 0.2664. +<h-boundary-for-fluid> ::= H_BOUNDARY_FOR_FLUID <boundary-name> <emissivity> \ + <specular-fraction> <hc> <external-temperature> <triangles> -*gaussian*:: - The *gaussian* distribution defines a gaussian distribution of the solar - incoming direction. Its single *std_dev* parameter is the standard deviation - of the distribution in degrees. Values around 0.2 are typical. - As the gaussian distribution is not truncated, the resulting sun vector can - theoreticaly be oriented towards the sun, especially with a big, non-typical - *std_dev* value. +<t-boundary-for-solid> ::= T_BOUNDARY_FOR_SOLID <boundary-name> <temperature> <triangles> -*buie*:: - The *buie* distribution, as first discribed in [3]. Its single *csr* - parameter is the ratio between the circumsolar irradiance and the sum of - the circumsolar and sun's disk irradiance. An analysis on typical *csr* - values can be found in [4]. +<t-boundary-for-fluid> ::= T_BOUNDARY_FOR_FLUID <boundary-name> <temperature> \ + <emissivity> <specular-fraction> <hc> <triangles> -ATMOSPHERE ----------- +<f-boundary-for-solid> ::= T_BOUNDARY_FOR_SOLID <boundary-name> <flux> <triangles> -The *atmosphere*, when provided, describes the medium surrounding the -solar plant. Its only parameter is its extinction coefficient in m^-1, that -can either be a scalar if the *extinction* is constant over the spectrum, or -can be spectrally described. The extinction along light paths is only computed -after the first reflector, as sun description must include all the atmospheric -effects before the first reflector (see sun description for more details). +------------------------------------- -If no atmosphere is provided, atmospheric extinction after the first reflector -is not taken into account. +<boundary-name> ::= STRING # no space allowed -MATERIAL --------- +<emissivity> ::= REAL # in [0, 1] -A *material* describes the properties of an interface. These properties can be -the same for the two sides of the interface or may be differentiated with a -*double-sided-mtl*. The material comportment is controlled by a -*material-descriptor* that specifies the physical properties of the interface -as well as its optional normal perturbation. Note that the physical properties -can be either scalars or spectral data. +<specular-fraction> ::= REAL # in [0, 1] -Material descriptors -~~~~~~~~~~~~~~~~~~~~ +<hc> ::= REAL # in [0, INF) -The available material descriptors are: +<external-temperature> ::= REAL # in [0, INF) -*dielectric*:: -Interface between 2 dielectric media. Its *medium_i* parameter defines the -current medium, i.e. the medium the ray travels in, while *medium_t* -represents the opposite medium. Incoming rays are either specularly reflected -or refracted according to a Fresnel term computed with respect to the -refractive indices of the 2 media as: -+ -....... -Fr = 1/2 * (Rs^2 + Rp^2) -....... -+ -with Rs and Rp the reflectance for the light polarized with its electric -field perpendicular or parallel to the plane of incidence, respectively. -+ -....... -Rs = (n1 * |wi.N| - n2 * |wt.N|) / (n1 * |wi.N| + n2 * |wt.N|) -Rp = (n2 * |wi.N| - n1 * |wt.N|) / (n2 * |wi.N| + n1 * |wt.N|) -....... -+ -with n1 and n2 the indices of refraction of the incident and transmitted -media, and wi and wt the incident and transmitted direction. -+ -Be careful to ensure the media consistency in the *stardis-input*(5) file; a -ray travelling in a medium _A_ can only encounter a medium interface whose -*medium_i* attribute is _A_. Consequently, a *dielectric* material must be -defined as a double sided material whose front and back interfaces are -dielectrics with inverted media: -+ -....... -material: - front: - dielectric: - medium_i: &vacuum { refractive_index: 1, extinction: 0 } - medium_t: &glass { refractive_index: 1.5, extinction: 20 } - back: - dielectric: - medium_i: *glass - medium_t: *vacuum -....... -+ -If the media consistency is not ensured, *stardis*(1) will fail to run -simulations. Note that by default, the surrounding medium is assumed to be -the vacuum, i.e. its refractive index and its extinction are scalars whose -values are 1 and 0, respectively. If an atmosphere is defined, the refractive -index of the surrounding medium is still the scalar 1 but its extinction is -the one of the atmosphere. In other words, to reference the surrounding medium -in the *medium_i* or the *medium_t* attribute of a *dielectric* interface, one -has to define a medium whose refractive index is the scalar 1 and extinction -is either 0 or the extinction of the atmosphere if the latter is defined or -not, respectively. +<flux> ::= REAL # in (-INF , INF) -*matte*:: -Diffuse surface. Reflects the same intensity in all directions independently -of the incoming direction. +<triangles> ::= <file-name> [ <triangles> ] -*mirror*:: -Specular or glossy reflection whether the *slope_error* parameter is 0 or not, -respectively. Glossy reflections are controlled by a microfacet BRDF. The -microfacet normals are distributed with respect to the Beckmann or the Pillbox -distribution according to the *normal-distrib* attribute. -+ -Let S the *slope_error* parameter in ]0, 1]. The Beckmann distribution is -defined as: -+ -....... -D(wh) = exp(-tan^2(a) / m^2) / (PI * m^2 * cos^4(a)) -....... -+ -with a = arccos(wh.N), and m = sqrt(2)*S while the pillbox distribution is -defined as: -+ -....... - | 0; if |wh.N| >= S -D(wh) = | - | 1 / (PI * (1 - cos^2(S))); if |wh.N| < S -....... +------------------------------------- -*thin-dielectric*:: -The interface is assumed to be a thin slab of a dielectric material. The -*medium_i* parameter defines the outside dielectric medium while *medium_t* -is the medium of the thin slab. Incoming rays are either specularly reflected -or transmitted (without deviation) according to a Fresnel term computed with -respect to the refractive indices of the 2 media as: -+ -....... -Fr = 1/2 * (Rs^2 + Rp^2) -....... -+ -with Rs and Rp the reflectance for the light polarized with its electric -field perpendicular or parallel to the plane of incidence, respectively. -+ -....... -Rs = (n1 * |wi.N| - n2 * |wt.N|) / (n1 * |wi.N| + n2 * |wt.N|) -Rp = (n2 * |wi.N| - n1 * |wt.N|) / (n2 * |wi.N| + n1 * |wt.N|) -....... -+ -with n1 and n2 the indices of refraction of the incident and transmitted -media, and wi and wt the incident and transmitted direction. Note that the -underlying scattering function correctly handles the multiple refraction -effects into the thin slab. -+ -Be careful to ensure the media consistency in the *stardis-input*(5) file; a -ray travelling in a medium _A_ can only encounter a medium interface whose -*medium_i* attribute is _A_. If the media consistency is not ensured, -*stardis*(1) will fail to run simulations. Note that by default, the -surrounding medium is assumed to be the vacuum, i.e. its refractive index and -its extinction are scalars whose values are 1 and 0, respectively. If an -atmosphere is defined, the refractive index of the surrounding medium is still -the scalar 1 but its extinction is the one of the atmosphere. In other words, -to reference the surrounding medium in the *medium_i* attribute of a -*thin-dielectric* interface, one has to define a medium whose refractive -index is the scalar 1 and extinction is either 0 or the extinction of the -atmosphere if the latter is defined. +<media-connection> ::= <solid-fluid-connection> -*virtual*:: -Fully transparent interface. +<solid-fluid-connection> ::= SOLID_FLUID_CONNECTION <boundary-name> <emissivity> \ + <specular-fraction> <hc> <triangles> -Normal map -~~~~~~~~~~ +______________ -All the material descriptors, excepted the *virtual*, provide an optional -*normal-map* attribute that defines a path toward a Portable PixMap image [5] -whose pixels store a normal expressed in the tangent space of the interface. By -default the unperturbed tangent space normal is {0,0,1}. The PPM image can -be encoded on 8 or 16-bits per component either in ASCII or binary. The -parameterization of this 2D image onto the shape surfaces depends on the type -of the shape. For the *hemisphere*, *hyperbol*, *parabol*, *plane* and -*parabolic-cylinder* shapes, the image is mapped in the {X,Y} plane. The other -shapes are not parameterized and consequently, applying a normal-mapped -material on these shapes leads to undefined behaviors. +TRIANGLE SIDES +-------------- -SHAPE +Side descriptions in side specifiers rely on the following convention: we +first consider the direct triangle's normal (right-hand rule), then we define +the BACK side of a triangle to be the side this normal comes out from. That +means that a closed set of triangles with normals pointing outside should be +used with the FRONT side specifier to describe inside medium. + +NAMES ----- -A *shape* describes a geometric model. It is defined in its local space, i.e. -in a coordinate system whose origin is proper to the shape. No space -transformation can be introduced through the declaration of a shape: it should -be transformed externally through an *object* and/or *entities*. -*stardis-input*(1) provides 2 types of shape: quadric and mesh. The former is -used to declare parametric surfaces, while the latter describes triangulated -surfaces. - -Quadric -~~~~~~~ - -A quadric shape is defined from a quadric equation and a set of 2D clipping -operations performed in their {X,Y} plane. By convention, the front side of the -quadric surface looks toward the positive Z axis. Internally, the clipped -quadric surface is discretized in a triangular mesh with respect to the -discretisation parameters of the quadric. This mesh is used by *stardis*(1) -as a "proxy" to speed up the access toward the quadric shape: the quadric -position and its associated normal are in fine computed from the quadric -equation. - -The quadric surface is parameterized in the {X,Y} plane. Its parameterization -domain is defined from the bounds of its clipped mesh in the {X,Y} plane: - - u = (x - lowerX) / (upperX-lowerX) - v = (y - lowerY) / (upperY-lowerY) - -with *u* and *v* the mapped 2D coordinates from a 3D position {*x*,*y*,*z*} -onto the quadric, and *lower*<**X**|**Y**> and *upper*<**X**|**Y**> the lower -and upper bounds of the clipped quadric along the X and Y axis. The available -quadrics are: - -*hemisphere*:: -Hemispheric shape defined along the Z axis whose minimum is positioned at -the origin. The *slices* parameter controls the number of divisions along -the Z axis. -+ -....... -x^2 + y^2 + (z-radius)^2 = radius^2 -....... - -*hyperbol*:: -Hyperbolic quadric defined along the Z axis whose minimum is positioned at -the origin. The *slices* parameter controls the discretisation of the -hyperbol. If not defined, it is automatically computed with respect to the -hyperbol curvature. -+ -....... -(x^2 + y^2) / a^2 - (z + z0 - g/2)^2 / b^2 + 1 = 0 - -a^2 = g^2(f - f^2) -b = g(f - 1/2) -z0 = |b| + g/2 -g = focals.real + focals.image -f = focals.real / g -....... - -*parabol*:: -Parabolic quadric defined along the Z axis whose minimum is positioned at the -origin. The *slices* parameter controls the discretisation of the parabol. If -not defined, it is automatically computed with respect to the parabol -curvature. -+ -....... -x^2 + y^2 - 4 * focal * z = 0 -....... - -*parabolic-cylinder*:: -Parabolic cylinder oriented along the Z axis whose main axis is along the X -axis and minimum is positioned at the origin. The *slices* parameter -controls the discretisation of the parabolic cylinder. If not defined, it is -automatically computed with respect to the parabolic cylinder curvature. -+ -....... -y^2 - 4 * focal * z = 0 -....... - -*plane*:: -Plane whose normal points along the positive Z axis. The *slices* attribute -controls the discretisation of the clipped plane. - -Clipping -~~~~~~~~ - -A clipping operation, or *polyclip*, is used to remove some parts of the -quadric surface. It is defined by a 2D *contour-descriptor* expressed in the -{X,Y} plane and a clipping *operation*. The *AND* and *SUB* clip operands, -remove the quadric surface that intersects or does not intersect the -*contour-descriptor*, respectively. The available *countour-descriptors* are: - -*circle-descriptor*:: -Circular contour whose size is defined by the *radius* parameter. Actually, -*stardis*(1) discretized the circular contour with respect to the *segments* -attribute that defines the overall number of segments used to approximate the -circle. - -*vertices-descriptor*:: -Polygonal contour described by a list of 2D vertices. The polygon edges are -defined by connecting each vertex to its previous one. To ensure that the -polygon is closed, an additional edge is automatically created between the -first and the last vertex. Note that *stardis*(1) assumes that the defined -polygon does not overlap itself, i.e. their non consecutive edges are not -intersecting. - -The *clip* parameter of the quadrics lists a set of the aforementioned 2D -*polyclips*. Each of these clipping operations is successively applied on the -remaining quadric surface, in the order on which they are declared. For -instance, the following example uses 5 clipping operations on a plane to build -a rectangle with a circular hole at each of its corner. The first *polyclip* -limits the infinite plane to a rectangle centered in 0 whose size in X and Y is -8 and 4, respectively. The 4 subsequent *polyclips* drill the -rectangle near of its corner with circles whose radius is 0.5: - -....... -plane: - clip: - - {operation: AND, vertices: [[-4,-2],[-4,2],[4,2],[4,-2]]} - - {operation: SUB, circle: {radius: 0.5, center: [-3,-1]}} - - {operation: SUB, circle: {radius: 0.5, center: [-3, 1]}} - - {operation: SUB, circle: {radius: 0.5, center: [ 3,-1]}} - - {operation: SUB, circle: {radius: 0.5, center: [ 3, 1]}} -....... - -Triangular mesh -~~~~~~~~~~~~~~~ - -Triangular meshes are generated by *stardis*(1) from a shape description or -loaded from a CAO file. Their normals are defined per triangle and are thus -discontinuous even for smooth shapes as spheres. The triangular meshes are not -parameterized, i.e. they do not provide a mapping from a 3D position onto its -surface to a 2D coordinates. Applying a normal-mapped material to a triangular -mesh will thus produce undefined behaviors. - -The available triangular meshes are: - -*cuboid*:: - Axis aligned cuboid centered in 0 whose corner positions and dimensions along - the 3 axis are defined by the *size* parameter. The front side of the cuboid - surface looks outside the cuboid. - -*cylinder*:: - Cylinder centered in 0 whose *height* is along the positive Z axis. The top - and the bottom of the cylinder is capped. The *stacks* and *slices* - parameters control the discretisation, i.e. the number of divisions, along or - around the Z axis, respectively. The front side of the cylinder surface looks - outside the cylinder. - -*sphere*:: - Triangulated sphere centered in 0. The *stacks* and *slices* parameters - control the discretisation, i.e. the number of divisions, along or around the - Z axis, respectively. The front side of the sphere surface looks outside the - sphere. - -*stl*:: - Path toward an external mesh file defined with respect to the ASCII - **ST**ereo **L**ithography file format. The front side of the loaded - triangles is defined with respect to their vertex ordering into the STL - file: a triangle is front facing when their vertices are clock wise ordered. - -ENTITY ------- - -An *entity* is used to declare and position shapes into the solar plant. -Actually, the entity is the only item that effectively spawns a *geometry* into -the solar plant: if a geometry is declared but not referenced by an entity, it -is ignored by *stardis*(1). An entity is a hierarchical data structure that -can have child entities whose transformation is relative to their parent. If -not defined, the *transform* parameter of an entity is assumed to be the -identity, i.e. its *rotation* and *translation* are nulls. - -Each entity has a *name* which must be unique per hierarchy level: 2 root -entities (i.e. entities without parent) cannot have the same name as well as -the children of a same parent entity. In addition, the name string cannot -contain dots, spaces or tabulations. A child entity is identified into the -solar plant by successively concatenating, with the \'.' character, the name -of its ancestors with its own name. This naming convention is used in the -*stardis-receiver*(5) format to define the entities to track during the -*stardis*(1) computations. For instance, in the following example, the -*entity-identifier* of the child entity named *level2* is -*level0.level1.level2*: -....... -entity: - name: level0 - child: - - name: level1 - child: - - name: level2 -....... - -An entity encapsulates either a *geometry* or a *pivot*. The former is a -collection of *objects*, i.e. *shapes* with their associated *material* and an -optional *transformation*. The latter is used to control the dynamic -positioning of the child entities with respect to some constraints defined by -the pivot type, and the sun directions submitted by *stardis*(1). Each entity -can also have a list of *anchors*. An anchor is used to define a position -relative to the entity into which it is declared. - -For a geometric entity one has to define if the encapsulated geometry is a -*primary* geometry, i.e. a geometry directly lit by the sun and used to -concentrate the solar flux (e.g. a primary mirror). One can define all the -solar plant geometric entities as primaries but a well designed solar plant -with correctly tagged primary geometries will drastically improve the -convergence speed of the *stardis*(1) simulations. - -Template -~~~~~~~~ - -A *template* is a first level entity with no existence into the solar plant. It -is used to pre-declare an entity hierarchy that can then be instantiated -several times in the solar plant by referencing it through common entities with -YAML data tagging. In the following example, the templated entity *my-template* -is instantiated 3 times into the scene: -....... -- template: &my-template - name: bar - primary: 1 - geometry: ... -- entity: - name: foo0 - transform: {translation: [-10.5, 0, 0]} - children: [*my-template] -- entity: - name: foo1 - transform: {translation: [0, 0, 0]} - children: [*my-template] -- entity: - name: foo2 - transform: {translation: [10.5, 0, 0]} - children: [*my-template] -....... - -Pivot -~~~~~ - -A *pivot* is a special kind of node that can be used in the tree data -structure describing an entity to automatically point its child geometry -according to the sun position and to the pivot parameters. It is supposed (but -not mandatory) that the children of a pivot includes a reflector, that, -once pivoted, will reflect the sun light towards a *target*. You should -note that a pivot cannot be the child of another pivot. - -The most noticeable pivot parameter is its *target*. Four different types of -targets are available: - -*position*:: - Define the target as being an absolute point in world coordinates. - -*anchor*:: - Define the target as being a position relative to an entity (see the - *anchor* section). - -*sun*:: - Define the target as being the center of the sun. - -*direction*:: - The pivot reflects light in the given direction, specified in world - coordinates. - -Pivots can also have a *ref_point* optional parameter defining a 3D point in -the coordinate system the pivot children that will be used by the pointing algorithm. -If not provided, it is set to the origin. - -Two different flavours of *pivots* are available: *x_pivot* and *zx_pivot*, -each with its own set of parameters and behaviour. - -*x_pivot*:: - Pivot with a single rotation axis: the +X axis in its local coordinate - system. It has a *target* and can have a *ref_point*. Its pointing algorithm - considers an incoming ray of light from the center of the sun and rotates - its children so that a specular reflection at *ref_point* using +Z as - local normal will hit the target point of the pivot, or will have the - specified direction (depending of the kind of target). - -*zx_pivot*:: - Pivot with two rotation axis: the +Z axis in its local coordinate system, - then the +X axis in the coordinate system resulting of the Z rotation. - It has a *target* and can have a *ref_point* and a *spacing* that defines - the translation along the +Y axis after the first rotation. If not - defined, *spacing* is 0. The *zx_pivot* pointing algorithm considers an - incoming ray of light from the center of the sun and rotates its - children so that a specular reflection at *ref_point* using - +Y as local normal will hit the target point of the pivot, or will have - the specified direction (depending of the kind of target). - -Anchor -~~~~~~ - -An *anchor* defines a relative position into the entity hierarchy. They are -particularly useful for pivots and hyperbolic shapes that may have to -reference a position relative to an entity whose transformations may also -depends of its ancestor. An anchor has a *name* that must be unique for the -whole sets of per entity anchors. In addition, a name cannot contain -dots, spaces or tabulations. An anchor is identified into the solar plant by -concatenating, with the \'.' character, its name to the *entity-identifier* of -the entity into which it is declared. For instance, in the following example, -the *anchor-identifier* of the anchor named *anchor0* is -*level0.level1.anchor0*: -....... -entity: - name: level0 - child: - - name: level1 - anchor: - - {name: anchor0, position: [0, 0, 0]} - - {name: anchor1, position: [1, 2, 3]} -....... - -In some situations, the *anchor-identifier* cannot be fully determined. Let a -templated entity with a descendant referencing an anchor of one of its -ancestors. On its declaration, the template is still not instantiated through a -parent entity and consequently the name of the root entity is unknown. -Moreover, the name of the root entity cannot be fixed since it changes for each -instance of the template. To handle these cases, the *self* reserved keyword -allows to reference the unknown root entity of the currently declared -hierarchy. In the following example, the entities *entity0.level0.level1* and -*entity1.level0.level1* encapsulate a pivot that references the anchor -*anchor0* defined in their respective parent *entity0.level0* and -*entity1.level0*: -....... -- template: &my-template - name: level0 - anchor: [{name: anchor0, position: [1, 2, 3]}] - child: - - name: level1 - pivot: - x_pivot: - ref_point: {0, 0, 0} - target: {anchor: self.level0.anchor0} - -- entity: {name: entity0, child: [*my-template]} -- entity: {name: entity1, child: [*my-template]} -....... +Names, either file names, medium names or boundary names, are a sequence of +one or ore ascii characters, including numbers and special characters like +*.* *_* *-* as one may consider using in standard file names, *without any +spacing* either escaped or not. -Transform -~~~~~~~~~ - -A *transform* is used to move an *object* or an *entity* in space. The -*rotation* parameter list 3 angles in degrees defining the rotation to perform -around the X, Y and Z axis. The *translation* attribute describes the offsets -to apply along the X, Y and Z axis. Let the local repair *p* of an object, *p* -is transformed in *p'* with respect to its associated *transform* as follow: - - p' = Rx * Ry * Rz * (T + p) - -with *T* the translation vector and *Rx*, *Ry* and *Rz* the rotation matrices -around the X, Y and Z axis defined as: - - | 1 0 0 | | cY 0 sY | | cZ -sZ 0 | - Rx = | 0 cX -sX |; Ry = | 0 1 0 |; Rz = | sZ cZ 0 | - | 0 sX cX | |-sY 0 cY | | 0 0 1 | - -where *c*<**X**|**Y**|**Z**> and *s*<**X**|**Y**|**Z**> are the cosine and the -sinus, respectively, of the rotation angles around the X, Y and Z axis. +Two different description lines can use the same name. However, computating +mean temperature in a given medium (*-m* option of *stardis*) has an undefined +behaviour when the involved name has been used more than once in the system. EXAMPLES -------- -Declare 2 entities and a point source sun. The first entity is a purely -specular square of size 10, whose center is at the origin. The second entity -is a purely transparent square used as a receiver of the solar flux. Its size -is 1 and its center is positioned at {0,0,2}: -....... -- sun: {dni: 1000} - -- entity: - name: reflector - primary: 1 - geometry: - - material: - mirror: - reflectivity: 1 - slope_error: 0 - plane: - clip: - - operation: AND - vertices: - - [-5.0,-5.0] - - [-5.0, 5.0] - - [ 5.0, 5.0] - - [ 5.0,-5.0] - -- entity: - name: receiver - primary: 0 - transform: - translation: [0, 0, 2] - geometry: - - material: - virtual: # No attrib - plane: - clip: - - operation: AND - vertices: - - [-0.5,-0.5] - - [-0.5, 0.5] - - [ 0.5, 0.5] - - [ 0.5,-0.5] -....... - -Define a circular diffuse reflector surrounded by a virtual sphere and a -pillbox-shaped sun whose *half_angle* is 0.1 degree. Use anchors and tags of the -YAML format to reference into the entities a pre-declared geometry. Rely on -the YAML compact notation to reduce the number of lines required to describe -the scene: -....... -- sun: {dni: 1000, pillbox: {half_angle: 0.1}} - -- geometry: &small-circle - - material: {matte: {reflectivity: 1}} - plane: {clip: [{operation: AND, circle: {radius: 0.5}}]} - -- geometry: &big-sphere - - material: {?virtual} - sphere: {radius: 2, slices: 128} - -- entity: {name: reflector, primary: 1, geometry: *small-circle} -- entity: {name: receiver, primary: 0, geometry: *big-sphere} -....... - -Declare 2 parabolic reflectors from a *templated* parabola whose orientation is -controlled by a *zx_pivot*. This pivot ensures that the reflector points toward -the receiver, independently of its position, by targeting an *anchor* whose -position is defined relatively to the receiver: -....... -- sun: {dni: 1000} - -- entity: # Receiver - name: square_receiver - primary: 0 - transform: { rotation: [0,90,0], translation: [100,0,10] } - anchors: [{name: anchor0, position: [0,0,0]}] - geometry: - - material: {?virtual} - plane: - clip: - - operation: AND - vertices: [[-.5,-.5],[-.5,.5],[.5,.5],[.5,-.5]] - -- template: &self_oriented_parabol # Reflector - name: pivot - transform: {translation: [0, 0, 4], rotation: [0, 0, 90]} - zx_pivot: {target: {anchor: square_receiver.anchor0}} - children: - - name: parabol - transform: {rotation: [-90, 0, 0]} - primary: 1 - geometry: - - material: {mirror: {reflectivity: 1, slope_error: 0}} - parabol: - focal: 100 - clip: - - operation: AND - vertices: [[-5,-5],[-5,5],[5,5],[5,-5]] - -# Instantiate the reflector template -- entity: - name: reflector1 - transform: {translation: [0,0,0]} - children: [*self_oriented_parabol] -- entity: - name: reflector2 - transform: {translation: [10,43.6,0]} - children: [*self_oriented_parabol] -....... - -Declare a solar furnace with 9 heliostats instantiated from the same -*template*. Their position is controlled by a *zx_pivot* to ensure that the -incoming sun rays are reflected toward the negative X axis. Reflected rays are -then concentrated by a parabola toward a purely absorptive receiver. The -heliostats and the parabola share the same material: the front faces are -purely specular while the back faces are diffuse: -....... -- sun: {dni: 1000} - -- material: &specular - front: {mirror: {reflectivity: 1, slope_error: 0}} - back: {matte: {reflectivity: 1}} - -- template: &H # Template of an heliostat - name: heliostat - transform: {translation: [0,0,5.5]} - zx_pivot: {target: {direction: [-1,0,0]}} - children: - - name: reflector - transform: {rotation: [-90,0,0]} - primary: 1 - geometry: - - material: *specular - plane: - clip: [{operation: AND, vertices: [[-5,-5],[-5,5],[5,5],[5,-5]]}] - -- entity: # Receiver entity - name: receiver - primary: 0 - transform: {translation: [18,0,20], rotation: [0,90,0]} - geometry: - - material: {matte: {reflectivity: 0}} - plane: - clip: - - operation: AND - vertices: [[-.5,-.5],[-.5,.5],[.5,.5],[.5,-.5]] - -- entity: # Great parabola - name: parabola - primary: 0 - transform: {translation: [0,0,20], rotation: [0,90,90]} - geometry: - - material: *specular - parabol: - focal: 18 - clip: [{operation: AND, vertices: [[-30,-20],[-30,20],[30,20],[30,-20]]}] - -# Instantiate the heliostat template -- entity: {name: H1, children: [*H], transform: {translation: [40,-20, 0]}} -- entity: {name: H2, children: [*H], transform: {translation: [40, 0, 0]}} -- entity: {name: H3, children: [*H], transform: {translation: [40, 20, 0]}} -- entity: {name: H4, children: [*H], transform: {translation: [60,-20,10]}} -- entity: {name: H5, children: [*H], transform: {translation: [60, 0,10]}} -- entity: {name: H6, children: [*H], transform: {translation: [60, 20,10]}} -- entity: {name: H7, children: [*H], transform: {translation: [80,-20,20]}} -- entity: {name: H8, children: [*H], transform: {translation: [80, 0, 20]}} -- entity: {name: H9, children: [*H], transform: {translation: [80, 20,20]}} +Define a solid cube with a h boundary. The cube geometry is read from the file +cube.stl and the solid medium properties are lambda=0.1, rho=25, cp=2. The +numerical parameter delta, that is used for solid conductive walks, is 0.05. +The initial temperature of the cube is 0°K and its volumic power is 0. +The boundary properties are emisivity=0, specular-fraction=0, h=10 and +external-temperature = 100°K. ....... - -This example illustrates the use of quadrics and refractive materials: in this -example, three partial *parabols* with various focal distances and positions -concentrate incoming radiation at a common focal position. But a *hyperbol* is -located between the parabols and their common focal position, which is also -one of the two focals of the hyperbol. Radiation is therefore redirected to -the second focal of the hyperbol, where the square target is located. Finally, -a *cuboid* using a glass material is located between the hyperbol and the -target. In this example, a small fraction of incoming power is absorbed by the -target. The rest is either missing the target, absorbed or refracted by the -glass. Furthermore, this example illustrates the use of a *spectrum* for -*refractive index* and *extinction* by various *media* (air and glass). +SOLID CUBE 0.1 25 2 0.05 0 0 FRONT cube.stl +H_BOUNDARY_FOR_SOLID HdT 0 0 10 100 cube.stl ....... -# Spectra -- spectrum: &solar_spectrum - - {wavelength: 0.3, data: 1.0} - - {wavelength: 0.4, data: 2.0} - - {wavelength: 0.5, data: 0.5} - - {wavelength: 0.6, data: 3.5} - - {wavelength: 0.7, data: 1.5} - - {wavelength: 0.8, data: 0.8} - -- spectrum: &air_kabs - - {wavelength: 0.3, data: 1.0e-4} - - {wavelength: 0.4, data: 1.0e-5} - - {wavelength: 0.5, data: 2.0e-5} - - {wavelength: 0.6, data: 2.0e-4} - - {wavelength: 0.7, data: 3.0e-5} - - {wavelength: 0.8, data: 1.0e-4} - -- spectrum: &glass_kabs - - {wavelength: 0.3, data: 1.0e-2} - - {wavelength: 0.4, data: 1.0e-3} - - {wavelength: 0.5, data: 2.0e-3} - - {wavelength: 0.6, data: 2.0e-2} - - {wavelength: 0.7, data: 3.0e-3} - - {wavelength: 0.8, data: 1.0e-3} - -- spectrum: &glass_ref_index - - {wavelength: 0.30, data: 1.40} - - {wavelength: 0.40, data: 1.39} - - {wavelength: 0.50, data: 1.37} - - {wavelength: 0.60, data: 1.34} - - {wavelength: 0.70, data: 1.30} - - {wavelength: 0.80, data: 1.25} - -# Media -- medium: &air_medium - refractive_index: 1 - extinction: *air_kabs - -- medium: &glass_medium - refractive_index: *glass_ref_index - extinction: *glass_kabs - -# Sun & atmosphere -- sun: {dni: 1, spectrum: *solar_spectrum} -- atmosphere: {extinction: *air_kabs} - -# Materials -- material: &specular {mirror: {reflectivity: 1, slope_error: 0}} -- material: &black {matte: {reflectivity: 0}} -- material: &glass - front: {dielectric: {medium_i: *air_medium, medium_t: *glass_medium}} - back: {dielectric: {medium_i: *glass_medium, medium_t: *air_medium}} - -# Primary reflectors -- entity: - name: "primary_reflector1" - primary: 1 - transform: {translation: [0, 0, -2.0]} - geometry: - - material: *specular - parabol: - focal: 12 - clip: - - {operation: AND, circle: {radius: 10}} - - {operation: SUB, circle: {radius: 5}} - -- entity: - name: "primary_reflector2" - primary: 1 - transform: {translation: [0, 0, -4]} - geometry: - - material: *specular - parabol: - focal: 14 - clip: - - {operation: AND, circle: {radius: 15}} - - {operation: SUB, circle: {radius: 10}} - -- entity: - name: "primary_reflector3" - primary: 1 - transform: {translation: [0, 0, -6]} - geometry: - - material: *specular - parabol: - focal: 16 - clip: - - {operation: AND, circle: {radius: 20}} - - {operation: SUB, circle: {radius: 15}} - -# Secondary reflector -- entity: - name: "secondary_reflector" - primary: 0 - transform: {translation: [0, 0, 6]} - geometry: - - material: *specular - hyperbol: - focals: {real: 16.0, image: 4} - clip: [{operation: AND, circle: {radius: 5}}] - -# Glass box -- entity: - name: "glass_slide" - primary: 0 # The entity is not sampled as a primary reflector - geometry: - - material: *glass - cuboid: {size: [10,10,0.5]} - transform: {translation: [0, 0, 0.25]} - -# Receiver -- entity: - name: "square_receiver" - primary: 0 # The entity is not sampled as a primary reflector - transform: {translation: [0, 0, -10] } - geometry: - - material: *black - plane: - clip: - - operation: AND - vertices: [[-0.5,-0.5],[-0.5,0.5],[0.5,0.5],[0.5,-0.5]] -....... - - -NOTES ------ -1. YAML Ain't Markup Language - <http://yaml.org> -2. SMARTS, Simple Model of the Atmospheric Radiative Transfer of Sunshine - - <http://www.nrel.gov/rredc/smarts/> -3. D. Buie, A.G. Monger, C.J. Dey. "Sunshape distributions for - terrestrial solar simulations". Solar Energy, 2003, 74, pp. 113-122. -4. D. Buie, C.J. Dey, S. Bosi. "The effective size of the solar cone for - solar concentrating systems". Solar Energy, 2003, 74, pp. 417-427. -5. Portable PixMap - <http://netpbm.sourceforge.net/doc/ppm.html> SEE ALSO -------- -*stardis*(1), *stardis-receiver*(5) +*stardis*(1) diff --git a/doc/stardis.1.txt.in b/doc/stardis.1.txt.in @@ -92,8 +92,6 @@ MANDATORY OPTIONS Can include both media enclosures and boundary conditions, in any order. Can be used more than once if the description is splited across different files. -+ -blabla right-handed normals blabla inside/outside blabla. EXCLUSIVE OPTIONS ----------------- @@ -196,6 +194,11 @@ This option can only be used in conjuction with an option that runs a computation (-p, -P, -m, -s, -R, -S, -F) and cannot be used in conjunction with other options that write to _standard output_ (-R, -d, -g, -h, -v). +**-f** _factor_:: + Rescale the geometry by the given *factor* before sending it to the solver, + expected length unit being meter. Default rescale *factor* + is @STARDIS_ARGS_DEFAULT_SCALE_FACTOR@. + *-g*:: Write the green function at a steady state to _standard output_ after the specified computation. @@ -203,10 +206,9 @@ with other options that write to _standard output_ (-R, -d, -g, -h, -v). This option can only be used in conjonction with one these options: -p, -P, -m, -s. Any provided compute time is silently ignored. -**-f** _factor_:: - Rescale the geometry by the given *factor* before sending it to the solver. - Default rescale *factor* is @STARDIS_ARGS_DEFAULT_SCALE_FACTOR@. - +*-h*:: + Output short help and exit. + *-n* _samples-count_:: Number of Monte-Carlo samples. By default _samples-count_ is set to @STARDIS_ARGS_DEFAULT_SAMPLES_COUNT@. @@ -223,10 +225,10 @@ This option can only be used in conjonction with one these options: -p, -P, *-V* _level_:: Set the verbosity level according to the following list. Default verbosity *level* is @STARDIS_ARGS_DEFAULT_VERBOSE_LEVEL@. - **0** (write no message to _standard error_),;; - **1** (write error messages only to _standard error_),;; - **2** (write error and warning messages to _standard error_),;; - **3** (write error, warning and informative messages to _standard error_). + * *0*: (write no message to _standard error_), + * *1*: (write error messages only to _standard error_), + * *2*: (write error and warning messages to _standard error_), + * *3*: (write error, warning and informative messages to _standard error_). *-v*:: Output version information and exit. @@ -236,8 +238,7 @@ EXAMPLES Pre-process the system as described in *scene.txt* when intending to compute the mean flux on the triangles from the file *edge.stl*, and write its geometry -in the file *scene.vtk*. Verbosity level is set to *3* and the possible -messages are printed to standard error: +in the file *scene.vtk*. Verbosity level is set to *3*: $ stardis -M scene.txt -F edge.stl -d -V 3 > scene.vtk @@ -248,6 +249,10 @@ samples is set to *1000000*: $ stardis -M media.txt -M bounds.txt -p 0,0.5,0 -n 1000000 +Compute the mean temperature in the medium *med05* at *t=100* s. The system is +read from the 2 files *media.txt* and *bound.txt*: + + $ stardis -M media.txt -M bounds.txt -m med05,100 COPYRIGHT --------- @@ -258,8 +263,5 @@ permitted by law. SEE ALSO -------- -*csplit*(1), -*feh*(1), -*sed*(1), *stardis-input*(5), *stardis-output*(5)