stardis-green

Post-processing of green functions
git clone git://git.meso-star.fr/stardis-green.git
Log | Files | Refs | README | LICENSE

commit 8b756ea13c5aa0acfed72a7b730e820fb7afbe10
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu, 30 Apr 2020 14:57:42 +0200

Initial commit

Diffstat:
A.gitignore | 12++++++++++++
ACOPYING | 674+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AREADME.md | 21+++++++++++++++++++++
Acmake/CMakeLists.txt | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acmake/doc/CMakeLists.txt | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/sgreen-input.5.txt | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/sgreen-man.css | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/sgreen-output.5.txt | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adoc/sgreen.1.txt.in | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-args.c | 193+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-args.h | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-compute.c | 349+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-compute.h | 41+++++++++++++++++++++++++++++++++++++++++
Asrc/green-default.h.in | 22++++++++++++++++++++++
Asrc/green-description.h | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-input.c | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-main.c | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-output.c | 482+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-output.h | 37+++++++++++++++++++++++++++++++++++++
Asrc/green-types.h | 408+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/green-version.h.in | 24++++++++++++++++++++++++
21 files changed, 3387 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,12 @@ +.gitignore +CMakeCache.txt +CMakeFiles +Makefile +tmp +[Bb]uild* +*.sw[po] +*.[ao] +*.orig +*~ +tags + diff --git a/COPYING b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/README.md b/README.md @@ -0,0 +1,20 @@ +#sgreen : stardis post-process + +sgreen is a postprocess of Green function binary files, as produced by the +*stardis* program (https://gitlab.com/meso-star/stardis). The main purpose +of sgreen is to compute Monte-Carlo results by applying Green functions to +new settings, enabling ultra-fast Monte-Carlo computations. + +Pour compiler il suffit de taper `make` après avoir préalablement renseigner +dans le makefile la variable SDIS_SDK qui est le chemin du SDK de Stardis. Voir +les notes de version en ci-dessous pour avoir la bonne version du SDK. + + +# Release Notes + +## v0.1 + +Postprocess a binary Green function file, as created by stardis. Main features are: + +- produce a summary of a Green function in HTML format, +- apply a Green function to new settings and output the corresponding Monte-Carlo results. +\ No newline at end of file diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -0,0 +1,140 @@ +# Copyright (C) 2018-2020 |Meso|Star> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cmake_minimum_required(VERSION 3.0) +project(sgreen C) + +set(GREEN_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../src) + +if(CMAKE_HOST_UNIX) + set(GREEN_DOC "TROFF & HTML" CACHE STRING + "Type of documentation to generate and install.") +else() + set(GREEN_DOC "HTML" CACHE STRING + "Type of documentation to generate and install.") +endif() + +set_property(CACHE GREEN_DOC PROPERTY STRINGS + "HTML" + "TROFF" + "TROFF & HTML" + "NONE") + +############################################################################### +# Generate files +############################################################################### +set(GREEN_ARGS_DEFAULT_VERBOSE_LEVEL "1") + +configure_file(${GREEN_SOURCE_DIR}/../doc/sgreen.1.txt.in + ${CMAKE_CURRENT_BINARY_DIR}/doc/sgreen.1.txt @ONLY) + +set(GREEN_VERSION_MAJOR 0) +set(GREEN_VERSION_MINOR 1) +set(GREEN_VERSION_PATCH 0) +set(GREEN_VERSION ${GREEN_VERSION_MAJOR}.${GREEN_VERSION_MINOR}.${GREEN_VERSION_PATCH}) + +configure_file(${GREEN_SOURCE_DIR}/green-default.h.in + ${CMAKE_CURRENT_BINARY_DIR}/green-default.h @ONLY) + +configure_file(${GREEN_SOURCE_DIR}/green-version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/green-version.h @ONLY) + +############################################################################### +# Check dependencies +############################################################################### +find_package(RCMake 0.4 REQUIRED) +find_package(RSys 0.9 REQUIRED) +if(MSVC) + find_package(MuslGetopt REQUIRED) +endif() + +include_directories( + ${RSys_INCLUDE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}) +if(MSVC) + include_directories(${MuslGetopt_INCLUDE_DIR}) +endif() + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${RCMAKE_SOURCE_DIR}) +include(rcmake) +include(rcmake_runtime) + +if(CMAKE_COMPILER_IS_GNUCC) + rcmake_append_runtime_dirs(_runtime_dirs RSys) +endif() +if(MSVC) + rcmake_append_runtime_dirs(_runtime_dirs RSys MuslGetopt) +endif() + +############################################################################### +# Build subprojects +############################################################################### +if(NOT GREEN_DOC STREQUAL "NONE") + add_subdirectory(doc) +endif() + +############################################################################### +# Configure and define targets +############################################################################### +set(GREEN_FILES_SRC + green-args.c + green-compute.c + green-input.c + green-main.c + green-output.c) + +set(GREEN_FILES_INC + green-args.h + green-compute.h + green-output.h + green-types.h + green-version.h.in) + +set(GREEN_FILES_DOC COPYING README.md) + +# Prepend each file by `GREEN_SOURCE_DIR' +rcmake_prepend_path(GREEN_FILES_SRC ${GREEN_SOURCE_DIR}) +rcmake_prepend_path(GREEN_FILES_INC ${GREEN_SOURCE_DIR}) +rcmake_prepend_path(GREEN_FILES_DOC ${PROJECT_SOURCE_DIR}/../) + +add_executable(sgreen + ${GREEN_FILES_SRC} + ${GREEN_FILES_INC}) + +if(CMAKE_COMPILER_IS_GNUCC) + set(MATH_LIB m) + set_target_properties(sgreen PROPERTIES + COMPILE_FLAGS "-std=c99" + VERSION ${GREEN_VERSION}) +elseif(MSVC) + set(GETOPT_LIB MuslGetopt) + set_target_properties(sgreen PROPERTIES + VERSION ${GREEN_VERSION}) +endif() + +target_link_libraries(sgreen + RSys ${GETOPT_LIB} ${MATH_LIB}) + +############################################################################### +# Define output & install directories +############################################################################### +install(TARGETS sgreen + ARCHIVE DESTINATION bin + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin) + +install(FILES ${GREEN_FILES_DOC} DESTINATION share/doc/sgreen) + +rcmake_copy_runtime_libraries(sgreen) diff --git a/cmake/doc/CMakeLists.txt b/cmake/doc/CMakeLists.txt @@ -0,0 +1,149 @@ +# Copyright (C) 2018-2020 |Meso|Star> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cmake_minimum_required(VERSION 3.0) + +string(REGEX MATCH ".*HTML.*" _html ${GREEN_DOC}) +string(REGEX MATCH ".*ROFF.*" _roff ${GREEN_DOC}) + +set(GREEN_DOC_DIR ${PROJECT_SOURCE_DIR}/../doc) + +################################################################################ +# Look for asciidoc and a2x programs +################################################################################ +if(_html) + find_program(ASCIIDOC NAMES asciidoc asciidoc.py) + if(NOT ASCIIDOC) + unset(_html) + message(WARNING + "The `asciidoc' program is missing. " + "The sgreen HTML documentation cannot be generated.") + endif() +endif() + +if(_roff) + find_program(A2X NAMES a2x a2x.py) + if(NOT A2X) + unset(_roff) + message(WARNING + "The `a2x' program is missing. " + "The sgreen man pages cannot be generated.") + endif() +endif() + +################################################################################ +# Copy doc files +################################################################################ +set(MAN_NAMES + sgreen-input.5 + sgreen-output.5) + +if(_roff OR _html) + set(MAN_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_src ${GREEN_DOC_DIR}/${_name}.txt) + set(_dst ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + add_custom_command( + OUTPUT ${_dst} + COMMAND ${CMAKE_COMMAND} -E copy ${_src} ${_dst} + DEPENDS ${_src} + COMMENT "Copy the asciidoc ${_src}" + VERBATIM) + list(APPEND MAN_FILES ${_dst}) + endforeach() + add_custom_target(man-copy ALL DEPENDS ${MAN_FILES}) +endif() + +list(APPEND MAN_NAMES sgreen.1) + +################################################################################ +# ROFF man pages +################################################################################ +if(_roff) + set(A2X_OPTS -dmanpage -fmanpage) + set(MAN_FILES) + set(MAN5_FILES) + set(MAN1_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_man ${CMAKE_CURRENT_BINARY_DIR}/${_name}) + set(_txt ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + + add_custom_command( + OUTPUT ${_man} + COMMAND ${A2X} ${A2X_OPTS} ${_txt} + DEPENDS man-copy ${_txt} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Build ROFF man page ${_man}" + VERBATIM) + list(APPEND MAN_FILES ${_man}) + + string(REGEX MATCH "^.*.5$" _man5 ${_man}) + string(REGEX MATCH "^.*.1$" _man1 ${_man}) + if(_man1) + list(APPEND MAN1_FILES ${_man1}) + elseif(_man5) + list(APPEND MAN5_FILES ${_man5}) + else() + message(FATAL_ERROR "Unexpected man type") + endif() + endforeach() + add_custom_target(man-roff ALL DEPENDS ${MAN_FILES}) + + install(FILES ${MAN1_FILES} DESTINATION share/man/man1) + install(FILES ${MAN5_FILES} DESTINATION share/man/man5) +endif() + +################################################################################ +# HTML documentation +################################################################################ +if(_html) + set(ASCIIDOC_OPTS + -bxhtml11 + -dmanpage + --attribute themedir=${GREEN_DOC_DIR} + --theme=green-man) + + set(MAN_FILES) + set(MAN5_FILES) + set(MAN1_FILES) + foreach(_name IN LISTS MAN_NAMES) + set(_man ${CMAKE_CURRENT_BINARY_DIR}/${_name}.html) + set(_txt ${CMAKE_CURRENT_BINARY_DIR}/${_name}.txt) + + add_custom_command( + OUTPUT ${_man} + COMMAND ${ASCIIDOC} ${ASCIIDOC_OPTS} ${_txt} + DEPENDS man-copy ${_txt} ${GREEN_DOC_DIR}/sgreen-man.css + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Build HTML man page ${_man}" + VERBATIM) + list(APPEND MAN_FILES ${_man}) + + string(REGEX MATCH "^.*.5.html$" _man5 ${_man}) + string(REGEX MATCH "^.*.1.html$" _man1 ${_man}) + if(_man1) + list(APPEND MAN1_FILES ${_man1}) + elseif(_man5) + list(APPEND MAN5_FILES ${_man5}) + else() + message(FATAL_ERROR "Unexpected man type") + endif() + endforeach() + add_custom_target(man-html ALL DEPENDS ${MAN_FILES}) + + install(FILES ${MAN1_FILES} DESTINATION share/man/man1) + install(FILES ${MAN5_FILES} DESTINATION share/man/man5) +endif() + diff --git a/doc/sgreen-input.5.txt b/doc/sgreen-input.5.txt @@ -0,0 +1,103 @@ +// Copyright (C) 2018-2020 |Meso|Star> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +:toc: + +sgreen-input(5) +=============== + +NAME +---- +green-input - settings description for green(1) + +DESCRIPTION +----------- +*green-input* is the format used by the *green*(1) program to describe a +settings when applying a Green function. It relies on a line-based ad-hoc +syntax. + +A settings file is composed of lines of text, each one describing the settings +to apply for a Green function call. Each line contains *variable = value" pairs +in any number (at least one pair for a line to be meaningful). A list of all +legit variable names can be found in the Green function summary, as produced +by option *-s*. + +GRAMMAR +------- +In what follows, some lines end in *\*. This is used as a convenience to +continue a description next line. However, this trick cannot be used in +actual description files and actual description lines must be kept single-line. +Also, text appearing between quote marks has to be used verbatim in the input, +except the quote characters. Finally, text introduced by the *#* character in +descriptions, when not verbatim, is a comment and is not part of the +description. + +[verse] +_______ +<settings-file> ::= <settings-line> + [ <settings-file> ] + +<settings-line> ::= [ <variable> "=" <value> ] [ <settings-line> ] [ comment ] + +------------------------------------- + +<variable> ::= <description-name>"."<field> + | "AMBIENT" # set ambient radiative temperature value + +<value> ::= REAL + +<comment> ::= "#" Any text introduced by the # character + +<description-name> ::= STRING # no space allowed + +<field> ::= "T" # set the temperature value + | "F" # set the flux value + | "VP" # set the volumic power value + +______________ + +TRIANGLE SIDES +-------------- +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 +----- +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. Two different description lines cannot use +the same name. + +EXAMPLES +-------- +Define a solid named 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. +....... +SOLID Cube 0.1 25 2 0.05 0 0 FRONT cube.stl +H_BOUNDARY_FOR_SOLID HdT 0 0 10 100 cube.stl +....... + +SEE ALSO +-------- +*green*(1), +*green-input*(5) diff --git a/doc/sgreen-man.css b/doc/sgreen-man.css @@ -0,0 +1,96 @@ +/* Copyright (C) 2016-2018 CNRS + * + * This is free style sheet: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This CSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. */ + +body.manpage { + font-family:"Liberation Sans",sans-serif; + font-size:10pt; + text-align: justify; + max-width: 55em; + margin: 1em; + background: #ffffff +} + +body.manpage .monospaced, .literalblock { + margin: 2em; + color: #636261 +} + +body.manpage em { + color: #660000 +} + +body.manpage div.verseblock > pre.content { + font-family: "Liberation Mono",monospace; +} + +body.manpage h1 { + padding-bottom: 0.5em; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; +} + +body.manpage code { + font-family: "Liberation Mono",monospace; +} + +body.manpage #footer { display: none; } + +body.manpage div#toctitle { display: none; } + +body.manpage div#toc { + display: block; + position:fixed; + top:0; + left:60em; + height:100%; + width: 100%; + padding:3em 0 0 0; + border-left:1px solid #dbdbdb; + background: #eeeeee +} + +body.manpage a { + font-weight: bold; + color: #225588; +} + +body.manpage div#toc a, div#toc a:link, div#toc a:visited { + margin:0; + padding-left: 2em; + color:#999999; + text-decoration:none; + font-weight: normal; +} + +body.manpage div.toclevel1 { + line-height: 1.5em; +} + +body.manpage div.toclevel2 { + margin-left: 2em; +} + +body.manpage div#toc a:hover { + color:#666666; +} + +@media print { + body.manpage div#toc { display: none; } +} + diff --git a/doc/sgreen-output.5.txt b/doc/sgreen-output.5.txt @@ -0,0 +1,102 @@ +// Copyright (C) 2018-2020 |Meso|Star> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +:toc: + +sgreen-output(5) +================ + +NAME +---- +green-output - output format of green(1) results + +DESCRIPTION +----------- +*green-output* describes the output format of option *-a* of the *green*(1) +program. + +The type of the data that are generated depends on the options used when +*green*(1) is invoked. When invoked with the option *-a*, *green*(1) outputs +Monte-Carlo results, either in extended or compact format, whether option *-e* +is used or not. Also, when invoked whith option *-s* *green*(1) outputs an +HTML file contening a summary of the Green function used. + +GRAMMAR +------- +As Green summaries comply with HTML format, that can be found in HTML +specification documents [1], they will not be further described. Only +Monte-Carlo results are described in this section. + +In what follows, text appearing between quote marks is a verbatim part of the +output, except the quote characters, and text introduced by the *#* character +in a description is a comment and is not part of the output. + +[verse] +_______ + +<output> ::= <MC-result> + <output> # as many ouput lines as provided setting lines + +<MC-result> ::= <compact-MC-result> + | <extended-MC-result> + +------------------------------------- + +<compact-MC-result> ::= <estimate> <standard-deviation> + +<extended-MC-result> ::= <estimate> "+/-" <standard-deviation> ";" <applied-settings> + +<estimate> ::= REAL + +<standard-deviation> ::= REAL # in [0, INF) + +<applied-settings> ::= ASCII TEXT # verbatim from the settings file +_______ + +HTML SUMMARY +------------ +When using option *-s*, *green*(1) creates a summary of the Green function in +HTML format. This document contains the following sections: + +* List of variables + +* Formula of the Monte-Carlo estimate + +* Counts + +* Solids + +* Fluids + +* T boundaries for solids + +* T boundaries for fluids + +* H boundaries for solids + +* H boundaries for fluids + +* F boundaries for dolids + +* Radiative temperatures + +NOTES +----- +1. HTML Standard - <https://html.spec.whatwg.org/> + +SEE ALSO +-------- +*green*(1), +*green-input*(5) diff --git a/doc/sgreen.1.txt.in b/doc/sgreen.1.txt.in @@ -0,0 +1,117 @@ +// Copyright (C) 2018-2020 |Meso|Star> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +:toc: + +sgreen(1) +========= + +NAME +---- +sgreen - postprocessing of Green functions + +SYNOPSIS +-------- +[verse] +*sgreen* [_option_] + +DESCRIPTION +----------- +*sgreen* is a post processing tool that can be used on *stardis*(1) Green +functions, as contained in binary green files. The main functionality is to +apply different boundary conditions to a system once solved by *stardis*(1) +in Green mode (*-G* option of *stardis*(1)). The provided file should comply +with the *sgreen-input*(5) format, that is also the output format of +*stardis*(1) in binary Green mode (see *stardis-output*(5)). + +Using this Green function (a.k.a propagator) approach, when possible, produces +the very same results as a full Monte-Carlo computation, but only requires a +fraction of the computation time. + +The propagator is of great value for thermicist engineers as it gives some +crucial information to analyse heat transfers in the system. It helps engineers +answer questions like _"Where from does the heat come at this location?"_. +Propagators seamlessly agregate all the provided geometrical and physical +information on the system in an unbiased and very-fast statistical model. + +*sgreen*(1) also provides an additional functionality: summarize information on +a Green function in HTML format to help understand what matters on the +simulated system. + +OPTIONS +------- +*-a* _FILE_NAME_:: + Apply a Green function using the variable settings read in a file. Can only + be applied in conjunction with option *-g*. + +*-e*:: + Use extended format to output Monte-Carlo results. Can only be used in + conjunction with option *-a*. + +*-g* _GREEN_BINARY_FILE_:: + Read a Green function from a file for further processing. + +*-h*:: + Output short help and exit. + +*-s* _FILE_NAME_:: + Create a summary of a Green function and write it to a file in HTML format. + Can only be applied in conjunction with option *-g*. + +*-t* _threads-count_:: + Hint on the number of threads to use. By default use as many threads as CPU + cores. + +*-v*:: + Output version information and exit. + +*-V* _level_:: + Set the verbosity level. Possible values are *0* (no message), *1* (error + messages only), *2* (error and warning messages), and *3* (error, warning + and informative messages). All the messages are written to _standard error_. + Default verbosity *level* is @GREEN_ARGS_DEFAULT_VERBOSE_LEVEL@. + +EXAMPLES +-------- +Create a summary of the *heatsink.green* Green function and write it in the +*heatsink_green.html* file: + + $ sgreen -g heatsink.green -s heatsink_green.html + +Apply the settings from the file *cube_settings.txt* to the *cube.green* Green +function and output the corresponding Monte-Carlo results to stdout in extended +format. Set verbosity level to 2. + + $ sgreen -g cube.green -a cube_settings.txt -e -V 2 + +Create a summary of the *heatsink.green* Green function and write it in the +*heatsink_green.html* file; also apply the settings from the file +*heatsink_settings.txt* and output the corresponding Monte-Carlo results to +stdout in compact format. + + $ sgreen -g heatsink.green -s heatsink_green.html -a heatsink_green.html + +COPYRIGHT +--------- +Copyright &copy; 2018-2020 |Meso|Star>. License GPLv3+: GNU GPL +version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software. +You are free to change and redistribute it. There is NO WARRANTY, to the extent +permitted by law. + +SEE ALSO +-------- +*sgreen-input*(5), +*sgreen-output*(5), +*stardis*(1) diff --git a/src/green-args.c b/src/green-args.c @@ -0,0 +1,193 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "green-args.h" +#include "green-default.h" +#include "green-types.h" + +#include <rsys/rsys.h> +#include <rsys/logger.h> +#include <rsys/cstr.h> +#include <rsys/str.h> + +#include <getopt.h> + +static char +mode_option + (const int m) +{ + int found = 0; + char res = '?'; + if(m & MODE_APPLY_GREEN) { found++; res = 'a'; } + if(m & MODE_EXTENTED_RESULTS) { found++; res = 'e'; } + if(m & MODE_READ_GREEN) { found++; res = 'g'; } + if(m & MODE_HELP) { found++; res = 'h'; } + if(m & MODE_HTML_SUMMARY) { found++; res = 's'; } + if(m & MODE_THREADS_COUNT) { found++; res = 't'; } + if(m & MODE_VERSION) { found++; res = 'v'; } + if(m & MODE_VERBOSE) { found++; res = 'V'; } + ASSERT(found == 1); + return res; +} + +void +init_args + (struct logger* logger, + struct mem_allocator* allocator, + struct args* args) +{ + ASSERT(logger && allocator && args); + args->logger = logger; + args->allocator = allocator; + /* Set default values */ + args->mode = MODE_NULL; + args->command_filename = NULL; + args->green_filename = NULL; + args->info_filename = NULL; + args->nthreads = DEFAULT_NTHREADS; + args->verbose = GREEN_DEFAULT_VERBOSE_LEVEL; +} + +res_T +parse_args + (const int argc, + char** argv, + struct args* args) +{ + int opt = 0; + const char option_list[] = "a:ehg:s:t:vV:"; + res_T res = RES_OK; + + ASSERT(argv && args); + + opterr = 0; /* No default error messages */ + while ((opt = getopt(argc, argv, option_list)) != -1) { + switch (opt) { + + case '?': /* Unreconised option */ + { + char* ptr = strchr(option_list, optopt); + if(ptr && ptr[1] == ':') { + res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Missing argument for option -%c\n", + optopt); + } else { + logger_print(args->logger, LOG_ERROR, "Invalid option -%c\n", optopt); + } + goto error; + } + + case 'a': + args->command_filename = optarg; + args->mode |= MODE_APPLY_GREEN; + break; + + case 'e': + args->mode |= MODE_EXTENTED_RESULTS; + break; + + case 'h': + args->mode |= MODE_HELP; + break; + + case 'g': + if(args->green_filename) { + res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Option -%c cannot be used twice.\n", + opt); + goto error; + } + args->mode |= MODE_READ_GREEN; + args->green_filename = optarg; + break; + + case 's': + args->info_filename = optarg; + args->mode |= MODE_HTML_SUMMARY; + break; + + case 't': + res = cstr_to_uint(optarg, &args->nthreads); + if(res != RES_OK + || args->nthreads <= 0) + { + if(res == RES_OK) res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Invalid argument for option -%c: %s\n", + opt, optarg); + goto error; + } + args->mode |= MODE_THREADS_COUNT; + break; + + case 'v': + args->mode |= MODE_VERSION; + break; + + case 'V': + res = cstr_to_int(optarg, &args->verbose); + if(res != RES_OK + || args->verbose < 0 + || args->verbose > 3) + { + if(res == RES_OK) res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Invalid argument for option -%c: %s\n", + opt, optarg); + goto error; + } + args->mode |= MODE_VERBOSE; + break; + } + } + + if(args->mode == MODE_NULL) { + res = RES_BAD_ARG; + goto error; + } + + if(!(args->mode & MODE_READ_GREEN)) { + if((args->mode & MODE_HTML_SUMMARY)) { + res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Option -%c can only be used in conjunction with option -%c.\n", + mode_option(MODE_HTML_SUMMARY), mode_option(MODE_READ_GREEN)); + goto error; + } + if((args->mode & MODE_APPLY_GREEN)) { + res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Option -%c can only be used in conjunction with option -%c.\n", + mode_option(MODE_APPLY_GREEN), mode_option(MODE_READ_GREEN)); + goto error; + } + } + if((args->mode & MODE_EXTENTED_RESULTS + && !(args->mode & MODE_APPLY_GREEN))) { + res = RES_BAD_ARG; + logger_print(args->logger, LOG_ERROR, + "Option -%c can only be used in conjunction with option -%c.\n", + mode_option(MODE_EXTENTED_RESULTS), mode_option(MODE_APPLY_GREEN)); + goto error; + } + + end: + return res; + error: + logger_print(args->logger, LOG_ERROR, "Use option -h to print help.\n"); + goto end; + } diff --git a/src/green-args.h b/src/green-args.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_ARGS_H +#define GREEN_ARGS_H + +#include <rsys/rsys.h> + +struct logger; +struct mem_allocator; +struct args; + +#define DEFAULT_NTHREADS UINT_MAX + +struct args { + struct logger* logger; + struct mem_allocator* allocator; + char* green_filename; + char* command_filename; + char* info_filename; + unsigned nthreads; + int mode; + int verbose; +}; + +void +init_args + (struct logger* logger, + struct mem_allocator* allocator, + struct args* args); + +res_T +parse_args + (const int argc, + char** argv, + struct args* args); + +#endif /* GREEN_ARGS_H */ diff --git a/src/green-compute.c b/src/green-compute.c @@ -0,0 +1,349 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "green-types.h" + +#include <rsys/str.h> +#include <rsys/cstr.h> +#include <rsys/logger.h> +#include <rsys/text_reader.h> + +#include <math.h> + +void +check_green_table_variables_use + (struct green* green) +{ + size_t i; + unsigned j; + + ASSERT(green); + ASSERT(!green->references_checked); /* Fix double call in caller */ + + /* Clear previous data */ + FOR_EACH(i, 0, 1 + green->counts.desc_count) { + green->table[i].end_references_count = 0; + green->table[i].other_references_weight = 0; + } + FOR_EACH(i, 0, green->counts.ok_count) { + const struct sample* sample = green->samples + i; + unsigned id = sample->header.end_id; + enum description_type type = green->descriptions[id].type; + ASSERT(!DESC_IS_H(type)); + ASSERT(id <= green->counts.desc_count); /* Ambient ID is desc_count */ + green->table[id].end_references_count++; + + FOR_EACH(j, 0, sample->header.pw_count) { + const double w = sample->pw_weights[j]; + id = sample->pw_ids[j]; + ASSERT(id < green->counts.desc_count); + type = green->descriptions[id].type; + ASSERT(DESC_IS_MEDIUM(type)); + green->table[id].other_references_weight += w; + } + FOR_EACH(j, 0, sample->header.fx_count) { + const double w = sample->fx_weights[j]; + id = sample->fx_ids[j]; + ASSERT(id < green->counts.desc_count); + type = green->descriptions[id].type; + ASSERT(DESC_IS_F(type)); + green->table[id].other_references_weight += w; + } + } + green->references_checked = 1; +} + +#define INSERT(Name, Val, Used) { \ + struct variable_data vd___; \ + vd___.value = (Val); vd___.used = (Used) != 0;\ + if(!vd___.used) green->unused_variables = 1; \ + if(htable_variable_ptr_find(&green->variable_ptrs, &(Name))) \ + FATAL("Name already known"); \ + ERR(htable_variable_ptr_set(&green->variable_ptrs, &(Name), &vd___)); \ +} (void)0 + +#define MK_VAR(Str) \ + for(;;) { \ + int n = snprintf(buf, bufsz, (Str), str_cget(name));\ + if(n < bufsz) break; \ + buf = MEM_REALLOC(green->allocator, buf, n + 1); \ + bufsz = n + 1; \ + } (void)0 + +res_T +build_green_table + (struct green* green) +{ + res_T res = RES_OK; + size_t i, ambient_id; + struct description* desc = NULL; + const struct str* name = NULL; + char* buf = NULL; + size_t bufsz = 32; + + ASSERT(green); + + green->table = MEM_CALLOC(green->allocator, 1 + green->counts.desc_count, + sizeof(*green->table)); + buf = MEM_ALLOC(green->allocator, bufsz); + if(!green->table || ! buf) { + res = RES_MEM_ERR; + goto error; + } + FOR_EACH(i, 0, 1 + green->counts.desc_count) + init_table_elt(green->allocator, green->table + i); + + check_green_table_variables_use(green); + FOR_EACH(i, 0, green->counts.desc_count) { + desc = green->descriptions + i; + name = get_description_name(desc); + if(DESC_IS_T(desc->type)) { + MK_VAR("%s.T"); + str_set(&green->table[i].end_name, buf); + green->table[i].end_value = desc->d.t_boundary.imposed_temperature; + green->table[i].end_defined = 1; + INSERT(green->table[i].end_name, green->table[i].end_value, + green->table[i].end_references_count); + } + else if(DESC_IS_H(desc->type)) { + MK_VAR("%s.T"); + str_set(&green->table[i].end_name, buf); + green->table[i].end_value = desc->d.h_boundary.imposed_temperature; + green->table[i].end_defined = 1; + INSERT(green->table[i].end_name, green->table[i].end_value, + green->table[i].end_references_count); + } + else if(DESC_IS_F(desc->type)) { + MK_VAR("%s.F"); + str_set(&green->table[i].other_name, buf); + green->table[i].other_value = desc->d.f_boundary.imposed_flux; + green->table[i].other_defined = 1; + INSERT(green->table[i].other_name, green->table[i].other_value, + green->table[i].other_references_weight); + } + else if(DESC_IS_MEDIUM(desc->type)) { + MK_VAR("%s.T"); + str_set(&green->table[i].end_name, buf); + green->table[i].end_defined = 1; + INSERT(green->table[i].end_name, green->table[i].end_value, + green->table[i].end_references_count); + if(desc->type == DESC_MAT_SOLID) { + green->table[i].end_value = desc->d.solid.imposed_temperature; + MK_VAR("%s.VP"); + str_set(&green->table[i].other_name, buf); + green->table[i].other_value = desc->d.solid.vpower; + green->table[i].other_defined = 1; + INSERT(green->table[i].other_name, green->table[i].other_value, + green->table[i].other_references_weight); + } else { /* No VP for fluids yet */ + green->table[i].end_value = desc->d.fluid.imposed_temperature; + } + } + else if(desc->type == DESC_SOLID_FLUID_CONNECT) { + /* No variables here */ + } + else FATAL("Invalid desc type."); + } + /* Ambient ID is desc_count */ + ambient_id = green->counts.desc_count; + desc = green->descriptions + ambient_id; + str_set(&green->table[ambient_id].end_name, "AMBIENT"); + green->table[ambient_id].end_value = green->ambient_temp; + green->table[ambient_id].end_defined = 1; + INSERT(green->table[ambient_id].end_name, green->table[ambient_id].end_value, + green->table[ambient_id].end_references_count); + +end: + MEM_RM(green->allocator, buf); + return res; +error: + goto end; +} + +#undef INSERT + +static void +green_compute_1 + (const struct green* green, + double* E, + double* STD) +{ + size_t i; + unsigned j; + double V, Ti, T = 0, T2 = 0; + + ASSERT(green && E && STD); + + FOR_EACH(i, 0, green->counts.ok_count) { + const struct sample* sample = green->samples + i; + unsigned id = sample->header.end_id; + enum description_type type = green->descriptions[id].type; + ASSERT(DESC_IS_T(type) || DESC_IS_H(type)); + ASSERT(id <= green->counts.desc_count); /* Ambient ID is desc_count */ + ASSERT(green->table[id].end_defined); + Ti = green->table[id].end_value; + + FOR_EACH(j, 0, sample->header.pw_count) { + const double w = sample->pw_weights[j]; + id = sample->pw_ids[j]; + ASSERT(id < green->counts.desc_count); + type = green->descriptions[id].type; + ASSERT(DESC_IS_MEDIUM(type)); + ASSERT(green->table[id].other_defined); + Ti += w * green->table[id].other_value; + } + FOR_EACH(j, 0, sample->header.fx_count) { + const double w = sample->fx_weights[j]; + id = sample->fx_ids[j]; + ASSERT(id < green->counts.desc_count); + type = green->descriptions[id].type; + ASSERT(DESC_IS_F(type)); + ASSERT(green->table[id].other_defined); + Ti += w * green->table[id].other_value; + } + T += Ti; + T2 += Ti * Ti; + } + *E = T / (double)green->counts.ok_count; + V = T2 / (double)green->counts.ok_count - *E * *E; + *STD = (V > 0) ? sqrt(V / (double)green->counts.ok_count) : 0; +} + +static res_T +parse_line + (const char* file_name, + char* line, + struct green* green) +{ + res_T res = RES_OK; + struct str keep; + int name_count = 0; + struct str name; + char* tk = NULL, * tok_ctx = NULL; + + ASSERT(file_name && line && green); + + str_init(green->allocator, &keep); + str_init(green->allocator, &name); + + ERR(str_set(&keep, line)); + + /* At least one name=value, no name without value */ + for(;;) { + struct variable_data* vd; + tk = strtok_r(name_count ? NULL : line, "=", &tok_ctx); + if(tk) { + char* c; + c = tk + strlen(tk) - 1; + while(c >= tk && isspace(*tk)) tk++; + while(c >= tk && isspace(*c)) { + *c = '\0'; + c--; + } + if(c < tk) tk = NULL; + } + if(!tk) { + if(name_count == 0) { + /* At least 1 name */ + logger_print(green->logger, LOG_ERROR, + "Invalid data (missing name)\n"); + res = RES_BAD_ARG; + goto error; + } + else break; + } + str_set(&name, tk); + CHK_TOK(strtok_r(NULL, " \t", &tok_ctx), "value"); + vd = htable_variable_ptr_find(&green->variable_ptrs, &name); + if(!vd || !vd->used) { + /* Name should exist */ + if(!vd) { + logger_print(green->logger, LOG_ERROR, + "Invalid data (unknown name: '%s')", + str_cget(&name)); + res = RES_BAD_ARG; + goto error; + } + logger_print(green->logger, LOG_WARNING, + "Attempt to change unused variable '%s'\n", str_cget(&name)); + logger_print(green->logger, LOG_WARNING, "In file '%s':\n", file_name); + logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(&keep)); + } + ERR(cstr_to_double(tk, &vd->value)); + name_count++; + } + +end: + str_release(&keep); + str_release(&name); + return res; +error: + logger_print(green->logger, LOG_ERROR, + "Invalid line in file '%s':\n", file_name); + logger_print(green->logger, LOG_ERROR, "%s\n", str_cget(&keep)); + goto end; +} + +res_T +green_compute + (struct green* green, + const char* in_name, + const int mode, + FILE* out_stream) +{ + res_T res = RES_OK; + struct txtrdr* txtrdr = NULL; + FILE* stream = NULL; + struct str keep; + double E, STD; + + ASSERT(green && in_name); + + str_init(green->allocator, &keep); + stream = fopen(in_name, "r"); + if(!stream) { + logger_print(green->logger, LOG_ERROR, + "Cannot open model file '%s'\n", + in_name); + res = RES_IO_ERR; + goto error; + } + txtrdr_stream(green->allocator, stream, in_name, '#', &txtrdr); + for(;;) { + char* line; + ERR(txtrdr_read_line(txtrdr)); + line = txtrdr_get_line(txtrdr); + if(!line) break; + if(mode & MODE_EXTENTED_RESULTS) str_set(&keep, line); + /* Apply settings */ + ERR(parse_line(in_name, line, green)); + /* Compute */ + green_compute_1(green, &E, &STD); + /* Print results */ + if(mode & MODE_EXTENTED_RESULTS) + fprintf(out_stream, "%g +/- %g ; %s\n", E, STD, str_cget(&keep)); + else fprintf(out_stream, "%g %g\n", E, STD); + } + txtrdr_ref_put(txtrdr); + txtrdr = NULL; + +exit: + str_release(&keep); + if(stream) fclose(stream); + if(txtrdr) txtrdr_ref_put(txtrdr); + return res; +error: + goto exit; +} diff --git a/src/green-compute.h b/src/green-compute.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_COMPUTE_H +#define GREEN_COMPUTE_H + +#include <rsys/rsys.h> + +#include <stdio.h> + +struct green; + +void +check_green_table_variables_use + (struct green* green); + +res_T +build_green_table + (struct green* green); + +res_T +green_compute + (struct green* green, + const char* in_name, + const int mode, + FILE* out_stream); + +#endif /* GREEN_COMPUTE_H */ +\ No newline at end of file diff --git a/src/green-default.h.in b/src/green-default.h.in @@ -0,0 +1,22 @@ +/* Copyright (C) 2018-2020 |Meso|Star> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_DEFAULT_H +#define GREEN_DEFAULT_H + +#define GREEN_DEFAULT_VERBOSE_LEVEL @GREEN_ARGS_DEFAULT_VERBOSE_LEVEL@ + +#endif /* GREEN_DEFAULT_H */ + diff --git a/src/green-description.h b/src/green-description.h @@ -0,0 +1,129 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_DESCRIPTION_H +#define GREEN_DESCRIPTION_H + +#include <rsys/str.h> + +/* Different types of descriptions */ +enum description_type { + DESC_MAT_SOLID, + DESC_MAT_FLUID, + DESC_BOUND_H_FOR_FLUID, + DESC_BOUND_H_FOR_SOLID, + DESC_BOUND_T_FOR_FLUID, + DESC_BOUND_T_FOR_SOLID, + DESC_BOUND_F_FOR_SOLID, + DESC_SOLID_FLUID_CONNECT, + DESCRIPTION_TYPE_COUNT__, + DESC_OUTSIDE +}; + +#define DESC_IS_H(D) \ + ((D) == DESC_BOUND_H_FOR_SOLID || (D) == DESC_BOUND_H_FOR_FLUID) +#define DESC_IS_T(D) \ + ((D) == DESC_BOUND_T_FOR_SOLID || (D) == DESC_BOUND_T_FOR_FLUID) + +struct mat_fluid { + struct str name; + unsigned fluid_id; + double rho; + double cp; + double tinit; + double imposed_temperature; +}; + +struct mat_solid { + struct str name; + unsigned solid_id; + double lambda; + double rho; + double cp; + double delta; + double tinit; + double imposed_temperature; + double vpower; +}; + +struct h_boundary { + struct str name; + unsigned mat_id; + double emissivity; + double specular_fraction; + double hc; + double imposed_temperature; +}; + +struct t_boundary { + struct str name; + unsigned mat_id; + double emissivity; + double specular_fraction; + double hc; + double imposed_temperature; +}; + +struct f_boundary { + struct str name; + unsigned mat_id; + double imposed_flux; +}; + +struct solid_fluid_connect { + struct str name; + double emissivity; + double specular_fraction; + double hc; +}; + +struct description { + enum description_type type; + union { + struct mat_fluid fluid; + struct mat_solid solid; + struct t_boundary t_boundary; + struct f_boundary f_boundary; + struct h_boundary h_boundary; + struct solid_fluid_connect sf_connect; + } d; +}; + +static INLINE const struct str* +get_description_name + (const struct description* desc) +{ + ASSERT(desc); + switch (desc->type) { + case DESC_MAT_SOLID: + return &desc->d.solid.name; + case DESC_MAT_FLUID: + return &desc->d.fluid.name; + case DESC_BOUND_T_FOR_SOLID: + case DESC_BOUND_T_FOR_FLUID: + return &desc->d.t_boundary.name; + case DESC_BOUND_H_FOR_SOLID: + case DESC_BOUND_H_FOR_FLUID: + return &desc->d.h_boundary.name; + case DESC_BOUND_F_FOR_SOLID: + return &desc->d.f_boundary.name; + case DESC_SOLID_FLUID_CONNECT: + return &desc->d.sf_connect.name; + default: + FATAL("error:" STR(__FILE__) ":" STR(__LINE__)": Invalid type.\n"); + } +} + +#endif /* GREEN_DESCRIPTION_H */ diff --git a/src/green-input.c b/src/green-input.c @@ -0,0 +1,127 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "green-compute.h" +#include "green-types.h" + +#include <rsys/rsys.h> +#include <rsys/str.h> +#include <rsys/logger.h> +#include <rsys/mem_allocator.h> + +#include <stdlib.h> + +#define FR(Ptr, Count) \ + if((Count) != fread((Ptr), sizeof(*(Ptr)), (Count), stream)) { \ + res = RES_IO_ERR; \ + goto error; \ + } + +static res_T +read_sample + (struct sample* sample, + struct mem_allocator* alloc, + FILE* stream) +{ + res_T res = RES_OK; + ASSERT(sample && stream); + + /* Read counts */ + FR(&sample->header, 1); + /* Alloc buffers */ + ERR(alloc_sample_buffers(alloc, sample)); + /* Read Ids and weights */ + read_sample_buffers(sample); + +end: + return res; +error: + release_sample(alloc, sample); + goto end; +} + +res_T +read_green + (struct green* green, + FILE* stream) +{ + res_T res = RES_OK; + unsigned i; + char* pool_ptr; + char expected[] = "BINGREEN"; + char tmp[sizeof(expected)]; + + ASSERT(green && stream); + /* Check Green string */ + FR(tmp, sizeof(tmp)); + if(strncmp(expected, tmp, sizeof(expected))) { + logger_print(green->logger, LOG_ERROR, + "File is not a binary Green file.\n"); + res = RES_BAD_ARG; + goto error; + } + + /* Read counts */ + FR(&green->counts, 1); + + /* Read descriptions*/ + green->descriptions = MEM_CALLOC(green->allocator, green->counts.desc_count, + sizeof(*green->descriptions)); + if(!green->descriptions) { + res = RES_MEM_ERR; + goto error; + } + FR(green->descriptions, green->counts.desc_count); + + /* Read names */ + green->names_pool = pool_ptr = MEM_CALLOC(green->allocator, + green->counts.name_pool_sz, sizeof(*green->names_pool)); + if(!green->names_pool) { + res = RES_MEM_ERR; + goto error; + } + FR(green->names_pool, green->counts.name_pool_sz); + FOR_EACH(i, 0, green->counts.desc_count) { + struct description* desc = green->descriptions + i; + struct str* name = get_description_name(desc); + const size_t len = strlen(pool_ptr); + name->cstr = pool_ptr; + pool_ptr += len + 1; + } + ASSERT(pool_ptr == green->names_pool + green->counts.name_pool_sz); + + /* Read radiative temperatures */ + FR(&green->ambient_temp, 1); + FR(&green->ref_temp, 1); + + /* Read samples*/ + green->samples = MEM_CALLOC(green->allocator, green->counts.ok_count, + sizeof(*green->samples)); + if(!green->samples) { + res = RES_MEM_ERR; + goto error; + } + FOR_EACH(i, 0, green->counts.ok_count) { + ERR(read_sample(green->samples + i, green->allocator, stream)); + } + + /* Build table */ + ERR(build_green_table(green)); + +end: + return res; +error: + goto end; +} diff --git a/src/green-main.c b/src/green-main.c @@ -0,0 +1,110 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "green-types.h" +#include "green-args.h" +#include "green-output.h" +#include "green-compute.h" + +#include <rsys/rsys.h> +#include <rsys/mem_allocator.h> +#include <rsys/logger.h> + +#include <stdlib.h> + +int +main + (int argc, + char** argv) +{ + int err = EXIT_SUCCESS; + res_T res = RES_OK; + int logger_initialized = 0, allocator_initialized = 0, + green_initialized = 0; + struct mem_allocator allocator; + struct logger logger; + struct green green; + struct args args; + FILE* stream = NULL; + + ERR(mem_init_proxy_allocator(&allocator, &mem_default_allocator)); + allocator_initialized = 1; + + ERR(logger_init(&allocator, &logger)); + logger_initialized = 1; + /* Active loggin for args pasing */ + logger_set_stream(&logger, LOG_OUTPUT, log_prt, NULL); + logger_set_stream(&logger, LOG_ERROR, log_err, NULL); + logger_set_stream(&logger, LOG_WARNING, log_warn, NULL); + + init_args(&logger, &allocator, &args); + ERR(parse_args(argc, argv, &args)); + + if(args.mode & MODE_HELP) { + short_help(argv[0], stdout); + goto exit; + } + + if(args.mode & MODE_VERSION) { + print_version(stdout); + goto exit; + } + /* Deactivate some loggin according to the -V arg */ + if(args.verbose < 1) + logger_set_stream(&logger, LOG_ERROR, NULL, NULL); + if(args.verbose < 2) + logger_set_stream(&logger, LOG_WARNING, NULL, NULL); + if(args.verbose < 3) + logger_set_stream(&logger, LOG_OUTPUT, NULL, NULL); + + if(args.green_filename) { + stream = fopen(args.green_filename, "rb"); + if(!stream) { + logger_print(&logger, LOG_ERROR, + "Cannot open model file '%s'\n", args.green_filename); + res = RES_IO_ERR; + goto error; + } + green_init(&allocator, &logger, &green); + green_initialized = 1; + ERR(read_green(&green, stream)); + fclose(stream); stream = NULL; + } + + if(args.mode & MODE_HTML_SUMMARY) { + ASSERT(args.info_filename); + stream = fopen(args.info_filename, "w"); + if(!stream) { + logger_print(&logger, LOG_ERROR, + "Cannot open model file '%s'\n", args.info_filename); + res = RES_IO_ERR; + goto error; + } + dump_green_info(&green, stream); + fclose(stream); stream = NULL; + } + + if(args.mode & MODE_APPLY_GREEN) { + ERR(green_compute(&green, args.command_filename, args.mode, stdout)); + } + +exit: + if(green_initialized) green_release(&green); + if(stream) fclose(stream); + return err; +error: + err = EXIT_FAILURE; + goto exit; +} +\ No newline at end of file diff --git a/src/green-output.c b/src/green-output.c @@ -0,0 +1,481 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <rsys/rsys.h> +#include <rsys/str.h> +#include <rsys/mem_allocator.h> + +#include "green-types.h" +#include "green-version.h" + +#define CELL(T,Val) \ + fprintf(stream, " <td>%" #T "</td>\n", (Val)) + +#define MCELL(T,Used,Name,Val) { \ + if(Used) \ + fprintf(stream, " <td><u><b>%s = %" #T "</b></u></td>\n", (Name), (Val)); \ + else fprintf(stream, " <td>%s = %" #T "</td>\n", (Name), (Val)); \ +} (void)0 + +#define MCELLif(T,Used,Name,Val) \ + if((Val) != 0) { MCELL(T,(Used),(Name),(Val)); } \ + else { CELL(T,(Val)); } (void)0 + +void +print_version + (FILE* stream) +{ + ASSERT(stream); + fprintf(stream, + "Green version %i.%i.%i\n", + GREEN_VERSION_MAJOR, GREEN_VERSION_MINOR, GREEN_VERSION_PATCH); +} + +void +short_help + (const char* prog, + FILE * stream) +{ + const char* name; + ASSERT(stream && prog); + +#ifdef COMPILER_GCC + name = strrchr(prog, '/'); +#else + name = strrchr(prog, '\\'); +#endif + + name = name ? name + 1 : prog; + fprintf(stream, + "Usage: %s [OPTIONS]\n" + "\nUse a Green function created by stardis-app(1).\n" + "Refer to green(1) man page for more information.\n\n", + name); + + fprintf(stream, "\n -a <FILE>\n"); + fprintf(stream, " Apply a Green function using the variable settings read from file.\n"); + + fprintf(stream, "\n -e\n"); + fprintf(stream, " Use extended format to output Monte-Carlo results.\n"); + + fprintf(stream, "\n -g <FILE>\n"); + fprintf(stream, " Read a Green function from file.\n"); + + fprintf(stream, "\n -h\n"); + fprintf(stream, " Print this help and exit.\n"); + + fprintf(stream, "\n -s <FILE>\n"); + fprintf(stream, " Create a summary of a Green function and write it to file.\n"); + + fprintf(stream, "\n -t NUM_OF_THREADS\n"); + fprintf(stream, " Hint on the number of threads.\n"); + + fprintf(stream, "\n -v\n"); + fprintf(stream, " Print version information and exit.\n"); + + fprintf(stream, "\n -V LEVEL\n"); + fprintf(stream, " Set the verbosity level.\n"); +} + +void +dump_green_info + (struct green* green, + FILE* stream) +{ + size_t i, local_count; + double t = 0; + int fst = 1; + + ASSERT(green && stream); + ASSERT(green->references_checked); + + /* Output html headers */ + fprintf(stream, "<!DOCTYPE html>\n"); + fprintf(stream, "<html>\n"); + fprintf(stream, "<head>\n"); + fprintf(stream, "<title>Green function description</title>\n"); + + fprintf(stream, "<style>\n"); + fprintf(stream, " table, th, td{\n"); + fprintf(stream, " border: 1px solid black;\n"); + fprintf(stream, " border-collapse: collapse;\n"); + fprintf(stream, " }\n"); + fprintf(stream, " th, td{\n"); + fprintf(stream, " padding: 5px \n"); + fprintf(stream, " }\n"); + fprintf(stream, " td{\n"); + fprintf(stream, " text-align: right;\n"); + fprintf(stream, " }\n"); + fprintf(stream, "</style>\n"); + + fprintf(stream, "</head>\n"); + fprintf(stream, "<body>\n"); + + fprintf(stream, "<h1>Green function description</h1>\n"); + + fprintf(stream, "<h2>List of variables</h2>\n"); + + fprintf(stream, "<h3>Variable used in the Green function</h3>\n"); + + fprintf(stream, "<p>These variable names are used in the following formula. " + "Using the syntax NAME=value in a settings file, their values are " + "modifiable when applying the Green Function. They are listed <u><b>NAME " + "= value</b></u> in the tables below.</p>"); + + fst = 1; + FOR_EACH(i, 0, green->counts.desc_count + 1) { + struct table_elt* elt = green->table + i; + if(elt->end_defined && elt->end_references_count) { + if(!fst) fprintf(stream, ", "); fst = 0; + fprintf(stream, "%s", str_cget(&elt->end_name)); + } + if(elt->other_defined && elt->other_references_weight) { + if(!fst) fprintf(stream, ", "); fst = 0; + fprintf(stream, "%s", str_cget(&elt->other_name)); + } + } + + if(green->unused_variables) { + fprintf(stream, + "<h3>Variable not used in the Green function</h3>\n"); + + fprintf(stream, "<p>These variable names are not used in the following " + "formula. Changing their values in a settings file has no effect on " + "the applied Green function results. They are listed NAME = value " + "in the tables below.</p>\n"); + + fst = 1; + FOR_EACH(i, 0, green->counts.desc_count + 1) { + struct table_elt* elt = green->table + i; + if(elt->end_defined && !elt->end_references_count) { + if(!fst) fprintf(stream, ", "); fst = 0; + fprintf(stream, "%s", str_cget(&elt->end_name)); + } + if(elt->other_defined && !elt->other_references_weight) { + if(!fst) fprintf(stream, ", "); fst = 0; + fprintf(stream, "%s", str_cget(&elt->other_name)); + } + } + } + + fprintf(stream, "<h2>Formula of the Monte-Carlo estimate</h2>\n"); + + fprintf(stream, "<p>The Monte-Carlo estimate of the Green function of the " + "system is as follows:</p>\n"); + + /* Print result */ + fst = 1; + FOR_EACH(i, 0, 1 + green->counts.desc_count) { + if(green->table[i].end_references_count) { + double k; + ASSERT(green->table[i].end_defined); + if(fst) fprintf(stream, "<p>E[T] = "); + else fprintf(stream, " + "); + fst = 0; + k = (double)green->table[i].end_references_count + / (double)green->counts.ok_count; + t += k * green->table[i].end_value; + fprintf(stream, "%g * <b>%s</b>", k, str_cget(&green->table[i].end_name)); + } + } + ASSERT(!fst); + FOR_EACH(i, 0, green->counts.desc_count) { + if(green->table[i].other_references_weight) { + double k; + ASSERT(green->table[i].other_defined); + k = (double)green->table[i].other_references_weight + / (double)green->counts.ok_count; + t += k * green->table[i].other_value; + fprintf(stream, " + %g * <b>%s</b>", k, str_cget(&green->table[i].other_name)); + } + } + if(green->table[green->counts.desc_count].end_references_count) { + double ww = 0, k; + /* Some paths end here */ + if(fst) fprintf(stream, "<p>E(T) = "); + else fprintf(stream, " + "); + fst = 0; + ww = green->ambient_temp; + k = (double)green->table[green->counts.desc_count].end_references_count + / (double)green->counts.ok_count; + t += ww * k; + fprintf(stream, "%g * <b>Ambient</b>", k); + } + fprintf(stream, " = %g</p>", t); + + /* Counts table */ + fprintf(stream, "<h2>Counts</h2>\n"); + fprintf(stream, "<table>\n"); + /* fprintf(stream, "<table style=\"width:100%%\">\n"); */ + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Solids</th>\n"); + fprintf(stream, " <th>Fluids</th>\n"); + fprintf(stream, " <th>T Boundaries</th>\n"); + fprintf(stream, " <th>H Boundaries</th>\n"); + fprintf(stream, " <th>F Boundaries</th>\n"); + fprintf(stream, " <th>OK Samples</th>\n"); + fprintf(stream, " <th>Failures</th>\n"); + fprintf(stream, "</tr>\n"); + fprintf(stream, "<tr>\n"); + CELL(u, green->counts.smed_count); + CELL(u, green->counts.fmed_count); + CELL(u, green->counts.tbound_count); + CELL(u, green->counts.hbound_count); + CELL(u, green->counts.fbound_count); + CELL(zu, green->counts.ok_count); + CELL(zu, green->counts.failed_count); + fprintf(stream, "</tr>\n"); + fprintf(stream, "</table>\n"); + + /* Solids table */ + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct mat_solid* sl; + if(desc->type != DESC_MAT_SOLID) continue; + if(!local_count) { + fprintf(stream, "<h2>Solids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Lambda</th>\n"); + fprintf(stream, " <th>Rho</th>\n"); + fprintf(stream, " <th>Cp</th>\n"); + fprintf(stream, " <th>Volumic Power</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + } + sl = &desc->d.solid; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&sl->name)); + CELL(g, sl->lambda); + CELL(g, sl->rho); + CELL(g, sl->cp); + ASSERT(green->table[i].other_defined); + MCELLif(g, green->table[i].other_references_weight, + str_cget(&green->table[i].other_name), sl->vpower); + if(sl->imposed_temperature >= 0) { + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), sl->imposed_temperature); + } + else CELL(s, "Unknown"); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + /* Fluids table */ + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct mat_fluid* fl; + if(desc->type != DESC_MAT_FLUID) continue; + if(!local_count) { + fprintf(stream, "<h2>Fluids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Rho</th>\n"); + fprintf(stream, " <th>Cp</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + } + fl = &desc->d.fluid; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&fl->name)); + CELL(g, fl->rho); + CELL(g, fl->cp); + if(fl->imposed_temperature >= 0) { + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), fl->imposed_temperature); + } + else CELL(s, "Unknown"); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + /* T boundaries tables */ + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct t_boundary* bd; + if(desc->type != DESC_BOUND_T_FOR_SOLID) continue; + if(!local_count) { + fprintf(stream, "<h2>T boundaries for solids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + } + bd = &desc->d.t_boundary; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&bd->name)); + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), bd->imposed_temperature); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct t_boundary* bd; + if(desc->type != DESC_BOUND_T_FOR_FLUID) continue; + if(!local_count) { + fprintf(stream, "<h2>T boundaries for fluids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, " <th>Emissivity</th>\n"); + fprintf(stream, " <th>Specular Fraction</th>\n"); + fprintf(stream, " <th>Hc</th>\n"); + fprintf(stream, "</tr>\n"); + } + bd = &desc->d.t_boundary; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&bd->name)); + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), bd->imposed_temperature); + CELL(g, bd->emissivity); + CELL(g, bd->specular_fraction); + CELL(g, bd->hc); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + /* H boundaries tables */ + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct h_boundary* bd; + if(desc->type != DESC_BOUND_H_FOR_SOLID) continue; + if(!local_count) { + fprintf(stream, "<h2>H boundaries for solids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Emissivity</th>\n"); + fprintf(stream, " <th>Specular Fraction</th>\n"); + fprintf(stream, " <th>Hc</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + } + bd = &desc->d.h_boundary; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&bd->name)); + CELL(g, bd->emissivity); + CELL(g, bd->specular_fraction); + CELL(g, bd->hc); + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), bd->imposed_temperature); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct h_boundary* bd; + if(desc->type != DESC_BOUND_H_FOR_FLUID) continue; + if(!local_count) { + fprintf(stream, "<h2>H boundaries for fluids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Emissivity</th>\n"); + fprintf(stream, " <th>Specular Fraction</th>\n"); + fprintf(stream, " <th>Hc</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + } + bd = &desc->d.h_boundary; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&bd->name)); + CELL(g, bd->emissivity); + CELL(g, bd->specular_fraction); + CELL(g, bd->hc); + ASSERT(green->table[i].end_defined); + ASSERT(green->table[i].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[i].end_name), bd->imposed_temperature); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + /* F boundaries table */ + local_count = 0; + FOR_EACH(i, 0, green->counts.desc_count) { + const struct description* desc = green->descriptions + i; + const struct f_boundary* bd; + if(desc->type != DESC_BOUND_F_FOR_SOLID) continue; + if(!local_count) { + fprintf(stream, "<h2>F boundaries for solids</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Flux</th>\n"); + fprintf(stream, "</tr>\n"); + } + bd = &desc->d.f_boundary; + fprintf(stream, "<tr>\n"); + CELL(s, str_cget(&bd->name)); + ASSERT(green->table[i].other_defined); + MCELL(g, green->table[i].other_references_weight, + str_cget(&green->table[i].other_name), bd->imposed_flux); + fprintf(stream, "</tr>\n"); + local_count++; + } + if(local_count) fprintf(stream, "</table>\n"); + + /* Radiative temperatures table */ + fprintf(stream, "<h2>Radiative temperatures</h2>\n"); + fprintf(stream, "<table>\n"); + fprintf(stream, "<tr>\n"); + fprintf(stream, " <th>Name</th>\n"); + fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, "</tr>\n"); + fprintf(stream, "<tr>\n"); + CELL(s, "Ambient"); + ASSERT(green->table[green->counts.desc_count].end_defined); + MCELL(g, green->table[i].end_references_count, + str_cget(&green->table[green->counts.desc_count].end_name), + green->ambient_temp); + fprintf(stream, "</tr>\n"); + fprintf(stream, "<tr>\n"); + CELL(s, "Linearization"); + CELL(g, green->ref_temp); + fprintf(stream, "</tr>\n"); + fprintf(stream, "</table>\n"); + + /* Output html footers */ + fprintf(stream, "</body>\n"); + fprintf(stream, "</html>\n"); +} + +#undef CELL +#undef MCELL +#undef MCELLif +\ No newline at end of file diff --git a/src/green-output.h b/src/green-output.h @@ -0,0 +1,37 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_OUTPUT_H +#define GREEN_OUTPUT_H + +#include <rsys/rsys.h> + +#include <stdio.h> + +void +print_version + (FILE* stream); + +void +short_help + (const char* prog, + FILE* stream); + +void +dump_green_info + (struct green* green, + FILE* stream); + +#endif /* GREEN_OUTPUT_H */ diff --git a/src/green-types.h b/src/green-types.h @@ -0,0 +1,408 @@ +/* Copyright (C) 2018-2020 |Meso|Star> (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_TYPES_H +#define GREEN_TYPES_H + +#include <rsys/str.h> +#include <rsys/mem_allocator.h> +#include <rsys/hash_table.h> + +#include <string.h> + +/* Utility macros */ +#define ERR(Expr) if((res = (Expr)) != RES_OK) goto error; else (void)0 + +#define CHK_TOK(x, Name) if((tk = (x)) == NULL) {\ + logger_print(green->logger, LOG_ERROR,\ + "Invalid data (missing " Name ")\n");\ + res = RES_BAD_ARG;\ + goto error;\ + } (void)0 + +#ifdef COMPILER_CL +#define strtok_r strtok_s +#endif + +static INLINE void +log_err(const char* msg, void* ctx) +{ + ASSERT(msg); + (void)ctx; +#ifdef OS_WINDOWS + fprintf(stderr, "error: %s", msg); +#else + fprintf(stderr, "\x1b[31merror:\x1b[0m %s", msg); +#endif +} + +static INLINE void +log_warn(const char* msg, void* ctx) +{ + ASSERT(msg); + (void)ctx; +#ifdef OS_WINDOWS + fprintf(stderr, "warning: %s", msg); +#else + fprintf(stderr, "\x1b[33mwarning:\x1b[0m %s", msg); +#endif +} + +static INLINE void +log_prt(const char* msg, void* ctx) +{ + ASSERT(msg); + (void)ctx; +#ifdef OS_WINDOWS + fprintf(stderr, "message: %s", msg); +#else + fprintf(stderr, "\x1b[32moutput:\x1b[0m %s", msg); +#endif +} + +/* + * Counts read from the binary file + */ +struct green_counts { + unsigned desc_count, smed_count, fmed_count, tbound_count, hbound_count, + fbound_count, sfconnect_count, name_pool_sz; + size_t ok_count, failed_count; +}; + +static INLINE void +init_green_counts + (struct green_counts* counts) +{ + ASSERT(counts); + counts->desc_count = 0; + counts->smed_count = 0; + counts->fmed_count = 0; + counts->tbound_count = 0; + counts->hbound_count = 0; + counts->fbound_count = 0; + counts->sfconnect_count = 0; + counts->name_pool_sz = 0; + counts->ok_count = 0; + counts->failed_count = 0; +} + +/* + * A type for green mode + */ +enum green_mode { + MODE_NULL = 0, + MODE_APPLY_GREEN = BIT(1), /* -a */ + MODE_EXTENTED_RESULTS = BIT(2), /* -e */ + MODE_READ_GREEN = BIT(3), /* -g */ + MODE_HELP = BIT(4), /* -h */ + MODE_HTML_SUMMARY = BIT(5), /* -s */ + MODE_THREADS_COUNT = BIT(6), /* -v */ + MODE_VERSION = BIT(7), /* -v */ + MODE_VERBOSE = BIT(8) /* -v */ +}; + +/* + * The type to store a green sample + */ +struct sample_header { + unsigned end_id; + unsigned pw_count; + unsigned fx_count; +}; + +struct sample { + struct sample_header header; + unsigned* pw_ids; + double* pw_weights; + unsigned* fx_ids; + double* fx_weights; +}; + +static res_T +alloc_sample_buffers + (struct mem_allocator* alloc, + struct sample* sample) +{ + unsigned* ids = NULL; + double* weights = NULL; + size_t count; + + ASSERT(alloc && sample); + count = + sample->header.pw_count + sample->header.fx_count; + ids = MEM_ALLOC(alloc, count * sizeof(*ids)); + weights = MEM_ALLOC(alloc, count * sizeof(*sample->pw_weights)); + + if(!ids || !weights) { + MEM_RM(alloc, ids); + MEM_RM(alloc, weights); + return RES_MEM_ERR; + } + sample->pw_ids = ids; + sample->pw_weights = weights; + sample->fx_ids = ids + sample->header.pw_count; + sample->fx_weights = weights + sample->header.pw_count; + + return RES_OK; +} + +#define read_sample_buffers(Sample) { \ + size_t count = (Sample)->header.pw_count + (Sample)->header.fx_count; \ + FR((Sample)->pw_ids, count); \ + FR((Sample)->pw_weights, count); \ +} (void)0 + +static INLINE void +release_sample + (struct mem_allocator* alloc, + struct sample* sample) +{ + ASSERT(alloc && sample); + MEM_RM(alloc, sample->pw_ids); + MEM_RM(alloc, sample->pw_weights); + /* Don't RM fx_ids nor fx_weights as they share pw buffers */ +} + +/* + * Table used to compute green + */ + +struct table_elt { + struct str end_name; + struct str other_name; + double end_value; + double other_value; + int end_defined, other_defined; + int end_references_count; + double other_references_weight; +}; + +static INLINE void +init_table_elt + (struct mem_allocator* alloc, + struct table_elt* elt) +{ + ASSERT(alloc && elt); + str_init(alloc, &elt->end_name); + str_init(alloc, &elt->other_name); + elt->end_value = 0; + elt->other_value = 0; + elt->end_defined = 0; + elt->other_defined = 0; + elt->end_references_count = 0; + elt->other_references_weight = 0; +} + +static INLINE void +release_table_elt + (struct table_elt* elt) +{ + ASSERT(elt); + str_release(&elt->end_name); + str_release(&elt->other_name); +} + +struct variable_data { + double value; + int used; +}; + +#define HTABLE_NAME variable_ptr +#define HTABLE_DATA struct variable_data +#define HTABLE_KEY struct str +#define HTABLE_KEY_FUNCTOR_HASH str_hash +#define HTABLE_KEY_FUNCTOR_EQ str_eq +#define HTABLE_KEY_FUNCTOR_INIT str_init +#define HTABLE_KEY_FUNCTOR_COPY str_copy +#define HTABLE_KEY_FUNCTOR_RELEASE str_release +#define HTABLE_KEY_FUNCTOR_COPY_AND_RELEASE str_copy_and_release +#include <rsys/hash_table.h> + +/* + * Main type to store binary file content + */ +struct green { + struct mem_allocator* allocator; + struct logger* logger; + struct green_counts counts; + char* names_pool; + struct description* descriptions; + double ambient_temp, ref_temp; + struct table_elt* table; + struct sample* samples; + int references_checked, unused_variables; + struct htable_variable_ptr variable_ptrs; +}; + +static INLINE void +green_init + (struct mem_allocator* alloc, + struct logger* logger, + struct green* green) +{ + ASSERT(alloc && green); + green->allocator = alloc; + green->logger = logger; + green->names_pool = NULL; + green->descriptions = NULL; + green->table = NULL; + green->samples = NULL; + init_green_counts(&green->counts); + green->ambient_temp = 0; + green->ref_temp = 0; + green->references_checked = 0; + green->unused_variables = 0; + htable_variable_ptr_init(alloc, &green->variable_ptrs); +} + +static INLINE void +green_release + (struct green* green) +{ + unsigned i; + ASSERT(green); + + MEM_RM(green->allocator, green->names_pool); + MEM_RM(green->allocator, green->descriptions); + FOR_EACH(i, 0, green->counts.ok_count) + release_sample(green->allocator, green->samples + i); + FOR_EACH(i, 0, 1 + green->counts.desc_count) + release_table_elt(&green->table[i]); + MEM_RM(green->allocator, green->table); + MEM_RM(green->allocator, green->samples); + green->allocator = NULL; + htable_variable_ptr_release(&green->variable_ptrs); +} + +res_T +read_green + (struct green* green, + FILE* stream); + +/* + * Different types of descriptions read from the binary file + */ +enum description_type { + DESC_MAT_SOLID, + DESC_MAT_FLUID, + DESC_BOUND_H_FOR_FLUID, + DESC_BOUND_H_FOR_SOLID, + DESC_BOUND_T_FOR_FLUID, + DESC_BOUND_T_FOR_SOLID, + DESC_BOUND_F_FOR_SOLID, + DESC_SOLID_FLUID_CONNECT, + DESCRIPTION_TYPE_COUNT__, + DESC_OUTSIDE +}; + +#define DESC_IS_MEDIUM(D) \ + ((D) == DESC_MAT_SOLID || (D) == DESC_MAT_FLUID) +#define DESC_IS_H(D) \ + ((D) == DESC_BOUND_H_FOR_SOLID || (D) == DESC_BOUND_H_FOR_FLUID) +#define DESC_IS_T(D) \ + ((D) == DESC_BOUND_T_FOR_SOLID || (D) == DESC_BOUND_T_FOR_FLUID) +#define DESC_IS_F(D) \ + ((D) == DESC_BOUND_F_FOR_SOLID) + +struct mat_fluid { + struct str name; + unsigned fluid_id; + double rho; + double cp; + double tinit; + double imposed_temperature; +}; + +struct mat_solid { + struct str name; + unsigned solid_id; + double lambda; + double rho; + double cp; + double delta; + double tinit; + double imposed_temperature; + double vpower; +}; + +struct h_boundary { + struct str name; + unsigned mat_id; + double emissivity; + double specular_fraction; + double hc; + double imposed_temperature; +}; + +struct t_boundary { + struct str name; + unsigned mat_id; + double emissivity; + double specular_fraction; + double hc; + double imposed_temperature; +}; + +struct f_boundary { + struct str name; + unsigned mat_id; + double imposed_flux; +}; + +struct solid_fluid_connect { + struct str name; + double emissivity; + double specular_fraction; + double hc; +}; + +struct description { + enum description_type type; + union { + struct mat_fluid fluid; + struct mat_solid solid; + struct t_boundary t_boundary; + struct f_boundary f_boundary; + struct h_boundary h_boundary; + struct solid_fluid_connect sf_connect; + } d; +}; + +static INLINE struct str* +get_description_name + (struct description* desc) +{ + ASSERT(desc); + switch (desc->type) { + case DESC_MAT_SOLID: + return &desc->d.solid.name; + case DESC_MAT_FLUID: + return &desc->d.fluid.name; + case DESC_BOUND_T_FOR_SOLID: + case DESC_BOUND_T_FOR_FLUID: + return &desc->d.t_boundary.name; + case DESC_BOUND_H_FOR_SOLID: + case DESC_BOUND_H_FOR_FLUID: + return &desc->d.h_boundary.name; + case DESC_BOUND_F_FOR_SOLID: + return &desc->d.f_boundary.name; + case DESC_SOLID_FLUID_CONNECT: + return &desc->d.sf_connect.name; + default: + FATAL("error:" STR(__FILE__) ":" STR(__LINE__)": Invalid type.\n"); + } +} + +#endif /* GREEN_TYPES_H */ diff --git a/src/green-version.h.in b/src/green-version.h.in @@ -0,0 +1,24 @@ +/* Copyright (C) 2018-2020 |Meso|Star> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GREEN_VERSION_H +#define GREEN_VERSION_H + +#define GREEN_VERSION_MAJOR @GREEN_VERSION_MAJOR@ +#define GREEN_VERSION_MINOR @GREEN_VERSION_MINOR@ +#define GREEN_VERSION_PATCH @GREEN_VERSION_PATCH@ + +#endif /* GREEN_VERSION_H */ +