From 392cf5c98093c1b709b06696940adcad016aa525 Mon Sep 17 00:00:00 2001 From: Alessio Roccon Date: Tue, 24 Jun 2025 18:22:02 +0200 Subject: [PATCH 01/12] lic_update --- LICENSE | 695 ++------------------------------------------------------ 1 file changed, 21 insertions(+), 674 deletions(-) diff --git a/LICENSE b/LICENSE index f288702..b9c0027 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,21 @@ - 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 -. +MIT License + +Copyright (c) 2025 Multiphase Flow Laboratory + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 38607bf02e8b5cf53b43545bee707054d6667b7b Mon Sep 17 00:00:00 2001 From: aroccon Date: Wed, 2 Jul 2025 17:02:54 +0200 Subject: [PATCH 02/12] release --- multi/main.f90 | 41 +++++++++++++++++++++-------------------- multi/module.f90 | 2 +- val/.DS_Store | Bin 0 -> 6148 bytes 3 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 val/.DS_Store diff --git a/multi/main.f90 b/multi/main.f90 index da8536a..badc231 100644 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -36,7 +36,7 @@ program main ! Code variables ! Enable or disable phase field (acceleration eneabled by default) -#define phiflag 1 +#define phiflag 0 !######################################################################################################################################## ! 1. INITIALIZATION OF MPI AND cuDECOMP AUTOTUNING : START @@ -188,7 +188,7 @@ program main allocate(div(piX%shape(1),piX%shape(2),piX%shape(3))) !PFM variables #if phiflag == 1 -allocate(phi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi(piX%shape(1),piX%shape(2),piX%shape(3))) +allocate(phi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi_o(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(psidi(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(normx(piX%shape(1),piX%shape(2),piX%shape(3)),normy(piX%shape(1),piX%shape(2),piX%shape(3)),normz(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(chempot(piX%shape(1),piX%shape(2),piX%shape(3)),gradphix(piX%shape(1),piX%shape(2),piX%shape(3)),gradphiy(piX%shape(1),piX%shape(2),piX%shape(3)),gradphiz(piX%shape(1),piX%shape(2),piX%shape(3))) @@ -468,12 +468,12 @@ program main enddo !$acc end kernels - ! 4.2 Get phi at n+1 + ! 4.2 Get phi at n+1 using AB2 !$acc kernels do k=1+halo_ext, piX%shape(3)-halo_ext do j=1+halo_ext, piX%shape(2)-halo_ext do i=1,nx - phi(i,j,k) = phi(i,j,k) + dt*rhsphi(i,j,k) + phi(i,j,k) = phi(i,j,k) + dt*(alpha*rhsphi(i,j,k)-beta*rhsphi_o(i,j,k)) enddo enddo enddo @@ -486,7 +486,7 @@ program main !$acc end host_data #endif !######################################################################################################################################## - ! END STEP 4: PHASE-FIELD SOLVER (EXPLICIT) + ! END STEP 4: PHASE-FIELD SOLVER !######################################################################################################################################## call nvtxEndRange @@ -588,9 +588,9 @@ program main jg = piX%lo(2) + j - 1 do i = 1, piX%shape(1) ! ABC forcing - rhsu(i,j,k)= rhsu(i,j,k) + f3*sin(k0*x(kg))+f2*cos(k0*x(jg)) - rhsv(i,j,k)= rhsv(i,j,k) + f1*sin(k0*x(i))+f3*cos(k0*x(kg)) - rhsw(i,j,k)= rhsw(i,j,k) + f2*sin(k0*x(jg))+f1*cos(k0*x(i)) + rhsu(i,j,k)= rhsu(i,j,k) + f3*sin(k0*(x(kg)+dx/2))+f2*cos(k0*(x(jg)+dx/2)) + rhsv(i,j,k)= rhsv(i,j,k) + f1*sin(k0*(x(i) +dx/2))+f3*cos(k0*(x(kg)+dx/2)) + rhsw(i,j,k)= rhsw(i,j,k) + f2*sin(k0*(x(jg)+dx/2))+f1*cos(k0*(x(i) +dx/2)) ! TG Forcing !rhsu(i,j,k)= rhsu(i,j,k) + f1*sin(k0*x(i))*cos(k0*x(j))*cos(k0*x(k)) !rhsv(i,j,k)= rhsv(i,j,k) - f1*cos(k0*x(i))*sin(k0*x(j))*sin(k0*x(k)) @@ -673,9 +673,9 @@ program main ! store rhs* in rhs*_o ! After first step move to AB2 - !$acc kernels alpha=1.5d0 beta= 0.5d0 + !$acc kernels rhsu_o=rhsu rhsv_o=rhsv rhsw_o=rhsw @@ -782,7 +782,7 @@ program main yoff = offsets(2) npx = np(1) npy = np(2) - !$cuf kernel do (2) + !$acc kernels do jl = 1, npy do il = 1, npx jg = yoff + jl @@ -793,7 +793,8 @@ program main enddo enddo enddo - + !$acc end kernels + ! specify mean (corrects division by zero wavenumber above) if (xoff == 0 .and. yoff == 0) psi3d(1,1,1) = 0.0 end block @@ -809,16 +810,18 @@ program main ! psi(y,z,kx) -> psi(kx,y,z) CHECK_CUDECOMP_EXIT(cudecompTransposeYToX(handle, grid_desc, psi_d, psi_d, work_d, CUDECOMP_DOUBLE_COMPLEX, [0,0,0], Pix%halo_extents)) ! psi(kx,y,z) -> psi(x,y,z) - status = cufftExecZ2Z(planX, psi_d, psi_d, CUFFT_INVERSE) + !$acc host_data use_device(rhsp_complex) + status = cufftExecZ2Z(planX, psi_d, rhsp_complex, CUFFT_INVERSE) if (status /= CUFFT_SUCCESS) write(*,*) 'X inverse error: ', status + !$acc end host_data ! update halo nodes with pressure (needed for the pressure correction step), using device variable no need to use host-data ! Update X-pencil halos in Y and Z direction - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, psi_d, work_halo_d, CUDECOMP_DOUBLE_COMPLEX, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, psi_d, work_halo_d, CUDECOMP_DOUBLE_COMPLEX, piX%halo_extents, halo_periods, 3)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, rhsp_complex, work_halo_d, CUDECOMP_DOUBLE_COMPLEX, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, rhsp_complex, work_halo_d, CUDECOMP_DOUBLE_COMPLEX, piX%halo_extents, halo_periods, 3)) !D2H transfer - psi = psi_d + !psi = psi_d ! check against analytical solution @@ -843,13 +846,12 @@ program main do kl = 1, piX%shape(3) do jl = 1, piX%shape(2) do i = 1, piX%shape(1) - p(i,jl,kl) = real(psi3(i,jl,kl)) + p(i,jl,kl) = real(rhsp_complex(i,jl,kl)) enddo enddo enddo !$acc end kernels - !write(*,"(' [', i0, '] Max Error: ', e12.6)") rank, maxErr end block !######################################################################################################################################## @@ -946,7 +948,7 @@ program main endif call cpu_time(timef) - if (rank.eq.0) print '(" Time elapsed = ",f6.1," ms")',1000*(timef-times) + if (rank.eq.0) print '(" Time elapsed = ",f8.1," ms")',1000*(timef-times) !######################################################################################################################################## ! END STEP 8: VELOCITY CORRECTION !######################################################################################################################################## @@ -976,11 +978,10 @@ program main enddo -! Remove allocated variables (add new) deallocate(u,v,w) deallocate(rhsu,rhsv,rhsw) deallocate(rhsu_o,rhsv_o,rhsw_o) -deallocate(phi,rhsphi,normx,normy,normz) +deallocate(phi,rhsphi,rhsphi_o,normx,normy,normz) call mpi_finalize(ierr) diff --git a/multi/module.f90 b/multi/module.f90 index cb99aec..e982b81 100644 --- a/multi/module.f90 +++ b/multi/module.f90 @@ -51,7 +51,7 @@ end module velocity module phase - double precision, allocatable :: phi(:,:,:), rhsphi(:,:,:), psidi(:,:,:) + double precision, allocatable :: phi(:,:,:), rhsphi(:,:,:), psidi(:,:,:), rhsphi_o(:,:,:), double precision, allocatable :: normx(:,:,:), normy(:,:,:), normz(:,:,:) double precision, allocatable :: chempot(:,:,:), gradphix(:,:,:), gradphiy(:,:,:), gradphiz(:,:,:) double precision, allocatable :: fxst(:,:,:), fyst(:,:,:), fzst(:,:,:) diff --git a/val/.DS_Store b/val/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fb0b244f71f7bc94b320644a36dff2811a66d27e GIT binary patch literal 6148 zcmeHK%}N6?5dKn&R6N+D7a?y@iXeDf>k10$rRv$%tyz0+h-Ac7N5ZP@tY)6 zOO?eQL}aE+zR6@JKVM*{0bqJ%(goT8T2#Tt2AeNL#zmK;5j^Wevc^nVZe8`MeZ|C{tt@(OTzfP7X zD`ZXXf4aL#F+442#gseRM;}j^@!TV1=->)+>XP<|-VS06I5wbl$v(Mo-hpFjMtjWo zDfNcGoE&y=NEFs2`wYi8!3B1)$KE67Nr|<5bARVye>FUFE)``!8BhjRVSqJTq_yc$ zTV+5QPzL4<$oIig1*3qKNB8Mqi^OA@BhUl?I{Dwz`tU^ zG~<5UvbT{@i9T1&mAib!1Lah^iMm14$9Dc+_!q2G!@i~?33>7nQ!0Y`&2%D}HO F@D6 Date: Wed, 2 Jul 2025 17:08:26 +0200 Subject: [PATCH 03/12] release_fix --- multi/Makefile_local | 2 +- multi/local.sh | 2 +- multi/module.f90 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/multi/Makefile_local b/multi/Makefile_local index d928029..fc154b8 100644 --- a/multi/Makefile_local +++ b/multi/Makefile_local @@ -4,7 +4,7 @@ LD = $(FC) RM = /bin/rm -f # Paths (Modify if necessary) -CUDECOMP_DIR = /home/milton/MHIT36_cuDecomp/cuDecomp/build/ +CUDECOMP_DIR = /home/milton/MHIT36/cuDecomp/build/ # Compiler and Linker Flags FFLAGS = -fast -acc -gpu=managed -Minfo=accel -Mfree -Mpreprocess -cpp -Minfo=accel -cuda -I$(CUDECOMP_DIR)/include diff --git a/multi/local.sh b/multi/local.sh index 6b4e9dc..04116e8 100644 --- a/multi/local.sh +++ b/multi/local.sh @@ -4,7 +4,7 @@ MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/24.3/compilers/man; export MANPATH PATH=$NVCOMPILERS/$NVARCH/24.3/compilers/bin:$PATH; export PATH export PATH=$NVCOMPILERS/$NVARCH/24.3/comm_libs/mpi/bin:$PATH export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/24.3/comm_libs/mpi/man -LD_LIBRARY_PATH=/home/milton/MHIT36_cuDecomp/cuDecomp/build/lib +LD_LIBRARY_PATH=/home/milton/MHIT36/cuDecomp/build/lib #clean folder output rm -rf output mkdir output diff --git a/multi/module.f90 b/multi/module.f90 index e982b81..3ec222c 100644 --- a/multi/module.f90 +++ b/multi/module.f90 @@ -51,7 +51,7 @@ end module velocity module phase - double precision, allocatable :: phi(:,:,:), rhsphi(:,:,:), psidi(:,:,:), rhsphi_o(:,:,:), + double precision, allocatable :: phi(:,:,:), rhsphi(:,:,:), psidi(:,:,:), rhsphi_o(:,:,:) double precision, allocatable :: normx(:,:,:), normy(:,:,:), normz(:,:,:) double precision, allocatable :: chempot(:,:,:), gradphix(:,:,:), gradphiy(:,:,:), gradphiz(:,:,:) double precision, allocatable :: fxst(:,:,:), fyst(:,:,:), fzst(:,:,:) From d474d47a85e0ffbed0033ffe996aea0ddeb1e2d6 Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 3 Jul 2025 17:54:31 +0200 Subject: [PATCH 04/12] update --- README.md | 11 +------- multi/main.f90 | 5 ---- multi/module.f90 | 70 ------------------------------------------------ 3 files changed, 1 insertion(+), 85 deletions(-) diff --git a/README.md b/README.md index c7d0b1e..ef17203 100644 --- a/README.md +++ b/README.md @@ -59,12 +59,8 @@ If you use this code, please cite the following work: ## Reference performance Performance (NS only) -* 128 x 128 x 128 | 2 x RTX5000@milton | 14 ms/timestep -* 256 x 256 x 256 | 2 x RTX5000@milton | 129 ms/timestep -* 128 x 128 x 128 | 4 x A100@Leonardo | 7 ms/timestep * 256 x 256 x 256 | 4 x A100@Leonardo | 44 ms/timestep -* 512 x 512 x 512 | 4 x A100@Leonardo | 470 ms/timestep -* 512 x 512 x 512 | 8 x A100@Leonardo | 200 ms/timestep +* 512 x 512 x 512 | 4 x A100@Leonardo | 270 ms/timestep * 1024 x 1024 x 1024 | 512 x A100@Leonardo | 35 ms/timestep * 2048 x 2048 x 2048 | 256 x A100@Leonardo | 740 ms/timestep * 128 x 128 x 128 | 4 x H100@MN5-ACC | 7 ms/timestep @@ -74,11 +70,6 @@ Performance (NS only) * 1024 x 1024 x 1024 | 512 x H100@MN5-ACC | 32 ms/timestep * 2048 x 2048 x 2048 | 512 x H100@MN5-ACC | 259 ms/timestep -Max resolution tested (Poisson only): -* 768 x 768 x 768 | 2 x RTX5000@milton - 16 GB VRAM -* 2048 x 2048 x 2048 | 32 x A100@Leonardo - 64 GB VRAm (also tested on 256/512 GPUs) -* 2048 x 2048 x 2048 | 32 x H100@MN5-ACC - 64 GB VRAm (also tested on 256/512 GPUs) - Phase-field introduces about 15% of overhead compared to NS only. ## Scaling diff --git a/multi/main.f90 b/multi/main.f90 index badc231..4f15be0 100644 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -10,7 +10,6 @@ program main use param use mpivar use cudecompvar -use nvtx implicit none @@ -331,7 +330,6 @@ program main if (rank.eq.0) write(*,*) "Time step",t,"of",tfin call cpu_time(times) - call nvtxStartRange("Phase-field",1) !######################################################################################################################################## ! START STEP 4: PHASE-FIELD SOLVER (EXPLICIT) !######################################################################################################################################## @@ -488,9 +486,6 @@ program main !######################################################################################################################################## ! END STEP 4: PHASE-FIELD SOLVER !######################################################################################################################################## - call nvtxEndRange - - diff --git a/multi/module.f90 b/multi/module.f90 index 3ec222c..5e0c636 100644 --- a/multi/module.f90 +++ b/multi/module.f90 @@ -58,75 +58,5 @@ module phase end module phase -! added NVTX for profiing from maxcuda/NVTX_example -module nvtx -use iso_c_binding -implicit none -integer,private :: col(7) = [ int(Z'0000ff00'), int(Z'000000ff'), int(Z'00ffff00'), int(Z'00ff00ff'), int(Z'0000ffff'), int(Z'00ff0000'), int(Z'00ffffff')] -character,private,target :: tempName(256) -type, bind(C):: nvtxEventAttributes - integer(C_INT16_T):: version=1 - integer(C_INT16_T):: size=48 ! - integer(C_INT):: category=0 - integer(C_INT):: colorType=1 ! NVTX_COLOR_ARGB = 1 - integer(C_INT):: color - integer(C_INT):: payloadType=0 ! NVTX_PAYLOAD_UNKNOWN = 0 - integer(C_INT):: reserved0 - integer(C_INT64_T):: payload ! union uint,int,double - integer(C_INT):: messageType=1 ! NVTX_MESSAGE_TYPE_ASCII = 1 - type(C_PTR):: message ! ascii char -end type - -interface nvtxRangePush - ! push range with custom label and standard color - subroutine nvtxRangePushA(name) bind(C, name='nvtxRangePushA') - use iso_c_binding - character(kind=C_CHAR) :: name(256) - end subroutine - - ! push range with custom label and custom color - subroutine nvtxRangePushEx(event) bind(C, name='nvtxRangePushEx') - use iso_c_binding - import:: nvtxEventAttributes - type(nvtxEventAttributes):: event - end subroutine -end interface - -interface nvtxRangePop - subroutine nvtxRangePop() bind(C, name='nvtxRangePop') - end subroutine -end interface - -contains - -subroutine nvtxStartRange(name,id) - character(kind=c_char,len=*) :: name - integer, optional:: id - type(nvtxEventAttributes):: event - character(kind=c_char,len=256) :: trimmed_name - integer:: i - - trimmed_name=trim(name)//c_null_char - - ! move scalar trimmed_name into character array tempName - do i=1,LEN(trim(name)) + 1 - tempName(i) = trimmed_name(i:i) - enddo - - - if ( .not. present(id)) then - call nvtxRangePush(tempName) - else - event%color=col(mod(id,7)+1) - event%message=c_loc(tempName) - call nvtxRangePushEx(event) - end if -end subroutine - -subroutine nvtxEndRange - call nvtxRangePop -end subroutine - -end module nvtx From ae253d682efe0c71990ea3a26813dcae4bffda35 Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 3 Jul 2025 17:58:00 +0200 Subject: [PATCH 05/12] update2 --- README.md | 2 +- scaling.numbers | Bin 338725 -> 0 bytes vtkwrite.m | 279 ------------------------------------------------ 3 files changed, 1 insertion(+), 280 deletions(-) delete mode 100644 scaling.numbers delete mode 100644 vtkwrite.m diff --git a/README.md b/README.md index ef17203..4d6e9aa 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ If you use this code, please cite the following work: ## Reference performance Performance (NS only) -* 256 x 256 x 256 | 4 x A100@Leonardo | 44 ms/timestep +* 256 x 256 x 256 | 4 x A100@Leonardo | 16 ms/timestep * 512 x 512 x 512 | 4 x A100@Leonardo | 270 ms/timestep * 1024 x 1024 x 1024 | 512 x A100@Leonardo | 35 ms/timestep * 2048 x 2048 x 2048 | 256 x A100@Leonardo | 740 ms/timestep diff --git a/scaling.numbers b/scaling.numbers deleted file mode 100644 index be08ddf4ee933048587be3f09c42fabbf43c8f3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338725 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 GPyYwz1qez2 diff --git a/vtkwrite.m b/vtkwrite.m deleted file mode 100644 index 91be51a..0000000 --- a/vtkwrite.m +++ /dev/null @@ -1,279 +0,0 @@ -function vtkwrite( filename,dataType,varargin ) -% VTKWRITE Writes 3D Matlab array into VTK file format. -% vtkwrite(filename,'structured_grid',x,y,z,'vectors',title,u,v,w) writes -% a structured 3D vector data into VTK file, with name specified by the string -% filename. (u,v,w) are the vector components at the points (x,y,z). x,y,z -% should be 3-D matrices like those generated by meshgrid, where -% point(ijk) is specified by x(i,j,k), y(i,j,k) and z(i,j,k). -% The matrices x,y,z,u,v,w must all be the same size and contain -% corrresponding position and vector component. The string title specifies -% the name of the vector field to be saved. -% -% vtkwrite(filename,'structured_grid',x,y,z,'scalars',title,r) writes a 3D -% scalar data into VTK file whose name is specified by the string -% filename. r is the scalar value at the points (x,y,z). The matrices -% x,y,z,r must all be the same size and contain the corresponding position -% and scalar values. -% -% vtkwrite(filename,'structured_grid',x,y,z,'vectors',title,u,v,w,'scalars', -% title2,r) writes a 3D structured grid that contains both vector and scalar values. -% x,y,z,u,v,w,r must all be the same size and contain the corresponding -% positon, vector and scalar values. -% -% vtkwrite(filename, 'structured_points', title, m) saves matrix m (could -% be 1D, 2D or 3D array) into vtk as structured points. -% -% vtkwrite(filename, 'structured_points', title, m, 'spacing', sx, sy, sz) -% allows user to specify spacing. (default: 1, 1, 1). This is the aspect -% ratio of a single voxel. -% -% vtkwrite(filename, 'structured_points', title, m, 'origin', ox, oy, oz) -% allows user to speicify origin of dataset. (default: 0, 0, 0). -% -% vtkwrite(filename,'unstructured_grid',x,y,z,'vectors',title,u,v,w,'scalars', -% title2,r) writes a 3D unstructured grid that contains both vector and scalar values. -% x,y,z,u,v,w,r must all be the same size and contain the corresponding -% positon, vector and scalar values. -% -% vtkwrite(filename, 'polydata', 'lines', x, y, z) exports a 3D line where -% x,y,z are coordinates of the points that make the line. x, y, z are -% vectors containing the coordinates of points of the line, where point(n) -% is specified by x(n), y(n) and z(n). -% -% vtkwrite(filename,'polydata','lines',x,y,z,'Precision',n) allows you to -% specify precision of the exported number up to n digits after decimal -% point. Default precision is 3 digits. -% -% vtkwrite(filename,'polydata','triangle',x,y,z,tri) exports a list of -% triangles where x,y,z are the coordinates of the points and tri is an -% m*3 matrix whose rows denote the points of the individual triangles. -% -% vtkwrite(filename,'polydata','tetrahedron',x,y,z,tetra) exports a list -% of tetrahedrons where x,y,z are the coordinates of the points -% and tetra is an m*4 matrix whose rows denote the points of individual -% tetrahedrons. -% -% vtkwrite('execute','polydata','lines',x,y,z) will save data with default -% filename ''matlab_export.vtk' and automatically loads data into -% ParaView. -% -% Version 2.3 -% Copyright, Chaoyuan Yeh, 2016 -% Codes are modified from William Thielicke and David Gingras's submission. - -if strcmpi(filename,'execute'), filename = 'matlab_export.vtk'; end -fid = fopen(filename, 'w'); -% VTK files contain five major parts -% 1. VTK DataFile Version -fprintf(fid, '# vtk DataFile Version 2.0\n'); -% 2. Title -fprintf(fid, 'VTK from Matlab\n'); - - -binaryflag = any(strcmpi(varargin, 'BINARY')); -if any(strcmpi(varargin, 'PRECISION')) - precision = num2str(varargin{find(strcmpi(vin, 'PRECISION'))+1}); -else - precision = '2'; -end - -switch upper(dataType) - case 'STRUCTURED_POINTS' - title = varargin{1}; - m = varargin{2}; - if any(strcmpi(varargin, 'spacing')) - sx = varargin{find(strcmpi(varargin, 'spacing'))+1}; - sy = varargin{find(strcmpi(varargin, 'spacing'))+2}; - sz = varargin{find(strcmpi(varargin, 'spacing'))+3}; - else - sx = 1; - sy = 1; - sz = 1; - end - if any(strcmpi(varargin, 'origin')) - ox = varargin{find(strcmpi(varargin, 'origin'))+1}; - oy = varargin{find(strcmpi(varargin, 'origin'))+2}; - oz = varargin{find(strcmpi(varargin, 'origin'))+3}; - else - ox = 0; - oy = 0; - oz = 0; - end - [nx, ny, nz] = size(m); - setdataformat(fid, binaryflag); - - fprintf(fid, 'DATASET STRUCTURED_POINTS\n'); - fprintf(fid, 'DIMENSIONS %d %d %d\n', nx, ny, nz); - fprintf(fid, ['SPACING ', num2str(sx), ' ', num2str(sy), ' ',... - num2str(sz), '\n']); - fprintf(fid, ['ORIGIN ', num2str(ox), ' ', num2str(oy), ' ',... - num2str(oz), '\n']); - fprintf(fid, 'POINT_DATA %d\n', nx*ny*nz); - fprintf(fid, ['SCALARS ', title, ' float 1\n']); - fprintf(fid,'LOOKUP_TABLE default\n'); - if ~binaryflag - spec = ['%0.', precision, 'f ']; - fprintf(fid, spec, m(:)'); - else - fwrite(fid, m(:)', 'float', 'b'); - end - - case {'STRUCTURED_GRID','UNSTRUCTURED_GRID'} - % 3. The format data proper is saved in (ASCII or Binary). Use - % fprintf to write data in the case of ASCII and fwrite for binary. - if numel(varargin)<6, error('Not enough input arguments'); end - setdataformat(fid, binaryflag); -% fprintf(fid, 'BINARY\n'); - x = varargin{1}; - y = varargin{2}; - z = varargin{3}; - if sum(size(x)==size(y) & size(y)==size(z))~=length(size(x)) - error('Input dimesions do not match') - end - n_elements = numel(x); - % 4. Type of Dataset ( can be STRUCTURED_POINTS, STRUCTURED_GRID, - % UNSTRUCTURED_GRID, POLYDATA, RECTILINEAR_GRID or FIELD ) - % This part, dataset structure, begins with a line containing the - % keyword 'DATASET' followed by a keyword describing the type of dataset. - % Then the geomettry part describes geometry and topology of the dataset. - if strcmpi(dataType,'STRUCTURED_GRID') - fprintf(fid, 'DATASET STRUCTURED_GRID\n'); - fprintf(fid, 'DIMENSIONS %d %d %d\n', size(x,1), size(x,2), size(x,3)); - else - fprintf(fid, 'DATASET UNSTRUCTURED_GRID\n'); - end - fprintf(fid, ['POINTS ' num2str(n_elements) ' float\n']); - output = [x(:)'; y(:)'; z(:)']; - - if ~binaryflag - spec = ['%0.', precision, 'f ']; - fprintf(fid, spec, output); - else - fwrite(fid, output, 'float', 'b'); - end - % 5.This final part describe the dataset attributes and begins with the - % keywords 'POINT_DATA' or 'CELL_DATA', followed by an integer number - % specifying the number of points of cells. Other keyword/data combination - % then define the actual dataset attribute values. - fprintf(fid, ['\nPOINT_DATA ' num2str(n_elements)]); - % Parse remaining argument. - vidx = find(strcmpi(varargin,'VECTORS')); - sidx = find(strcmpi(varargin,'SCALARS')); - if vidx~=0 - for ii = 1:length(vidx) - title = varargin{vidx(ii)+1}; - % Data enteries begin with a keyword specifying data type - % and numeric format. - fprintf(fid, ['\nVECTORS ', title,' float\n']); - output = [varargin{ vidx(ii) + 2 }(:)';... - varargin{ vidx(ii) + 3 }(:)';... - varargin{ vidx(ii) + 4 }(:)']; - - if ~binaryflag - spec = ['%0.', precision, 'f ']; - fprintf(fid, spec, output); - else - fwrite(fid, output, 'float', 'b'); - end -% fwrite(fid, [reshape(varargin{vidx(ii)+2},1,n_elements);... -% reshape(varargin{vidx(ii)+3},1,n_elements);... -% reshape(varargin{vidx(ii)+4},1,n_elements)],'float','b'); - end - end - if sidx~=0 - for ii = 1:length(sidx) - title = varargin{sidx(ii)+1}; - fprintf(fid, ['\nSCALARS ', title,' float\n']); - fprintf(fid, 'LOOKUP_TABLE default\n'); - if ~binaryflag - spec = ['%0.', precision, 'f ']; - fprintf(fid, spec, varargin{ sidx(ii) + 2}); - else - fwrite(fid, varargin{ sidx(ii) + 2}, 'float', 'b'); - end -% fwrite(fid, reshape(varargin{sidx(ii)+2},1,n_elements),'float','b'); - end - end - - case 'POLYDATA' - - fprintf(fid, 'ASCII\n'); - if numel(varargin)<4, error('Not enough input arguments'); end - x = varargin{2}(:); - y = varargin{3}(:); - z = varargin{4}(:); - if numel(varargin)<4, error('Not enough input arguments'); end - if sum(size(x)==size(y) & size(y)==size(z))~= length(size(x)) - error('Input dimesions do not match') - end - n_elements = numel(x); - fprintf(fid, 'DATASET POLYDATA\n'); - if mod(n_elements,3)==1 - x(n_elements+1:n_elements+2,1)=[0;0]; - y(n_elements+1:n_elements+2,1)=[0;0]; - z(n_elements+1:n_elements+2,1)=[0;0]; - elseif mod(n_elements,3)==2 - x(n_elements+1,1)=0; - y(n_elements+1,1)=0; - z(n_elements+1,1)=0; - end - nbpoint = numel(x); - fprintf(fid, ['POINTS ' num2str(nbpoint) ' float\n']); - - spec = [repmat(['%0.', precision, 'f '], 1, 9), '\n']; - - output = [x(1:3:end-2), y(1:3:end-2), z(1:3:end-2),... - x(2:3:end-1), y(2:3:end-1), z(2:3:end-1),... - x(3:3:end), y(3:3:end), z(3:3:end)]'; - - fprintf(fid, spec, output); - - switch upper(varargin{1}) - case 'LINES' - if mod(n_elements,2)==0 - nbLine = 2*n_elements-2; - else - nbLine = 2*(n_elements-1); - end - conn1 = zeros(nbLine,1); - conn2 = zeros(nbLine,1); - conn2(1:nbLine/2) = 1:nbLine/2; - conn1(1:nbLine/2) = conn2(1:nbLine/2)-1; - conn1(nbLine/2+1:end) = 1:nbLine/2; - conn2(nbLine/2+1:end) = conn1(nbLine/2+1:end)-1; - fprintf(fid,'\nLINES %d %d\n',nbLine,3*nbLine); - fprintf(fid,'2 %d %d\n',[conn1';conn2']); - case 'TRIANGLE' - ntri = length(varargin{5}); - fprintf(fid,'\nPOLYGONS %d %d\n',ntri,4*ntri); - fprintf(fid,'3 %d %d %d\n',(varargin{5}-1)'); - case 'TETRAHEDRON' - ntetra = length(varargin{5}); - fprintf(fid,'\nPOLYGONS %d %d\n',ntetra,5*ntetra); - fprintf(fid,'4 %d %d %d %d\n',(varargin{5}-1)'); - end -end -fclose(fid); -if strcmpi(filename,'matlab_export.vtk') - switch computer - case {'PCWIN','PCWIN64'} - !paraview.exe --data='matlab_export.vtk' & - % Exclamation point character is a shell escape, the rest of the - % input line will be sent to operating system. It can not take - % variables, though. The & at the end of line will return control to - % Matlab even when the outside process is still running. - case {'GLNXA64','MACI64'} - !paraview --data='matlab_export.vtk' & - end -end -end - -function setdataformat(fid, binaryflag) - -if ~binaryflag - fprintf(fid, 'ASCII\n'); -else - fprintf(fid, 'BINARY\n'); -end -end - \ No newline at end of file From a4f9e36a5ea6e9d82c24b9dcdb274463c593a1f5 Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 3 Jul 2025 17:59:14 +0200 Subject: [PATCH 06/12] cudec_new --- cuDecomp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuDecomp b/cuDecomp index 1c0edde..d9ca6db 160000 --- a/cuDecomp +++ b/cuDecomp @@ -1 +1 @@ -Subproject commit 1c0edde7b66656ebb90580a2cd3cb0efa9f109bf +Subproject commit d9ca6db8aee8d75ab3dc36ccca847b24806f3e3b From 11d3a3db9d60d31a3f60292a2e795df9e8b58ec0 Mon Sep 17 00:00:00 2001 From: aroccon Date: Mon, 7 Jul 2025 13:33:52 +0200 Subject: [PATCH 07/12] fix --- README.md | 15 +++++++-------- multi/main.f90 | 18 ++++++------------ multi/readinput.f90 | 3 ++- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 4d6e9aa..fd72d46 100644 --- a/README.md +++ b/README.md @@ -60,14 +60,13 @@ If you use this code, please cite the following work: Performance (NS only) * 256 x 256 x 256 | 4 x A100@Leonardo | 16 ms/timestep -* 512 x 512 x 512 | 4 x A100@Leonardo | 270 ms/timestep -* 1024 x 1024 x 1024 | 512 x A100@Leonardo | 35 ms/timestep -* 2048 x 2048 x 2048 | 256 x A100@Leonardo | 740 ms/timestep -* 128 x 128 x 128 | 4 x H100@MN5-ACC | 7 ms/timestep -* 256 x 256 x 256 | 4 x H100@MN5-ACC | 40 ms/timestep -* 512 x 512 x 512 | 4 x H100@MN5-ACC | 450 ms/timestep -* 512 x 512 x 512 | 8 x H100@MN5-ACC | 172 ms/timestep -* 1024 x 1024 x 1024 | 512 x H100@MN5-ACC | 32 ms/timestep +* 512 x 512 x 512 | 4 x A100@Leonardo | 270 ms/timestep +* 1024 x 1024 x 1024 | 32 x A100@Leonardo | 357 ms/timestep +* 2048 x 2048 x 2048 | 128 x A100@Leonardo | 820 ms/timestep +* 256 x 256 x 256 | 4 x H100@MN5-ACC | 13 ms/timestep +* 512 x 512 x 512 | 4 x H100@MN5-ACC | 230 ms/timestep +* 1024 x 1024 x 1024 | 32 x H100@MN5-ACC | 320 ms/timestep + * 2048 x 2048 x 2048 | 512 x H100@MN5-ACC | 259 ms/timestep Phase-field introduces about 15% of overhead compared to NS only. diff --git a/multi/main.f90 b/multi/main.f90 index 4f15be0..fa6c78f 100644 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -190,7 +190,7 @@ program main allocate(phi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi_o(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(psidi(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(normx(piX%shape(1),piX%shape(2),piX%shape(3)),normy(piX%shape(1),piX%shape(2),piX%shape(3)),normz(piX%shape(1),piX%shape(2),piX%shape(3))) -allocate(chempot(piX%shape(1),piX%shape(2),piX%shape(3)),gradphix(piX%shape(1),piX%shape(2),piX%shape(3)),gradphiy(piX%shape(1),piX%shape(2),piX%shape(3)),gradphiz(piX%shape(1),piX%shape(2),piX%shape(3))) +allocate(chempot(piX%shape(1),piX%shape(2),piX%shape(3))) allocate(fxst(piX%shape(1),piX%shape(2),piX%shape(3)),fyst(piX%shape(1),piX%shape(2),piX%shape(3)),fzst(piX%shape(1),piX%shape(2),piX%shape(3))) ! surface tension forces #endif @@ -453,11 +453,7 @@ program main km=k-1 if (ip .gt. nx) ip=1 if (im .lt. 1) im=nx - ! OLD CDI - !rhsphi(i,j,k)=rhsphi(i,j,k)+gamma*(((phi(ip,j,k)**2d0-phi(ip,j,k))*normx(ip,j,k)-(phi(im,j,k)**2d0-phi(im,j,k))*normx(im,j,k))*0.5d0*dxi + & - ! ((phi(i,jp,k)**2d0-phi(i,jp,k))*normy(i,jp,k)-(phi(i,jm,k)**2d0-phi(i,jm,k))*normy(i,jm,k))*0.5d0*dxi + & - ! ((phi(i,j,kp)**2d0-phi(i,j,kp))*normz(i,j,kp)-(phi(i,j,km)**2d0-phi(i,j,km))*normz(i,j,km))*0.5d0*dxi) - ! NEW ACDI + ! ACDI rhsphi(i,j,k)=rhsphi(i,j,k)-gamma*((0.25d0*(1.d0-(tanh(0.5d0*psidi(ip,j,k)*epsi))**2)*normx(ip,j,k)- 0.25d0*(1.d0-(tanh(0.5d0*psidi(im,j,k)*epsi))**2)*normx(im,j,k))*0.5*dxi +& (0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jp,k)*epsi))**2)*normy(i,jp,k)- 0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jm,k)*epsi))**2)*normy(i,jm,k))*0.5*dxi +& (0.25d0*(1.d0-(tanh(0.5d0*psidi(i,j,kp)*epsi))**2)*normz(i,j,kp)- 0.25d0*(1.d0-(tanh(0.5d0*psidi(i,j,km)*epsi))**2)*normz(i,j,km))*0.5*dxi) @@ -472,6 +468,7 @@ program main do j=1+halo_ext, piX%shape(2)-halo_ext do i=1,nx phi(i,j,k) = phi(i,j,k) + dt*(alpha*rhsphi(i,j,k)-beta*rhsphi_o(i,j,k)) + rhsphi_o(i,j,k)=rhsphi(i,j,k) enddo enddo enddo @@ -610,12 +607,9 @@ program main if (ip .gt. nx) ip=1 if (im .lt. 1) im=nx chempot(i,j,k)=phi(i,j,k)*(1.d0-phi(i,j,k))*(1.d0-2.d0*phi(i,j,k))*epsi-eps*(phi(ip,j,k)+phi(im,j,k)+phi(i,jp,k)+phi(i,jm,k)+phi(i,j,kp)+phi(i,j,km)- 6.d0*phi(i,j,k))*ddxi - gradphix(i,j,k)=0.5d0*(phi(ip,j,k)-phi(im,j,k))*dxi - gradphiy(i,j,k)=0.5d0*(phi(i,jp,k)-phi(i,jm,k))*dxi - gradphiz(i,j,k)=0.5d0*(phi(i,j,kp)-phi(i,j,km))*dxi - fxst(i,j,k)=6.d0*sigma*chempot(i,j,k)*gradphix(i,j,k) - fyst(i,j,k)=6.d0*sigma*chempot(i,j,k)*gradphiy(i,j,k) - fzst(i,j,k)=6.d0*sigma*chempot(i,j,k)*gradphiz(i,j,k) + fxst(i,j,k)=6.d0*sigma*chempot(i,j,k)*0.5d0*(phi(ip,j,k)-phi(im,j,k))*dxi + fyst(i,j,k)=6.d0*sigma*chempot(i,j,k)*0.5d0*(phi(i,jp,k)-phi(i,jm,k))*dxi + fzst(i,j,k)=6.d0*sigma*chempot(i,j,k)*0.5d0*(phi(i,jp,k)-phi(i,jm,k))*dxi enddo enddo enddo diff --git a/multi/readinput.f90 b/multi/readinput.f90 index 479c7b7..8185506 100644 --- a/multi/readinput.f90 +++ b/multi/readinput.f90 @@ -34,7 +34,7 @@ subroutine readinput ! compute pre-defined constant twopi=8.0_8*atan(1.0_8) lx=twopi -dx = lx/(nx-1) +dx = lx/nx dxi=1.d0/dx ddxi=1.d0/dx/dx rhoi=1.d0/rho @@ -51,6 +51,7 @@ subroutine readinput write(*,*) "██ ██ ██ ██ ██ ██ ██ ██ ██ ██" write(*,*) "██ ██ ██ ██ ██ ██ ██████ ██████" write(*,*) "----------------------------------------------" + write(*,*) 'Grid:', nx, 'x', nx, 'x', nx write(*,*) "Restart ", restart write(*,*) "Tstart ", tstart write(*,*) "Tfin ", tfin From 4c3c1b789c0e557f2d5e7e862ffb385a03e13c6b Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 10 Jul 2025 16:46:09 +0200 Subject: [PATCH 08/12] ok --- cuDecomp | 2 +- multi/main.f90 | 40 +++++++++++++++++++--------------------- multi/module.f90 | 3 +-- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/cuDecomp b/cuDecomp index d9ca6db..ada368c 160000 --- a/cuDecomp +++ b/cuDecomp @@ -1 +1 @@ -Subproject commit d9ca6db8aee8d75ab3dc36ccca847b24806f3e3b +Subproject commit ada368ca7212b4cac3bd85d94358c34449379a99 diff --git a/multi/main.f90 b/multi/main.f90 index fa6c78f..b27024f 100644 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -181,7 +181,6 @@ program main !allocate variables !NS variables allocate(u(piX%shape(1),piX%shape(2),piX%shape(3)),v(piX%shape(1),piX%shape(2),piX%shape(3)),w(piX%shape(1),piX%shape(2),piX%shape(3))) !velocity vector -allocate(ustar(piX%shape(1),piX%shape(2),piX%shape(3)),vstar(piX%shape(1),piX%shape(2),piX%shape(3)),wstar(piX%shape(1),piX%shape(2),piX%shape(3))) ! provisional velocity field allocate(rhsu(piX%shape(1),piX%shape(2),piX%shape(3)),rhsv(piX%shape(1),piX%shape(2),piX%shape(3)),rhsw(piX%shape(1),piX%shape(2),piX%shape(3))) ! right hand side u,v,w allocate(rhsu_o(piX%shape(1),piX%shape(2),piX%shape(3)),rhsv_o(piX%shape(1),piX%shape(2),piX%shape(3)),rhsw_o(piX%shape(1),piX%shape(2),piX%shape(3))) ! right hand side u,v,w allocate(div(piX%shape(1),piX%shape(2),piX%shape(3))) @@ -652,9 +651,12 @@ program main do k=1+halo_ext, piX%shape(3)-halo_ext do j=1+halo_ext, piX%shape(2)-halo_ext do i=1,nx - ustar(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) - vstar(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) - wstar(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) + u(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) + v(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) + w(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) + rhsu_o(i,j,k)=rhsu(i,j,k) + rhsv_o(i,j,k)=rhsv(i,j,k) + rhsw_o(i,j,k)=rhsw(i,j,k) enddo enddo enddo @@ -664,24 +666,20 @@ program main ! After first step move to AB2 alpha=1.5d0 beta= 0.5d0 - !$acc kernels - rhsu_o=rhsu - rhsv_o=rhsv - rhsw_o=rhsw - !$acc end kernels + ! 5.3 update halos (y and z directions), required to then compute the RHS of Poisson equation because of staggered grid !$acc host_data use_device(ustar) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, ustar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, ustar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, u, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, u, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data !$acc host_data use_device(vstar) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, vstar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, vstar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, v, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, v, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data !$acc host_data use_device(wstar) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, wstar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, wstar, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data !######################################################################################################################################## ! END STEP 5: USTAR COMPUTATION @@ -709,9 +707,9 @@ program main jp=j+1 kp=k+1 if (ip > nx) ip=1 - rhsp(i,j,k) = (rho*dxi/dt)*(ustar(ip,j,k)-ustar(i,j,k)) - rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(vstar(i,jp,k)-vstar(i,j,k)) - rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(wstar(i,j,kp)-wstar(i,j,k)) + rhsp(i,j,k) = (rho*dxi/dt)*(u(ip,j,k)-u(i,j,k)) + rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(v(i,jp,k)-v(i,j,k)) + rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(w(i,j,kp)-w(i,j,k)) enddo enddo enddo @@ -869,9 +867,9 @@ program main jm=j-1 km=k-1 if (im < 1) im=nx - u(i,j,k)=ustar(i,j,k) - dt/rho*(p(i,j,k)-p(im,j,k))*dxi - v(i,j,k)=vstar(i,j,k) - dt/rho*(p(i,j,k)-p(i,jm,k))*dxi - w(i,j,k)=wstar(i,j,k) - dt/rho*(p(i,j,k)-p(i,j,km))*dxi + u(i,j,k)=u(i,j,k) - dt/rho*(p(i,j,k)-p(im,j,k))*dxi + v(i,j,k)=v(i,j,k) - dt/rho*(p(i,j,k)-p(i,jm,k))*dxi + w(i,j,k)=w(i,j,k) - dt/rho*(p(i,j,k)-p(i,j,km))*dxi enddo enddo enddo diff --git a/multi/module.f90 b/multi/module.f90 index 5e0c636..247f9b8 100644 --- a/multi/module.f90 +++ b/multi/module.f90 @@ -38,7 +38,6 @@ end module cudecompvar module velocity double precision, allocatable :: u(:,:,:), v(:,:,:), w(:,:,:) - double precision, allocatable :: ustar(:,:,:), vstar(:,:,:), wstar(:,:,:) double precision, allocatable :: rhsu(:,:,:), rhsv(:,:,:), rhsw(:,:,:) double precision, allocatable :: rhsu_o(:,:,:), rhsv_o(:,:,:), rhsw_o(:,:,:) complex(8), allocatable :: rhsp_complex(:,:,:) @@ -53,7 +52,7 @@ end module velocity module phase double precision, allocatable :: phi(:,:,:), rhsphi(:,:,:), psidi(:,:,:), rhsphi_o(:,:,:) double precision, allocatable :: normx(:,:,:), normy(:,:,:), normz(:,:,:) - double precision, allocatable :: chempot(:,:,:), gradphix(:,:,:), gradphiy(:,:,:), gradphiz(:,:,:) + double precision, allocatable :: chempot(:,:,:) double precision, allocatable :: fxst(:,:,:), fyst(:,:,:), fzst(:,:,:) end module phase From 3977e4cc1e5d1dfda42dd6618d4d9218d7a2136c Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 10 Jul 2025 17:25:54 +0200 Subject: [PATCH 09/12] minor --- cuDecomp | 2 +- make_lib_leo.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cuDecomp b/cuDecomp index ada368c..04d87fd 160000 --- a/cuDecomp +++ b/cuDecomp @@ -1 +1 @@ -Subproject commit ada368ca7212b4cac3bd85d94358c34449379a99 +Subproject commit 04d87fd2f6cd0a794eb46292a64408c4f9a87f5e diff --git a/make_lib_leo.sh b/make_lib_leo.sh index 5bd6806..2fd711c 100644 --- a/make_lib_leo.sh +++ b/make_lib_leo.sh @@ -5,4 +5,6 @@ cd build module load nvhpc/24.3 module load openmpi/4.1.6--nvhpc--24.3 cmake .. +#enable nvshmem +#cmake -DCUDECOMP_BUILD_EXTRAS=1 -DCUDECOMP_ENABLE_NVSHMEM=1 .. make -j From 78235f8ca8d4552dff9b9dd55e4a1d82e5732994 Mon Sep 17 00:00:00 2001 From: aroccon Date: Thu, 10 Jul 2025 17:28:56 +0200 Subject: [PATCH 10/12] pre-r --- multi/main.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/multi/main.f90 b/multi/main.f90 index b27024f..8aa4a40 100644 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -669,15 +669,15 @@ program main ! 5.3 update halos (y and z directions), required to then compute the RHS of Poisson equation because of staggered grid - !$acc host_data use_device(ustar) + !$acc host_data use_device(u) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, u, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, u, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data - !$acc host_data use_device(vstar) + !$acc host_data use_device(v) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, v, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, v, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data - !$acc host_data use_device(wstar) + !$acc host_data use_device(w) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data From d885fc42aa14751e92232a2aa2292da7870e2608 Mon Sep 17 00:00:00 2001 From: aroccon Date: Mon, 4 Aug 2025 16:46:13 +0200 Subject: [PATCH 11/12] paper_accepted --- README.md | 7 +++---- cuDecomp | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fd72d46..eb54374 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MHIT36 -Code for direct numerical simulation of Navier-Stokes equation coupled with a phase-field method (ACDI) for interface description. +Code for direct numerical simulation of Navier-Stokes equations coupled with a phase-field method (ACDI) for interface description. ~~~text ███ ███ ██ ██ ██ ████████ ██████ ██████ @@ -17,7 +17,7 @@ If you use this code, please cite the following work: @article{roccon2025, title = {MHIT36: A Phase-Field Code for Gpu Simulations of Multiphase Homogeneous Isotropic Turbulence}, author = {Roccon, A. and Enzenberger, L. and Zaza, D. and Soldati, A.}, - journal = {SSRN}, + journal = {Computer Physics Communications (in press)}, year = {2025}, doi = {http://dx.doi.org/10.2139/ssrn.5264052} } @@ -66,7 +66,6 @@ Performance (NS only) * 256 x 256 x 256 | 4 x H100@MN5-ACC | 13 ms/timestep * 512 x 512 x 512 | 4 x H100@MN5-ACC | 230 ms/timestep * 1024 x 1024 x 1024 | 32 x H100@MN5-ACC | 320 ms/timestep - * 2048 x 2048 x 2048 | 512 x H100@MN5-ACC | 259 ms/timestep Phase-field introduces about 15% of overhead compared to NS only. @@ -76,7 +75,7 @@ Phase-field introduces about 15% of overhead compared to NS only. Strong scaling results obtained on Leonardo (4 x A100 64 GB x node) and MN5 (4 x H100 40 GB x node) * Tested from 1 node up to 128 nodes (Leonardo) * Tested from 1 node up to 256 nodes (MN5-ACC) -* Grid from 64 x 64 x 64 up to 2048 x 2048 x 2048 +* Grid from 64 x 64 x 64 up to 4096 x 4096 x 4096 * Very similar scaling for both NS and NS+ACDI ![Scal](val/scaling.png) diff --git a/cuDecomp b/cuDecomp index 04d87fd..7968153 160000 --- a/cuDecomp +++ b/cuDecomp @@ -1 +1 @@ -Subproject commit 04d87fd2f6cd0a794eb46292a64408c4f9a87f5e +Subproject commit 796815382081da97054602aed68baae88b658ee9 From 6f50c846ba06b1196809a2db1a26829823cf7675 Mon Sep 17 00:00:00 2001 From: DiegoPerissutti Date: Thu, 7 Aug 2025 19:32:57 +0200 Subject: [PATCH 12/12] cleanup --- multi/PoissonExampleD2Z.f90 | 339 --------------- multi/go_leo.sh | 5 +- multi/go_leo_prof.sh | 2 - multi/main.f90 | 792 +++++++++++++++++------------------- multi/testpush.sh | 2 - 5 files changed, 371 insertions(+), 769 deletions(-) delete mode 100755 multi/PoissonExampleD2Z.f90 delete mode 100644 multi/testpush.sh diff --git a/multi/PoissonExampleD2Z.f90 b/multi/PoissonExampleD2Z.f90 deleted file mode 100755 index a8b4820..0000000 --- a/multi/PoissonExampleD2Z.f90 +++ /dev/null @@ -1,339 +0,0 @@ -!Optimized verison compared to the stanard one as it use D2Z in the first step -! This avoid transpostions with nx x ny x nz complex and instead use nx/2+1 x ny x nz - - -#define CHECK_CUDECOMP_EXIT(f) if (f /= CUDECOMP_RESULT_SUCCESS) call exit(1) -!#define CHECK_CUDECOMP_EXIT(f) if (f /= CUDECOMP_RESULT_SUCCESS) exit(1) - -! Solves poisson equation -! -! u_xx + u_yy + u_zz= phi(x,y,z) -! -! where -! -! phi(x,y,z) = sin(Mx*x)*sin(My*y)*sin(Mz*z) -! -! on domain 0 <= x <= 2*pi, 0 <= y <= 2*pi, 0 <= z <= 2*pi - -program main - use cudafor - use cudecomp - use cufft - use mpi - - implicit none - - ! Command line arguments - ! grid dimensions - integer :: nx, ny, nz - integer :: comm_backend - integer :: pr, pc - - ! grid size - real(8), parameter :: Lx = 1.0, Ly = 1.0, Lz = 1.0 - ! modes for phi - integer, parameter :: Mx = 1, My = 2, Mz = 1 - real(8), parameter :: twopi = 8.0_8*atan(1.0_8) - real(8) :: err, maxErr = -1.0, times, timef - character(len=40) :: namefile - - - ! grid - real(8), allocatable :: x(:) - real(8) :: hx, hy, hz - ! wavenumbers - real(8), allocatable :: kx(:) - real(8), device, allocatable :: kx_d(:) - - real(8), allocatable :: phi(:), ua(:,:,:), rhsp(:,:,:), p(:,:,:) - !complex(8), allocatable :: rhspc(:,:,:) - complex(8), device, allocatable :: phi_d(:) - complex(8), pointer, device, contiguous :: work_d(:) - - ! MPI - integer :: rank, ranks, ierr - integer :: localRank, localComm - - ! cudecomp - type(cudecompHandle) :: handle - type(cudecompGridDesc) :: grid_desc - type(cudecompGridDescConfig) :: config - type(cudecompGridDescAutotuneOptions) :: options - - integer :: pdims(2) - integer :: gdims(3) - integer :: npx, npy, npz - type(cudecompPencilInfo) :: piX, piY, piZ - integer(8) :: nElemX, nElemY, nElemZ, nElemWork - - ! CUFFT - integer :: planX, planY, planZ, planXF, planXB - integer :: batchsize - integer :: status - - logical :: skip_next - character(len=16) :: arg - integer :: i, j ,k , jl, kl, jg, kg - - - ! MPI initialization - - call mpi_init(ierr) - if (ierr /= MPI_SUCCESS) write(*,*) 'mpi_init failed: ', ierr - call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr) - if (ierr /= MPI_SUCCESS) write(*,*) 'mpi_comm_rank failed: ', ierr - call mpi_comm_size(MPI_COMM_WORLD, ranks, ierr) - if (ierr /= MPI_SUCCESS) write(*,*) 'mpi_comm_size failed: ', ierr - - call mpi_comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, localComm, ierr) - if (ierr /= MPI_SUCCESS) write(*,*) 'mpi_comm_split_type failed: ', ierr - call mpi_comm_rank(localComm, localRank, ierr) - if (ierr /= MPI_SUCCESS) write(*,*) 'mpi_comm_rank on local rank failed: ', ierr - ierr = cudaSetDevice(localRank) - - ! Parse command-line arguments - nx = 64 - ny = nx - nz = nx - pr = 2 - pc = 1 - comm_backend = CUDECOMP_TRANSPOSE_COMM_MPI_P2P - - - ! cudecomp initialization - - CHECK_CUDECOMP_EXIT(cudecompInit(handle, MPI_COMM_WORLD)) - - CHECK_CUDECOMP_EXIT(cudecompGridDescConfigSetDefaults(config)) - pdims = [pr, pc] - config%pdims = pdims - gdims = [ nx/2+1, ny, nz] - config%gdims = gdims - config%transpose_comm_backend = comm_backend - config%transpose_axis_contiguous = .true. - - CHECK_CUDECOMP_EXIT(cudecompGridDescAutotuneOptionsSetDefaults(options)) - options%dtype = CUDECOMP_DOUBLE_COMPLEX - if (comm_backend == 0) then - options%autotune_transpose_backend = .true. - endif - - CHECK_CUDECOMP_EXIT(cudecompGridDescCreate(handle, grid_desc, config, options)) - - if (rank == 0) then - write(*,"('Running on ', i0, ' x ', i0, ' process grid ...')") config%pdims(1), config%pdims(2) - write(*,"('Using ', a, ' backend ...')") cudecompTransposeCommBackendToString(config%transpose_comm_backend) - end if - - ! get pencil info - CHECK_CUDECOMP_EXIT(cudecompGetPencilInfo(handle, grid_desc, piX, 1)) - nElemX = piX%size - CHECK_CUDECOMP_EXIT(cudecompGetPencilInfo(handle, grid_desc, piY, 2)) - nElemY = piY%size - CHECK_CUDECOMP_EXIT(cudecompGetPencilInfo(handle, grid_desc, piZ, 3)) - nElemZ = piZ%size - - ! get workspace size - CHECK_CUDECOMP_EXIT(cudecompGetTransposeWorkspaceSize(handle, grid_desc, nElemWork)) - - ! CUFFT initialization - - batchSize = piX%shape(2)*piX%shape(3) - status = cufftPlan1D(planX, nx, CUFFT_Z2Z, batchSize) - if (status /= CUFFT_SUCCESS) write(*,*) rank, ': Error in creating X plan' - - batchSize = piX%shape(2)*piX%shape(3) - status = cufftPlan1D(planXF, nx, CUFFT_D2Z, batchSize) - if (status /= CUFFT_SUCCESS) write(*,*) rank, ': Error in creating X-forward plan' - - batchSize = piX%shape(2)*piX%shape(3) - status = cufftPlan1D(planXB, nx, CUFFT_Z2D, batchSize) - if (status /= CUFFT_SUCCESS) write(*,*) rank, ': Error in creating X-backward plan' - - batchSize = piY%shape(2)*piY%shape(3) - status = cufftPlan1D(planY, ny, CUFFT_Z2Z, batchSize) - if (status /= CUFFT_SUCCESS) write(*,*) rank, ': Error in creating Y plan' - - batchSize = piZ%shape(2)*piZ%shape(3) - status = cufftPlan1D(planZ, nz, CUFFT_Z2Z, batchSize) - if (status /= CUFFT_SUCCESS) write(*,*) rank, ': Error in creating Z plan' - - - ! Physical grid - - allocate(x(nx)) - - hx = twopi/nx - do i = 1, nx - x(i) = hx*i - enddo - ! Wavenumbers - - allocate(kx(nx)) - - do i = 1, nx/2 - kx(i) = (i-1) - enddo - do i = nx/2+1, nx - kx(i) = (i-1-nx) - enddo - allocate(kx_d, source=kx) - - ! allocate arrays - - allocate(phi(max(nElemX, nElemY, nElemZ))) - allocate(phi_d, mold=phi) - allocate(ua(nx, piX%shape(2), piX%shape(3))) - allocate(rhsp(nx, piX%shape(2), piX%shape(3))) - !allocate(rhspc(nx, piX%shape(2), piX%shape(3))) - allocate(p(nx, piX%shape(2), piX%shape(3))) - - - CHECK_CUDECOMP_EXIT(cudecompMalloc(handle, grid_desc, work_d, nElemWork)) - - !initialize rigth hand side + analytic solution - do kl = 1, piX%shape(3) - kg = piX%lo(3) + kl - 1 - do jl = 1, piX%shape(2) - jg = piX%lo(2) + jl - 1 - do i = 1, nx - rhsp(i,jl,kl) = sin(Mx*x(i))*sin(My*x(jg))*sin(Mz*x(kg)) - !rhspc(i,jl,kl) = cmplx(rhsp(i,jl,kl),0.d0) - ua(i,jl,kl) = -rhsp(i,jl,kl)/(Mx**2 + My**2 + Mz**2) - enddo - enddo - enddo - - write(namefile,'(a,i3.3,a)') 'rhsp_',rank,'.dat' - open(unit=55,file=namefile,form='unformatted',position='append',access='stream',status='new') - write(55) rhsp - close(55) - - call cpu_time(times) - - ! phi(x,y,z) -> phi(kx,y,z) - !$acc host_data use_device(rhsp) - status = cufftExecD2Z(planXF, rhsp, phi_d) - if (status /= CUFFT_SUCCESS) write(*,*) 'X forward error: ', status - !$acc end host_data - ! phi(kx,y,z) -> phi(y,z,kx) - CHECK_CUDECOMP_EXIT(cudecompTransposeXToY(handle, grid_desc, phi_d, phi_d, work_d, CUDECOMP_DOUBLE_COMPLEX)) - ! phi(y,z,kx) -> phi(ky,z,kx) - status = cufftExecZ2Z(planY, phi_d, phi_d, CUFFT_FORWARD) - if (status /= CUFFT_SUCCESS) write(*,*) 'Y forward error: ', status - ! phi(ky,z,kx) -> phi(z,kx,ky) - CHECK_CUDECOMP_EXIT(cudecompTransposeYToZ(handle, grid_desc, phi_d, phi_d, work_d, CUDECOMP_DOUBLE_COMPLEX)) - ! phi(z,kx,ky) -> phi(kz,kx,ky) - status = cufftExecZ2Z(planZ, phi_d, phi_d, CUFFT_FORWARD) - if (status /= CUFFT_SUCCESS) write(*,*) 'Z forward error: ', status - - - block - complex(8), device, pointer :: phi3d(:,:,:) - real(8) :: k2 - integer :: il, jl, ig, jg - integer :: offsets(3), xoff, yoff - integer :: np(3) - np(piZ%order(1)) = piZ%shape(1) - np(piZ%order(2)) = piZ%shape(2) - np(piZ%order(3)) = piZ%shape(3) - call c_f_pointer(c_devloc(phi_d), phi3d, piZ%shape) - - - ! divide by -K**2, and normalize - - offsets(piZ%order(1)) = piZ%lo(1) - 1 - offsets(piZ%order(2)) = piZ%lo(2) - 1 - offsets(piZ%order(3)) = piZ%lo(3) - 1 - - xoff = offsets(1) - yoff = offsets(2) - npx = np(1) - npy = np(2) - !$cuf kernel do (2) - do jl = 1, npy - do il = 1, npx - jg = yoff + jl - ig = xoff + il - do k = 1, nz - k2 = kx_d(ig)**2 + kx_d(jg)**2 + kx_d(k)**2 - !phi3d(k,il,jl) = phi3d(k,il,jl)/(int(nx,8)*int(ny,8)*int(nz,8)) - phi3d(k,il,jl) = -phi3d(k,il,jl)/k2/(int(nx,8)*int(ny,8)*int(nz,8)) - enddo - enddo - enddo - - ! specify mean (corrects division by zero wavenumber above) - if (xoff == 0 .and. yoff == 0) phi3d(1,1,1) = 0.0 - - end block - - - ! phi(kz,kx,ky) -> phi(z,kx,ky) - status = cufftExecZ2Z(planZ, phi_d, phi_d, CUFFT_INVERSE) - if (status /= CUFFT_SUCCESS) write(*,*) 'Z inverse error: ', status - ! phi(z,kx,ky) -> phi(ky,z,kx) - CHECK_CUDECOMP_EXIT(cudecompTransposeZToY(handle, grid_desc, phi_d, phi_d, work_d, CUDECOMP_DOUBLE_COMPLEX)) - ! phi(ky,z,kx) -> phi(y,z,kx) - status = cufftExecZ2Z(planY, phi_d, phi_d, CUFFT_INVERSE) - if (status /= CUFFT_SUCCESS) write(*,*) 'Y inverse error: ', status - ! phi(y,z,kx) -> phi(kx,y,z) - CHECK_CUDECOMP_EXIT(cudecompTransposeYToX(handle, grid_desc, phi_d, phi_d, work_d, CUDECOMP_DOUBLE_COMPLEX)) - ! phi(kx,y,z) -> phi(x,y,z) - !$acc host_data use_device(p) - status = cufftExecZ2D(planXB, phi_d, p) - if (status /= CUFFT_SUCCESS) write(*,*) 'X inverse error: ', status - !$acc end host_data - - err=0.d0 - maxErr=-1.d0 - !$acc kernels - do kl = 1, piX%shape(3) - do jl = 1, piX%shape(2) - do i = 1, nx - err = abs(ua(i,jl,kl)-p(i,jl,kl)) - !rhsp(i,jl,kl)=real(rhspc(i,jl,kl)) - if (err > maxErr) maxErr = err - enddo - enddo - enddo - !$acc end kernels - - write(namefile,'(a,i3.3,a)') 'rhspo_',rank,'.dat' - open(unit=55,file=namefile,form='unformatted',position='append',access='stream',status='new') - write(55) p - close(55) - - write(namefile,'(a,i3.3,a)') 'ua_',rank,'.dat' - open(unit=55,file=namefile,form='unformatted',position='append',access='stream',status='new') - write(55) ua - close(55) - - - write(*,"('[', i0, '] Max Error: ', e12.6)") rank, maxErr - - ! cleanup - - !status = cufftDestroy(planX) - !if (status /= CUFFT_SUCCESS) write(*,*) 'X plan destroy: ', status - status = cufftDestroy(planXF) - if (status /= CUFFT_SUCCESS) write(*,*) 'XF plan destroy: ', status - status = cufftDestroy(planXB) - if (status /= CUFFT_SUCCESS) write(*,*) 'XB plan destroy: ', status - status = cufftDestroy(planY) - if (status /= CUFFT_SUCCESS) write(*,*) 'Y plan destroy: ', status - status = cufftDestroy(planZ) - if (status /= CUFFT_SUCCESS) write(*,*) 'Z plan destroy: ', status - - deallocate(x) - deallocate(kx) - deallocate(kx_d) - deallocate(phi, phi_d, ua) - - CHECK_CUDECOMP_EXIT(cudecompFree(handle, grid_desc, work_d)) - CHECK_CUDECOMP_EXIT(cudecompGridDescDestroy(handle, grid_desc)) - CHECK_CUDECOMP_EXIT(cudecompFinalize(handle)) - - call mpi_finalize(ierr) - -end program main \ No newline at end of file diff --git a/multi/go_leo.sh b/multi/go_leo.sh index 2be0e05..3bb0e99 100644 --- a/multi/go_leo.sh +++ b/multi/go_leo.sh @@ -25,7 +25,4 @@ echo "Using directory: $ROOT_DIR" export LD_LIBRARY_PATH=$ROOT_DIR:$LD_LIBRARY_PATH chmod 777 binder.sh -mpirun -np 4 --map-by node:PE=8 --rank-by core ./binder.sh ./mhit36 - -# mpirun -n 4 nsys profile --trace=cuda,nvtx,mpi -o profile_output_%q{SLURM_PROCID} --stats=true ./mhit36 - +mpirun -np 4 --map-by node:PE=8 --rank-by core ./binder.sh ./mhit36 \ No newline at end of file diff --git a/multi/go_leo_prof.sh b/multi/go_leo_prof.sh index 6368296..ebcb52e 100755 --- a/multi/go_leo_prof.sh +++ b/multi/go_leo_prof.sh @@ -49,5 +49,3 @@ mpirun -np 4 --map-by node:PE=8 --rank-by core nsys profile -t cuda,nvtx,mpi,op # for nsight compute report - all kernels + mapping + nic # mpirun -np 4 --map-by node:PE=8 --rank-by core ncu --kernel-name regex:main_ --set=full --import-source=yes --launch-skip 70 --launch-count 18 -o reportall.%p ./binder.sh ./mhit36 - - diff --git a/multi/main.f90 b/multi/main.f90 index c6cfbdf..7b8b1ad 100755 --- a/multi/main.f90 +++ b/multi/main.f90 @@ -136,15 +136,14 @@ program main options%halo_axis = 1 CHECK_CUDECOMP_EXIT(cudecompGridDescCreate(handle, grid_desc, config, options)) -! Print information on configuration -!if (rank == 0) then -! write(*,"(' Running on ', i0, ' x ', i0, ' process grid ...')") config%pdims(1), config%pdims(2) -! write(*,"(' Using ', a, ' transpose backend ...')") & -! cudecompTransposeCommBackendToString(config%transpose_comm_backend) -! write(*,"(' Using ', a, ' halo backend ...')") & -! cudecompHaloCommBackendToString(config%halo_comm_backend) -!endif - +Print information on configuration +if (rank == 0) then + write(*,"(' Running on ', i0, ' x ', i0, ' process grid ...')") config%pdims(1), config%pdims(2) + write(*,"(' Using ', a, ' transpose backend ...')") & + cudecompTransposeCommBackendToString(config%transpose_comm_backend) + write(*,"(' Using ', a, ' halo backend ...')") & + cudecompHaloCommBackendToString(config%halo_comm_backend) +endif ! Get pencil info for the grid descriptor in the physical space ! This function returns a pencil struct (piX, piY or piZ) that contains the shape, global lower and upper index bounds (lo and hi), @@ -166,16 +165,6 @@ program main CHECK_CUDECOMP_EXIT(cudecompGetTransposeWorkspaceSize(handle, grid_desc, nElemWork)) CHECK_CUDECOMP_EXIT(cudecompGetHaloWorkspaceSize(handle, grid_desc, 1, halo, nElemWork_halo)) - - - - - -! Get pencil info for the grid descriptor in the complex space -!gdims = [nx/2+1, ny, nz] -!config%gdims = gdims -!CHECK_CUDECOMP_EXIT(cudecompGridDescCreate(handle, grid_descD2Z, config, options)) - CHECK_CUDECOMP_EXIT(cudecompGetPencilInfo(handle, grid_descD2Z, piX_d2z, 1,halo)) nElemX_d2z = piX_d2z%size !<- number of total elments in x-configuratiion (include halo) ! Pencil info in Y-configuration present in PiY @@ -190,9 +179,6 @@ program main - - - ! CUFFT initialization -- Create Plans ! Forward 1D FFT in X: D2Z batchSize = piX_d2z%shape(2)*piX_d2z%shape(3) !<- number of FFT (from x-pencil dimension) @@ -238,18 +224,17 @@ program main ! compute here the cos to avoid multiple computations of cos mycos(i)=cos(k0*x(i)+dx/2) enddo + !######################################################################################################################################## ! 1. INITIALIZATION AND cuDECOMP AUTOTUNING : END !######################################################################################################################################## - - - !######################################################################################################################################## ! START STEP 2: ALLOCATE ARRAYS !######################################################################################################################################## + ! allocate arrays allocate(psi(max(nElemX, nElemY, nElemZ))) !largest among the pencil allocate(psi_real(max(nElemX, nElemY, nElemZ))) !largest among the pencil @@ -269,11 +254,11 @@ program main allocate(div(piX%shape(1),piX%shape(2),piX%shape(3))) !PFM variables #if phiflag == 1 -allocate(phi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi_o(piX%shape(1),piX%shape(2),piX%shape(3))) -allocate(psidi(piX%shape(1),piX%shape(2),piX%shape(3))) -allocate(tanh_psi(piX%shape(1),piX%shape(2),piX%shape(3))) -allocate(normx(piX%shape(1),piX%shape(2),piX%shape(3)),normy(piX%shape(1),piX%shape(2),piX%shape(3)),normz(piX%shape(1),piX%shape(2),piX%shape(3))) -allocate(fxst(piX%shape(1),piX%shape(2),piX%shape(3)),fyst(piX%shape(1),piX%shape(2),piX%shape(3)),fzst(piX%shape(1),piX%shape(2),piX%shape(3))) ! surface tension forces + allocate(phi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi(piX%shape(1),piX%shape(2),piX%shape(3)),rhsphi_o(piX%shape(1),piX%shape(2),piX%shape(3))) + allocate(psidi(piX%shape(1),piX%shape(2),piX%shape(3))) + allocate(tanh_psi(piX%shape(1),piX%shape(2),piX%shape(3))) + allocate(normx(piX%shape(1),piX%shape(2),piX%shape(3)),normy(piX%shape(1),piX%shape(2),piX%shape(3)),normz(piX%shape(1),piX%shape(2),piX%shape(3))) + allocate(fxst(piX%shape(1),piX%shape(2),piX%shape(3)),fyst(piX%shape(1),piX%shape(2),piX%shape(3)),fzst(piX%shape(1),piX%shape(2),piX%shape(3))) ! surface tension forces #endif ! allocate arrays for transpositions and halo exchanges @@ -288,18 +273,13 @@ program main - - - - - !######################################################################################################################################## ! START STEP 3: FLOW AND PHASE FIELD INIT !######################################################################################################################################## ! 3.1 Read/initialize from data without halo grid points (avoid out-of-bound if reading usin MPI I/O) ! 3.2 Call halo exchnages along Y and Z for u,v,w and phi if (restart .eq. 0) then !fresh start Taylor Green or read from file in init folder -if (rank.eq.0) write(*,*) "Initialize velocity field (fresh start)" + if (rank.eq.0) write(*,*) "Initialize velocity field (fresh start)" if (inflow .eq. 0) then if (rank.eq.0) write(*,*) "Initialize Taylor-green" do k = 1+halo_ext, piX%shape(3)-halo_ext @@ -315,12 +295,12 @@ program main enddo endif if (inflow .eq. 1) then - if (rank.eq.0) write(*,*) "Initialize from data" - call readfield(1) - call readfield(2) - call readfield(3) - endif + if (rank.eq.0) write(*,*) "Initialize from data" + call readfield(1) + call readfield(2) + call readfield(3) endif +endif if (restart .eq. 1) then !restart, ignore inflow and read the tstart field if (rank.eq.0) write(*,*) "Initialize velocity field (from output folder), iteration:", tstart call readfield_restart(tstart,1) @@ -344,35 +324,35 @@ program main ! initialize phase-field #if phiflag == 1 -if (restart .eq. 0) then -if (rank.eq.0) write(*,*) 'Initialize phase field (fresh start)' - if (inphi .eq. 0) then - if (rank.eq.0) write(*,*) 'Spherical drop' - do k = 1+halo_ext, piX%shape(3)-halo_ext - kg = piX%lo(3) + k - 1 - do j = 1+halo_ext, piX%shape(2)-halo_ext - jg = piX%lo(2) + j - 1 - do i = 1, piX%shape(1) - pos=(x(i)-lx/2)**2d0 + (x(jg)-lx/2)**2d0 + (x(kg)-lx/2)**2d0 - phi(i,j,k) = 0.5d0*(1.d0-tanh((sqrt(pos)-radius)/2/eps)) + if (restart .eq. 0) then + if (rank.eq.0) write(*,*) 'Initialize phase field (fresh start)' + if (inphi .eq. 0) then + if (rank.eq.0) write(*,*) 'Spherical drop' + do k = 1+halo_ext, piX%shape(3)-halo_ext + kg = piX%lo(3) + k - 1 + do j = 1+halo_ext, piX%shape(2)-halo_ext + jg = piX%lo(2) + j - 1 + do i = 1, piX%shape(1) + pos=(x(i)-lx/2)**2d0 + (x(jg)-lx/2)**2d0 + (x(kg)-lx/2)**2d0 + phi(i,j,k) = 0.5d0*(1.d0-tanh((sqrt(pos)-radius)/2/eps)) + enddo enddo - enddo - enddo + enddo + endif + if (inphi .eq. 1) then + if (rank.eq.0) write(*,*) "Initialize phase-field from data" + call readfield(5) + endif endif - if (inphi .eq. 1) then - if (rank.eq.0) write(*,*) "Initialize phase-field from data" - call readfield(5) + if (restart .eq. 1) then + write(*,*) "Initialize phase-field (restart, from output folder), iteration:", tstart + call readfield_restart(tstart,5) endif -endif -if (restart .eq. 1) then - write(*,*) "Initialize phase-field (restart, from output folder), iteration:", tstart - call readfield_restart(tstart,5) -endif -! update halo -!$acc host_data use_device(phi) -CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) -CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) -!$acc end host_data + ! update halo + !$acc host_data use_device(phi) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data #endif !Save initial fields (only if a fresh start) @@ -383,22 +363,20 @@ program main call writefield(tstart,3) call writefield(tstart,4) #if phiflag == 1 - call writefield(tstart,5) + call writefield(tstart,5) #endif endif + !######################################################################################################################################## ! END STEP 3: FLOW AND PHASE FIELD INIT !######################################################################################################################################## - - - - -! ######################################################################################################################################## +!######################################################################################################################################## ! START TEMPORAL LOOP: STEP 4 to 9 REPEATED AT EVERY TIME STEP -! ######################################################################################################################################## +!######################################################################################################################################## + ! First step use Euler alpha=1.0d0 beta=0.0d0 @@ -409,99 +387,103 @@ program main !$acc data create(rhsu_o, rhsv_o, rhsw_o) !$acc data copyin(mysin, mycos) call cpu_time(t_start) + ! Start temporal loop do t=tstart,tfin - ! Create custom label for each marker + ! Create custom label for each marker write(itcount,'(i4)') t - ! Range with custom color - call nvtxStartRange("Iteration "//itcount,t) + ! Range with custom color (uncomment for profiling) + ! call nvtxStartRange("Iteration "//itcount,t) if (rank.eq.0) write(*,*) "Time step",t,"of",tfin call cpu_time(times) - call nvtxStartRange("Phase-field") + ! (uncomment for profiling) + ! call nvtxStartRange("Phase-field") + !######################################################################################################################################## ! START STEP 4: PHASE-FIELD SOLVER (EXPLICIT) !######################################################################################################################################## + #if phiflag == 1 - !$acc kernels - do k=1, piX%shape(3) - do j=1, piX%shape(2) - do i=1,nx - ! compute distance function psi (used to compute normals) - val = min(phi(i,j,k),1.0d0) ! avoid machine precision overshoots in phi that leads to problem with log - psidi(i,j,k) = eps*log((val+enum)/(1.d0-val+enum)) - ! compute here the tanh of distance function psi (used in the sharpening term) to avoid multiple computations of tanh - tanh_psi(i,j,k) = tanh(0.5d0*psidi(i,j,k)*epsi) + !$acc kernels + do k=1, piX%shape(3) + do j=1, piX%shape(2) + do i=1,nx + ! compute distance function psi (used to compute normals) + val = min(phi(i,j,k),1.0d0) ! avoid machine precision overshoots in phi that leads to problem with log + psidi(i,j,k) = eps*log((val+enum)/(1.d0-val+enum)) + ! compute here the tanh of distance function psi (used in the sharpening term) to avoid multiple computations of tanh + tanh_psi(i,j,k) = tanh(0.5d0*psidi(i,j,k)*epsi) + enddo enddo enddo - enddo - !$acc end kernels + !$acc end kernels - gamma=1.d0*gumax - !$acc parallel loop tile(16,4,2) - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext - do i=1,nx - ! 4.1 RHS computation - ip=i+1 - jp=j+1 - kp=k+1 - im=i-1 - jm=j-1 - km=k-1 - if (ip .gt. nx) ip=1 - if (im .lt. 1) im=nx - ! convective (first three lines) and diffusive (last three lines) - rhsphi(i,j,k) = & - - (u(ip,j,k)*0.5d0*(phi(ip,j,k)+phi(i,j,k)) - u(i,j,k)*0.5d0*(phi(i,j,k)+phi(im,j,k)))*dxi & - - (v(i,jp,k)*0.5d0*(phi(i,jp,k)+phi(i,j,k)) - v(i,j,k)*0.5d0*(phi(i,j,k)+phi(i,jm,k)))*dxi & - - (w(i,j,kp)*0.5d0*(phi(i,j,kp)+phi(i,j,k)) - w(i,j,k)*0.5d0*(phi(i,j,k)+phi(i,j,km)))*dxi & - + gamma*(eps*(phi(ip,j,k)-2.d0*phi(i,j,k)+phi(im,j,k))*ddxi + & - eps*(phi(i,jp,k)-2.d0*phi(i,j,k)+phi(i,jm,k))*ddxi + & - eps*(phi(i,j,kp)-2.d0*phi(i,j,k)+phi(i,j,km))*ddxi) - ! 4.1.3. Compute normals for sharpening term (gradient) - normx(i,j,k) = (psidi(ip,j,k) - psidi(im,j,k)) - normy(i,j,k) = (psidi(i,jp,k) - psidi(i,jm,k)) - normz(i,j,k) = (psidi(i,j,kp) - psidi(i,j,km)) + gamma=1.d0*gumax + !$acc parallel loop tile(16,4,2) + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext + do i=1,nx + ! 4.1 RHS computation + ip=i+1 + jp=j+1 + kp=k+1 + im=i-1 + jm=j-1 + km=k-1 + if (ip .gt. nx) ip=1 + if (im .lt. 1) im=nx + ! convective (first three lines) and diffusive (last three lines) + rhsphi(i,j,k) = & + - (u(ip,j,k)*0.5d0*(phi(ip,j,k)+phi(i,j,k)) - u(i,j,k)*0.5d0*(phi(i,j,k)+phi(im,j,k)))*dxi & + - (v(i,jp,k)*0.5d0*(phi(i,jp,k)+phi(i,j,k)) - v(i,j,k)*0.5d0*(phi(i,j,k)+phi(i,jm,k)))*dxi & + - (w(i,j,kp)*0.5d0*(phi(i,j,kp)+phi(i,j,k)) - w(i,j,k)*0.5d0*(phi(i,j,k)+phi(i,j,km)))*dxi & + + gamma*(eps*(phi(ip,j,k)-2.d0*phi(i,j,k)+phi(im,j,k))*ddxi + & + eps*(phi(i,jp,k)-2.d0*phi(i,j,k)+phi(i,jm,k))*ddxi + & + eps*(phi(i,j,kp)-2.d0*phi(i,j,k)+phi(i,j,km))*ddxi) + ! 4.1.3. Compute normals for sharpening term (gradient) + normx(i,j,k) = (psidi(ip,j,k) - psidi(im,j,k)) + normy(i,j,k) = (psidi(i,jp,k) - psidi(i,jm,k)) + normz(i,j,k) = (psidi(i,j,kp) - psidi(i,j,km)) + enddo enddo enddo - enddo - - ! Update normx,normy and normz halos, required to then compute normal derivative - !$acc host_data use_device(normx) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normx, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normx, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - !$acc host_data use_device(normy) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normy, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normy, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - !$acc host_data use_device(normz) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normz, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normz, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - ! 4.1.3. Compute Sharpening term (gradient) - ! Substep 2: Compute normals (1.e-16 is a numerical tollerance to avodi 0/0) - !$acc kernels - do k=1, piX%shape(3) - do j=1, piX%shape(2) - do i=1,nx - normod = 1.d0/(sqrt(normx(i,j,k)*normx(i,j,k) + normy(i,j,k)*normy(i,j,k) + normz(i,j,k)*normz(i,j,k)) + 1.0E-16) - ! normod = 1.d0/(sqrt(normx(i,j,k)**2d0 + normy(i,j,k)**2d0 + normz(i,j,k)**2d0) + 1.0E-16) - normx(i,j,k) = normx(i,j,k)*normod - normy(i,j,k) = normy(i,j,k)*normod - normz(i,j,k) = normz(i,j,k)*normod + ! Update normx,normy and normz halos, required to then compute normal derivative + !$acc host_data use_device(normx) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normx, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normx, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + !$acc host_data use_device(normy) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normy, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normy, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + !$acc host_data use_device(normz) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normz, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, normz, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + + ! 4.1.3. Compute Sharpening term (gradient) + ! Substep 2: Compute normals (1.e-16 is a numerical tollerance to avodi 0/0) + !$acc kernels + do k=1, piX%shape(3) + do j=1, piX%shape(2) + do i=1,nx + normod = 1.d0/(sqrt(normx(i,j,k)*normx(i,j,k) + normy(i,j,k)*normy(i,j,k) + normz(i,j,k)*normz(i,j,k)) + 1.0E-16) + ! normod = 1.d0/(sqrt(normx(i,j,k)**2d0 + normy(i,j,k)**2d0 + normz(i,j,k)**2d0) + 1.0E-16) + normx(i,j,k) = normx(i,j,k)*normod + normy(i,j,k) = normy(i,j,k)*normod + normz(i,j,k) = normz(i,j,k)*normod + enddo enddo enddo - enddo - !$acc end kernels + !$acc end kernels - ! Compute sharpening term - !$acc kernels - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext + ! Compute sharpening term + !$acc kernels + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext do i=1,nx ip=i+1 jp=j+1 @@ -511,62 +493,46 @@ program main km=k-1 if (ip .gt. nx) ip=1 if (im .lt. 1) im=nx - ! OLD CDI - !rhsphi(i,j,k)=rhsphi(i,j,k)+gamma*(((phi(ip,j,k)**2d0-phi(ip,j,k))*normx(ip,j,k)-(phi(im,j,k)**2d0-phi(im,j,k))*normx(im,j,k))*0.5d0*dxi + & - ! ((phi(i,jp,k)**2d0-phi(i,jp,k))*normy(i,jp,k)-(phi(i,jm,k)**2d0-phi(i,jm,k))*normy(i,jm,k))*0.5d0*dxi + & - ! ((phi(i,j,kp)**2d0-phi(i,j,kp))*normz(i,j,kp)-(phi(i,j,km)**2d0-phi(i,j,km))*normz(i,j,km))*0.5d0*dxi) - ! NEW ACDI - ! rhsphi(i,j,k)=rhsphi(i,j,k)-gamma*((0.25d0*(1.d0-(tanh(0.5d0*psidi(ip,j,k)*epsi))**2)*normx(ip,j,k)- 0.25d0*(1.d0-(tanh(0.5d0*psidi(im,j,k)*epsi))**2)*normx(im,j,k))*0.5*dxi +& - ! (0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jp,k)*epsi))**2)*normy(i,jp,k)- 0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jm,k)*epsi))**2)*normy(i,jm,k))*0.5*dxi +& - ! - ! ACDI improved version with pre-computed tanh - rhsphi(i,j,k)=rhsphi(i,j,k)-gamma*((0.25d0*(1.d0-tanh_psi(ip,j,k)*tanh_psi(ip,j,k))*normx(ip,j,k) - & - 0.25d0*(1.d0-tanh_psi(im,j,k)*tanh_psi(im,j,k))*normx(im,j,k))*0.5*dxi + & - (0.25d0*(1.d0-tanh_psi(i,jp,k)*tanh_psi(i,jp,k))*normy(i,jp,k) - & - 0.25d0*(1.d0-tanh_psi(i,jm,k)*tanh_psi(i,jm,k))*normy(i,jm,k))*0.5*dxi + & - (0.25d0*(1.d0-tanh_psi(i,j,kp)*tanh_psi(i,j,kp))*normz(i,j,kp) - & - 0.25d0*(1.d0-tanh_psi(i,j,km)*tanh_psi(i,j,km))*normz(i,j,km))*0.5*dxi) - - ! rhsphi(i,j,k)=rhsphi(i,j,k)-gamma*((0.25d0*(1.d0-(tanh(0.5d0*psidi(ip,j,k)*epsi))**2)*normx(ip,j,k)- & - ! 0.25d0*(1.d0-(tanh(0.5d0*psidi(im,j,k)*epsi))**2)*normx(im,j,k))*0.5*dxi +& - ! (0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jp,k)*epsi))**2)*normy(i,jp,k) - & - ! 0.25d0*(1.d0-(tanh(0.5d0*psidi(i,jm,k)*epsi))**2)*normy(i,jm,k))*0.5*dxi +& - ! + ! ACDI with pre-computed tanh + rhsphi(i,j,k)=rhsphi(i,j,k)-gamma*((0.25d0*(1.d0-tanh_psi(ip,j,k)*tanh_psi(ip,j,k))*normx(ip,j,k) - & + 0.25d0*(1.d0-tanh_psi(im,j,k)*tanh_psi(im,j,k))*normx(im,j,k))*0.5*dxi + & + (0.25d0*(1.d0-tanh_psi(i,jp,k)*tanh_psi(i,jp,k))*normy(i,jp,k) - & + 0.25d0*(1.d0-tanh_psi(i,jm,k)*tanh_psi(i,jm,k))*normy(i,jm,k))*0.5*dxi + & + (0.25d0*(1.d0-tanh_psi(i,j,kp)*tanh_psi(i,j,kp))*normz(i,j,kp) - & + 0.25d0*(1.d0-tanh_psi(i,j,km)*tanh_psi(i,j,km))*normz(i,j,km))*0.5*dxi) enddo - enddo - enddo - !$acc end kernels + enddo + enddo + !$acc end kernels - ! 4.2 Get phi at n+1 using AB2 - !$acc kernels - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext + ! 4.2 Get phi at n+1 using AB2 + !$acc kernels + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext do i=1,nx - phi(i,j,k) = phi(i,j,k) + dt*(alpha*rhsphi(i,j,k)-beta*rhsphi_o(i,j,k)) - rhsphi_o(i,j,k)=rhsphi(i,j,k) + phi(i,j,k) = phi(i,j,k) + dt*(alpha*rhsphi(i,j,k)-beta*rhsphi_o(i,j,k)) + rhsphi_o(i,j,k)=rhsphi(i,j,k) enddo - enddo - enddo - !$acc end kernels + enddo + enddo + !$acc end kernels - ! 4.3 Call halo exchnages along Y and Z for phi - !$acc host_data use_device(phi) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data + ! 4.3 Call halo exchnages along Y and Z for phi + !$acc host_data use_device(phi) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, phi, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data #endif + + ! (uncomment for profiling) + ! call nvtxEndRange + !######################################################################################################################################## ! END STEP 4: PHASE-FIELD SOLVER !######################################################################################################################################## - call nvtxEndRange - - - - - call nvtxStartRange("Projection") !######################################################################################################################################## ! START STEP 5: USTAR COMPUTATION (PROJECTION STEP) !######################################################################################################################################## @@ -574,6 +540,9 @@ program main ! 5.2 obtain ustar and store old rhs in rhs_o ! 5.3 Call halo exchnages along Y and Z for u,v,w + ! (uncomment for profiling) + ! call nvtxStartRange("Projection") + ! Projection step, convective terms ! 5.1a Convective terms NS ! Loop on inner nodes @@ -627,102 +596,103 @@ program main rhsu(i,j,k)=rhsu(i,j,k)+(h11+h12+h13)*rhoi rhsv(i,j,k)=rhsv(i,j,k)+(h21+h22+h23)*rhoi rhsw(i,j,k)=rhsw(i,j,k)+(h31+h32+h33)*rhoi + ! NS forcing kg = piX%lo(3) + k - 1 - jg = piX%lo(2) + j - 1 + jg = piX%lo(2) + j - 1 + ! ABC forcing - ! rhsu(i,j,k)= rhsu(i,j,k) + f3*sin(k0*x(kg))+f2*cos(k0*x(jg)) rhsu(i,j,k)= rhsu(i,j,k) + f3*mysin(kg)+f2*mycos(jg) - ! rhsv(i,j,k)= rhsv(i,j,k) + f1*sin(k0*x(i))+f3*cos(k0*x(kg)) rhsv(i,j,k)= rhsv(i,j,k) + f1*mysin(i)+f3*mycos(kg) - ! rhsw(i,j,k)= rhsw(i,j,k) + f2*sin(k0*x(jg))+f1*cos(k0*x(i)) rhsw(i,j,k)= rhsw(i,j,k) + f2*mysin(jg)+f1*mycos(i) + ! TG Forcing !rhsu(i,j,k)= rhsu(i,j,k) + f1*sin(k0*x(i))*cos(k0*x(j))*cos(k0*x(k)) !rhsv(i,j,k)= rhsv(i,j,k) - f1*cos(k0*x(i))*sin(k0*x(j))*sin(k0*x(k)) + enddo enddo enddo ! Surface tension forces #if phiflag == 1 - !$acc kernels - !Obtain surface tension forces evaluated at the center of the cell (same as where phi is located) - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext - do i=1,nx - ip=i+1 - jp=j+1 - kp=k+1 - im=i-1 - jm=j-1 - km=k-1 - if (ip .gt. nx) ip=1 - if (im .lt. 1) im=nx - chempot=phi(i,j,k)*(1.d0-phi(i,j,k))*(1.d0-2.d0*phi(i,j,k))*epsi-eps*(phi(ip,j,k)+phi(im,j,k)+phi(i,jp,k)+phi(i,jm,k)+phi(i,j,kp)+phi(i,j,km)- 6.d0*phi(i,j,k))*ddxi - ! chempot*gradphi - fxst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(ip,j,k)-phi(im,j,k))*dxi - fyst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(i,jp,k)-phi(i,jm,k))*dxi - fzst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(i,j,kp)-phi(i,j,km))*dxi + !$acc kernels + !Obtain surface tension forces evaluated at the center of the cell (same as where phi is located) + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext + do i=1,nx + ip=i+1 + jp=j+1 + kp=k+1 + im=i-1 + jm=j-1 + km=k-1 + if (ip .gt. nx) ip=1 + if (im .lt. 1) im=nx + chempot=phi(i,j,k)*(1.d0-phi(i,j,k))*(1.d0-2.d0*phi(i,j,k))*epsi-eps*(phi(ip,j,k)+phi(im,j,k)+phi(i,jp,k)+phi(i,jm,k)+phi(i,j,kp)+phi(i,j,km)- 6.d0*phi(i,j,k))*ddxi + ! chempot*gradphi + fxst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(ip,j,k)-phi(im,j,k))*dxi + fyst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(i,jp,k)-phi(i,jm,k))*dxi + fzst(i,j,k)=6.d0*sigma*chempot*0.5d0*(phi(i,j,kp)-phi(i,j,km))*dxi + enddo enddo enddo - enddo - !$acc end kernels + !$acc end kernels - ! Update halo of fxst, fyst and fzst (required then to interpolate at velocity points) - !$acc host_data use_device(fxst) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fxst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fxst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - !$acc host_data use_device(fyst) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fyst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fyst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - !$acc host_data use_device(fzst) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fzst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fzst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) - !$acc end host_data - - ! Interpolate force at velocity points - !$acc kernels - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext - do i=1,nx - im=i-1 - jm=j-1 - km=k-1 - if (im .lt. 1) im=nx - rhsu(i,j,k)=rhsu(i,j,k) + 0.5d0*(fxst(im,j,k)+fxst(i,j,k))*rhoi - rhsv(i,j,k)=rhsv(i,j,k) + 0.5d0*(fyst(i,jm,k)+fyst(i,j,k))*rhoi - rhsw(i,j,k)=rhsw(i,j,k) + 0.5d0*(fzst(i,j,km)+fzst(i,j,k))*rhoi - u(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) - v(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) - w(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) - rhsu_o(i,j,k)=rhsu(i,j,k) - rhsv_o(i,j,k)=rhsv(i,j,k) - rhsw_o(i,j,k)=rhsw(i,j,k) - enddo + ! Update halo of fxst, fyst and fzst (required then to interpolate at velocity points) + !$acc host_data use_device(fxst) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fxst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fxst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + !$acc host_data use_device(fyst) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fyst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fyst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + !$acc host_data use_device(fzst) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fzst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, fzst, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + !$acc end host_data + + ! Interpolate force at velocity points + !$acc kernels + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext + do i=1,nx + im=i-1 + jm=j-1 + km=k-1 + if (im .lt. 1) im=nx + rhsu(i,j,k)=rhsu(i,j,k) + 0.5d0*(fxst(im,j,k)+fxst(i,j,k))*rhoi + rhsv(i,j,k)=rhsv(i,j,k) + 0.5d0*(fyst(i,jm,k)+fyst(i,j,k))*rhoi + rhsw(i,j,k)=rhsw(i,j,k) + 0.5d0*(fzst(i,j,km)+fzst(i,j,k))*rhoi + u(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) + v(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) + w(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) + rhsu_o(i,j,k)=rhsu(i,j,k) + rhsv_o(i,j,k)=rhsv(i,j,k) + rhsw_o(i,j,k)=rhsw(i,j,k) + enddo + enddo enddo - enddo - !$acc end kernels + !$acc end kernels #else - ! 5.2 find u, v and w star (explicit Eulero), only in the inner nodes - !$acc kernels - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext - do i=1,nx - u(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) - v(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) - w(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) - rhsu_o(i,j,k)=rhsu(i,j,k) - rhsv_o(i,j,k)=rhsv(i,j,k) - rhsw_o(i,j,k)=rhsw(i,j,k) - enddo + ! 5.2 find u, v and w star (explicit Eulero), only in the inner nodes + !$acc kernels + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext + do i=1,nx + u(i,j,k) = u(i,j,k) + dt*(alpha*rhsu(i,j,k)-beta*rhsu_o(i,j,k)) + v(i,j,k) = v(i,j,k) + dt*(alpha*rhsv(i,j,k)-beta*rhsv_o(i,j,k)) + w(i,j,k) = w(i,j,k) + dt*(alpha*rhsw(i,j,k)-beta*rhsw_o(i,j,k)) + rhsu_o(i,j,k)=rhsu(i,j,k) + rhsv_o(i,j,k)=rhsv(i,j,k) + rhsw_o(i,j,k)=rhsw(i,j,k) + enddo + enddo enddo - enddo - !$acc end kernels + !$acc end kernels #endif @@ -731,12 +701,6 @@ program main ! After first step move to AB2 alpha=1.5d0 beta= 0.5d0 - ! !$acc kernels - ! rhsu_o=rhsu - ! rhsv_o=rhsv - ! rhsw_o=rhsw - ! !$acc end kernels - ! 5.3 update halos (y and z directions), required to then compute the RHS of Poisson equation because of staggered grid !$acc host_data use_device(u) @@ -751,43 +715,47 @@ program main CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, w, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data + + ! (uncomment for profiling) + ! call nvtxEndRange + !######################################################################################################################################## ! END STEP 5: USTAR COMPUTATION !######################################################################################################################################## - call nvtxEndRange - - - - - - call nvtxStartRange("Poisson") + !######################################################################################################################################## ! START STEP 6: POISSON SOLVER FOR PRESSURE !######################################################################################################################################## ! initialize rhs and analytical solution ! 6.1 Compute rhs of Poisson equation div*ustar: divergence at the cell center ! I've done the halo updates so to compute the divergence at the pencil border i have the *star from the halo - call nvtxStartRange("compute RHS") - !$acc kernels - do k=1+halo_ext, piX%shape(3)-halo_ext - do j=1+halo_ext, piX%shape(2)-halo_ext - do i=1,nx - ip=i+1 - jp=j+1 - kp=k+1 - if (ip > nx) ip=1 - rhsp(i,j,k) = (rho*dxi/dt)*(u(ip,j,k)-u(i,j,k)) - rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(v(i,jp,k)-v(i,j,k)) - rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(w(i,j,kp)-w(i,j,k)) - enddo - enddo - enddo - !$acc end kernels + ! (uncomment for profiling) + ! call nvtxStartRange("Poisson") + + ! (uncomment for profiling) + ! call nvtxStartRange("compute RHS") - call nvtxEndRange + !$acc kernels + do k=1+halo_ext, piX%shape(3)-halo_ext + do j=1+halo_ext, piX%shape(2)-halo_ext + do i=1,nx + ip=i+1 + jp=j+1 + kp=k+1 + if (ip > nx) ip=1 + rhsp(i,j,k) = (rho*dxi/dt)*(u(ip,j,k)-u(i,j,k)) + rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(v(i,jp,k)-v(i,j,k)) + rhsp(i,j,k) = rhsp(i,j,k) + (rho*dxi/dt)*(w(i,j,kp)-w(i,j,k)) + enddo + enddo + enddo + !$acc end kernels + + ! (uncomment for profiling) + ! call nvtxEndRange ! ! !beginDEBUG ! !$acc kernels @@ -808,127 +776,106 @@ program main ! enddo ! !$acc end kernels - ! !endDEBUG + ! (uncomment for profiling) + ! call nvtxStartRange("FFT forward w/ transpositions") - call nvtxStartRange("FFT forward w/ transpositions") - - !$acc host_data use_device(rhsp) - status = cufftExecD2Z(planXf, rhsp, psi_d) - if (status /= CUFFT_SUCCESS) write(*,*) 'X forward error: ', status - !$acc end host_data - - !!Nyquist to be set to zero? - ! block - ! complex(8), device, pointer :: psi_dev(:,:,:) - ! call c_f_pointer( c_devloc(psi_d), psi_dev, & - ! [piX_d2z%shape(1), piX_d2z%shape(2), piX_d2z%shape(3)] ) - ! !$acc kernels - ! do k = 1, piX_d2z%shape(3) - ! do j = 1, piX_d2z%shape(2) - ! psi_dev(nx/2+1, j, k) = (0.0_8, 0.0_8) - ! end do - ! end do - ! !$acc end kernels - ! end block - - - ! psi(kx,y,z) -> psi(y,z,kx) - CHECK_CUDECOMP_EXIT(cudecompTransposeXToY(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX,piX_d2z%halo_extents, [0,0,0])) - ! psi(y,z,kx) -> psi(ky,z,kx) - status = cufftExecZ2Z(planY, psi_d, psi_d, CUFFT_FORWARD) - if (status /= CUFFT_SUCCESS) write(*,*) 'Y forward error: ', status - ! psi(ky,z,kx) -> psi(z,kx,ky) - CHECK_CUDECOMP_EXIT(cudecompTransposeYToZ(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX)) - ! psi(z,kx,ky) -> psi(kz,kx,ky) - status = cufftExecZ2Z(planZ, psi_d, psi_d, CUFFT_FORWARD) - if (status /= CUFFT_SUCCESS) write(*,*) 'Z forward error: ', status - ! END of FFT3D forward - - call nvtxEndRange - - !block - np(piZ_d2z%order(1)) = piZ_d2z%shape(1) - np(piZ_d2z%order(2)) = piZ_d2z%shape(2) - np(piZ_d2z%order(3)) = piZ_d2z%shape(3) - call c_f_pointer(c_devloc(psi_d), phi3d, piZ_d2z%shape) - - - ! divide by -K**2, and normalize - - offsets(piZ_d2z%order(1)) = piZ_d2z%lo(1) - 1 - offsets(piZ_d2z%order(2)) = piZ_d2z%lo(2) - 1 - offsets(piZ_d2z%order(3)) = piZ_d2z%lo(3) - 1 - - xoff = offsets(1) - yoff = offsets(2) - npx = np(1) - npy = np(2) - - call nvtxStartRange("Solution") + !$acc host_data use_device(rhsp) + status = cufftExecD2Z(planXf, rhsp, psi_d) + if (status /= CUFFT_SUCCESS) write(*,*) 'X forward error: ', status + !$acc end host_data - !$acc kernels - do jl = 1, npy - jg = yoff + jl - do il = 1, npx - ig = xoff + il - do k = 1, nz - k2 = kx_d(ig)**2 + kx_d(jg)**2 + kx_d(k)**2 - phi3d(k,il,jl) = -phi3d(k,il,jl)/k2/(int(nx,8)*int(ny,8)*int(nz,8)) - enddo + ! psi(kx,y,z) -> psi(y,z,kx) + CHECK_CUDECOMP_EXIT(cudecompTransposeXToY(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX,piX_d2z%halo_extents, [0,0,0])) + ! psi(y,z,kx) -> psi(ky,z,kx) + status = cufftExecZ2Z(planY, psi_d, psi_d, CUFFT_FORWARD) + if (status /= CUFFT_SUCCESS) write(*,*) 'Y forward error: ', status + ! psi(ky,z,kx) -> psi(z,kx,ky) + CHECK_CUDECOMP_EXIT(cudecompTransposeYToZ(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX)) + ! psi(z,kx,ky) -> psi(kz,kx,ky) + status = cufftExecZ2Z(planZ, psi_d, psi_d, CUFFT_FORWARD) + if (status /= CUFFT_SUCCESS) write(*,*) 'Z forward error: ', status + ! END of FFT3D forward + + ! (uncomment for profiling) + ! call nvtxEndRange + + np(piZ_d2z%order(1)) = piZ_d2z%shape(1) + np(piZ_d2z%order(2)) = piZ_d2z%shape(2) + np(piZ_d2z%order(3)) = piZ_d2z%shape(3) + call c_f_pointer(c_devloc(psi_d), phi3d, piZ_d2z%shape) + + ! divide by -K**2, and normalize + + offsets(piZ_d2z%order(1)) = piZ_d2z%lo(1) - 1 + offsets(piZ_d2z%order(2)) = piZ_d2z%lo(2) - 1 + offsets(piZ_d2z%order(3)) = piZ_d2z%lo(3) - 1 + + xoff = offsets(1) + yoff = offsets(2) + npx = np(1) + npy = np(2) + + ! (uncomment for profiling) + ! call nvtxStartRange("Solution") + + !$acc kernels + do jl = 1, npy + jg = yoff + jl + do il = 1, npx + ig = xoff + il + do k = 1, nz + k2 = kx_d(ig)**2 + kx_d(jg)**2 + kx_d(k)**2 + phi3d(k,il,jl) = -phi3d(k,il,jl)/k2/(int(nx,8)*int(ny,8)*int(nz,8)) enddo enddo - ! specify mean (corrects division by zero wavenumber above) - if (xoff == 0 .and. yoff == 0) phi3d(1,1,1) = 0.0 - !$acc end kernels + enddo + ! specify mean (corrects division by zero wavenumber above) + if (xoff == 0 .and. yoff == 0) phi3d(1,1,1) = 0.0 + !$acc end kernels - call nvtxEndRange + ! (uncomment for profiling) + ! call nvtxEndRange - !end block - - call nvtxStartRange("FFT backwards w/ transpositions") - - ! psi(kz,kx,ky) -> psi(z,kx,ky) - status = cufftExecZ2Z(planZ, psi_d, psi_d, CUFFT_INVERSE) - if (status /= CUFFT_SUCCESS) write(*,*) 'Z inverse error: ', status - ! psi(z,kx,ky) -> psi(ky,z,kx) - CHECK_CUDECOMP_EXIT(cudecompTransposeZToY(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX)) - ! psi(ky,z,kx) -> psi(y,z,kx) - status = cufftExecZ2Z(planY, psi_d, psi_d, CUFFT_INVERSE) - if (status /= CUFFT_SUCCESS) write(*,*) 'Y inverse error: ', status - ! psi(y,z,kx) -> psi(kx,y,z) - CHECK_CUDECOMP_EXIT(cudecompTransposeYToX(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX,[0,0,0], piX_d2z%halo_extents)) - !$acc host_data use_device(p) - ! psi(kx,y,z) -> psi(x,y,z) - status = cufftExecZ2D(planXb, psi_d, p) - if (status /= CUFFT_SUCCESS) write(*,*) 'X inverse error: ', status - !$acc end host_data + ! (uncomment for profiling) + ! call nvtxStartRange("FFT backwards w/ transpositions") + + ! psi(kz,kx,ky) -> psi(z,kx,ky) + status = cufftExecZ2Z(planZ, psi_d, psi_d, CUFFT_INVERSE) + if (status /= CUFFT_SUCCESS) write(*,*) 'Z inverse error: ', status + ! psi(z,kx,ky) -> psi(ky,z,kx) + CHECK_CUDECOMP_EXIT(cudecompTransposeZToY(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX)) + ! psi(ky,z,kx) -> psi(y,z,kx) + status = cufftExecZ2Z(planY, psi_d, psi_d, CUFFT_INVERSE) + if (status /= CUFFT_SUCCESS) write(*,*) 'Y inverse error: ', status + ! psi(y,z,kx) -> psi(kx,y,z) + CHECK_CUDECOMP_EXIT(cudecompTransposeYToX(handle, grid_descD2Z, psi_d, psi_d, work_d_d2z, CUDECOMP_DOUBLE_COMPLEX,[0,0,0], piX_d2z%halo_extents)) + !$acc host_data use_device(p) + ! psi(kx,y,z) -> psi(x,y,z) + status = cufftExecZ2D(planXb, psi_d, p) + if (status /= CUFFT_SUCCESS) write(*,*) 'X inverse error: ', status + !$acc end host_data - call nvtxEndRange + ! (uncomment for profiling) + ! call nvtxEndRange !$acc host_data use_device(p) - ! update halo nodes with pressure (needed for the pressure correction step), using device variable no need to use host-data - ! Update X-pencil halos in Y and Z direction - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, p, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) - CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, p, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) + ! update halo nodes with pressure (needed for the pressure correction step), using device variable no need to use host-data + ! Update X-pencil halos in Y and Z direction + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, p, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 2)) + CHECK_CUDECOMP_EXIT(cudecompUpdateHalosX(handle, grid_desc, p, work_halo_d, CUDECOMP_DOUBLE, piX%halo_extents, halo_periods, 3)) !$acc end host_data - - + ! (uncomment for profiling) + ! call nvtxEndRange !######################################################################################################################################## ! END STEP 7: POISSON SOLVER FOR PRESSURE !######################################################################################################################################## - call nvtxEndRange - - - - - call nvtxStartRange("Correction") !######################################################################################################################################## ! START STEP 8: VELOCITY CORRECTION ! ######################################################################################################################################## @@ -937,6 +884,10 @@ program main ! 8.3 Call halo exchnages along Y and Z for u,v,w ! Correct velocity, pressure has also the halo ! Correction + removal of mean velocity altogether for performance + + ! (uncomment for profiling) + ! call nvtxStartRange("Correction") + !$acc kernels umean=0.d0 vmean=0.d0 @@ -944,16 +895,16 @@ program main do k=1+halo_ext, piX%shape(3)-halo_ext do j=1+halo_ext, piX%shape(2)-halo_ext do i = 1, piX%shape(1) ! equal to nx (no halo on x) - im=i-1 - jm=j-1 - km=k-1 - if (im < 1) im=nx - u(i,j,k)=u(i,j,k) - dt/rho*(p(i,j,k)-p(im,j,k))*dxi - v(i,j,k)=v(i,j,k) - dt/rho*(p(i,j,k)-p(i,jm,k))*dxi - w(i,j,k)=w(i,j,k) - dt/rho*(p(i,j,k)-p(i,j,km))*dxi - umean=umean + u(i,j,k) - vmean=vmean + v(i,j,k) - wmean=wmean + w(i,j,k) + im=i-1 + jm=j-1 + km=k-1 + if (im < 1) im=nx + u(i,j,k)=u(i,j,k) - dt/rho*(p(i,j,k)-p(im,j,k))*dxi + v(i,j,k)=v(i,j,k) - dt/rho*(p(i,j,k)-p(i,jm,k))*dxi + w(i,j,k)=w(i,j,k) - dt/rho*(p(i,j,k)-p(i,j,km))*dxi + umean=umean + u(i,j,k) + vmean=vmean + v(i,j,k) + wmean=wmean + w(i,j,k) enddo enddo enddo @@ -961,7 +912,6 @@ program main ! Remove mean velocity (get local mean of the rank) - ! Divide by total number of points in the pencil umean=umean/nx/(piX%shape(2)-2*halo_ext)/(piX%shape(3)-2*halo_ext) vmean=vmean/nx/(piX%shape(2)-2*halo_ext)/(piX%shape(3)-2*halo_ext) @@ -1005,18 +955,15 @@ program main if (cou .gt. 7) stop endif - ! beginDZ - ! CHECK - To be removed in actual computation - - ! endDZ - - call cpu_time(timef) if (rank.eq.0) print '(" Time elapsed = ",f8.1," ms")',1000*(timef-times) + + ! (uncomment for profiling) + ! call nvtxEndRange + !######################################################################################################################################## ! END STEP 8: VELOCITY CORRECTION !######################################################################################################################################## - call nvtxEndRange !######################################################################################################################################## @@ -1024,22 +971,23 @@ program main ! ######################################################################################################################################## if (mod(t,dump) .eq. 0) then if (rank .eq. 0) write(*,*) "Saving output files" - ! write velocity and pressure fiels (1-4) - call writefield(t,1) - call writefield(t,2) - call writefield(t,3) - call writefield(t,4) - #if phiflag == 1 + ! write velocity and pressure fiels (1-4) + call writefield(t,1) + call writefield(t,2) + call writefield(t,3) + call writefield(t,4) + #if phiflag == 1 ! write phase-field (5) call writefield(t,5) - #endif + #endif endif !######################################################################################################################################## ! END STEP 9: OUTPUT FIELDS N !######################################################################################################################################## -call nvtxEndRange -!call nvtxEndRange +! (uncomment for profiling) +! call nvtxEndRange + enddo call cpu_time(t_end) elapsed = t_end-t_start diff --git a/multi/testpush.sh b/multi/testpush.sh deleted file mode 100644 index 2e0e21a..0000000 --- a/multi/testpush.sh +++ /dev/null @@ -1,2 +0,0 @@ -make clean -make