From c5bd8b0e42c127ad4c27e45239c7498099e0d8f4 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 10 Jun 2024 09:00:02 +0900 Subject: [PATCH 01/14] function solver module introduced --- extra/function/LICENSE | 674 ++++++++++++++++++ extra/function/README.md | 1 + extra/function/pyproject.toml | 36 + extra/function/sample/himmelblau/do.sh | 4 + extra/function/sample/himmelblau/input.toml | 17 + extra/function/sample/himmelblau/simple.py | 12 + .../sample/linear_regression/data.txt | 6 + extra/function/sample/linear_regression/do.sh | 3 + .../sample/linear_regression/input.toml | 17 + .../function/sample/linear_regression/main.py | 18 + extra/function/src/function/Ackley.py | 35 + extra/function/src/function/Himmelblau.py | 33 + .../function/src/function/LinearRegression.py | 49 ++ extra/function/src/function/Quadratics.py | 30 + extra/function/src/function/Quartics.py | 32 + extra/function/src/function/Rosenbrock.py | 30 + extra/function/src/function/__init__.py | 6 + extra/function/src/function/function.py | 69 ++ extra/function/tests/.placeholder | 0 19 files changed, 1072 insertions(+) create mode 100644 extra/function/LICENSE create mode 100644 extra/function/README.md create mode 100644 extra/function/pyproject.toml create mode 100644 extra/function/sample/himmelblau/do.sh create mode 100644 extra/function/sample/himmelblau/input.toml create mode 100644 extra/function/sample/himmelblau/simple.py create mode 100644 extra/function/sample/linear_regression/data.txt create mode 100644 extra/function/sample/linear_regression/do.sh create mode 100644 extra/function/sample/linear_regression/input.toml create mode 100644 extra/function/sample/linear_regression/main.py create mode 100644 extra/function/src/function/Ackley.py create mode 100644 extra/function/src/function/Himmelblau.py create mode 100644 extra/function/src/function/LinearRegression.py create mode 100644 extra/function/src/function/Quadratics.py create mode 100644 extra/function/src/function/Quartics.py create mode 100644 extra/function/src/function/Rosenbrock.py create mode 100644 extra/function/src/function/__init__.py create mode 100644 extra/function/src/function/function.py create mode 100644 extra/function/tests/.placeholder diff --git a/extra/function/LICENSE b/extra/function/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/extra/function/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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: + + Copyright (C) + 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 +. + + 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 +. diff --git a/extra/function/README.md b/extra/function/README.md new file mode 100644 index 00000000..b8fa074d --- /dev/null +++ b/extra/function/README.md @@ -0,0 +1 @@ +# Analytical function solver module for Py2DMAT diff --git a/extra/function/pyproject.toml b/extra/function/pyproject.toml new file mode 100644 index 00000000..0fc1f918 --- /dev/null +++ b/extra/function/pyproject.toml @@ -0,0 +1,36 @@ +[tool.poetry] +name = "py2dmat-function" +version = "1.0-dev" +description = "Analytical function solver module for Py2DMAT: data-analysis software of quantum beam diffraction experiments for 2D material structure" +authors = ["2DMAT developers <2dmat-dev@issp.u-tokyo.ac.jp>"] +license = "GPL-3.0-or-later" + +readme = "README.md" +repository = "https://github.com/issp-center-dev/py2dmat-function" + +packages = [ + { include = "function", from = "src" } + ] + +[tool.poetry.dependencies] +python = ">=3.6.8" +numpy = "^1.14" +#mpi4py = {version = "^3", optional = true} +py2dmat = "^2" + +#[tool.poetry.extras] +#min_search = ["scipy"] +#bayes = ["physbo"] +#exchange = ["mpi4py"] +#all = ["scipy", "mpi4py", "physbo"] + +#[tool.poetry.dev-dependencies] +#black = "^22.3.0" +#pynvim = "^0.4.3" + +#[tool.poetry.scripts] +#py2dmat-function = "function._main:main" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/extra/function/sample/himmelblau/do.sh b/extra/function/sample/himmelblau/do.sh new file mode 100644 index 00000000..c5612685 --- /dev/null +++ b/extra/function/sample/himmelblau/do.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +#time python3 simple.py +time mpiexec -np 4 python3 simple.py diff --git a/extra/function/sample/himmelblau/input.toml b/extra/function/sample/himmelblau/input.toml new file mode 100644 index 00000000..2c14f9a6 --- /dev/null +++ b/extra/function/sample/himmelblau/input.toml @@ -0,0 +1,17 @@ +[base] +dimension = 2 +output_dir = "output" + +[algorithm] +seed = 12345 + +[algorithm.param] +max_list = [6.0, 6.0] +min_list = [-6.0, -6.0] +num_list = [31, 31] + +[solver] + +[runner] +[runner.log] +interval = 20 diff --git a/extra/function/sample/himmelblau/simple.py b/extra/function/sample/himmelblau/simple.py new file mode 100644 index 00000000..a82d0f9a --- /dev/null +++ b/extra/function/sample/himmelblau/simple.py @@ -0,0 +1,12 @@ +import numpy as np + +import py2dmat +import py2dmat.algorithm.mapper_mpi as mapper +import function + +info = py2dmat.Info.from_file("input.toml") +solver = function.Himmelblau(info) +runner = py2dmat.Runner(solver, info) + +alg = mapper.Algorithm(info, runner) +alg.main() diff --git a/extra/function/sample/linear_regression/data.txt b/extra/function/sample/linear_regression/data.txt new file mode 100644 index 00000000..154881d0 --- /dev/null +++ b/extra/function/sample/linear_regression/data.txt @@ -0,0 +1,6 @@ +1.0 1.0 +2.0 3.0 +3.0 2.0 +4.0 4.0 +5.0 3.0 +6.0 5.0 diff --git a/extra/function/sample/linear_regression/do.sh b/extra/function/sample/linear_regression/do.sh new file mode 100644 index 00000000..a65cf432 --- /dev/null +++ b/extra/function/sample/linear_regression/do.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +time python3 main.py diff --git a/extra/function/sample/linear_regression/input.toml b/extra/function/sample/linear_regression/input.toml new file mode 100644 index 00000000..7851ee8e --- /dev/null +++ b/extra/function/sample/linear_regression/input.toml @@ -0,0 +1,17 @@ +[base] +dimension = 3 +output_dir = "output" + +[algorithm] +seed = 12345 + +#[algorithm.param] +#max_list = [ 1.0, 1.0, 1.0] +#min_list = [-1.0, -1.0, -1.0] +#num_list = [21, 21, 21] + +[solver] + +[runner] +[runner.log] +interval = 20 diff --git a/extra/function/sample/linear_regression/main.py b/extra/function/sample/linear_regression/main.py new file mode 100644 index 00000000..16d3a588 --- /dev/null +++ b/extra/function/sample/linear_regression/main.py @@ -0,0 +1,18 @@ +import numpy as np + +import py2dmat +#import py2dmat.algorithm.mapper_mpi as mapper +import py2dmat.algorithm.min_search as min_search +from function import LinearRegression +import py2dmat.domain + +data = np.loadtxt("data.txt") + +info = py2dmat.Info.from_file("input.toml") +solver = LinearRegression(info, xdata=data[:,0], ydata=data[:,1]) +runner = py2dmat.Runner(solver, info) + +region = py2dmat.domain.Region(param={"min_list": [-1,-1,-1], "max_list": [1,1,1]}) + +alg = min_search.Algorithm(info, runner, region) +alg.main() diff --git a/extra/function/src/function/Ackley.py b/extra/function/src/function/Ackley.py new file mode 100644 index 00000000..8ee4e007 --- /dev/null +++ b/extra/function/src/function/Ackley.py @@ -0,0 +1,35 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +def ackley(xs: np.ndarray) -> float: + """Ackley's function in arbitrary dimension + + It has one global minimum f(xs)=0 at xs=[0,0,...,0]. + It has many local minima. + """ + a = np.mean(xs ** 2) + a = 20 * np.exp(-0.2 * np.sqrt(a)) + b = np.cos(2.0 * np.pi * xs) + b = np.exp(0.5 * np.sum(b)) + return 20.0 + np.exp(1.0) - a - b + +class Ackley(Solver): + def __init__(self, info): + super().__init__(info, fn=ackley) diff --git a/extra/function/src/function/Himmelblau.py b/extra/function/src/function/Himmelblau.py new file mode 100644 index 00000000..76eda9c6 --- /dev/null +++ b/extra/function/src/function/Himmelblau.py @@ -0,0 +1,33 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +def himmelblau(xs: np.ndarray) -> float: + """Himmelblau's function + + It has four global minima f(xs) = 0 at + xs=[3,2], [-2.805118..., 3.131312...], [-3.779310..., -3.2831860], and [3.584428..., -1.848126...]. + """ + assert xs.shape[0] == 2, f"ERROR: himmelblau expects d=2 input, but receives d={xs.shape[0]} one" + x, y = xs + return (x ** 2 + y - 11.0) ** 2 + (x + y ** 2 - 7.0) ** 2 + +class Himmelblau(Solver): + def __init__(self, info): + super().__init__(info, fn=himmelblau) diff --git a/extra/function/src/function/LinearRegression.py b/extra/function/src/function/LinearRegression.py new file mode 100644 index 00000000..849d8afe --- /dev/null +++ b/extra/function/src/function/LinearRegression.py @@ -0,0 +1,49 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +class _LinearRegression: + def __init__(self, xdata, ydata): + self.xdata = np.array(xdata) + self.ydata = np.array(ydata) + self.n = len(xdata) + + def __call__(self, xs: np.ndarray) -> float: + """ Negative log likelihood of linear regression with Gaussian noise N(0,sigma) + + y = ax + b + + example: + trained by xdata = [1, 2, 3, 4, 5, 6] and ydata = [1, 3, 2, 4, 3, 5]. + + Model parameters (a, b, sigma) are corresponding to xs as the following, + a = xs[0], b = xs[1], log(sigma**2) = xs[2] + + It has a global minimum f(xs) = 1.005071.. at + xs = [0.628571..., 0.8, -0.664976...]. + """ + assert xs.shape[0] == 3, f"ERROR: regression expects d=3 input, but receives d={xs.shape[0]} one" + + a, b, w = xs + return 0.5 * (self.n * w + np.sum((a * self.xdata + b - self.ydata) ** 2) / np.exp(w)) + +class LinearRegression(Solver): + def __init__(self, info, xdata, ydata): + super().__init__(info) + self.set_function(_LinearRegression(xdata, ydata)) diff --git a/extra/function/src/function/Quadratics.py b/extra/function/src/function/Quadratics.py new file mode 100644 index 00000000..2cfc42a6 --- /dev/null +++ b/extra/function/src/function/Quadratics.py @@ -0,0 +1,30 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +def quadratics(xs: np.ndarray) -> float: + """quadratic (sphear) function + + It has one global miminum f(xs)=0 at xs = [0,0,...,0]. + """ + return np.sum(xs * xs) + +class Quadratics(Solver): + def __init__(self, info): + super().__init__(info, fn=quadratics) diff --git a/extra/function/src/function/Quartics.py b/extra/function/src/function/Quartics.py new file mode 100644 index 00000000..7d8d6d5e --- /dev/null +++ b/extra/function/src/function/Quartics.py @@ -0,0 +1,32 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +def quartics(xs: np.ndarray) -> float: + """quartic function with two minimum + + It has two global minimum f(xs)=0 at xs = [1,1,...,1] and [0,0,...,0]. + It has one suddle point f(0,0,...,0) = 1.0. + """ + + return np.mean((xs - 1.0) ** 2) * np.mean((xs + 1.0) ** 2) + +class Quartics(Solver): + def __init__(self, info): + super().__init__(info, fn=quartics) diff --git a/extra/function/src/function/Rosenbrock.py b/extra/function/src/function/Rosenbrock.py new file mode 100644 index 00000000..5928146e --- /dev/null +++ b/extra/function/src/function/Rosenbrock.py @@ -0,0 +1,30 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import numpy as np +import py2dmat +from .function import Solver + +def rosenbrock(xs: np.ndarray) -> float: + """Rosenbrock's function + + It has one global minimum f(xs) = 0 at xs=[1,1,...,1]. + """ + return np.sum(100.0 * (xs[1:] - xs[:-1] ** 2) ** 2 + (1.0 - xs[:-1]) ** 2) + +class Rosenbrock(Solver): + def __init__(self, info): + super().__init__(info, fn=rosenbrock) diff --git a/extra/function/src/function/__init__.py b/extra/function/src/function/__init__.py new file mode 100644 index 00000000..8b6234ff --- /dev/null +++ b/extra/function/src/function/__init__.py @@ -0,0 +1,6 @@ +from .Quadratics import Quadratics +from .Quartics import Quartics +from .Ackley import Ackley +from .Rosenbrock import Rosenbrock +from .Himmelblau import Himmelblau +from .LinearRegression import LinearRegression diff --git a/extra/function/src/function/function.py b/extra/function/src/function/function.py new file mode 100644 index 00000000..d7bf993f --- /dev/null +++ b/extra/function/src/function/function.py @@ -0,0 +1,69 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +import os +import numpy as np +import py2dmat + +# type hints +from pathlib import Path +from typing import Callable, Optional, Dict + + +class Solver: + root_dir: Path + output_dir: Path + proc_dir: Path + work_dir: Path + _name: str + dimension: int + timer: Dict[str, Dict] + _func: Optional[Callable[[np.ndarray], float]] + + def __init__(self, + info: Optional[py2dmat.Info] = None, + fn: Optional[Callable[[np.ndarray], float]] = None) -> None: + """ + Initialize the solver. + + Parameters + ---------- + info: Info + fn: callable object + """ + self.root_dir = info.base["root_dir"] + self.output_dir = info.base["output_dir"] + self.proc_dir = self.output_dir / str(py2dmat.mpi.rank()) + self.work_dir = self.proc_dir + + self.dimension = info.solver.get("dimension") or info.base.get("dimension") + + self._name = "function" + self._func = fn + + self.timer = {"prepare": {}, "run": {}, "post": {}} + + @property + def name(self) -> str: + return self._name + + def evaluate(self, x: np.ndarray, args = (), nprocs: int = 1, nthreads: int = 1) -> float: + if self._func is None: + raise RuntimeError("ERROR: function is not set. Make sure that `set_function` is called.") + return self._func(x) + + def set_function(self, f: Callable[[np.ndarray], float]) -> None: + self._func = f diff --git a/extra/function/tests/.placeholder b/extra/function/tests/.placeholder new file mode 100644 index 00000000..e69de29b From db11a034446f0618679afb83cfd5c429246216b7 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Thu, 18 Jul 2024 17:43:11 +0900 Subject: [PATCH 02/14] revise install path --- extra/function/pyproject.toml | 2 +- extra/function/sample/himmelblau/do.sh | 4 ++-- extra/function/sample/himmelblau/{simple.py => main.py} | 4 ++-- extra/function/sample/linear_regression/main.py | 2 +- extra/function/src/function/__init__.py | 2 ++ 5 files changed, 8 insertions(+), 6 deletions(-) rename extra/function/sample/himmelblau/{simple.py => main.py} (74%) diff --git a/extra/function/pyproject.toml b/extra/function/pyproject.toml index 0fc1f918..ab87bab1 100644 --- a/extra/function/pyproject.toml +++ b/extra/function/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" repository = "https://github.com/issp-center-dev/py2dmat-function" packages = [ - { include = "function", from = "src" } + { include = "function", from = "src", to = "py2dmat/extra" } ] [tool.poetry.dependencies] diff --git a/extra/function/sample/himmelblau/do.sh b/extra/function/sample/himmelblau/do.sh index c5612685..b2c3e55b 100644 --- a/extra/function/sample/himmelblau/do.sh +++ b/extra/function/sample/himmelblau/do.sh @@ -1,4 +1,4 @@ #!/bin/sh -#time python3 simple.py -time mpiexec -np 4 python3 simple.py +#time python3 main.py +time mpiexec -np 4 python3 main.py diff --git a/extra/function/sample/himmelblau/simple.py b/extra/function/sample/himmelblau/main.py similarity index 74% rename from extra/function/sample/himmelblau/simple.py rename to extra/function/sample/himmelblau/main.py index a82d0f9a..92dfc788 100644 --- a/extra/function/sample/himmelblau/simple.py +++ b/extra/function/sample/himmelblau/main.py @@ -2,10 +2,10 @@ import py2dmat import py2dmat.algorithm.mapper_mpi as mapper -import function +from py2dmat.extra.function import Himmelblau info = py2dmat.Info.from_file("input.toml") -solver = function.Himmelblau(info) +solver = Himmelblau(info) runner = py2dmat.Runner(solver, info) alg = mapper.Algorithm(info, runner) diff --git a/extra/function/sample/linear_regression/main.py b/extra/function/sample/linear_regression/main.py index 16d3a588..52cf3b9f 100644 --- a/extra/function/sample/linear_regression/main.py +++ b/extra/function/sample/linear_regression/main.py @@ -3,7 +3,7 @@ import py2dmat #import py2dmat.algorithm.mapper_mpi as mapper import py2dmat.algorithm.min_search as min_search -from function import LinearRegression +from py2dmat.extra.function import LinearRegression import py2dmat.domain data = np.loadtxt("data.txt") diff --git a/extra/function/src/function/__init__.py b/extra/function/src/function/__init__.py index 8b6234ff..c6cb7cb3 100644 --- a/extra/function/src/function/__init__.py +++ b/extra/function/src/function/__init__.py @@ -1,3 +1,5 @@ +from .function import Solver + from .Quadratics import Quadratics from .Quartics import Quartics from .Ackley import Ackley From 360e152fbbb3ab1bc2bb76eaf8bab0744356e82c Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Thu, 18 Jul 2024 17:43:48 +0900 Subject: [PATCH 03/14] add sample using booth function --- extra/function/sample/booth/booth.py | 9 +++++++++ extra/function/sample/booth/do.sh | 3 +++ extra/function/sample/booth/input.toml | 17 +++++++++++++++++ extra/function/sample/booth/main.py | 12 ++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 extra/function/sample/booth/booth.py create mode 100644 extra/function/sample/booth/do.sh create mode 100644 extra/function/sample/booth/input.toml create mode 100644 extra/function/sample/booth/main.py diff --git a/extra/function/sample/booth/booth.py b/extra/function/sample/booth/booth.py new file mode 100644 index 00000000..fe17e7c9 --- /dev/null +++ b/extra/function/sample/booth/booth.py @@ -0,0 +1,9 @@ +import numpy as np +import py2dmat.extra.function + +class Booth(py2dmat.extra.function.Solver): + def evaluate(self, xs: np.ndarray, args=()): + assert xs.shape[0] == 2 + x, y = xs + fx = (x + 2 * y - 7)**2 + (2 * x + y - 5)**2 + return fx diff --git a/extra/function/sample/booth/do.sh b/extra/function/sample/booth/do.sh new file mode 100644 index 00000000..cf17516f --- /dev/null +++ b/extra/function/sample/booth/do.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +time mpiexec -np 4 python3 main.py diff --git a/extra/function/sample/booth/input.toml b/extra/function/sample/booth/input.toml new file mode 100644 index 00000000..2c14f9a6 --- /dev/null +++ b/extra/function/sample/booth/input.toml @@ -0,0 +1,17 @@ +[base] +dimension = 2 +output_dir = "output" + +[algorithm] +seed = 12345 + +[algorithm.param] +max_list = [6.0, 6.0] +min_list = [-6.0, -6.0] +num_list = [31, 31] + +[solver] + +[runner] +[runner.log] +interval = 20 diff --git a/extra/function/sample/booth/main.py b/extra/function/sample/booth/main.py new file mode 100644 index 00000000..becc574f --- /dev/null +++ b/extra/function/sample/booth/main.py @@ -0,0 +1,12 @@ +import numpy as np + +import py2dmat +import py2dmat.algorithm.min_search as min_search +from booth import Booth + +info = py2dmat.Info.from_file("input.toml") +solver = Booth(info) +runner = py2dmat.Runner(solver, info) + +alg = min_search.Algorithm(info, runner) +alg.main() From b8ecc9f4b4316ebb1fcc79d520b69c44b0e50471 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Fri, 19 Jul 2024 09:07:16 +0900 Subject: [PATCH 04/14] update samples --- extra/function/sample/booth/do.sh | 2 +- .../sample/himmelblau/plot_colormap_2d.py | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 extra/function/sample/himmelblau/plot_colormap_2d.py diff --git a/extra/function/sample/booth/do.sh b/extra/function/sample/booth/do.sh index cf17516f..a65cf432 100644 --- a/extra/function/sample/booth/do.sh +++ b/extra/function/sample/booth/do.sh @@ -1,3 +1,3 @@ #!/bin/sh -time mpiexec -np 4 python3 main.py +time python3 main.py diff --git a/extra/function/sample/himmelblau/plot_colormap_2d.py b/extra/function/sample/himmelblau/plot_colormap_2d.py new file mode 100644 index 00000000..e7cd25cc --- /dev/null +++ b/extra/function/sample/himmelblau/plot_colormap_2d.py @@ -0,0 +1,47 @@ +import numpy as np +import matplotlib.pyplot as plt + + +def himmel(x, y): + return (x ** 2 + y - 11) ** 2 + (x + y ** 2 - 7) ** 2 + + +npts = 201 +c_x, c_y = np.mgrid[-6 : 6 : npts * 1j, -6 : 6 : npts * 1j] +c_z = himmel(c_x, c_y) +levels = np.logspace(0.35, 3.2, 8) + +x = [] +y = [] +f = [] +file_input = open("output/ColorMap.txt", "r") +lines = file_input.readlines() +file_input.close() +for line in lines: + if line[0] != "/n": + data = line.split() + x.append(float(data[0])) + y.append(float(data[1])) + f.append(np.log10(float(data[2]))) + +vmin = np.amin(np.array(f)) +vmax = np.amax(np.array(f)) + +plt.contour(c_x, c_y, c_z, levels, colors="k", zorder=10.0, alpha=1.0, linewidths=0.5) +plt.scatter( + x, + y, + c=f, + s=50, + vmin=vmin, + vmax=vmax, + cmap="Blues_r", + linewidth=2, + alpha=1.0, + zorder=1.0, +) +plt.xlim(-6.0, 6.0) +plt.ylim(-6.0, 6.0) +plt.colorbar(label="log10(f)") +#plt.savefig("output/ColorMapFig.pdf") +plt.savefig("output/ColorMapFig.png") From d4ada0c809d16f009d81e40527f3dcd92c07501c Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Fri, 19 Jul 2024 09:08:23 +0900 Subject: [PATCH 05/14] add manual --- extra/function/doc/.gitignore | 1 + .../doc/common/img/himmelblau_mapper.pdf | Bin 0 -> 47400 bytes .../doc/common/img/himmelblau_mapper.png | Bin 0 -> 179413 bytes extra/function/doc/ja/Makefile | 20 ++ extra/function/doc/ja/make.bat | 35 ++++ .../doc/ja/source/acknowledgement.rst | 4 + extra/function/doc/ja/source/conf.py | 141 +++++++++++++ extra/function/doc/ja/source/contact.rst | 22 +++ extra/function/doc/ja/source/index.rst | 23 +++ extra/function/doc/ja/source/install.rst | 72 +++++++ extra/function/doc/ja/source/introduction.rst | 90 +++++++++ extra/function/doc/ja/source/solver.rst | 47 +++++ .../function/doc/ja/source/tutorial/booth.rst | 186 ++++++++++++++++++ .../doc/ja/source/tutorial/himmelblau.rst | 153 ++++++++++++++ .../function/doc/ja/source/tutorial/index.rst | 17 ++ 15 files changed, 811 insertions(+) create mode 100644 extra/function/doc/.gitignore create mode 100644 extra/function/doc/common/img/himmelblau_mapper.pdf create mode 100644 extra/function/doc/common/img/himmelblau_mapper.png create mode 100644 extra/function/doc/ja/Makefile create mode 100644 extra/function/doc/ja/make.bat create mode 100644 extra/function/doc/ja/source/acknowledgement.rst create mode 100644 extra/function/doc/ja/source/conf.py create mode 100644 extra/function/doc/ja/source/contact.rst create mode 100644 extra/function/doc/ja/source/index.rst create mode 100644 extra/function/doc/ja/source/install.rst create mode 100644 extra/function/doc/ja/source/introduction.rst create mode 100644 extra/function/doc/ja/source/solver.rst create mode 100644 extra/function/doc/ja/source/tutorial/booth.rst create mode 100644 extra/function/doc/ja/source/tutorial/himmelblau.rst create mode 100644 extra/function/doc/ja/source/tutorial/index.rst diff --git a/extra/function/doc/.gitignore b/extra/function/doc/.gitignore new file mode 100644 index 00000000..c795b054 --- /dev/null +++ b/extra/function/doc/.gitignore @@ -0,0 +1 @@ +build \ No newline at end of file diff --git a/extra/function/doc/common/img/himmelblau_mapper.pdf b/extra/function/doc/common/img/himmelblau_mapper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a950d0b908b068c9f937503a62be807e86dbe07b GIT binary patch literal 47400 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

?WNwTUiJUSz&)CQTB6D~FZ`-(B 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 literal 0 HcmV?d00001 diff --git a/extra/function/doc/ja/Makefile b/extra/function/doc/ja/Makefile new file mode 100644 index 00000000..f86728d9 --- /dev/null +++ b/extra/function/doc/ja/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" -W $(SPHINXOPTS) $(O) diff --git a/extra/function/doc/ja/make.bat b/extra/function/doc/ja/make.bat new file mode 100644 index 00000000..6247f7e2 --- /dev/null +++ b/extra/function/doc/ja/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/extra/function/doc/ja/source/acknowledgement.rst b/extra/function/doc/ja/source/acknowledgement.rst new file mode 100644 index 00000000..9be001c2 --- /dev/null +++ b/extra/function/doc/ja/source/acknowledgement.rst @@ -0,0 +1,4 @@ +謝辞 +========================================= + +本ソフトウェアは、科研費(2019-2021年度)「超並列マシンを用いた計算統計と測定技術の融合」および東京大学物性研究所 ソフトウェア高度化プロジェクト (2020, 2021, 2024 年度) の支援を受け開発されました。 diff --git a/extra/function/doc/ja/source/conf.py b/extra/function/doc/ja/source/conf.py new file mode 100644 index 00000000..a9aae86c --- /dev/null +++ b/extra/function/doc/ja/source/conf.py @@ -0,0 +1,141 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = '2DMAT solver module: functions' +copyright = '2020-, 2DMAT developers' +author = '2DMAT developers' + +version = '1.0' +# The full version, including alpha/beta/rc tags +release = '1.0-dev' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.mathjax' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'haiku' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { +} + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'ja' + +# -- Options for LaTeX output --------------------------------------------- + +latex_engine = 'uplatex' + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'userguide_functions_ja.tex', u'2DMAT Function Module Documentation', + u'University of Tokyo', 'manual', 'True'), +] + +# latex_docclass = {'manual': 'jsbook'} + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, '2dmat', u'2DMAT Documentation', + author, '2DMAT', 'One line description of project.', + 'Miscellaneous'), +] + + +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', + 'searchbox.html', + 'donate.html', + ] +} + diff --git a/extra/function/doc/ja/source/contact.rst b/extra/function/doc/ja/source/contact.rst new file mode 100644 index 00000000..0c714e18 --- /dev/null +++ b/extra/function/doc/ja/source/contact.rst @@ -0,0 +1,22 @@ +お問い合わせ +========================================= + +2DMAT-Functions に関するお問い合わせはこちらにお寄せください。 + +- バグ報告 + + 2DMAT-Functions のバグ関連の報告は `GitHubのIssues `_ で受け付けています。 + + バグを早期に解決するため、報告時には次のガイドラインに従ってください。 + + - 使用している 2DMAT-Functions のバージョンを指定してください。 + + - インストールに問題がある場合には、使用しているオペレーティングシステムとコンパイラの情報についてお知らせください。 + + - 実行に問題が生じた場合は、実行に使用した入力ファイルとその出力を記載してください。 + +- その他 + + 研究に関連するトピックなどGitHubのIssuesで相談しづらいことを問い合わせる際には、以下の連絡先にコンタクトをしてください。 + + E-mail: ``2dmat-dev__at__issp.u-tokyo.ac.jp`` (_at_を@に変更してください) diff --git a/extra/function/doc/ja/source/index.rst b/extra/function/doc/ja/source/index.rst new file mode 100644 index 00000000..7beaecce --- /dev/null +++ b/extra/function/doc/ja/source/index.rst @@ -0,0 +1,23 @@ +.. 2dmat documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to 2DMAT's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + introduction + install + tutorial/index + solver + acknowledgement + contact +.. + usage + input + output + examples diff --git a/extra/function/doc/ja/source/install.rst b/extra/function/doc/ja/source/install.rst new file mode 100644 index 00000000..db98d362 --- /dev/null +++ b/extra/function/doc/ja/source/install.rst @@ -0,0 +1,72 @@ +インストール +================================================================ + +実行環境・必要なパッケージ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- python 3.6.8 以上 + + - 必要なpythonパッケージ + + - tomli (>= 1.2) + - numpy (>= 1.14) + +- py2dmat version 3.0 以降 + + +ダウンロード・インストール +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. py2dmat をインストールする + + - ソースコードからのインストール + + リポジトリから py2dmat のソースファイルを取得します。 + + .. code-block:: bash + + $ git clone -b update https://github.com/issp-center-dev/2DMAT.git + + pip コマンドを実行してインストールします。 + + .. code-block:: bash + + $ cd 2DMAT + $ python3 -m pip install . + + + ``--user`` オプションを付けるとローカル (``$HOME/.local``) にインストールできます。 + + ``python3 -m pip install .[all]`` を実行するとオプションのパッケージも同時にインストールします。 + +2. py2dmat-functions をインストールする + + - ソースコードからのインストール + + py2dmat-functions のソースファイルは、現在は py2dmat のソースパッケージの extra ディレクトリ内に配置されています。1. に記述した手順に従って py2dmat のソースファイルを取得した後、 ``extra/function`` ディレクトリ内で pip コマンドを実行してインストールします。 + + .. code-block:: bash + + $ cd 2DMAT/extra/function + $ python3 -m pip install . + + ``--user`` オプションを付けるとローカル (``$HOME/.local``) にインストールできます。 + + 2DMAT-Functions のライブラリがインストールされます。 + + +実行方法 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +2DMAT では順問題ソルバと逆問題解析アルゴリズムを組み合わせて解析を行います。 +2DMAT-Functions に用意された関数の最適化問題の解析を行うには、2DMAT-Functions ライブラリと 2DMAT フレームワークを用いてプログラムを作成し、解析を行います。逆問題解析アルゴリズムは import するモジュールで選択します。プログラム中に入力データの生成を組み込むなど、柔軟な使い方ができます。 +ライブラリの利用方法については以降の章で説明します。 + + +アンインストール +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +2DMAT-Functions モジュールおよび 2DMAT モジュールをアンインストールするには、以下のコマンドを実行します。 + +.. code-block:: bash + + $ python3 -m pip uninstall py2dmat-function py2dmat diff --git a/extra/function/doc/ja/source/introduction.rst b/extra/function/doc/ja/source/introduction.rst new file mode 100644 index 00000000..6f7bf6d9 --- /dev/null +++ b/extra/function/doc/ja/source/introduction.rst @@ -0,0 +1,90 @@ +はじめに +================================ + +2DMATとは +-------------------------------- + +2DMATは、順問題ソルバーに対して探索アルゴリズムを適用して最適解を探すためのフレームワークです。 +順問題ソルバーはユーザー自身で定義できるほか、標準的な順問題ソルバーとして2次元物質構造解析向け実験データ解析ソフトウェアが用意されています。 +順問題ソルバーでは、原子位置などをパラメータとして得られたデータと実験データとのずれを損失関数として与えます。 +探索アルゴリズムによりこの損失関数を最小化する最適なパラメータを推定します。 +現バージョンでは、順問題ソルバーとして量子ビーム回折実験の全反射高速陽電子回折法(Total-Reflection High-Energy Positron Diffraction: TRHEPD), 表面X線回折法(Surface X-ray Diffraction: SXRD), 低速電子線回折法(Low Energy Electron Diffraction: LEED)に対応しており、 +探索アルゴリズムはNelder-Mead法, グリッド型探索法, ベイズ最適化, レプリカ交換モンテカルロ法, ポピュレーションアニーリングモンテカルロ法が実装されています。 + + +2DMAT-Functionsとは +-------------------------------- + +2DMAT-Functions は 2DMAT 向けの順問題として解析関数を提供するものです。主な用途は 2DMAT のテストとベンチマークですが、ユーザが独自の順問題ソルバーを作成する上で雛形としても利用できます。 + +このモジュールは 2DMAT v2.x の順問題ソルバーの一つとして開発されたコンポーネントを、独立なモジュールとして再構成したものです。2DMAT と組み合わせて使用します。 + +ライセンス +-------------------------------- +| 本ソフトウェアのプログラムパッケージおよびソースコード一式はGNU + General Public License version 3 (GPL v3) に準じて配布されています。 + +Copyright (c) <2020-> The University of Tokyo. All rights reserved. + +本ソフトウェアは2020年度および2024年度 東京大学物性研究所 ソフトウェア高度化プロジェクトの支援を受け開発されました。 +2DMATを引用する際には以下の文献を引用してください。 + +"Data-analysis software framework 2DMAT and its application to experimental measurements for two-dimensional material structures", +Y. Motoyama, K. Yoshimi, I. Mochizuki, H. Iwamoto, H. Ichinose, and T. Hoshi, Computer Physics Communications 280, 108465 (2022). + +Bibtex: + +| @article{MOTOYAMA2022108465, +| title = {Data-analysis software framework 2DMAT and its application to experimental measurements for two-dimensional material structures}, +| journal = {Computer Physics Communications}, +| volume = {280}, +| pages = {108465}, +| year = {2022}, +| issn = {0010-4655}, +| doi = {https://doi.org/10.1016/j.cpc.2022.108465}, +| url = {https://www.sciencedirect.com/science/article/pii/S0010465522001849}, +| author = {Yuichi Motoyama and Kazuyoshi Yoshimi and Izumi Mochizuki and Harumichi Iwamoto and Hayato Ichinose and Takeo Hoshi} +| } + + + +バージョン履歴 +-------------------------------- + +2DMAT-Functions + +- v1.0.0 : 2024-XX-XX + +2DMAT + +- v3.0.0 : 2024-XX-XX +- v2.1.0 : 2022-04-08 +- v2.0.0 : 2022-01-17 +- v1.0.1 : 2021-04-15 +- v1.0.0 : 2021-03-12 +- v0.1.0 : 2021-02-08 + +主な開発者 +-------------------------------- + +2DMATは以下のメンバーで開発しています. + +- v3.0.0 - + + - 本山 裕一 (東京大学 物性研究所) + - 吉見 一慶 (東京大学 物性研究所) + - 青山 龍美 (東京大学 物性研究所) + - 星 健夫 (核融合科学研究所) + +- v2.0.0 - + + - 本山 裕一 (東京大学 物性研究所) + - 吉見 一慶 (東京大学 物性研究所) + - 岩本 晴道 (鳥取大学 大学院工学研究科) + - 星 健夫 (鳥取大学 大学院工学研究科) + +- v0.1.0 - + + - 本山 裕一 (東京大学 物性研究所) + - 吉見 一慶 (東京大学 物性研究所) + - 星 健夫 (鳥取大学 大学院工学研究科) diff --git a/extra/function/doc/ja/source/solver.rst b/extra/function/doc/ja/source/solver.rst new file mode 100644 index 00000000..68c9d6c5 --- /dev/null +++ b/extra/function/doc/ja/source/solver.rst @@ -0,0 +1,47 @@ +定義済み関数 +================================================================ + +``2DMAT-Functions`` モジュールは、探索アルゴリズムの性能評価を目的とした定義済みのベンチマーク関数 :math:`f(x)` を計算する ``Solver`` です。 + +それぞれの関数は 2DMAT の順問題ソルバーとして利用可能なクラスとして実装されています。 +定義済みの関数は以下のとおりです。 + +- ``Quadratics`` + + - 二次形式 + + .. math:: + + f(\vec{x}) = \sum_{i=1}^N x_i^2 + + - 最適値は :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 0)` + +- ``Rosenbrock`` + + - `Rosenbrock 関数 `_ + + .. math:: + + f(\vec{x}) = \sum_{i=1}^{N-1} \left[ 100(x_{i+1} - x_i^2)^2 + (x_i - 1)^2 \right] + + - 最適値は :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 1)` + +- ``Ackley`` + + - `Ackley 関数 `_ + + .. math:: + + f(\vec{x}) = 20 + e - 20\exp\left[-0.2\sqrt{\frac{1}{N}\sum_{i=1}^N x_i^2}\right] - \exp\left[\frac{1}{N}\cos\left(2\pi x_i\right)\right] + + - 最適値は :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 0)` + +- ``Himmelblau`` + + - `Himmelblau 関数 `_ + + .. math:: + + f(x,y) = (x^2+y-11)^2 + (x+y^2-7)^2 + + - 最適値は :math:`f(3,2) = f(-2.805118, 3.131312) = f(-3.779310, -3.283186) = f(3.584428, -1.848126) = 0` diff --git a/extra/function/doc/ja/source/tutorial/booth.rst b/extra/function/doc/ja/source/tutorial/booth.rst new file mode 100644 index 00000000..a589b941 --- /dev/null +++ b/extra/function/doc/ja/source/tutorial/booth.rst @@ -0,0 +1,186 @@ +関数の追加 +================================ + +ここでは、2DMAT-Functions モジュールを用いて、ユーザが新しい関数を作成して解析を行う手順を説明します。例として次の Booth 関数 + +.. math:: + + f(x,y) = (x + 2 y - 7) ^2 + (2 x + y - 5) ^2 + +を追加してみます。この関数の最小値は :math:`f(1,3) = 0` です。 + + +サンプルファイルの場所 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +サンプルファイルは ``sample/booth`` にあります。 +フォルダには以下のファイルが格納されています。 + +- ``booth.py`` + + Booth関数を計算する順問題ソルバーを定義する + +- ``main.py`` + + メインプログラム。パラメータを ``input.toml`` ファイルから読み込んで解析を行う + +- ``input.toml`` + + ``simple.py`` で利用する入力パラメータファイル + +- ``do.sh`` + + 本チュートリアルを一括計算するために準備されたスクリプト + +以下、これらのファイルについて説明したのち、実際の計算結果を紹介します。 + + +プログラムの説明 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``booth.py`` では、2DMAT-Functions を利用して Booth 関数を計算する順問題ソルバークラスを定義します。プログラムの全体を以下に示します。 + +.. code-block:: python + + import numpy as np + import py2dmat.extra.function + + class Booth(py2dmat.extra.function.Solver): + def evaluate(self, xs: np.ndarray, args=()): + assert xs.shape[0] == 2 + x, y = xs + fx = (x + 2 * y - 7)**2 + (2 * x + y - 5)**2 + return fx + +プログラムでは、まず必要なモジュールを import します。 +``py2dmat.extra.function`` は 2DMAT-Functions モジュールです。 + +次に、2DMAT-Functions の ``Solver`` クラスを基底クラスとして ``Booth`` クラスを作成します。 +関数値を評価するメソッドを ``evaluate(self, xs, args) -> float`` として定義します。 +``evaluate`` の引数は、パラメータ値を表す ``numpy.ndarray`` 型の引数 ``xs`` と、 ``Tuple`` 型のオプションパラメータ ``args`` です。 +``args`` はステップ数 ``step`` と n巡目を表す ``set`` からなり、必要に応じてクラス内で使用します。 + + +``main.py`` は Booth クラスを用いて解析を行うシンプルなプログラムです。 + +.. code-block:: python + + import numpy as np + + import py2dmat + import py2dmat.algorithm.min_search as min_search + from booth import Booth + + info = py2dmat.Info.from_file("input.toml") + solver = Booth(info) + runner = py2dmat.Runner(solver, info) + + alg = min_search.Algorithm(info, runner) + alg.main() + +プログラム中ではまず、解析で利用するクラスのインスタンスを作成します。 + +- ``py2dmat.Info`` クラス + + パラメータを格納するクラスです。 ``from_file`` クラスメソッドに TOML ファイルのパスを渡して作成することができます。 + +- ``Booth`` クラス + + 上記で作成した booth.py から Booth クラスを import してインスタンスを作成します。 + +- ``py2dmat.Runner`` クラス + + 順問題ソルバーと逆問題解析アルゴリズムを繋ぐクラスです。Solver クラスのインスタンスおよび Info クラスのパラメータを渡して作成します。 + +- ``py2dmat.algorithm.min_search.Algorithm`` クラス + + 逆問題解析アルゴリズムのクラスです。ここでは Nelder-Mead法による最適化アルゴリズムのクラスモジュール ``min_search`` を利用します。Runner のインスタンスを渡して作成します。 + +Solver, Runner, Algorithm の順にインスタンスを作成した後、Algorithm クラスの ``main()`` メソッドを呼んで解析を行います。 + +入力ファイルの説明 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +メインプログラム用の入力ファイル ``input.toml`` の例を以下に示します。 + +.. code-block:: toml + + [base] + dimension = 2 + output_dir = "output" + + [algorithm] + seed = 12345 + + [algorithm.param] + max_list = [6.0, 6.0] + min_list = [-6.0, -6.0] + num_list = [31, 31] + + [solver] + + [runner] + [runner.log] + interval = 20 + + +計算実行 +~~~~~~~~~~~~ + +最初にサンプルファイルが置いてあるフォルダへ移動します。 + +.. code-block:: + + $ cd sample/booth + +メインプログラムを実行します。計算時間は通常のPCで数秒程度で終わります。 + +.. code-block:: + + $ python3 main.py | tee log.txt + +実行すると、以下の様な出力がされます。 + +.. code-block:: + + Optimization terminated successfully. + Current function value: 0.000000 + Iterations: 44 + Function evaluations: 82 + iteration: 44 + len(allvecs): 45 + step: 0 + allvecs[step]: [ 5.15539311 -2.20349335] + step: 1 + allvecs[step]: [ 4.65539311 -1.82849335] + step: 2 + allvecs[step]: [ 4.40539311 -1.26599335] + step: 3 + allvecs[step]: [ 3.28039311 -0.73474335] + step: 4 + allvecs[step]: [2.21789311 0.65588165] + step: 5 + allvecs[step]: [2.21789311 0.65588165] + ... + step: 42 + allvecs[step]: [0.99997645 3.00001226] + step: 43 + allvecs[step]: [0.99997645 3.00001226] + end of run + Current function value: 1.2142360244883376e-09 + Iterations: 44 + Function evaluations: 82 + Solution: + x1 = 0.9999764520155436 + x2 = 3.000012263854959 + + +``x1``, ``x2`` に各ステップでの候補パラメータと、その時の目的関数の値が出力されます。 +最終的に推定されたパラメータは、 ``output/res.dat`` に出力されます。今の場合、 + +.. code-block:: + + fx = 1.2142360244883376e-09 + x1 = 0.9999764520155436 + x2 = 3.000012263854959 + +となり、最小値が再現されていることがわかります。 +なお、一連の計算を行う ``do.sh`` スクリプトが用意されています。 diff --git a/extra/function/doc/ja/source/tutorial/himmelblau.rst b/extra/function/doc/ja/source/tutorial/himmelblau.rst new file mode 100644 index 00000000..51969509 --- /dev/null +++ b/extra/function/doc/ja/source/tutorial/himmelblau.rst @@ -0,0 +1,153 @@ +Himmelblau関数の最小化 +================================ + +ここでは、2DMAT-Functions モジュールを用いたユーザプログラムを作成し、解析を行う方法を説明します。逆問題アルゴリズムは例としてNelder-Mead法を用います。 + + +サンプルファイルの場所 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +サンプルファイルは ``sample/himmelblau`` にあります。 +フォルダには以下のファイルが格納されています。 + +- ``main.py`` + + メインプログラム。パラメータを ``input.toml`` ファイルから読み込んで解析を行う。 + +- ``input.toml`` + + ``main.py`` で利用する入力パラメータファイル + +- ``do.sh`` + + 本チュートリアルを一括計算するために準備されたスクリプト + +- ``plot_colormap_2d.py`` + + 可視化ツール + +以下、これらのファイルについて説明したのち、実際の計算結果を紹介します。 + + +プログラムの説明 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``main.py`` は 2DMAT-Functions モジュールを用いて解析を行うシンプルなプログラムです。 +プログラムの全体を以下に示します。 + +.. code-block:: python + + import numpy as np + + import py2dmat + import py2dmat.algorithm.mapper_mpi as mapper + from py2dmat.extra.function import Himmelblau + + info = py2dmat.Info.from_file("input.toml") + solver = Himmelblau(info) + runner = py2dmat.Runner(solver, info) + + alg = mapper.Algorithm(info, runner) + alg.main() + +プログラムではまず、必要なモジュールを import します。 + +- 2DMAT のメインモジュール ``py2dmat`` + +- 今回利用する逆問題解析アルゴリズム ``py2dmat.algorithm.mapper_mpi`` + +- 順問題ソルバーモジュール ``py2dmat.extra.function`` から Himmelblau クラス + +次に、解析で利用するクラスのインスタンスを作成します。 + +- ``py2dmat.Info`` クラス + + パラメータを格納するクラスです。 ``from_file`` クラスメソッドに TOML ファイルのパスを渡して作成することができます。 + +- ``Himmelblau`` クラス + + 2DMAT-Functions に用意されている Himmelblau関数のクラスです。Info クラスのインスタンスを渡して作成します。 + +- ``py2dmat.Runner`` クラス + + 順問題ソルバーと逆問題解析アルゴリズムを繋ぐクラスです。Solver クラスのインスタンスおよび Info クラスのパラメータを渡して作成します。 + +- ``py2dmat.algorithm.mapper_mpi.Algorithm`` クラス + + 逆問題解析アルゴリズムのクラスです。ここではグリッド全探索のクラスモジュール ``mapper_mpi`` を利用します。Runner のインスタンスを渡して作成します。 + +Solver, Runner, Algorithm の順にインスタンスを作成した後、Algorithm クラスの ``main()`` メソッドを呼んで解析を行います。 + +入力ファイルの説明 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +メインプログラム用の入力ファイル ``input.toml`` の例を以下に示します。 +なお、アルゴリズムの種類を指定する ``algorithm.name`` パラメータの値は無視されます。 + +.. code-block:: toml + + [base] + dimension = 2 + output_dir = "output" + + [algorithm] + seed = 12345 + + [algorithm.param] + max_list = [6.0, 6.0] + min_list = [-6.0, -6.0] + num_list = [31, 31] + + [solver] + + [runner] + [runner.log] + interval = 20 + + +計算実行 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +最初にサンプルファイルが置いてあるフォルダへ移動します。(以下、本ソフトウェアをダウンロードしたディレクトリ直下にいることを仮定します) + +.. code-block:: + + $ cd sample/himmelblau + +メインプログラムを実行します。計算時間は通常のPCで数秒程度で終わります。 + +.. code-block:: + + $ mpiexec -np 4 python3 main.py + +ここではMPIを利用して4プロセスで計算を行っています。実行すると以下の様な出力がされます。 + +.. code-block:: + + Make ColorMap + Iteration : 1/240 + Iteration : 2/240 + Iteration : 3/240 + Iteration : 4/240 + Iteration : 5/240 + Iteration : 6/240 + Iteration : 7/240 + Iteration : 8/240 + Iteration : 9/240 + Iteration : 10/240 + ... + +結果の可視化 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``ColorMap.txt`` を図示することで、関数の値が小さいパラメータがどこにあるかを推定することができます。そのような 2次元パラメータ空間のプロットを作成するプログラムが ``plot_colormap_2d.py`` に用意されています。 + +.. code-block:: + + $ python3 plot_colormap_2d.py + +上記を実行すると ``ColorMapFig.png`` が作成され、Himmelblau関数の関数値を表す等高線の上に、各グリッド点で評価した関数値がカラーマップとしてプロットされます。 + +.. figure:: ../../../common/img/himmelblau_mapper.* + + 2次元パラメータ空間上での関数値のカラーマップ。 + diff --git a/extra/function/doc/ja/source/tutorial/index.rst b/extra/function/doc/ja/source/tutorial/index.rst new file mode 100644 index 00000000..8f24690c --- /dev/null +++ b/extra/function/doc/ja/source/tutorial/index.rst @@ -0,0 +1,17 @@ +.. 2dmat documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +チュートリアル +================================== + +このチュートリアルでは、Himmelblau関数の最小化問題を例として 2DMAT および 2DMAT-Functions ライブラリの使い方を解説します。あわせて、ユーザが独自の関数を定義して解析を行う方法を説明します。 + +逆問題解析アルゴリズムはグリッド探索の ``mapper`` モジュールを使います。その他のアルゴリズムについては 2DMAT のマニュアルを参照してください。 + +.. toctree:: + :maxdepth: 1 + + himmelblau + booth From e52016a4464f897b2631390a6013fbba8a5c4b2f Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Sat, 3 Aug 2024 17:12:37 +0900 Subject: [PATCH 06/14] add english manual --- extra/function/doc/en/Makefile | 20 ++ extra/function/doc/en/make.bat | 36 ++++ .../doc/en/source/acknowledgement.rst | 6 + extra/function/doc/en/source/conf.py | 190 +++++++++++++++++ extra/function/doc/en/source/contact.rst | 22 ++ extra/function/doc/en/source/index.rst | 26 +++ extra/function/doc/en/source/install.rst | 75 +++++++ extra/function/doc/en/source/introduction.rst | 91 ++++++++ extra/function/doc/en/source/solver.rst | 47 +++++ .../function/doc/en/source/tutorial/booth.rst | 196 ++++++++++++++++++ .../doc/en/source/tutorial/himmelblau.rst | 163 +++++++++++++++ .../function/doc/en/source/tutorial/index.rst | 18 ++ 12 files changed, 890 insertions(+) create mode 100644 extra/function/doc/en/Makefile create mode 100644 extra/function/doc/en/make.bat create mode 100644 extra/function/doc/en/source/acknowledgement.rst create mode 100644 extra/function/doc/en/source/conf.py create mode 100644 extra/function/doc/en/source/contact.rst create mode 100644 extra/function/doc/en/source/index.rst create mode 100644 extra/function/doc/en/source/install.rst create mode 100644 extra/function/doc/en/source/introduction.rst create mode 100644 extra/function/doc/en/source/solver.rst create mode 100644 extra/function/doc/en/source/tutorial/booth.rst create mode 100644 extra/function/doc/en/source/tutorial/himmelblau.rst create mode 100644 extra/function/doc/en/source/tutorial/index.rst diff --git a/extra/function/doc/en/Makefile b/extra/function/doc/en/Makefile new file mode 100644 index 00000000..ed7c6d24 --- /dev/null +++ b/extra/function/doc/en/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -msphinx +SPHINXPROJ = pyMC +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" -W $(SPHINXOPTS) $(O) diff --git a/extra/function/doc/en/make.bat b/extra/function/doc/en/make.bat new file mode 100644 index 00000000..36108d30 --- /dev/null +++ b/extra/function/doc/en/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=python -msphinx +) +set SOURCEDIR=source +set BUILDDIR=build +set SPHINXPROJ=pyMC + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The Sphinx module was not found. Make sure you have Sphinx installed, + echo.then set the SPHINXBUILD environment variable to point to the full + echo.path of the 'sphinx-build' executable. Alternatively you may add the + echo.Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% -W %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/extra/function/doc/en/source/acknowledgement.rst b/extra/function/doc/en/source/acknowledgement.rst new file mode 100644 index 00000000..5db6b52f --- /dev/null +++ b/extra/function/doc/en/source/acknowledgement.rst @@ -0,0 +1,6 @@ +*************************** +Acknowledgements +*************************** + +The development of 2DMAT was supported by JSPS KAKENHI Grant Number 19H04125 "Unification of computational statistics and measurement technology by massively parallel machine" +and "Project for advancement of software usability in materials science" (fiscal year 2020, 2021, 2024) of The Institute for Solid State Physics, The University of Tokyo. diff --git a/extra/function/doc/en/source/conf.py b/extra/function/doc/en/source/conf.py new file mode 100644 index 00000000..18a0da38 --- /dev/null +++ b/extra/function/doc/en/source/conf.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# +# MateriApps-Installer documentation build configuration file, created by +# sphinx-quickstart on Sun May 1 14:29:22 2020. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.mathjax'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'2DMAT solver module: Functions' +copyright = u'2020, Institute for Solid State Physics, University of Tokyo' +author = u'2DMAT Developer team' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1.0' +# The full version, including alpha/beta/rc tags. +release = u'1.0-dev' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'en' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'haiku' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + # 'font_family': 'Helvetica', + # 'sidebar_search_button': 'pink_1' +} + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', + 'searchbox.html', + 'donate.html', + ] +} + + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +#html_static_path = ['_static'] + +numfig = True + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = '2DMATdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +# latex_engine = 'uplatex' + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'userguide_functions.tex', u'2DMAT Functions Documentation', + author, 'manual', 'True'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, '2dmat-functions', u'2DMAT Documentation', + [author], 1) +] + +#latex_docclass = {'manual': 'jsbook'} + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, '2dmat-functions', u'2DMAT Documentation', + author, '2DMAT', 'One line description of project.', + 'Miscellaneous'), +] + +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', + 'searchbox.html', + 'donate.html', + ] +} + + + diff --git a/extra/function/doc/en/source/contact.rst b/extra/function/doc/en/source/contact.rst new file mode 100644 index 00000000..b27117bf --- /dev/null +++ b/extra/function/doc/en/source/contact.rst @@ -0,0 +1,22 @@ +Contact +========================================= + +- Bug Reports + + Please report all problems and bugs on the github `Issues `_ page. + + To resolve bugs early, follow these guidelines when reporting: + + 1. Please specify the version of 2DMAT and 2DMAT-Functions you are using. + + 2. If there are problems for installation, please inform us about your operating system and the compiler. + + 3. If a problem occurs during execution, enter the input file used for execution and its output. + + Thank you for your cooperation. + +- Others + + If you have any questions about your research that are difficult to consult at Issues on GitHub, please send an e-mail to the following address: + + E-mail: ``2dmat-dev__at__issp.u-tokyo.ac.jp`` (replace _at_ by @) diff --git a/extra/function/doc/en/source/index.rst b/extra/function/doc/en/source/index.rst new file mode 100644 index 00000000..47a80e4c --- /dev/null +++ b/extra/function/doc/en/source/index.rst @@ -0,0 +1,26 @@ +.. 2dmat documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to 2DMAT's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + introduction + install + tutorial/index + solver + acknowledgement + contact + +.. + input + output + algorithm/index + solver/index + tool + customize/index diff --git a/extra/function/doc/en/source/install.rst b/extra/function/doc/en/source/install.rst new file mode 100644 index 00000000..56ec6014 --- /dev/null +++ b/extra/function/doc/en/source/install.rst @@ -0,0 +1,75 @@ +Installation of 2DMAT-Functions +================================================================ + +Prerequisites +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Python3 (>=3.6.8) + + - The following Python packages are required. + + - tomli >= 1.2 + - numpy >= 1.14 + +- py2dmat version 3.0 and later + + +How to download and install +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Install py2dmat + + - From source files: + + Download source files of py2dmat from the repository as follows: + + .. code-block:: bash + + $ git clone -b update https://github.com/issp-center-dev/2DMAT.git + + Install py2dmat using ``pip`` command: + + .. code-block:: bash + + $ cd 2DMAT + $ python3 -m pip install . + + You may add ``--user`` option to install py2dmat locally (in ``$HOME/.local``). + + If you run the following command instead, optional packages will also be installed at the same time. + + .. code-block:: bash + + $ python3 -m pip install .[all] + +2. Install py2dmat-function + + - From source files: + + At present, the source files of 2dmat-functions are placed in ``extra`` directory of py2dmat source package. After obtaining the source files following the step 1, install 2dmat-functions using ``pip`` command as follows: + + .. code-block:: bash + + $ cd 2DMAT/extra/function + $ python3 -m pip install . + + You may add ``--user`` option to install the package locally (in ``$HOME/.local``). + + Then, the library of 2DMAT-Functions wil be installed. + + +How to run +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In 2DMAT, the analysis is done by using a predefined optimization algorithm and a direct problem solver. +The ways to do analyses of Functions is to write a program for the analysis with 2DMAT-Functions library and 2DMAT framework. +The type of the inverse problem algorithms can be chosen by importing the appropriate module. +A flexible use would be possible, for example, to include data generation within the program. +The types of parameters and the instruction to use the library will be given in the subsequent sections. + + +How to uninstall +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In order to uninstall 2DMAT-Functions and 2DMAT modules, type the following commands: + +.. code-block:: bash + + $ python3 -m pip uninstall py2dmat-function py2dmat diff --git a/extra/function/doc/en/source/introduction.rst b/extra/function/doc/en/source/introduction.rst new file mode 100644 index 00000000..c5c6e564 --- /dev/null +++ b/extra/function/doc/en/source/introduction.rst @@ -0,0 +1,91 @@ +Introduction +================================ + +What is 2DMAT ? +-------------------------------- + +2DMAT is a framework for applying a search algorithm to a direct problem solver to find the optimal solution. +As the standard direct problem solver, the experimental data analysis software for two-dimensional material structure analysis is prepared. +The direct problem solver gives the deviation between the experimental data and the calculated data obtained under the given parameters such as atomic positions as a loss function used in the inverse problem. +The optimal parameters are estimated by minimizing the loss function using a search algorithm. For further use, the original direct problem solver or the search algorithm can be defined by users. +In the current version, for solving a direct problem, 2DMAT offers the wrapper of the solver for the total-reflection high-energy positron diffraction (TRHEPD), the surface X-ray diffraction (Functions), and the low-energy electron diffraction (LEED). +As algorithms, it offers the Nelder-Mead method, the grid search method, the Bayesian optimization method, the replica exchange Monte Carlo method, and the population annealing Monte Carlo method. + + +What is 2DMAT-Functions ? +-------------------------------- + +``2DMAT-Functions`` provides implementation of several analytical functions for the direct problems of 2DMAT. +The major use of this module is to test and benchmark the optimization algorithms of 2DMAT, while it may be useful as a template when the users write their own direct problem solvers. + +It was originally developed as a component of 2DMAT v2.x, and has been restructured as a separate module to be used with 2DMAT. + + + +License +-------------------------------- +| This package is distributed under GNU General Public License version 3 (GPL v3). + +Copyright (c) <2020-> The University of Tokyo. All rights reserved. + +This software was developed with the support of "Project for advancement of software usability in materials science" of The Institute for Solid State Physics, The University of Tokyo. +We hope that you cite the following reference when you publish the results using 2DMAT: + +"Data-analysis software framework 2DMAT and its application to experimental measurements for two-dimensional material structures", Y. Motoyama, K. Yoshimi, I. Mochizuki, H. Iwamoto, H. Ichinose, and T. Hoshi, `Computer Physics Communications 280, 108465 (2022). `_ + +Bibtex: + +| @article{MOTOYAMA2022108465, +| title = {Data-analysis software framework 2DMAT and its application to experimental measurements for two-dimensional material structures}, +| journal = {Computer Physics Communications}, +| volume = {280}, +| pages = {108465}, +| year = {2022}, +| issn = {0010-4655}, +| doi = {https://doi.org/10.1016/j.cpc.2022.108465}, +| url = {https://www.sciencedirect.com/science/article/pii/S0010465522001849}, +| author = {Yuichi Motoyama and Kazuyoshi Yoshimi and Izumi Mochizuki and Harumichi Iwamoto and Hayato Ichinose and Takeo Hoshi} +| } + + +Version Information +-------------------------------- + +2DMAT-Functions + +- v1.0.0: 2024-XX-XX + +2DMAT + +- v3.0.0: 2024-XX-XX +- v2.1.0: 2022-04-08 +- v2.0.0: 2022-01-17 +- v1.0.1: 2021-04-15 +- v1.0.0: 2021-03-12 +- v0.1.0: 2021-02-08 + + +Main developers +-------------------------------- + +2DMAT has been developed by following members. + +- v3.0.0 - + + - Y. Motoyama (The Institute for Solid State Physics, The University of Tokyo) + - K. Yoshimi (The Institute for Solid State Physics, The University of Tokyo) + - T. Aoyama (The Institute for Solid State Physics, The University of Tokyo) + - T. Hoshi (National Institute for Fusion Science) + +- v2.0.0 - + + - Y. Motoyama (The Institute for Solid State Physics, The University of Tokyo) + - K. Yoshimi (The Institute for Solid State Physics, The University of Tokyo) + - H. Iwamoto (Department of Applied Mathematics and Physics, Tottori University) + - T. Hoshi (Department of Applied Mathematics and Physics, Tottori University) + +- v0.1.0 - v1.0.1 + + - Y. Motoyama (The Institute for Solid State Physics, The University of Tokyo) + - K. Yoshimi (The Institute for Solid State Physics, The University of Tokyo) + - T. Hoshi (Department of Applied Mathematics and Physics, Tottori University) diff --git a/extra/function/doc/en/source/solver.rst b/extra/function/doc/en/source/solver.rst new file mode 100644 index 00000000..aa764619 --- /dev/null +++ b/extra/function/doc/en/source/solver.rst @@ -0,0 +1,47 @@ +Predefined functions +================================ + +``2DMAT-Functions`` module provides ``Solver`` that computes a predefined benchmark function :math:`f(x)` for evaluating the performance of search algorithms. + +Each function is implemented as a class that can be used for a direct solver of 2DMAT. +The predefined functions are listed as follows. + +- ``Quadratics`` + + - Quadratic function + + .. math:: + + f(\vec{x}) = \sum_{i=1}^N x_i^2 + + - The optimized value :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 0)` + +- ``Rosenbrock`` + + - `Rosenbrock function `_ + + .. math:: + + f(\vec{x}) = \sum_{i=1}^{N-1} \left[ 100(x_{i+1} - x_i^2)^2 + (x_i - 1)^2 \right] + + - The optimized value :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 1)` + +- ``Ackley`` + + - `Ackley function `_ + + .. math:: + + f(\vec{x}) = 20 + e - 20\exp\left[-0.2\sqrt{\frac{1}{N}\sum_{i=1}^N x_i^2}\right] - \exp\left[\frac{1}{N}\cos\left(2\pi x_i\right)\right] + + - The optimized value :math:`f(\vec{x}^*) = 0 \quad (\forall_i x_i^* = 0)` + +- ``Himmerblau`` + + - `Himmerblau function `_ + + .. math:: + + f(x,y) = (x^2+y-11)^2 + (x+y^2-7)^2 + + - The optimized value :math:`f(3,2) = f(-2.805118, 3.131312) = f(-3.779310, -3.283186) = f(3.584428, -1.848126) = 0` diff --git a/extra/function/doc/en/source/tutorial/booth.rst b/extra/function/doc/en/source/tutorial/booth.rst new file mode 100644 index 00000000..35f5dc10 --- /dev/null +++ b/extra/function/doc/en/source/tutorial/booth.rst @@ -0,0 +1,196 @@ +Adding functions +================================ + +In this tutorial, we describe the procedure how to define a new function and perform analyses. +As an example, we will introduce Booth function given below: + +.. math:: + + f(x,y) = (x + 2 y - 7) ^2 + (2 x + y - 5) ^2 + +The minimum value of this function is :math:`f(1,3) = 0`. + + +Location of the sample files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The sample files are located in ``sample/booth``. +The following files are stored in the folder. + +- ``booth.py`` + + Source file of the direct problem solver that evaluates Booth function. + +- ``main.py`` + + Source file of the main program. This program reads ``input.toml`` for the parameters. + +- ``input.toml`` + + Input parameter file for ``main.py``. + +- ``do.sh`` + + Script file for running this tutorial. + +The following sections describe these files and then show the actual calculation results. + + +Description of main program +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In ``booth.py``, a class for the direct problem solver is defined using 2DMAT-Functions module that evaluates Booth function. +The entire program is shown as follows: + +.. code-block:: python + + import numpy as np + import py2dmat.extra.function + + class Booth(py2dmat.extra.function.Solver): + def evaluate(self, xs: np.ndarray, args=()): + assert xs.shape[0] == 2 + x, y = xs + fx = (x + 2 * y - 7)**2 + (2 * x + y - 5)**2 + return fx + +First, the required modules are imported. +``py2dmat.extra.function`` corresponds to 2DMAT-Functions module. + +Next, ``Booth`` class is defined as derived from ``Solver`` class of 2DMAT-Functions. +The direct problem solver class must have a method called ``evaluate`` which have the form ``evaluate(self, xs, args) -> float``. +The arguments of this method are: +``xs`` of ``numpy.ndarray`` type for the parameter values, and ``args`` of ``Tuple`` type for the optional data that consists of the step count ``step`` and the iteration count ``set`` used in the class accordingly. + +``main.py`` is a simple program that performs analyses using the Booth class. + +.. code-block:: python + + import numpy as np + + import py2dmat + import py2dmat.algorithm.min_search as min_search + from booth import Booth + + info = py2dmat.Info.from_file("input.toml") + solver = Booth(info) + runner = py2dmat.Runner(solver, info) + + alg = min_search.Algorithm(info, runner) + alg.main() + + +In the program, the instances of the classes are created. + +- ``py2dmat.Info`` class + + This class is for storing the parameters. + An instance is created by calling a class method ``from_file`` with a path to TOML file as an argument. + +- ``Booth`` class + + Booth class is imported from ``booth.py`` as introduced above, and is instantiated. + +- ``py2dmat.Runner`` class + + This class is for connecting the direct problem solver and the inverse problem algorithm. + An instance is created by passing an instance of Solver class and an instance of Info class. + +- ``py2dmat.algorithm.min_search.Algorithm`` class + + This class is for the inverse problem algorithm. + In this tutorial, we use ``min_search`` module that implements the optimization by Nelder-Mead method. + An instance is created by passing an instance of Runner class. + +After creating the instances of Solver, Runner, and Algorithm in this order, we invoke ``main()`` method of the Algorithm class to start analyses. + + +Input files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An example of the input parameter file ``input.toml`` is shown below. + +.. code-block:: toml + + [base] + dimension = 2 + output_dir = "output" + + [algorithm] + seed = 12345 + + [algorithm.param] + max_list = [6.0, 6.0] + min_list = [-6.0, -6.0] + num_list = [31, 31] + + [solver] + + [runner] + [runner.log] + interval = 20 + + +Calculation execution +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First, move to the folder where the sample files are located. + +.. code-block:: + + $ cd sample/booth + +Run the main program. The computation time will take only a few seconds on a normal PC. + +.. code-block:: + + $ python3 main.py | tee log.txt + +The standard output will look as follows. + +.. code-block:: + + Optimization terminated successfully. + Current function value: 0.000000 + Iterations: 44 + Function evaluations: 82 + iteration: 44 + len(allvecs): 45 + step: 0 + allvecs[step]: [ 5.15539311 -2.20349335] + step: 1 + allvecs[step]: [ 4.65539311 -1.82849335] + step: 2 + allvecs[step]: [ 4.40539311 -1.26599335] + step: 3 + allvecs[step]: [ 3.28039311 -0.73474335] + step: 4 + allvecs[step]: [2.21789311 0.65588165] + step: 5 + allvecs[step]: [2.21789311 0.65588165] + ... + step: 42 + allvecs[step]: [0.99997645 3.00001226] + step: 43 + allvecs[step]: [0.99997645 3.00001226] + end of run + Current function value: 1.2142360244883376e-09 + Iterations: 44 + Function evaluations: 82 + Solution: + x1 = 0.9999764520155436 + x2 = 3.000012263854959 + +``x1`` and ``x2`` are the candidate parameters at each step. +The final estimated parameters will be written in ``output/res.dat``. +In the current case, the following result will be obtained: + +.. code-block:: + + fx = 1.2142360244883376e-09 + x1 = 0.9999764520155436 + x2 = 3.000012263854959 + +It is found that the minimum has been reproduced. + +Note that ``do.sh`` is available as a script for batch calculation. diff --git a/extra/function/doc/en/source/tutorial/himmelblau.rst b/extra/function/doc/en/source/tutorial/himmelblau.rst new file mode 100644 index 00000000..d44573d2 --- /dev/null +++ b/extra/function/doc/en/source/tutorial/himmelblau.rst @@ -0,0 +1,163 @@ +Minimization of Himmelblau function +================================================================ + +In this tutorial, we will write a user program using 2DMAT-Functions module and perform analyese. As an example, we adopt the Nelder-Mead method for the inverse problem algorithm. + + +Location of the sample files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The sample files are located in ``sample/himmelblau``. +The following files are stored in the folder. + +- ``main.py`` + + Source file of the main program. This program reads ``input.toml`` for the parameters. + +- ``input.toml`` + + Input parameter file for ``main.py``. + +- ``do.sh`` + + Script file for running this tutorial. + +- ``plot_colormap_2d.py`` + + Program for visualizing the results. + +The following sections describe these files and then show the actual calculation results. + + +Description of main program +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``main.py`` is a simple program for the analyses using 2DMAT-Functions module. +The entire source file is shown as follows: + +.. code-block:: python + + import numpy as np + + import py2dmat + import py2dmat.algorithm.mapper_mpi as mapper + from py2dmat.extra.function import Himmelblau + + info = py2dmat.Info.from_file("input.toml") + solver = Himmelblau(info) + runner = py2dmat.Runner(solver, info) + + alg = mapper.Algorithm(info, runner) + alg.main() + + +At the beginning of the program, the required modules are imported as listed below. + +- ``py2dmat`` for the main module of 2DMAT. + +- ``py2dmat.algorithm.mapper_mpi`` for the module of the inverse problem algorithm. + +- ``Himmelblau`` class from ``py2dmat.extra.function`` module. + +Next, the instances of the classes are created. + +- ``py2dmat.Info`` class + + This class is for storing the parameters. + An instance is created by calling a class method ``from_file`` with a path to TOML file as an argument. + +- ``Himmelblau`` class + + This class is for the Himmelblau function defined in the 2DMAT-Functions module. + An instance is created by passing an instance of Info class. + +- ``py2dmat.Runner`` class + + This class is for connecting the direct problem solver and the inverse problem algorithm. + An instance is created by passing an instance of Solver class and an instance of Info class. + +- ``py2dmat.algorithm.min_search.Algorithm`` class + + This class is for the inverse problem algorithm. + In this tutorial, we use ``min_search`` module that implements the optimization by Nelder-Mead method. + An instance is created by passing an instance of Runner class. + +After creating the instances of Solver, Runner, and Algorithm in this order, we invoke ``main()`` method of the Algorithm class to start analyses. + + +Input files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An example of the input parameter file ``input.toml`` is shown below. +Except, ``algorithm.name`` parameter for specifying the algorithm type should be ignored. + +.. code-block:: toml + + [base] + dimension = 2 + output_dir = "output" + + [algorithm] + seed = 12345 + + [algorithm.param] + max_list = [6.0, 6.0] + min_list = [-6.0, -6.0] + num_list = [31, 31] + + [solver] + + [runner] + [runner.log] + interval = 20 + + +Calculation execution +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First, move to the folder where the sample files are located. (We assume that you are directly under the directory where you downloaded this software.) + +.. code-block:: + + $ cd sample/himmelblau + +Run the main program. The computation time will take only a few seconds on a normal PC. + +.. code-block:: + + $ mpiexec -np 4 python3 main.py + +In the above, the main program is executed with 4 MPI parallel processes. +The standard output will look as follows. + +.. code-block:: + + Make ColorMap + Iteration : 1/240 + Iteration : 2/240 + Iteration : 3/240 + Iteration : 4/240 + Iteration : 5/240 + Iteration : 6/240 + Iteration : 7/240 + Iteration : 8/240 + Iteration : 9/240 + Iteration : 10/240 + ... + + +Visualization of results +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By plotting ``output/ColorMap.txt``, you can identify the region of parameters in which the function yield small values. +A program to draw such a two-dimensional plot is prepared in ``plot_colormap_2d.py``. + +.. code-block:: + + $ python3 plot_colormap_2d.py + +By typing as above, ``ColorMapFig.png`` is generated in which a color map of the function values evaluated at the grid, on top of the contour of Himmelblau function. + +.. figure:: ../../../common/img/himmelblau_mapper.* + + A color map of the function values in the two-dimensional parameter space. diff --git a/extra/function/doc/en/source/tutorial/index.rst b/extra/function/doc/en/source/tutorial/index.rst new file mode 100644 index 00000000..dbdb9439 --- /dev/null +++ b/extra/function/doc/en/source/tutorial/index.rst @@ -0,0 +1,18 @@ +.. 2dmat documentation master file, created by + sphinx-quickstart on Tue May 26 18:44:52 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Tutorials +================================ + +In this tutorial, we will instruct how to use 2DMAT and 2DMAT-Functions modules, considering the minimization problem of Himmelblau function as an example. + +For the inverse problem algorithm we adopt the grid search provided as ``mapper`` module. See the 2DMAT manual for other algorithms. + + +.. toctree:: + :maxdepth: 1 + + himmelblau + booth From 32bd84c6b2549ab9485ee79e77b6d4b8ee33e535 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 04:53:59 +0900 Subject: [PATCH 07/14] add main script for extra/sim-trhepd-rheed --- extra/sim-trhepd-rheed/src/main.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 extra/sim-trhepd-rheed/src/main.py diff --git a/extra/sim-trhepd-rheed/src/main.py b/extra/sim-trhepd-rheed/src/main.py new file mode 100644 index 00000000..039f1e55 --- /dev/null +++ b/extra/sim-trhepd-rheed/src/main.py @@ -0,0 +1,20 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +if __name__ == "__main__": + # sys.path[0] is this directory (2DMAT/src) + from sim_trhepd_rheed._main import main + main() From a8de0baea3023002dec2230b20a8433300e88325 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 04:56:30 +0900 Subject: [PATCH 08/14] add tests for extra/sim-trhepd-rheed --- extra/sim-trhepd-rheed/tests/bin/.placeholder | 0 .../mapper_weight_calc_A/MeshData.txt | 10 + .../many_beam/mapper_weight_calc_A/bulk.txt | 14 + .../many_beam/mapper_weight_calc_A/do.sh | 25 ++ .../mapper_weight_calc_A/experiment.txt | 61 +++ .../many_beam/mapper_weight_calc_A/input.toml | 33 ++ .../many_beam/mapper_weight_calc_A/prepare.sh | 4 + .../mapper_weight_calc_A/ref_ColorMap.txt | 10 + .../mapper_weight_calc_A/template.txt | 16 + .../mapper_weight_calc_A2/MeshData.txt | 10 + .../many_beam/mapper_weight_calc_A2/bulk.txt | 14 + .../many_beam/mapper_weight_calc_A2/do.sh | 26 ++ .../mapper_weight_calc_A2/experiment.txt | 61 +++ .../mapper_weight_calc_A2/input.toml | 33 ++ .../mapper_weight_calc_A2/prepare.sh | 4 + .../mapper_weight_calc_A2/ref_ColorMap.txt | 10 + .../mapper_weight_calc_A2/template.txt | 16 + .../mapper_weight_manual/MeshData.txt | 10 + .../many_beam/mapper_weight_manual/bulk.txt | 14 + .../many_beam/mapper_weight_manual/do.sh | 26 ++ .../mapper_weight_manual/experiment.txt | 61 +++ .../many_beam/mapper_weight_manual/input.toml | 34 ++ .../many_beam/mapper_weight_manual/prepare.sh | 4 + .../mapper_weight_manual/ref_ColorMap.txt | 10 + .../mapper_weight_manual/template.txt | 16 + .../many_beam/minsearch_weight_calc/bulk.txt | 14 + .../many_beam/minsearch_weight_calc/do.sh | 27 ++ .../minsearch_weight_calc/experiment.txt | 61 +++ .../minsearch_weight_calc/input.toml | 42 +++ .../minsearch_weight_calc/prepare.sh | 4 + .../many_beam/minsearch_weight_calc/ref.txt | 10 + .../minsearch_weight_calc/template.txt | 16 + .../minsearch_weight_manual/bulk.txt | 14 + .../many_beam/minsearch_weight_manual/do.sh | 27 ++ .../minsearch_weight_manual/experiment.txt | 61 +++ .../minsearch_weight_manual/input.toml | 42 +++ .../minsearch_weight_manual/prepare.sh | 4 + .../many_beam/minsearch_weight_manual/ref.txt | 10 + .../minsearch_weight_manual/template.txt | 16 + .../tests/single_beam/bayes/MeshData.txt | 351 ++++++++++++++++++ .../tests/single_beam/bayes/bulk.txt | 16 + .../tests/single_beam/bayes/do.sh | 25 ++ .../tests/single_beam/bayes/experiment.txt | 70 ++++ .../tests/single_beam/bayes/input.toml | 33 ++ .../tests/single_beam/bayes/prepare.sh | 4 + .../tests/single_beam/bayes/ref_BayesData.txt | 31 ++ .../tests/single_beam/bayes/template.txt | 16 + .../tests/single_beam/exchange/bulk.txt | 16 + .../tests/single_beam/exchange/do.sh | 25 ++ .../tests/single_beam/exchange/experiment.txt | 70 ++++ .../tests/single_beam/exchange/input.toml | 37 ++ .../tests/single_beam/exchange/prepare.sh | 4 + .../tests/single_beam/exchange/ref.txt | 7 + .../tests/single_beam/exchange/template.txt | 16 + .../tests/single_beam/mapper/MeshData.txt | 66 ++++ .../tests/single_beam/mapper/bulk.txt | 16 + .../tests/single_beam/mapper/do.sh | 25 ++ .../tests/single_beam/mapper/experiment.txt | 70 ++++ .../tests/single_beam/mapper/input.toml | 28 ++ .../tests/single_beam/mapper/prepare.sh | 4 + .../tests/single_beam/mapper/ref_ColorMap.txt | 66 ++++ .../tests/single_beam/mapper/template.txt | 16 + .../tests/single_beam/mapper_A2/MeshData.txt | 66 ++++ .../tests/single_beam/mapper_A2/bulk.txt | 16 + .../tests/single_beam/mapper_A2/do.sh | 25 ++ .../single_beam/mapper_A2/experiment.txt | 70 ++++ .../tests/single_beam/mapper_A2/input.toml | 29 ++ .../tests/single_beam/mapper_A2/prepare.sh | 4 + .../single_beam/mapper_A2/ref_ColorMap.txt | 66 ++++ .../tests/single_beam/mapper_A2/template.txt | 16 + .../tests/single_beam/mapper_B/MeshData.txt | 66 ++++ .../tests/single_beam/mapper_B/bulk.txt | 16 + .../tests/single_beam/mapper_B/do.sh | 25 ++ .../tests/single_beam/mapper_B/experiment.txt | 70 ++++ .../tests/single_beam/mapper_B/input.toml | 29 ++ .../tests/single_beam/mapper_B/prepare.sh | 4 + .../single_beam/mapper_B/ref_ColorMap.txt | 66 ++++ .../tests/single_beam/mapper_B/template.txt | 16 + .../tests/single_beam/minsearch/bulk.txt | 16 + .../tests/single_beam/minsearch/do.sh | 25 ++ .../single_beam/minsearch/experiment.txt | 70 ++++ .../tests/single_beam/minsearch/input.toml | 29 ++ .../tests/single_beam/minsearch/prepare.sh | 4 + .../tests/single_beam/minsearch/ref.txt | 4 + .../tests/single_beam/minsearch/template.txt | 16 + .../tests/single_beam/pamc/bulk.txt | 16 + .../tests/single_beam/pamc/do.sh | 25 ++ .../tests/single_beam/pamc/experiment.txt | 70 ++++ .../tests/single_beam/pamc/input.toml | 40 ++ .../tests/single_beam/pamc/prepare.sh | 4 + .../tests/single_beam/pamc/ref.txt | 27 ++ .../tests/single_beam/pamc/template.txt | 16 + 92 files changed, 2828 insertions(+) create mode 100644 extra/sim-trhepd-rheed/tests/bin/.placeholder create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/ref.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/ref.txt create mode 100644 extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/ref_BayesData.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/bayes/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/ref.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/exchange/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/MeshData.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/ref_ColorMap.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/mapper_B/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/ref.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/minsearch/template.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/bulk.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/do.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/experiment.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/input.toml create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/prepare.sh create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/ref.txt create mode 100644 extra/sim-trhepd-rheed/tests/single_beam/pamc/template.txt diff --git a/extra/sim-trhepd-rheed/tests/bin/.placeholder b/extra/sim-trhepd-rheed/tests/bin/.placeholder new file mode 100644 index 00000000..e69de29b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/MeshData.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/MeshData.txt new file mode 100644 index 00000000..71d1b50c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/MeshData.txt @@ -0,0 +1,10 @@ +0 0.5 1.0 1.5 1.5 5.4 4.8 3.8 2.1 2.0 +1 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +2 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +3 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +4 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 +5 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 +6 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 +7 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 +8 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 +9 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/bulk.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/bulk.txt new file mode 100644 index 00000000..a321798b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/bulk.txt @@ -0,0 +1,14 @@ +2,1,2 ,NH,NK,NDOM, -------- Ge(001) bulk +7,15 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0,0,1,0,-1,0,2,0,-2,0,3,0,-3 ,(IH(I),IK(I),I=1,NB) +0,0,1,0,-1,0,2,0,-2,0,3,0,-3,0,4,0,-4,0,5,0,-5,0,6,0,-6,0,7,0,-7,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.3,6.3,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.1,100 ,DZ,ML +1 ,NELM +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.01319,4.01319,90,2.83770,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.12833 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.70948 ,IELM(I),ocr(I),X(I),Y(I),Z(I) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/do.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/do.sh new file mode 100644 index 00000000..e3668631 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/experiment.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/experiment.txt new file mode 100644 index 00000000..d2075d33 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/experiment.txt @@ -0,0 +1,61 @@ +3.00000e-01 8.20372e-03 2.54229e-06 2.54229e-06 9.88860e-15 9.88860e-15 6.88084e-33 6.88084e-33 4.60049e-54 4.60049e-54 4.51983e-87 4.51983e-87 3.53221e-125 3.53221e-125 2.28323e-173 2.28323e-173 +4.00000e-01 1.14751e-02 1.04244e-05 1.04244e-05 2.49203e-13 2.49203e-13 1.26542e-30 1.26542e-30 4.98289e-51 4.98289e-51 3.60151e-83 3.60151e-83 2.07188e-120 2.07188e-120 9.85900e-168 9.85900e-168 +5.00000e-01 1.46340e-02 3.58730e-05 3.58730e-05 5.04417e-12 5.04417e-12 1.86515e-28 1.86515e-28 4.32416e-48 4.32416e-48 2.29890e-79 2.29890e-79 9.73541e-116 9.73541e-116 3.41025e-162 3.41025e-162 +6.00000e-01 1.74036e-02 1.04606e-04 1.04606e-04 8.20593e-11 8.20593e-11 2.20358e-26 2.20358e-26 3.00666e-45 3.00666e-45 1.17553e-75 1.17553e-75 3.66450e-111 3.66450e-111 9.44952e-157 9.44952e-157 +7.00000e-01 1.96261e-02 2.61079e-04 2.61079e-04 1.07379e-09 1.07379e-09 2.08711e-24 2.08711e-24 1.67514e-42 1.67514e-42 4.81525e-72 4.81525e-72 1.10496e-106 1.10496e-106 2.09751e-151 2.09751e-151 +8.00000e-01 2.11810e-02 5.62998e-04 5.62998e-04 1.13137e-08 1.13137e-08 1.58509e-22 1.58509e-22 7.47877e-40 7.47877e-40 1.58009e-68 1.58009e-68 2.66901e-102 2.66901e-102 3.72967e-146 3.72967e-146 +9.00000e-01 2.19506e-02 1.05701e-03 1.05701e-03 9.61019e-08 9.61019e-08 9.65510e-21 9.65510e-21 2.67582e-37 2.67582e-37 4.15360e-65 4.15360e-65 5.16449e-98 5.16449e-98 5.31259e-141 5.31259e-141 +1.00000e+00 2.18837e-02 1.73666e-03 1.73666e-03 6.59148e-07 6.59148e-07 4.71837e-19 4.71837e-19 7.67314e-35 7.67314e-35 8.74678e-62 8.74678e-62 8.00527e-94 8.00527e-94 6.06197e-136 6.06197e-136 +1.10000e+00 2.11118e-02 2.50352e-03 2.50352e-03 3.65776e-06 3.65776e-06 1.85068e-17 1.85068e-17 1.76374e-32 1.76374e-32 1.47555e-58 1.47555e-58 9.94026e-90 9.94026e-90 5.54106e-131 5.54106e-131 +1.20000e+00 2.00197e-02 3.17036e-03 3.17036e-03 1.64630e-05 1.64630e-05 5.82895e-16 5.82895e-16 3.25019e-30 3.25019e-30 1.99411e-55 1.99411e-55 9.88767e-86 9.88767e-86 4.05736e-126 4.05736e-126 +1.30000e+00 1.91652e-02 3.53255e-03 3.53255e-03 6.02887e-05 6.02887e-05 1.47520e-14 1.47520e-14 4.80262e-28 4.80262e-28 2.15890e-52 2.15890e-52 7.87888e-82 7.87888e-82 2.37994e-121 2.37994e-121 +1.40000e+00 1.90127e-02 3.48189e-03 3.48189e-03 1.80376e-04 1.80376e-04 3.00236e-13 3.00236e-13 5.69175e-26 5.69175e-26 1.87246e-49 1.87246e-49 5.02934e-78 5.02934e-78 1.11831e-116 1.11831e-116 +1.50000e+00 1.95992e-02 3.08705e-03 3.08705e-03 4.43302e-04 4.43302e-04 4.91905e-12 4.91905e-12 5.41178e-24 5.41178e-24 1.30105e-46 1.30105e-46 2.57178e-74 2.57178e-74 4.20947e-112 4.20947e-112 +1.60000e+00 2.03890e-02 2.57618e-03 2.57618e-03 9.01644e-04 9.01644e-04 6.49662e-11 6.49662e-11 4.12970e-22 4.12970e-22 7.24244e-44 7.24244e-44 1.05351e-70 1.05351e-70 1.26931e-107 1.26931e-107 +1.70000e+00 2.05290e-02 2.22146e-03 2.22146e-03 1.53385e-03 1.53385e-03 6.92826e-10 6.92826e-10 2.53031e-20 2.53031e-20 3.22996e-41 3.22996e-41 3.45717e-67 3.45717e-67 3.06607e-103 3.06607e-103 +1.80000e+00 1.94096e-02 2.18932e-03 2.18932e-03 2.21633e-03 2.21633e-03 5.97919e-09 5.97919e-09 1.24551e-18 1.24551e-18 1.15409e-38 1.15409e-38 9.08840e-64 9.08840e-64 5.93296e-99 5.93296e-99 +1.90000e+00 1.71097e-02 2.45030e-03 2.45030e-03 2.78148e-03 2.78148e-03 4.18750e-08 4.18750e-08 4.92860e-17 4.92860e-17 3.30394e-36 3.30394e-36 1.91400e-60 1.91400e-60 9.19679e-95 9.19679e-95 +2.00000e+00 1.43591e-02 2.81912e-03 2.81912e-03 3.12490e-03 3.12490e-03 2.38836e-07 2.38836e-07 1.56913e-15 1.56913e-15 7.57864e-34 7.57864e-34 3.22913e-57 3.22913e-57 1.14203e-90 1.14203e-90 +2.10000e+00 1.20865e-02 3.10041e-03 3.10041e-03 3.25578e-03 3.25578e-03 1.11435e-06 1.11435e-06 4.02329e-14 4.02329e-14 1.39297e-31 1.39297e-31 4.36442e-54 4.36442e-54 1.13605e-86 1.13605e-86 +2.20000e+00 1.09633e-02 3.21399e-03 3.21399e-03 3.24916e-03 3.24916e-03 4.27726e-06 4.27726e-06 8.31769e-13 8.31769e-13 2.05172e-29 2.05172e-29 4.72574e-51 4.72574e-51 9.05318e-83 9.05318e-83 +2.30000e+00 1.12236e-02 3.19005e-03 3.19005e-03 3.17788e-03 3.17788e-03 1.36022e-05 1.36022e-05 1.38846e-11 1.38846e-11 2.42190e-27 2.42190e-27 4.09943e-48 4.09943e-48 5.77945e-79 5.77945e-79 +2.40000e+00 1.26847e-02 3.06482e-03 3.06482e-03 3.10461e-03 3.10461e-03 3.61631e-05 3.61631e-05 1.87457e-10 1.87457e-10 2.29143e-25 2.29143e-25 2.84903e-45 2.84903e-45 2.95569e-75 2.95569e-75 +2.50000e+00 1.47993e-02 2.81322e-03 2.81322e-03 3.10625e-03 3.10625e-03 8.13202e-05 8.13202e-05 2.05098e-09 2.05098e-09 1.73793e-23 1.73793e-23 1.58637e-42 1.58637e-42 1.21094e-71 1.21094e-71 +2.60000e+00 1.67805e-02 2.39686e-03 2.39686e-03 3.24955e-03 3.24955e-03 1.57036e-04 1.57036e-04 1.82269e-08 1.82269e-08 1.05686e-21 1.05686e-21 7.07715e-40 7.07715e-40 3.97449e-68 3.97449e-68 +2.70000e+00 1.79264e-02 1.85723e-03 1.85723e-03 3.51557e-03 3.51557e-03 2.65495e-04 2.65495e-04 1.31923e-07 1.31923e-07 5.15425e-20 5.15425e-20 2.52977e-37 2.52977e-37 1.04506e-64 1.04506e-64 +2.80000e+00 1.79907e-02 1.33093e-03 1.33093e-03 3.76876e-03 3.76876e-03 4.01966e-04 4.01966e-04 7.80115e-07 7.80115e-07 2.01655e-18 2.01655e-18 7.24591e-35 7.24591e-35 2.20148e-61 2.20148e-61 +2.90000e+00 1.72421e-02 9.65817e-04 9.65817e-04 3.83828e-03 3.83828e-03 5.57429e-04 5.57429e-04 3.78303e-06 3.78303e-06 6.33181e-17 6.33181e-17 1.66313e-32 1.66313e-32 3.71541e-58 3.71541e-58 +3.00000e+00 1.61322e-02 8.30083e-04 8.30083e-04 3.64961e-03 3.64961e-03 7.20742e-04 7.20742e-04 1.51116e-05 1.51116e-05 1.59643e-15 1.59643e-15 3.05929e-30 3.05929e-30 5.02379e-55 5.02379e-55 +3.10000e+00 1.49123e-02 8.92997e-04 8.92997e-04 3.27932e-03 3.27932e-03 8.78263e-04 8.78263e-04 5.00004e-05 5.00004e-05 3.23432e-14 3.23432e-14 4.51043e-28 4.51043e-28 5.44257e-52 5.44257e-52 +3.20000e+00 1.35465e-02 1.06737e-03 1.06737e-03 2.88348e-03 2.88348e-03 1.01433e-03 1.01433e-03 1.37994e-04 1.37994e-04 5.27039e-13 5.27039e-13 5.33063e-26 5.33063e-26 4.72436e-49 4.72436e-49 +3.30000e+00 1.19172e-02 1.26022e-03 1.26022e-03 2.57067e-03 2.57067e-03 1.11335e-03 1.11335e-03 3.20529e-04 3.20529e-04 6.91671e-12 6.91671e-12 5.05096e-24 5.05096e-24 3.28603e-46 3.28603e-46 +3.40000e+00 1.00537e-02 1.40135e-03 1.40135e-03 2.33714e-03 2.33714e-03 1.15940e-03 1.15940e-03 6.33766e-04 6.33766e-04 7.32418e-11 7.32418e-11 3.83791e-22 3.83791e-22 1.83156e-43 1.83156e-43 +3.50000e+00 8.17053e-03 1.45385e-03 1.45385e-03 2.12304e-03 2.12304e-03 1.13607e-03 1.13607e-03 1.08143e-03 1.08143e-03 6.27478e-10 6.27478e-10 2.33911e-20 2.33911e-20 8.18137e-41 8.18137e-41 +3.60000e+00 6.53572e-03 1.41927e-03 1.41927e-03 1.92999e-03 1.92999e-03 1.03519e-03 1.03519e-03 1.61626e-03 1.61626e-03 4.36723e-09 4.36723e-09 1.14389e-18 1.14389e-18 2.92909e-38 2.92909e-38 +3.70000e+00 5.35999e-03 1.33367e-03 1.33367e-03 1.86928e-03 1.86928e-03 8.70233e-04 8.70233e-04 2.14410e-03 2.14410e-03 2.48549e-08 2.48549e-08 4.49016e-17 4.49016e-17 8.40612e-36 8.40612e-36 +3.80000e+00 4.81712e-03 1.24066e-03 1.24066e-03 2.07870e-03 2.07870e-03 6.75861e-04 6.75861e-04 2.54646e-03 2.54646e-03 1.16900e-07 1.16900e-07 1.41547e-15 1.41547e-15 1.93413e-33 1.93413e-33 +3.90000e+00 5.09106e-03 1.15259e-03 1.15259e-03 2.58615e-03 2.58615e-03 4.89391e-04 4.89391e-04 2.71476e-03 2.71476e-03 4.62218e-07 4.62218e-07 3.58560e-14 3.58560e-14 3.56849e-31 3.56849e-31 +4.00000e+00 6.27917e-03 1.04113e-03 1.04113e-03 3.25723e-03 3.25723e-03 3.33325e-04 3.33325e-04 2.59542e-03 2.59542e-03 1.57650e-06 1.57650e-06 7.30420e-13 7.30420e-13 5.28077e-29 5.28077e-29 +4.10000e+00 8.18460e-03 8.74899e-04 8.74899e-04 3.88244e-03 3.88244e-03 2.14609e-04 2.14609e-04 2.22842e-03 2.22842e-03 4.79133e-06 4.79133e-06 1.19766e-11 1.19766e-11 6.26976e-27 6.26976e-27 +4.20000e+00 1.02521e-02 6.63215e-04 6.63215e-04 4.31701e-03 4.31701e-03 1.33479e-04 1.33479e-04 1.74106e-03 1.74106e-03 1.33460e-05 1.33460e-05 1.58248e-10 1.58248e-10 5.97443e-25 5.97443e-25 +4.30000e+00 1.18201e-02 4.56534e-04 4.56534e-04 4.53705e-03 4.53705e-03 8.83076e-05 8.83076e-05 1.28846e-03 1.28846e-03 3.43304e-05 3.43304e-05 1.68730e-09 1.68730e-09 4.57109e-23 4.57109e-23 +4.40000e+00 1.25166e-02 3.07901e-04 3.07901e-04 4.58438e-03 4.58438e-03 7.48076e-05 7.48076e-05 9.85554e-04 9.85554e-04 8.01387e-05 8.01387e-05 1.45425e-08 1.45425e-08 2.80956e-21 2.80956e-21 +4.50000e+00 1.24346e-02 2.39831e-04 2.39831e-04 4.49553e-03 4.49553e-03 8.47877e-05 8.47877e-05 8.78596e-04 8.78596e-04 1.64859e-04 1.64859e-04 1.01531e-07 1.01531e-07 1.38807e-19 1.38807e-19 +4.60000e+00 1.19322e-02 2.40983e-04 2.40983e-04 4.28955e-03 4.28955e-03 1.06907e-04 1.06907e-04 9.55939e-04 9.55939e-04 2.91399e-04 2.91399e-04 5.75738e-07 5.75738e-07 5.51622e-18 5.51622e-18 +4.70000e+00 1.12782e-02 2.80574e-04 2.80574e-04 3.99474e-03 3.99474e-03 1.30423e-04 1.30423e-04 1.16635e-03 1.16635e-03 4.36262e-04 4.36262e-04 2.66058e-06 2.66058e-06 1.76470e-16 1.76470e-16 +4.80000e+00 1.04800e-02 3.23137e-04 3.23137e-04 3.66468e-03 3.66468e-03 1.51930e-04 1.51930e-04 1.42843e-03 1.42843e-03 5.51828e-04 5.51828e-04 1.00645e-05 1.00645e-05 4.54869e-15 4.54869e-15 +4.90000e+00 9.40087e-03 3.40575e-04 3.40575e-04 3.35809e-03 3.35809e-03 1.78878e-04 1.78878e-04 1.64275e-03 1.64275e-03 5.95529e-04 5.95529e-04 3.13600e-05 3.13600e-05 9.45602e-14 9.45602e-14 +5.00000e+00 7.98100e-03 3.21858e-04 3.21858e-04 3.09388e-03 3.09388e-03 2.21316e-04 2.21316e-04 1.72244e-03 1.72244e-03 5.62367e-04 5.62367e-04 8.12272e-05 8.12272e-05 1.58702e-12 1.58702e-12 +5.10000e+00 6.33564e-03 2.75141e-04 2.75141e-04 2.83349e-03 2.83349e-03 2.75830e-04 2.75830e-04 1.63475e-03 1.63475e-03 4.86986e-04 4.86986e-04 1.77338e-04 1.77338e-04 2.15260e-11 2.15260e-11 +5.20000e+00 4.69185e-03 2.20277e-04 2.20277e-04 2.53384e-03 2.53384e-03 3.20101e-04 3.20101e-04 1.42421e-03 1.42421e-03 4.14585e-04 4.14585e-04 3.33162e-04 3.33162e-04 2.36204e-10 2.36204e-10 +5.30000e+00 3.27797e-03 1.79027e-04 1.79027e-04 2.23107e-03 2.23107e-03 3.29667e-04 3.29667e-04 1.19533e-03 1.19533e-03 3.71111e-04 3.71111e-04 5.53645e-04 5.53645e-04 2.09869e-09 2.09869e-09 +5.40000e+00 2.24753e-03 1.70825e-04 1.70825e-04 2.05873e-03 2.05873e-03 3.03413e-04 3.03413e-04 1.06400e-03 1.06400e-03 3.55457e-04 3.55457e-04 8.37552e-04 8.37552e-04 1.51103e-08 1.51103e-08 +5.50000e+00 1.64073e-03 2.12816e-04 2.12816e-04 2.15862e-03 2.15862e-03 2.71480e-04 2.71480e-04 1.10647e-03 1.10647e-03 3.52311e-04 3.52311e-04 1.17414e-03 1.17414e-03 8.82030e-08 8.82030e-08 +5.60000e+00 1.38305e-03 3.15679e-04 3.15679e-04 2.54923e-03 2.54923e-03 2.75242e-04 2.75242e-04 1.32726e-03 1.32726e-03 3.51425e-04 3.51425e-04 1.52290e-03 1.52290e-03 4.17530e-07 4.17530e-07 +5.70000e+00 1.33614e-03 4.70705e-04 4.70705e-04 3.06735e-03 3.06735e-03 3.34875e-04 3.34875e-04 1.65095e-03 1.65095e-03 3.56333e-04 3.56333e-04 1.80197e-03 1.80197e-03 1.60275e-06 1.60275e-06 +5.80000e+00 1.37924e-03 6.38137e-04 6.38137e-04 3.44882e-03 3.44882e-03 4.30290e-04 4.30290e-04 1.94223e-03 1.94223e-03 3.73991e-04 3.73991e-04 1.92617e-03 1.92617e-03 4.98731e-06 4.98731e-06 +5.90000e+00 1.45483e-03 7.55599e-04 7.55599e-04 3.49617e-03 3.49617e-03 5.11150e-04 5.11150e-04 2.06289e-03 2.06289e-03 3.97725e-04 3.97725e-04 1.87370e-03 1.87370e-03 1.25727e-05 1.25727e-05 +6.00000e+00 1.53948e-03 7.70601e-04 7.70601e-04 3.19202e-03 3.19202e-03 5.29865e-04 5.29865e-04 1.94599e-03 1.94599e-03 4.05916e-04 4.05916e-04 1.70002e-03 1.70002e-03 2.56570e-05 2.56570e-05 +6.10000e+00 1.58568e-03 6.73822e-04 6.73822e-04 2.66436e-03 2.66436e-03 4.72139e-04 4.72139e-04 1.62943e-03 1.62943e-03 3.79582e-04 3.79582e-04 1.47514e-03 1.47514e-03 4.23429e-05 4.23429e-05 +6.20000e+00 1.51599e-03 5.04199e-04 5.04199e-04 2.06232e-03 2.06232e-03 3.61528e-04 3.61528e-04 1.21767e-03 1.21767e-03 3.17962e-04 3.17962e-04 1.22482e-03 1.22482e-03 5.64558e-05 5.64558e-05 +6.30000e+00 1.28486e-03 3.22258e-04 3.22258e-04 1.47827e-03 1.47827e-03 2.38643e-04 2.38643e-04 8.14408e-04 8.14408e-04 2.36637e-04 2.36637e-04 9.44342e-04 9.44342e-04 6.07488e-05 6.07488e-05 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/input.toml b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/input.toml new file mode 100644 index 00000000..14db987d --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/input.toml @@ -0,0 +1,33 @@ +[base] +dimension = 9 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" +generate_rocking_curve = false + +[solver.config] +cal_number = [1, 2, 4, 6, 8] +surface_exec_file = "../../bin/surf.exe" + +[solver.post] +normalization = "MANY_BEAM" +weight_type = "calc" +Rfactor_type = "A" +omega = 0.5 +remove_work_dir = false + +[solver.param] +string_list = ["value_01", "value_02","value_03", "value_04","value_05", "value_06", "value_07","value_08", "value_09"] + +[solver.reference] +path = "experiment.txt" +exp_number = [1, 2, 4, 6, 8] + +[algorithm] +name = "mapper" +label_list = ["X1", "X2", "X3", "Y3", "Z1", "Z2", "Z3", "Z4", "Z5"] + +[algorithm.param] +mesh_path = "MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/prepare.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/ref_ColorMap.txt new file mode 100644 index 00000000..0ca78806 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/ref_ColorMap.txt @@ -0,0 +1,10 @@ +0.500000 1.000000 1.500000 1.500000 5.400000 4.800000 3.800000 2.100000 2.000000 0.000000 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.044132 +4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.042504 +5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.042504 +5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.042519 +5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.044132 +5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 0.045994 +5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 0.045994 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 0.045974 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 0.043892 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/template.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/template.txt new file mode 100644 index 00000000..8469cd87 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.2,0.15 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2,1.7,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, value_01, 1.00000, value_05 ,IELM(I),ocr(I),X(I),Y(I),Z(I +1, 1.0, value_02, 1.00000, value_06 +2, 1.0, value_03, value_04, value_07 +2, 1.0, 2.00000, 1.49751, value_08 +2, 1.0, 1.00000, 1.50000, value_09 +2, 1.0, 0.00000, 1.00000, 0.849425 +2, 1.0, 2.00000, 1.00000, 0.809425 +2, 1.0, 1.00997, 1.00000, 0.599425 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/MeshData.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/MeshData.txt new file mode 100644 index 00000000..71d1b50c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/MeshData.txt @@ -0,0 +1,10 @@ +0 0.5 1.0 1.5 1.5 5.4 4.8 3.8 2.1 2.0 +1 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +2 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +3 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +4 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 +5 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 +6 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 +7 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 +8 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 +9 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/bulk.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/bulk.txt new file mode 100644 index 00000000..a321798b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/bulk.txt @@ -0,0 +1,14 @@ +2,1,2 ,NH,NK,NDOM, -------- Ge(001) bulk +7,15 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0,0,1,0,-1,0,2,0,-2,0,3,0,-3 ,(IH(I),IK(I),I=1,NB) +0,0,1,0,-1,0,2,0,-2,0,3,0,-3,0,4,0,-4,0,5,0,-5,0,6,0,-6,0,7,0,-7,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.3,6.3,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.1,100 ,DZ,ML +1 ,NELM +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.01319,4.01319,90,2.83770,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.12833 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.70948 ,IELM(I),ocr(I),X(I),Y(I),Z(I) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/do.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/do.sh new file mode 100644 index 00000000..9f194c24 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/do.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +#time $CMD input.toml +time mpiexec -np 4 $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/experiment.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/experiment.txt new file mode 100644 index 00000000..d2075d33 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/experiment.txt @@ -0,0 +1,61 @@ +3.00000e-01 8.20372e-03 2.54229e-06 2.54229e-06 9.88860e-15 9.88860e-15 6.88084e-33 6.88084e-33 4.60049e-54 4.60049e-54 4.51983e-87 4.51983e-87 3.53221e-125 3.53221e-125 2.28323e-173 2.28323e-173 +4.00000e-01 1.14751e-02 1.04244e-05 1.04244e-05 2.49203e-13 2.49203e-13 1.26542e-30 1.26542e-30 4.98289e-51 4.98289e-51 3.60151e-83 3.60151e-83 2.07188e-120 2.07188e-120 9.85900e-168 9.85900e-168 +5.00000e-01 1.46340e-02 3.58730e-05 3.58730e-05 5.04417e-12 5.04417e-12 1.86515e-28 1.86515e-28 4.32416e-48 4.32416e-48 2.29890e-79 2.29890e-79 9.73541e-116 9.73541e-116 3.41025e-162 3.41025e-162 +6.00000e-01 1.74036e-02 1.04606e-04 1.04606e-04 8.20593e-11 8.20593e-11 2.20358e-26 2.20358e-26 3.00666e-45 3.00666e-45 1.17553e-75 1.17553e-75 3.66450e-111 3.66450e-111 9.44952e-157 9.44952e-157 +7.00000e-01 1.96261e-02 2.61079e-04 2.61079e-04 1.07379e-09 1.07379e-09 2.08711e-24 2.08711e-24 1.67514e-42 1.67514e-42 4.81525e-72 4.81525e-72 1.10496e-106 1.10496e-106 2.09751e-151 2.09751e-151 +8.00000e-01 2.11810e-02 5.62998e-04 5.62998e-04 1.13137e-08 1.13137e-08 1.58509e-22 1.58509e-22 7.47877e-40 7.47877e-40 1.58009e-68 1.58009e-68 2.66901e-102 2.66901e-102 3.72967e-146 3.72967e-146 +9.00000e-01 2.19506e-02 1.05701e-03 1.05701e-03 9.61019e-08 9.61019e-08 9.65510e-21 9.65510e-21 2.67582e-37 2.67582e-37 4.15360e-65 4.15360e-65 5.16449e-98 5.16449e-98 5.31259e-141 5.31259e-141 +1.00000e+00 2.18837e-02 1.73666e-03 1.73666e-03 6.59148e-07 6.59148e-07 4.71837e-19 4.71837e-19 7.67314e-35 7.67314e-35 8.74678e-62 8.74678e-62 8.00527e-94 8.00527e-94 6.06197e-136 6.06197e-136 +1.10000e+00 2.11118e-02 2.50352e-03 2.50352e-03 3.65776e-06 3.65776e-06 1.85068e-17 1.85068e-17 1.76374e-32 1.76374e-32 1.47555e-58 1.47555e-58 9.94026e-90 9.94026e-90 5.54106e-131 5.54106e-131 +1.20000e+00 2.00197e-02 3.17036e-03 3.17036e-03 1.64630e-05 1.64630e-05 5.82895e-16 5.82895e-16 3.25019e-30 3.25019e-30 1.99411e-55 1.99411e-55 9.88767e-86 9.88767e-86 4.05736e-126 4.05736e-126 +1.30000e+00 1.91652e-02 3.53255e-03 3.53255e-03 6.02887e-05 6.02887e-05 1.47520e-14 1.47520e-14 4.80262e-28 4.80262e-28 2.15890e-52 2.15890e-52 7.87888e-82 7.87888e-82 2.37994e-121 2.37994e-121 +1.40000e+00 1.90127e-02 3.48189e-03 3.48189e-03 1.80376e-04 1.80376e-04 3.00236e-13 3.00236e-13 5.69175e-26 5.69175e-26 1.87246e-49 1.87246e-49 5.02934e-78 5.02934e-78 1.11831e-116 1.11831e-116 +1.50000e+00 1.95992e-02 3.08705e-03 3.08705e-03 4.43302e-04 4.43302e-04 4.91905e-12 4.91905e-12 5.41178e-24 5.41178e-24 1.30105e-46 1.30105e-46 2.57178e-74 2.57178e-74 4.20947e-112 4.20947e-112 +1.60000e+00 2.03890e-02 2.57618e-03 2.57618e-03 9.01644e-04 9.01644e-04 6.49662e-11 6.49662e-11 4.12970e-22 4.12970e-22 7.24244e-44 7.24244e-44 1.05351e-70 1.05351e-70 1.26931e-107 1.26931e-107 +1.70000e+00 2.05290e-02 2.22146e-03 2.22146e-03 1.53385e-03 1.53385e-03 6.92826e-10 6.92826e-10 2.53031e-20 2.53031e-20 3.22996e-41 3.22996e-41 3.45717e-67 3.45717e-67 3.06607e-103 3.06607e-103 +1.80000e+00 1.94096e-02 2.18932e-03 2.18932e-03 2.21633e-03 2.21633e-03 5.97919e-09 5.97919e-09 1.24551e-18 1.24551e-18 1.15409e-38 1.15409e-38 9.08840e-64 9.08840e-64 5.93296e-99 5.93296e-99 +1.90000e+00 1.71097e-02 2.45030e-03 2.45030e-03 2.78148e-03 2.78148e-03 4.18750e-08 4.18750e-08 4.92860e-17 4.92860e-17 3.30394e-36 3.30394e-36 1.91400e-60 1.91400e-60 9.19679e-95 9.19679e-95 +2.00000e+00 1.43591e-02 2.81912e-03 2.81912e-03 3.12490e-03 3.12490e-03 2.38836e-07 2.38836e-07 1.56913e-15 1.56913e-15 7.57864e-34 7.57864e-34 3.22913e-57 3.22913e-57 1.14203e-90 1.14203e-90 +2.10000e+00 1.20865e-02 3.10041e-03 3.10041e-03 3.25578e-03 3.25578e-03 1.11435e-06 1.11435e-06 4.02329e-14 4.02329e-14 1.39297e-31 1.39297e-31 4.36442e-54 4.36442e-54 1.13605e-86 1.13605e-86 +2.20000e+00 1.09633e-02 3.21399e-03 3.21399e-03 3.24916e-03 3.24916e-03 4.27726e-06 4.27726e-06 8.31769e-13 8.31769e-13 2.05172e-29 2.05172e-29 4.72574e-51 4.72574e-51 9.05318e-83 9.05318e-83 +2.30000e+00 1.12236e-02 3.19005e-03 3.19005e-03 3.17788e-03 3.17788e-03 1.36022e-05 1.36022e-05 1.38846e-11 1.38846e-11 2.42190e-27 2.42190e-27 4.09943e-48 4.09943e-48 5.77945e-79 5.77945e-79 +2.40000e+00 1.26847e-02 3.06482e-03 3.06482e-03 3.10461e-03 3.10461e-03 3.61631e-05 3.61631e-05 1.87457e-10 1.87457e-10 2.29143e-25 2.29143e-25 2.84903e-45 2.84903e-45 2.95569e-75 2.95569e-75 +2.50000e+00 1.47993e-02 2.81322e-03 2.81322e-03 3.10625e-03 3.10625e-03 8.13202e-05 8.13202e-05 2.05098e-09 2.05098e-09 1.73793e-23 1.73793e-23 1.58637e-42 1.58637e-42 1.21094e-71 1.21094e-71 +2.60000e+00 1.67805e-02 2.39686e-03 2.39686e-03 3.24955e-03 3.24955e-03 1.57036e-04 1.57036e-04 1.82269e-08 1.82269e-08 1.05686e-21 1.05686e-21 7.07715e-40 7.07715e-40 3.97449e-68 3.97449e-68 +2.70000e+00 1.79264e-02 1.85723e-03 1.85723e-03 3.51557e-03 3.51557e-03 2.65495e-04 2.65495e-04 1.31923e-07 1.31923e-07 5.15425e-20 5.15425e-20 2.52977e-37 2.52977e-37 1.04506e-64 1.04506e-64 +2.80000e+00 1.79907e-02 1.33093e-03 1.33093e-03 3.76876e-03 3.76876e-03 4.01966e-04 4.01966e-04 7.80115e-07 7.80115e-07 2.01655e-18 2.01655e-18 7.24591e-35 7.24591e-35 2.20148e-61 2.20148e-61 +2.90000e+00 1.72421e-02 9.65817e-04 9.65817e-04 3.83828e-03 3.83828e-03 5.57429e-04 5.57429e-04 3.78303e-06 3.78303e-06 6.33181e-17 6.33181e-17 1.66313e-32 1.66313e-32 3.71541e-58 3.71541e-58 +3.00000e+00 1.61322e-02 8.30083e-04 8.30083e-04 3.64961e-03 3.64961e-03 7.20742e-04 7.20742e-04 1.51116e-05 1.51116e-05 1.59643e-15 1.59643e-15 3.05929e-30 3.05929e-30 5.02379e-55 5.02379e-55 +3.10000e+00 1.49123e-02 8.92997e-04 8.92997e-04 3.27932e-03 3.27932e-03 8.78263e-04 8.78263e-04 5.00004e-05 5.00004e-05 3.23432e-14 3.23432e-14 4.51043e-28 4.51043e-28 5.44257e-52 5.44257e-52 +3.20000e+00 1.35465e-02 1.06737e-03 1.06737e-03 2.88348e-03 2.88348e-03 1.01433e-03 1.01433e-03 1.37994e-04 1.37994e-04 5.27039e-13 5.27039e-13 5.33063e-26 5.33063e-26 4.72436e-49 4.72436e-49 +3.30000e+00 1.19172e-02 1.26022e-03 1.26022e-03 2.57067e-03 2.57067e-03 1.11335e-03 1.11335e-03 3.20529e-04 3.20529e-04 6.91671e-12 6.91671e-12 5.05096e-24 5.05096e-24 3.28603e-46 3.28603e-46 +3.40000e+00 1.00537e-02 1.40135e-03 1.40135e-03 2.33714e-03 2.33714e-03 1.15940e-03 1.15940e-03 6.33766e-04 6.33766e-04 7.32418e-11 7.32418e-11 3.83791e-22 3.83791e-22 1.83156e-43 1.83156e-43 +3.50000e+00 8.17053e-03 1.45385e-03 1.45385e-03 2.12304e-03 2.12304e-03 1.13607e-03 1.13607e-03 1.08143e-03 1.08143e-03 6.27478e-10 6.27478e-10 2.33911e-20 2.33911e-20 8.18137e-41 8.18137e-41 +3.60000e+00 6.53572e-03 1.41927e-03 1.41927e-03 1.92999e-03 1.92999e-03 1.03519e-03 1.03519e-03 1.61626e-03 1.61626e-03 4.36723e-09 4.36723e-09 1.14389e-18 1.14389e-18 2.92909e-38 2.92909e-38 +3.70000e+00 5.35999e-03 1.33367e-03 1.33367e-03 1.86928e-03 1.86928e-03 8.70233e-04 8.70233e-04 2.14410e-03 2.14410e-03 2.48549e-08 2.48549e-08 4.49016e-17 4.49016e-17 8.40612e-36 8.40612e-36 +3.80000e+00 4.81712e-03 1.24066e-03 1.24066e-03 2.07870e-03 2.07870e-03 6.75861e-04 6.75861e-04 2.54646e-03 2.54646e-03 1.16900e-07 1.16900e-07 1.41547e-15 1.41547e-15 1.93413e-33 1.93413e-33 +3.90000e+00 5.09106e-03 1.15259e-03 1.15259e-03 2.58615e-03 2.58615e-03 4.89391e-04 4.89391e-04 2.71476e-03 2.71476e-03 4.62218e-07 4.62218e-07 3.58560e-14 3.58560e-14 3.56849e-31 3.56849e-31 +4.00000e+00 6.27917e-03 1.04113e-03 1.04113e-03 3.25723e-03 3.25723e-03 3.33325e-04 3.33325e-04 2.59542e-03 2.59542e-03 1.57650e-06 1.57650e-06 7.30420e-13 7.30420e-13 5.28077e-29 5.28077e-29 +4.10000e+00 8.18460e-03 8.74899e-04 8.74899e-04 3.88244e-03 3.88244e-03 2.14609e-04 2.14609e-04 2.22842e-03 2.22842e-03 4.79133e-06 4.79133e-06 1.19766e-11 1.19766e-11 6.26976e-27 6.26976e-27 +4.20000e+00 1.02521e-02 6.63215e-04 6.63215e-04 4.31701e-03 4.31701e-03 1.33479e-04 1.33479e-04 1.74106e-03 1.74106e-03 1.33460e-05 1.33460e-05 1.58248e-10 1.58248e-10 5.97443e-25 5.97443e-25 +4.30000e+00 1.18201e-02 4.56534e-04 4.56534e-04 4.53705e-03 4.53705e-03 8.83076e-05 8.83076e-05 1.28846e-03 1.28846e-03 3.43304e-05 3.43304e-05 1.68730e-09 1.68730e-09 4.57109e-23 4.57109e-23 +4.40000e+00 1.25166e-02 3.07901e-04 3.07901e-04 4.58438e-03 4.58438e-03 7.48076e-05 7.48076e-05 9.85554e-04 9.85554e-04 8.01387e-05 8.01387e-05 1.45425e-08 1.45425e-08 2.80956e-21 2.80956e-21 +4.50000e+00 1.24346e-02 2.39831e-04 2.39831e-04 4.49553e-03 4.49553e-03 8.47877e-05 8.47877e-05 8.78596e-04 8.78596e-04 1.64859e-04 1.64859e-04 1.01531e-07 1.01531e-07 1.38807e-19 1.38807e-19 +4.60000e+00 1.19322e-02 2.40983e-04 2.40983e-04 4.28955e-03 4.28955e-03 1.06907e-04 1.06907e-04 9.55939e-04 9.55939e-04 2.91399e-04 2.91399e-04 5.75738e-07 5.75738e-07 5.51622e-18 5.51622e-18 +4.70000e+00 1.12782e-02 2.80574e-04 2.80574e-04 3.99474e-03 3.99474e-03 1.30423e-04 1.30423e-04 1.16635e-03 1.16635e-03 4.36262e-04 4.36262e-04 2.66058e-06 2.66058e-06 1.76470e-16 1.76470e-16 +4.80000e+00 1.04800e-02 3.23137e-04 3.23137e-04 3.66468e-03 3.66468e-03 1.51930e-04 1.51930e-04 1.42843e-03 1.42843e-03 5.51828e-04 5.51828e-04 1.00645e-05 1.00645e-05 4.54869e-15 4.54869e-15 +4.90000e+00 9.40087e-03 3.40575e-04 3.40575e-04 3.35809e-03 3.35809e-03 1.78878e-04 1.78878e-04 1.64275e-03 1.64275e-03 5.95529e-04 5.95529e-04 3.13600e-05 3.13600e-05 9.45602e-14 9.45602e-14 +5.00000e+00 7.98100e-03 3.21858e-04 3.21858e-04 3.09388e-03 3.09388e-03 2.21316e-04 2.21316e-04 1.72244e-03 1.72244e-03 5.62367e-04 5.62367e-04 8.12272e-05 8.12272e-05 1.58702e-12 1.58702e-12 +5.10000e+00 6.33564e-03 2.75141e-04 2.75141e-04 2.83349e-03 2.83349e-03 2.75830e-04 2.75830e-04 1.63475e-03 1.63475e-03 4.86986e-04 4.86986e-04 1.77338e-04 1.77338e-04 2.15260e-11 2.15260e-11 +5.20000e+00 4.69185e-03 2.20277e-04 2.20277e-04 2.53384e-03 2.53384e-03 3.20101e-04 3.20101e-04 1.42421e-03 1.42421e-03 4.14585e-04 4.14585e-04 3.33162e-04 3.33162e-04 2.36204e-10 2.36204e-10 +5.30000e+00 3.27797e-03 1.79027e-04 1.79027e-04 2.23107e-03 2.23107e-03 3.29667e-04 3.29667e-04 1.19533e-03 1.19533e-03 3.71111e-04 3.71111e-04 5.53645e-04 5.53645e-04 2.09869e-09 2.09869e-09 +5.40000e+00 2.24753e-03 1.70825e-04 1.70825e-04 2.05873e-03 2.05873e-03 3.03413e-04 3.03413e-04 1.06400e-03 1.06400e-03 3.55457e-04 3.55457e-04 8.37552e-04 8.37552e-04 1.51103e-08 1.51103e-08 +5.50000e+00 1.64073e-03 2.12816e-04 2.12816e-04 2.15862e-03 2.15862e-03 2.71480e-04 2.71480e-04 1.10647e-03 1.10647e-03 3.52311e-04 3.52311e-04 1.17414e-03 1.17414e-03 8.82030e-08 8.82030e-08 +5.60000e+00 1.38305e-03 3.15679e-04 3.15679e-04 2.54923e-03 2.54923e-03 2.75242e-04 2.75242e-04 1.32726e-03 1.32726e-03 3.51425e-04 3.51425e-04 1.52290e-03 1.52290e-03 4.17530e-07 4.17530e-07 +5.70000e+00 1.33614e-03 4.70705e-04 4.70705e-04 3.06735e-03 3.06735e-03 3.34875e-04 3.34875e-04 1.65095e-03 1.65095e-03 3.56333e-04 3.56333e-04 1.80197e-03 1.80197e-03 1.60275e-06 1.60275e-06 +5.80000e+00 1.37924e-03 6.38137e-04 6.38137e-04 3.44882e-03 3.44882e-03 4.30290e-04 4.30290e-04 1.94223e-03 1.94223e-03 3.73991e-04 3.73991e-04 1.92617e-03 1.92617e-03 4.98731e-06 4.98731e-06 +5.90000e+00 1.45483e-03 7.55599e-04 7.55599e-04 3.49617e-03 3.49617e-03 5.11150e-04 5.11150e-04 2.06289e-03 2.06289e-03 3.97725e-04 3.97725e-04 1.87370e-03 1.87370e-03 1.25727e-05 1.25727e-05 +6.00000e+00 1.53948e-03 7.70601e-04 7.70601e-04 3.19202e-03 3.19202e-03 5.29865e-04 5.29865e-04 1.94599e-03 1.94599e-03 4.05916e-04 4.05916e-04 1.70002e-03 1.70002e-03 2.56570e-05 2.56570e-05 +6.10000e+00 1.58568e-03 6.73822e-04 6.73822e-04 2.66436e-03 2.66436e-03 4.72139e-04 4.72139e-04 1.62943e-03 1.62943e-03 3.79582e-04 3.79582e-04 1.47514e-03 1.47514e-03 4.23429e-05 4.23429e-05 +6.20000e+00 1.51599e-03 5.04199e-04 5.04199e-04 2.06232e-03 2.06232e-03 3.61528e-04 3.61528e-04 1.21767e-03 1.21767e-03 3.17962e-04 3.17962e-04 1.22482e-03 1.22482e-03 5.64558e-05 5.64558e-05 +6.30000e+00 1.28486e-03 3.22258e-04 3.22258e-04 1.47827e-03 1.47827e-03 2.38643e-04 2.38643e-04 8.14408e-04 8.14408e-04 2.36637e-04 2.36637e-04 9.44342e-04 9.44342e-04 6.07488e-05 6.07488e-05 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/input.toml b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/input.toml new file mode 100644 index 00000000..086d37b0 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/input.toml @@ -0,0 +1,33 @@ +[base] +dimension = 9 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" +generate_rocking_curve = false + +[solver.config] +cal_number = [1, 2, 4, 6, 8] +surface_exec_file = "../../bin/surf.exe" + +[solver.post] +normalization = "MANY_BEAM" +weight_type = "calc" +Rfactor_type = "A2" +omega = 0.5 +remove_work_dir = false + +[solver.param] +string_list = ["value_01", "value_02","value_03", "value_04","value_05", "value_06", "value_07","value_08", "value_09"] + +[solver.reference] +path = "experiment.txt" +exp_number = [1, 2, 4, 6, 8] + +[algorithm] +name = "mapper" +label_list = ["X1", "X2", "X3", "Y3", "Z1", "Z2", "Z3", "Z4", "Z5"] + +[algorithm.param] +mesh_path = "MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/prepare.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/ref_ColorMap.txt new file mode 100644 index 00000000..81dd323e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/ref_ColorMap.txt @@ -0,0 +1,10 @@ +0.500000 1.000000 1.500000 1.500000 5.400000 4.800000 3.800000 2.100000 2.000000 0.000000 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.001948 +4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.001807 +5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.001807 +5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.001808 +5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.001948 +5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 0.002115 +5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 0.002115 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 0.002114 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 0.001927 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/template.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/template.txt new file mode 100644 index 00000000..8469cd87 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_calc_A2/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.2,0.15 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2,1.7,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, value_01, 1.00000, value_05 ,IELM(I),ocr(I),X(I),Y(I),Z(I +1, 1.0, value_02, 1.00000, value_06 +2, 1.0, value_03, value_04, value_07 +2, 1.0, 2.00000, 1.49751, value_08 +2, 1.0, 1.00000, 1.50000, value_09 +2, 1.0, 0.00000, 1.00000, 0.849425 +2, 1.0, 2.00000, 1.00000, 0.809425 +2, 1.0, 1.00997, 1.00000, 0.599425 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/MeshData.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/MeshData.txt new file mode 100644 index 00000000..71d1b50c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/MeshData.txt @@ -0,0 +1,10 @@ +0 0.5 1.0 1.5 1.5 5.4 4.8 3.8 2.1 2.0 +1 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +2 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +3 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 +4 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 5.0 +5 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 5.0 +6 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 5.0 +7 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 5.0 +8 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 5.0 +9 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.0 5.0 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/bulk.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/bulk.txt new file mode 100644 index 00000000..a321798b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/bulk.txt @@ -0,0 +1,14 @@ +2,1,2 ,NH,NK,NDOM, -------- Ge(001) bulk +7,15 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0,0,1,0,-1,0,2,0,-2,0,3,0,-3 ,(IH(I),IK(I),I=1,NB) +0,0,1,0,-1,0,2,0,-2,0,3,0,-3,0,4,0,-4,0,5,0,-5,0,6,0,-6,0,7,0,-7,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.3,6.3,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.1,100 ,DZ,ML +1 ,NELM +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.01319,4.01319,90,2.83770,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.12833 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.70948 ,IELM(I),ocr(I),X(I),Y(I),Z(I) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/do.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/do.sh new file mode 100644 index 00000000..9f194c24 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/do.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +#time $CMD input.toml +time mpiexec -np 4 $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/experiment.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/experiment.txt new file mode 100644 index 00000000..d2075d33 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/experiment.txt @@ -0,0 +1,61 @@ +3.00000e-01 8.20372e-03 2.54229e-06 2.54229e-06 9.88860e-15 9.88860e-15 6.88084e-33 6.88084e-33 4.60049e-54 4.60049e-54 4.51983e-87 4.51983e-87 3.53221e-125 3.53221e-125 2.28323e-173 2.28323e-173 +4.00000e-01 1.14751e-02 1.04244e-05 1.04244e-05 2.49203e-13 2.49203e-13 1.26542e-30 1.26542e-30 4.98289e-51 4.98289e-51 3.60151e-83 3.60151e-83 2.07188e-120 2.07188e-120 9.85900e-168 9.85900e-168 +5.00000e-01 1.46340e-02 3.58730e-05 3.58730e-05 5.04417e-12 5.04417e-12 1.86515e-28 1.86515e-28 4.32416e-48 4.32416e-48 2.29890e-79 2.29890e-79 9.73541e-116 9.73541e-116 3.41025e-162 3.41025e-162 +6.00000e-01 1.74036e-02 1.04606e-04 1.04606e-04 8.20593e-11 8.20593e-11 2.20358e-26 2.20358e-26 3.00666e-45 3.00666e-45 1.17553e-75 1.17553e-75 3.66450e-111 3.66450e-111 9.44952e-157 9.44952e-157 +7.00000e-01 1.96261e-02 2.61079e-04 2.61079e-04 1.07379e-09 1.07379e-09 2.08711e-24 2.08711e-24 1.67514e-42 1.67514e-42 4.81525e-72 4.81525e-72 1.10496e-106 1.10496e-106 2.09751e-151 2.09751e-151 +8.00000e-01 2.11810e-02 5.62998e-04 5.62998e-04 1.13137e-08 1.13137e-08 1.58509e-22 1.58509e-22 7.47877e-40 7.47877e-40 1.58009e-68 1.58009e-68 2.66901e-102 2.66901e-102 3.72967e-146 3.72967e-146 +9.00000e-01 2.19506e-02 1.05701e-03 1.05701e-03 9.61019e-08 9.61019e-08 9.65510e-21 9.65510e-21 2.67582e-37 2.67582e-37 4.15360e-65 4.15360e-65 5.16449e-98 5.16449e-98 5.31259e-141 5.31259e-141 +1.00000e+00 2.18837e-02 1.73666e-03 1.73666e-03 6.59148e-07 6.59148e-07 4.71837e-19 4.71837e-19 7.67314e-35 7.67314e-35 8.74678e-62 8.74678e-62 8.00527e-94 8.00527e-94 6.06197e-136 6.06197e-136 +1.10000e+00 2.11118e-02 2.50352e-03 2.50352e-03 3.65776e-06 3.65776e-06 1.85068e-17 1.85068e-17 1.76374e-32 1.76374e-32 1.47555e-58 1.47555e-58 9.94026e-90 9.94026e-90 5.54106e-131 5.54106e-131 +1.20000e+00 2.00197e-02 3.17036e-03 3.17036e-03 1.64630e-05 1.64630e-05 5.82895e-16 5.82895e-16 3.25019e-30 3.25019e-30 1.99411e-55 1.99411e-55 9.88767e-86 9.88767e-86 4.05736e-126 4.05736e-126 +1.30000e+00 1.91652e-02 3.53255e-03 3.53255e-03 6.02887e-05 6.02887e-05 1.47520e-14 1.47520e-14 4.80262e-28 4.80262e-28 2.15890e-52 2.15890e-52 7.87888e-82 7.87888e-82 2.37994e-121 2.37994e-121 +1.40000e+00 1.90127e-02 3.48189e-03 3.48189e-03 1.80376e-04 1.80376e-04 3.00236e-13 3.00236e-13 5.69175e-26 5.69175e-26 1.87246e-49 1.87246e-49 5.02934e-78 5.02934e-78 1.11831e-116 1.11831e-116 +1.50000e+00 1.95992e-02 3.08705e-03 3.08705e-03 4.43302e-04 4.43302e-04 4.91905e-12 4.91905e-12 5.41178e-24 5.41178e-24 1.30105e-46 1.30105e-46 2.57178e-74 2.57178e-74 4.20947e-112 4.20947e-112 +1.60000e+00 2.03890e-02 2.57618e-03 2.57618e-03 9.01644e-04 9.01644e-04 6.49662e-11 6.49662e-11 4.12970e-22 4.12970e-22 7.24244e-44 7.24244e-44 1.05351e-70 1.05351e-70 1.26931e-107 1.26931e-107 +1.70000e+00 2.05290e-02 2.22146e-03 2.22146e-03 1.53385e-03 1.53385e-03 6.92826e-10 6.92826e-10 2.53031e-20 2.53031e-20 3.22996e-41 3.22996e-41 3.45717e-67 3.45717e-67 3.06607e-103 3.06607e-103 +1.80000e+00 1.94096e-02 2.18932e-03 2.18932e-03 2.21633e-03 2.21633e-03 5.97919e-09 5.97919e-09 1.24551e-18 1.24551e-18 1.15409e-38 1.15409e-38 9.08840e-64 9.08840e-64 5.93296e-99 5.93296e-99 +1.90000e+00 1.71097e-02 2.45030e-03 2.45030e-03 2.78148e-03 2.78148e-03 4.18750e-08 4.18750e-08 4.92860e-17 4.92860e-17 3.30394e-36 3.30394e-36 1.91400e-60 1.91400e-60 9.19679e-95 9.19679e-95 +2.00000e+00 1.43591e-02 2.81912e-03 2.81912e-03 3.12490e-03 3.12490e-03 2.38836e-07 2.38836e-07 1.56913e-15 1.56913e-15 7.57864e-34 7.57864e-34 3.22913e-57 3.22913e-57 1.14203e-90 1.14203e-90 +2.10000e+00 1.20865e-02 3.10041e-03 3.10041e-03 3.25578e-03 3.25578e-03 1.11435e-06 1.11435e-06 4.02329e-14 4.02329e-14 1.39297e-31 1.39297e-31 4.36442e-54 4.36442e-54 1.13605e-86 1.13605e-86 +2.20000e+00 1.09633e-02 3.21399e-03 3.21399e-03 3.24916e-03 3.24916e-03 4.27726e-06 4.27726e-06 8.31769e-13 8.31769e-13 2.05172e-29 2.05172e-29 4.72574e-51 4.72574e-51 9.05318e-83 9.05318e-83 +2.30000e+00 1.12236e-02 3.19005e-03 3.19005e-03 3.17788e-03 3.17788e-03 1.36022e-05 1.36022e-05 1.38846e-11 1.38846e-11 2.42190e-27 2.42190e-27 4.09943e-48 4.09943e-48 5.77945e-79 5.77945e-79 +2.40000e+00 1.26847e-02 3.06482e-03 3.06482e-03 3.10461e-03 3.10461e-03 3.61631e-05 3.61631e-05 1.87457e-10 1.87457e-10 2.29143e-25 2.29143e-25 2.84903e-45 2.84903e-45 2.95569e-75 2.95569e-75 +2.50000e+00 1.47993e-02 2.81322e-03 2.81322e-03 3.10625e-03 3.10625e-03 8.13202e-05 8.13202e-05 2.05098e-09 2.05098e-09 1.73793e-23 1.73793e-23 1.58637e-42 1.58637e-42 1.21094e-71 1.21094e-71 +2.60000e+00 1.67805e-02 2.39686e-03 2.39686e-03 3.24955e-03 3.24955e-03 1.57036e-04 1.57036e-04 1.82269e-08 1.82269e-08 1.05686e-21 1.05686e-21 7.07715e-40 7.07715e-40 3.97449e-68 3.97449e-68 +2.70000e+00 1.79264e-02 1.85723e-03 1.85723e-03 3.51557e-03 3.51557e-03 2.65495e-04 2.65495e-04 1.31923e-07 1.31923e-07 5.15425e-20 5.15425e-20 2.52977e-37 2.52977e-37 1.04506e-64 1.04506e-64 +2.80000e+00 1.79907e-02 1.33093e-03 1.33093e-03 3.76876e-03 3.76876e-03 4.01966e-04 4.01966e-04 7.80115e-07 7.80115e-07 2.01655e-18 2.01655e-18 7.24591e-35 7.24591e-35 2.20148e-61 2.20148e-61 +2.90000e+00 1.72421e-02 9.65817e-04 9.65817e-04 3.83828e-03 3.83828e-03 5.57429e-04 5.57429e-04 3.78303e-06 3.78303e-06 6.33181e-17 6.33181e-17 1.66313e-32 1.66313e-32 3.71541e-58 3.71541e-58 +3.00000e+00 1.61322e-02 8.30083e-04 8.30083e-04 3.64961e-03 3.64961e-03 7.20742e-04 7.20742e-04 1.51116e-05 1.51116e-05 1.59643e-15 1.59643e-15 3.05929e-30 3.05929e-30 5.02379e-55 5.02379e-55 +3.10000e+00 1.49123e-02 8.92997e-04 8.92997e-04 3.27932e-03 3.27932e-03 8.78263e-04 8.78263e-04 5.00004e-05 5.00004e-05 3.23432e-14 3.23432e-14 4.51043e-28 4.51043e-28 5.44257e-52 5.44257e-52 +3.20000e+00 1.35465e-02 1.06737e-03 1.06737e-03 2.88348e-03 2.88348e-03 1.01433e-03 1.01433e-03 1.37994e-04 1.37994e-04 5.27039e-13 5.27039e-13 5.33063e-26 5.33063e-26 4.72436e-49 4.72436e-49 +3.30000e+00 1.19172e-02 1.26022e-03 1.26022e-03 2.57067e-03 2.57067e-03 1.11335e-03 1.11335e-03 3.20529e-04 3.20529e-04 6.91671e-12 6.91671e-12 5.05096e-24 5.05096e-24 3.28603e-46 3.28603e-46 +3.40000e+00 1.00537e-02 1.40135e-03 1.40135e-03 2.33714e-03 2.33714e-03 1.15940e-03 1.15940e-03 6.33766e-04 6.33766e-04 7.32418e-11 7.32418e-11 3.83791e-22 3.83791e-22 1.83156e-43 1.83156e-43 +3.50000e+00 8.17053e-03 1.45385e-03 1.45385e-03 2.12304e-03 2.12304e-03 1.13607e-03 1.13607e-03 1.08143e-03 1.08143e-03 6.27478e-10 6.27478e-10 2.33911e-20 2.33911e-20 8.18137e-41 8.18137e-41 +3.60000e+00 6.53572e-03 1.41927e-03 1.41927e-03 1.92999e-03 1.92999e-03 1.03519e-03 1.03519e-03 1.61626e-03 1.61626e-03 4.36723e-09 4.36723e-09 1.14389e-18 1.14389e-18 2.92909e-38 2.92909e-38 +3.70000e+00 5.35999e-03 1.33367e-03 1.33367e-03 1.86928e-03 1.86928e-03 8.70233e-04 8.70233e-04 2.14410e-03 2.14410e-03 2.48549e-08 2.48549e-08 4.49016e-17 4.49016e-17 8.40612e-36 8.40612e-36 +3.80000e+00 4.81712e-03 1.24066e-03 1.24066e-03 2.07870e-03 2.07870e-03 6.75861e-04 6.75861e-04 2.54646e-03 2.54646e-03 1.16900e-07 1.16900e-07 1.41547e-15 1.41547e-15 1.93413e-33 1.93413e-33 +3.90000e+00 5.09106e-03 1.15259e-03 1.15259e-03 2.58615e-03 2.58615e-03 4.89391e-04 4.89391e-04 2.71476e-03 2.71476e-03 4.62218e-07 4.62218e-07 3.58560e-14 3.58560e-14 3.56849e-31 3.56849e-31 +4.00000e+00 6.27917e-03 1.04113e-03 1.04113e-03 3.25723e-03 3.25723e-03 3.33325e-04 3.33325e-04 2.59542e-03 2.59542e-03 1.57650e-06 1.57650e-06 7.30420e-13 7.30420e-13 5.28077e-29 5.28077e-29 +4.10000e+00 8.18460e-03 8.74899e-04 8.74899e-04 3.88244e-03 3.88244e-03 2.14609e-04 2.14609e-04 2.22842e-03 2.22842e-03 4.79133e-06 4.79133e-06 1.19766e-11 1.19766e-11 6.26976e-27 6.26976e-27 +4.20000e+00 1.02521e-02 6.63215e-04 6.63215e-04 4.31701e-03 4.31701e-03 1.33479e-04 1.33479e-04 1.74106e-03 1.74106e-03 1.33460e-05 1.33460e-05 1.58248e-10 1.58248e-10 5.97443e-25 5.97443e-25 +4.30000e+00 1.18201e-02 4.56534e-04 4.56534e-04 4.53705e-03 4.53705e-03 8.83076e-05 8.83076e-05 1.28846e-03 1.28846e-03 3.43304e-05 3.43304e-05 1.68730e-09 1.68730e-09 4.57109e-23 4.57109e-23 +4.40000e+00 1.25166e-02 3.07901e-04 3.07901e-04 4.58438e-03 4.58438e-03 7.48076e-05 7.48076e-05 9.85554e-04 9.85554e-04 8.01387e-05 8.01387e-05 1.45425e-08 1.45425e-08 2.80956e-21 2.80956e-21 +4.50000e+00 1.24346e-02 2.39831e-04 2.39831e-04 4.49553e-03 4.49553e-03 8.47877e-05 8.47877e-05 8.78596e-04 8.78596e-04 1.64859e-04 1.64859e-04 1.01531e-07 1.01531e-07 1.38807e-19 1.38807e-19 +4.60000e+00 1.19322e-02 2.40983e-04 2.40983e-04 4.28955e-03 4.28955e-03 1.06907e-04 1.06907e-04 9.55939e-04 9.55939e-04 2.91399e-04 2.91399e-04 5.75738e-07 5.75738e-07 5.51622e-18 5.51622e-18 +4.70000e+00 1.12782e-02 2.80574e-04 2.80574e-04 3.99474e-03 3.99474e-03 1.30423e-04 1.30423e-04 1.16635e-03 1.16635e-03 4.36262e-04 4.36262e-04 2.66058e-06 2.66058e-06 1.76470e-16 1.76470e-16 +4.80000e+00 1.04800e-02 3.23137e-04 3.23137e-04 3.66468e-03 3.66468e-03 1.51930e-04 1.51930e-04 1.42843e-03 1.42843e-03 5.51828e-04 5.51828e-04 1.00645e-05 1.00645e-05 4.54869e-15 4.54869e-15 +4.90000e+00 9.40087e-03 3.40575e-04 3.40575e-04 3.35809e-03 3.35809e-03 1.78878e-04 1.78878e-04 1.64275e-03 1.64275e-03 5.95529e-04 5.95529e-04 3.13600e-05 3.13600e-05 9.45602e-14 9.45602e-14 +5.00000e+00 7.98100e-03 3.21858e-04 3.21858e-04 3.09388e-03 3.09388e-03 2.21316e-04 2.21316e-04 1.72244e-03 1.72244e-03 5.62367e-04 5.62367e-04 8.12272e-05 8.12272e-05 1.58702e-12 1.58702e-12 +5.10000e+00 6.33564e-03 2.75141e-04 2.75141e-04 2.83349e-03 2.83349e-03 2.75830e-04 2.75830e-04 1.63475e-03 1.63475e-03 4.86986e-04 4.86986e-04 1.77338e-04 1.77338e-04 2.15260e-11 2.15260e-11 +5.20000e+00 4.69185e-03 2.20277e-04 2.20277e-04 2.53384e-03 2.53384e-03 3.20101e-04 3.20101e-04 1.42421e-03 1.42421e-03 4.14585e-04 4.14585e-04 3.33162e-04 3.33162e-04 2.36204e-10 2.36204e-10 +5.30000e+00 3.27797e-03 1.79027e-04 1.79027e-04 2.23107e-03 2.23107e-03 3.29667e-04 3.29667e-04 1.19533e-03 1.19533e-03 3.71111e-04 3.71111e-04 5.53645e-04 5.53645e-04 2.09869e-09 2.09869e-09 +5.40000e+00 2.24753e-03 1.70825e-04 1.70825e-04 2.05873e-03 2.05873e-03 3.03413e-04 3.03413e-04 1.06400e-03 1.06400e-03 3.55457e-04 3.55457e-04 8.37552e-04 8.37552e-04 1.51103e-08 1.51103e-08 +5.50000e+00 1.64073e-03 2.12816e-04 2.12816e-04 2.15862e-03 2.15862e-03 2.71480e-04 2.71480e-04 1.10647e-03 1.10647e-03 3.52311e-04 3.52311e-04 1.17414e-03 1.17414e-03 8.82030e-08 8.82030e-08 +5.60000e+00 1.38305e-03 3.15679e-04 3.15679e-04 2.54923e-03 2.54923e-03 2.75242e-04 2.75242e-04 1.32726e-03 1.32726e-03 3.51425e-04 3.51425e-04 1.52290e-03 1.52290e-03 4.17530e-07 4.17530e-07 +5.70000e+00 1.33614e-03 4.70705e-04 4.70705e-04 3.06735e-03 3.06735e-03 3.34875e-04 3.34875e-04 1.65095e-03 1.65095e-03 3.56333e-04 3.56333e-04 1.80197e-03 1.80197e-03 1.60275e-06 1.60275e-06 +5.80000e+00 1.37924e-03 6.38137e-04 6.38137e-04 3.44882e-03 3.44882e-03 4.30290e-04 4.30290e-04 1.94223e-03 1.94223e-03 3.73991e-04 3.73991e-04 1.92617e-03 1.92617e-03 4.98731e-06 4.98731e-06 +5.90000e+00 1.45483e-03 7.55599e-04 7.55599e-04 3.49617e-03 3.49617e-03 5.11150e-04 5.11150e-04 2.06289e-03 2.06289e-03 3.97725e-04 3.97725e-04 1.87370e-03 1.87370e-03 1.25727e-05 1.25727e-05 +6.00000e+00 1.53948e-03 7.70601e-04 7.70601e-04 3.19202e-03 3.19202e-03 5.29865e-04 5.29865e-04 1.94599e-03 1.94599e-03 4.05916e-04 4.05916e-04 1.70002e-03 1.70002e-03 2.56570e-05 2.56570e-05 +6.10000e+00 1.58568e-03 6.73822e-04 6.73822e-04 2.66436e-03 2.66436e-03 4.72139e-04 4.72139e-04 1.62943e-03 1.62943e-03 3.79582e-04 3.79582e-04 1.47514e-03 1.47514e-03 4.23429e-05 4.23429e-05 +6.20000e+00 1.51599e-03 5.04199e-04 5.04199e-04 2.06232e-03 2.06232e-03 3.61528e-04 3.61528e-04 1.21767e-03 1.21767e-03 3.17962e-04 3.17962e-04 1.22482e-03 1.22482e-03 5.64558e-05 5.64558e-05 +6.30000e+00 1.28486e-03 3.22258e-04 3.22258e-04 1.47827e-03 1.47827e-03 2.38643e-04 2.38643e-04 8.14408e-04 8.14408e-04 2.36637e-04 2.36637e-04 9.44342e-04 9.44342e-04 6.07488e-05 6.07488e-05 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/input.toml b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/input.toml new file mode 100644 index 00000000..f1de777f --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/input.toml @@ -0,0 +1,34 @@ +[base] +dimension = 9 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" +generate_rocking_curve = false + +[solver.config] +cal_number = [1, 2, 4, 6, 8] +surface_exec_file = "../../bin/surf.exe" + +[solver.post] +normalization = "MANY_BEAM" +weight_type = "manual" +Rfactor_type = "A2" +omega = 0.5 +spot_weight = [0.933, 0.026, 0.036, 0.003, 0.002] +remove_work_dir = false + +[solver.param] +string_list = ["value_01", "value_02","value_03", "value_04","value_05", "value_06", "value_07","value_08", "value_09"] + +[solver.reference] +path = "experiment.txt" +exp_number = [1, 2, 4, 6, 8] + +[algorithm] +name = "mapper" +label_list = ["X1", "X2", "X3", "Y3", "Z1", "Z2", "Z3", "Z4", "Z5"] + +[algorithm.param] +mesh_path = "MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/prepare.sh b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/ref_ColorMap.txt new file mode 100644 index 00000000..46550f5a --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/ref_ColorMap.txt @@ -0,0 +1,10 @@ +0.500000 1.000000 1.500000 1.500000 5.400000 4.800000 3.800000 2.100000 2.000000 0.000000 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.003431 +4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.003161 +5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.003161 +5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.003163 +5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 5.000000 0.003431 +5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 5.000000 0.003575 +5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 5.000000 0.003575 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 5.000000 0.003571 +5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 4.000000 5.000000 0.004136 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/template.txt b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/template.txt new file mode 100644 index 00000000..8469cd87 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/mapper_weight_manual/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.2,0.15 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2,1.7,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, value_01, 1.00000, value_05 ,IELM(I),ocr(I),X(I),Y(I),Z(I +1, 1.0, value_02, 1.00000, value_06 +2, 1.0, value_03, value_04, value_07 +2, 1.0, 2.00000, 1.49751, value_08 +2, 1.0, 1.00000, 1.50000, value_09 +2, 1.0, 0.00000, 1.00000, 0.849425 +2, 1.0, 2.00000, 1.00000, 0.809425 +2, 1.0, 1.00997, 1.00000, 0.599425 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/bulk.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/bulk.txt new file mode 100644 index 00000000..a321798b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/bulk.txt @@ -0,0 +1,14 @@ +2,1,2 ,NH,NK,NDOM, -------- Ge(001) bulk +7,15 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0,0,1,0,-1,0,2,0,-2,0,3,0,-3 ,(IH(I),IK(I),I=1,NB) +0,0,1,0,-1,0,2,0,-2,0,3,0,-3,0,4,0,-4,0,5,0,-5,0,6,0,-6,0,7,0,-7,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.3,6.3,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.1,100 ,DZ,ML +1 ,NELM +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.01319,4.01319,90,2.83770,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.12833 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.70948 ,IELM(I),ocr(I),X(I),Y(I),Z(I) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/do.sh b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/do.sh new file mode 100644 index 00000000..3551b228 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/do.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +export PYTHONUNBUFFERED=1 + +sh prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/res.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/experiment.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/experiment.txt new file mode 100644 index 00000000..d2075d33 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/experiment.txt @@ -0,0 +1,61 @@ +3.00000e-01 8.20372e-03 2.54229e-06 2.54229e-06 9.88860e-15 9.88860e-15 6.88084e-33 6.88084e-33 4.60049e-54 4.60049e-54 4.51983e-87 4.51983e-87 3.53221e-125 3.53221e-125 2.28323e-173 2.28323e-173 +4.00000e-01 1.14751e-02 1.04244e-05 1.04244e-05 2.49203e-13 2.49203e-13 1.26542e-30 1.26542e-30 4.98289e-51 4.98289e-51 3.60151e-83 3.60151e-83 2.07188e-120 2.07188e-120 9.85900e-168 9.85900e-168 +5.00000e-01 1.46340e-02 3.58730e-05 3.58730e-05 5.04417e-12 5.04417e-12 1.86515e-28 1.86515e-28 4.32416e-48 4.32416e-48 2.29890e-79 2.29890e-79 9.73541e-116 9.73541e-116 3.41025e-162 3.41025e-162 +6.00000e-01 1.74036e-02 1.04606e-04 1.04606e-04 8.20593e-11 8.20593e-11 2.20358e-26 2.20358e-26 3.00666e-45 3.00666e-45 1.17553e-75 1.17553e-75 3.66450e-111 3.66450e-111 9.44952e-157 9.44952e-157 +7.00000e-01 1.96261e-02 2.61079e-04 2.61079e-04 1.07379e-09 1.07379e-09 2.08711e-24 2.08711e-24 1.67514e-42 1.67514e-42 4.81525e-72 4.81525e-72 1.10496e-106 1.10496e-106 2.09751e-151 2.09751e-151 +8.00000e-01 2.11810e-02 5.62998e-04 5.62998e-04 1.13137e-08 1.13137e-08 1.58509e-22 1.58509e-22 7.47877e-40 7.47877e-40 1.58009e-68 1.58009e-68 2.66901e-102 2.66901e-102 3.72967e-146 3.72967e-146 +9.00000e-01 2.19506e-02 1.05701e-03 1.05701e-03 9.61019e-08 9.61019e-08 9.65510e-21 9.65510e-21 2.67582e-37 2.67582e-37 4.15360e-65 4.15360e-65 5.16449e-98 5.16449e-98 5.31259e-141 5.31259e-141 +1.00000e+00 2.18837e-02 1.73666e-03 1.73666e-03 6.59148e-07 6.59148e-07 4.71837e-19 4.71837e-19 7.67314e-35 7.67314e-35 8.74678e-62 8.74678e-62 8.00527e-94 8.00527e-94 6.06197e-136 6.06197e-136 +1.10000e+00 2.11118e-02 2.50352e-03 2.50352e-03 3.65776e-06 3.65776e-06 1.85068e-17 1.85068e-17 1.76374e-32 1.76374e-32 1.47555e-58 1.47555e-58 9.94026e-90 9.94026e-90 5.54106e-131 5.54106e-131 +1.20000e+00 2.00197e-02 3.17036e-03 3.17036e-03 1.64630e-05 1.64630e-05 5.82895e-16 5.82895e-16 3.25019e-30 3.25019e-30 1.99411e-55 1.99411e-55 9.88767e-86 9.88767e-86 4.05736e-126 4.05736e-126 +1.30000e+00 1.91652e-02 3.53255e-03 3.53255e-03 6.02887e-05 6.02887e-05 1.47520e-14 1.47520e-14 4.80262e-28 4.80262e-28 2.15890e-52 2.15890e-52 7.87888e-82 7.87888e-82 2.37994e-121 2.37994e-121 +1.40000e+00 1.90127e-02 3.48189e-03 3.48189e-03 1.80376e-04 1.80376e-04 3.00236e-13 3.00236e-13 5.69175e-26 5.69175e-26 1.87246e-49 1.87246e-49 5.02934e-78 5.02934e-78 1.11831e-116 1.11831e-116 +1.50000e+00 1.95992e-02 3.08705e-03 3.08705e-03 4.43302e-04 4.43302e-04 4.91905e-12 4.91905e-12 5.41178e-24 5.41178e-24 1.30105e-46 1.30105e-46 2.57178e-74 2.57178e-74 4.20947e-112 4.20947e-112 +1.60000e+00 2.03890e-02 2.57618e-03 2.57618e-03 9.01644e-04 9.01644e-04 6.49662e-11 6.49662e-11 4.12970e-22 4.12970e-22 7.24244e-44 7.24244e-44 1.05351e-70 1.05351e-70 1.26931e-107 1.26931e-107 +1.70000e+00 2.05290e-02 2.22146e-03 2.22146e-03 1.53385e-03 1.53385e-03 6.92826e-10 6.92826e-10 2.53031e-20 2.53031e-20 3.22996e-41 3.22996e-41 3.45717e-67 3.45717e-67 3.06607e-103 3.06607e-103 +1.80000e+00 1.94096e-02 2.18932e-03 2.18932e-03 2.21633e-03 2.21633e-03 5.97919e-09 5.97919e-09 1.24551e-18 1.24551e-18 1.15409e-38 1.15409e-38 9.08840e-64 9.08840e-64 5.93296e-99 5.93296e-99 +1.90000e+00 1.71097e-02 2.45030e-03 2.45030e-03 2.78148e-03 2.78148e-03 4.18750e-08 4.18750e-08 4.92860e-17 4.92860e-17 3.30394e-36 3.30394e-36 1.91400e-60 1.91400e-60 9.19679e-95 9.19679e-95 +2.00000e+00 1.43591e-02 2.81912e-03 2.81912e-03 3.12490e-03 3.12490e-03 2.38836e-07 2.38836e-07 1.56913e-15 1.56913e-15 7.57864e-34 7.57864e-34 3.22913e-57 3.22913e-57 1.14203e-90 1.14203e-90 +2.10000e+00 1.20865e-02 3.10041e-03 3.10041e-03 3.25578e-03 3.25578e-03 1.11435e-06 1.11435e-06 4.02329e-14 4.02329e-14 1.39297e-31 1.39297e-31 4.36442e-54 4.36442e-54 1.13605e-86 1.13605e-86 +2.20000e+00 1.09633e-02 3.21399e-03 3.21399e-03 3.24916e-03 3.24916e-03 4.27726e-06 4.27726e-06 8.31769e-13 8.31769e-13 2.05172e-29 2.05172e-29 4.72574e-51 4.72574e-51 9.05318e-83 9.05318e-83 +2.30000e+00 1.12236e-02 3.19005e-03 3.19005e-03 3.17788e-03 3.17788e-03 1.36022e-05 1.36022e-05 1.38846e-11 1.38846e-11 2.42190e-27 2.42190e-27 4.09943e-48 4.09943e-48 5.77945e-79 5.77945e-79 +2.40000e+00 1.26847e-02 3.06482e-03 3.06482e-03 3.10461e-03 3.10461e-03 3.61631e-05 3.61631e-05 1.87457e-10 1.87457e-10 2.29143e-25 2.29143e-25 2.84903e-45 2.84903e-45 2.95569e-75 2.95569e-75 +2.50000e+00 1.47993e-02 2.81322e-03 2.81322e-03 3.10625e-03 3.10625e-03 8.13202e-05 8.13202e-05 2.05098e-09 2.05098e-09 1.73793e-23 1.73793e-23 1.58637e-42 1.58637e-42 1.21094e-71 1.21094e-71 +2.60000e+00 1.67805e-02 2.39686e-03 2.39686e-03 3.24955e-03 3.24955e-03 1.57036e-04 1.57036e-04 1.82269e-08 1.82269e-08 1.05686e-21 1.05686e-21 7.07715e-40 7.07715e-40 3.97449e-68 3.97449e-68 +2.70000e+00 1.79264e-02 1.85723e-03 1.85723e-03 3.51557e-03 3.51557e-03 2.65495e-04 2.65495e-04 1.31923e-07 1.31923e-07 5.15425e-20 5.15425e-20 2.52977e-37 2.52977e-37 1.04506e-64 1.04506e-64 +2.80000e+00 1.79907e-02 1.33093e-03 1.33093e-03 3.76876e-03 3.76876e-03 4.01966e-04 4.01966e-04 7.80115e-07 7.80115e-07 2.01655e-18 2.01655e-18 7.24591e-35 7.24591e-35 2.20148e-61 2.20148e-61 +2.90000e+00 1.72421e-02 9.65817e-04 9.65817e-04 3.83828e-03 3.83828e-03 5.57429e-04 5.57429e-04 3.78303e-06 3.78303e-06 6.33181e-17 6.33181e-17 1.66313e-32 1.66313e-32 3.71541e-58 3.71541e-58 +3.00000e+00 1.61322e-02 8.30083e-04 8.30083e-04 3.64961e-03 3.64961e-03 7.20742e-04 7.20742e-04 1.51116e-05 1.51116e-05 1.59643e-15 1.59643e-15 3.05929e-30 3.05929e-30 5.02379e-55 5.02379e-55 +3.10000e+00 1.49123e-02 8.92997e-04 8.92997e-04 3.27932e-03 3.27932e-03 8.78263e-04 8.78263e-04 5.00004e-05 5.00004e-05 3.23432e-14 3.23432e-14 4.51043e-28 4.51043e-28 5.44257e-52 5.44257e-52 +3.20000e+00 1.35465e-02 1.06737e-03 1.06737e-03 2.88348e-03 2.88348e-03 1.01433e-03 1.01433e-03 1.37994e-04 1.37994e-04 5.27039e-13 5.27039e-13 5.33063e-26 5.33063e-26 4.72436e-49 4.72436e-49 +3.30000e+00 1.19172e-02 1.26022e-03 1.26022e-03 2.57067e-03 2.57067e-03 1.11335e-03 1.11335e-03 3.20529e-04 3.20529e-04 6.91671e-12 6.91671e-12 5.05096e-24 5.05096e-24 3.28603e-46 3.28603e-46 +3.40000e+00 1.00537e-02 1.40135e-03 1.40135e-03 2.33714e-03 2.33714e-03 1.15940e-03 1.15940e-03 6.33766e-04 6.33766e-04 7.32418e-11 7.32418e-11 3.83791e-22 3.83791e-22 1.83156e-43 1.83156e-43 +3.50000e+00 8.17053e-03 1.45385e-03 1.45385e-03 2.12304e-03 2.12304e-03 1.13607e-03 1.13607e-03 1.08143e-03 1.08143e-03 6.27478e-10 6.27478e-10 2.33911e-20 2.33911e-20 8.18137e-41 8.18137e-41 +3.60000e+00 6.53572e-03 1.41927e-03 1.41927e-03 1.92999e-03 1.92999e-03 1.03519e-03 1.03519e-03 1.61626e-03 1.61626e-03 4.36723e-09 4.36723e-09 1.14389e-18 1.14389e-18 2.92909e-38 2.92909e-38 +3.70000e+00 5.35999e-03 1.33367e-03 1.33367e-03 1.86928e-03 1.86928e-03 8.70233e-04 8.70233e-04 2.14410e-03 2.14410e-03 2.48549e-08 2.48549e-08 4.49016e-17 4.49016e-17 8.40612e-36 8.40612e-36 +3.80000e+00 4.81712e-03 1.24066e-03 1.24066e-03 2.07870e-03 2.07870e-03 6.75861e-04 6.75861e-04 2.54646e-03 2.54646e-03 1.16900e-07 1.16900e-07 1.41547e-15 1.41547e-15 1.93413e-33 1.93413e-33 +3.90000e+00 5.09106e-03 1.15259e-03 1.15259e-03 2.58615e-03 2.58615e-03 4.89391e-04 4.89391e-04 2.71476e-03 2.71476e-03 4.62218e-07 4.62218e-07 3.58560e-14 3.58560e-14 3.56849e-31 3.56849e-31 +4.00000e+00 6.27917e-03 1.04113e-03 1.04113e-03 3.25723e-03 3.25723e-03 3.33325e-04 3.33325e-04 2.59542e-03 2.59542e-03 1.57650e-06 1.57650e-06 7.30420e-13 7.30420e-13 5.28077e-29 5.28077e-29 +4.10000e+00 8.18460e-03 8.74899e-04 8.74899e-04 3.88244e-03 3.88244e-03 2.14609e-04 2.14609e-04 2.22842e-03 2.22842e-03 4.79133e-06 4.79133e-06 1.19766e-11 1.19766e-11 6.26976e-27 6.26976e-27 +4.20000e+00 1.02521e-02 6.63215e-04 6.63215e-04 4.31701e-03 4.31701e-03 1.33479e-04 1.33479e-04 1.74106e-03 1.74106e-03 1.33460e-05 1.33460e-05 1.58248e-10 1.58248e-10 5.97443e-25 5.97443e-25 +4.30000e+00 1.18201e-02 4.56534e-04 4.56534e-04 4.53705e-03 4.53705e-03 8.83076e-05 8.83076e-05 1.28846e-03 1.28846e-03 3.43304e-05 3.43304e-05 1.68730e-09 1.68730e-09 4.57109e-23 4.57109e-23 +4.40000e+00 1.25166e-02 3.07901e-04 3.07901e-04 4.58438e-03 4.58438e-03 7.48076e-05 7.48076e-05 9.85554e-04 9.85554e-04 8.01387e-05 8.01387e-05 1.45425e-08 1.45425e-08 2.80956e-21 2.80956e-21 +4.50000e+00 1.24346e-02 2.39831e-04 2.39831e-04 4.49553e-03 4.49553e-03 8.47877e-05 8.47877e-05 8.78596e-04 8.78596e-04 1.64859e-04 1.64859e-04 1.01531e-07 1.01531e-07 1.38807e-19 1.38807e-19 +4.60000e+00 1.19322e-02 2.40983e-04 2.40983e-04 4.28955e-03 4.28955e-03 1.06907e-04 1.06907e-04 9.55939e-04 9.55939e-04 2.91399e-04 2.91399e-04 5.75738e-07 5.75738e-07 5.51622e-18 5.51622e-18 +4.70000e+00 1.12782e-02 2.80574e-04 2.80574e-04 3.99474e-03 3.99474e-03 1.30423e-04 1.30423e-04 1.16635e-03 1.16635e-03 4.36262e-04 4.36262e-04 2.66058e-06 2.66058e-06 1.76470e-16 1.76470e-16 +4.80000e+00 1.04800e-02 3.23137e-04 3.23137e-04 3.66468e-03 3.66468e-03 1.51930e-04 1.51930e-04 1.42843e-03 1.42843e-03 5.51828e-04 5.51828e-04 1.00645e-05 1.00645e-05 4.54869e-15 4.54869e-15 +4.90000e+00 9.40087e-03 3.40575e-04 3.40575e-04 3.35809e-03 3.35809e-03 1.78878e-04 1.78878e-04 1.64275e-03 1.64275e-03 5.95529e-04 5.95529e-04 3.13600e-05 3.13600e-05 9.45602e-14 9.45602e-14 +5.00000e+00 7.98100e-03 3.21858e-04 3.21858e-04 3.09388e-03 3.09388e-03 2.21316e-04 2.21316e-04 1.72244e-03 1.72244e-03 5.62367e-04 5.62367e-04 8.12272e-05 8.12272e-05 1.58702e-12 1.58702e-12 +5.10000e+00 6.33564e-03 2.75141e-04 2.75141e-04 2.83349e-03 2.83349e-03 2.75830e-04 2.75830e-04 1.63475e-03 1.63475e-03 4.86986e-04 4.86986e-04 1.77338e-04 1.77338e-04 2.15260e-11 2.15260e-11 +5.20000e+00 4.69185e-03 2.20277e-04 2.20277e-04 2.53384e-03 2.53384e-03 3.20101e-04 3.20101e-04 1.42421e-03 1.42421e-03 4.14585e-04 4.14585e-04 3.33162e-04 3.33162e-04 2.36204e-10 2.36204e-10 +5.30000e+00 3.27797e-03 1.79027e-04 1.79027e-04 2.23107e-03 2.23107e-03 3.29667e-04 3.29667e-04 1.19533e-03 1.19533e-03 3.71111e-04 3.71111e-04 5.53645e-04 5.53645e-04 2.09869e-09 2.09869e-09 +5.40000e+00 2.24753e-03 1.70825e-04 1.70825e-04 2.05873e-03 2.05873e-03 3.03413e-04 3.03413e-04 1.06400e-03 1.06400e-03 3.55457e-04 3.55457e-04 8.37552e-04 8.37552e-04 1.51103e-08 1.51103e-08 +5.50000e+00 1.64073e-03 2.12816e-04 2.12816e-04 2.15862e-03 2.15862e-03 2.71480e-04 2.71480e-04 1.10647e-03 1.10647e-03 3.52311e-04 3.52311e-04 1.17414e-03 1.17414e-03 8.82030e-08 8.82030e-08 +5.60000e+00 1.38305e-03 3.15679e-04 3.15679e-04 2.54923e-03 2.54923e-03 2.75242e-04 2.75242e-04 1.32726e-03 1.32726e-03 3.51425e-04 3.51425e-04 1.52290e-03 1.52290e-03 4.17530e-07 4.17530e-07 +5.70000e+00 1.33614e-03 4.70705e-04 4.70705e-04 3.06735e-03 3.06735e-03 3.34875e-04 3.34875e-04 1.65095e-03 1.65095e-03 3.56333e-04 3.56333e-04 1.80197e-03 1.80197e-03 1.60275e-06 1.60275e-06 +5.80000e+00 1.37924e-03 6.38137e-04 6.38137e-04 3.44882e-03 3.44882e-03 4.30290e-04 4.30290e-04 1.94223e-03 1.94223e-03 3.73991e-04 3.73991e-04 1.92617e-03 1.92617e-03 4.98731e-06 4.98731e-06 +5.90000e+00 1.45483e-03 7.55599e-04 7.55599e-04 3.49617e-03 3.49617e-03 5.11150e-04 5.11150e-04 2.06289e-03 2.06289e-03 3.97725e-04 3.97725e-04 1.87370e-03 1.87370e-03 1.25727e-05 1.25727e-05 +6.00000e+00 1.53948e-03 7.70601e-04 7.70601e-04 3.19202e-03 3.19202e-03 5.29865e-04 5.29865e-04 1.94599e-03 1.94599e-03 4.05916e-04 4.05916e-04 1.70002e-03 1.70002e-03 2.56570e-05 2.56570e-05 +6.10000e+00 1.58568e-03 6.73822e-04 6.73822e-04 2.66436e-03 2.66436e-03 4.72139e-04 4.72139e-04 1.62943e-03 1.62943e-03 3.79582e-04 3.79582e-04 1.47514e-03 1.47514e-03 4.23429e-05 4.23429e-05 +6.20000e+00 1.51599e-03 5.04199e-04 5.04199e-04 2.06232e-03 2.06232e-03 3.61528e-04 3.61528e-04 1.21767e-03 1.21767e-03 3.17962e-04 3.17962e-04 1.22482e-03 1.22482e-03 5.64558e-05 5.64558e-05 +6.30000e+00 1.28486e-03 3.22258e-04 3.22258e-04 1.47827e-03 1.47827e-03 2.38643e-04 2.38643e-04 8.14408e-04 8.14408e-04 2.36637e-04 2.36637e-04 9.44342e-04 9.44342e-04 6.07488e-05 6.07488e-05 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/input.toml b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/input.toml new file mode 100644 index 00000000..4116bd95 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/input.toml @@ -0,0 +1,42 @@ +[base] +dimension = 9 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1, 2, 4, 6, 8] +surface_template_file = "template.txt" +surface_exec_file = "../../bin/surf.exe" + +[solver.post] +normalization = "MANY_BEAM" +weight_type = "calc" +Rfactor_type = "A2" +omega = 0.5 +remove_work_dir = false + +[solver.param] +string_list = ["value_01", "value_02", "value_03", "value_04", "value_05", "value_06", "value_07", "value_08", "value_09"] + +[solver.reference] +path = "experiment.txt" +exp_number = [1, 2, 4, 6, 8] + +[algorithm] +name = "minsearch" +label_list = ["X1", "X2", "X3", "Y3","Z1", "Z2", "Z3", "Z4", "Z5"] + +[algorithm.param] +initial_list = [0.49800, 0.98000, 1.49800, 1.49800, 5.390000, 4.790000, 3.790000, 2.090000, 1.990000] +min_list = [0.00000, 0.50000, 1.00000, 1.00000, 4.400000, 3.800000, 2.800000, 1.100000, 1.000000] +max_list = [1.00000, 1.50000, 2.00000, 2.00000, 6.400000, 5.800000, 4.800000, 3.100000, 3.000000] + +[algorithm.minimize] +fatol = 0.01 +xatol = 0.001 +initial_scale_list = [ 0.0025, 0.0025, 0.0025, 0.0025, 0.01, 0.01, 0.01, 0.01, 0.01 ] +maxiter = 1000 +maxfev = 10000 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/prepare.sh b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/ref.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/ref.txt new file mode 100644 index 00000000..f09ca5b0 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/ref.txt @@ -0,0 +1,10 @@ +fx = 6.393840542398249e-09 +X1 = 0.5004690263563492 +X2 = 0.9864825395902956 +X3 = 1.500736054255837 +Y3 = 1.49846022838361 +Z1 = 5.401681359233681 +Z2 = 4.801963397208427 +Z3 = 3.8008746121421977 +Z4 = 2.1004447161065523 +Z5 = 2.000919674433793 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/template.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/template.txt new file mode 100644 index 00000000..8469cd87 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_calc/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.2,0.15 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2,1.7,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, value_01, 1.00000, value_05 ,IELM(I),ocr(I),X(I),Y(I),Z(I +1, 1.0, value_02, 1.00000, value_06 +2, 1.0, value_03, value_04, value_07 +2, 1.0, 2.00000, 1.49751, value_08 +2, 1.0, 1.00000, 1.50000, value_09 +2, 1.0, 0.00000, 1.00000, 0.849425 +2, 1.0, 2.00000, 1.00000, 0.809425 +2, 1.0, 1.00997, 1.00000, 0.599425 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/bulk.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/bulk.txt new file mode 100644 index 00000000..a321798b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/bulk.txt @@ -0,0 +1,14 @@ +2,1,2 ,NH,NK,NDOM, -------- Ge(001) bulk +7,15 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0,0,1,0,-1,0,2,0,-2,0,3,0,-3 ,(IH(I),IK(I),I=1,NB) +0,0,1,0,-1,0,2,0,-2,0,3,0,-3,0,4,0,-4,0,5,0,-5,0,6,0,-6,0,7,0,-7,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.3,6.3,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.1,100 ,DZ,ML +1 ,NELM +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.01319,4.01319,90,2.83770,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.12833 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.70948 ,IELM(I),ocr(I),X(I),Y(I),Z(I) diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/do.sh b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/do.sh new file mode 100644 index 00000000..3551b228 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/do.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +export PYTHONUNBUFFERED=1 + +sh prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/res.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/experiment.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/experiment.txt new file mode 100644 index 00000000..d2075d33 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/experiment.txt @@ -0,0 +1,61 @@ +3.00000e-01 8.20372e-03 2.54229e-06 2.54229e-06 9.88860e-15 9.88860e-15 6.88084e-33 6.88084e-33 4.60049e-54 4.60049e-54 4.51983e-87 4.51983e-87 3.53221e-125 3.53221e-125 2.28323e-173 2.28323e-173 +4.00000e-01 1.14751e-02 1.04244e-05 1.04244e-05 2.49203e-13 2.49203e-13 1.26542e-30 1.26542e-30 4.98289e-51 4.98289e-51 3.60151e-83 3.60151e-83 2.07188e-120 2.07188e-120 9.85900e-168 9.85900e-168 +5.00000e-01 1.46340e-02 3.58730e-05 3.58730e-05 5.04417e-12 5.04417e-12 1.86515e-28 1.86515e-28 4.32416e-48 4.32416e-48 2.29890e-79 2.29890e-79 9.73541e-116 9.73541e-116 3.41025e-162 3.41025e-162 +6.00000e-01 1.74036e-02 1.04606e-04 1.04606e-04 8.20593e-11 8.20593e-11 2.20358e-26 2.20358e-26 3.00666e-45 3.00666e-45 1.17553e-75 1.17553e-75 3.66450e-111 3.66450e-111 9.44952e-157 9.44952e-157 +7.00000e-01 1.96261e-02 2.61079e-04 2.61079e-04 1.07379e-09 1.07379e-09 2.08711e-24 2.08711e-24 1.67514e-42 1.67514e-42 4.81525e-72 4.81525e-72 1.10496e-106 1.10496e-106 2.09751e-151 2.09751e-151 +8.00000e-01 2.11810e-02 5.62998e-04 5.62998e-04 1.13137e-08 1.13137e-08 1.58509e-22 1.58509e-22 7.47877e-40 7.47877e-40 1.58009e-68 1.58009e-68 2.66901e-102 2.66901e-102 3.72967e-146 3.72967e-146 +9.00000e-01 2.19506e-02 1.05701e-03 1.05701e-03 9.61019e-08 9.61019e-08 9.65510e-21 9.65510e-21 2.67582e-37 2.67582e-37 4.15360e-65 4.15360e-65 5.16449e-98 5.16449e-98 5.31259e-141 5.31259e-141 +1.00000e+00 2.18837e-02 1.73666e-03 1.73666e-03 6.59148e-07 6.59148e-07 4.71837e-19 4.71837e-19 7.67314e-35 7.67314e-35 8.74678e-62 8.74678e-62 8.00527e-94 8.00527e-94 6.06197e-136 6.06197e-136 +1.10000e+00 2.11118e-02 2.50352e-03 2.50352e-03 3.65776e-06 3.65776e-06 1.85068e-17 1.85068e-17 1.76374e-32 1.76374e-32 1.47555e-58 1.47555e-58 9.94026e-90 9.94026e-90 5.54106e-131 5.54106e-131 +1.20000e+00 2.00197e-02 3.17036e-03 3.17036e-03 1.64630e-05 1.64630e-05 5.82895e-16 5.82895e-16 3.25019e-30 3.25019e-30 1.99411e-55 1.99411e-55 9.88767e-86 9.88767e-86 4.05736e-126 4.05736e-126 +1.30000e+00 1.91652e-02 3.53255e-03 3.53255e-03 6.02887e-05 6.02887e-05 1.47520e-14 1.47520e-14 4.80262e-28 4.80262e-28 2.15890e-52 2.15890e-52 7.87888e-82 7.87888e-82 2.37994e-121 2.37994e-121 +1.40000e+00 1.90127e-02 3.48189e-03 3.48189e-03 1.80376e-04 1.80376e-04 3.00236e-13 3.00236e-13 5.69175e-26 5.69175e-26 1.87246e-49 1.87246e-49 5.02934e-78 5.02934e-78 1.11831e-116 1.11831e-116 +1.50000e+00 1.95992e-02 3.08705e-03 3.08705e-03 4.43302e-04 4.43302e-04 4.91905e-12 4.91905e-12 5.41178e-24 5.41178e-24 1.30105e-46 1.30105e-46 2.57178e-74 2.57178e-74 4.20947e-112 4.20947e-112 +1.60000e+00 2.03890e-02 2.57618e-03 2.57618e-03 9.01644e-04 9.01644e-04 6.49662e-11 6.49662e-11 4.12970e-22 4.12970e-22 7.24244e-44 7.24244e-44 1.05351e-70 1.05351e-70 1.26931e-107 1.26931e-107 +1.70000e+00 2.05290e-02 2.22146e-03 2.22146e-03 1.53385e-03 1.53385e-03 6.92826e-10 6.92826e-10 2.53031e-20 2.53031e-20 3.22996e-41 3.22996e-41 3.45717e-67 3.45717e-67 3.06607e-103 3.06607e-103 +1.80000e+00 1.94096e-02 2.18932e-03 2.18932e-03 2.21633e-03 2.21633e-03 5.97919e-09 5.97919e-09 1.24551e-18 1.24551e-18 1.15409e-38 1.15409e-38 9.08840e-64 9.08840e-64 5.93296e-99 5.93296e-99 +1.90000e+00 1.71097e-02 2.45030e-03 2.45030e-03 2.78148e-03 2.78148e-03 4.18750e-08 4.18750e-08 4.92860e-17 4.92860e-17 3.30394e-36 3.30394e-36 1.91400e-60 1.91400e-60 9.19679e-95 9.19679e-95 +2.00000e+00 1.43591e-02 2.81912e-03 2.81912e-03 3.12490e-03 3.12490e-03 2.38836e-07 2.38836e-07 1.56913e-15 1.56913e-15 7.57864e-34 7.57864e-34 3.22913e-57 3.22913e-57 1.14203e-90 1.14203e-90 +2.10000e+00 1.20865e-02 3.10041e-03 3.10041e-03 3.25578e-03 3.25578e-03 1.11435e-06 1.11435e-06 4.02329e-14 4.02329e-14 1.39297e-31 1.39297e-31 4.36442e-54 4.36442e-54 1.13605e-86 1.13605e-86 +2.20000e+00 1.09633e-02 3.21399e-03 3.21399e-03 3.24916e-03 3.24916e-03 4.27726e-06 4.27726e-06 8.31769e-13 8.31769e-13 2.05172e-29 2.05172e-29 4.72574e-51 4.72574e-51 9.05318e-83 9.05318e-83 +2.30000e+00 1.12236e-02 3.19005e-03 3.19005e-03 3.17788e-03 3.17788e-03 1.36022e-05 1.36022e-05 1.38846e-11 1.38846e-11 2.42190e-27 2.42190e-27 4.09943e-48 4.09943e-48 5.77945e-79 5.77945e-79 +2.40000e+00 1.26847e-02 3.06482e-03 3.06482e-03 3.10461e-03 3.10461e-03 3.61631e-05 3.61631e-05 1.87457e-10 1.87457e-10 2.29143e-25 2.29143e-25 2.84903e-45 2.84903e-45 2.95569e-75 2.95569e-75 +2.50000e+00 1.47993e-02 2.81322e-03 2.81322e-03 3.10625e-03 3.10625e-03 8.13202e-05 8.13202e-05 2.05098e-09 2.05098e-09 1.73793e-23 1.73793e-23 1.58637e-42 1.58637e-42 1.21094e-71 1.21094e-71 +2.60000e+00 1.67805e-02 2.39686e-03 2.39686e-03 3.24955e-03 3.24955e-03 1.57036e-04 1.57036e-04 1.82269e-08 1.82269e-08 1.05686e-21 1.05686e-21 7.07715e-40 7.07715e-40 3.97449e-68 3.97449e-68 +2.70000e+00 1.79264e-02 1.85723e-03 1.85723e-03 3.51557e-03 3.51557e-03 2.65495e-04 2.65495e-04 1.31923e-07 1.31923e-07 5.15425e-20 5.15425e-20 2.52977e-37 2.52977e-37 1.04506e-64 1.04506e-64 +2.80000e+00 1.79907e-02 1.33093e-03 1.33093e-03 3.76876e-03 3.76876e-03 4.01966e-04 4.01966e-04 7.80115e-07 7.80115e-07 2.01655e-18 2.01655e-18 7.24591e-35 7.24591e-35 2.20148e-61 2.20148e-61 +2.90000e+00 1.72421e-02 9.65817e-04 9.65817e-04 3.83828e-03 3.83828e-03 5.57429e-04 5.57429e-04 3.78303e-06 3.78303e-06 6.33181e-17 6.33181e-17 1.66313e-32 1.66313e-32 3.71541e-58 3.71541e-58 +3.00000e+00 1.61322e-02 8.30083e-04 8.30083e-04 3.64961e-03 3.64961e-03 7.20742e-04 7.20742e-04 1.51116e-05 1.51116e-05 1.59643e-15 1.59643e-15 3.05929e-30 3.05929e-30 5.02379e-55 5.02379e-55 +3.10000e+00 1.49123e-02 8.92997e-04 8.92997e-04 3.27932e-03 3.27932e-03 8.78263e-04 8.78263e-04 5.00004e-05 5.00004e-05 3.23432e-14 3.23432e-14 4.51043e-28 4.51043e-28 5.44257e-52 5.44257e-52 +3.20000e+00 1.35465e-02 1.06737e-03 1.06737e-03 2.88348e-03 2.88348e-03 1.01433e-03 1.01433e-03 1.37994e-04 1.37994e-04 5.27039e-13 5.27039e-13 5.33063e-26 5.33063e-26 4.72436e-49 4.72436e-49 +3.30000e+00 1.19172e-02 1.26022e-03 1.26022e-03 2.57067e-03 2.57067e-03 1.11335e-03 1.11335e-03 3.20529e-04 3.20529e-04 6.91671e-12 6.91671e-12 5.05096e-24 5.05096e-24 3.28603e-46 3.28603e-46 +3.40000e+00 1.00537e-02 1.40135e-03 1.40135e-03 2.33714e-03 2.33714e-03 1.15940e-03 1.15940e-03 6.33766e-04 6.33766e-04 7.32418e-11 7.32418e-11 3.83791e-22 3.83791e-22 1.83156e-43 1.83156e-43 +3.50000e+00 8.17053e-03 1.45385e-03 1.45385e-03 2.12304e-03 2.12304e-03 1.13607e-03 1.13607e-03 1.08143e-03 1.08143e-03 6.27478e-10 6.27478e-10 2.33911e-20 2.33911e-20 8.18137e-41 8.18137e-41 +3.60000e+00 6.53572e-03 1.41927e-03 1.41927e-03 1.92999e-03 1.92999e-03 1.03519e-03 1.03519e-03 1.61626e-03 1.61626e-03 4.36723e-09 4.36723e-09 1.14389e-18 1.14389e-18 2.92909e-38 2.92909e-38 +3.70000e+00 5.35999e-03 1.33367e-03 1.33367e-03 1.86928e-03 1.86928e-03 8.70233e-04 8.70233e-04 2.14410e-03 2.14410e-03 2.48549e-08 2.48549e-08 4.49016e-17 4.49016e-17 8.40612e-36 8.40612e-36 +3.80000e+00 4.81712e-03 1.24066e-03 1.24066e-03 2.07870e-03 2.07870e-03 6.75861e-04 6.75861e-04 2.54646e-03 2.54646e-03 1.16900e-07 1.16900e-07 1.41547e-15 1.41547e-15 1.93413e-33 1.93413e-33 +3.90000e+00 5.09106e-03 1.15259e-03 1.15259e-03 2.58615e-03 2.58615e-03 4.89391e-04 4.89391e-04 2.71476e-03 2.71476e-03 4.62218e-07 4.62218e-07 3.58560e-14 3.58560e-14 3.56849e-31 3.56849e-31 +4.00000e+00 6.27917e-03 1.04113e-03 1.04113e-03 3.25723e-03 3.25723e-03 3.33325e-04 3.33325e-04 2.59542e-03 2.59542e-03 1.57650e-06 1.57650e-06 7.30420e-13 7.30420e-13 5.28077e-29 5.28077e-29 +4.10000e+00 8.18460e-03 8.74899e-04 8.74899e-04 3.88244e-03 3.88244e-03 2.14609e-04 2.14609e-04 2.22842e-03 2.22842e-03 4.79133e-06 4.79133e-06 1.19766e-11 1.19766e-11 6.26976e-27 6.26976e-27 +4.20000e+00 1.02521e-02 6.63215e-04 6.63215e-04 4.31701e-03 4.31701e-03 1.33479e-04 1.33479e-04 1.74106e-03 1.74106e-03 1.33460e-05 1.33460e-05 1.58248e-10 1.58248e-10 5.97443e-25 5.97443e-25 +4.30000e+00 1.18201e-02 4.56534e-04 4.56534e-04 4.53705e-03 4.53705e-03 8.83076e-05 8.83076e-05 1.28846e-03 1.28846e-03 3.43304e-05 3.43304e-05 1.68730e-09 1.68730e-09 4.57109e-23 4.57109e-23 +4.40000e+00 1.25166e-02 3.07901e-04 3.07901e-04 4.58438e-03 4.58438e-03 7.48076e-05 7.48076e-05 9.85554e-04 9.85554e-04 8.01387e-05 8.01387e-05 1.45425e-08 1.45425e-08 2.80956e-21 2.80956e-21 +4.50000e+00 1.24346e-02 2.39831e-04 2.39831e-04 4.49553e-03 4.49553e-03 8.47877e-05 8.47877e-05 8.78596e-04 8.78596e-04 1.64859e-04 1.64859e-04 1.01531e-07 1.01531e-07 1.38807e-19 1.38807e-19 +4.60000e+00 1.19322e-02 2.40983e-04 2.40983e-04 4.28955e-03 4.28955e-03 1.06907e-04 1.06907e-04 9.55939e-04 9.55939e-04 2.91399e-04 2.91399e-04 5.75738e-07 5.75738e-07 5.51622e-18 5.51622e-18 +4.70000e+00 1.12782e-02 2.80574e-04 2.80574e-04 3.99474e-03 3.99474e-03 1.30423e-04 1.30423e-04 1.16635e-03 1.16635e-03 4.36262e-04 4.36262e-04 2.66058e-06 2.66058e-06 1.76470e-16 1.76470e-16 +4.80000e+00 1.04800e-02 3.23137e-04 3.23137e-04 3.66468e-03 3.66468e-03 1.51930e-04 1.51930e-04 1.42843e-03 1.42843e-03 5.51828e-04 5.51828e-04 1.00645e-05 1.00645e-05 4.54869e-15 4.54869e-15 +4.90000e+00 9.40087e-03 3.40575e-04 3.40575e-04 3.35809e-03 3.35809e-03 1.78878e-04 1.78878e-04 1.64275e-03 1.64275e-03 5.95529e-04 5.95529e-04 3.13600e-05 3.13600e-05 9.45602e-14 9.45602e-14 +5.00000e+00 7.98100e-03 3.21858e-04 3.21858e-04 3.09388e-03 3.09388e-03 2.21316e-04 2.21316e-04 1.72244e-03 1.72244e-03 5.62367e-04 5.62367e-04 8.12272e-05 8.12272e-05 1.58702e-12 1.58702e-12 +5.10000e+00 6.33564e-03 2.75141e-04 2.75141e-04 2.83349e-03 2.83349e-03 2.75830e-04 2.75830e-04 1.63475e-03 1.63475e-03 4.86986e-04 4.86986e-04 1.77338e-04 1.77338e-04 2.15260e-11 2.15260e-11 +5.20000e+00 4.69185e-03 2.20277e-04 2.20277e-04 2.53384e-03 2.53384e-03 3.20101e-04 3.20101e-04 1.42421e-03 1.42421e-03 4.14585e-04 4.14585e-04 3.33162e-04 3.33162e-04 2.36204e-10 2.36204e-10 +5.30000e+00 3.27797e-03 1.79027e-04 1.79027e-04 2.23107e-03 2.23107e-03 3.29667e-04 3.29667e-04 1.19533e-03 1.19533e-03 3.71111e-04 3.71111e-04 5.53645e-04 5.53645e-04 2.09869e-09 2.09869e-09 +5.40000e+00 2.24753e-03 1.70825e-04 1.70825e-04 2.05873e-03 2.05873e-03 3.03413e-04 3.03413e-04 1.06400e-03 1.06400e-03 3.55457e-04 3.55457e-04 8.37552e-04 8.37552e-04 1.51103e-08 1.51103e-08 +5.50000e+00 1.64073e-03 2.12816e-04 2.12816e-04 2.15862e-03 2.15862e-03 2.71480e-04 2.71480e-04 1.10647e-03 1.10647e-03 3.52311e-04 3.52311e-04 1.17414e-03 1.17414e-03 8.82030e-08 8.82030e-08 +5.60000e+00 1.38305e-03 3.15679e-04 3.15679e-04 2.54923e-03 2.54923e-03 2.75242e-04 2.75242e-04 1.32726e-03 1.32726e-03 3.51425e-04 3.51425e-04 1.52290e-03 1.52290e-03 4.17530e-07 4.17530e-07 +5.70000e+00 1.33614e-03 4.70705e-04 4.70705e-04 3.06735e-03 3.06735e-03 3.34875e-04 3.34875e-04 1.65095e-03 1.65095e-03 3.56333e-04 3.56333e-04 1.80197e-03 1.80197e-03 1.60275e-06 1.60275e-06 +5.80000e+00 1.37924e-03 6.38137e-04 6.38137e-04 3.44882e-03 3.44882e-03 4.30290e-04 4.30290e-04 1.94223e-03 1.94223e-03 3.73991e-04 3.73991e-04 1.92617e-03 1.92617e-03 4.98731e-06 4.98731e-06 +5.90000e+00 1.45483e-03 7.55599e-04 7.55599e-04 3.49617e-03 3.49617e-03 5.11150e-04 5.11150e-04 2.06289e-03 2.06289e-03 3.97725e-04 3.97725e-04 1.87370e-03 1.87370e-03 1.25727e-05 1.25727e-05 +6.00000e+00 1.53948e-03 7.70601e-04 7.70601e-04 3.19202e-03 3.19202e-03 5.29865e-04 5.29865e-04 1.94599e-03 1.94599e-03 4.05916e-04 4.05916e-04 1.70002e-03 1.70002e-03 2.56570e-05 2.56570e-05 +6.10000e+00 1.58568e-03 6.73822e-04 6.73822e-04 2.66436e-03 2.66436e-03 4.72139e-04 4.72139e-04 1.62943e-03 1.62943e-03 3.79582e-04 3.79582e-04 1.47514e-03 1.47514e-03 4.23429e-05 4.23429e-05 +6.20000e+00 1.51599e-03 5.04199e-04 5.04199e-04 2.06232e-03 2.06232e-03 3.61528e-04 3.61528e-04 1.21767e-03 1.21767e-03 3.17962e-04 3.17962e-04 1.22482e-03 1.22482e-03 5.64558e-05 5.64558e-05 +6.30000e+00 1.28486e-03 3.22258e-04 3.22258e-04 1.47827e-03 1.47827e-03 2.38643e-04 2.38643e-04 8.14408e-04 8.14408e-04 2.36637e-04 2.36637e-04 9.44342e-04 9.44342e-04 6.07488e-05 6.07488e-05 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/input.toml b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/input.toml new file mode 100644 index 00000000..008e967a --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/input.toml @@ -0,0 +1,42 @@ +[base] +dimension = 9 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1, 2, 4, 6, 8] +surface_exec_file = "../../bin/surf.exe" + +[solver.post] +normalization = "MANY_BEAM" +weight_type = "manual" +Rfactor_type = "A2" +omega = 0.5 +spot_weight = [0.933, 0.026, 0.036, 0.003, 0.002] +remove_work_dir = false + +[solver.param] +string_list = ["value_01", "value_02", "value_03", "value_04", "value_05", "value_06", "value_07", "value_08", "value_09"] + +[solver.reference] +path = "experiment.txt" +exp_number = [1, 2, 4, 6, 8] + +[algorithm] +name = "minsearch" +label_list = ["X1", "X2", "X3", "Y3","Z1", "Z2", "Z3", "Z4", "Z5"] + +[algorithm.param] +initial_list = [0.49800, 0.98000, 1.49800, 1.49800, 5.390000, 4.790000, 3.790000, 2.090000, 1.990000] +min_list = [0.00000, 0.50000, 1.00000, 1.00000, 4.400000, 3.800000, 2.800000, 1.100000, 1.000000] +max_list = [1.00000, 1.50000, 2.00000, 2.00000, 6.400000, 5.800000, 4.800000, 3.100000, 3.000000] + +[algorithm.minimize] +fatol = 0.01 +xatol = 0.001 +initial_scale_list = [ 0.0025, 0.0025, 0.0025, 0.0025, 0.01, 0.01, 0.01, 0.01, 0.01 ] +maxiter = 1000 +maxfev = 10000 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/prepare.sh b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/ref.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/ref.txt new file mode 100644 index 00000000..42dbedd6 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/ref.txt @@ -0,0 +1,10 @@ +fx = 9.038778472300684e-09 +X1 = 0.5005020046725166 +X2 = 0.98869323286312 +X3 = 1.5004206807677547 +Y3 = 1.4982051821768732 +Z1 = 5.400768705712512 +Z2 = 4.800786853391697 +Z3 = 3.800378633792033 +Z4 = 2.1001028103351684 +Z5 = 2.0002811485701972 diff --git a/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/template.txt b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/template.txt new file mode 100644 index 00000000..8469cd87 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/many_beam/minsearch_weight_manual/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.2,0.15 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.2,0.15 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2,1.7,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, value_01, 1.00000, value_05 ,IELM(I),ocr(I),X(I),Y(I),Z(I +1, 1.0, value_02, 1.00000, value_06 +2, 1.0, value_03, value_04, value_07 +2, 1.0, 2.00000, 1.49751, value_08 +2, 1.0, 1.00000, 1.50000, value_09 +2, 1.0, 0.00000, 1.00000, 0.849425 +2, 1.0, 2.00000, 1.00000, 0.809425 +2, 1.0, 1.00997, 1.00000, 0.599425 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/MeshData.txt b/extra/sim-trhepd-rheed/tests/single_beam/bayes/MeshData.txt new file mode 100644 index 00000000..d82d25a2 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/MeshData.txt @@ -0,0 +1,351 @@ +1 3.5 3.5 +2 3.6 3.5 +3 3.6 3.6 +4 3.7 3.5 +5 3.7 3.6 +6 3.7 3.7 +7 3.8 3.5 +8 3.8 3.6 +9 3.8 3.7 +10 3.8 3.8 +11 3.9 3.5 +12 3.9 3.6 +13 3.9 3.7 +14 3.9 3.8 +15 3.9 3.9 +16 4.0 3.5 +17 4.0 3.6 +18 4.0 3.7 +19 4.0 3.8 +20 4.0 3.9 +21 4.0 4.0 +22 4.1 3.5 +23 4.1 3.6 +24 4.1 3.7 +25 4.1 3.8 +26 4.1 3.9 +27 4.1 4.0 +28 4.1 4.1 +29 4.2 3.5 +30 4.2 3.6 +31 4.2 3.7 +32 4.2 3.8 +33 4.2 3.9 +34 4.2 4.0 +35 4.2 4.1 +36 4.2 4.2 +37 4.3 3.5 +38 4.3 3.6 +39 4.3 3.7 +40 4.3 3.8 +41 4.3 3.9 +42 4.3 4.0 +43 4.3 4.1 +44 4.3 4.2 +45 4.3 4.3 +46 4.4 3.5 +47 4.4 3.6 +48 4.4 3.7 +49 4.4 3.8 +50 4.4 3.9 +51 4.4 4.0 +52 4.4 4.1 +53 4.4 4.2 +54 4.4 4.3 +55 4.4 4.4 +56 4.5 3.5 +57 4.5 3.6 +58 4.5 3.7 +59 4.5 3.8 +60 4.5 3.9 +61 4.5 4.0 +62 4.5 4.1 +63 4.5 4.2 +64 4.5 4.3 +65 4.5 4.4 +66 4.5 4.5 +67 4.6 3.5 +68 4.6 3.6 +69 4.6 3.7 +70 4.6 3.8 +71 4.6 3.9 +72 4.6 4.0 +73 4.6 4.1 +74 4.6 4.2 +75 4.6 4.3 +76 4.6 4.4 +77 4.6 4.5 +78 4.6 4.6 +79 4.7 3.5 +80 4.7 3.6 +81 4.7 3.7 +82 4.7 3.8 +83 4.7 3.9 +84 4.7 4.0 +85 4.7 4.1 +86 4.7 4.2 +87 4.7 4.3 +88 4.7 4.4 +89 4.7 4.5 +90 4.7 4.6 +91 4.7 4.7 +92 4.8 3.5 +93 4.8 3.6 +94 4.8 3.7 +95 4.8 3.8 +96 4.8 3.9 +97 4.8 4.0 +98 4.8 4.1 +99 4.8 4.2 +100 4.8 4.3 +101 4.8 4.4 +102 4.8 4.5 +103 4.8 4.6 +104 4.8 4.7 +105 4.8 4.8 +106 4.9 3.5 +107 4.9 3.6 +108 4.9 3.7 +109 4.9 3.8 +110 4.9 3.9 +111 4.9 4.0 +112 4.9 4.1 +113 4.9 4.2 +114 4.9 4.3 +115 4.9 4.4 +116 4.9 4.5 +117 4.9 4.6 +118 4.9 4.7 +119 4.9 4.8 +120 4.9 4.9 +121 5.0 3.5 +122 5.0 3.6 +123 5.0 3.7 +124 5.0 3.8 +125 5.0 3.9 +126 5.0 4.0 +127 5.0 4.1 +128 5.0 4.2 +129 5.0 4.3 +130 5.0 4.4 +131 5.0 4.5 +132 5.0 4.6 +133 5.0 4.7 +134 5.0 4.8 +135 5.0 4.9 +136 5.0 5.0 +137 5.1 3.5 +138 5.1 3.6 +139 5.1 3.7 +140 5.1 3.8 +141 5.1 3.9 +142 5.1 4.0 +143 5.1 4.1 +144 5.1 4.2 +145 5.1 4.3 +146 5.1 4.4 +147 5.1 4.5 +148 5.1 4.6 +149 5.1 4.7 +150 5.1 4.8 +151 5.1 4.9 +152 5.1 5.0 +153 5.1 5.1 +154 5.2 3.5 +155 5.2 3.6 +156 5.2 3.7 +157 5.2 3.8 +158 5.2 3.9 +159 5.2 4.0 +160 5.2 4.1 +161 5.2 4.2 +162 5.2 4.3 +163 5.2 4.4 +164 5.2 4.5 +165 5.2 4.6 +166 5.2 4.7 +167 5.2 4.8 +168 5.2 4.9 +169 5.2 5.0 +170 5.2 5.1 +171 5.2 5.2 +172 5.3 3.5 +173 5.3 3.6 +174 5.3 3.7 +175 5.3 3.8 +176 5.3 3.9 +177 5.3 4.0 +178 5.3 4.1 +179 5.3 4.2 +180 5.3 4.3 +181 5.3 4.4 +182 5.3 4.5 +183 5.3 4.6 +184 5.3 4.7 +185 5.3 4.8 +186 5.3 4.9 +187 5.3 5.0 +188 5.3 5.1 +189 5.3 5.2 +190 5.3 5.3 +191 5.4 3.5 +192 5.4 3.6 +193 5.4 3.7 +194 5.4 3.8 +195 5.4 3.9 +196 5.4 4.0 +197 5.4 4.1 +198 5.4 4.2 +199 5.4 4.3 +200 5.4 4.4 +201 5.4 4.5 +202 5.4 4.6 +203 5.4 4.7 +204 5.4 4.8 +205 5.4 4.9 +206 5.4 5.0 +207 5.4 5.1 +208 5.4 5.2 +209 5.4 5.3 +210 5.4 5.4 +211 5.5 3.5 +212 5.5 3.6 +213 5.5 3.7 +214 5.5 3.8 +215 5.5 3.9 +216 5.5 4.0 +217 5.5 4.1 +218 5.5 4.2 +219 5.5 4.3 +220 5.5 4.4 +221 5.5 4.5 +222 5.5 4.6 +223 5.5 4.7 +224 5.5 4.8 +225 5.5 4.9 +226 5.5 5.0 +227 5.5 5.1 +228 5.5 5.2 +229 5.5 5.3 +230 5.5 5.4 +231 5.5 5.5 +232 5.6 3.5 +233 5.6 3.6 +234 5.6 3.7 +235 5.6 3.8 +236 5.6 3.9 +237 5.6 4.0 +238 5.6 4.1 +239 5.6 4.2 +240 5.6 4.3 +241 5.6 4.4 +242 5.6 4.5 +243 5.6 4.6 +244 5.6 4.7 +245 5.6 4.8 +246 5.6 4.9 +247 5.6 5.0 +248 5.6 5.1 +249 5.6 5.2 +250 5.6 5.3 +251 5.6 5.4 +252 5.6 5.5 +253 5.6 5.6 +254 5.7 3.5 +255 5.7 3.6 +256 5.7 3.7 +257 5.7 3.8 +258 5.7 3.9 +259 5.7 4.0 +260 5.7 4.1 +261 5.7 4.2 +262 5.7 4.3 +263 5.7 4.4 +264 5.7 4.5 +265 5.7 4.6 +266 5.7 4.7 +267 5.7 4.8 +268 5.7 4.9 +269 5.7 5.0 +270 5.7 5.1 +271 5.7 5.2 +272 5.7 5.3 +273 5.7 5.4 +274 5.7 5.5 +275 5.7 5.6 +276 5.7 5.7 +277 5.8 3.5 +278 5.8 3.6 +279 5.8 3.7 +280 5.8 3.8 +281 5.8 3.9 +282 5.8 4.0 +283 5.8 4.1 +284 5.8 4.2 +285 5.8 4.3 +286 5.8 4.4 +287 5.8 4.5 +288 5.8 4.6 +289 5.8 4.7 +290 5.8 4.8 +291 5.8 4.9 +292 5.8 5.0 +293 5.8 5.1 +294 5.8 5.2 +295 5.8 5.3 +296 5.8 5.4 +297 5.8 5.5 +298 5.8 5.6 +299 5.8 5.7 +300 5.8 5.8 +301 5.9 3.5 +302 5.9 3.6 +303 5.9 3.7 +304 5.9 3.8 +305 5.9 3.9 +306 5.9 4.0 +307 5.9 4.1 +308 5.9 4.2 +309 5.9 4.3 +310 5.9 4.4 +311 5.9 4.5 +312 5.9 4.6 +313 5.9 4.7 +314 5.9 4.8 +315 5.9 4.9 +316 5.9 5.0 +317 5.9 5.1 +318 5.9 5.2 +319 5.9 5.3 +320 5.9 5.4 +321 5.9 5.5 +322 5.9 5.6 +323 5.9 5.7 +324 5.9 5.8 +325 5.9 5.9 +326 6.0 3.5 +327 6.0 3.6 +328 6.0 3.7 +329 6.0 3.8 +330 6.0 3.9 +331 6.0 4.0 +332 6.0 4.1 +333 6.0 4.2 +334 6.0 4.3 +335 6.0 4.4 +336 6.0 4.5 +337 6.0 4.6 +338 6.0 4.7 +339 6.0 4.8 +340 6.0 4.9 +341 6.0 5.0 +342 6.0 5.1 +343 6.0 5.2 +344 6.0 5.3 +345 6.0 5.4 +346 6.0 5.5 +347 6.0 5.6 +348 6.0 5.7 +349 6.0 5.8 +350 6.0 5.9 +351 6.0 6.0 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/bayes/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/bayes/do.sh new file mode 100644 index 00000000..27dc5349 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/BayesData.txt +reference=ref_BayesData.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/bayes/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/bayes/input.toml new file mode 100644 index 00000000..1fc0bf7f --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/input.toml @@ -0,0 +1,33 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.post] +normalization = "TOTAL" + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[algorithm] +name = "bayes" +label_list = ["z1", "z2"] +seed = 1 + +[algorithm.param] +mesh_path = "./MeshData.txt" + +[algorithm.bayes] +random_max_num_probes = 10 +bayes_max_num_probes = 20 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/bayes/prepare.sh new file mode 100644 index 00000000..f4abaa75 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f ./bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/ref_BayesData.txt b/extra/sim-trhepd-rheed/tests/single_beam/bayes/ref_BayesData.txt new file mode 100644 index 00000000..01a4aba8 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/ref_BayesData.txt @@ -0,0 +1,31 @@ +#step z1 z2 fx z1_action z2_action fx_action +0 5.1 4.9 0.037235074743172454 5.1 4.9 0.037235074743172454 +1 5.1 4.9 0.037235074743172454 4.3 3.5 0.06050573551746842 +2 5.1 4.9 0.037235074743172454 5.3 3.9 0.062166147965171524 +3 5.1 4.9 0.037235074743172454 4.7 4.2 0.049214053630051165 +4 5.1 4.9 0.037235074743172454 5.7 3.7 0.08394928032443437 +5 5.1 4.9 0.037235074743172454 5.2 5.2 0.05555968530512952 +6 5.1 4.9 0.037235074743172454 5.7 4.0 0.07546814729086875 +7 5.1 4.9 0.037235074743172454 6.0 4.4 0.05475948027103236 +8 5.1 4.9 0.037235074743172454 6.0 4.2 0.06340246937861264 +9 5.1 4.9 0.037235074743172454 5.7 5.2 0.053481983788166224 +10 5.1 4.7 0.03002911266695604 5.1 4.7 0.03002911266695604 +11 5.1 4.7 0.03002911266695604 5.0 4.4 0.030197369985028977 +12 5.3 4.5 0.02887388382938813 5.3 4.5 0.02887388382938813 +13 5.1 4.5 0.025865942161583205 5.1 4.5 0.025865942161583205 +14 5.2 4.4 0.02030947496767003 5.2 4.4 0.02030947496767003 +15 5.2 4.4 0.02030947496767003 5.2 4.6 0.023292070309454356 +16 5.2 4.4 0.02030947496767003 5.2 4.5 0.02346140561647057 +17 5.2 4.4 0.02030947496767003 5.1 4.4 0.022562987243107263 +18 5.2 4.4 0.02030947496767003 5.3 4.4 0.025442804284880622 +19 5.2 4.4 0.02030947496767003 5.1 4.6 0.027786263593583452 +20 5.2 4.3 0.01257638416660778 5.2 4.3 0.01257638416660778 +21 5.1 4.2 0.01021525608348611 5.1 4.2 0.01021525608348611 +22 5.1 4.2 0.01021525608348611 5.2 4.2 0.013185160407763272 +23 5.1 4.2 0.01021525608348611 5.1 4.3 0.01603857086925361 +24 5.1 4.2 0.01021525608348611 5.1 4.1 0.019162277030800867 +25 5.1 4.2 0.01021525608348611 5.0 4.2 0.020730041825922894 +26 5.1 4.2 0.01021525608348611 5.2 4.1 0.02768347196467913 +27 5.1 4.2 0.01021525608348611 4.9 3.7 0.05389772132512104 +28 5.1 4.2 0.01021525608348611 5.0 4.1 0.02067681958885218 +29 5.1 4.2 0.01021525608348611 5.3 4.3 0.020245107903776354 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/bayes/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/bayes/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/bayes/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/exchange/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/exchange/do.sh new file mode 100644 index 00000000..d9683d3e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time mpiexec -np 4 $CMD input.toml + +result=output/best_result.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/exchange/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/exchange/input.toml new file mode 100644 index 00000000..b01540b2 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/input.toml @@ -0,0 +1,37 @@ +[base] +dimension = 2 +output_dir = "output" + +[algorithm] +name = "exchange" +label_list = ["z1", "z2"] +seed = 12345 + +[algorithm.param] +min_list = [3.0, 3.0] +max_list = [6.0, 6.0] + +[algorithm.exchange] +numsteps = 1000 +numsteps_exchange = 20 +Tmin = 0.005 +Tmax = 0.05 +Tlogspace = true + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[solver.post] +normalization = "TOTAL" diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/exchange/prepare.sh new file mode 100644 index 00000000..f4abaa75 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f ./bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/ref.txt b/extra/sim-trhepd-rheed/tests/single_beam/exchange/ref.txt new file mode 100644 index 00000000..b6db089b --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/ref.txt @@ -0,0 +1,7 @@ +nprocs = 4 +rank = 1 +step = 282 +walker = 0 +fx = 0.008415217647192712 +z1 = 5.164773671165013 +z2 = 4.226467514644945 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/exchange/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/exchange/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/exchange/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/MeshData.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper/MeshData.txt new file mode 100644 index 00000000..fcb034f2 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/MeshData.txt @@ -0,0 +1,66 @@ +1 6.000000 6.000000 +2 6.000000 5.750000 +3 6.000000 5.500000 +4 6.000000 5.250000 +5 6.000000 5.000000 +6 6.000000 4.750000 +7 6.000000 4.500000 +8 6.000000 4.250000 +9 6.000000 4.000000 +10 6.000000 3.750000 +11 6.000000 3.500000 +12 5.750000 5.750000 +13 5.750000 5.500000 +14 5.750000 5.250000 +15 5.750000 5.000000 +16 5.750000 4.750000 +17 5.750000 4.500000 +18 5.750000 4.250000 +19 5.750000 4.000000 +20 5.750000 3.750000 +21 5.750000 3.500000 +22 5.500000 5.500000 +23 5.500000 5.250000 +24 5.500000 5.000000 +25 5.500000 4.750000 +26 5.500000 4.500000 +27 5.500000 4.250000 +28 5.500000 4.000000 +29 5.500000 3.750000 +30 5.500000 3.500000 +31 5.250000 5.250000 +32 5.250000 5.000000 +33 5.250000 4.750000 +34 5.250000 4.500000 +35 5.250000 4.250000 +36 5.250000 4.000000 +37 5.250000 3.750000 +38 5.250000 3.500000 +39 5.000000 5.000000 +40 5.000000 4.750000 +41 5.000000 4.500000 +42 5.000000 4.250000 +43 5.000000 4.000000 +44 5.000000 3.750000 +45 5.000000 3.500000 +46 4.750000 4.750000 +47 4.750000 4.500000 +48 4.750000 4.250000 +49 4.750000 4.000000 +50 4.750000 3.750000 +51 4.750000 3.500000 +52 4.500000 4.500000 +53 4.500000 4.250000 +54 4.500000 4.000000 +55 4.500000 3.750000 +56 4.500000 3.500000 +57 4.250000 4.250000 +58 4.250000 4.000000 +59 4.250000 3.750000 +60 4.250000 3.500000 +61 4.000000 4.000000 +62 4.000000 3.750000 +63 4.000000 3.500000 +64 3.750000 3.750000 +65 3.750000 3.500000 +66 3.500000 3.500000 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper/do.sh new file mode 100644 index 00000000..83bddafa --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time mpiexec -np 4 $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/mapper/input.toml new file mode 100644 index 00000000..cfc25253 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/input.toml @@ -0,0 +1,28 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.post] +normalization = "TOTAL" + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[algorithm] +name = "mapper" +label_list = ["z1", "z2"] + +[algorithm.param] +mesh_path = "./MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper/ref_ColorMap.txt new file mode 100644 index 00000000..a3cbc85e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/ref_ColorMap.txt @@ -0,0 +1,66 @@ +6.000000 6.000000 0.047846 +6.000000 5.750000 0.055009 +6.000000 5.500000 0.053194 +6.000000 5.250000 0.038903 +6.000000 5.000000 0.047676 +6.000000 4.750000 0.065922 +6.000000 4.500000 0.053673 +6.000000 4.250000 0.061259 +6.000000 4.000000 0.069352 +6.000000 3.750000 0.071867 +6.000000 3.500000 0.072730 +5.750000 5.750000 0.065353 +5.750000 5.500000 0.066828 +5.750000 5.250000 0.054689 +5.750000 5.000000 0.038405 +5.750000 4.750000 0.060613 +5.750000 4.500000 0.056340 +5.750000 4.250000 0.059283 +5.750000 4.000000 0.075594 +5.750000 3.750000 0.082130 +5.750000 3.500000 0.084815 +5.500000 5.500000 0.070998 +5.500000 5.250000 0.063473 +5.500000 5.000000 0.042935 +5.500000 4.750000 0.036995 +5.500000 4.500000 0.046668 +5.500000 4.250000 0.043790 +5.500000 4.000000 0.069106 +5.500000 3.750000 0.081188 +5.500000 3.500000 0.088012 +5.250000 5.250000 0.059773 +5.250000 5.000000 0.044562 +5.250000 4.750000 0.025415 +5.250000 4.500000 0.025355 +5.250000 4.250000 0.015197 +5.250000 4.000000 0.047524 +5.250000 3.750000 0.067863 +5.250000 3.500000 0.078097 +5.000000 5.000000 0.039906 +5.000000 4.750000 0.037154 +5.000000 4.500000 0.033463 +5.000000 4.250000 0.023122 +5.000000 4.000000 0.029220 +5.000000 3.750000 0.052800 +5.000000 3.500000 0.063470 +4.750000 4.750000 0.049717 +4.750000 4.500000 0.051418 +4.750000 4.250000 0.046464 +4.750000 4.000000 0.040708 +4.750000 3.750000 0.050734 +4.750000 3.500000 0.061679 +4.500000 4.500000 0.058291 +4.500000 4.250000 0.059305 +4.500000 4.000000 0.059127 +4.500000 3.750000 0.053183 +4.500000 3.500000 0.060732 +4.250000 4.250000 0.065582 +4.250000 4.000000 0.069906 +4.250000 3.750000 0.065922 +4.250000 3.500000 0.062103 +4.000000 4.000000 0.074717 +4.000000 3.750000 0.076795 +4.000000 3.500000 0.075043 +3.750000 3.750000 0.082498 +3.750000 3.500000 0.084603 +3.500000 3.500000 0.088998 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/MeshData.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/MeshData.txt new file mode 100644 index 00000000..fcb034f2 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/MeshData.txt @@ -0,0 +1,66 @@ +1 6.000000 6.000000 +2 6.000000 5.750000 +3 6.000000 5.500000 +4 6.000000 5.250000 +5 6.000000 5.000000 +6 6.000000 4.750000 +7 6.000000 4.500000 +8 6.000000 4.250000 +9 6.000000 4.000000 +10 6.000000 3.750000 +11 6.000000 3.500000 +12 5.750000 5.750000 +13 5.750000 5.500000 +14 5.750000 5.250000 +15 5.750000 5.000000 +16 5.750000 4.750000 +17 5.750000 4.500000 +18 5.750000 4.250000 +19 5.750000 4.000000 +20 5.750000 3.750000 +21 5.750000 3.500000 +22 5.500000 5.500000 +23 5.500000 5.250000 +24 5.500000 5.000000 +25 5.500000 4.750000 +26 5.500000 4.500000 +27 5.500000 4.250000 +28 5.500000 4.000000 +29 5.500000 3.750000 +30 5.500000 3.500000 +31 5.250000 5.250000 +32 5.250000 5.000000 +33 5.250000 4.750000 +34 5.250000 4.500000 +35 5.250000 4.250000 +36 5.250000 4.000000 +37 5.250000 3.750000 +38 5.250000 3.500000 +39 5.000000 5.000000 +40 5.000000 4.750000 +41 5.000000 4.500000 +42 5.000000 4.250000 +43 5.000000 4.000000 +44 5.000000 3.750000 +45 5.000000 3.500000 +46 4.750000 4.750000 +47 4.750000 4.500000 +48 4.750000 4.250000 +49 4.750000 4.000000 +50 4.750000 3.750000 +51 4.750000 3.500000 +52 4.500000 4.500000 +53 4.500000 4.250000 +54 4.500000 4.000000 +55 4.500000 3.750000 +56 4.500000 3.500000 +57 4.250000 4.250000 +58 4.250000 4.000000 +59 4.250000 3.750000 +60 4.250000 3.500000 +61 4.000000 4.000000 +62 4.000000 3.750000 +63 4.000000 3.500000 +64 3.750000 3.750000 +65 3.750000 3.500000 +66 3.500000 3.500000 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/do.sh new file mode 100644 index 00000000..e3668631 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/input.toml new file mode 100644 index 00000000..9660cc73 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/input.toml @@ -0,0 +1,29 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.post] +normalization = "TOTAL" +Rfactor_type = "A2" + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[algorithm] +name = "mapper" +label_list = ["z1", "z2"] + +[algorithm.param] +mesh_path = "./MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/ref_ColorMap.txt new file mode 100644 index 00000000..1b1e486e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/ref_ColorMap.txt @@ -0,0 +1,66 @@ +6.000000 6.000000 0.002289 +6.000000 5.750000 0.003026 +6.000000 5.500000 0.002830 +6.000000 5.250000 0.001513 +6.000000 5.000000 0.002273 +6.000000 4.750000 0.004346 +6.000000 4.500000 0.002881 +6.000000 4.250000 0.003753 +6.000000 4.000000 0.004810 +6.000000 3.750000 0.005165 +6.000000 3.500000 0.005290 +5.750000 5.750000 0.004271 +5.750000 5.500000 0.004466 +5.750000 5.250000 0.002991 +5.750000 5.000000 0.001475 +5.750000 4.750000 0.003674 +5.750000 4.500000 0.003174 +5.750000 4.250000 0.003514 +5.750000 4.000000 0.005714 +5.750000 3.750000 0.006745 +5.750000 3.500000 0.007194 +5.500000 5.500000 0.005041 +5.500000 5.250000 0.004029 +5.500000 5.000000 0.001843 +5.500000 4.750000 0.001369 +5.500000 4.500000 0.002178 +5.500000 4.250000 0.001918 +5.500000 4.000000 0.004776 +5.500000 3.750000 0.006592 +5.500000 3.500000 0.007746 +5.250000 5.250000 0.003573 +5.250000 5.000000 0.001986 +5.250000 4.750000 0.000646 +5.250000 4.500000 0.000643 +5.250000 4.250000 0.000231 +5.250000 4.000000 0.002259 +5.250000 3.750000 0.004605 +5.250000 3.500000 0.006099 +5.000000 5.000000 0.001593 +5.000000 4.750000 0.001380 +5.000000 4.500000 0.001120 +5.000000 4.250000 0.000535 +5.000000 4.000000 0.000854 +5.000000 3.750000 0.002788 +5.000000 3.500000 0.004028 +4.750000 4.750000 0.002472 +4.750000 4.500000 0.002644 +4.750000 4.250000 0.002159 +4.750000 4.000000 0.001657 +4.750000 3.750000 0.002574 +4.750000 3.500000 0.003804 +4.500000 4.500000 0.003398 +4.500000 4.250000 0.003517 +4.500000 4.000000 0.003496 +4.500000 3.750000 0.002828 +4.500000 3.500000 0.003688 +4.250000 4.250000 0.004301 +4.250000 4.000000 0.004887 +4.250000 3.750000 0.004346 +4.250000 3.500000 0.003857 +4.000000 4.000000 0.005583 +4.000000 3.750000 0.005897 +4.000000 3.500000 0.005631 +3.750000 3.750000 0.006806 +3.750000 3.500000 0.007158 +3.500000 3.500000 0.007921 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_A2/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/MeshData.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/MeshData.txt new file mode 100644 index 00000000..fcb034f2 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/MeshData.txt @@ -0,0 +1,66 @@ +1 6.000000 6.000000 +2 6.000000 5.750000 +3 6.000000 5.500000 +4 6.000000 5.250000 +5 6.000000 5.000000 +6 6.000000 4.750000 +7 6.000000 4.500000 +8 6.000000 4.250000 +9 6.000000 4.000000 +10 6.000000 3.750000 +11 6.000000 3.500000 +12 5.750000 5.750000 +13 5.750000 5.500000 +14 5.750000 5.250000 +15 5.750000 5.000000 +16 5.750000 4.750000 +17 5.750000 4.500000 +18 5.750000 4.250000 +19 5.750000 4.000000 +20 5.750000 3.750000 +21 5.750000 3.500000 +22 5.500000 5.500000 +23 5.500000 5.250000 +24 5.500000 5.000000 +25 5.500000 4.750000 +26 5.500000 4.500000 +27 5.500000 4.250000 +28 5.500000 4.000000 +29 5.500000 3.750000 +30 5.500000 3.500000 +31 5.250000 5.250000 +32 5.250000 5.000000 +33 5.250000 4.750000 +34 5.250000 4.500000 +35 5.250000 4.250000 +36 5.250000 4.000000 +37 5.250000 3.750000 +38 5.250000 3.500000 +39 5.000000 5.000000 +40 5.000000 4.750000 +41 5.000000 4.500000 +42 5.000000 4.250000 +43 5.000000 4.000000 +44 5.000000 3.750000 +45 5.000000 3.500000 +46 4.750000 4.750000 +47 4.750000 4.500000 +48 4.750000 4.250000 +49 4.750000 4.000000 +50 4.750000 3.750000 +51 4.750000 3.500000 +52 4.500000 4.500000 +53 4.500000 4.250000 +54 4.500000 4.000000 +55 4.500000 3.750000 +56 4.500000 3.500000 +57 4.250000 4.250000 +58 4.250000 4.000000 +59 4.250000 3.750000 +60 4.250000 3.500000 +61 4.000000 4.000000 +62 4.000000 3.750000 +63 4.000000 3.500000 +64 3.750000 3.750000 +65 3.750000 3.500000 +66 3.500000 3.500000 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/do.sh new file mode 100644 index 00000000..57403ec5 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time mpiexec -np 2 $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/input.toml new file mode 100644 index 00000000..269e433d --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/input.toml @@ -0,0 +1,29 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.post] +normalization = "TOTAL" +Rfactor_type = "B" + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[algorithm] +name = "mapper" +label_list = ["z1", "z2"] + +[algorithm.param] +mesh_path = "./MeshData.txt" diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/prepare.sh new file mode 100644 index 00000000..f93e6b8e --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/ref_ColorMap.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/ref_ColorMap.txt new file mode 100644 index 00000000..6de21e37 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/ref_ColorMap.txt @@ -0,0 +1,66 @@ +6.000000 6.000000 0.043602 +6.000000 5.750000 0.056692 +6.000000 5.500000 0.053222 +6.000000 5.250000 0.029395 +6.000000 5.000000 0.042527 +6.000000 4.750000 0.078972 +6.000000 4.500000 0.056501 +6.000000 4.250000 0.072859 +6.000000 4.000000 0.089421 +6.000000 3.750000 0.098674 +6.000000 3.500000 0.105137 +5.750000 5.750000 0.082346 +5.750000 5.500000 0.085609 +5.750000 5.250000 0.057396 +5.750000 5.000000 0.028287 +5.750000 4.750000 0.067691 +5.750000 4.500000 0.061419 +5.750000 4.250000 0.068981 +5.750000 4.000000 0.108029 +5.750000 3.750000 0.130551 +5.750000 3.500000 0.143084 +5.500000 5.500000 0.098892 +5.500000 5.250000 0.077831 +5.500000 5.000000 0.034807 +5.500000 4.750000 0.025833 +5.500000 4.500000 0.041589 +5.500000 4.250000 0.037448 +5.500000 4.000000 0.089941 +5.500000 3.750000 0.129006 +5.500000 3.500000 0.156400 +5.250000 5.250000 0.069573 +5.250000 5.000000 0.037297 +5.250000 4.750000 0.011899 +5.250000 4.500000 0.011973 +5.250000 4.250000 0.004370 +5.250000 4.000000 0.041899 +5.250000 3.750000 0.089042 +5.250000 3.500000 0.123796 +5.000000 5.000000 0.029952 +5.000000 4.750000 0.025381 +5.000000 4.500000 0.020344 +5.000000 4.250000 0.009757 +5.000000 4.000000 0.015623 +5.000000 3.750000 0.052996 +5.000000 3.500000 0.080230 +4.750000 4.750000 0.046814 +4.750000 4.500000 0.049881 +4.750000 4.250000 0.039709 +4.750000 4.000000 0.030597 +4.750000 3.750000 0.049682 +4.750000 3.500000 0.075542 +4.500000 4.500000 0.066076 +4.500000 4.250000 0.065760 +4.500000 4.000000 0.063094 +4.500000 3.750000 0.054719 +4.500000 3.500000 0.074344 +4.250000 4.250000 0.079749 +4.250000 4.000000 0.087346 +4.250000 3.750000 0.080592 +4.250000 3.500000 0.075993 +4.000000 4.000000 0.101746 +4.000000 3.750000 0.110196 +4.000000 3.500000 0.107872 +3.750000 3.750000 0.133591 +3.750000 3.500000 0.142635 +3.500000 3.500000 0.163221 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/mapper_B/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/do.sh new file mode 100644 index 00000000..fa38f7ed --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh ./prepare.sh + +../../bin/bulk.exe + +time $CMD input.toml + +result=output/res.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/input.toml new file mode 100644 index 00000000..509fbee6 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/input.toml @@ -0,0 +1,29 @@ +[base] +dimension = 3 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02", "value_03" ] + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[solver.post] +normalization = "TOTAL" + +[algorithm] +name = "minsearch" +label_list = ["z1", "z2", "z3"] +[algorithm.param] +min_list = [0.0, 0.0, 0.0] +max_list = [10.0, 10.0, 10.0] +initial_list = [5.25, 4.25, 3.50] diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/prepare.sh new file mode 100644 index 00000000..f4abaa75 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f ./bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/ref.txt b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/ref.txt new file mode 100644 index 00000000..46964122 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/ref.txt @@ -0,0 +1,4 @@ +fx = 8.97501627575891e-06 +z1 = 5.230573154947887 +z2 = 4.3706085364407095 +z3 = 3.5961303342247577 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/minsearch/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/template.txt new file mode 100644 index 00000000..6ac0038d --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/minsearch/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 value_03 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/bulk.txt b/extra/sim-trhepd-rheed/tests/single_beam/pamc/bulk.txt new file mode 100644 index 00000000..d2833576 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/bulk.txt @@ -0,0 +1,16 @@ +2,1,1 ,NH,NK,NDOM, -------- Ge(001) bulk +1,1 ,(NB,I=1,NDOM) +0,90 ,(RDOM,I=1,NDOM) +0,0 ,(IH(I),IK(I),I=1,NB) +10,0,0,0,0.1,7.0,0.1 ,BE,AZI,AZF,DAZ,GI,GF,DG +0.05,200 ,DZ,ML +1 ,NELM +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +6,4.000668747,4.000668747,90,2.8289,0.5,0.5 ,NSG,AA,BB,GAM,CC,DX,DY +2 ,NATM +1,1.0,0.00000,0.50000, 2.121675 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1,1.0,0.00000,0.00000, 0.707225 ,IELM(I),ocr(I),X(I),Y(I),Z(I) + + + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/do.sh b/extra/sim-trhepd-rheed/tests/single_beam/pamc/do.sh new file mode 100644 index 00000000..8a872c57 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/do.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +#CMD=py2dmat-sim-trhepd-rheed +CMD="python3 ../../../src/main.py" + +sh prepare.sh + +../../bin/bulk.exe + +time mpiexec -np 4 $CMD input.toml + +result=output/fx.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/experiment.txt b/extra/sim-trhepd-rheed/tests/single_beam/pamc/experiment.txt new file mode 100644 index 00000000..ea7b680c --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/experiment.txt @@ -0,0 +1,70 @@ +0.100000 0.002374995 +0.200000 0.003614789 +0.300000 0.005023215 +0.400000 0.006504978 +0.500000 0.007990674 +0.600000 0.009441623 +0.700000 0.010839445 +0.800000 0.012174578 +0.900000 0.013439485 +1.000000 0.014625579 +1.100000 0.015721463 +1.200000 0.016710969 +1.300000 0.017570142 +1.400000 0.018262420 +1.500000 0.018731411 +1.600000 0.018892641 +1.700000 0.018630851 +1.800000 0.017816493 +1.900000 0.016354279 +2.000000 0.014256366 +2.100000 0.011700068 +2.200000 0.009019956 +2.300000 0.006622730 +2.400000 0.004872397 +2.500000 0.004013645 +2.600000 0.004160161 +2.700000 0.005307435 +2.800000 0.007299786 +2.900000 0.009740557 +3.000000 0.011955639 +3.100000 0.013159801 +3.200000 0.012817227 +3.300000 0.010957880 +3.400000 0.008183372 +3.500000 0.005337202 +3.600000 0.003084209 +3.700000 0.001682330 +3.800000 0.001032496 +3.900000 0.000877873 +4.000000 0.000977533 +4.100000 0.001178203 +4.200000 0.001407336 +4.300000 0.001636711 +4.400000 0.001848435 +4.500000 0.002018552 +4.600000 0.002124789 +4.700000 0.002175465 +4.800000 0.002243257 +4.900000 0.002471714 +5.000000 0.003012527 +5.100000 0.003881614 +5.200000 0.004823572 +5.300000 0.005364254 +5.400000 0.005117472 +5.500000 0.004107123 +5.600000 0.002763088 +5.700000 0.001583937 +5.800000 0.000819761 +5.900000 0.000437166 +6.000000 0.000281652 +6.100000 0.000222495 +6.200000 0.000194182 +6.300000 0.000176249 +6.400000 0.000166092 +6.500000 0.000163569 +6.600000 0.000165388 +6.700000 0.000164956 +6.800000 0.000155324 +6.900000 0.000133175 +7.000000 0.000101185 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/input.toml b/extra/sim-trhepd-rheed/tests/single_beam/pamc/input.toml new file mode 100644 index 00000000..3eacc5d8 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/input.toml @@ -0,0 +1,40 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sim-trhepd-rheed" +run_scheme = "subprocess" + +[solver.config] +cal_number = [1] +surface_exec_file = "../../bin/surf.exe" + +[solver.param] +string_list = ["value_01", "value_02" ] + +[solver.post] +normalization = "TOTAL" + +[solver.reference] +path = "experiment.txt" +exp_number = [1] + +[algorithm] +name = "pamc" +label_list = ["z1", "z2"] +seed = 12345 + +[algorithm.param] +min_list = [3.0, 3.0] +max_list = [6.0, 6.0] +unit_list = [0.3, 0.3] + +[algorithm.pamc] +numsteps_annealing = 5 +bmin = 0.0 +bmax = 200.0 +Tnum = 21 +Tlogspace = false +nreplica_per_proc = 10 + diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/prepare.sh b/extra/sim-trhepd-rheed/tests/single_beam/pamc/prepare.sh new file mode 100644 index 00000000..f4abaa75 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f ./bulkP.b diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/ref.txt b/extra/sim-trhepd-rheed/tests/single_beam/pamc/ref.txt new file mode 100644 index 00000000..fd63f8cd --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/ref.txt @@ -0,0 +1,27 @@ +# $1: 1/T +# $2: mean of f(x) +# $3: standard error of f(x) +# $4: number of replicas +# $5: log(Z/Z0) +# $6: acceptance ratio +0.0 0.06427959456998655 0.0027034650004592914 40 0.0 0.795 +10.0 0.061399024996706686 0.0026494325830859313 40 -0.6280770777860613 0.85 +20.0 0.05904270303275139 0.0031623440679957784 40 -1.2282982965860305 0.74 +30.0 0.04956920203307469 0.0028298334294021145 40 -1.7990971380214467 0.67 +40.0 0.04517117682063021 0.002971561055910097 40 -2.27935954920571 0.67 +50.0 0.04557330165280349 0.002663255501853 40 -2.714238505738728 0.585 +60.0 0.04169106892899466 0.0024143432975457643 40 -3.156247676174139 0.605 +70.0 0.03570581650334259 0.0018238873413932777 40 -3.56187453071531 0.59 +80.0 0.03715395848031844 0.0023427854739007234 40 -3.912435026606071 0.48 +90.0 0.033480179297140644 0.0020578648446761853 40 -4.273433293351014 0.435 +100.0 0.02927093316086471 0.002428722360438289 40 -4.600145685221869 0.41 +110.0 0.028038003505646003 0.002358926652188058 40 -4.881916427807947 0.32 +120.0 0.02545926098065321 0.002054283510857483 40 -5.152008537261002 0.255 +130.0 0.023755957697149332 0.0020394115387400063 40 -5.398713539910261 0.225 +140.0 0.023259570095007787 0.0020035797988618986 40 -5.628521718066179 0.305 +150.0 0.019910292914599226 0.001255622958977574 40 -5.853746316721769 0.175 +160.0 0.018548395706422305 0.001074639170486063 40 -6.049839309698577 0.16 +170.0 0.017589626237652922 0.0010009647330348605 40 -6.233083432360471 0.115 +180.0 0.017721248857765493 0.0011294616111162037 40 -6.407047940540563 0.145 +190.0 0.01651572518217781 0.0009311421253063132 40 -6.581818964816524 0.135 +200.0 0.017765963115187744 0.0013378827038506842 40 -6.745306049740788 0.145 diff --git a/extra/sim-trhepd-rheed/tests/single_beam/pamc/template.txt b/extra/sim-trhepd-rheed/tests/single_beam/pamc/template.txt new file mode 100644 index 00000000..2fac0616 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/single_beam/pamc/template.txt @@ -0,0 +1,16 @@ +2 ,NELMS, -------- Ge(001)-c4x2 +32,1.0,0.1 ,Ge Z,da1,sap +0.6,0.6,0.6 ,BH(I),BK(I),BZ(I) +32,1.0,0.1 ,Ge Z,da1,sap +0.4,0.4,0.4 ,BH(I),BK(I),BZ(I) +9,4,0,0,2, 2.0,-0.5,0.5 ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS +8 ,NATM +1, 1.0, 1.34502591 1 value_01 ,IELM(I),ocr(I),X(I),Y(I),Z(I) +1, 1.0, 0.752457792 1 value_02 +2, 1.0, 1.480003343 1.465005851 3.5 +2, 1.0, 2 1.497500418 2.281675 +2, 1.0, 1 1.5 1.991675 +2, 1.0, 0 1 0.847225 +2, 1.0, 2 1 0.807225 +2, 1.0, 1.009998328 1 0.597225 +1,1 ,(WDOM,I=1,NDOM) From 0f2ddd5d55b73fc5d5059c82224e01549d0fc8ae Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 04:57:17 +0900 Subject: [PATCH 09/14] add main script for extra/sxrd --- extra/sxrd/src/main.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 extra/sxrd/src/main.py diff --git a/extra/sxrd/src/main.py b/extra/sxrd/src/main.py new file mode 100644 index 00000000..15b3fe4a --- /dev/null +++ b/extra/sxrd/src/main.py @@ -0,0 +1,20 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +if __name__ == "__main__": + # sys.path[0] is this directory (2DMAT/src) + from sxrd._main import main + main() From 4fb3586df002f2613a3a9c44fe7755b8b2a7ac1e Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 04:58:19 +0900 Subject: [PATCH 10/14] add tests for extra/sxrd --- extra/sxrd/tests/bin/.placeholder | 0 extra/sxrd/tests/mapper/MeshData.txt | 441 ++++++++++++++++++ extra/sxrd/tests/mapper/do.sh | 23 + extra/sxrd/tests/mapper/input.toml | 44 ++ extra/sxrd/tests/mapper/prepare.sh | 4 + extra/sxrd/tests/mapper/ref_ColorMap.txt | 441 ++++++++++++++++++ extra/sxrd/tests/mapper/sic111-r3xr3.blk | 20 + extra/sxrd/tests/mapper/sic111-r3xr3_f.dat | 50 ++ extra/sxrd/tests/minsearch/do.sh | 39 ++ extra/sxrd/tests/minsearch/input.toml | 48 ++ extra/sxrd/tests/minsearch/prepare.sh | 4 + extra/sxrd/tests/minsearch/ref.txt | 3 + .../sxrd/tests/minsearch/ref_SimplexData.txt | 27 ++ extra/sxrd/tests/minsearch/sic111-r3xr3.blk | 20 + extra/sxrd/tests/minsearch/sic111-r3xr3_f.dat | 50 ++ 15 files changed, 1214 insertions(+) create mode 100644 extra/sxrd/tests/bin/.placeholder create mode 100644 extra/sxrd/tests/mapper/MeshData.txt create mode 100644 extra/sxrd/tests/mapper/do.sh create mode 100644 extra/sxrd/tests/mapper/input.toml create mode 100644 extra/sxrd/tests/mapper/prepare.sh create mode 100644 extra/sxrd/tests/mapper/ref_ColorMap.txt create mode 100644 extra/sxrd/tests/mapper/sic111-r3xr3.blk create mode 100644 extra/sxrd/tests/mapper/sic111-r3xr3_f.dat create mode 100644 extra/sxrd/tests/minsearch/do.sh create mode 100644 extra/sxrd/tests/minsearch/input.toml create mode 100644 extra/sxrd/tests/minsearch/prepare.sh create mode 100644 extra/sxrd/tests/minsearch/ref.txt create mode 100644 extra/sxrd/tests/minsearch/ref_SimplexData.txt create mode 100644 extra/sxrd/tests/minsearch/sic111-r3xr3.blk create mode 100644 extra/sxrd/tests/minsearch/sic111-r3xr3_f.dat diff --git a/extra/sxrd/tests/bin/.placeholder b/extra/sxrd/tests/bin/.placeholder new file mode 100644 index 00000000..e69de29b diff --git a/extra/sxrd/tests/mapper/MeshData.txt b/extra/sxrd/tests/mapper/MeshData.txt new file mode 100644 index 00000000..fec4a96e --- /dev/null +++ b/extra/sxrd/tests/mapper/MeshData.txt @@ -0,0 +1,441 @@ +0 -0.2 -0.2 +1 -0.2 -0.18000000000000002 +2 -0.2 -0.16 +3 -0.2 -0.14 +4 -0.2 -0.12000000000000001 +5 -0.2 -0.1 +6 -0.2 -0.08000000000000002 +7 -0.2 -0.06 +8 -0.2 -0.04000000000000001 +9 -0.2 -0.020000000000000018 +10 -0.2 0.0 +11 -0.2 0.01999999999999999 +12 -0.2 0.03999999999999998 +13 -0.2 0.06 +14 -0.2 0.08000000000000002 +15 -0.2 0.09999999999999998 +16 -0.2 0.12 +17 -0.2 0.14 +18 -0.2 0.15999999999999998 +19 -0.2 0.18 +20 -0.2 0.2 +10 -0.18000000000000002 -0.2 +11 -0.18000000000000002 -0.18000000000000002 +12 -0.18000000000000002 -0.16 +13 -0.18000000000000002 -0.14 +14 -0.18000000000000002 -0.12000000000000001 +15 -0.18000000000000002 -0.1 +16 -0.18000000000000002 -0.08000000000000002 +17 -0.18000000000000002 -0.06 +18 -0.18000000000000002 -0.04000000000000001 +19 -0.18000000000000002 -0.020000000000000018 +20 -0.18000000000000002 0.0 +21 -0.18000000000000002 0.01999999999999999 +22 -0.18000000000000002 0.03999999999999998 +23 -0.18000000000000002 0.06 +24 -0.18000000000000002 0.08000000000000002 +25 -0.18000000000000002 0.09999999999999998 +26 -0.18000000000000002 0.12 +27 -0.18000000000000002 0.14 +28 -0.18000000000000002 0.15999999999999998 +29 -0.18000000000000002 0.18 +30 -0.18000000000000002 0.2 +20 -0.16 -0.2 +21 -0.16 -0.18000000000000002 +22 -0.16 -0.16 +23 -0.16 -0.14 +24 -0.16 -0.12000000000000001 +25 -0.16 -0.1 +26 -0.16 -0.08000000000000002 +27 -0.16 -0.06 +28 -0.16 -0.04000000000000001 +29 -0.16 -0.020000000000000018 +30 -0.16 0.0 +31 -0.16 0.01999999999999999 +32 -0.16 0.03999999999999998 +33 -0.16 0.06 +34 -0.16 0.08000000000000002 +35 -0.16 0.09999999999999998 +36 -0.16 0.12 +37 -0.16 0.14 +38 -0.16 0.15999999999999998 +39 -0.16 0.18 +40 -0.16 0.2 +30 -0.14 -0.2 +31 -0.14 -0.18000000000000002 +32 -0.14 -0.16 +33 -0.14 -0.14 +34 -0.14 -0.12000000000000001 +35 -0.14 -0.1 +36 -0.14 -0.08000000000000002 +37 -0.14 -0.06 +38 -0.14 -0.04000000000000001 +39 -0.14 -0.020000000000000018 +40 -0.14 0.0 +41 -0.14 0.01999999999999999 +42 -0.14 0.03999999999999998 +43 -0.14 0.06 +44 -0.14 0.08000000000000002 +45 -0.14 0.09999999999999998 +46 -0.14 0.12 +47 -0.14 0.14 +48 -0.14 0.15999999999999998 +49 -0.14 0.18 +50 -0.14 0.2 +40 -0.12000000000000001 -0.2 +41 -0.12000000000000001 -0.18000000000000002 +42 -0.12000000000000001 -0.16 +43 -0.12000000000000001 -0.14 +44 -0.12000000000000001 -0.12000000000000001 +45 -0.12000000000000001 -0.1 +46 -0.12000000000000001 -0.08000000000000002 +47 -0.12000000000000001 -0.06 +48 -0.12000000000000001 -0.04000000000000001 +49 -0.12000000000000001 -0.020000000000000018 +50 -0.12000000000000001 0.0 +51 -0.12000000000000001 0.01999999999999999 +52 -0.12000000000000001 0.03999999999999998 +53 -0.12000000000000001 0.06 +54 -0.12000000000000001 0.08000000000000002 +55 -0.12000000000000001 0.09999999999999998 +56 -0.12000000000000001 0.12 +57 -0.12000000000000001 0.14 +58 -0.12000000000000001 0.15999999999999998 +59 -0.12000000000000001 0.18 +60 -0.12000000000000001 0.2 +50 -0.1 -0.2 +51 -0.1 -0.18000000000000002 +52 -0.1 -0.16 +53 -0.1 -0.14 +54 -0.1 -0.12000000000000001 +55 -0.1 -0.1 +56 -0.1 -0.08000000000000002 +57 -0.1 -0.06 +58 -0.1 -0.04000000000000001 +59 -0.1 -0.020000000000000018 +60 -0.1 0.0 +61 -0.1 0.01999999999999999 +62 -0.1 0.03999999999999998 +63 -0.1 0.06 +64 -0.1 0.08000000000000002 +65 -0.1 0.09999999999999998 +66 -0.1 0.12 +67 -0.1 0.14 +68 -0.1 0.15999999999999998 +69 -0.1 0.18 +70 -0.1 0.2 +60 -0.08000000000000002 -0.2 +61 -0.08000000000000002 -0.18000000000000002 +62 -0.08000000000000002 -0.16 +63 -0.08000000000000002 -0.14 +64 -0.08000000000000002 -0.12000000000000001 +65 -0.08000000000000002 -0.1 +66 -0.08000000000000002 -0.08000000000000002 +67 -0.08000000000000002 -0.06 +68 -0.08000000000000002 -0.04000000000000001 +69 -0.08000000000000002 -0.020000000000000018 +70 -0.08000000000000002 0.0 +71 -0.08000000000000002 0.01999999999999999 +72 -0.08000000000000002 0.03999999999999998 +73 -0.08000000000000002 0.06 +74 -0.08000000000000002 0.08000000000000002 +75 -0.08000000000000002 0.09999999999999998 +76 -0.08000000000000002 0.12 +77 -0.08000000000000002 0.14 +78 -0.08000000000000002 0.15999999999999998 +79 -0.08000000000000002 0.18 +80 -0.08000000000000002 0.2 +70 -0.06 -0.2 +71 -0.06 -0.18000000000000002 +72 -0.06 -0.16 +73 -0.06 -0.14 +74 -0.06 -0.12000000000000001 +75 -0.06 -0.1 +76 -0.06 -0.08000000000000002 +77 -0.06 -0.06 +78 -0.06 -0.04000000000000001 +79 -0.06 -0.020000000000000018 +80 -0.06 0.0 +81 -0.06 0.01999999999999999 +82 -0.06 0.03999999999999998 +83 -0.06 0.06 +84 -0.06 0.08000000000000002 +85 -0.06 0.09999999999999998 +86 -0.06 0.12 +87 -0.06 0.14 +88 -0.06 0.15999999999999998 +89 -0.06 0.18 +90 -0.06 0.2 +80 -0.04000000000000001 -0.2 +81 -0.04000000000000001 -0.18000000000000002 +82 -0.04000000000000001 -0.16 +83 -0.04000000000000001 -0.14 +84 -0.04000000000000001 -0.12000000000000001 +85 -0.04000000000000001 -0.1 +86 -0.04000000000000001 -0.08000000000000002 +87 -0.04000000000000001 -0.06 +88 -0.04000000000000001 -0.04000000000000001 +89 -0.04000000000000001 -0.020000000000000018 +90 -0.04000000000000001 0.0 +91 -0.04000000000000001 0.01999999999999999 +92 -0.04000000000000001 0.03999999999999998 +93 -0.04000000000000001 0.06 +94 -0.04000000000000001 0.08000000000000002 +95 -0.04000000000000001 0.09999999999999998 +96 -0.04000000000000001 0.12 +97 -0.04000000000000001 0.14 +98 -0.04000000000000001 0.15999999999999998 +99 -0.04000000000000001 0.18 +100 -0.04000000000000001 0.2 +90 -0.020000000000000018 -0.2 +91 -0.020000000000000018 -0.18000000000000002 +92 -0.020000000000000018 -0.16 +93 -0.020000000000000018 -0.14 +94 -0.020000000000000018 -0.12000000000000001 +95 -0.020000000000000018 -0.1 +96 -0.020000000000000018 -0.08000000000000002 +97 -0.020000000000000018 -0.06 +98 -0.020000000000000018 -0.04000000000000001 +99 -0.020000000000000018 -0.020000000000000018 +100 -0.020000000000000018 0.0 +101 -0.020000000000000018 0.01999999999999999 +102 -0.020000000000000018 0.03999999999999998 +103 -0.020000000000000018 0.06 +104 -0.020000000000000018 0.08000000000000002 +105 -0.020000000000000018 0.09999999999999998 +106 -0.020000000000000018 0.12 +107 -0.020000000000000018 0.14 +108 -0.020000000000000018 0.15999999999999998 +109 -0.020000000000000018 0.18 +110 -0.020000000000000018 0.2 +100 0.0 -0.2 +101 0.0 -0.18000000000000002 +102 0.0 -0.16 +103 0.0 -0.14 +104 0.0 -0.12000000000000001 +105 0.0 -0.1 +106 0.0 -0.08000000000000002 +107 0.0 -0.06 +108 0.0 -0.04000000000000001 +109 0.0 -0.020000000000000018 +110 0.0 0.0 +111 0.0 0.01999999999999999 +112 0.0 0.03999999999999998 +113 0.0 0.06 +114 0.0 0.08000000000000002 +115 0.0 0.09999999999999998 +116 0.0 0.12 +117 0.0 0.14 +118 0.0 0.15999999999999998 +119 0.0 0.18 +120 0.0 0.2 +110 0.01999999999999999 -0.2 +111 0.01999999999999999 -0.18000000000000002 +112 0.01999999999999999 -0.16 +113 0.01999999999999999 -0.14 +114 0.01999999999999999 -0.12000000000000001 +115 0.01999999999999999 -0.1 +116 0.01999999999999999 -0.08000000000000002 +117 0.01999999999999999 -0.06 +118 0.01999999999999999 -0.04000000000000001 +119 0.01999999999999999 -0.020000000000000018 +120 0.01999999999999999 0.0 +121 0.01999999999999999 0.01999999999999999 +122 0.01999999999999999 0.03999999999999998 +123 0.01999999999999999 0.06 +124 0.01999999999999999 0.08000000000000002 +125 0.01999999999999999 0.09999999999999998 +126 0.01999999999999999 0.12 +127 0.01999999999999999 0.14 +128 0.01999999999999999 0.15999999999999998 +129 0.01999999999999999 0.18 +130 0.01999999999999999 0.2 +120 0.03999999999999998 -0.2 +121 0.03999999999999998 -0.18000000000000002 +122 0.03999999999999998 -0.16 +123 0.03999999999999998 -0.14 +124 0.03999999999999998 -0.12000000000000001 +125 0.03999999999999998 -0.1 +126 0.03999999999999998 -0.08000000000000002 +127 0.03999999999999998 -0.06 +128 0.03999999999999998 -0.04000000000000001 +129 0.03999999999999998 -0.020000000000000018 +130 0.03999999999999998 0.0 +131 0.03999999999999998 0.01999999999999999 +132 0.03999999999999998 0.03999999999999998 +133 0.03999999999999998 0.06 +134 0.03999999999999998 0.08000000000000002 +135 0.03999999999999998 0.09999999999999998 +136 0.03999999999999998 0.12 +137 0.03999999999999998 0.14 +138 0.03999999999999998 0.15999999999999998 +139 0.03999999999999998 0.18 +140 0.03999999999999998 0.2 +130 0.06 -0.2 +131 0.06 -0.18000000000000002 +132 0.06 -0.16 +133 0.06 -0.14 +134 0.06 -0.12000000000000001 +135 0.06 -0.1 +136 0.06 -0.08000000000000002 +137 0.06 -0.06 +138 0.06 -0.04000000000000001 +139 0.06 -0.020000000000000018 +140 0.06 0.0 +141 0.06 0.01999999999999999 +142 0.06 0.03999999999999998 +143 0.06 0.06 +144 0.06 0.08000000000000002 +145 0.06 0.09999999999999998 +146 0.06 0.12 +147 0.06 0.14 +148 0.06 0.15999999999999998 +149 0.06 0.18 +150 0.06 0.2 +140 0.08000000000000002 -0.2 +141 0.08000000000000002 -0.18000000000000002 +142 0.08000000000000002 -0.16 +143 0.08000000000000002 -0.14 +144 0.08000000000000002 -0.12000000000000001 +145 0.08000000000000002 -0.1 +146 0.08000000000000002 -0.08000000000000002 +147 0.08000000000000002 -0.06 +148 0.08000000000000002 -0.04000000000000001 +149 0.08000000000000002 -0.020000000000000018 +150 0.08000000000000002 0.0 +151 0.08000000000000002 0.01999999999999999 +152 0.08000000000000002 0.03999999999999998 +153 0.08000000000000002 0.06 +154 0.08000000000000002 0.08000000000000002 +155 0.08000000000000002 0.09999999999999998 +156 0.08000000000000002 0.12 +157 0.08000000000000002 0.14 +158 0.08000000000000002 0.15999999999999998 +159 0.08000000000000002 0.18 +160 0.08000000000000002 0.2 +150 0.09999999999999998 -0.2 +151 0.09999999999999998 -0.18000000000000002 +152 0.09999999999999998 -0.16 +153 0.09999999999999998 -0.14 +154 0.09999999999999998 -0.12000000000000001 +155 0.09999999999999998 -0.1 +156 0.09999999999999998 -0.08000000000000002 +157 0.09999999999999998 -0.06 +158 0.09999999999999998 -0.04000000000000001 +159 0.09999999999999998 -0.020000000000000018 +160 0.09999999999999998 0.0 +161 0.09999999999999998 0.01999999999999999 +162 0.09999999999999998 0.03999999999999998 +163 0.09999999999999998 0.06 +164 0.09999999999999998 0.08000000000000002 +165 0.09999999999999998 0.09999999999999998 +166 0.09999999999999998 0.12 +167 0.09999999999999998 0.14 +168 0.09999999999999998 0.15999999999999998 +169 0.09999999999999998 0.18 +170 0.09999999999999998 0.2 +160 0.12 -0.2 +161 0.12 -0.18000000000000002 +162 0.12 -0.16 +163 0.12 -0.14 +164 0.12 -0.12000000000000001 +165 0.12 -0.1 +166 0.12 -0.08000000000000002 +167 0.12 -0.06 +168 0.12 -0.04000000000000001 +169 0.12 -0.020000000000000018 +170 0.12 0.0 +171 0.12 0.01999999999999999 +172 0.12 0.03999999999999998 +173 0.12 0.06 +174 0.12 0.08000000000000002 +175 0.12 0.09999999999999998 +176 0.12 0.12 +177 0.12 0.14 +178 0.12 0.15999999999999998 +179 0.12 0.18 +180 0.12 0.2 +170 0.14 -0.2 +171 0.14 -0.18000000000000002 +172 0.14 -0.16 +173 0.14 -0.14 +174 0.14 -0.12000000000000001 +175 0.14 -0.1 +176 0.14 -0.08000000000000002 +177 0.14 -0.06 +178 0.14 -0.04000000000000001 +179 0.14 -0.020000000000000018 +180 0.14 0.0 +181 0.14 0.01999999999999999 +182 0.14 0.03999999999999998 +183 0.14 0.06 +184 0.14 0.08000000000000002 +185 0.14 0.09999999999999998 +186 0.14 0.12 +187 0.14 0.14 +188 0.14 0.15999999999999998 +189 0.14 0.18 +190 0.14 0.2 +180 0.15999999999999998 -0.2 +181 0.15999999999999998 -0.18000000000000002 +182 0.15999999999999998 -0.16 +183 0.15999999999999998 -0.14 +184 0.15999999999999998 -0.12000000000000001 +185 0.15999999999999998 -0.1 +186 0.15999999999999998 -0.08000000000000002 +187 0.15999999999999998 -0.06 +188 0.15999999999999998 -0.04000000000000001 +189 0.15999999999999998 -0.020000000000000018 +190 0.15999999999999998 0.0 +191 0.15999999999999998 0.01999999999999999 +192 0.15999999999999998 0.03999999999999998 +193 0.15999999999999998 0.06 +194 0.15999999999999998 0.08000000000000002 +195 0.15999999999999998 0.09999999999999998 +196 0.15999999999999998 0.12 +197 0.15999999999999998 0.14 +198 0.15999999999999998 0.15999999999999998 +199 0.15999999999999998 0.18 +200 0.15999999999999998 0.2 +190 0.18 -0.2 +191 0.18 -0.18000000000000002 +192 0.18 -0.16 +193 0.18 -0.14 +194 0.18 -0.12000000000000001 +195 0.18 -0.1 +196 0.18 -0.08000000000000002 +197 0.18 -0.06 +198 0.18 -0.04000000000000001 +199 0.18 -0.020000000000000018 +200 0.18 0.0 +201 0.18 0.01999999999999999 +202 0.18 0.03999999999999998 +203 0.18 0.06 +204 0.18 0.08000000000000002 +205 0.18 0.09999999999999998 +206 0.18 0.12 +207 0.18 0.14 +208 0.18 0.15999999999999998 +209 0.18 0.18 +210 0.18 0.2 +200 0.2 -0.2 +201 0.2 -0.18000000000000002 +202 0.2 -0.16 +203 0.2 -0.14 +204 0.2 -0.12000000000000001 +205 0.2 -0.1 +206 0.2 -0.08000000000000002 +207 0.2 -0.06 +208 0.2 -0.04000000000000001 +209 0.2 -0.020000000000000018 +210 0.2 0.0 +211 0.2 0.01999999999999999 +212 0.2 0.03999999999999998 +213 0.2 0.06 +214 0.2 0.08000000000000002 +215 0.2 0.09999999999999998 +216 0.2 0.12 +217 0.2 0.14 +218 0.2 0.15999999999999998 +219 0.2 0.18 +220 0.2 0.2 diff --git a/extra/sxrd/tests/mapper/do.sh b/extra/sxrd/tests/mapper/do.sh new file mode 100644 index 00000000..83197faa --- /dev/null +++ b/extra/sxrd/tests/mapper/do.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +#CMD=py2dmat-sxrd +CMD="python3 ../../src/main.py" + +sh prepare.sh + +time mpiexec -np 4 $CMD input.toml + +result=output/ColorMap.txt +reference=ref_ColorMap.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sxrd/tests/mapper/input.toml b/extra/sxrd/tests/mapper/input.toml new file mode 100644 index 00000000..ae7d2e89 --- /dev/null +++ b/extra/sxrd/tests/mapper/input.toml @@ -0,0 +1,44 @@ +[base] +dimension = 2 +output_dir = "output" +[solver] +name = "sxrd" +[solver.config] +sxrd_exec_file = "../bin/sxrdcalc" +bulk_struc_in_file = "sic111-r3xr3.blk" +[solver.param] +scale_factor = 1.0 +type_vector = [1, 2] +[[solver.param.domain]] +domain_occupancy = 1.0 + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.00000000, 0.00000000, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.33333333, 0.66666667, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.66666667, 0.33333333, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.33333333, 0.33333333, 1.20000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[2, 0.0, 0.0, 1.0]] +[solver.reference] +f_in_file = "sic111-r3xr3_f.dat" +[algorithm] +name = "mapper" +label_list = ["z1", "z2"] +[algorithm.param] +mesh_path = "./MeshData.txt" diff --git a/extra/sxrd/tests/mapper/prepare.sh b/extra/sxrd/tests/mapper/prepare.sh new file mode 100644 index 00000000..16b4a95e --- /dev/null +++ b/extra/sxrd/tests/mapper/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f ./lsfit.in diff --git a/extra/sxrd/tests/mapper/ref_ColorMap.txt b/extra/sxrd/tests/mapper/ref_ColorMap.txt new file mode 100644 index 00000000..ca398ccd --- /dev/null +++ b/extra/sxrd/tests/mapper/ref_ColorMap.txt @@ -0,0 +1,441 @@ +-0.200000 -0.200000 0.225705 +-0.200000 -0.180000 0.214978 +-0.200000 -0.160000 0.208975 +-0.200000 -0.140000 0.205867 +-0.200000 -0.120000 0.206768 +-0.200000 -0.100000 0.212166 +-0.200000 -0.080000 0.220515 +-0.200000 -0.060000 0.226590 +-0.200000 -0.040000 0.228623 +-0.200000 -0.020000 0.227939 +-0.200000 0.000000 0.225835 +-0.200000 0.020000 0.226825 +-0.200000 0.040000 0.229083 +-0.200000 0.060000 0.230567 +-0.200000 0.080000 0.233067 +-0.200000 0.100000 0.235334 +-0.200000 0.120000 0.236920 +-0.200000 0.140000 0.238582 +-0.200000 0.160000 0.237422 +-0.200000 0.180000 0.235506 +-0.200000 0.200000 0.231947 +-0.180000 -0.200000 0.182038 +-0.180000 -0.180000 0.179187 +-0.180000 -0.160000 0.186054 +-0.180000 -0.140000 0.193727 +-0.180000 -0.120000 0.198359 +-0.180000 -0.100000 0.198534 +-0.180000 -0.080000 0.199244 +-0.180000 -0.060000 0.202483 +-0.180000 -0.040000 0.203987 +-0.180000 -0.020000 0.200942 +-0.180000 0.000000 0.195834 +-0.180000 0.020000 0.197014 +-0.180000 0.040000 0.201671 +-0.180000 0.060000 0.206414 +-0.180000 0.080000 0.211721 +-0.180000 0.100000 0.216155 +-0.180000 0.120000 0.218834 +-0.180000 0.140000 0.220164 +-0.180000 0.160000 0.218139 +-0.180000 0.180000 0.210873 +-0.180000 0.200000 0.204249 +-0.160000 -0.200000 0.204780 +-0.160000 -0.180000 0.202995 +-0.160000 -0.160000 0.206103 +-0.160000 -0.140000 0.210804 +-0.160000 -0.120000 0.217632 +-0.160000 -0.100000 0.223534 +-0.160000 -0.080000 0.224305 +-0.160000 -0.060000 0.220110 +-0.160000 -0.040000 0.213877 +-0.160000 -0.020000 0.211028 +-0.160000 0.000000 0.211839 +-0.160000 0.020000 0.217025 +-0.160000 0.040000 0.225248 +-0.160000 0.060000 0.233616 +-0.160000 0.080000 0.240293 +-0.160000 0.100000 0.245469 +-0.160000 0.120000 0.248232 +-0.160000 0.140000 0.246700 +-0.160000 0.160000 0.243378 +-0.160000 0.180000 0.238449 +-0.160000 0.200000 0.234312 +-0.140000 -0.200000 0.249812 +-0.140000 -0.180000 0.243337 +-0.140000 -0.160000 0.245411 +-0.140000 -0.140000 0.250277 +-0.140000 -0.120000 0.253934 +-0.140000 -0.100000 0.254405 +-0.140000 -0.080000 0.252927 +-0.140000 -0.060000 0.250985 +-0.140000 -0.040000 0.246804 +-0.140000 -0.020000 0.242542 +-0.140000 0.000000 0.240753 +-0.140000 0.020000 0.243147 +-0.140000 0.040000 0.250064 +-0.140000 0.060000 0.259377 +-0.140000 0.080000 0.268807 +-0.140000 0.100000 0.276313 +-0.140000 0.120000 0.280525 +-0.140000 0.140000 0.282454 +-0.140000 0.160000 0.282161 +-0.140000 0.180000 0.278931 +-0.140000 0.200000 0.276294 +-0.120000 -0.200000 0.280957 +-0.120000 -0.180000 0.269749 +-0.120000 -0.160000 0.268670 +-0.120000 -0.140000 0.274373 +-0.120000 -0.120000 0.280717 +-0.120000 -0.100000 0.284719 +-0.120000 -0.080000 0.283637 +-0.120000 -0.060000 0.278349 +-0.120000 -0.040000 0.271420 +-0.120000 -0.020000 0.264488 +-0.120000 0.000000 0.258758 +-0.120000 0.020000 0.257400 +-0.120000 0.040000 0.260877 +-0.120000 0.060000 0.267988 +-0.120000 0.080000 0.276905 +-0.120000 0.100000 0.286505 +-0.120000 0.120000 0.294538 +-0.120000 0.140000 0.299380 +-0.120000 0.160000 0.300329 +-0.120000 0.180000 0.298676 +-0.120000 0.200000 0.298349 +-0.100000 -0.200000 0.284063 +-0.100000 -0.180000 0.266369 +-0.100000 -0.160000 0.262852 +-0.100000 -0.140000 0.270753 +-0.100000 -0.120000 0.283411 +-0.100000 -0.100000 0.293855 +-0.100000 -0.080000 0.299049 +-0.100000 -0.060000 0.297209 +-0.100000 -0.040000 0.288463 +-0.100000 -0.020000 0.275955 +-0.100000 0.000000 0.264922 +-0.100000 0.020000 0.257221 +-0.100000 0.040000 0.255246 +-0.100000 0.060000 0.258092 +-0.100000 0.080000 0.264308 +-0.100000 0.100000 0.271992 +-0.100000 0.120000 0.279263 +-0.100000 0.140000 0.284952 +-0.100000 0.160000 0.288756 +-0.100000 0.180000 0.290314 +-0.100000 0.200000 0.292034 +-0.080000 -0.200000 0.262568 +-0.080000 -0.180000 0.237003 +-0.080000 -0.160000 0.225902 +-0.080000 -0.140000 0.229890 +-0.080000 -0.120000 0.244123 +-0.080000 -0.100000 0.262318 +-0.080000 -0.080000 0.278903 +-0.080000 -0.060000 0.288967 +-0.080000 -0.040000 0.287931 +-0.080000 -0.020000 0.276917 +-0.080000 0.000000 0.258887 +-0.080000 0.020000 0.241786 +-0.080000 0.040000 0.229870 +-0.080000 0.060000 0.223233 +-0.080000 0.080000 0.222149 +-0.080000 0.100000 0.226041 +-0.080000 0.120000 0.232384 +-0.080000 0.140000 0.239738 +-0.080000 0.160000 0.246845 +-0.080000 0.180000 0.253609 +-0.080000 0.200000 0.258255 +-0.060000 -0.200000 0.225300 +-0.060000 -0.180000 0.192552 +-0.060000 -0.160000 0.171877 +-0.060000 -0.140000 0.167825 +-0.060000 -0.120000 0.177750 +-0.060000 -0.100000 0.195866 +-0.060000 -0.080000 0.216211 +-0.060000 -0.060000 0.233791 +-0.060000 -0.040000 0.244590 +-0.060000 -0.020000 0.245003 +-0.060000 0.000000 0.232680 +-0.060000 0.020000 0.209739 +-0.060000 0.040000 0.182456 +-0.060000 0.060000 0.164839 +-0.060000 0.080000 0.156237 +-0.060000 0.100000 0.154964 +-0.060000 0.120000 0.160744 +-0.060000 0.140000 0.171431 +-0.060000 0.160000 0.183671 +-0.060000 0.180000 0.194821 +-0.060000 0.200000 0.203312 +-0.040000 -0.200000 0.182587 +-0.040000 -0.180000 0.151587 +-0.040000 -0.160000 0.130215 +-0.040000 -0.140000 0.111248 +-0.040000 -0.120000 0.104645 +-0.040000 -0.100000 0.115557 +-0.040000 -0.080000 0.131768 +-0.040000 -0.060000 0.150495 +-0.040000 -0.040000 0.165957 +-0.040000 -0.020000 0.174228 +-0.040000 0.000000 0.171950 +-0.040000 0.020000 0.159170 +-0.040000 0.040000 0.139673 +-0.040000 0.060000 0.112675 +-0.040000 0.080000 0.082007 +-0.040000 0.100000 0.073287 +-0.040000 0.120000 0.077679 +-0.040000 0.140000 0.090224 +-0.040000 0.160000 0.106630 +-0.040000 0.180000 0.124942 +-0.040000 0.200000 0.140539 +-0.020000 -0.200000 0.151384 +-0.020000 -0.180000 0.144335 +-0.020000 -0.160000 0.165137 +-0.020000 -0.140000 0.176629 +-0.020000 -0.120000 0.163708 +-0.020000 -0.100000 0.128560 +-0.020000 -0.080000 0.083448 +-0.020000 -0.060000 0.071862 +-0.020000 -0.040000 0.076226 +-0.020000 -0.020000 0.083581 +-0.020000 0.000000 0.087505 +-0.020000 0.020000 0.087348 +-0.020000 0.040000 0.084493 +-0.020000 0.060000 0.079752 +-0.020000 0.080000 0.070447 +-0.020000 0.100000 0.056401 +-0.020000 0.120000 0.054959 +-0.020000 0.140000 0.066375 +-0.020000 0.160000 0.084625 +-0.020000 0.180000 0.102121 +-0.020000 0.200000 0.114847 +0.000000 -0.200000 0.171402 +0.000000 -0.180000 0.189603 +0.000000 -0.160000 0.208947 +0.000000 -0.140000 0.226213 +0.000000 -0.120000 0.236720 +0.000000 -0.100000 0.231438 +0.000000 -0.080000 0.195599 +0.000000 -0.060000 0.147752 +0.000000 -0.040000 0.100448 +0.000000 -0.020000 0.058369 +0.000000 0.000000 0.025287 +0.000000 0.020000 0.004761 +0.000000 0.040000 0.014866 +0.000000 0.060000 0.039572 +0.000000 0.080000 0.072106 +0.000000 0.100000 0.111196 +0.000000 0.120000 0.149206 +0.000000 0.140000 0.167872 +0.000000 0.160000 0.170753 +0.000000 0.180000 0.165796 +0.000000 0.200000 0.158494 +0.020000 -0.200000 0.219889 +0.020000 -0.180000 0.235430 +0.020000 -0.160000 0.247361 +0.020000 -0.140000 0.252423 +0.020000 -0.120000 0.250842 +0.020000 -0.100000 0.246555 +0.020000 -0.080000 0.240740 +0.020000 -0.060000 0.227473 +0.020000 -0.040000 0.195318 +0.020000 -0.020000 0.151465 +0.020000 0.000000 0.115124 +0.020000 0.020000 0.094301 +0.020000 0.040000 0.086791 +0.020000 0.060000 0.090799 +0.020000 0.080000 0.105275 +0.020000 0.100000 0.125077 +0.020000 0.120000 0.162912 +0.020000 0.140000 0.202039 +0.020000 0.160000 0.234153 +0.020000 0.180000 0.248676 +0.020000 0.200000 0.244408 +0.040000 -0.200000 0.254747 +0.040000 -0.180000 0.270655 +0.040000 -0.160000 0.282916 +0.040000 -0.140000 0.284537 +0.040000 -0.120000 0.275432 +0.040000 -0.100000 0.257313 +0.040000 -0.080000 0.233386 +0.040000 -0.060000 0.214453 +0.040000 -0.040000 0.207464 +0.040000 -0.020000 0.197309 +0.040000 0.000000 0.184317 +0.040000 0.020000 0.171796 +0.040000 0.040000 0.164438 +0.040000 0.060000 0.163785 +0.040000 0.080000 0.169108 +0.040000 0.100000 0.179010 +0.040000 0.120000 0.190367 +0.040000 0.140000 0.198370 +0.040000 0.160000 0.207285 +0.040000 0.180000 0.231693 +0.040000 0.200000 0.250915 +0.060000 -0.200000 0.256855 +0.060000 -0.180000 0.276710 +0.060000 -0.160000 0.293412 +0.060000 -0.140000 0.302516 +0.060000 -0.120000 0.301984 +0.060000 -0.100000 0.290723 +0.060000 -0.080000 0.269811 +0.060000 -0.060000 0.242348 +0.060000 -0.040000 0.213899 +0.060000 -0.020000 0.197506 +0.060000 0.000000 0.194649 +0.060000 0.020000 0.196919 +0.060000 0.040000 0.201484 +0.060000 0.060000 0.207841 +0.060000 0.080000 0.215193 +0.060000 0.100000 0.222306 +0.060000 0.120000 0.228491 +0.060000 0.140000 0.232925 +0.060000 0.160000 0.234814 +0.060000 0.180000 0.234990 +0.060000 0.200000 0.236110 +0.080000 -0.200000 0.239283 +0.080000 -0.180000 0.266236 +0.080000 -0.160000 0.291979 +0.080000 -0.140000 0.311736 +0.080000 -0.120000 0.322596 +0.080000 -0.100000 0.321746 +0.080000 -0.080000 0.310274 +0.080000 -0.060000 0.288831 +0.080000 -0.040000 0.260154 +0.080000 -0.020000 0.230122 +0.080000 0.000000 0.208099 +0.080000 0.020000 0.203377 +0.080000 0.040000 0.211029 +0.080000 0.060000 0.223133 +0.080000 0.080000 0.235873 +0.080000 0.100000 0.246929 +0.080000 0.120000 0.255469 +0.080000 0.140000 0.260256 +0.080000 0.160000 0.262551 +0.080000 0.180000 0.262930 +0.080000 0.200000 0.263538 +0.100000 -0.200000 0.224032 +0.100000 -0.180000 0.251813 +0.100000 -0.160000 0.283150 +0.100000 -0.140000 0.311447 +0.100000 -0.120000 0.331887 +0.100000 -0.100000 0.342609 +0.100000 -0.080000 0.341107 +0.100000 -0.060000 0.328309 +0.100000 -0.040000 0.306186 +0.100000 -0.020000 0.277596 +0.100000 0.000000 0.248784 +0.100000 0.020000 0.227634 +0.100000 0.040000 0.220348 +0.100000 0.060000 0.227936 +0.100000 0.080000 0.242469 +0.100000 0.100000 0.258341 +0.100000 0.120000 0.270793 +0.100000 0.140000 0.279508 +0.100000 0.160000 0.282801 +0.100000 0.180000 0.283595 +0.100000 0.200000 0.283243 +0.120000 -0.200000 0.214329 +0.120000 -0.180000 0.235960 +0.120000 -0.160000 0.267241 +0.120000 -0.140000 0.300364 +0.120000 -0.120000 0.328925 +0.120000 -0.100000 0.348828 +0.120000 -0.080000 0.357524 +0.120000 -0.060000 0.356614 +0.120000 -0.040000 0.343680 +0.120000 -0.020000 0.320760 +0.120000 0.000000 0.292483 +0.120000 0.020000 0.265802 +0.120000 0.040000 0.247185 +0.120000 0.060000 0.239374 +0.120000 0.080000 0.244584 +0.120000 0.100000 0.258869 +0.120000 0.120000 0.274080 +0.120000 0.140000 0.286864 +0.120000 0.160000 0.293643 +0.120000 0.180000 0.296538 +0.120000 0.200000 0.295224 +0.140000 -0.200000 0.208937 +0.140000 -0.180000 0.219329 +0.140000 -0.160000 0.244230 +0.140000 -0.140000 0.277994 +0.140000 -0.120000 0.313460 +0.140000 -0.100000 0.343620 +0.140000 -0.080000 0.363394 +0.140000 -0.060000 0.371371 +0.140000 -0.040000 0.368014 +0.140000 -0.020000 0.352790 +0.140000 0.000000 0.328529 +0.140000 0.020000 0.300610 +0.140000 0.040000 0.276293 +0.140000 0.060000 0.261040 +0.140000 0.080000 0.256352 +0.140000 0.100000 0.260043 +0.140000 0.120000 0.270921 +0.140000 0.140000 0.282609 +0.140000 0.160000 0.292651 +0.140000 0.180000 0.298683 +0.140000 0.200000 0.299351 +0.160000 -0.200000 0.208930 +0.160000 -0.180000 0.209474 +0.160000 -0.160000 0.225692 +0.160000 -0.140000 0.252326 +0.160000 -0.120000 0.287786 +0.160000 -0.100000 0.323612 +0.160000 -0.080000 0.351790 +0.160000 -0.060000 0.368862 +0.160000 -0.040000 0.373324 +0.160000 -0.020000 0.366647 +0.160000 0.000000 0.349063 +0.160000 0.020000 0.325489 +0.160000 0.040000 0.302697 +0.160000 0.060000 0.279890 +0.160000 0.080000 0.266263 +0.160000 0.100000 0.263140 +0.160000 0.120000 0.267236 +0.160000 0.140000 0.275563 +0.160000 0.160000 0.286028 +0.160000 0.180000 0.293808 +0.160000 0.200000 0.296959 +0.180000 -0.200000 0.209738 +0.180000 -0.180000 0.204589 +0.180000 -0.160000 0.216623 +0.180000 -0.140000 0.237377 +0.180000 -0.120000 0.262045 +0.180000 -0.100000 0.291504 +0.180000 -0.080000 0.322174 +0.180000 -0.060000 0.347220 +0.180000 -0.040000 0.362163 +0.180000 -0.020000 0.365730 +0.180000 0.000000 0.358602 +0.180000 0.020000 0.345226 +0.180000 0.040000 0.330405 +0.180000 0.060000 0.313120 +0.180000 0.080000 0.290451 +0.180000 0.100000 0.270103 +0.180000 0.120000 0.263280 +0.180000 0.140000 0.266297 +0.180000 0.160000 0.272171 +0.180000 0.180000 0.278595 +0.180000 0.200000 0.283868 +0.200000 -0.200000 0.210386 +0.200000 -0.180000 0.199916 +0.200000 -0.160000 0.209473 +0.200000 -0.140000 0.230364 +0.200000 -0.120000 0.254769 +0.200000 -0.100000 0.279778 +0.200000 -0.080000 0.303115 +0.200000 -0.060000 0.325309 +0.200000 -0.040000 0.344418 +0.200000 -0.020000 0.356004 +0.200000 0.000000 0.358282 +0.200000 0.020000 0.351850 +0.200000 0.040000 0.341056 +0.200000 0.060000 0.331006 +0.200000 0.080000 0.321410 +0.200000 0.100000 0.305513 +0.200000 0.120000 0.281952 +0.200000 0.140000 0.266550 +0.200000 0.160000 0.263071 +0.200000 0.180000 0.265807 +0.200000 0.200000 0.270385 diff --git a/extra/sxrd/tests/mapper/sic111-r3xr3.blk b/extra/sxrd/tests/mapper/sic111-r3xr3.blk new file mode 100644 index 00000000..cf9eee11 --- /dev/null +++ b/extra/sxrd/tests/mapper/sic111-r3xr3.blk @@ -0,0 +1,20 @@ +# SiC(111) bulk +5.33940 5.33940 7.5510487 90.000000 90.000000 120.000000 +Si 0.00000000 0.00000000 0.00000000 0.0 1.0 +Si 0.33333333 0.66666667 0.00000000 0.0 1.0 +Si 0.66666667 0.33333333 0.00000000 0.0 1.0 +C 0.00000000 0.00000000 0.25000000 0.0 1.0 +C 0.33333333 0.66666667 0.25000000 0.0 1.0 +C 0.66666667 0.33333333 0.25000000 0.0 1.0 +Si 0.33333333 0.00000000 0.33333333 0.0 1.0 +Si 0.00000000 0.33333333 0.33333333 0.0 1.0 +Si 0.66666666 0.66666666 0.33333333 0.0 1.0 +C 0.33333333 0.00000000 0.58333333 0.0 1.0 +C 0.00000000 0.33333333 0.58333333 0.0 1.0 +C 0.66666666 0.66666666 0.58333333 0.0 1.0 +Si 0.33333333 0.33333333 0.66666667 0.0 1.0 +Si 0.66666666 0.00000000 0.66666667 0.0 1.0 +Si 0.00000000 0.66666666 0.66666667 0.0 1.0 +C 0.33333333 0.33333333 0.91666666 0.0 1.0 +C 0.66666666 0.00000000 0.91666666 0.0 1.0 +C 0.00000000 0.66666666 0.91666666 0.0 1.0 diff --git a/extra/sxrd/tests/mapper/sic111-r3xr3_f.dat b/extra/sxrd/tests/mapper/sic111-r3xr3_f.dat new file mode 100644 index 00000000..2a27176c --- /dev/null +++ b/extra/sxrd/tests/mapper/sic111-r3xr3_f.dat @@ -0,0 +1,50 @@ +0.000000 0.000000 0.050000 572.805262 0.1 +0.000000 0.000000 0.150000 190.712559 0.1 +0.000000 0.000000 0.250000 114.163340 0.1 +0.000000 0.000000 0.350000 81.267319 0.1 +0.000000 0.000000 0.450000 62.927325 0.1 +0.000000 0.000000 0.550000 51.209358 0.1 +0.000000 0.000000 0.650000 43.063424 0.1 +0.000000 0.000000 0.750000 37.067788 0.1 +0.000000 0.000000 0.850000 32.471491 0.1 +0.000000 0.000000 0.950000 28.841720 0.1 +0.000000 0.000000 1.050000 25.912834 0.1 +0.000000 0.000000 1.150000 23.514369 0.1 +0.000000 0.000000 1.250000 21.533857 0.1 +0.000000 0.000000 1.350000 19.896524 0.1 +0.000000 0.000000 1.450000 18.553831 0.1 +0.000000 0.000000 1.550000 17.477037 0.1 +0.000000 0.000000 1.650000 16.653845 0.1 +0.000000 0.000000 1.750000 16.087160 0.1 +0.000000 0.000000 1.850000 15.795546 0.1 +0.000000 0.000000 1.950000 15.815396 0.1 +0.000000 0.000000 2.050000 16.205508 0.1 +0.000000 0.000000 2.150000 17.055856 0.1 +0.000000 0.000000 2.250000 18.505014 0.1 +0.000000 0.000000 2.350000 20.775759 0.1 +0.000000 0.000000 2.450000 24.252284 0.1 +0.000000 0.000000 2.550000 29.662586 0.1 +0.000000 0.000000 2.650000 38.574319 0.1 +0.000000 0.000000 2.750000 55.079247 0.1 +0.000000 0.000000 2.850000 94.211182 0.1 +0.000000 0.000000 2.950000 291.366841 0.1 +0.000000 0.000000 3.050000 301.315362 0.1 +0.000000 0.000000 3.150000 104.090382 0.1 +0.000000 0.000000 3.250000 64.817320 0.1 +0.000000 0.000000 3.350000 48.094751 0.1 +0.000000 0.000000 3.450000 38.882507 0.1 +0.000000 0.000000 3.550000 33.081716 0.1 +0.000000 0.000000 3.650000 29.118046 0.1 +0.000000 0.000000 3.750000 26.258489 0.1 +0.000000 0.000000 3.850000 24.116399 0.1 +0.000000 0.000000 3.950000 22.469230 0.1 +0.000000 0.000000 4.050000 21.180549 0.1 +0.000000 0.000000 4.150000 20.162695 0.1 +0.000000 0.000000 4.250000 19.357688 0.1 +0.000000 0.000000 4.350000 18.726538 0.1 +0.000000 0.000000 4.450000 18.243250 0.1 +0.000000 0.000000 4.550000 17.891342 0.1 +0.000000 0.000000 4.650000 17.661943 0.1 +0.000000 0.000000 4.750000 17.553000 0.1 +0.000000 0.000000 4.850000 17.569432 0.1 +0.000000 0.000000 4.950000 17.724338 0.1 diff --git a/extra/sxrd/tests/minsearch/do.sh b/extra/sxrd/tests/minsearch/do.sh new file mode 100644 index 00000000..8ffb325b --- /dev/null +++ b/extra/sxrd/tests/minsearch/do.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +set -e + +#CMD=py2dmat-sxrd +CMD="python3 ../../src/main.py" + +sh prepare.sh + +time $CMD input.toml + +result=output/res.txt +reference=ref.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + +result=output/SimplexData.txt +reference=ref_SimplexData.txt + +echo diff $result $reference +res=0 +diff $result $reference || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $result and $reference differ + false +fi + diff --git a/extra/sxrd/tests/minsearch/input.toml b/extra/sxrd/tests/minsearch/input.toml new file mode 100644 index 00000000..cfe87de3 --- /dev/null +++ b/extra/sxrd/tests/minsearch/input.toml @@ -0,0 +1,48 @@ +[base] +dimension = 2 +output_dir = "output" + +[solver] +name = "sxrd" + +[solver.config] +sxrd_exec_file = "../bin/sxrdcalc" +bulk_struc_in_file = "sic111-r3xr3.blk" +[solver.param] +scale_factor = 1.0 +type_vector = [1, 2] +[[solver.param.domain]] +domain_occupancy = 1.0 + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.00000000, 0.00000000, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.33333333, 0.66666667, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.66666667, 0.33333333, 1.00000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[1, 0.0, 0.0, 1.0]] + [[solver.param.domain.atom]] + name = "Si" + pos_center = [0.33333333, 0.33333333, 1.20000000] + DWfactor = 0.0 + occupancy = 1.0 + displace_vector = [[2, 0.0, 0.0, 1.0]] +[solver.reference] +f_in_file = "sic111-r3xr3_f.dat" +[algorithm] +name = "minsearch" +label_list = ["z1", "z2"] +[algorithm.param] +min_list = [-0.2, -0.2] +max_list = [0.2, 0.2] +initial_list = [0.0, 0.0] diff --git a/extra/sxrd/tests/minsearch/prepare.sh b/extra/sxrd/tests/minsearch/prepare.sh new file mode 100644 index 00000000..e3273d63 --- /dev/null +++ b/extra/sxrd/tests/minsearch/prepare.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +rm -rf ./output +rm -f lsfit.in diff --git a/extra/sxrd/tests/minsearch/ref.txt b/extra/sxrd/tests/minsearch/ref.txt new file mode 100644 index 00000000..b1d3c219 --- /dev/null +++ b/extra/sxrd/tests/minsearch/ref.txt @@ -0,0 +1,3 @@ +fx = 0.000106 +z1 = -2.351035891479114e-05 +z2 = 0.025129315870799473 diff --git a/extra/sxrd/tests/minsearch/ref_SimplexData.txt b/extra/sxrd/tests/minsearch/ref_SimplexData.txt new file mode 100644 index 00000000..6f7416b4 --- /dev/null +++ b/extra/sxrd/tests/minsearch/ref_SimplexData.txt @@ -0,0 +1,27 @@ +#step z1 z2 R-factor +0 0.0 0.0 0.025287 +1 0.0 0.0 0.025287 +2 0.0 0.0 0.025287 +3 0.0 0.0 0.025287 +4 0.0 0.0 0.025287 +5 0.0 0.0 0.025287 +6 0.0 0.0 0.025287 +7 0.0 0.0 0.025287 +8 -0.0020751953125 0.028076171875 0.010644 +9 -0.0020751953125 0.028076171875 0.010644 +10 0.00080108642578125 0.0332794189453125 0.008643 +11 0.0012531280517578125 0.023487091064453125 0.006526 +12 -0.0005240440368652344 0.028229713439941406 0.004406 +13 -0.0005240440368652344 0.028229713439941406 0.004406 +14 0.0004775524139404297 0.023410320281982422 0.00326 +15 -4.762411117553711e-05 0.022128701210021973 0.00278 +16 -0.00015453994274139404 0.025499612092971802 0.000897 +17 -0.00015453994274139404 0.025499612092971802 0.000897 +18 -0.00015453994274139404 0.025499612092971802 0.000897 +19 7.58124515414238e-05 0.02492680959403515 0.000462 +20 7.58124515414238e-05 0.02492680959403515 0.000462 +21 -8.324318332597613e-05 0.025063568842597306 0.000367 +22 4.427960084285587e-05 0.025328663032269105 0.000251 +23 2.8165330149931833e-05 0.025061462765734177 0.000168 +24 -2.351035891479114e-05 0.025129315870799473 0.000106 +25 -2.351035891479114e-05 0.025129315870799473 0.000106 diff --git a/extra/sxrd/tests/minsearch/sic111-r3xr3.blk b/extra/sxrd/tests/minsearch/sic111-r3xr3.blk new file mode 100644 index 00000000..c8507e2d --- /dev/null +++ b/extra/sxrd/tests/minsearch/sic111-r3xr3.blk @@ -0,0 +1,20 @@ +# SiC(111) bulk +5.33940 5.33940 7.5510487 90.000000 90.000000 120.000000 +Si 0.00000000 0.00000000 0.00000000 0.0 1.0 +Si 0.33333333 0.66666667 0.00000000 0.0 1.0 +Si 0.66666667 0.33333333 0.00000000 0.0 1.0 +C 0.00000000 0.00000000 0.25000000 0.0 1.0 +C 0.33333333 0.66666667 0.25000000 0.0 1.0 +C 0.66666667 0.33333333 0.25000000 0.0 1.0 +Si 0.33333333 0.00000000 0.33333333 0.0 1.0 +Si 0.00000000 0.33333333 0.33333333 0.0 1.0 +Si 0.66666666 0.66666666 0.33333333 0.0 1.0 +C 0.33333333 0.00000000 0.58333333 0.0 1.0 +C 0.00000000 0.33333333 0.58333333 0.0 1.0 +C 0.66666666 0.66666666 0.58333333 0.0 1.0 +Si 0.33333333 0.33333333 0.66666667 0.0 1.0 +Si 0.66666666 0.00000000 0.66666667 0.0 1.0 +Si 0.00000000 0.66666666 0.66666667 0.0 1.0 +C 0.33333333 0.33333333 0.91666666 0.0 1.0 +C 0.66666666 0.00000000 0.91666666 0.0 1.0 +C 0.00000000 0.66666666 0.91666666 0.0 1.0 diff --git a/extra/sxrd/tests/minsearch/sic111-r3xr3_f.dat b/extra/sxrd/tests/minsearch/sic111-r3xr3_f.dat new file mode 100644 index 00000000..c81d0eaf --- /dev/null +++ b/extra/sxrd/tests/minsearch/sic111-r3xr3_f.dat @@ -0,0 +1,50 @@ +0.000000 0.000000 0.050000 572.805262 0.1 +0.000000 0.000000 0.150000 190.712559 0.1 +0.000000 0.000000 0.250000 114.163340 0.1 +0.000000 0.000000 0.350000 81.267319 0.1 +0.000000 0.000000 0.450000 62.927325 0.1 +0.000000 0.000000 0.550000 51.209358 0.1 +0.000000 0.000000 0.650000 43.063424 0.1 +0.000000 0.000000 0.750000 37.067788 0.1 +0.000000 0.000000 0.850000 32.471491 0.1 +0.000000 0.000000 0.950000 28.841720 0.1 +0.000000 0.000000 1.050000 25.912834 0.1 +0.000000 0.000000 1.150000 23.514369 0.1 +0.000000 0.000000 1.250000 21.533857 0.1 +0.000000 0.000000 1.350000 19.896524 0.1 +0.000000 0.000000 1.450000 18.553831 0.1 +0.000000 0.000000 1.550000 17.477037 0.1 +0.000000 0.000000 1.650000 16.653845 0.1 +0.000000 0.000000 1.750000 16.087160 0.1 +0.000000 0.000000 1.850000 15.795546 0.1 +0.000000 0.000000 1.950000 15.815396 0.1 +0.000000 0.000000 2.050000 16.205508 0.1 +0.000000 0.000000 2.150000 17.055856 0.1 +0.000000 0.000000 2.250000 18.505014 0.1 +0.000000 0.000000 2.350000 20.775759 0.1 +0.000000 0.000000 2.450000 24.252284 0.1 +0.000000 0.000000 2.550000 29.662586 0.1 +0.000000 0.000000 2.650000 38.574319 0.1 +0.000000 0.000000 2.750000 55.079247 0.1 +0.000000 0.000000 2.850000 94.211182 0.1 +0.000000 0.000000 2.950000 291.366841 0.1 +0.000000 0.000000 3.050000 301.315362 0.1 +0.000000 0.000000 3.150000 104.090382 0.1 +0.000000 0.000000 3.250000 64.817320 0.1 +0.000000 0.000000 3.350000 48.094751 0.1 +0.000000 0.000000 3.450000 38.882507 0.1 +0.000000 0.000000 3.550000 33.081716 0.1 +0.000000 0.000000 3.650000 29.118046 0.1 +0.000000 0.000000 3.750000 26.258489 0.1 +0.000000 0.000000 3.850000 24.116399 0.1 +0.000000 0.000000 3.950000 22.469230 0.1 +0.000000 0.000000 4.050000 21.180549 0.1 +0.000000 0.000000 4.150000 20.162695 0.1 +0.000000 0.000000 4.250000 19.357688 0.1 +0.000000 0.000000 4.350000 18.726538 0.1 +0.000000 0.000000 4.450000 18.243250 0.1 +0.000000 0.000000 4.550000 17.891342 0.1 +0.000000 0.000000 4.650000 17.661943 0.1 +0.000000 0.000000 4.750000 17.553000 0.1 +0.000000 0.000000 4.850000 17.569432 0.1 +0.000000 0.000000 4.950000 17.724338 0.1 From d130d3b3f102431b78d1a6d1b7a0902334c3c4a0 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 05:00:27 +0900 Subject: [PATCH 11/14] add main script for extra/leed --- extra/leed/src/main.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 extra/leed/src/main.py diff --git a/extra/leed/src/main.py b/extra/leed/src/main.py new file mode 100644 index 00000000..c3062457 --- /dev/null +++ b/extra/leed/src/main.py @@ -0,0 +1,20 @@ +# 2DMAT -- Data-analysis software of quantum beam diffraction experiments for 2D material structure +# Copyright (C) 2020- The University of Tokyo +# +# 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/. + +if __name__ == "__main__": + # sys.path[0] is this directory (2DMAT/src) + from leed._main import main + main() From 9d765e4b80af8e19163e7fc3870ea207048d5515 Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 05:01:26 +0900 Subject: [PATCH 12/14] add tests for extra/leed --- extra/leed/tests/bin/.placeholder | 0 extra/leed/tests/mapper/MeshData.txt | 10 + extra/leed/tests/mapper/base/exp.d | 1430 +++++++ extra/leed/tests/mapper/base/rfac.d | 6 + extra/leed/tests/mapper/base/short.t | Bin 0 -> 251308 bytes extra/leed/tests/mapper/base/tleed.o | 4685 ++++++++++++++++++++++ extra/leed/tests/mapper/base/tleed4.i | 25 + extra/leed/tests/mapper/base/tleed5.i | 319 ++ extra/leed/tests/mapper/do.sh | 24 + extra/leed/tests/mapper/input.toml | 16 + extra/leed/tests/mapper/prepare.sh | 3 + extra/leed/tests/mapper/ref_ColorMap.txt | 10 + 12 files changed, 6528 insertions(+) create mode 100644 extra/leed/tests/bin/.placeholder create mode 100644 extra/leed/tests/mapper/MeshData.txt create mode 100644 extra/leed/tests/mapper/base/exp.d create mode 100644 extra/leed/tests/mapper/base/rfac.d create mode 100644 extra/leed/tests/mapper/base/short.t create mode 100644 extra/leed/tests/mapper/base/tleed.o create mode 100644 extra/leed/tests/mapper/base/tleed4.i create mode 100644 extra/leed/tests/mapper/base/tleed5.i create mode 100644 extra/leed/tests/mapper/do.sh create mode 100644 extra/leed/tests/mapper/input.toml create mode 100644 extra/leed/tests/mapper/prepare.sh create mode 100644 extra/leed/tests/mapper/ref_ColorMap.txt diff --git a/extra/leed/tests/bin/.placeholder b/extra/leed/tests/bin/.placeholder new file mode 100644 index 00000000..e69de29b diff --git a/extra/leed/tests/mapper/MeshData.txt b/extra/leed/tests/mapper/MeshData.txt new file mode 100644 index 00000000..f4250ab7 --- /dev/null +++ b/extra/leed/tests/mapper/MeshData.txt @@ -0,0 +1,10 @@ +0 -0.1 0 +1 -0.05 0 +2 0 0 +3 0.05 0 +4 0.1 0 +5 -0.1 0.05 +6 -0.05 0.05 +7 0 0.05 +8 0.05 0.05 +9 0.1 0.05 diff --git a/extra/leed/tests/mapper/base/exp.d b/extra/leed/tests/mapper/base/exp.d new file mode 100644 index 00000000..d82916cd --- /dev/null +++ b/extra/leed/tests/mapper/base/exp.d @@ -0,0 +1,1430 @@ +Cu(001)-p(1x1) + 5 + 1 2 3 4 5 +(2F12.3) + 1.0 +(1,0) +430 1.0000E+000 + 110.000 32909.102 + 111.000 32989.949 + 112.000 27115.830 + 113.000 20836.936 + 114.000 17491.109 + 115.000 18582.375 + 116.000 23811.061 + 117.000 28160.055 + 118.000 34106.836 + 119.000 43209.809 + 120.000 55337.309 + 121.000 74917.289 + 122.000 93303.633 + 123.000 127680.633 + 124.000 164766.625 + 125.000 217950.922 + 126.000 260295.000 + 127.000 303758.281 + 128.000 345681.938 + 129.000 377419.344 + 130.000 413735.062 + 131.000 419946.562 + 132.000 432770.312 + 133.000 452263.031 + 134.000 505907.844 + 135.000 546827.312 + 136.000 578923.188 + 137.000 632437.250 + 138.000 685416.688 + 139.000 765741.250 + 140.000 831670.375 + 141.000 899387.562 + 142.000 980058.562 + 143.000 962418.375 + 144.000 969287.250 + 145.000 987338.125 + 146.000 972646.188 + 147.000 926261.500 + 148.000 850372.500 + 149.000 826287.500 + 150.000 797515.625 + 151.000 766293.375 + 152.000 699646.312 + 153.000 640080.500 + 154.000 594140.000 + 155.000 522062.094 + 156.000 518720.688 + 157.000 473471.250 + 158.000 436965.281 + 159.000 400841.688 + 160.000 369550.125 + 161.000 346436.375 + 162.000 305236.375 + 163.000 280297.500 + 164.000 268620.656 + 165.000 262791.781 + 166.000 279864.906 + 167.000 270487.125 + 168.000 264729.875 + 169.000 256462.391 + 170.000 242067.734 + 171.000 229818.219 + 172.000 213597.938 + 173.000 195484.375 + 174.000 175022.922 + 175.000 153103.125 + 176.000 133987.766 + 177.000 123210.469 + 178.000 117077.523 + 179.000 119541.977 + 180.000 131733.625 + 181.000 149118.062 + 182.000 168445.406 + 183.000 181765.188 + 184.000 186211.938 + 185.000 186715.828 + 186.000 186305.062 + 187.000 182094.891 + 188.000 172276.328 + 189.000 160217.609 + 190.000 151400.234 + 191.000 139816.531 + 192.000 129011.508 + 193.000 119811.195 + 194.000 103119.766 + 195.000 89488.773 + 196.000 70887.078 + 197.000 51738.016 + 198.000 34914.809 + 199.000 21172.830 + 200.000 11821.845 + 201.000 5363.610 + 202.000 2786.175 + 203.000 2336.460 + 204.000 5405.925 + 205.000 11685.240 + 206.000 22033.096 + 207.000 38319.121 + 208.000 59729.145 + 209.000 92425.406 + 210.000 133250.359 + 211.000 180270.297 + 212.000 232451.734 + 213.000 297839.969 + 214.000 367414.438 + 215.000 451008.062 + 216.000 479037.250 + 217.000 588375.750 + 218.000 637339.000 + 219.000 695676.750 + 220.000 781607.000 + 221.000 864629.500 + 222.000 883315.250 + 223.000 900421.500 + 224.000 902824.750 + 225.000 896670.750 + 226.000 907167.000 + 227.000 912420.500 + 228.000 907503.250 + 229.000 901057.500 + 230.000 884973.250 + 231.000 877993.750 + 232.000 878241.250 + 233.000 995683.250 + 234.000 1020213.500 + 235.000 1110933.250 + 236.000 1180058.000 + 237.000 1244432.750 + 238.000 1384215.500 + 239.000 1441139.000 + 240.000 1458993.750 + 241.000 1449588.000 + 242.000 1426297.000 + 243.000 1438385.000 + 244.000 1386657.250 + 245.000 1336027.250 + 246.000 1248691.250 + 247.000 1186490.750 + 248.000 1110345.750 + 249.000 1047945.500 + 250.000 980296.250 + 251.000 919436.250 + 252.000 865700.750 + 253.000 841828.000 + 254.000 741847.750 + 255.000 747172.750 + 256.000 723967.500 + 257.000 786484.000 + 258.000 809302.500 + 259.000 851485.750 + 260.000 887085.750 + 261.000 912656.750 + 262.000 897436.750 + 263.000 863183.500 + 264.000 762178.500 + 265.000 712019.000 + 266.000 653793.500 + 267.000 582845.750 + 268.000 528704.250 + 269.000 436887.000 + 270.000 364977.250 + 271.000 308209.250 + 272.000 273962.000 + 273.000 254240.000 + 274.000 229668.750 + 275.000 232712.500 + 276.000 232660.250 + 277.000 231420.750 + 278.000 234453.250 + 279.000 247080.250 + 280.000 242259.500 + 281.000 239708.750 + 282.000 238029.500 + 283.000 238425.750 + 284.000 243815.000 + 285.000 255023.000 + 286.000 263901.250 + 287.000 272125.750 + 288.000 297341.250 + 289.000 302405.000 + 290.000 302553.000 + 291.000 305391.500 + 292.000 303223.000 + 293.000 295939.500 + 294.000 282358.000 + 295.000 278080.750 + 296.000 258706.250 + 297.000 250159.750 + 298.000 232676.750 + 299.000 213620.250 + 300.000 190620.750 + 301.000 171473.500 + 302.000 147162.750 + 303.000 126720.250 + 304.000 109322.500 + 305.000 91895.500 + 306.000 77587.250 + 307.000 63345.000 + 308.000 52772.750 + 309.000 46449.000 + 310.000 39993.750 + 311.000 37076.250 + 312.000 37317.500 + 313.000 42852.250 + 314.000 50711.500 + 315.000 60620.750 + 316.000 76928.250 + 317.000 97187.500 + 318.000 121184.000 + 319.000 149064.750 + 320.000 180244.500 + 321.000 211331.000 + 322.000 251011.000 + 323.000 292446.500 + 324.000 342413.500 + 325.000 390471.250 + 326.000 461504.000 + 327.000 529283.000 + 328.000 591199.500 + 329.000 664145.000 + 330.000 698879.750 + 331.000 768740.000 + 332.000 856180.250 + 333.000 953853.750 + 334.000 1062145.750 + 335.000 1175820.500 + 336.000 1294779.750 + 337.000 1435171.750 + 338.000 1554730.000 + 339.000 1676246.250 + 340.000 1770265.750 + 341.000 1833665.750 + 342.000 1903471.500 + 343.000 1907990.000 + 344.000 1865828.750 + 345.000 1813709.750 + 346.000 1743201.250 + 347.000 1662722.000 + 348.000 1568892.250 + 349.000 1468166.750 + 350.000 1371482.500 + 351.000 1280752.000 + 352.000 1201615.500 + 353.000 1139485.250 + 354.000 1063950.750 + 355.000 1012492.500 + 356.000 965742.250 + 357.000 909696.250 + 358.000 866807.500 + 359.000 814574.500 + 360.000 757251.250 + 361.000 690734.250 + 362.000 625324.750 + 363.000 557258.500 + 364.000 492614.250 + 365.000 426275.000 + 366.000 367078.750 + 367.000 319227.000 + 368.000 282867.750 + 369.000 260716.000 + 370.000 250796.750 + 371.000 248091.750 + 372.000 249112.250 + 373.000 250584.750 + 374.000 255238.750 + 375.000 258680.500 + 376.000 261692.750 + 377.000 261825.500 + 378.000 258041.250 + 379.000 250009.750 + 380.000 238443.750 + 381.000 221532.250 + 382.000 219804.000 + 383.000 204707.000 + 384.000 175861.000 + 385.000 152439.500 + 386.000 129119.250 + 387.000 111132.000 + 388.000 102871.000 + 389.000 102062.500 + 390.000 110717.500 + 391.000 126974.500 + 392.000 146367.250 + 393.000 168016.250 + 394.000 188035.000 + 395.000 206020.500 + 396.000 236628.000 + 397.000 249911.750 + 398.000 258449.750 + 399.000 260864.750 + 400.000 260949.250 + 401.000 259174.250 + 402.000 253732.000 + 403.000 244851.250 + 404.000 238979.750 + 405.000 234964.500 + 406.000 233982.750 + 407.000 235722.000 + 408.000 234070.000 + 409.000 240643.000 + 410.000 250803.250 + 411.000 260542.250 + 412.000 273420.250 + 413.000 286687.000 + 414.000 299177.750 + 415.000 314338.250 + 416.000 328019.000 + 417.000 341005.500 + 418.000 350114.750 + 419.000 356311.000 + 420.000 363167.500 + 421.000 359435.250 + 422.000 350867.750 + 423.000 336705.000 + 424.000 314769.750 + 425.000 290049.750 + 426.000 265035.750 + 427.000 235951.000 + 428.000 209885.250 + 429.000 181895.500 + 430.000 158415.750 + 431.000 135719.500 + 432.000 115104.250 + 433.000 91246.500 + 434.000 76732.500 + 435.000 63119.750 + 436.000 50554.500 + 437.000 39891.750 + 438.000 29432.500 + 439.000 19596.750 + 440.000 16841.500 + 441.000 11374.250 + 442.000 7880.500 + 443.000 9570.750 + 444.000 12792.500 + 445.000 15282.250 + 446.000 22720.000 + 447.000 33859.000 + 448.000 46637.250 + 449.000 63566.250 + 450.000 86890.250 + 451.000 114184.250 + 452.000 146913.250 + 453.000 187362.250 + 454.000 239056.250 + 455.000 299369.250 + 456.000 368571.000 + 457.000 450529.250 + 458.000 543252.750 + 459.000 650487.000 + 460.000 772895.000 + 461.000 903185.000 + 462.000 1051839.750 + 463.000 1266797.250 + 464.000 1373579.250 + 465.000 1542186.500 + 466.000 1715162.500 + 467.000 1878740.500 + 468.000 2027474.000 + 469.000 2154586.750 + 470.000 2251038.000 + 471.000 2318679.500 + 472.000 2350578.750 + 473.000 2346121.500 + 474.000 2275645.250 + 475.000 2211391.000 + 476.000 2122855.500 + 477.000 2007904.750 + 478.000 1880475.750 + 479.000 1740091.750 + 480.000 1595713.500 + 481.000 1449303.000 + 482.000 1305942.000 + 483.000 1160322.000 + 484.000 1023620.250 + 485.000 888675.500 + 486.000 769557.500 + 487.000 667070.000 + 488.000 566484.250 + 489.000 509269.500 + 490.000 453661.750 + 491.000 414390.250 + 492.000 384872.500 + 493.000 361758.000 + 494.000 344285.250 + 495.000 338578.500 + 496.000 333789.250 + 497.000 332714.500 + 498.000 330379.250 + 499.000 337528.250 + 500.000 331554.000 + 501.000 332556.500 + 502.000 334434.750 + 503.000 342663.000 + 504.000 372607.000 + 505.000 376457.000 + 506.000 381952.000 + 507.000 358359.500 + 508.000 372698.750 + 509.000 362500.750 + 510.000 341605.000 + 511.000 327486.750 + 512.000 306647.500 + 513.000 280615.000 + 514.000 252939.250 + 515.000 227459.750 + 516.000 200277.250 + 517.000 173735.000 + 518.000 147124.500 + 519.000 121023.500 + 520.000 100271.500 + 521.000 78931.250 + 522.000 60680.500 + 523.000 44373.750 + 524.000 34548.500 + 525.000 25229.250 + 526.000 17743.750 + 527.000 16985.500 + 528.000 19909.500 + 529.000 24943.750 + 530.000 33629.250 + 531.000 47126.500 + 532.000 64306.000 + 533.000 84505.750 + 534.000 114180.500 + 535.000 134219.000 + 536.000 160378.000 + 537.000 179912.500 + 538.000 192491.500 + 539.000 202616.500 +(1,2) +173 1.0000E+000 + 250.000 32627.875 + 251.000 36126.375 + 252.000 38843.625 + 253.000 40418.250 + 254.000 38205.250 + 255.000 37195.625 + 256.000 35149.750 + 257.000 33977.625 + 258.000 31204.625 + 259.000 27474.125 + 260.000 24065.375 + 261.000 21865.625 + 262.000 19053.500 + 263.000 22365.875 + 264.000 26090.500 + 265.000 36522.500 + 266.000 52044.250 + 267.000 79332.750 + 268.000 115148.250 + 269.000 157016.250 + 270.000 199473.375 + 271.000 244676.125 + 272.000 285906.375 + 273.000 314045.500 + 274.000 328219.500 + 275.000 328924.875 + 276.000 308658.125 + 277.000 296827.625 + 278.000 288219.625 + 279.000 274450.250 + 280.000 265107.250 + 281.000 259923.750 + 282.000 242104.750 + 283.000 229026.000 + 284.000 220300.375 + 285.000 206010.375 + 286.000 191402.250 + 287.000 186507.625 + 288.000 181210.625 + 289.000 173239.625 + 290.000 168409.125 + 291.000 157036.000 + 292.000 148320.375 + 293.000 143622.250 + 294.000 133597.375 + 295.000 121797.750 + 296.000 109460.875 + 297.000 93920.500 + 298.000 79001.625 + 299.000 69761.875 + 300.000 57053.750 + 301.000 48390.500 + 302.000 42758.875 + 303.000 37215.250 + 304.000 37944.125 + 305.000 35182.500 + 306.000 36316.750 + 307.000 38135.375 + 308.000 41424.000 + 309.000 44535.625 + 310.000 48504.000 + 311.000 51544.750 + 312.000 53455.375 + 313.000 56468.250 + 314.000 58843.500 + 315.000 58822.250 + 316.000 60194.500 + 317.000 59416.250 + 318.000 58234.750 + 319.000 56240.875 + 320.000 53112.250 + 321.000 47295.875 + 322.000 42509.250 + 323.000 37063.250 + 324.000 33240.000 + 325.000 30930.375 + 326.000 27367.500 + 327.000 22412.875 + 328.000 23444.250 + 329.000 20988.875 + 330.000 21586.500 + 331.000 21860.625 + 332.000 23273.875 + 333.000 20340.625 + 334.000 21348.750 + 335.000 21579.000 + 336.000 21794.625 + 337.000 20432.000 + 338.000 20499.625 + 339.000 20357.750 + 340.000 17802.375 + 341.000 15798.375 + 342.000 14458.625 + 343.000 15161.250 + 344.000 11987.625 + 345.000 12063.875 + 346.000 12318.500 + 347.000 9413.125 + 348.000 9384.500 + 349.000 10062.750 + 350.000 9627.625 + 351.000 11012.375 + 352.000 13624.250 + 353.000 15092.250 + 354.000 19275.500 + 355.000 20997.500 + 356.000 24146.375 + 357.000 27852.375 + 358.000 32455.875 + 359.000 34110.125 + 360.000 34526.500 + 361.000 37209.750 + 362.000 39187.875 + 363.000 39208.000 + 364.000 39092.125 + 365.000 37001.125 + 366.000 35963.250 + 367.000 36520.000 + 368.000 37854.625 + 369.000 37461.375 + 370.000 39899.000 + 371.000 43546.375 + 372.000 47778.250 + 373.000 57054.625 + 374.000 66915.125 + 375.000 77817.625 + 376.000 89112.625 + 377.000 105070.750 + 378.000 120097.125 + 379.000 137458.625 + 380.000 151660.875 + 381.000 167895.625 + 382.000 178948.875 + 383.000 193613.250 + 384.000 215364.500 + 385.000 228928.750 + 386.000 244948.500 + 387.000 259147.875 + 388.000 273266.500 + 389.000 279765.625 + 390.000 288546.625 + 391.000 286065.000 + 392.000 272402.375 + 393.000 255002.875 + 394.000 235121.875 + 395.000 210959.375 + 396.000 188646.375 + 397.000 164830.750 + 398.000 145123.375 + 399.000 128165.500 + 400.000 114185.625 + 401.000 105883.125 + 402.000 98491.375 + 403.000 97029.750 + 404.000 98278.625 + 405.000 98796.750 + 406.000 98736.000 + 407.000 98988.500 + 408.000 102017.500 + 409.000 101314.125 + 410.000 103090.250 + 411.000 100949.750 + 412.000 97631.875 + 413.000 93604.625 + 414.000 83932.250 + 415.000 74087.625 + 416.000 66319.250 + 417.000 59315.375 + 418.000 50896.375 + 419.000 40400.125 + 420.000 29912.000 + 421.000 23445.125 + 422.000 17742.250 +(1,1) +373 1.0000E+000 + 120.000 262958.250 + 121.000 191402.000 + 122.000 123578.000 + 123.000 80576.250 + 124.000 57366.750 + 125.000 55169.750 + 126.000 69878.500 + 127.000 83088.000 + 128.000 99856.750 + 129.000 113514.500 + 130.000 114996.000 + 131.000 113783.500 + 132.000 122017.750 + 133.000 122326.500 + 134.000 113429.750 + 135.000 106929.500 + 136.000 97425.750 + 137.000 86294.000 + 138.000 69813.250 + 139.000 57376.750 + 140.000 48373.250 + 141.000 46094.500 + 142.000 54930.250 + 143.000 69197.500 + 144.000 88464.000 + 145.000 109296.500 + 146.000 143147.250 + 147.000 181320.500 + 148.000 210681.750 + 149.000 235661.750 + 150.000 264507.750 + 151.000 282399.500 + 152.000 297022.500 + 153.000 304464.500 + 154.000 301076.500 + 155.000 299884.000 + 156.000 359908.000 + 157.000 344910.250 + 158.000 319166.750 + 159.000 300761.500 + 160.000 281662.250 + 161.000 264320.250 + 162.000 235108.750 + 163.000 210239.250 + 164.000 185691.500 + 165.000 166047.750 + 166.000 146435.500 + 167.000 138166.750 + 168.000 122349.750 + 169.000 108138.750 + 170.000 96986.250 + 171.000 86910.500 + 172.000 80072.000 + 173.000 79292.000 + 174.000 90264.250 + 175.000 105290.750 + 176.000 134745.500 + 177.000 185349.250 + 178.000 247525.750 + 179.000 341783.750 + 180.000 465566.750 + 181.000 631457.500 + 182.000 835840.000 + 183.000 1018446.250 + 184.000 1189271.000 + 185.000 1224704.250 + 186.000 1441735.500 + 187.000 1577647.750 + 188.000 1628362.500 + 189.000 1664855.000 + 190.000 1697921.500 + 191.000 1686717.500 + 192.000 1622125.750 + 193.000 1604053.500 + 194.000 1566184.500 + 195.000 1593225.250 + 196.000 1652860.750 + 197.000 1645710.500 + 198.000 1481953.000 + 199.000 1409676.250 + 200.000 1420912.500 + 201.000 1405788.750 + 202.000 1337829.250 + 203.000 1292514.000 + 204.000 1223402.250 + 205.000 1168586.250 + 206.000 1081081.000 + 207.000 996064.750 + 208.000 895505.250 + 209.000 823388.750 + 210.000 772565.250 + 211.000 671823.250 + 212.000 591860.250 + 213.000 547595.250 + 214.000 490890.250 + 215.000 428013.750 + 216.000 381616.250 + 217.000 335117.500 + 218.000 285280.500 + 219.000 241205.500 + 220.000 193124.000 + 221.000 153201.000 + 222.000 121559.000 + 223.000 116670.250 + 224.000 90034.750 + 225.000 64248.000 + 226.000 53624.500 + 227.000 49051.500 + 228.000 46860.750 + 229.000 51028.750 + 230.000 64807.000 + 231.000 70256.000 + 232.000 68059.500 + 233.000 79843.750 + 234.000 89249.750 + 235.000 97990.250 + 236.000 105617.500 + 237.000 121536.750 + 238.000 131477.000 + 239.000 144351.750 + 240.000 151710.500 + 241.000 161483.250 + 242.000 178449.500 + 243.000 189189.500 + 244.000 181182.000 + 245.000 186996.000 + 246.000 189716.000 + 247.000 190957.750 + 248.000 187351.750 + 249.000 187762.750 + 250.000 183888.750 + 251.000 164188.500 + 252.000 157807.250 + 253.000 151687.000 + 254.000 139311.250 + 255.000 127780.750 + 256.000 114212.250 + 257.000 106874.250 + 258.000 90878.750 + 259.000 76695.000 + 260.000 64601.500 + 261.000 56987.000 + 262.000 45563.750 + 263.000 37630.500 + 264.000 31165.250 + 265.000 21662.500 + 266.000 18662.250 + 267.000 14838.500 + 268.000 13550.500 + 269.000 11273.500 + 270.000 11421.000 + 271.000 13981.750 + 272.000 15040.500 + 273.000 18578.000 + 274.000 28592.500 + 275.000 38099.500 + 276.000 56455.250 + 277.000 83553.250 + 278.000 128063.250 + 279.000 192143.500 + 280.000 273777.750 + 281.000 356639.750 + 282.000 449519.500 + 283.000 535906.000 + 284.000 626843.500 + 285.000 707466.250 + 286.000 837288.750 + 287.000 874405.000 + 288.000 973387.750 + 289.000 1039946.500 + 290.000 1126569.750 + 291.000 1141896.000 + 292.000 1235785.250 + 293.000 1319692.500 + 294.000 1417963.250 + 295.000 1509619.500 + 296.000 1595949.250 + 297.000 1668066.500 + 298.000 1720744.250 + 299.000 1733202.250 + 300.000 1743176.250 + 301.000 1717181.750 + 302.000 1680056.500 + 303.000 1638789.625 + 304.000 1594867.375 + 305.000 1511026.625 + 306.000 1452515.000 + 307.000 1382712.625 + 308.000 1253331.375 + 309.000 1130485.375 + 310.000 1010836.312 + 311.000 865409.312 + 312.000 772082.312 + 313.000 686134.000 + 314.000 646813.312 + 315.000 569115.312 + 316.000 501181.656 + 317.000 437942.344 + 318.000 382261.000 + 319.000 331362.656 + 320.000 290606.656 + 321.000 247975.672 + 322.000 202754.328 + 323.000 173909.672 + 324.000 146625.328 + 325.000 125430.000 + 326.000 108246.664 + 327.000 94395.000 + 328.000 82828.000 + 329.000 74841.664 + 330.000 66734.664 + 331.000 63132.000 + 332.000 55631.332 + 333.000 51867.332 + 334.000 46288.332 + 335.000 40424.000 + 336.000 32264.000 + 337.000 27544.666 + 338.000 22456.666 + 339.000 16473.000 + 340.000 12197.667 + 341.000 8251.333 + 342.000 5681.667 + 343.000 2356.333 + 344.000 1598.000 + 345.000 3222.667 + 346.000 1224.667 + 347.000 2251.667 + 348.000 2233.667 + 349.000 3757.333 + 350.000 5675.000 + 351.000 6142.667 + 352.000 7407.000 + 353.000 17187.000 + 354.000 17202.000 + 355.000 22864.666 + 356.000 27618.000 + 357.000 33039.668 + 358.000 39219.332 + 359.000 43784.332 + 360.000 50044.000 + 361.000 50310.000 + 362.000 50709.332 + 363.000 55199.000 + 364.000 89025.664 + 365.000 80362.664 + 366.000 74896.336 + 367.000 58269.332 + 368.000 48589.332 + 369.000 41504.668 + 370.000 36433.000 + 371.000 28465.000 + 372.000 22037.334 + 373.000 18594.666 + 374.000 14025.333 + 375.000 7442.333 + 376.000 5984.333 + 377.000 4422.000 + 378.000 3542.333 + 379.000 5286.333 + 380.000 3603.667 + 381.000 2468.333 + 382.000 3552.667 + 383.000 4268.333 + 384.000 4424.000 + 385.000 3003.333 + 386.000 1521.000 + 387.000 4147.000 + 388.000 4363.333 + 389.000 2271.000 + 390.000 6364.333 + 391.000 3866.000 + 392.000 5478.667 + 393.000 3062.667 + 394.000 4540.667 + 395.000 5201.667 + 396.000 8576.667 + 397.000 11787.667 + 398.000 16315.333 + 399.000 29734.666 + 400.000 55316.668 + 401.000 71447.000 + 402.000 100312.000 + 403.000 132754.328 + 404.000 170636.328 + 405.000 207728.672 + 406.000 275832.656 + 407.000 331761.344 + 408.000 389276.000 + 409.000 466064.344 + 410.000 528966.312 + 411.000 591851.312 + 412.000 659815.312 + 413.000 734632.688 + 414.000 810164.000 + 415.000 883135.312 + 416.000 985629.312 + 417.000 1054066.000 + 418.000 1112007.000 + 419.000 1156697.625 + 420.000 1199465.375 + 421.000 1218009.625 + 422.000 1223193.000 + 423.000 1212871.000 + 424.000 1180622.375 + 425.000 1154459.000 + 426.000 1129595.375 + 427.000 1063823.625 + 428.000 976653.312 + 429.000 899792.688 + 430.000 815014.312 + 431.000 726136.312 + 432.000 641226.312 + 433.000 556814.688 + 434.000 488567.344 + 435.000 426233.000 + 436.000 352638.656 + 437.000 297304.344 + 438.000 245461.000 + 439.000 204816.672 + 440.000 153227.672 + 441.000 121207.000 + 442.000 93599.000 + 443.000 70723.000 + 444.000 55495.668 + 445.000 39659.332 + 446.000 32573.000 + 447.000 9357.333 + 448.000 6084.333 + 449.000 2362.333 + 450.000 2667.667 + 451.000 4177.333 + 452.000 6601.000 + 453.000 10199.000 + 454.000 13132.667 + 455.000 15603.000 + 456.000 21506.666 + 457.000 25137.334 + 458.000 42332.332 + 459.000 48081.668 + 460.000 49840.000 + 461.000 53491.668 + 462.000 54214.668 + 463.000 50408.000 + 464.000 49178.668 + 465.000 46405.000 + 466.000 41729.332 + 467.000 34380.332 + 468.000 34262.668 + 469.000 28322.000 + 470.000 22689.334 + 471.000 19853.666 + 472.000 14687.000 + 473.000 13005.333 + 474.000 6889.667 + 475.000 9184.000 + 476.000 3172.000 + 477.000 3635.333 + 478.000 1494.667 + 479.000 3928.000 + 480.000 7688.667 + 481.000 7626.000 + 482.000 8050.000 + 483.000 10658.333 + 484.000 7392.333 + 485.000 10084.333 + 486.000 21025.334 + 487.000 11959.333 + 488.000 16104.333 + 489.000 15054.667 + 490.000 13444.000 + 491.000 10955.000 + 492.000 9959.000 +(2,2) +138 1.0000E+000 + 360.000 250248.250 + 361.000 287548.750 + 362.000 320885.000 + 363.000 362156.250 + 364.000 400854.000 + 365.000 444919.750 + 366.000 482849.500 + 367.000 501998.500 + 368.000 529677.250 + 369.000 563841.250 + 370.000 565337.750 + 371.000 572843.750 + 372.000 560348.250 + 373.000 553518.250 + 374.000 547503.500 + 375.000 532432.750 + 376.000 513031.750 + 377.000 486469.500 + 378.000 452888.000 + 379.000 410328.000 + 380.000 368567.250 + 381.000 333108.250 + 382.000 287658.750 + 383.000 251676.500 + 384.000 219666.250 + 385.000 182405.000 + 386.000 158698.000 + 387.000 136213.000 + 388.000 116183.500 + 389.000 95867.500 + 390.000 76424.250 + 391.000 61768.750 + 392.000 49875.250 + 393.000 44698.750 + 394.000 37187.750 + 395.000 30479.000 + 396.000 27905.000 + 397.000 23857.250 + 398.000 20334.500 + 399.000 22134.250 + 400.000 21039.000 + 401.000 20882.750 + 402.000 19881.500 + 403.000 20327.000 + 404.000 20549.500 + 405.000 24274.750 + 406.000 24427.250 + 407.000 23993.250 + 408.000 25741.250 + 409.000 28087.250 + 410.000 27626.500 + 411.000 29944.500 + 412.000 30490.500 + 413.000 31039.000 + 414.000 32010.750 + 415.000 32616.750 + 416.000 30621.250 + 417.000 28912.000 + 418.000 28172.750 + 419.000 28578.250 + 420.000 29835.500 + 421.000 28103.500 + 422.000 28772.000 + 423.000 29516.250 + 424.000 28400.250 + 425.000 29528.250 + 426.000 29486.250 + 427.000 29760.000 + 428.000 28369.500 + 429.000 29144.750 + 430.000 29893.750 + 431.000 32531.250 + 432.000 32892.500 + 433.000 35183.250 + 434.000 34275.750 + 435.000 35176.000 + 436.000 20192.250 + 437.000 25602.750 + 438.000 25462.750 + 439.000 22973.000 + 440.000 23112.000 + 441.000 23107.500 + 442.000 21859.250 + 443.000 20306.000 + 444.000 19672.500 + 445.000 21774.250 + 446.000 19946.500 + 447.000 19190.000 + 448.000 18360.500 + 449.000 16509.250 + 450.000 16765.250 + 451.000 16576.250 + 452.000 15059.250 + 453.000 14068.750 + 454.000 12591.250 + 455.000 13257.000 + 456.000 12336.500 + 457.000 11771.750 + 458.000 10531.750 + 459.000 9411.000 + 460.000 8589.500 + 461.000 10897.750 + 462.000 9506.500 + 463.000 10479.250 + 464.000 11014.000 + 465.000 13371.000 + 466.000 12179.750 + 467.000 13531.750 + 468.000 15337.000 + 469.000 17146.000 + 470.000 17306.500 + 471.000 22040.250 + 472.000 21762.000 + 473.000 27503.500 + 474.000 29560.500 + 475.000 33721.000 + 476.000 37097.750 + 477.000 42616.500 + 478.000 48501.000 + 479.000 54643.500 + 480.000 59905.500 + 481.000 68460.500 + 482.000 78775.250 + 483.000 96894.000 + 484.000 135039.500 + 485.000 193728.750 + 486.000 250467.500 + 487.000 299443.500 + 488.000 348250.000 + 489.000 409601.750 + 490.000 460200.750 + 491.000 517113.250 + 492.000 560140.500 + 493.000 598529.000 + 494.000 601090.250 + 495.000 622097.750 + 496.000 626301.500 + 497.000 609906.250 +(2,0) +301 1.0000E+000 + 180.000 176112.750 + 181.000 166920.000 + 182.000 141516.500 + 183.000 113345.250 + 184.000 94153.500 + 185.000 73143.250 + 186.000 58010.250 + 187.000 42551.750 + 188.000 36919.750 + 189.000 31332.000 + 190.000 28839.500 + 191.000 28233.750 + 192.000 31953.500 + 193.000 39794.500 + 194.000 48803.500 + 195.000 64623.750 + 196.000 94230.500 + 197.000 123732.500 + 198.000 160017.500 + 199.000 204029.250 + 200.000 251582.000 + 201.000 297688.500 + 202.000 343196.250 + 203.000 392587.250 + 204.000 465355.500 + 205.000 542679.000 + 206.000 616668.750 + 207.000 714134.750 + 208.000 805756.250 + 209.000 874487.000 + 210.000 938771.500 + 211.000 979454.500 + 212.000 1014115.500 + 213.000 966961.000 + 214.000 869250.000 + 215.000 743871.000 + 216.000 596983.750 + 217.000 426690.750 + 218.000 283110.000 + 219.000 184340.000 + 220.000 106763.000 + 221.000 61827.250 + 222.000 44233.500 + 223.000 35886.750 + 224.000 31226.250 + 225.000 29373.000 + 226.000 29326.750 + 227.000 33994.750 + 228.000 34921.500 + 229.000 43556.250 + 230.000 55015.250 + 231.000 58651.000 + 232.000 57033.750 + 233.000 52152.250 + 234.000 44730.500 + 235.000 43451.500 + 236.000 41218.000 + 237.000 48848.000 + 238.000 63566.500 + 239.000 83753.500 + 240.000 103892.000 + 241.000 127654.000 + 242.000 156214.750 + 243.000 184808.000 + 244.000 210072.000 + 245.000 227701.250 + 246.000 240800.500 + 247.000 247076.750 + 248.000 256099.000 + 249.000 258184.500 + 250.000 257130.500 + 251.000 252470.000 + 252.000 243605.750 + 253.000 222908.000 + 254.000 208076.000 + 255.000 201664.000 + 256.000 206573.750 + 257.000 196457.500 + 258.000 192093.500 + 259.000 192882.500 + 260.000 196797.250 + 261.000 204389.500 + 262.000 212122.750 + 263.000 222957.500 + 264.000 226058.250 + 265.000 245519.250 + 266.000 273974.250 + 267.000 290149.250 + 268.000 304951.500 + 269.000 321057.500 + 270.000 317129.250 + 271.000 318539.500 + 272.000 288686.500 + 273.000 262613.750 + 274.000 235427.750 + 275.000 192848.500 + 276.000 168758.750 + 277.000 139644.250 + 278.000 114620.000 + 279.000 89833.250 + 280.000 72482.000 + 281.000 60812.750 + 282.000 50380.000 + 283.000 41729.250 + 284.000 34541.000 + 285.000 28692.750 + 286.000 25600.250 + 287.000 21239.250 + 288.000 21126.750 + 289.000 23086.000 + 290.000 25431.000 + 291.000 27086.500 + 292.000 32453.000 + 293.000 39374.250 + 294.000 46895.000 + 295.000 58473.750 + 296.000 74200.000 + 297.000 93628.000 + 298.000 114820.750 + 299.000 141471.500 + 300.000 176153.500 + 301.000 214803.750 + 302.000 256502.000 + 303.000 311100.750 + 304.000 370144.500 + 305.000 428930.000 + 306.000 487029.250 + 307.000 550628.500 + 308.000 617327.250 + 309.000 685512.250 + 310.000 760893.250 + 311.000 843642.000 + 312.000 922374.250 + 313.000 1000858.750 + 314.000 1073597.500 + 315.000 1150133.750 + 316.000 1224770.250 + 317.000 1304968.750 + 318.000 1350247.000 + 319.000 1405386.500 + 320.000 1475104.250 + 321.000 1503078.500 + 322.000 1549961.250 + 323.000 1573418.500 + 324.000 1590171.000 + 325.000 1584621.750 + 326.000 1581176.000 + 327.000 1577881.250 + 328.000 1528807.500 + 329.000 1443054.250 + 330.000 1310488.000 + 331.000 1199920.500 + 332.000 1071894.750 + 333.000 939756.500 + 334.000 793811.750 + 335.000 660200.750 + 336.000 530628.000 + 337.000 423488.750 + 338.000 327358.250 + 339.000 248750.500 + 340.000 175291.000 + 341.000 126829.500 + 342.000 91875.000 + 343.000 65195.500 + 344.000 46755.250 + 345.000 36578.750 + 346.000 34171.000 + 347.000 23097.000 + 348.000 32963.500 + 349.000 24659.000 + 350.000 25404.250 + 351.000 24438.500 + 352.000 28448.500 + 353.000 27667.750 + 354.000 31546.250 + 355.000 29359.250 + 356.000 30040.250 + 357.000 27300.750 + 358.000 27288.500 + 359.000 24893.750 + 360.000 26286.000 + 361.000 21854.750 + 362.000 23705.250 + 363.000 22729.500 + 364.000 30211.750 + 365.000 34476.250 + 366.000 36157.000 + 367.000 42120.750 + 368.000 49128.000 + 369.000 60511.500 + 370.000 71236.500 + 371.000 77792.000 + 372.000 82959.500 + 373.000 94803.500 + 374.000 105918.000 + 375.000 112234.750 + 376.000 121485.500 + 377.000 131604.250 + 378.000 129527.750 + 379.000 135210.250 + 380.000 155384.750 + 381.000 206175.000 + 382.000 212562.500 + 383.000 213674.750 + 384.000 202620.250 + 385.000 197963.250 + 386.000 195662.000 + 387.000 188215.500 + 388.000 183622.500 + 389.000 175554.000 + 390.000 166149.000 + 391.000 155426.250 + 392.000 142387.750 + 393.000 129780.500 + 394.000 117892.250 + 395.000 105970.750 + 396.000 97574.000 + 397.000 88917.250 + 398.000 80017.250 + 399.000 74672.750 + 400.000 72362.500 + 401.000 72671.750 + 402.000 70289.500 + 403.000 67783.250 + 404.000 63339.250 + 405.000 62200.250 + 406.000 57878.000 + 407.000 56228.500 + 408.000 47207.250 + 409.000 44074.000 + 410.000 41423.750 + 411.000 36844.000 + 412.000 32166.750 + 413.000 29945.500 + 414.000 24811.000 + 415.000 19714.500 + 416.000 19946.500 + 417.000 13079.500 + 418.000 12307.250 + 419.000 14122.250 + 420.000 10830.750 + 421.000 17708.250 + 422.000 23866.750 + 423.000 31665.250 + 424.000 46790.500 + 425.000 64706.750 + 426.000 82396.000 + 427.000 110607.750 + 428.000 133043.250 + 429.000 163192.000 + 430.000 198452.250 + 431.000 226944.000 + 432.000 265954.250 + 433.000 296172.000 + 434.000 327355.500 + 435.000 364659.000 + 436.000 409616.750 + 437.000 453563.250 + 438.000 512556.500 + 439.000 570770.000 + 440.000 627959.250 + 441.000 680374.500 + 442.000 698445.250 + 443.000 740678.250 + 444.000 778165.500 + 445.000 824557.250 + 446.000 845907.750 + 447.000 867337.250 + 448.000 865154.750 + 449.000 880550.250 + 450.000 903574.250 + 451.000 877599.250 + 452.000 914433.500 + 453.000 900253.750 + 454.000 871023.750 + 455.000 835289.000 + 456.000 790139.500 + 457.000 735387.250 + 458.000 688637.250 + 459.000 638482.250 + 460.000 581083.250 + 461.000 518274.250 + 462.000 466334.750 + 463.000 407053.750 + 464.000 358499.500 + 465.000 309999.750 + 466.000 269674.250 + 467.000 231763.000 + 468.000 191363.500 + 469.000 147887.750 + 470.000 120665.750 + 471.000 96606.500 + 472.000 77252.500 + 473.000 64478.500 + 474.000 49201.000 + 475.000 45917.750 + 476.000 29818.500 + 477.000 29612.500 + 478.000 25287.000 + 479.000 17533.250 + 480.000 15916.500 diff --git a/extra/leed/tests/mapper/base/rfac.d b/extra/leed/tests/mapper/base/rfac.d new file mode 100644 index 00000000..0f528f8e --- /dev/null +++ b/extra/leed/tests/mapper/base/rfac.d @@ -0,0 +1,6 @@ + 1 2 3 4 5 IBP + 0.25 EINCR + 1.0 1.0 1.0 1.0 1.0 + 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 + 6 0 0 ISMOTH IREN IRGEXP + diff --git a/extra/leed/tests/mapper/base/short.t b/extra/leed/tests/mapper/base/short.t new file mode 100644 index 0000000000000000000000000000000000000000..c5e8742c7b663fb7027bc2e4d3c9b343cf91eb39 GIT binary patch literal 251308 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

W2{2gD0@UEf&w#)Z1)9k+U~ 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 Date: Mon, 5 Aug 2024 05:08:49 +0900 Subject: [PATCH 13/14] add .gitignore to tests directory --- extra/leed/tests/.gitignore | 1 + extra/sim-trhepd-rheed/tests/.gitignore | 1 + extra/sxrd/tests/.gitignore | 2 ++ 3 files changed, 4 insertions(+) create mode 100644 extra/leed/tests/.gitignore create mode 100644 extra/sim-trhepd-rheed/tests/.gitignore create mode 100644 extra/sxrd/tests/.gitignore diff --git a/extra/leed/tests/.gitignore b/extra/leed/tests/.gitignore new file mode 100644 index 00000000..ba077a40 --- /dev/null +++ b/extra/leed/tests/.gitignore @@ -0,0 +1 @@ +bin diff --git a/extra/sim-trhepd-rheed/tests/.gitignore b/extra/sim-trhepd-rheed/tests/.gitignore new file mode 100644 index 00000000..ba077a40 --- /dev/null +++ b/extra/sim-trhepd-rheed/tests/.gitignore @@ -0,0 +1 @@ +bin diff --git a/extra/sxrd/tests/.gitignore b/extra/sxrd/tests/.gitignore new file mode 100644 index 00000000..6209f87b --- /dev/null +++ b/extra/sxrd/tests/.gitignore @@ -0,0 +1,2 @@ +bin +lsfit.in From 423e1ab630b570050a8dd8443435d0b30639c61d Mon Sep 17 00:00:00 2001 From: "T.Aoyama" Date: Mon, 5 Aug 2024 05:28:39 +0900 Subject: [PATCH 14/14] add test --- extra/function/tests/mapper/do.sh | 23 + extra/function/tests/mapper/input.toml | 17 + extra/function/tests/mapper/prepare.sh | 3 + extra/function/tests/mapper/ref_ColorMap.txt | 961 +++++++++++++++++++ extra/function/tests/mapper/simple.py | 12 + 5 files changed, 1016 insertions(+) create mode 100644 extra/function/tests/mapper/do.sh create mode 100644 extra/function/tests/mapper/input.toml create mode 100644 extra/function/tests/mapper/prepare.sh create mode 100644 extra/function/tests/mapper/ref_ColorMap.txt create mode 100644 extra/function/tests/mapper/simple.py diff --git a/extra/function/tests/mapper/do.sh b/extra/function/tests/mapper/do.sh new file mode 100644 index 00000000..00b8853e --- /dev/null +++ b/extra/function/tests/mapper/do.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +export PYTHONPATH=../../src:$PYTHONPATH + +sh ./prepare.sh + +#time python3 simple.py +time mpiexec -np 4 python3 simple.py + +resfile=output/ColorMap.txt +reffile=ref_ColorMap.txt + +echo diff $resfile $reffile +res=0 +diff $resfile $reffile || res=$? +if [ $res -eq 0 ]; then + echo TEST PASS + true +else + echo TEST FAILED: $resfile and $reffile differ + false +fi + diff --git a/extra/function/tests/mapper/input.toml b/extra/function/tests/mapper/input.toml new file mode 100644 index 00000000..2c14f9a6 --- /dev/null +++ b/extra/function/tests/mapper/input.toml @@ -0,0 +1,17 @@ +[base] +dimension = 2 +output_dir = "output" + +[algorithm] +seed = 12345 + +[algorithm.param] +max_list = [6.0, 6.0] +min_list = [-6.0, -6.0] +num_list = [31, 31] + +[solver] + +[runner] +[runner.log] +interval = 20 diff --git a/extra/function/tests/mapper/prepare.sh b/extra/function/tests/mapper/prepare.sh new file mode 100644 index 00000000..5ac0b009 --- /dev/null +++ b/extra/function/tests/mapper/prepare.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +rm -rf ./output diff --git a/extra/function/tests/mapper/ref_ColorMap.txt b/extra/function/tests/mapper/ref_ColorMap.txt new file mode 100644 index 00000000..d05ceac7 --- /dev/null +++ b/extra/function/tests/mapper/ref_ColorMap.txt @@ -0,0 +1,961 @@ +-6.000000 -6.000000 890.000000 +-5.600000 -6.000000 753.769600 +-5.200000 -6.000000 667.241600 +-4.800000 -6.000000 622.121600 +-4.400000 -6.000000 610.729600 +-4.000000 -6.000000 626.000000 +-3.600000 -6.000000 661.481600 +-3.200000 -6.000000 711.337600 +-2.800000 -6.000000 770.345600 +-2.400000 -6.000000 833.897600 +-2.000000 -6.000000 898.000000 +-1.600000 -6.000000 959.273600 +-1.200000 -6.000000 1014.953600 +-0.800000 -6.000000 1062.889600 +-0.400000 -6.000000 1101.545600 +0.000000 -6.000000 1130.000000 +0.400000 -6.000000 1147.945600 +0.800000 -6.000000 1155.689600 +1.200000 -6.000000 1154.153600 +1.600000 -6.000000 1144.873600 +2.000000 -6.000000 1130.000000 +2.400000 -6.000000 1112.297600 +2.800000 -6.000000 1095.145600 +3.200000 -6.000000 1082.537600 +3.600000 -6.000000 1079.081600 +4.000000 -6.000000 1090.000000 +4.400000 -6.000000 1121.129600 +4.800000 -6.000000 1178.921600 +5.200000 -6.000000 1270.441600 +5.600000 -6.000000 1403.369600 +6.000000 -6.000000 1586.000000 +-6.000000 -5.600000 713.449600 +-5.600000 -5.600000 569.795200 +-5.200000 -5.600000 476.099200 +-4.800000 -5.600000 424.067200 +-4.400000 -5.600000 406.019200 +-4.000000 -5.600000 414.889600 +-3.600000 -5.600000 444.227200 +-3.200000 -5.600000 488.195200 +-2.800000 -5.600000 541.571200 +-2.400000 -5.600000 599.747200 +-2.000000 -5.600000 658.729600 +-1.600000 -5.600000 715.139200 +-1.200000 -5.600000 766.211200 +-0.800000 -5.600000 809.795200 +-0.400000 -5.600000 844.355200 +0.000000 -5.600000 868.969600 +0.400000 -5.600000 883.331200 +0.800000 -5.600000 887.747200 +1.200000 -5.600000 883.139200 +1.600000 -5.600000 871.043200 +2.000000 -5.600000 853.609600 +2.400000 -5.600000 833.603200 +2.800000 -5.600000 814.403200 +3.200000 -5.600000 800.003200 +3.600000 -5.600000 795.011200 +4.000000 -5.600000 804.649600 +4.400000 -5.600000 834.755200 +4.800000 -5.600000 891.779200 +5.200000 -5.600000 982.787200 +5.600000 -5.600000 1115.459200 +6.000000 -5.600000 1298.089600 +-6.000000 -5.200000 589.161600 +-5.600000 -5.200000 438.339200 +-5.200000 -5.200000 337.731200 +-4.800000 -5.200000 279.043200 +-4.400000 -5.200000 254.595200 +-4.000000 -5.200000 257.321600 +-3.600000 -5.200000 280.771200 +-3.200000 -5.200000 319.107200 +-2.800000 -5.200000 367.107200 +-2.400000 -5.200000 420.163200 +-2.000000 -5.200000 474.281600 +-1.600000 -5.200000 526.083200 +-1.200000 -5.200000 572.803200 +-0.800000 -5.200000 612.291200 +-0.400000 -5.200000 643.011200 +0.000000 -5.200000 664.041600 +0.400000 -5.200000 675.075200 +0.800000 -5.200000 676.419200 +1.200000 -5.200000 668.995200 +1.600000 -5.200000 654.339200 +2.000000 -5.200000 634.601600 +2.400000 -5.200000 612.547200 +2.800000 -5.200000 591.555200 +3.200000 -5.200000 575.619200 +3.600000 -5.200000 569.347200 +4.000000 -5.200000 577.961600 +4.400000 -5.200000 607.299200 +4.800000 -5.200000 663.811200 +5.200000 -5.200000 754.563200 +5.600000 -5.200000 887.235200 +6.000000 -5.200000 1070.121600 +-6.000000 -4.800000 508.841600 +-5.600000 -4.800000 351.107200 +-5.200000 -4.800000 243.843200 +-4.800000 -4.800000 178.755200 +-4.400000 -4.800000 148.163200 +-4.000000 -4.800000 145.001600 +-3.600000 -4.800000 162.819200 +-3.200000 -4.800000 195.779200 +-2.800000 -4.800000 238.659200 +-2.400000 -4.800000 286.851200 +-2.000000 -4.800000 336.361600 +-1.600000 -4.800000 383.811200 +-1.200000 -4.800000 426.435200 +-0.800000 -4.800000 462.083200 +-0.400000 -4.800000 489.219200 +0.000000 -4.800000 506.921600 +0.400000 -4.800000 514.883200 +0.800000 -4.800000 513.411200 +1.200000 -4.800000 503.427200 +1.600000 -4.800000 486.467200 +2.000000 -4.800000 464.681600 +2.400000 -4.800000 440.835200 +2.800000 -4.800000 418.307200 +3.200000 -4.800000 401.091200 +3.600000 -4.800000 393.795200 +4.000000 -4.800000 401.641600 +4.400000 -4.800000 430.467200 +4.800000 -4.800000 486.723200 +5.200000 -4.800000 577.475200 +5.600000 -4.800000 710.403200 +6.000000 -4.800000 893.801600 +-6.000000 -4.400000 464.809600 +-5.600000 -4.400000 300.419200 +-5.200000 -4.400000 186.755200 +-4.800000 -4.400000 115.523200 +-4.400000 -4.400000 79.043200 +-4.000000 -4.400000 70.249600 +-3.600000 -4.400000 82.691200 +-3.200000 -4.400000 110.531200 +-2.800000 -4.400000 148.547200 +-2.400000 -4.400000 192.131200 +-2.000000 -4.400000 237.289600 +-1.600000 -4.400000 280.643200 +-1.200000 -4.400000 319.427200 +-0.800000 -4.400000 351.491200 +-0.400000 -4.400000 375.299200 +0.000000 -4.400000 389.929600 +0.400000 -4.400000 395.075200 +0.800000 -4.400000 391.043200 +1.200000 -4.400000 378.755200 +1.600000 -4.400000 359.747200 +2.000000 -4.400000 336.169600 +2.400000 -4.400000 310.787200 +2.800000 -4.400000 286.979200 +3.200000 -4.400000 268.739200 +3.600000 -4.400000 260.675200 +4.000000 -4.400000 268.009600 +4.400000 -4.400000 296.579200 +4.800000 -4.400000 352.835200 +5.200000 -4.400000 443.843200 +5.600000 -4.400000 577.283200 +6.000000 -4.400000 761.449600 +-6.000000 -4.000000 450.000000 +-5.600000 -4.000000 279.209600 +-5.200000 -4.000000 159.401600 +-4.800000 -4.000000 82.281600 +-4.400000 -4.000000 40.169600 +-4.000000 -4.000000 26.000000 +-3.600000 -4.000000 33.321600 +-3.200000 -4.000000 56.297600 +-2.800000 -4.000000 89.705600 +-2.400000 -4.000000 128.937600 +-2.000000 -4.000000 170.000000 +-1.600000 -4.000000 209.513600 +-1.200000 -4.000000 244.713600 +-0.800000 -4.000000 273.449600 +-0.400000 -4.000000 294.185600 +0.000000 -4.000000 306.000000 +0.400000 -4.000000 308.585600 +0.800000 -4.000000 302.249600 +1.200000 -4.000000 287.913600 +1.600000 -4.000000 267.113600 +2.000000 -4.000000 242.000000 +2.400000 -4.000000 215.337600 +2.800000 -4.000000 190.505600 +3.200000 -4.000000 171.497600 +3.600000 -4.000000 162.921600 +4.000000 -4.000000 170.000000 +4.400000 -4.000000 198.569600 +4.800000 -4.000000 255.081600 +5.200000 -4.000000 346.601600 +5.600000 -4.000000 480.809600 +6.000000 -4.000000 666.000000 +-6.000000 -3.600000 457.961600 +-5.600000 -3.600000 281.027200 +-5.200000 -3.600000 155.331200 +-4.800000 -3.600000 72.579200 +-4.400000 -3.600000 25.091200 +-4.000000 -3.600000 5.801600 +-3.600000 -3.600000 8.259200 +-3.200000 -3.600000 26.627200 +-2.800000 -3.600000 55.683200 +-2.400000 -3.600000 90.819200 +-2.000000 -3.600000 128.041600 +-1.600000 -3.600000 163.971200 +-1.200000 -3.600000 195.843200 +-0.800000 -3.600000 221.507200 +-0.400000 -3.600000 239.427200 +0.000000 -3.600000 248.681600 +0.400000 -3.600000 248.963200 +0.800000 -3.600000 240.579200 +1.200000 -3.600000 224.451200 +1.600000 -3.600000 202.115200 +2.000000 -3.600000 175.721600 +2.400000 -3.600000 148.035200 +2.800000 -3.600000 122.435200 +3.200000 -3.600000 102.915200 +3.600000 -3.600000 94.083200 +4.000000 -3.600000 101.161600 +4.400000 -3.600000 129.987200 +4.800000 -3.600000 187.011200 +5.200000 -3.600000 279.299200 +5.600000 -3.600000 414.531200 +6.000000 -3.600000 601.001600 +-6.000000 -3.200000 482.857600 +-5.600000 -3.200000 300.035200 +-5.200000 -3.200000 168.707200 +-4.800000 -3.200000 80.579200 +-4.400000 -3.200000 27.971200 +-4.000000 -3.200000 3.817600 +-3.600000 -3.200000 1.667200 +-3.200000 -3.200000 15.683200 +-2.800000 -3.200000 40.643200 +-2.400000 -3.200000 71.939200 +-2.000000 -3.200000 105.577600 +-1.600000 -3.200000 138.179200 +-1.200000 -3.200000 166.979200 +-0.800000 -3.200000 189.827200 +-0.400000 -3.200000 205.187200 +0.000000 -3.200000 212.137600 +0.400000 -3.200000 210.371200 +0.800000 -3.200000 200.195200 +1.200000 -3.200000 182.531200 +1.600000 -3.200000 158.915200 +2.000000 -3.200000 131.497600 +2.400000 -3.200000 103.043200 +2.800000 -3.200000 76.931200 +3.200000 -3.200000 57.155200 +3.600000 -3.200000 48.323200 +4.000000 -3.200000 55.657600 +4.400000 -3.200000 84.995200 +4.800000 -3.200000 142.787200 +5.200000 -3.200000 236.099200 +5.600000 -3.200000 372.611200 +6.000000 -3.200000 560.617600 +-6.000000 -2.800000 519.465600 +-5.600000 -2.800000 331.011200 +-5.200000 -2.800000 194.307200 +-4.800000 -2.800000 101.059200 +-4.400000 -2.800000 43.587200 +-4.000000 -2.800000 14.825600 +-3.600000 -2.800000 8.323200 +-3.200000 -2.800000 18.243200 +-2.800000 -2.800000 39.363200 +-2.400000 -2.800000 67.075200 +-2.000000 -2.800000 97.385600 +-1.600000 -2.800000 126.915200 +-1.200000 -2.800000 152.899200 +-0.800000 -2.800000 173.187200 +-0.400000 -2.800000 186.243200 +0.000000 -2.800000 191.145600 +0.400000 -2.800000 187.587200 +0.800000 -2.800000 175.875200 +1.200000 -2.800000 156.931200 +1.600000 -2.800000 132.291200 +2.000000 -2.800000 104.105600 +2.400000 -2.800000 75.139200 +2.800000 -2.800000 48.771200 +3.200000 -2.800000 28.995200 +3.600000 -2.800000 20.419200 +4.000000 -2.800000 28.265600 +4.400000 -2.800000 58.371200 +4.800000 -2.800000 117.187200 +5.200000 -2.800000 211.779200 +5.600000 -2.800000 349.827200 +6.000000 -2.800000 539.625600 +-6.000000 -2.400000 563.177600 +-5.600000 -2.400000 369.347200 +-5.200000 -2.400000 227.523200 +-4.800000 -2.400000 129.411200 +-4.400000 -2.400000 67.331200 +-4.000000 -2.400000 34.217600 +-3.600000 -2.400000 23.619200 +-3.200000 -2.400000 29.699200 +-2.800000 -2.400000 47.235200 +-2.400000 -2.400000 71.619200 +-2.000000 -2.400000 98.857600 +-1.600000 -2.400000 125.571200 +-1.200000 -2.400000 148.995200 +-0.800000 -2.400000 166.979200 +-0.400000 -2.400000 177.987200 +0.000000 -2.400000 181.097600 +0.400000 -2.400000 176.003200 +0.800000 -2.400000 163.011200 +1.200000 -2.400000 143.043200 +1.600000 -2.400000 117.635200 +2.000000 -2.400000 88.937600 +2.400000 -2.400000 59.715200 +2.800000 -2.400000 33.347200 +3.200000 -2.400000 13.827200 +3.600000 -2.400000 5.763200 +4.000000 -2.400000 14.377600 +4.400000 -2.400000 45.507200 +4.800000 -2.400000 105.603200 +5.200000 -2.400000 201.731200 +5.600000 -2.400000 341.571200 +6.000000 -2.400000 533.417600 +-6.000000 -2.000000 610.000000 +-5.600000 -2.000000 411.049600 +-5.200000 -2.000000 264.361600 +-4.800000 -2.000000 161.641600 +-4.400000 -2.000000 95.209600 +-4.000000 -2.000000 58.000000 +-3.600000 -2.000000 43.561600 +-3.200000 -2.000000 46.057600 +-2.800000 -2.000000 60.265600 +-2.400000 -2.000000 81.577600 +-2.000000 -2.000000 106.000000 +-1.600000 -2.000000 130.153600 +-1.200000 -2.000000 151.273600 +-0.800000 -2.000000 167.209600 +-0.400000 -2.000000 176.425600 +0.000000 -2.000000 178.000000 +0.400000 -2.000000 171.625600 +0.800000 -2.000000 157.609600 +1.200000 -2.000000 136.873600 +1.600000 -2.000000 110.953600 +2.000000 -2.000000 82.000000 +2.400000 -2.000000 52.777600 +2.800000 -2.000000 26.665600 +3.200000 -2.000000 7.657600 +3.600000 -2.000000 0.361600 +4.000000 -2.000000 10.000000 +4.400000 -2.000000 42.409600 +4.800000 -2.000000 104.041600 +5.200000 -2.000000 201.961600 +5.600000 -2.000000 343.849600 +6.000000 -2.000000 538.000000 +-6.000000 -1.600000 656.553600 +-5.600000 -1.600000 452.739200 +-5.200000 -1.600000 301.443200 +-4.800000 -1.600000 194.371200 +-4.400000 -1.600000 123.843200 +-4.000000 -1.600000 82.793600 +-3.600000 -1.600000 64.771200 +-3.200000 -1.600000 63.939200 +-2.800000 -1.600000 75.075200 +-2.400000 -1.600000 93.571200 +-2.000000 -1.600000 115.433600 +-1.600000 -1.600000 137.283200 +-1.200000 -1.600000 156.355200 +-0.800000 -1.600000 170.499200 +-0.400000 -1.600000 178.179200 +0.000000 -1.600000 178.473600 +0.400000 -1.600000 171.075200 +0.800000 -1.600000 156.291200 +1.200000 -1.600000 135.043200 +1.600000 -1.600000 108.867200 +2.000000 -1.600000 79.913600 +2.400000 -1.600000 50.947200 +2.800000 -1.600000 25.347200 +3.200000 -1.600000 7.107200 +3.600000 -1.600000 0.835200 +4.000000 -1.600000 11.753600 +4.400000 -1.600000 45.699200 +4.800000 -1.600000 109.123200 +5.200000 -1.600000 209.091200 +5.600000 -1.600000 353.283200 +6.000000 -1.600000 549.993600 +-6.000000 -1.200000 700.073600 +-5.600000 -1.200000 491.651200 +-5.200000 -1.200000 336.003200 +-4.800000 -1.200000 224.835200 +-4.400000 -1.200000 150.467200 +-4.000000 -1.200000 105.833600 +-3.600000 -1.200000 84.483200 +-3.200000 -1.200000 80.579200 +-2.800000 -1.200000 88.899200 +-2.400000 -1.200000 104.835200 +-2.000000 -1.200000 124.393600 +-1.600000 -1.200000 144.195200 +-1.200000 -1.200000 161.475200 +-0.800000 -1.200000 174.083200 +-0.400000 -1.200000 180.483200 +0.000000 -1.200000 179.753600 +0.400000 -1.200000 171.587200 +0.800000 -1.200000 156.291200 +1.200000 -1.200000 134.787200 +1.600000 -1.200000 108.611200 +2.000000 -1.200000 79.913600 +2.400000 -1.200000 51.459200 +2.800000 -1.200000 26.627200 +3.200000 -1.200000 9.411200 +3.600000 -1.200000 4.419200 +4.000000 -1.200000 16.873600 +4.400000 -1.200000 52.611200 +4.800000 -1.200000 118.083200 +5.200000 -1.200000 220.355200 +5.600000 -1.200000 367.107200 +6.000000 -1.200000 566.633600 +-6.000000 -0.800000 738.409600 +-5.600000 -0.800000 525.635200 +-5.200000 -0.800000 365.891200 +-4.800000 -0.800000 250.883200 +-4.400000 -0.800000 172.931200 +-4.000000 -0.800000 124.969600 +-3.600000 -0.800000 100.547200 +-3.200000 -0.800000 93.827200 +-2.800000 -0.800000 99.587200 +-2.400000 -0.800000 113.219200 +-2.000000 -0.800000 130.729600 +-1.600000 -0.800000 148.739200 +-1.200000 -0.800000 164.483200 +-0.800000 -0.800000 175.811200 +-0.400000 -0.800000 181.187200 +0.000000 -0.800000 179.689600 +0.400000 -0.800000 171.011200 +0.800000 -0.800000 155.459200 +1.200000 -0.800000 133.955200 +1.600000 -0.800000 108.035200 +2.000000 -0.800000 79.849600 +2.400000 -0.800000 52.163200 +2.800000 -0.800000 28.355200 +3.200000 -0.800000 12.419200 +3.600000 -0.800000 8.963200 +4.000000 -0.800000 23.209600 +4.400000 -0.800000 60.995200 +4.800000 -0.800000 128.771200 +5.200000 -0.800000 233.603200 +5.600000 -0.800000 383.171200 +6.000000 -0.800000 585.769600 +-6.000000 -0.400000 770.025600 +-5.600000 -0.400000 553.155200 +-5.200000 -0.400000 389.571200 +-4.800000 -0.400000 270.979200 +-4.400000 -0.400000 189.699200 +-4.000000 -0.400000 138.665600 +-3.600000 -0.400000 111.427200 +-3.200000 -0.400000 102.147200 +-2.800000 -0.400000 105.603200 +-2.400000 -0.400000 117.187200 +-2.000000 -0.400000 132.905600 +-1.600000 -0.400000 149.379200 +-1.200000 -0.400000 163.843200 +-0.800000 -0.400000 174.147200 +-0.400000 -0.400000 178.755200 +0.000000 -0.400000 176.745600 +0.400000 -0.400000 167.811200 +0.800000 -0.400000 152.259200 +1.200000 -0.400000 131.011200 +1.600000 -0.400000 105.603200 +2.000000 -0.400000 78.185600 +2.400000 -0.400000 51.523200 +2.800000 -0.400000 28.995200 +3.200000 -0.400000 14.595200 +3.600000 -0.400000 12.931200 +4.000000 -0.400000 29.225600 +4.400000 -0.400000 69.315200 +4.800000 -0.400000 139.651200 +5.200000 -0.400000 247.299200 +5.600000 -0.400000 399.939200 +6.000000 -0.400000 605.865600 +-6.000000 0.000000 794.000000 +-5.600000 0.000000 573.289600 +-5.200000 0.000000 406.121600 +-4.800000 0.000000 284.201600 +-4.400000 0.000000 199.849600 +-4.000000 0.000000 146.000000 +-3.600000 0.000000 116.201600 +-3.200000 0.000000 104.617600 +-2.800000 0.000000 106.025600 +-2.400000 0.000000 115.817600 +-2.000000 0.000000 130.000000 +-1.600000 0.000000 145.193600 +-1.200000 0.000000 158.633600 +-0.800000 0.000000 168.169600 +-0.400000 0.000000 172.265600 +0.000000 0.000000 170.000000 +0.400000 0.000000 161.065600 +0.800000 0.000000 145.769600 +1.200000 0.000000 125.033600 +1.600000 0.000000 100.393600 +2.000000 0.000000 74.000000 +2.400000 0.000000 48.617600 +2.800000 0.000000 27.625600 +3.200000 0.000000 15.017600 +3.600000 0.000000 15.401600 +4.000000 0.000000 34.000000 +4.400000 0.000000 76.649600 +4.800000 0.000000 149.801600 +5.200000 0.000000 260.521600 +5.600000 0.000000 416.489600 +6.000000 0.000000 626.000000 +-6.000000 0.400000 810.025600 +-5.600000 0.400000 585.731200 +-5.200000 0.400000 415.235200 +-4.800000 0.400000 290.243200 +-4.400000 0.400000 203.075200 +-4.000000 0.400000 146.665600 +-3.600000 0.400000 114.563200 +-3.200000 0.400000 100.931200 +-2.800000 0.400000 100.547200 +-2.400000 0.400000 108.803200 +-2.000000 0.400000 121.705600 +-1.600000 0.400000 135.875200 +-1.200000 0.400000 148.547200 +-0.800000 0.400000 157.571200 +-0.400000 0.400000 161.411200 +0.000000 0.400000 159.145600 +0.400000 0.400000 150.467200 +0.800000 0.400000 135.683200 +1.200000 0.400000 115.715200 +1.600000 0.400000 92.099200 +2.000000 0.400000 66.985600 +2.400000 0.400000 43.139200 +2.800000 0.400000 23.939200 +3.200000 0.400000 13.379200 +3.600000 0.400000 16.067200 +4.000000 0.400000 37.225600 +4.400000 0.400000 82.691200 +4.800000 0.400000 158.915200 +5.200000 0.400000 272.963200 +5.600000 0.400000 432.515200 +6.000000 0.400000 645.865600 +-6.000000 0.800000 818.409600 +-5.600000 0.800000 590.787200 +-5.200000 0.800000 417.219200 +-4.800000 0.800000 289.411200 +-4.400000 0.800000 199.683200 +-4.000000 0.800000 140.969600 +-3.600000 0.800000 106.819200 +-3.200000 0.800000 91.395200 +-2.800000 0.800000 89.475200 +-2.400000 0.800000 96.451200 +-2.000000 0.800000 108.329600 +-1.600000 0.800000 121.731200 +-1.200000 0.800000 133.891200 +-0.800000 0.800000 142.659200 +-0.400000 0.800000 146.499200 +0.000000 0.800000 144.489600 +0.400000 0.800000 136.323200 +0.800000 0.800000 122.307200 +1.200000 0.800000 103.363200 +1.600000 0.800000 81.027200 +2.000000 0.800000 57.449600 +2.400000 0.800000 35.395200 +2.800000 0.800000 18.243200 +3.200000 0.800000 9.987200 +3.600000 0.800000 15.235200 +4.000000 0.800000 39.209600 +4.400000 0.800000 87.747200 +4.800000 0.800000 167.299200 +5.200000 0.800000 284.931200 +5.600000 0.800000 448.323200 +6.000000 0.800000 665.769600 +-6.000000 1.200000 820.073600 +-5.600000 1.200000 589.379200 +-5.200000 1.200000 412.995200 +-4.800000 1.200000 282.627200 +-4.400000 1.200000 190.595200 +-4.000000 1.200000 129.833600 +-3.600000 1.200000 93.891200 +-3.200000 1.200000 76.931200 +-2.800000 1.200000 73.731200 +-2.400000 1.200000 79.683200 +-2.000000 1.200000 90.793600 +-1.600000 1.200000 103.683200 +-1.200000 1.200000 115.587200 +-0.800000 1.200000 124.355200 +-0.400000 1.200000 128.451200 +0.000000 1.200000 126.953600 +0.400000 1.200000 119.555200 +0.800000 1.200000 106.563200 +1.200000 1.200000 88.899200 +1.600000 1.200000 68.099200 +2.000000 1.200000 46.313600 +2.400000 1.200000 26.307200 +2.800000 1.200000 11.459200 +3.200000 1.200000 5.763200 +3.600000 1.200000 13.827200 +4.000000 1.200000 40.873600 +4.400000 1.200000 92.739200 +4.800000 1.200000 175.875200 +5.200000 1.200000 297.347200 +5.600000 1.200000 464.835200 +6.000000 1.200000 686.633600 +-6.000000 1.600000 816.553600 +-5.600000 1.600000 583.043200 +-5.200000 1.600000 404.099200 +-4.800000 1.600000 271.427200 +-4.400000 1.600000 177.347200 +-4.000000 1.600000 114.793600 +-3.600000 1.600000 77.315200 +-3.200000 1.600000 59.075200 +-2.800000 1.600000 54.851200 +-2.400000 1.600000 60.035200 +-2.000000 1.600000 70.633600 +-1.600000 1.600000 83.267200 +-1.200000 1.600000 95.171200 +-0.800000 1.600000 104.195200 +-0.400000 1.600000 108.803200 +0.000000 1.600000 108.073600 +0.400000 1.600000 101.699200 +0.800000 1.600000 89.987200 +1.200000 1.600000 73.859200 +1.600000 1.600000 54.851200 +2.000000 1.600000 35.113600 +2.400000 1.600000 17.411200 +2.800000 1.600000 5.123200 +3.200000 1.600000 2.243200 +3.600000 1.600000 13.379200 +4.000000 1.600000 43.753600 +4.400000 1.600000 99.203200 +4.800000 1.600000 186.179200 +5.200000 1.600000 311.747200 +5.600000 1.600000 483.587200 +6.000000 1.600000 709.993600 +-6.000000 2.000000 810.000000 +-5.600000 2.000000 573.929600 +-5.200000 2.000000 392.681600 +-4.800000 2.000000 257.961600 +-4.400000 2.000000 162.089600 +-4.000000 2.000000 98.000000 +-3.600000 2.000000 59.241600 +-3.200000 2.000000 39.977600 +-2.800000 2.000000 34.985600 +-2.400000 2.000000 39.657600 +-2.000000 2.000000 50.000000 +-1.600000 2.000000 62.633600 +-1.200000 2.000000 74.793600 +-0.800000 2.000000 84.329600 +-0.400000 2.000000 89.705600 +0.000000 2.000000 90.000000 +0.400000 2.000000 84.905600 +0.800000 2.000000 74.729600 +1.200000 2.000000 60.393600 +1.600000 2.000000 43.433600 +2.000000 2.000000 26.000000 +2.400000 2.000000 10.857600 +2.800000 2.000000 1.385600 +3.200000 2.000000 1.577600 +3.600000 2.000000 16.041600 +4.000000 2.000000 50.000000 +4.400000 2.000000 109.289600 +4.800000 2.000000 200.361600 +5.200000 2.000000 330.281600 +5.600000 2.000000 506.729600 +6.000000 2.000000 738.000000 +-6.000000 2.400000 803.177600 +-5.600000 2.400000 564.803200 +-5.200000 2.400000 381.507200 +-4.800000 2.400000 244.995200 +-4.400000 2.400000 147.587200 +-4.000000 2.400000 82.217600 +-3.600000 2.400000 42.435200 +-3.200000 2.400000 22.403200 +-2.800000 2.400000 16.899200 +-2.400000 2.400000 21.315200 +-2.000000 2.400000 31.657600 +-1.600000 2.400000 44.547200 +-1.200000 2.400000 57.219200 +-0.800000 2.400000 67.523200 +-0.400000 2.400000 73.923200 +0.000000 2.400000 75.497600 +0.400000 2.400000 71.939200 +0.800000 2.400000 63.555200 +1.200000 2.400000 51.267200 +1.600000 2.400000 36.611200 +2.000000 2.400000 21.737600 +2.400000 2.400000 9.411200 +2.800000 2.400000 3.011200 +3.200000 2.400000 6.531200 +3.600000 2.400000 24.579200 +4.000000 2.400000 62.377600 +4.400000 2.400000 125.763200 +4.800000 2.400000 221.187200 +5.200000 2.400000 355.715200 +5.600000 2.400000 537.027200 +6.000000 2.400000 773.417600 +-6.000000 2.800000 799.465600 +-5.600000 2.800000 559.043200 +-5.200000 2.800000 373.955200 +-4.800000 2.800000 235.907200 +-4.400000 2.800000 137.219200 +-4.000000 2.800000 70.825600 +-3.600000 2.800000 30.275200 +-3.200000 2.800000 9.731200 +-2.800000 2.800000 3.971200 +-2.400000 2.800000 8.387200 +-2.000000 2.800000 18.985600 +-1.600000 2.800000 32.387200 +-1.200000 2.800000 45.827200 +-0.800000 2.800000 57.155200 +-0.400000 2.800000 64.835200 +0.000000 2.800000 67.945600 +0.400000 2.800000 66.179200 +0.800000 2.800000 59.843200 +1.200000 2.800000 49.859200 +1.600000 2.800000 37.763200 +2.000000 2.800000 25.705600 +2.400000 2.800000 16.451200 +2.800000 2.800000 13.379200 +3.200000 2.800000 20.483200 +3.600000 2.800000 42.371200 +4.000000 2.800000 84.265600 +4.400000 2.800000 152.003200 +4.800000 2.800000 252.035200 +5.200000 2.800000 391.427200 +5.600000 2.800000 577.859200 +6.000000 2.800000 819.625600 +-6.000000 3.200000 802.857600 +-5.600000 3.200000 560.643200 +-5.200000 3.200000 374.019200 +-4.800000 3.200000 234.691200 +-4.400000 3.200000 134.979200 +-4.000000 3.200000 67.817600 +-3.600000 3.200000 26.755200 +-3.200000 3.200000 5.955200 +-2.800000 3.200000 0.195200 +-2.400000 3.200000 4.867200 +-2.000000 3.200000 15.977600 +-1.600000 3.200000 30.147200 +-1.200000 3.200000 44.611200 +-0.800000 3.200000 57.219200 +-0.400000 3.200000 66.435200 +0.000000 3.200000 71.337600 +0.400000 3.200000 71.619200 +0.800000 3.200000 67.587200 +1.200000 3.200000 60.163200 +1.600000 3.200000 50.883200 +2.000000 3.200000 41.897600 +2.400000 3.200000 35.971200 +2.800000 3.200000 36.483200 +3.200000 3.200000 47.427200 +3.600000 3.200000 73.411200 +4.000000 3.200000 119.657600 +4.400000 3.200000 192.003200 +4.800000 3.200000 296.899200 +5.200000 3.200000 441.411200 +5.600000 3.200000 633.219200 +6.000000 3.200000 880.617600 +-6.000000 3.600000 817.961600 +-5.600000 3.600000 574.211200 +-5.200000 3.600000 386.307200 +-4.800000 3.600000 245.955200 +-4.400000 3.600000 145.475200 +-4.000000 3.600000 77.801600 +-3.600000 3.600000 36.483200 +-3.200000 3.600000 15.683200 +-2.800000 3.600000 10.179200 +-2.400000 3.600000 15.363200 +-2.000000 3.600000 27.241600 +-1.600000 3.600000 42.435200 +-1.200000 3.600000 58.179200 +-0.800000 3.600000 72.323200 +-0.400000 3.600000 83.331200 +0.000000 3.600000 90.281600 +0.400000 3.600000 92.867200 +0.800000 3.600000 91.395200 +1.200000 3.600000 86.787200 +1.600000 3.600000 80.579200 +2.000000 3.600000 74.921600 +2.400000 3.600000 72.579200 +2.800000 3.600000 76.931200 +3.200000 3.600000 91.971200 +3.600000 3.600000 122.307200 +4.000000 3.600000 173.161600 +4.400000 3.600000 250.371200 +4.800000 3.600000 360.387200 +5.200000 3.600000 510.275200 +5.600000 3.600000 707.715200 +6.000000 3.600000 961.001600 +-6.000000 4.000000 850.000000 +-5.600000 4.000000 604.969600 +-5.200000 4.000000 416.041600 +-4.800000 4.000000 274.921600 +-4.400000 4.000000 173.929600 +-4.000000 4.000000 106.000000 +-3.600000 4.000000 64.681600 +-3.200000 4.000000 44.137600 +-2.800000 4.000000 39.145600 +-2.400000 4.000000 45.097600 +-2.000000 4.000000 58.000000 +-1.600000 4.000000 74.473600 +-1.200000 4.000000 91.753600 +-0.800000 4.000000 107.689600 +-0.400000 4.000000 120.745600 +0.000000 4.000000 130.000000 +0.400000 4.000000 135.145600 +0.800000 4.000000 136.489600 +1.200000 4.000000 134.953600 +1.600000 4.000000 132.073600 +2.000000 4.000000 130.000000 +2.400000 4.000000 131.497600 +2.800000 4.000000 139.945600 +3.200000 4.000000 159.337600 +3.600000 4.000000 194.281600 +4.000000 4.000000 250.000000 +4.400000 4.000000 332.329600 +4.800000 4.000000 447.721600 +5.200000 4.000000 603.241600 +5.600000 4.000000 806.569600 +6.000000 4.000000 1066.000000 +-6.000000 4.400000 904.809600 +-5.600000 4.400000 658.755200 +-5.200000 4.400000 469.059200 +-4.800000 4.400000 327.427200 +-4.400000 4.400000 226.179200 +-4.000000 4.400000 158.249600 +-3.600000 4.400000 117.187200 +-3.200000 4.400000 97.155200 +-2.800000 4.400000 92.931200 +-2.400000 4.400000 99.907200 +-2.000000 4.400000 114.089600 +-1.600000 4.400000 132.099200 +-1.200000 4.400000 151.171200 +-0.800000 4.400000 169.155200 +-0.400000 4.400000 184.515200 +0.000000 4.400000 196.329600 +0.400000 4.400000 204.291200 +0.800000 4.400000 208.707200 +1.200000 4.400000 210.499200 +1.600000 4.400000 211.203200 +2.000000 4.400000 212.969600 +2.400000 4.400000 218.563200 +2.800000 4.400000 231.363200 +3.200000 4.400000 255.363200 +3.600000 4.400000 295.171200 +4.000000 4.400000 356.009600 +4.400000 4.400000 443.715200 +4.800000 4.400000 564.739200 +5.200000 4.400000 726.147200 +5.600000 4.400000 935.619200 +6.000000 4.400000 1201.449600 +-6.000000 4.800000 988.841600 +-5.600000 4.800000 742.019200 +-5.200000 4.800000 551.811200 +-4.800000 4.800000 409.923200 +-4.400000 4.800000 308.675200 +-4.000000 4.800000 241.001600 +-3.600000 4.800000 200.451200 +-3.200000 4.800000 181.187200 +-2.800000 4.800000 177.987200 +-2.400000 4.800000 186.243200 +-2.000000 4.800000 201.961600 +-1.600000 4.800000 221.763200 +-1.200000 4.800000 242.883200 +-0.800000 4.800000 263.171200 +-0.400000 4.800000 281.091200 +0.000000 4.800000 295.721600 +0.400000 4.800000 306.755200 +0.800000 4.800000 314.499200 +1.200000 4.800000 319.875200 +1.600000 4.800000 324.419200 +2.000000 4.800000 330.281600 +2.400000 4.800000 340.227200 +2.800000 4.800000 357.635200 +3.200000 4.800000 386.499200 +3.600000 4.800000 431.427200 +4.000000 4.800000 497.641600 +4.400000 4.800000 590.979200 +4.800000 4.800000 717.891200 +5.200000 4.800000 885.443200 +5.600000 4.800000 1101.315200 +6.000000 4.800000 1373.801600 +-6.000000 5.200000 1109.161600 +-5.600000 5.200000 861.827200 +-5.200000 5.200000 671.363200 +-4.800000 5.200000 529.475200 +-4.400000 5.200000 428.483200 +-4.000000 5.200000 361.321600 +-3.600000 5.200000 321.539200 +-3.200000 5.200000 303.299200 +-2.800000 5.200000 301.379200 +-2.400000 5.200000 311.171200 +-2.000000 5.200000 328.681600 +-1.600000 5.200000 350.531200 +-1.200000 5.200000 373.955200 +-0.800000 5.200000 396.803200 +-0.400000 5.200000 417.539200 +0.000000 5.200000 435.241600 +0.400000 5.200000 449.603200 +0.800000 5.200000 460.931200 +1.200000 5.200000 470.147200 +1.600000 5.200000 478.787200 +2.000000 5.200000 489.001600 +2.400000 5.200000 503.555200 +2.800000 5.200000 525.827200 +3.200000 5.200000 559.811200 +3.600000 5.200000 610.115200 +4.000000 5.200000 681.961600 +4.400000 5.200000 781.187200 +4.800000 5.200000 914.243200 +5.200000 5.200000 1088.195200 +5.600000 5.200000 1310.723200 +6.000000 5.200000 1590.121600 +-6.000000 5.600000 1273.449600 +-5.600000 5.600000 1025.859200 +-5.200000 5.600000 835.395200 +-4.800000 5.600000 693.763200 +-4.400000 5.600000 593.283200 +-4.000000 5.600000 526.889600 +-3.600000 5.600000 488.131200 +-3.200000 5.600000 471.171200 +-2.800000 5.600000 470.787200 +-2.400000 5.600000 482.371200 +-2.000000 5.600000 501.929600 +-1.600000 5.600000 526.083200 +-1.200000 5.600000 552.067200 +-0.800000 5.600000 577.731200 +-0.400000 5.600000 601.539200 +0.000000 5.600000 622.569600 +0.400000 5.600000 640.515200 +0.800000 5.600000 655.683200 +1.200000 5.600000 668.995200 +1.600000 5.600000 681.987200 +2.000000 5.600000 696.809600 +2.400000 5.600000 716.227200 +2.800000 5.600000 743.619200 +3.200000 5.600000 782.979200 +3.600000 5.600000 838.915200 +4.000000 5.600000 916.649600 +4.400000 5.600000 1022.019200 +4.800000 5.600000 1161.475200 +5.200000 5.600000 1342.083200 +5.600000 5.600000 1571.523200 +6.000000 5.600000 1858.089600 +-6.000000 6.000000 1490.000000 +-5.600000 6.000000 1242.409600 +-5.200000 6.000000 1052.201600 +-4.800000 6.000000 911.081600 +-4.400000 6.000000 811.369600 +-4.000000 6.000000 746.000000 +-3.600000 6.000000 708.521600 +-3.200000 6.000000 693.097600 +-2.800000 6.000000 694.505600 +-2.400000 6.000000 708.137600 +-2.000000 6.000000 730.000000 +-1.600000 6.000000 756.713600 +-1.200000 6.000000 785.513600 +-0.800000 6.000000 814.249600 +-0.400000 6.000000 841.385600 +0.000000 6.000000 866.000000 +0.400000 6.000000 887.785600 +0.800000 6.000000 907.049600 +1.200000 6.000000 924.713600 +1.600000 6.000000 942.313600 +2.000000 6.000000 962.000000 +2.400000 6.000000 986.537600 +2.800000 6.000000 1019.305600 +3.200000 6.000000 1064.297600 +3.600000 6.000000 1126.121600 +4.000000 6.000000 1210.000000 +4.400000 6.000000 1321.769600 +4.800000 6.000000 1467.881600 +5.200000 6.000000 1655.401600 +5.600000 6.000000 1892.009600 +6.000000 6.000000 2186.000000 diff --git a/extra/function/tests/mapper/simple.py b/extra/function/tests/mapper/simple.py new file mode 100644 index 00000000..a82d0f9a --- /dev/null +++ b/extra/function/tests/mapper/simple.py @@ -0,0 +1,12 @@ +import numpy as np + +import py2dmat +import py2dmat.algorithm.mapper_mpi as mapper +import function + +info = py2dmat.Info.from_file("input.toml") +solver = function.Himmelblau(info) +runner = py2dmat.Runner(solver, info) + +alg = mapper.Algorithm(info, runner) +alg.main()