From 221bf7639f41b4efd510a85309978c6f9d8b826d Mon Sep 17 00:00:00 2001 From: holger <holger-grosshans@gmx.de> Date: Thu, 8 Apr 2021 14:05:06 +0200 Subject: [PATCH] v1.1.0 modified: documentation/userGuide/pafiX_userGuide.pdf modified: input/input_example.dat new file: src/COPYING modified: src/bc.f90 modified: src/electrostatics.f90 modified: src/fluid.f90 modified: src/main.f90 modified: src/makefile deleted: src/mass.f90 deleted: src/mom1.f90 deleted: src/mom5.f90 deleted: src/momentum.f90 modified: src/parallel.f90 modified: src/particles.f90 modified: src/particlesTransport.f90 modified: src/post.f90 modified: src/pre.f90 deleted: src/pressure.f90 modified: src/restart.f90 deleted: src/schemes.f90 new file: src/timestep.f90 modified: src/var.f90 new file: src/write_vtk.f90 deleted: src/writedat_fluid_xy.f90 deleted: src/writedat_fluid_xz.f90 modified: src/writedat_particles.f90 deleted: src/writevtk_fluid_xy.f90 deleted: src/writevtk_fluid_xyz.f90 deleted: src/writevtk_fluid_xz.f90 deleted: src/writevtk_fluid_yz.f90 deleted: src/writevtk_grid.f90 deleted: src/writevtk_particles.f90 --- documentation/userGuide/pafiX_userGuide.pdf | Bin 165718 -> 160030 bytes input/input_example.dat | 12 +- src/COPYING | 674 ++++++++++++++++++++ src/bc.f90 | 281 +++----- src/electrostatics.f90 | 311 ++++----- src/fluid.f90 | 323 ++++++++-- src/main.f90 | 50 +- src/makefile | 58 +- src/mass.f90 | 36 -- src/mom1.f90 | 228 ------- src/mom5.f90 | 246 ------- src/momentum.f90 | 144 ----- src/parallel.f90 | 294 ++++----- src/particles.f90 | 423 ++++++------ src/particlesTransport.f90 | 622 ++++++++---------- src/post.f90 | 148 ++--- src/pre.f90 | 303 ++++----- src/pressure.f90 | 65 -- src/restart.f90 | 120 ++-- src/schemes.f90 | 98 --- src/timestep.f90 | 52 ++ src/var.f90 | 90 ++- src/write_vtk.f90 | 449 +++++++++++++ src/writedat_fluid_xy.f90 | 93 --- src/writedat_fluid_xz.f90 | 93 --- src/writedat_particles.f90 | 15 +- src/writevtk_fluid_xy.f90 | 144 ----- src/writevtk_fluid_xyz.f90 | 138 ---- src/writevtk_fluid_xz.f90 | 150 ----- src/writevtk_fluid_yz.f90 | 138 ---- src/writevtk_grid.f90 | 41 -- src/writevtk_particles.f90 | 124 ---- 32 files changed, 2591 insertions(+), 3372 deletions(-) mode change 100644 => 100755 documentation/userGuide/pafiX_userGuide.pdf create mode 100644 src/COPYING delete mode 100644 src/mass.f90 delete mode 100644 src/mom1.f90 delete mode 100644 src/mom5.f90 delete mode 100644 src/momentum.f90 delete mode 100644 src/pressure.f90 delete mode 100644 src/schemes.f90 create mode 100644 src/timestep.f90 create mode 100644 src/write_vtk.f90 delete mode 100644 src/writedat_fluid_xy.f90 delete mode 100644 src/writedat_fluid_xz.f90 delete mode 100644 src/writevtk_fluid_xy.f90 delete mode 100644 src/writevtk_fluid_xyz.f90 delete mode 100644 src/writevtk_fluid_xz.f90 delete mode 100644 src/writevtk_fluid_yz.f90 delete mode 100644 src/writevtk_grid.f90 delete mode 100644 src/writevtk_particles.f90 diff --git a/documentation/userGuide/pafiX_userGuide.pdf b/documentation/userGuide/pafiX_userGuide.pdf old mode 100644 new mode 100755 index c0791cc0c383d8fa177d5aad7770bf0d480bce36..bd4b928871e240f5c2495020ae475965ef1850d0 GIT binary patch delta 63588 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Ə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 delta 69247 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 diff --git a/input/input_example.dat b/input/input_example.dat index 0aa6a27..affaac8 100644 --- a/input/input_example.dat +++ b/input/input_example.dat @@ -1,27 +1,27 @@ -pafiX input data +pafiX v.1.2.0 input data ---------------- dimensions in x,y,z-direction (m,m,m) = 0.24,0.125,0.04 boundary conditions in x,y,z-direction [(w)all/(p)eriodic/(i)n-outlet] = p,p,w number of cells in x,y,z-direction (-,-,-) = -20,20,20 +16,16,16 grid in x,y,z-direction [(u)niform/(s)tretch] = u,u,s start time-step (-), time-steps to compute (-) = 1,10 interval of writing result files, restart files (-,-) = 10,10000 -CFL number (-) = -0.4 +CFL number (-), max number interations (-), relative tolerance (-) = +0.4,200,5.E-3 in/initial flow (m/s), pressure gradient (N/m**3) = 3.65,-2.9 fluid density (kg/m**3), fluid kinematic viscosity (m**2/s) = 1.2,1.46E-5 particle number density (-/m**3) or rate (-/s), start seed at nt (-) = 1E7,1 -particle radius (m), material density (kg/m**3) = -50E-6,1200 +particle radius (m), material density (kg/m**3), restitution coeff (-) = +50E-6,1200,0.9 particle charge: initial, equilibrium (C,C) = 0.,1E-12 gravity vector in x,y,z-dir. (m/s**2,m/s**2,m/s**2) = diff --git a/src/COPYING b/src/COPYING new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/src/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<https://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/src/bc.f90 b/src/bc.f90 index a211c92..a727a9c 100644 --- a/src/bc.f90 +++ b/src/bc.f90 @@ -1,101 +1,83 @@ !#################################################################### !> @author Holger Grosshans -!> @brief boundary condition for velocity and pressure field - subroutine bcUVWP +!> @brief Dirichlet (fixed value) boundary condition for velocity field + subroutine bcUVW(myu,myv,myw) use var - real(kind=pr) :: & - ue,uw,ve,vw,we,ww, & - uba,ufr,vba,vfr,wba,wfr, & - un,us,vn,vs,wn,ws, & - alpha,dist - integer :: i,j,l,m,mm + use parallel + real(kind=pr),dimension(ii,jj,ll) :: myu,myv,myw + real(kind=pr) :: wval + integer :: m - if (bcx.eq.'w') then - ue=0._pr; uw=0._pr; ve=0._pr; vw=0._pr; ww=0._pr; we=0._pr - endif - if (bcy.eq.'w') then - uba=0._pr; ufr=0._pr; vba=0._pr; vfr=0._pr; wba=0._pr; wfr=0._pr - endif - if (bcz.eq.'w') then - un =0._pr; us =0._pr; vs =0._pr; vn =0._pr; wn =0._pr; ws =0._pr - endif + wval=0._pr - - if (bcx.eq.'w') then + if (bcx.eq.'w') then ! x: if (myid.eq.0) then do 1 m=1,gc - u(imin-m,:,:)= uw - v(imin-m,:,:)= v(imin,:,:)-2._pr*(v(imin,:,:)-vw) - w(imin-m,:,:)= w(imin,:,:)-2._pr*(w(imin,:,:)-ww) + myu(imin-m,:,:)= wval + myv(imin-m,:,:)= myv(imin,:,:)-2._pr*(myv(imin,:,:)-wval) + myw(imin-m,:,:)= myw(imin,:,:)-2._pr*(myw(imin,:,:)-wval) 1 enddo endif if (myid.eq.nrprocs-1) then do 2 m=1,gc - u(imax-1+m,:,:)=ue - v(imax+m,:,:)= v(imax,:,:)-2._pr*(v(imax,:,:)-ve) - w(imax+m,:,:)= w(imax,:,:)-2._pr*(w(imax,:,:)-we) + myu(imax-1+m,:,:)=wval + myv(imax+m,:,:)= myv(imax,:,:)-2._pr*(myv(imax,:,:)-wval) + myw(imax+m,:,:)= myw(imax,:,:)-2._pr*(myw(imax,:,:)-wval) 2 enddo endif elseif (bcx.eq.'p') then - ! done through the sync routines + call sync(u); call sync(v); call sync(w) ! done through the sync routines elseif (bcx.eq.'i') then ! see inflow routine if (myid.eq.nrprocs-1) then do 8 m=1,gc - u(imax+m-1,:,:)=u(imax-1,:,:) - v(imax+m,:,:)= v(imax,:,:) - w(imax+m,:,:)= w(imax,:,:) - p(imax+m,:,:)= p(imax,:,:) + myu(imax+m-1,:,:)=myu(imax-1,:,:) + myv(imax+m,:,:)= myv(imax,:,:) + myw(imax+m,:,:)= myw(imax,:,:) 8 enddo endif endif - if (bcy.eq.'w') then + if (bcy.eq.'w') then ! y: do 3 m=1,gc - u(:,jmin-m,:)= u(:,jmin,:)-2._pr*(u(:,jmin,:)-ufr) - u(:,jmax+m,:)= u(:,jmax,:)-2._pr*(u(:,jmax,:)-uba) - v(:,jmin-m,:)= vfr - v(:,jmax-1+m,:)=vba - w(:,jmin-m,:)= w(:,jmin,:)-2._pr*(w(:,jmin,:)-wfr) - w(:,jmax+m,:)= w(:,jmax,:)-2._pr*(w(:,jmax,:)-wba) + myu(:,jmin-m,:)= myu(:,jmin,:)-2._pr*(myu(:,jmin,:)-wval) + myu(:,jmax+m,:)= myu(:,jmax,:)-2._pr*(myu(:,jmax,:)-wval) + myv(:,jmin-m,:)= wval + myv(:,jmax-1+m,:)=wval + myw(:,jmin-m,:)= myw(:,jmin,:)-2._pr*(myw(:,jmin,:)-wval) + myw(:,jmax+m,:)= myw(:,jmax,:)-2._pr*(myw(:,jmax,:)-wval) 3 enddo elseif (bcy.eq.'p') then do 4 m=1,gc - u(:,jmin-m,:)= u(:,jmax+1-m,:) - u(:,jmax+m,:)= u(:,jmin-1+m,:) - v(:,jmin-m,:)= v(:,jmax+1-m,:) - v(:,jmax+m,:)= v(:,jmin-1+m,:) - w(:,jmin-m,:)= w(:,jmax+1-m,:) - w(:,jmax+m,:)= w(:,jmin-1+m,:) - p(:,jmin-m,:)= p(:,jmax+1-m,:) - p(:,jmax+m,:)= p(:,jmin-1+m,:) + myu(:,jmin-m,:)= myu(:,jmax+1-m,:) + myu(:,jmax+m,:)= myu(:,jmin-1+m,:) + myv(:,jmin-m,:)= myv(:,jmax+1-m,:) + myv(:,jmax+m,:)= myv(:,jmin-1+m,:) + myw(:,jmin-m,:)= myw(:,jmax+1-m,:) + myw(:,jmax+m,:)= myw(:,jmin-1+m,:) 4 enddo endif - if (bcz.eq.'w') then + if (bcz.eq.'w') then ! z: do 5 m=1,gc - u(:,:,lmin-m)= u(:,:,lmin)-2._pr*(u(:,:,lmin)-us) - u(:,:,lmax+m)= u(:,:,lmax)-2._pr*(u(:,:,lmax)-un) - v(:,:,lmin-m)= v(:,:,lmin)-2._pr*(v(:,:,lmin)-vs) - v(:,:,lmax+m)= v(:,:,lmax)-2._pr*(v(:,:,lmax)-vn) - w(:,:,lmin-m)= ws - w(:,:,lmax-1+m)=wn + myu(:,:,lmin-m)= myu(:,:,lmin)-2._pr*(myu(:,:,lmin)-wval) + myu(:,:,lmax+m)= myu(:,:,lmax)-2._pr*(myu(:,:,lmax)-wval) + myv(:,:,lmin-m)= myv(:,:,lmin)-2._pr*(myv(:,:,lmin)-wval) + myv(:,:,lmax+m)= myv(:,:,lmax)-2._pr*(myv(:,:,lmax)-wval) + myw(:,:,lmin-m)= wval + myw(:,:,lmax-1+m)=wval 5 enddo elseif (bcz.eq.'p') then do 6 m=1,gc - u(:,:,lmin-m)= u(:,:,lmax+1-m) - u(:,:,lmax+m)= u(:,:,lmin-1+m) - v(:,:,lmin-m)= v(:,:,lmax+1-m) - v(:,:,lmax+m)= v(:,:,lmin-1+m) - w(:,:,lmin-m)= w(:,:,lmax+1-m) - w(:,:,lmax+m)= w(:,:,lmin-1+m) - p(:,:,lmin-m)= p(:,:,lmax+1-m) - p(:,:,lmax+m)= p(:,:,lmin-1+m) + myu(:,:,lmin-m)= myu(:,:,lmax+1-m) + myu(:,:,lmax+m)= myu(:,:,lmin-1+m) + myv(:,:,lmin-m)= myv(:,:,lmax+1-m) + myv(:,:,lmax+m)= myv(:,:,lmin-1+m) + myw(:,:,lmin-m)= myw(:,:,lmax+1-m) + myw(:,:,lmax+m)= myw(:,:,lmin-1+m) 6 enddo endif - - return end !#################################################################### @@ -103,243 +85,180 @@ !> @brief inflow boundary condition subroutine inflow use var + use parallel real(kind=pr),dimension(dimj*diml) :: random - real(kind=pr) :: & - alpha,dist + real(kind=pr) :: alpha,dist integer :: i,j,l,m,mm - call random_number(random) alpha=.1_pr mm=0 - do j=jmin,jmax; do l=lmin,lmax + do l=lmin,lmax; do j=jmin,jmax mm=mm+1 if (bcy.eq.'w'.and.bcz.eq.'w') dist=delta-max(abs(yc(j)),abs(zc(l))) if (bcy.eq.'w'.and.bcz.eq.'p') dist=delta-abs(yc(j)) if (bcy.eq.'p'.and.bcz.eq.'w') dist=delta-abs(zc(l)) do m=1,gc - u(imin-m,j,l)=max(0._pr,ubulk0*dist/delta + (random(mm)-.5_pr)*alpha*ubulk0) - v(imin-m,j,l)=0._pr - w(imin-m,j,l)=0._pr + u(imin-m,j,l)=max(0._pr,ubulk0*(dist/delta)**(1._pr/6._pr) + (random(mm)-.5_pr)*alpha*ubulk0) + v(imin-m,j,l)=(random(mm)-.5_pr)*alpha*ubulk0 + w(imin-m,j,l)=(random(mm)-.5_pr)*alpha*ubulk0 enddo enddo; enddo - return end - !#################################################################### !> @author Holger Grosshans -!> @brief boundary condition for electric field - subroutine bcE_el +!> @brief Neumann (zero-gradient) boundary condition + subroutine bcNeumann(myvar) use var + use parallel + real(kind=pr) :: myvar(ii,jj,ll) integer :: m - if (bcx.eq.'w') then if (myid.eq.0) then do 1 m=1,gc - Ex_el(imin-m,:,:)= Ex_el(imin,:,:) - Ey_el(imin-m,:,:)= Ey_el(imin,:,:) - Ez_el(imin-m,:,:)= Ez_el(imin,:,:) + myvar(imin-m,:,:)= myvar(imin,:,:) 1 enddo endif if (myid.eq.nrprocs-1) then do 2 m=1,gc - Ex_el(imax+m,:,:)= Ex_el(imax,:,:) - Ey_el(imax+m,:,:)= Ey_el(imax,:,:) - Ez_el(imax+m,:,:)= Ez_el(imax,:,:) + myvar(imax+m,:,:)= myvar(imax,:,:) 2 enddo endif elseif (bcx.eq.'p') then - ! done through the sync routines + call sync(myvar) ! done through the sync routines elseif (bcx.eq.'i') then if (myid.eq.0) then do 7 m=1,gc - Ex_el(imin-m,:,:)= Ex_el(imin,:,:) - Ey_el(imin-m,:,:)= Ey_el(imin,:,:) - Ez_el(imin-m,:,:)= Ez_el(imin,:,:) + myvar(imin-m,:,:)= myvar(imin,:,:) 7 enddo endif if (myid.eq.nrprocs-1) then do 8 m=1,gc - Ex_el(imax+m,:,:)= Ex_el(imax,:,:) - Ey_el(imax+m,:,:)= Ey_el(imax,:,:) - Ez_el(imax+m,:,:)= Ez_el(imax,:,:) + myvar(imax+m,:,:)= myvar(imax,:,:) 8 enddo endif endif if (bcy.eq.'w') then do 3 m=1,gc - Ex_el(:,jmin-m,:)= Ex_el(:,jmin,:) - Ex_el(:,jmax+m,:)= Ex_el(:,jmax,:) - Ey_el(:,jmin-m,:)= Ey_el(:,jmin,:) - Ey_el(:,jmax+m,:)= Ey_el(:,jmax,:) - Ez_el(:,jmin-m,:)= Ez_el(:,jmin,:) - Ez_el(:,jmax+m,:)= Ez_el(:,jmax,:) + myvar(:,jmin-m,:)= myvar(:,jmin,:) + myvar(:,jmax+m,:)= myvar(:,jmax,:) 3 enddo elseif (bcy.eq.'p') then do 4 m=1,gc - Ex_el(:,jmin-m,:)= Ex_el(:,jmax+1-m,:) - Ex_el(:,jmax+m,:)= Ex_el(:,jmin-1+m,:) - Ey_el(:,jmin-m,:)= Ey_el(:,jmax+1-m,:) - Ey_el(:,jmax+m,:)= Ey_el(:,jmin-1+m,:) - Ez_el(:,jmin-m,:)= Ez_el(:,jmax+1-m,:) - Ez_el(:,jmax+m,:)= Ez_el(:,jmin-1+m,:) + myvar(:,jmin-m,:)= myvar(:,jmax+1-m,:) + myvar(:,jmax+m,:)= myvar(:,jmin-1+m,:) 4 enddo endif if (bcz.eq.'w') then do 5 m=1,gc - Ex_el(:,:,lmin-m)= Ex_el(:,:,lmin) - Ex_el(:,:,lmax+m)= Ex_el(:,:,lmax) - Ey_el(:,:,lmin-m)= Ey_el(:,:,lmin) - Ey_el(:,:,lmax+m)= Ey_el(:,:,lmax) - Ez_el(:,:,lmin-m)= Ez_el(:,:,lmin) - Ez_el(:,:,lmax+m)= Ez_el(:,:,lmax) + myvar(:,:,lmin-m)= myvar(:,:,lmin) + myvar(:,:,lmax+m)= myvar(:,:,lmax) 5 enddo elseif (bcz.eq.'p') then do 6 m=1,gc - Ex_el(:,:,lmin-m)= Ex_el(:,:,lmax+1-m) - Ex_el(:,:,lmax+m)= Ex_el(:,:,lmin-1+m) - Ey_el(:,:,lmin-m)= Ey_el(:,:,lmax+1-m) - Ey_el(:,:,lmax+m)= Ey_el(:,:,lmin-1+m) - Ez_el(:,:,lmin-m)= Ez_el(:,:,lmax+1-m) - Ez_el(:,:,lmax+m)= Ez_el(:,:,lmin-1+m) + myvar(:,:,lmin-m)= myvar(:,:,lmax+1-m) + myvar(:,:,lmax+m)= myvar(:,:,lmin-1+m) 6 enddo endif - - return end - !#################################################################### !> @author Holger Grosshans -!> @brief boundary condition for electric potential - subroutine bcPhi_el +!> @brief Dirichlet (fixed value) boundary condition + subroutine bcDirichlet(myvar,wval) use var + use parallel + real(kind=pr) :: myvar(ii,jj,ll) real(kind=pr) :: wval integer :: m - wval= 0._pr !zero on a conductive grounded surface - if (bcx.eq.'w') then if (myid.eq.0) then do 1 m=1,gc - phi_el(imin-m,:,:)= -phi_el(imin,:,:)+2._pr*wval + myvar(imin-m,:,:)= -myvar(imin,:,:)+2._pr*wval 1 enddo endif if (myid.eq.nrprocs-1) then do 2 m=1,gc - phi_el(imax+m,:,:)= -phi_el(imax,:,:)+2._pr*wval + myvar(imax+m,:,:)= -myvar(imax,:,:)+2._pr*wval 2 enddo endif elseif (bcx.eq.'p') then - ! done through the sync routines + call sync(myvar) ! done through the sync routines elseif (bcx.eq.'i') then if (myid.eq.0) then do 7 m=1,gc - phi_el(imin-m,:,:)= phi_el(imin,:,:) + myvar(imin-m,:,:)= myvar(imin,:,:) 7 enddo endif if (myid.eq.nrprocs-1) then do 8 m=1,gc - phi_el(imax+m,:,:)= phi_el(imax,:,:) + myvar(imax+m,:,:)= myvar(imax,:,:) 8 enddo endif endif if (bcy.eq.'w') then do 3 m=1,gc - phi_el(:,jmin-m,:)= -phi_el(:,jmin,:)+2._pr*wval - phi_el(:,jmax+m,:)= -phi_el(:,jmax,:)+2._pr*wval + myvar(:,jmin-m,:)= -myvar(:,jmin,:)+2._pr*wval + myvar(:,jmax+m,:)= -myvar(:,jmax,:)+2._pr*wval 3 enddo elseif (bcy.eq.'p') then do 4 m=1,gc - phi_el(:,jmin-m,:)= phi_el(:,jmax+1-m,:) - phi_el(:,jmax+m,:)= phi_el(:,jmin-1+m,:) + myvar(:,jmin-m,:)= myvar(:,jmax+1-m,:) + myvar(:,jmax+m,:)= myvar(:,jmin-1+m,:) 4 enddo endif if (bcz.eq.'w') then do 5 m=1,gc - phi_el(:,:,lmin-m)= -phi_el(:,:,lmin)+2._pr*wval - phi_el(:,:,lmax+m)= -phi_el(:,:,lmax)+2._pr*wval + myvar(:,:,lmin-m)= -myvar(:,:,lmin)+2._pr*wval + myvar(:,:,lmax+m)= -myvar(:,:,lmax)+2._pr*wval 5 enddo elseif (bcz.eq.'p') then do 6 m=1,gc - phi_el(:,:,lmin-m)= phi_el(:,:,lmax+1-m) - phi_el(:,:,lmax+m)= phi_el(:,:,lmin-1+m) + myvar(:,:,lmin-m)= myvar(:,:,lmax+1-m) + myvar(:,:,lmax+m)= myvar(:,:,lmin-1+m) 6 enddo endif - - return end - !#################################################################### !> @author Holger Grosshans -!> @brief boundary condition for rho_el - subroutine bcRho_el +!> @brief a particle located on myid=0, i=imax imposes a source on +!> myid=0, i=imax+1 which needs to be transferred to myid=1, i=imin +!> required for rho_el,Fsx,Fsy,Fsz +!> @todo if 2 dimensions periodic, the corners between diagonal +!> procs not transferred yet + subroutine bcLEsource(myvar) use var - real(kind=pr) :: wval + use parallel + real(kind=pr) :: myvar(ii,jj,ll) integer :: m - wval= 0._pr !no charge on surface - - if (bcx.eq.'w') then - if (myid.eq.0) then - do 1 m=1,gc - rho_el(imin-m,:,:)= -rho_el(imin,:,:)+2._pr*wval -1 enddo - endif - if (myid.eq.nrprocs-1) then - do 2 m=1,gc - rho_el(imax+m,:,:)= -rho_el(imax,:,:)+2._pr*wval -2 enddo - endif - elseif (bcx.eq.'p') then - ! done through the sync routines - elseif (bcx.eq.'i') then - if (myid.eq.0) then - do 7 m=1,gc - rho_el(imin-m,:,:)= rho_el(imin,:,:) -7 enddo - endif - if (myid.eq.nrprocs-1) then - do 8 m=1,gc - rho_el(imax+m,:,:)= rho_el(imax,:,:) -8 enddo - endif + if (bcx.eq.'p') then + call syncLEsource(myvar) ! done through the sync routines endif - if (bcy.eq.'w') then - do 3 m=1,gc - rho_el(:,jmin-m,:)= -rho_el(:,jmin,:)+2._pr*wval - rho_el(:,jmax+m,:)= -rho_el(:,jmax,:)+2._pr*wval -3 enddo - elseif (bcy.eq.'p') then + if (bcy.eq.'p') then do 4 m=1,gc - rho_el(:,jmin-m,:)= rho_el(:,jmax+1-m,:) - rho_el(:,jmax+m,:)= rho_el(:,jmin-1+m,:) + myvar(:,jmax+1-m,:)= myvar(:,jmin-m,:) + myvar(:,jmax+1-m,:) + myvar(:,jmin-1+m,:)= myvar(:,jmax+m,:) + myvar(:,jmin-1+m,:) 4 enddo endif - if (bcz.eq.'w') then - do 5 m=1,gc - rho_el(:,:,lmin-m)= -rho_el(:,:,lmin)+2._pr*wval - rho_el(:,:,lmax+m)= -rho_el(:,:,lmax)+2._pr*wval -5 enddo - elseif (bcz.eq.'p') then + if (bcz.eq.'p') then do 6 m=1,gc - rho_el(:,:,lmin-m)= rho_el(:,:,lmax+1-m) - rho_el(:,:,lmax+m)= rho_el(:,:,lmin-1+m) + myvar(:,:,lmax+1-m)= myvar(:,:,lmin-m) + myvar(:,:,lmax+1-m) + myvar(:,:,lmin-1+m)= myvar(:,:,lmax+m) + myvar(:,:,lmin-1+m) 6 enddo endif - - return end diff --git a/src/electrostatics.f90 b/src/electrostatics.f90 index 142a19f..7ed97e1 100644 --- a/src/electrostatics.f90 +++ b/src/electrostatics.f90 @@ -3,200 +3,125 @@ !> @brief solve E field subroutine solveElectrostatics use var - real(kind=pr) err,err00,err2,syncMax + use parallel + real(kind=pr) :: err,err00 integer it - - if (pnd.ne.0._pr.and.syncMax(maxval(abs(q_el))).ne.0._pr) then + if (pnd.eq.0._pr.or.syncMax(maxval(abs(q_el))).eq.0._pr) return + + call chargeDensity do it=1,itmax call calcPhi_el(err) - - if (it.eq.1) err00=max(err,1e-19_pr) + if (it.eq.1) err00=max(err,1.e-19_pr) if (err/err00.lt.tol) exit enddo - call calcE_el(err2) + call calcE_el - if (myid.eq.0) & - write(*,'(a,es8.1e2,a,i3,a,es8.1e2)') & - 'E-pot. |L2/L2_0 = ',err/err00,' |L2 #',it-1,' = ',err + if (myid.eq.0) write(*,'(a,i3,a,es8.2e2,a)') 'E-pot. |L2 #',it-1,' = ',err/err00,' |' - endif - - return end !#################################################################### !> @author Holger Grosshans -!> @brief one sweep to relax phi_el field using Jacobi method -!> @param err L2 error norm - subroutine calcPhi_el(err) +!> @brief compute volumetric charge density + subroutine chargeDensity use var - real(kind=pr),dimension(ii,jj,ll) :: phi_el1 - real(kind=pr) :: diag,dex,dey,dez,err,dphi_el,syncSum - integer :: i,j,l - -! phi_el: electrostatic potential (V) -! rho_el: charge density (C/m**3) -! eps_el: permittivity vacuum/air (F/m) - - err=0._pr - phi_el1=0._pr - - do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax + real(kind=pr),dimension(2,2,2) :: weight + real(kind=pr) :: volE + integer :: n,ibeg,iend,jbeg,jend,lbeg,lend - if (celltype(i,j,l).ne.active) cycle + rho_el=0._pr -! solve the poisson equation: - diag= (2._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & - +2._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & - +2._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1)))) + do 1 n=1,np + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,0) + rho_el(ibeg:iend,jbeg:jend,lbeg:lend)= rho_el(ibeg:iend,jbeg:jend,lbeg:lend) + q_el(n)*partn(n)*weight/volE +1 enddo - dex= & - (phi_el(i+1,j,l)*(xc(i)-xc(i-1))+phi_el(i-1,j,l)*(xc(i+1)-xc(i))) & - /(0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) - dey= & - (phi_el(i,j+1,l)*(yc(j)-yc(j-1))+phi_el(i,j-1,l)*(yc(j+1)-yc(j))) & - /(0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) - dez= & - (phi_el(i,j,l+1)*(zc(l)-zc(l-1))+phi_el(i,j,l-1)*(zc(l+1)-zc(l))) & - /(0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) + call bcDirichlet(rho_el,0._pr) + call bcLEsource(rho_el) - phi_el1(i,j,l) = (rho_el(i,j,l)/eps_el + dex + dey + dez)/diag - dphi_el=phi_el1(i,j,l)-phi_el(i,j,l) - err=err+dphi_el*dphi_el + end +!#################################################################### +!> @author Holger Grosshans +!> @brief one sweep to relax phi_el poisson equation using Jacobi method +!> @param err: L2 error norm +!> @todo Jacobi converges too slow + subroutine calcPhi_el(err) + use var + use parallel + real(kind=pr),dimension(ii,jj,ll) :: dphi_el + real(kind=pr) :: diag,dex,dey,dez,err + integer :: i,j,l + + dphi_el=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + diag= ( 2._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & + +2._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & + +2._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1))) ) + + dex= (phi_el(i+1,j,l)*(xc(i)-xc(i-1))+phi_el(i-1,j,l)*(xc(i+1)-xc(i))) & + /(0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) + dey= (phi_el(i,j+1,l)*(yc(j)-yc(j-1))+phi_el(i,j-1,l)*(yc(j+1)-yc(j))) & + /(0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) + dez= (phi_el(i,j,l+1)*(zc(l)-zc(l-1))+phi_el(i,j,l-1)*(zc(l+1)-zc(l))) & + /(0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) + + dphi_el(i,j,l) = (rho_el(i,j,l)/eps_el + dex + dey + dez)/diag - phi_el(i,j,l) enddo; enddo; enddo + phi_el=phi_el + dphi_el + + call bcDirichlet(phi_el,0._pr) - phi_el=phi_el1 - call sync(phi_el) - call bcPhi_el - err=(syncSum(err)/dimgptot)**(0.5_pr) + err=sqrt(sum((vol*dphi_el)**2))/volTot + err=syncSum(err) - return end !#################################################################### !> @author Holger Grosshans -!> @brief one sweep to relax E field using Jacobi method -!> @param err L2 error norm - subroutine calcE_el(err) +!> @brief calculate E from phi_el, not an iterative process + subroutine calcE_el use var - real(kind=pr) :: dexel,deyel,dezel,temp,err,syncSum integer :: i,j,l -! phi_el: electrostatic potential (V) -! rho_el: charge density (C/m**3) -! E_el: electrostatic field (V/m) -! eps_el: permittivity vacuum/air (F/m) - - err=0._pr - - do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax - - if (celltype(i,j,l).ne.active) cycle - -! calculate electrostatic field - temp= Ex_el(i,j,l) + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax Ex_el(i,j,l)= - (phi_el(i+1,j,l)-phi_el(i-1,j,l))/(xc(i+1)-xc(i-1)) - dexel=temp-Ex_el(i,j,l) - - temp= Ey_el(i,j,l) Ey_el(i,j,l)= - (phi_el(i,j+1,l)-phi_el(i,j-1,l))/(yc(j+1)-yc(j-1)) - deyel=temp-Ey_el(i,j,l) - - temp= Ez_el(i,j,l) Ez_el(i,j,l)= - (phi_el(i,j,l+1)-phi_el(i,j,l-1))/(zc(l+1)-zc(l-1)) - dezel=temp-Ez_el(i,j,l) - - err=err+dexel*dexel+deyel*deyel+dezel*dezel - enddo; enddo; enddo - call sync(Ex_el); call sync(Ey_el); call sync(Ez_el) - call bcE_el - err=(syncSum(err)/dimgptot/3._pr)**(0.5_pr) -! write(*,'(x,a,es9.2e2,a,3(es9.2e2))') & -! 'res. E =',err + call bcNeumann(Ex_el); call bcNeumann(Ey_el); call bcNeumann(Ez_el) - return end - -!#################################################################### -!> @author Holger Grosshans -!> @brief compute volumetric charge density - subroutine chargeDensity - use var - real(kind=pr),dimension(3,3,3) :: weight - real(kind=pr) :: volE - integer :: n,ibeg,iend,jbeg,jend,lbeg,lend,i,j,l, & - iw,jw,lw,ip,jp,lp - -! rho_el(imin:imax,jmin:jmax,lmin:lmax)=0._pr - rho_el(:,jmin:jmax,lmin:lmax)=0._pr - - - do 1 n=1,np - if (celltype(ip(n),jp(n),lp(n)).ne.active) cycle - - call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,0) - - do i=ibeg,iend; do j=jbeg,jend; do l=lbeg,lend - iw=i+1-ibeg - jw=j+1-jbeg - lw=l+1-lbeg - rho_el(i,j,l) = rho_el(i,j,l) + q_el(n)*partn(n)*weight(iw,jw,lw)/volE - enddo; enddo; enddo - -1 enddo - - call bcRho_el - - return - end - - !#################################################################### !> @author Holger Grosshans !> @brief compute electric forces on particles from E-field +!> at seeding time-step E is not available, only Coulomb forces subroutine forcesGauss use var - real(kind=pr),dimension(3,3,3) :: weight + real(kind=pr),dimension(2,2,2) :: weight real(kind=pr) :: Extot,Eytot,Eztot,partmass,volE - integer :: n,ibeg,iend,jbeg,jend,lbeg,lend,i,j,l, & - iw,jw,lw,ip,jp,lp - + integer :: n,ibeg,iend,jbeg,jend,lbeg,lend do 1 n=1,np - if (celltype(ip(n),jp(n),lp(n)).ne.active) cycle - - Extot=0._pr - Eytot=0._pr - Eztot=0._pr - call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,0) - do i=ibeg,iend; do j=jbeg,jend; do l=lbeg,lend - iw=i+1-ibeg - jw=j+1-jbeg - lw=l+1-lbeg - Extot=Extot+Ex_el(i,j,l)*weight(iw,jw,lw) - Eytot=Eytot+Ey_el(i,j,l)*weight(iw,jw,lw) - Eztot=Eztot+Ez_el(i,j,l)*weight(iw,jw,lw) - enddo; enddo; enddo + Extot= sum(Ex_el(ibeg:iend,jbeg:jend,lbeg:lend)*weight) + Eytot= sum(Ey_el(ibeg:iend,jbeg:jend,lbeg:lend)*weight) + Eztot= sum(Ez_el(ibeg:iend,jbeg:jend,lbeg:lend)*weight) partmass=4._pr/3._pr*pi*rhop*partn(n)*radp(n)**3 fx_el(n)= q_el(n)*Extot/partmass fy_el(n)= q_el(n)*Eytot/partmass fz_el(n)= q_el(n)*Eztot/partmass - 1 enddo - - return end !#################################################################### @@ -204,17 +129,15 @@ !> @brief compute electric forces on particles from Coulomb's law subroutine forcesCoulomb use var - real(kind=pr) :: dis,dis3,disx,disy,disz, & - Extot,Eytot,Eztot,partmass - integer :: n1,n2,ip,jp,lp,m1,m2,i,j,l + use parallel + integer :: n1,n2,m1,m2,i,j,l + rtau_el_max=0._pr select case (elforceScheme) - case (2) - fx_el=0._pr - fy_el=0._pr - fz_el=0._pr + case (2) ! only Coulomb law + fx_el=0._pr; fy_el=0._pr; fz_el=0._pr do 1 n1=2,np do 2 n2=1,(n1-1) if (n1.eq.n2) cycle @@ -222,69 +145,59 @@ 2 enddo 1 enddo - case (3) - do i=1,ii; do j=1,jj; do l=1,ll - - do 4 m1=2,npic(i,j,l) - do 5 m2=1,(m1-1) - n1=nic(i,j,l,m1) - n2=nic(i,j,l,m2) - call forcesCoulombN1N2(n1,n2) -5 enddo -4 enddo + case (3) ! hybrid scheme, only particles in same cell + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + do 4 m1=2,npic(i,j,l) + do 5 m2=1,(m1-1) + n1=nic(i,j,l,m1) + n2=nic(i,j,l,m2) + call forcesCoulombN1N2(n1,n2) +5 enddo +4 enddo enddo; enddo; enddo end select - return - end + rtau_el_max=syncMax(rtau_el_max) + contains -!#################################################################### -!> @author Holger Grosshans !> @brief compute Coulomb force of n2 acting on n1 - subroutine forcesCoulombN1N2(n1,n2) - use var - real(kind=pr) :: dis,dis3,disx,disy,disz,partmass - integer :: n1,n2,ip,jp,lp - - - disx=xp(n1)-xp(n2) - disy=yp(n1)-yp(n2) - disz=zp(n1)-zp(n2) - dis=(disx**2+disy**2+disz**2)**0.5 - dis3=dis**3 + subroutine forcesCoulombN1N2(n1,n2) + use var + real(kind=pr) :: dis,dis3,disx,disy,disz,partmass1,partmass2,rtau_el + integer :: n1,n2 - partmass=4._pr/3._pr*pi*rhop*partn(n1)*radp(n1)**3 - - fx_el(n1)= fx_el(n1) & - + q_el(n1)*q_el(n2)*disx/4._pr/pi/eps_el/dis3/partmass - fy_el(n1)= fy_el(n1) & - + q_el(n1)*q_el(n2)*disy/4._pr/pi/eps_el/dis3/partmass - fz_el(n1)= fz_el(n1) & - + q_el(n1)*q_el(n2)*disz/4._pr/pi/eps_el/dis3/partmass - - partmass=4._pr/3._pr*pi*rhop*partn(n2)*radp(n2)**3 - - fx_el(n2)= fx_el(n2) & - - q_el(n1)*q_el(n2)*disx/4._pr/pi/eps_el/dis3/partmass - fy_el(n2)= fy_el(n2) & - - q_el(n1)*q_el(n2)*disy/4._pr/pi/eps_el/dis3/partmass - fz_el(n2)= fz_el(n2) & - - q_el(n1)*q_el(n2)*disz/4._pr/pi/eps_el/dis3/partmass + disx=xp(n1)-xp(n2) + disy=yp(n1)-yp(n2) + disz=zp(n1)-zp(n2) + dis=sqrt(disx**2+disy**2+disz**2) + dis3=dis**3 + partmass1=4._pr/3._pr*pi*rhop*partn(n1)*radp(n1)**3 + partmass2=4._pr/3._pr*pi*rhop*partn(n2)*radp(n2)**3 + rtau_el= sqrt(abs(q_el(n1)*q_el(n2))/4._pr/pi/eps_el/dis**2/min(partmass1,partmass2)/2._pr/dis) ! =sqrt(2*dis/acceleration) + rtau_el_max=max(rtau_el_max,rtau_el) + if (rtau_el.gt.(1._pr/dtNext)) dis3=dis3*(dtNext*rtau_el)**2 ! scale dis for stability + + fx_el(n1)= fx_el(n1) + q_el(n1)*q_el(n2)*disx/4._pr/pi/eps_el/dis3/partmass1 + fy_el(n1)= fy_el(n1) + q_el(n1)*q_el(n2)*disy/4._pr/pi/eps_el/dis3/partmass1 + fz_el(n1)= fz_el(n1) + q_el(n1)*q_el(n2)*disz/4._pr/pi/eps_el/dis3/partmass1 + + fx_el(n2)= fx_el(n2) - q_el(n1)*q_el(n2)*disx/4._pr/pi/eps_el/dis3/partmass2 + fy_el(n2)= fy_el(n2) - q_el(n1)*q_el(n2)*disy/4._pr/pi/eps_el/dis3/partmass2 + fz_el(n2)= fz_el(n2) - q_el(n1)*q_el(n2)*disz/4._pr/pi/eps_el/dis3/partmass2 + end - return end - !#################################################################### !> @author Holger Grosshans !> @brief compute particle-wall charging subroutine chargeParticleWall(n,direction) use var real(kind=pr) :: ut2,un2,alpha1,AoAtot,dqp,random(2),random_normal - integer :: n,i,direction + integer :: n,direction character(70) :: filename @@ -311,20 +224,18 @@ call random_number(random) random_normal=cos(2._pr*pi*random(1))*sqrt(-2._pr*log(random(2)+1.e-12_pr)) ! Box-Muller method - dqp=Qaccfactor*(qpmax-q_el(n))*(random_normal+1._pr) ! ...(mu*random_normal+sigma) - q_el(n)=max(min(q_el(n)+dqp,qpmax),qp0) + dqp=Qaccfactor*(qpmax-q_elNext(n))*(random_normal+1._pr) ! ...(mu*random_normal+sigma) + q_elNext(n)=max(min(q_elNext(n)+dqp,qpmax),qp0) write(filename,'(a,i3.3,a)') 'results/particlesWall_p',myid,'.dat' open(access='append',unit=10,file=filename) - write(10,77) nt,t,sqrt(ut2),sqrt(un2),dqp,q_el(n) + write(10,77) nt,t,sqrt(ut2),sqrt(un2),dqp,q_elNext(n) 77 format(i7,5(x,es11.3e2)) close(10) - return end - !#################################################################### !> @author Holger Grosshans !> @brief compute particle-particle charging @@ -349,17 +260,15 @@ call random_number(random) random_normal=cos(2._pr*pi*random(1))*sqrt(-2._pr*log(random(2)+1.e-12_pr)) ! Box-Muller method - dqp=Qaccfactor*(q_el(n2)-q_el(n1))*(random_normal+1._pr) - q_el(n1)=max(min(q_el(n1)+dqp,qpmax),qp0) - q_el(n2)=max(min(q_el(n2)-dqp,qpmax),qp0) + dqp=Qaccfactor*(q_elNext(n2)-q_elNext(n1))*(random_normal+1._pr) + q_elNext(n1)=max(min(q_elNext(n1)+dqp,qpmax),qp0) + q_elNext(n2)=max(min(q_elNext(n2)-dqp,qpmax),qp0) write(filename,'(a,i3.3,a)') 'results/particlesPart_p',myid,'.dat' open(access='append',unit=10,file=filename) - write(10,77) nt,t,q_el(n1),q_el(n2),dqp + write(10,77) nt,t,q_elNext(n1),q_elNext(n2),dqp 77 format(i7,4(x,es11.3e2)) close(10) - - return end diff --git a/src/fluid.f90 b/src/fluid.f90 index b96194d..30cab7f 100644 --- a/src/fluid.f90 +++ b/src/fluid.f90 @@ -1,70 +1,305 @@ !#################################################################### !> @author Holger Grosshans !> @brief solves coupled pressure-velocity and calculates L2 norms +!> @param err: L2 error norm subroutine solveFluid use var - real(kind=pr) err,err1,err2,err0,err10,err20, & - err00,err100,err200,lambda11,lambda12 - integer it + use parallel + real(kind=pr),dimension(ii,jj,ll) :: du,dv,dw,dp,ddp,massRes + real(kind=pr) :: err(4),err0(4),errL2 + integer itout,it,itmommax,itpCorr1max,itpCorr2max,velCorr1,velCorr2 + +!> itmax: outer iterations + itmommax=1; itpCorr1max=1; itpCorr2max=0 ! sequential SIMPLE + !itmommax=4; itpCorr1max=4; itpCorr2max=0 ! SIMPLE + !itmommax=4; itpCorr1max=4; itpCorr2max=4 ! PISO + velCorr1=0; velCorr2=0 ! velocity correction yes/no (1/0) - call ddt - call deferredCorrection if ((bcx.eq.'i').and.(myid.eq.0)) call inflow - do 1 it=1,itmax - call momentum(err1) - call pressure(err2) - err=(3._pr*err1+err2)/4._pr - if (it.eq.1) then - err00=err; err10=err1; err20=err2 - if (err.eq.0._pr) err00=1._pr - if (err1.eq.0._pr) err10=1._pr - if (err2.eq.0._pr) err20=1._pr + do 1 itout=1,itmax + + if ((mod(it,10).eq.0).and.(npTot.ne.0)) call momentumCoupling + + do 2 it=1,itmommax ! solve momentum eq + call momx(du); call momy(dv); call momz(dw) + call bcUVW(du,dv,dw) + u=u+du*urfu; v=v+dv*urfv; w=w+dw*urfw +2 enddo + + call mass(massRes,u,v,w) ! first pressure correction + dp=0._pr + do 3 it=1,itpCorr1max + call pressureCorrection(dp,massRes) + call bcNeumann(dp) +3 enddo + p= p+dp*urfp + + if (velCorr2.eq.1) then ! first velocity correction + call velocityCorrection(du,dv,dw,dp) + call bcUVW(du,dv,dw) + u=u+du*urfu; v=v+dv*urfv; w=w+dw*urfw endif - if (err/err00.lt.tol) exit + + if (itpCorr2max.ge.1) then + call mass(massRes,du,dv,dw) ! second pressure correction + dp=0._pr + do 4 it=1,itpCorr2max + call pressureCorrection(dp,massRes) + call bcNeumann(dp) +4 enddo + p= p+dp*urfp + + if (velCorr2.eq.1) then ! second velocity correction + call velocityCorrection(du,dv,dw,dp) + call bcUVW(du,dv,dw) + u=u+du*urfu; v=v+dv*urfv; w=w+dw*urfw + endif + endif + + err=sqrt([sum(volu*du),sum(volv*dv),sum(volw*dw),sum(vol*dp)]**2)/volTot + err(1)=syncSum(err(1)); err(2)=syncSum(err(2)); err(3)=syncSum(err(3)); err(4)=syncSum(err(4)) + !if (myid.eq.0) write(*,'(x,a,4(es9.2e2))') 'res. inner it. u,v,w,p =',err + if (itout.eq.1) err0=max(err,1.e-20_pr) + errL2=sum(err/err0)/4._pr + if (errL2.lt.tol) exit ! converged + 1 enddo + if (myid.eq.0) write(*,'(a,i3,3(a,es8.2e2))') 'fluid |L2 #',itout-1,' = ',errL2, & + ' |mom. = ',sum(err(1:3)/err0(1:3))/3._pr,' |pc. = ',err(4)/err0(4) + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief pressure corrrection step + subroutine pressureCorrection(dp,massRes) + use var + real(kind=pr),dimension(ii,jj,ll) :: dp,ddp,massRes + integer :: i,j,l + + ddp=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + ddp(i,j,l)= ( Cb1(i,j,l)*dp(i+1,j,l) + Cb2(i,j,l)*dp(i-1,j,l) & + + Cc1(i,j,l)*dp(i,j+1,l) + Cc2(i,j,l)*dp(i,j-1,l) & + + Cd1(i,j,l)*dp(i,j,l+1) + Cd2(i,j,l)*dp(i,j,l-1) & + + massRes(i,j,l)*rhof/dt ) / Ca(i,j,l) - dp(i,j,l) + enddo; enddo; enddo + dp=dp+ddp + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine velocityCorrection(mydu,mydv,mydw,mydp) + use var + real(kind=pr),dimension(ii,jj,ll) :: mydu,mydv,mydw,mydp + real(kind=pr) :: ux,vy,wz + integer :: i,j,l + + mydu=0._pr; mydv=0._pr; mydw=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + if (celltype(i+1,j,l).ne.wall) mydu(i,j,l)= dt/(xc(i+1)-xc(i))/rhof*(mydp(i+1,j,l)-mydp(i,j,l)) + if (celltype(i,j+1,l).ne.wall) mydv(i,j,l)= dt/(yc(j+1)-yc(j))/rhof*(mydp(i,j+1,l)-mydp(i,j,l)) + if (celltype(i,j,l+1).ne.wall) mydw(i,j,l)= dt/(zc(l+1)-zc(l))/rhof*(mydp(i,j,l+1)-mydp(i,j,l)) + enddo; enddo; enddo + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief compute mass residual + subroutine mass(massRes,myu,myv,myw) + use var + real(kind=pr),dimension(ii,jj,ll) :: massRes,myu,myv,myw + real(kind=pr) :: ux,vy,wz + integer :: i,j,l + + massRes= 0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + if (celltype(i,j,l).ne.active) cycle + ux= (myu(i,j,l)-myu(i-1,j,l))/(xf(i)-xf(i-1)) ! 2nd order central + vy= (myv(i,j,l)-myv(i,j-1,l))/(yf(j)-yf(j-1)) + wz= (myw(i,j,l)-myw(i,j,l-1))/(zf(l)-zf(l-1)) + massRes(i,j,l)=-(ux+vy+wz) + enddo; enddo; enddo - if (myid.eq.0) & - write(*,'(3(a,es8.1e2))') & - 'fluid |L2/L2_0 = ' & - ,err/err00,' |mom. = ',err1/err10,' |pc. = ',err2/err20 - if (myid.eq.0) & - write(*,'(a,i3,3(a,es8.1e2))') & - 'fluid |L2 #',it-1,' = ',err,' |mom. = ',err1,' |pc. = ',err2 + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief momentum eq in x-direction, one sweep using Jacobi method + subroutine momx(du) + use var + real(kind=pr),dimension(ii,jj,ll) :: tu,qu,du + real(kind=pr) :: ua,va,wa,px,uux,vuy,wuz, & + uxx,uyy,uzz,dudt,Cdudt,Cviscx,erru + integer :: i,j,l + + tu=0._pr; qu=0._pr; du=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + if (celltype(i+1,j,l).eq.wall) cycle + +! bilinear interpolation + ua= u(i,j,l) + va= 0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i+1,j,l)+v(i+1,j-1,l)) + wa= 0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i+1,j,l)+w(i+1,j,l-1)) + +! convective terns (2nd order central) + uux= ua*(u(i+1,j,l)-u(i-1,j,l))/(xf(i+1)-xf(i-1)) + vuy= va*(u(i,j+1,l)-u(i,j-1,l))/(yc(j+1)-yc(j-1)) + wuz= wa*(u(i,j,l+1)-u(i,j,l-1))/(zc(l+1)-zc(l-1)) + +! pressure gradient (2nd order central) + px= (p(i+1,j,l)-p(i,j,l))/(xc(i+1)-xc(i)) + +! viscous terms (2nd order central) + uxx= (u(i+1,j,l)*(xf(i)-xf(i-1))+u(i-1,j,l)*(xf(i+1)-xf(i))-u(i,j,l)*(xf(i+1)-xf(i-1)))/ & + (0.5_pr*(xf(i+1)-xf(i-1))*(xf(i+1)-xf(i))*(xf(i)-xf(i-1))) + uyy= (u(i,j+1,l)*(yc(j)-yc(j-1))+u(i,j-1,l)*(yc(j+1)-yc(j))-u(i,j,l)*(yc(j+1)-yc(j-1)))/ & + (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) + uzz= (u(i,j,l+1)*(zc(l)-zc(l-1))+u(i,j,l-1)*(zc(l+1)-zc(l))-u(i,j,l)*(zc(l+1)-zc(l-1)))/ & + (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) + +! time integration (2nd order) + dudt= ((1._pr+tau01)*u(i,j,l)-(1._pr+tau01+tau02)*u01(i,j,l)+tau02*u02(i,j,l))/ & + (2._pr*tau01*dt) + +! momentum eq -lhs+rhs (m/s**2) + tu(i,j,l)= - dudt -(uux+vuy+wuz) -(px+dpdx)/rhof + nuf*(uxx+uyy+uzz) + Fsx(i,j,l) + +! coefficients of u(i,j,l) of momentum eq + Cdudt= (1._pr+tau01)/(2._pr*tau01*dt) + Cviscx= -2._pr*nuf * ( 1._pr/((xf(i+1)-xf(i))*(xf(i)-xf(i-1))) & + + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & + + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1))) ) + +! coefficients lhs-rhs + qu(i,j,l)= Cdudt - Cviscx + + du(i,j,l)=tu(i,j,l)/qu(i,j,l) + + enddo; enddo; enddo - return end +!#################################################################### +!> @author Holger Grosshans +!> @brief momentum eq in y-direction, one sweep using Jacobi method + subroutine momy(dv) + use var + real(kind=pr),dimension(ii,jj,ll) :: tv,qv,dv + real(kind=pr) :: ua,va,wa,py,uvx,vvy,wvz, & + vxx,vyy,vzz,dvdt,Cdvdt,Cviscy + integer :: i,j,l + + tv=0._pr; qv=0._pr; dv=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + if (celltype(i,j+1,l).eq.wall) cycle + +! bilinear interpolation + ua= 0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j+1,l)+u(i-1,j+1,l)) + va= v(i,j,l) + wa= 0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i,j+1,l)+w(i,j+1,l-1)) + +! convective terns (2nd order central) + uvx= ua*(v(i+1,j,l)-v(i-1,j,l))/(xc(i+1)-xc(i-1)) + vvy= va*(v(i,j+1,l)-v(i,j-1,l))/(yf(j+1)-yf(j-1)) + wvz= wa*(v(i,j,l+1)-v(i,j,l-1))/(zc(l+1)-zc(l-1)) + +! pressure gradient (2nd order) + py=(p(i,j+1,l)-p(i,j,l))/(yc(j+1)-yc(j)) + +! viscous terms (2nd order) + vxx= (v(i+1,j,l)*(xc(i)-xc(i-1))+v(i-1,j,l)*(xc(i+1)-xc(i))-v(i,j,l)*(xc(i+1)-xc(i-1)))/ & + (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) + vyy= (v(i,j+1,l)*(yf(j)-yf(j-1))+v(i,j-1,l)*(yf(j+1)-yf(j))-v(i,j,l)*(yf(j+1)-yf(j-1)))/ & + (0.5_pr*(yf(j+1)-yf(j-1))*(yf(j+1)-yf(j))*(yf(j)-yf(j-1))) + vzz= (v(i,j,l+1)*(zc(l)-zc(l-1))+v(i,j,l-1)*(zc(l+1)-zc(l))-v(i,j,l)*(zc(l+1)-zc(l-1)))/ & + (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) + +! time integration (2nd order) + dvdt = ((1._pr+tau01)*v(i,j,l)-(1._pr+tau01+tau02)*v01(i,j,l)+tau02*v02(i,j,l))/ & + (2._pr*tau01*dt) + +! momentum eq. -lhs+rhs + tv(i,j,l)= - dvdt - (uvx+vvy+wvz) - py/rhof + nuf*(vxx+vyy+vzz) + Fsy(i,j,l) + +! coefficients of v(i,j,l) of momentum eq + Cdvdt= (1._pr+tau01)/(2._pr*tau01*dt) + Cviscy= -2._pr*nuf * ( 1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & + + 1._pr/((yf(j+1)-yf(j))*(yf(j)-yf(j-1))) & + + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1))) ) + +! coefficients lhs-rhs + qv(i,j,l)= Cdvdt - Cviscy + + dv(i,j,l)=tv(i,j,l)/qv(i,j,l) + + enddo; enddo; enddo + + end !#################################################################### !> @author Holger Grosshans -!> @brief calculate the adaptive time-step size - subroutine timestep +!> @brief momentum eq in z-direction, one sweep using Jacobi method + subroutine momz(dw) use var - real(kind=pr) syncMax,umax + real(kind=pr),dimension(ii,jj,ll) :: tw,qw,dw + real(kind=pr) :: ua,va,wa,pz,uwx,vwy,wwz, & + wxx,wyy,wzz,dwdt,Cdwdt,Cviscz + integer :: i,j,l + + tw=0._pr; qw=0._pr; dw=0._pr + + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + if (celltype(i,j,l+1).eq.wall) cycle + +! bilinear interpolation + ua= 0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j,l+1)+u(i-1,j,l+1)) + va= 0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i,j,l+1)+v(i,j-1,l+1)) + wa= w(i,j,l) + +! convective terns (2nd order central) + uwx= ua*(w(i+1,j,l)-w(i-1,j,l))/(xc(i+1)-xc(i-1)) + vwy= va*(w(i,j+1,l)-w(i,j-1,l))/(yc(j+1)-yc(j-1)) + wwz= wa*(w(i,j,l+1)-w(i,j,l-1))/(zf(l+1)-zf(l-1)) + +! pressure gradient (2nd order) + pz=(p(i,j,l+1)-p(i,j,l))/(zc(l+1)-zc(l)) - umax= syncMax(maxval(abs(u))) +! viscous terms (2nd order) + wxx= (w(i+1,j,l)*(xc(i)-xc(i-1))+w(i-1,j,l)*(xc(i+1)-xc(i))-w(i,j,l)*(xc(i+1)-xc(i-1)))/ & + (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) + wyy= (w(i,j+1,l)*(yc(j)-yc(j-1))+w(i,j-1,l)*(yc(j+1)-yc(j))-w(i,j,l)*(yc(j+1)-yc(j-1)))/ & + (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) + wzz= (w(i,j,l+1)*(zf(l)-zf(l-1))+w(i,j,l-1)*(zf(l+1)-zf(l))-w(i,j,l)*(zf(l+1)-zf(l-1)))/ & + (0.5_pr*(zf(l+1)-zf(l-1))*(zf(l+1)-zf(l))*(zf(l)-zf(l-1))) - if ((nt.eq.1).or.(umax.eq.0._pr)) then - dt= cfl*dimx/dimi/10._pr - dt01=dt - dt02=dt01 - else - dt02=dt01 - dt01=dt - dt= cfl*dimx/dimi/umax - endif +! second-order time integration + dwdt= ((1._pr+tau01)*w(i,j,l)-(1._pr+tau01+tau02)*w01(i,j,l)+tau02*w02(i,j,l))/ & + (2._pr*tau01*dt) + +! momentum eq. -lhs+rhs + tw(i,j,l)= - dwdt - (uwx+vwy+wwz) - pz/rhof + nuf*(wxx+wyy+wzz) + Fsz(i,j,l) -! fixed time-step: -! dt=cfl*minval(hx)/ubulk -! dt01=dt -! dt02=dt +! coefficients of u(i,j,l) of momentum eq + Cdwdt= (1._pr+tau01)/(2._pr*tau01*dt) + Cviscz= -2._pr*nuf * ( 1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & + + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & + + 1._pr/((zf(l+1)-zf(l))*(zf(l)-zf(l-1))) ) - tau01=dt/(dt+dt01) - tau02=dt01/(dt01+dt02) - t=t+dt +! coefficients lhs-rhs + qw(i,j,l)= Cdwdt - Cviscz + + dw(i,j,l)=tw(i,j,l)/qw(i,j,l) + enddo; enddo; enddo - return end diff --git a/src/main.f90 b/src/main.f90 index 91feab5..d042447 100644 --- a/src/main.f90 +++ b/src/main.f90 @@ -1,35 +1,49 @@ +! Copyright 2015-2021 Holger Grosshans +! +! 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 <https://www.gnu.org/licenses/>. + +!#################################################################### !> @author Holger Grosshans !> @brief pafiX - particle flow simulation in eXplosion protection program pafiX use var + use parallel use mpi - real(kind=pr) :: syncAv - + implicit none call initParallel if (myid.eq.0) write(*,'(/a/a)') repeat('#',72),version - if (myid.eq.0) write(*,'(a/a)') repeat('#',72),'Pre-processing' + if (myid.eq.0) write(*,'(a/a)') repeat('#',72),'Pre-processing' call preProcessing - if (myid.eq.0) write(*,'(a/a)') repeat('#',72),'Start computation' + if (myid.eq.0) write(*,'(a/a)') repeat('#',72),'Start computation' do 10 nt=ntstart,ntend - if (myid.eq.0) write(*,'(a/a,i7,x,a,i7,x,a)') & - repeat('#',72),'nt=',nt,'of',ntend,'time-steps' + if (myid.eq.0) write(*,'(a/a,i7,x,a,i7,x,a)') repeat('#',72),'nt=',nt,'of',ntend,'time-steps' call syncCheck - call timestep - - call solveFluid - call solveElectrostatics - call solveParticles - - call postProcessing - - timecom(1)=syncAv(timecom) + call prepareTimestep ! nt-1 to nt + call solveFluid ! nt-1 to nt + call solveElectrostatics ! nt + call nextTimestepSize ! nt to nt+1 + call solveParticles ! nt to nt+1 + call postProcessing ! nt + + timecom(1)=syncSum(timecom(1))/nrprocs + timecom(9)=real(mpi_wtime(),kind=pr)-timebeg+timecom(10) if (myid.eq.0) write(*,'(3(a,es8.2e2))') & - 'time (s) |physical= ',t, & - ' |comput. = ',(mpi_wtime()-timebeg), & - ' |MPI com = ',timecom(1) + 'time (s) |physical= ',t,' |comput. = ',timecom(9),' |MPI com = ',timecom(1) + call flush 10 enddo diff --git a/src/makefile b/src/makefile index 6ed0367..fd7dbe2 100644 --- a/src/makefile +++ b/src/makefile @@ -1,24 +1,18 @@ #%.o : %.mod -OBJ = var.o main.o pre.o bc.o restart.o fluid.o \ - momentum.o post.o schemes.o \ - pressure.o writevtk_fluid_xz.o \ - parallel.o writevtk_grid.o particles.o \ - mom1.o mom5.o particlesTransport.o \ - mass.o electrostatics.o \ - writevtk_particles.o writedat_particles.o \ - writevtk_fluid_xy.o writevtk_fluid_xyz.o \ - writevtk_fluid_yz.o writedat_fluid_xz.o \ - writedat_fluid_xy.o +OBJ = var.o parallel.o main.o pre.o bc.o restart.o fluid.o \ + timestep.o post.o particles.o particlesTransport.o \ + electrostatics.o writedat_particles.o write_vtk.o INC = # gcc: CMP = mpifort #O3: optimization -FLAGS = -O3 -mcmodel=medium +#FLAGS = -O3 -mcmodel=medium #debugging: -#FLAGS = -g3 -O0 -fbounds-check -mcmodel=medium -fimplicit-none -fcheck=all -fbacktrace -floop-nest-optimize -ffpe-trap=invalid,zero,overflow -Wconversion -fno-tree-vectorize +FLAGS = -g3 -O0 -fbounds-check -mcmodel=medium -fimplicit-none -fcheck=all -fbacktrace -floop-nest-optimize -ffpe-trap=invalid,zero,overflow -Wconversion -fno-tree-vectorize +#-Wall FFLAGS = -c $(FLAGS) @@ -26,6 +20,8 @@ newfu: $(OBJ) $(CMP) $(FLAGS) -o pafiX $(OBJ) var.o: var.f90 $(INC) $(CMP) $(FFLAGS) var.f90 +parallel.o: parallel.f90 $(INC) + $(CMP) $(FFLAGS) parallel.f90 main.o: main.f90 $(INC) $(CMP) $(FFLAGS) main.f90 pre.o: pre.f90 $(INC) @@ -38,44 +34,18 @@ restart.o: restart.f90 $(INC) $(CMP) $(FFLAGS) restart.f90 fluid.o: fluid.f90 $(INC) $(CMP) $(FFLAGS) fluid.f90 -momentum.o: momentum.f90 $(INC) - $(CMP) $(FFLAGS) momentum.f90 -pressure.o: pressure.f90 $(INC) - $(CMP) $(FFLAGS) pressure.f90 -mass.o: mass.f90 $(INC) - $(CMP) $(FFLAGS) mass.f90 -writevtk_fluid_xy.o: writevtk_fluid_xy.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_fluid_xy.f90 -writevtk_fluid_xz.o: writevtk_fluid_xz.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_fluid_xz.f90 -writevtk_fluid_yz.o: writevtk_fluid_yz.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_fluid_yz.f90 -writevtk_fluid_xyz.o: writevtk_fluid_xyz.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_fluid_xyz.f90 -writedat_fluid_xy.o: writedat_fluid_xy.f90 $(INC) - $(CMP) $(FFLAGS) writedat_fluid_xy.f90 -writedat_fluid_xz.o: writedat_fluid_xz.f90 $(INC) - $(CMP) $(FFLAGS) writedat_fluid_xz.f90 -writevtk_particles.o: writevtk_particles.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_particles.f90 -writedat_particles.o: writedat_particles.f90 $(INC) - $(CMP) $(FFLAGS) writedat_particles.f90 -parallel.o: parallel.f90 $(INC) - $(CMP) $(FFLAGS) parallel.f90 -writevtk_grid.o: writevtk_grid.f90 $(INC) - $(CMP) $(FFLAGS) writevtk_grid.f90 +timestep.o: timestep.f90 $(INC) + $(CMP) $(FFLAGS) timestep.f90 particles.o: particles.f90 $(INC) $(CMP) $(FFLAGS) particles.f90 particlesTransport.o: particlesTransport.f90 $(INC) $(CMP) $(FFLAGS) particlesTransport.f90 -mom1.o: mom1.f90 $(INC) - $(CMP) $(FFLAGS) mom1.f90 -mom5.o: mom5.f90 $(INC) - $(CMP) $(FFLAGS) mom5.f90 electrostatics.o: electrostatics.f90 $(INC) $(CMP) $(FFLAGS) electrostatics.f90 -schemes.o: schemes.f90 $(INC) - $(CMP) $(FFLAGS) schemes.f90 +write_vtk.o: write_vtk.f90 $(INC) + $(CMP) $(FFLAGS) write_vtk.f90 +writedat_particles.o: writedat_particles.f90 $(INC) + $(CMP) $(FFLAGS) writedat_particles.f90 clean: rm *.o *.mod diff --git a/src/mass.f90 b/src/mass.f90 deleted file mode 100644 index 7220ac1..0000000 --- a/src/mass.f90 +++ /dev/null @@ -1,36 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief 2nd order discretization of mass conservation - subroutine mass2(rmc,i,j,l) - use var - real(kind=pr) rmc,ux,vy,wz - integer i,j,l - - ux= (u(i,j,l)-u(i-1,j,l))/(xf(i)-xf(i-1)) - vy= (v(i,j,l)-v(i,j-1,l))/(yf(j)-yf(j-1)) - wz= (w(i,j,l)-w(i,j,l-1))/(zf(l)-zf(l-1)) - - rmc=-(ux+vy+wz) - - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief 4th order discretization of mass conservation - subroutine mass4(rmc,i,j,l) - use var - real(kind=pr) :: rmc,ux,vy,wz,d1o4 - integer :: i,j,l - - ux=d1o4(xc(i),u(i-2,j,l),u(i-1,j,l),u(i,j,l),u(i+1,j,l),xf(i-2),xf(i-1),xf(i),xf(i+1)) - vy=d1o4(yc(j),v(i,j-2,l),v(i,j-1,l),v(i,j,l),v(i,j+1,l),yf(j-2),yf(j-1),yf(j),yf(j+1)) - wz=d1o4(zc(l),w(i,j,l-2),w(i,j,l-1),w(i,j,l),w(i,j,l+1),zf(l-2),zf(l-1),zf(l),zf(l+1)) - - rmc=-(ux+vy+wz) - - - return - end diff --git a/src/mom1.f90 b/src/mom1.f90 deleted file mode 100644 index e99b4c2..0000000 --- a/src/mom1.f90 +++ /dev/null @@ -1,228 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief first order discretization of momentum eq in x-direction - subroutine momx1(tu,qu,i,j,l) - use var - real(kind=pr) :: ua,va,wa,tu,qu,px,uux,vuy,wuz, & - uxx,uyy,uzz,temporal,conx,pressx,viscx, & - Ctemporal,Cconx,Cpressx,Cviscx,Cuux,Cvuy,Cwuz - integer :: i,j,l - -! bilinear interpolation - ua= u(i,j,l) - va= 0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i+1,j,l)+v(i+1,j-1,l)) - wa= 0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i+1,j,l)+w(i+1,j,l-1)) - -! upwind (1st order) - if (ua.ge.0._pr) then - uux= ua*(u(i,j,l)-u(i-1,j,l))/(xf(i)-xf(i-1)) - Cuux= ua/(xf(i)-xf(i-1)) - else - uux= ua*(u(i+1,j,l)-u(i,j,l))/(xf(i+1)-xf(i)) - Cuux= -ua/(xf(i+1)-xf(i)) - endif - - if (va.ge.0._pr) then - vuy= va*(u(i,j,l)-u(i,j-1,l))/(yc(j)-yc(j-1)) - Cvuy= va/(yc(j)-yc(j-1)) - else - vuy= va*(u(i,j+1,l)-u(i,j,l))/(yc(j+1)-yc(j)) - Cvuy= -va/(yc(j+1)-yc(j)) - endif - - if (wa.ge.0._pr) then - wuz= wa*(u(i,j,l)-u(i,j,l-1))/(zc(l)-zc(l-1)) - Cwuz= wa/(zc(l)-zc(l-1)) - else - wuz= wa*(u(i,j,l+1)-u(i,j,l))/(zc(l+1)-zc(l)) - Cwuz= -wa/(zc(l+1)-zc(l)) - endif - -! pressure gradient (2nd order) - px= (p(i+1,j,l)-p(i,j,l))/(xc(i+1)-xc(i)) - -! viscous terms (2nd order) - uxx= (u(i+1,j,l)*(xf(i)-xf(i-1))+u(i-1,j,l)*(xf(i+1)-xf(i))-u(i,j,l)*(xf(i+1)-xf(i-1)))/ & - (0.5_pr*(xf(i+1)-xf(i-1))*(xf(i+1)-xf(i))*(xf(i)-xf(i-1))) - uyy= (u(i,j+1,l)*(yc(j)-yc(j-1))+u(i,j-1,l)*(yc(j+1)-yc(j))-u(i,j,l)*(yc(j+1)-yc(j-1)))/ & - (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) - uzz= (u(i,j,l+1)*(zc(l)-zc(l-1))+u(i,j,l-1)*(zc(l+1)-zc(l))-u(i,j,l)*(zc(l+1)-zc(l-1)))/ & - (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*u(i,j,l)+dudt(i,j,l))/(2._pr*tau01*dt) - conx = uux+vuy+wuz - pressx = (px+dpdx)/rhof - viscx = nuf*(uxx+uyy+uzz) - -! rhs-lhs (m/s**2) - tu = -temporal -conx -pressx + viscx + fsx(i,j,l) - -! coefficients of u(i,j,l) of momentum eq - Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) - Cconx = Cuux+Cvuy+Cwuz - Cviscx = -2._pr*nuf & - *(1._pr/((xf(i+1)-xf(i))*(xf(i)-xf(i-1))) & - + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & - + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1)))) - -! coefficients lhs-rhs - qu= Ctemporal +Cconx -Cviscx - - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief first order discretization of momentum eq in y-direction - subroutine momy1(tv,qv,i,j,l) - use var - real(kind=pr) :: ua,va,wa,tv,qv,py,uvx,vvy,wvz, & - vxx,vyy,vzz,temporal,cony,pressy,viscy, & - Ctemporal,Ccony,Cpressy,Cviscy,Cuvx,Cvvy,Cwvz - integer :: i,j,l - -! bilinear interpolation - ua= 0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j+1,l)+u(i-1,j+1,l)) - va= v(i,j,l) - wa= 0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i,j+1,l)+w(i,j+1,l-1)) - -! upwind (1st order) - if (ua.ge.0._pr) then - uvx= ua*(v(i,j,l)-v(i-1,j,l))/(xc(i)-xc(i-1)) - Cuvx= ua/(xc(i)-xc(i-1)) - else - uvx= ua*(v(i+1,j,l)-v(i,j,l))/(xc(i+1)-xc(i)) - Cuvx= -ua/(xc(i+1)-xc(i)) - endif - - if (va.ge.0._pr) then - vvy= va*(v(i,j,l)-v(i,j-1,l))/(yf(j)-yf(j-1)) - Cvvy= va/(yf(j)-yf(j-1)) - else - vvy= va*(v(i,j+1,l)-v(i,j,l))/(yf(j+1)-yf(j)) - Cvvy= -va/(yf(j+1)-yf(j)) - endif - - if (wa.ge.0._pr) then - wvz= wa*(v(i,j,l)-v(i,j,l-1))/(zc(l)-zc(l-1)) - Cwvz= wa/(zc(l)-zc(l-1)) - else - wvz= wa*(v(i,j,l+1)-v(i,j,l))/(zc(l+1)-zc(l)) - Cwvz= -wa/(zc(l+1)-zc(l)) - endif - -! pressure gradient (2nd order) - py=(p(i,j+1,l)-p(i,j,l))/(yc(j+1)-yc(j)) - -! viscous terms (2nd order) - vxx= (v(i+1,j,l)*(xc(i)-xc(i-1))+v(i-1,j,l)*(xc(i+1)-xc(i))-v(i,j,l)*(xc(i+1)-xc(i-1)))/ & - (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) - vyy= (v(i,j+1,l)*(yf(j)-yf(j-1))+v(i,j-1,l)*(yf(j+1)-yf(j))-v(i,j,l)*(yf(j+1)-yf(j-1)))/ & - (0.5_pr*(yf(j+1)-yf(j-1))*(yf(j+1)-yf(j))*(yf(j)-yf(j-1))) - vzz= (v(i,j,l+1)*(zc(l)-zc(l-1))+v(i,j,l-1)*(zc(l+1)-zc(l))-v(i,j,l)*(zc(l+1)-zc(l-1)))/ & - (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*v(i,j,l)+dvdt(i,j,l))/(2._pr*tau01*dt) - cony = uvx+vvy+wvz - pressy = py/rhof - viscy = nuf*(vxx+vyy+vzz) - -! rhs - lhs - tv = -temporal - cony - pressy + viscy + fsy(i,j,l) - -! coefficients of v(i,j,l) of momentum eq - Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) - Ccony = Cuvx+Cvvy+Cwvz - Cviscy = -2._pr*nuf & - *(1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & - + 1._pr/((yf(j+1)-yf(j))*(yf(j)-yf(j-1))) & - + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1)))) - -! coefficients lhs-rhs - qv= Ctemporal +Ccony -Cviscy - - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief first order discretization of momentum eq in z-direction - subroutine momz1(tw,qw,i,j,l) - use var - real(kind=pr) :: ua,va,wa,tw,qw,pz,uwx,vwy,wwz, & - wxx,wyy,wzz,temporal,conz,pressz,viscz, & - Ctemporal,Cconz,Cpressz,Cviscz,Cuwx,Cvwy,Cwwz - integer :: i,j,l - - -! bilinear interpolation - ua= 0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j,l+1)+u(i-1,j,l+1)) - va= 0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i,j,l+1)+v(i,j-1,l+1)) - wa= w(i,j,l) - - -! upwind (1st order) - if (ua.ge.0._pr) then - uwx= ua*(w(i,j,l)-w(i-1,j,l))/(xc(i)-xc(i-1)) - Cuwx= ua/(xc(i)-xc(i-1)) - else - uwx= ua*(w(i+1,j,l)-w(i,j,l))/(xc(i+1)-xc(i)) - Cuwx= -ua/(xc(i+1)-xc(i)) - endif - - if (va.ge.0._pr) then - vwy= va*(w(i,j,l)-w(i,j-1,l))/(yc(j)-yc(j-1)) - Cvwy= va/(yc(j)-yc(j-1)) - else - vwy= va*(w(i,j+1,l)-w(i,j,l))/(yc(j+1)-yc(j)) - Cvwy= -va/(yc(j+1)-yc(j)) - endif - - if (wa.ge.0._pr) then - wwz= wa*(w(i,j,l)-w(i,j,l-1))/(zf(l)-zf(l-1)) - Cwwz= wa/(zf(l)-zf(l-1)) - else - wwz= wa*(w(i,j,l+1)-w(i,j,l))/(zf(l+1)-zf(l)) - Cwwz= -wa/(zf(l+1)-zf(l)) - endif - -! pressure gradient (2nd order) - pz=(p(i,j,l+1)-p(i,j,l))/(zc(l+1)-zc(l)) - -! viscous terms (2nd order) - wxx= (w(i+1,j,l)*(xc(i)-xc(i-1))+w(i-1,j,l)*(xc(i+1)-xc(i))-w(i,j,l)*(xc(i+1)-xc(i-1)))/ & - (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) - wyy= (w(i,j+1,l)*(yc(j)-yc(j-1))+w(i,j-1,l)*(yc(j+1)-yc(j))-w(i,j,l)*(yc(j+1)-yc(j-1)))/ & - (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) - wzz= (w(i,j,l+1)*(zf(l)-zf(l-1))+w(i,j,l-1)*(zf(l+1)-zf(l))-w(i,j,l)*(zf(l+1)-zf(l-1)))/ & - (0.5_pr*(zf(l+1)-zf(l-1))*(zf(l+1)-zf(l))*(zf(l)-zf(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*w(i,j,l)+dwdt(i,j,l))/(2._pr*tau01*dt) - conz = uwx+vwy+wwz - pressz = pz/rhof - viscz = nuf*(wxx+wyy+wzz) - -! rhs - lhs - tw = -temporal - conz - pressz + viscz + fsz(i,j,l) - -! coefficients of u(i,j,l) of momentum eq - Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) - Cconz = Cuwx+Cvwy+Cwwz - Cviscz = -2._pr*nuf & - *(1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & - + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & - + 1._pr/((zf(l+1)-zf(l))*(zf(l)-zf(l-1)))) - -! coefficients lhs-rhs - qw= Ctemporal +Cconz -Cviscz - - - return - end diff --git a/src/mom5.f90 b/src/mom5.f90 deleted file mode 100644 index d7ea08e..0000000 --- a/src/mom5.f90 +++ /dev/null @@ -1,246 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief fifth order discretization of momentum eq in x-direction - subroutine momx5(tu,qu,i,j,l) - use var - real(kind=pr) :: ua,va,wa,tu,qu,px,uux,vuy,wuz, & - uxx,uyy,uzz,temporal,conx,pressx,viscx, & - f1,f2,f3,f4,fluxplu,fluxmin, & - Ctemporal,Cconx,Cpressx,Cviscx, & - d1o4 - integer :: i,j,l - - -! bilinear interpolation - ua= u(i,j,l) - va= 0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i+1,j,l)+v(i+1,j-1,l)) - wa= 0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i+1,j,l)+w(i+1,j,l-1)) - -! upwind (5th order WENO) - if (ua.gt.0._pr) then - call weno(fluxplu,u(i-2,j,l),u(i-1,j,l),u(i,j,l),u(i+1,j,l),u(i+2,j,l)) - call weno(fluxmin,u(i-3,j,l),u(i-2,j,l),u(i-1,j,l),u(i,j,l),u(i+1,j,l)) - else - call weno(fluxplu,u(i+3,j,l),u(i+2,j,l),u(i+1,j,l),u(i,j,l),u(i-1,j,l)) - call weno(fluxmin,u(i+2,j,l),u(i+1,j,l),u(i,j,l),u(i-1,j,l),u(i-2,j,l)) - endif - uux= ua*(fluxplu-fluxmin)/dxfdi(i) - - if (va.gt.0._pr) then - call weno(fluxplu,u(i,j-2,l),u(i,j-1,l),u(i,j,l),u(i,j+1,l),u(i,j+2,l)) - call weno(fluxmin,u(i,j-3,l),u(i,j-2,l),u(i,j-1,l),u(i,j,l),u(i,j+1,l)) - else - call weno(fluxplu,u(i,j+3,l),u(i,j+2,l),u(i,j+1,l),u(i,j,l),u(i,j-1,l)) - call weno(fluxmin,u(i,j+2,l),u(i,j+1,l),u(i,j,l),u(i,j-1,l),u(i,j-2,l)) - endif - vuy= va*(fluxplu-fluxmin)/dycdj(j) - - if (wa.gt.0._pr) then - call weno(fluxplu,u(i,j,l-2),u(i,j,l-1),u(i,j,l),u(i,j,l+1),u(i,j,l+2)) - call weno(fluxmin,u(i,j,l-3),u(i,j,l-2),u(i,j,l-1),u(i,j,l),u(i,j,l+1)) - else - call weno(fluxplu,u(i,j,l+3),u(i,j,l+2),u(i,j,l+1),u(i,j,l),u(i,j,l-1)) - call weno(fluxmin,u(i,j,l+2),u(i,j,l+1),u(i,j,l),u(i,j,l-1),u(i,j,l-2)) - endif - wuz= wa*(fluxplu-fluxmin)/dzcdl(l) - -! pressure gradient (4th order) - px=d1o4(xf(i),p(i-1,j,l),p(i,j,l),p(i+1,j,l),p(i+2,j,l),xc(i-1),xc(i),xc(i+1),xc(i+2)) - -! viscous terms (2nd order) - uxx= (u(i+1,j,l)*(xf(i)-xf(i-1))+u(i-1,j,l)*(xf(i+1)-xf(i))-u(i,j,l)*(xf(i+1)-xf(i-1)))/ & - (0.5_pr*(xf(i+1)-xf(i-1))*(xf(i+1)-xf(i))*(xf(i)-xf(i-1))) - uyy= (u(i,j+1,l)*(yc(j)-yc(j-1)) + u(i,j-1,l)*(yc(j+1)-yc(j)) - u(i,j,l)*(yc(j+1)-yc(j-1)))/ & - (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) - uzz= (u(i,j,l+1)*(zc(l)-zc(l-1))+u(i,j,l-1)*(zc(l+1)-zc(l))-u(i,j,l)*(zc(l+1)-zc(l-1)))/ & - (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*u(i,j,l)+dudt(i,j,l))/(2._pr*tau01*dt) - conx = uux+vuy+wuz - pressx = (px+dpdx)/rhof - viscx = nuf*(uxx+uyy+uzz) - -! rhs - lhs - tu = -temporal -conx -pressx + viscx + fsx(i,j,l) - -!quHO not needed! -!! coefficients of du(i,j,l) of momentum eq -! Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) -! Cconx= abs(ua)/dxfdi(i)+abs(va)/dycdj(j)+abs(wa)/dzcdl(l) -! Cviscx = -2._pr*nuf & -! *(1._pr/((xf(i+1)-xf(i))*(xf(i)-xf(i-1))) & -! + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & -! + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1)))) -! -!! coefficients lhs-rhs -! qu= Ctemporal +Cconx -Cviscx - qu=0._pr - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief fifth order discretization of momentum eq in y-direction - subroutine momy5(tv,qv,i,j,l) - - use var - real(kind=pr) :: ua,va,wa,tv,qv,py,uvx,vvy,wvz, & - vxx,vyy,vzz,temporal,cony,pressy,viscy, & - f1,f2,f3,f4,fluxplu,fluxmin, & - Ctemporal,Ccony,Cpressy,Cviscy, & - d1o4 - integer :: i,j,l - - -! bilinear interpolation - ua=0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j+1,l)+u(i-1,j+1,l)) - va=v(i,j,l) - wa=0.25_pr*(w(i,j,l)+w(i,j,l-1)+w(i,j+1,l)+w(i,j+1,l-1)) - -! upwind (5th order WENO) - if (ua.gt.0._pr) then - call weno(fluxplu,v(i-2,j,l),v(i-1,j,l),v(i,j,l),v(i+1,j,l),v(i+2,j,l)) - call weno(fluxmin,v(i-3,j,l),v(i-2,j,l),v(i-1,j,l),v(i,j,l),v(i+1,j,l)) - else - call weno(fluxplu,v(i+3,j,l),v(i+2,j,l),v(i+1,j,l),v(i,j,l),v(i-1,j,l)) - call weno(fluxmin,v(i+2,j,l),v(i+1,j,l),v(i,j,l),v(i-1,j,l),v(i-2,j,l)) - endif - uvx= ua*(fluxplu-fluxmin)/dxcdi(i) - - if (va.gt.0._pr) then - call weno(fluxplu,v(i,j-2,l),v(i,j-1,l),v(i,j,l),v(i,j+1,l),v(i,j+2,l)) - call weno(fluxmin,v(i,j-3,l),v(i,j-2,l),v(i,j-1,l),v(i,j,l),v(i,j+1,l)) - else - call weno(fluxplu,v(i,j+3,l),v(i,j+2,l),v(i,j+1,l),v(i,j,l),v(i,j-1,l)) - call weno(fluxmin,v(i,j+2,l),v(i,j+1,l),v(i,j,l),v(i,j-1,l),v(i,j-2,l)) - endif - vvy= va*(fluxplu-fluxmin)/dyfdj(j) - - if (wa.gt.0._pr) then - call weno(fluxplu,v(i,j,l-2),v(i,j,l-1),v(i,j,l),v(i,j,l+1),v(i,j,l+2)) - call weno(fluxmin,v(i,j,l-3),v(i,j,l-2),v(i,j,l-1),v(i,j,l),v(i,j,l+1)) - else - call weno(fluxplu,v(i,j,l+3),v(i,j,l+2),v(i,j,l+1),v(i,j,l),v(i,j,l-1)) - call weno(fluxmin,v(i,j,l+2),v(i,j,l+1),v(i,j,l),v(i,j,l-1),v(i,j,l-2)) - endif - wvz= wa*(fluxplu-fluxmin)/dzcdl(l) - -! pressure gradient (4th order) - py=d1o4(yf(j),p(i,j-1,l),p(i,j,l),p(i,j+1,l),p(i,j+2,l),yc(j-1),yc(j),yc(j+1),yc(j+2)) - -! viscous terms (2nd order) - vxx= (v(i+1,j,l)*(xc(i)-xc(i-1))+v(i-1,j,l)*(xc(i+1)-xc(i))-v(i,j,l)*(xc(i+1)-xc(i-1)))/ & - (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) - vyy= (v(i,j+1,l)*(yf(j)-yf(j-1))+v(i,j-1,l)*(yf(j+1)-yf(j))-v(i,j,l)*(yf(j+1)-yf(j-1)))/ & - (0.5_pr*(yf(j+1)-yf(j-1))*(yf(j+1)-yf(j))*(yf(j)-yf(j-1))) - vzz= (v(i,j,l+1)*(zc(l)-zc(l-1))+v(i,j,l-1)*(zc(l+1)-zc(l))-v(i,j,l)*(zc(l+1)-zc(l-1)))/ & - (0.5_pr*(zc(l+1)-zc(l-1))*(zc(l+1)-zc(l))*(zc(l)-zc(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*v(i,j,l)+dvdt(i,j,l))/(2._pr*tau01*dt) - cony = uvx+vvy+wvz - pressy = py/rhof - viscy = nuf*(vxx+vyy+vzz) - -! rhs - lhs - tv = -temporal - cony - pressy + viscy + fsy(i,j,l) - -!! coefficients of dv(i,j,l) of momentum eq -! Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) -! Ccony= abs(ua)/dxcdi(i)+abs(va)/dyfdj(j)+abs(wa)/dzcdl(l) -! Cviscy = -2._pr*nuf & -! *(1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & -! + 1._pr/((yf(j+1)-yf(j))*(yf(j)-yf(j-1))) & -! + 1._pr/((zc(l+1)-zc(l))*(zc(l)-zc(l-1)))) -! -!! coefficients lhs-rhs -! qv= Ctemporal +Ccony -Cviscy - qv=0._pr - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief fifth order discretization of momentum eq in z-direction - subroutine momz5(tw,qw,i,j,l) - use var - real(kind=pr) :: ua,va,wa,tw,qw,pz,uwx,vwy,wwz, & - wxx,wyy,wzz,temporal,conz,pressz,viscz, & - f1,f2,f3,f4,fluxplu,fluxmin, & - Ctemporal,Cconz,Cpressz,Cviscz, & - d1o4 - integer :: i,j,l - - -! bilinear interpolation - ua=0.25_pr*(u(i,j,l)+u(i-1,j,l)+u(i,j,l+1)+u(i-1,j,l+1)) - va=0.25_pr*(v(i,j,l)+v(i,j-1,l)+v(i,j,l+1)+v(i,j-1,l+1)) - wa=w(i,j,l) - -! upwind (5th order WENO) - if (ua.gt.0._pr) then - call weno(fluxplu,w(i-2,j,l),w(i-1,j,l),w(i,j,l),w(i+1,j,l),w(i+2,j,l)) - call weno(fluxmin,w(i-3,j,l),w(i-2,j,l),w(i-1,j,l),w(i,j,l),w(i+1,j,l)) - else - call weno(fluxplu,w(i+3,j,l),w(i+2,j,l),w(i+1,j,l),w(i,j,l),w(i-1,j,l)) - call weno(fluxmin,w(i+2,j,l),w(i+1,j,l),w(i,j,l),w(i-1,j,l),w(i-2,j,l)) - endif - uwx= ua*(fluxplu-fluxmin)/dxcdi(i) - - if (va.gt.0._pr) then - call weno(fluxplu,w(i,j-2,l),w(i,j-1,l),w(i,j,l),w(i,j+1,l),w(i,j+2,l)) - call weno(fluxmin,w(i,j-3,l),w(i,j-2,l),w(i,j-1,l),w(i,j,l),w(i,j+1,l)) - else - call weno(fluxplu,w(i,j+3,l),w(i,j+2,l),w(i,j+1,l),w(i,j,l),w(i,j-1,l)) - call weno(fluxmin,w(i,j+2,l),w(i,j+1,l),w(i,j,l),w(i,j-1,l),w(i,j-2,l)) - endif - vwy= va*(fluxplu-fluxmin)/dycdj(j) - - if (wa.gt.0._pr) then - call weno(fluxplu,w(i,j,l-2),w(i,j,l-1),w(i,j,l),w(i,j,l+1),w(i,j,l+2)) - call weno(fluxmin,w(i,j,l-3),w(i,j,l-2),w(i,j,l-1),w(i,j,l),w(i,j,l+1)) - else - call weno(fluxplu,w(i,j,l+3),w(i,j,l+2),w(i,j,l+1),w(i,j,l),w(i,j,l-1)) - call weno(fluxmin,w(i,j,l+2),w(i,j,l+1),w(i,j,l),w(i,j,l-1),w(i,j,l-2)) - endif - wwz= wa*(fluxplu-fluxmin)/dzfdl(l) - -! pressure gradient (4th order) - pz=d1o4(zf(l),p(i,j,l-1),p(i,j,l),p(i,j,l+1),p(i,j,l+2),zc(l-1),zc(l),zc(l+1),zc(l+2)) - -! viscous terms (2nd order) - wxx= (w(i+1,j,l)*(xc(i)-xc(i-1))+w(i-1,j,l)*(xc(i+1)-xc(i))-w(i,j,l)*(xc(i+1)-xc(i-1)))/ & - (0.5_pr*(xc(i+1)-xc(i-1))*(xc(i+1)-xc(i))*(xc(i)-xc(i-1))) - wyy= (w(i,j+1,l)*(yc(j)-yc(j-1))+w(i,j-1,l)*(yc(j+1)-yc(j))-w(i,j,l)*(yc(j+1)-yc(j-1)))/ & - (0.5_pr*(yc(j+1)-yc(j-1))*(yc(j+1)-yc(j))*(yc(j)-yc(j-1))) - wzz= (w(i,j,l+1)*(zf(l)-zf(l-1))+w(i,j,l-1)*(zf(l+1)-zf(l))-w(i,j,l)*(zf(l+1)-zf(l-1)))/ & - (0.5_pr*(zf(l+1)-zf(l-1))*(zf(l+1)-zf(l))*(zf(l)-zf(l-1))) - -! terms of momentum eq - temporal = ((1._pr+tau01)*w(i,j,l)+dwdt(i,j,l))/(2._pr*tau01*dt) - conz = uwx+vwy+wwz - pressz = pz/rhof - viscz = nuf*(wxx+wyy+wzz) - -! rhs - lhs - tw = -temporal - conz - pressz + viscz + fsz(i,j,l) - -!! coefficients of dw(i,j,l) of momentum eq -! Ctemporal= (1._pr+tau01)/(2._pr*tau01*dt) -! Cconz= abs(ua)/dxcdi(i)+abs(va)/dycdj(j)+abs(wa)/dzfdl(l) -! Cviscz = -2._pr*nuf & -! *(1._pr/((xc(i+1)-xc(i))*(xc(i)-xc(i-1))) & -! + 1._pr/((yc(j+1)-yc(j))*(yc(j)-yc(j-1))) & -! + 1._pr/((zf(l+1)-zf(l))*(zf(l)-zf(l-1)))) -! -!! coefficients lhs-rhs -! qw= Ctemporal +Cconz -Cviscz - qw=0._pr - - return - end diff --git a/src/momentum.f90 b/src/momentum.f90 deleted file mode 100644 index b1e95c1..0000000 --- a/src/momentum.f90 +++ /dev/null @@ -1,144 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief one sweep to relax momentum eq. using Jacobi method -!> @param err: L2 error norm - subroutine momentum(err) - use var - - real(kind=pr),dimension(ii,jj,ll) :: u1,v1,w1 - real(kind=pr) :: err,syncSum - real(kind=pr) :: dum,dvm,dwm - real(kind=pr) :: du,dv,dw,dua,dva,dwa - real(kind=pr) :: tu,tv,tw,qu,qv,qw - integer :: i,j,l - - err=0._pr - u1=u; v1=v; w1=w - dum=0._pr; dvm=0._pr; dwm=0._pr - - - do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax - - if (celltype(i,j,l).ne.active) cycle - - dua=0._pr; dva=0._pr; dwa=0._pr - - if (celltype(i+1,j,l).ne.wall) then - call momx1(tu,qu,i,j,l) - du=(defect_u(i,j,l)+tu)/qu*urfu - u1(i,j,l)=u(i,j,l)+du - dua=abs(du) - if (dum.lt.dua) dum=dua - endif - - if (celltype(i,j+1,l).ne.wall) then - call momy1(tv,qv,i,j,l) - dv=(defect_v(i,j,l)+tv)/qv*urfv - v1(i,j,l)=v(i,j,l)+dv - dva=abs(dv) - if (dvm.lt.dva) dvm=dva - endif - - if (celltype(i,j,l+1).ne.wall) then - call momz1(tw,qw,i,j,l) - dw=(defect_w(i,j,l)+tw)/qw*urfw - w1(i,j,l)=w(i,j,l)+dw - dwa=abs(dw) - if (dwm.lt.dwa) dwm=dwa - endif - - err=err+dua*dua+dva*dva+dwa*dwa - - enddo; enddo; enddo - - u=u1; v=v1; w=w1 - - call sync(u); call sync(v); call sync(w) - call bcUVWP - - err=(syncSum(err)/dimgptot/3._pr)**(0.5_pr) -! write(*,'(x,a,es9.2e2,a,3(es9.2e2))') & -! 'res. inner it. mom =',err,', max du,dv,dw =',dum,dvm,dwm - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief second-order time integration - subroutine ddt - use var - integer :: i,j,l - - dudt=-(1._pr+tau01+tau02)*u+tau02*u01 - dvdt=-(1._pr+tau01+tau02)*v+tau02*v01 - dwdt=-(1._pr+tau01+tau02)*w+tau02*w01 - u01=u - v01=v - w01=w - - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief HO-LO terms for deferred correction method - subroutine deferredCorrection - use var - real(kind=pr) :: & - tu,tv,tw,qu,qv,qw,ra,raHO,tuHO,tvHO,twHO,quHO,qvHO,qwHO - integer :: i,j,l - - - do i=imin,imax+1; do j=jmin,jmax+1; do l=lmin,lmax+1 - - if ((celltype(i+1,j,l).ne.wall).and.(celltype(i-1,j,l).ne.wall).and. & - (celltype(i,j+1,l).ne.wall).and.(celltype(i,j-1,l).ne.wall).and. & - (celltype(i,j,l+1).ne.wall).and.(celltype(i,j,l-1).ne.wall)) then - call mass2(ra,i,j,l) - call mass4(raHO,i,j,l) - defect_c(i,j,l)=raHO-ra - else - defect_c(i,j,l)=0._pr - endif - - if (celltype(i,j,l).ne.active) cycle ! xmax+1 cells are only needed for defect_c - - if ((celltype(i+3,j,l).ne.wall).and.(celltype(i-2,j,l).ne.wall).and. & - (celltype(i,j+2,l).ne.wall).and.(celltype(i,j-2,l).ne.wall).and. & - (celltype(i,j,l+2).ne.wall).and.(celltype(i,j,l-2).ne.wall)) then - call momx1(tu,qu,i,j,l) - call momx5(tuHO,quHO,i,j,l) - defect_u(i,j,l)=tuHO-tu - else - defect_u(i,j,l)=0._pr - endif - - if ((celltype(i+2,j,l).ne.wall).and.(celltype(i-2,j,l).ne.wall).and. & - (celltype(i,j+3,l).ne.wall).and.(celltype(i,j-2,l).ne.wall).and. & - (celltype(i,j,l+2).ne.wall).and.(celltype(i,j,l-2).ne.wall)) then - call momy1(tv,qv,i,j,l) - call momy5(tvHO,qvHO,i,j,l) - defect_v(i,j,l)=tvHO-tv - else - defect_v(i,j,l)=0._pr - endif - - if ((celltype(i+2,j,l).ne.wall).and.(celltype(i-2,j,l).ne.wall).and. & - (celltype(i,j+2,l).ne.wall).and.(celltype(i,j-2,l).ne.wall).and. & - (celltype(i,j,l+3).ne.wall).and.(celltype(i,j,l-2).ne.wall)) then - call momz1(tw,qw,i,j,l) - call momz5(twHO,qwHO,i,j,l) - defect_w(i,j,l)=twHO-tw - else - defect_w(i,j,l)=0._pr - endif - - enddo; enddo; enddo - - - return - end diff --git a/src/parallel.f90 b/src/parallel.f90 index 8994760..404e4bf 100644 --- a/src/parallel.f90 +++ b/src/parallel.f90 @@ -1,3 +1,8 @@ +module parallel +implicit none + +contains + !#################################################################### !> @author Holger Grosshans !> @brief initialize MPI @@ -10,52 +15,36 @@ call mpi_comm_rank(mpi_comm_world,myid,mpierr) call mpi_type_create_f90_real(precision,mpi_undefined,mpi_pr,mpierr) - timecom=0._pr timenow=real(mpi_wtime(),kind=pr) timebeg=real(mpi_wtime(),kind=pr) timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end - !#################################################################### !> @author Holger Grosshans !> @brief synchronize particles between processors subroutine syncPart(np_sendl,np_sendr,np_recvl,np_recvr,myvar) use var use mpi - real(kind=pr), dimension (maxnp) :: & - myvar,p_sendl,p_sendr,p_recvl,p_recvr - integer, dimension (maxnp) :: np_sendl,np_sendr,np_recvl,np_recvr - integer rsleft,rsright,rrleft,rrright,n_sendl,n_sendr, & - n_recvl,n_recvr,n + real(kind=pr),allocatable,dimension(:) :: p_sendl,p_sendr + real(kind=pr),dimension(maxnp) :: myvar,p_recvl,p_recvr + integer,dimension(maxnp) :: np_sendl,np_sendr,np_recvl,np_recvr + integer rsleft,rsright,rrleft,rrright,n_sendl,n_sendr,n_recvl,n_recvr,n timenow=real(mpi_wtime(),kind=pr) - n_sendl=0 - n_sendr=0 - do 1 n=1,np - if (np_sendl(n).eq.1) then - n_sendl=n_sendl+1 - p_sendl(n_sendl)=myvar(n) - endif - if (np_sendr(n).eq.1) then - n_sendr=n_sendr+1 - p_sendr(n_sendr)=myvar(n) - endif -1 enddo + n_sendl=sum(np_sendl(1:np)) + p_sendl=pack(myvar(1:np),np_sendl(1:np).eq.1) + n_sendr=sum(np_sendr(1:np)) + p_sendr=pack(myvar(1:np),np_sendr(1:np).eq.1) ! send/receive number of particles - call mpi_isend(n_sendl,1,mpi_integer,prev, & - 2,mpi_comm_world,rsleft,mpierr) - call mpi_irecv(n_recvl,1,mpi_integer,prev, & - 1,mpi_comm_world,rrleft,mpierr) - call mpi_isend(n_sendr,1,mpi_integer,next, & - 1,mpi_comm_world,rsright,mpierr) - call mpi_irecv(n_recvr,1,mpi_integer,next, & - 2,mpi_comm_world,rrright,mpierr) + call mpi_isend(n_sendl,1,mpi_integer,prev,2,mpi_comm_world,rsleft,mpierr) + call mpi_irecv(n_recvl,1,mpi_integer,prev,1,mpi_comm_world,rrleft,mpierr) + call mpi_isend(n_sendr,1,mpi_integer,next,1,mpi_comm_world,rsright,mpierr) + call mpi_irecv(n_recvr,1,mpi_integer,next,2,mpi_comm_world,rrright,mpierr) call mpi_wait(rsleft,mpistatus,mpierr) call mpi_wait(rrleft,mpistatus,mpierr) call mpi_wait(rsright,mpistatus,mpierr) @@ -63,35 +52,30 @@ if (next.eq.mpi_proc_null) n_recvr=0 if (prev.eq.mpi_proc_null) n_recvl=0 - if (n_sendl.gt.0) call mpi_isend& - (p_sendl,n_sendl,mpi_pr,prev,2,mpi_comm_world,rsleft,mpierr) - if (n_recvl.gt.0) call mpi_irecv& - (p_recvl,n_recvl,mpi_pr,prev,1,mpi_comm_world,rrleft,mpierr) - if (n_sendr.gt.0) call mpi_isend& - (p_sendr,n_sendr,mpi_pr,next,1,mpi_comm_world,rsright,mpierr) - if (n_recvr.gt.0) call mpi_irecv& - (p_recvr,n_recvr,mpi_pr,next,2,mpi_comm_world,rrright,mpierr) + if (n_sendl.gt.0) call mpi_isend(p_sendl,n_sendl,mpi_pr,prev,2,mpi_comm_world,rsleft,mpierr) + if (n_recvl.gt.0) call mpi_irecv(p_recvl,n_recvl,mpi_pr,prev,1,mpi_comm_world,rrleft,mpierr) + if (n_sendr.gt.0) call mpi_isend(p_sendr,n_sendr,mpi_pr,next,1,mpi_comm_world,rsright,mpierr) + if (n_recvr.gt.0) call mpi_irecv(p_recvr,n_recvr,mpi_pr,next,2,mpi_comm_world,rrright,mpierr) if (n_sendl.gt.0) call mpi_wait(rsleft,mpistatus,mpierr) if (n_recvl.gt.0) call mpi_wait(rrleft,mpistatus,mpierr) if (n_sendr.gt.0) call mpi_wait(rsright,mpistatus,mpierr) if (n_recvr.gt.0) call mpi_wait(rrright,mpistatus,mpierr) np=npp - do 2 n=1,n_recvl - np=np+1 - np_recvl(np)=1 - myvar(np)=p_recvl(n) -2 enddo - do 3 n=1,n_recvr - np=np+1 - np_recvr(np)=1 - myvar(np)=p_recvr(n) -3 enddo + np_recvl=0 + np_recvr=0 + + np_recvl( np+1 : np+n_recvl ) = 1 + myvar( np+1 : np+n_recvl ) = p_recvl( 1 : n_recvl ) + + np_recvr( np+n_recvl+1 : np+n_recvl+n_recvr ) = 1 + myvar( np+n_recvl+1 : np+n_recvl+n_recvr ) = p_recvr( 1 : n_recvr ) + np=np+n_recvl+n_recvr + timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end !#################################################################### @@ -100,36 +84,23 @@ subroutine syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,myvar) use var use mpi - integer, dimension (maxnp) :: & - myvar,p_sendl,p_sendr,p_recvl,p_recvr - integer, dimension (maxnp) :: np_sendl,np_sendr,np_recvl,np_recvr - integer rsleft,rsright,rrleft,rrright,n_sendl,n_sendr, & - n_recvl,n_recvr,n + integer, allocatable, dimension(:) :: p_sendl,p_sendr + integer, dimension(maxnp) :: myvar,p_recvl,p_recvr + integer, dimension(maxnp) :: np_sendl,np_sendr,np_recvl,np_recvr + integer rsleft,rsright,rrleft,rrright,n_sendl,n_sendr,n_recvl,n_recvr,n timenow=real(mpi_wtime(),kind=pr) - n_sendl=0 - n_sendr=0 - do 1 n=1,np - if (np_sendl(n).eq.1) then - n_sendl=n_sendl+1 - p_sendl(n_sendl)=myvar(n) - endif - if (np_sendr(n).eq.1) then - n_sendr=n_sendr+1 - p_sendr(n_sendr)=myvar(n) - endif -1 enddo + n_sendl=sum(np_sendl(1:np)) + p_sendl=pack(myvar(1:np),np_sendl(1:np).eq.1) + n_sendr=sum(np_sendr(1:np)) + p_sendr=pack(myvar(1:np),np_sendr(1:np).eq.1) ! send/receive number of particles - call mpi_isend(n_sendl,1,mpi_integer,prev, & - 2,mpi_comm_world,rsleft,mpierr) - call mpi_irecv(n_recvl,1,mpi_integer,prev, & - 1,mpi_comm_world,rrleft,mpierr) - call mpi_isend(n_sendr,1,mpi_integer,next, & - 1,mpi_comm_world,rsright,mpierr) - call mpi_irecv(n_recvr,1,mpi_integer,next, & - 2,mpi_comm_world,rrright,mpierr) + call mpi_isend(n_sendl,1,mpi_integer,prev,2,mpi_comm_world,rsleft,mpierr) + call mpi_irecv(n_recvl,1,mpi_integer,prev,1,mpi_comm_world,rrleft,mpierr) + call mpi_isend(n_sendr,1,mpi_integer,next,1,mpi_comm_world,rsright,mpierr) + call mpi_irecv(n_recvr,1,mpi_integer,next,2,mpi_comm_world,rrright,mpierr) call mpi_wait(rsleft,mpistatus,mpierr) call mpi_wait(rrleft,mpistatus,mpierr) call mpi_wait(rsright,mpistatus,mpierr) @@ -137,191 +108,152 @@ if (next.eq.mpi_proc_null) n_recvr=0 if (prev.eq.mpi_proc_null) n_recvl=0 - - if (n_sendl.gt.0) call mpi_isend& - (p_sendl,n_sendl,mpi_integer,prev,2,mpi_comm_world,rsleft,mpierr) - if (n_recvl.gt.0) call mpi_irecv& - (p_recvl,n_recvl,mpi_integer,prev,1,mpi_comm_world,rrleft,mpierr) - if (n_sendr.gt.0) call mpi_isend& - (p_sendr,n_sendr,mpi_integer,next,1,mpi_comm_world,rsright,mpierr) - if (n_recvr.gt.0) call mpi_irecv& - (p_recvr,n_recvr,mpi_integer,next,2,mpi_comm_world,rrright,mpierr) + if (n_sendl.gt.0) call mpi_isend(p_sendl,n_sendl,mpi_integer,prev,2,mpi_comm_world,rsleft,mpierr) + if (n_recvl.gt.0) call mpi_irecv(p_recvl,n_recvl,mpi_integer,prev,1,mpi_comm_world,rrleft,mpierr) + if (n_sendr.gt.0) call mpi_isend(p_sendr,n_sendr,mpi_integer,next,1,mpi_comm_world,rsright,mpierr) + if (n_recvr.gt.0) call mpi_irecv(p_recvr,n_recvr,mpi_integer,next,2,mpi_comm_world,rrright,mpierr) if (n_sendl.gt.0) call mpi_wait(rsleft,mpistatus,mpierr) if (n_recvl.gt.0) call mpi_wait(rrleft,mpistatus,mpierr) if (n_sendr.gt.0) call mpi_wait(rsright,mpistatus,mpierr) if (n_recvr.gt.0) call mpi_wait(rrright,mpistatus,mpierr) np=npp - do 2 n=1,n_recvl - np=np+1 - np_recvl(np)=1 - myvar(np)=p_recvl(n) -2 enddo - do 3 n=1,n_recvr - np=np+1 - np_recvr(np)=1 - myvar(np)=p_recvr(n) -3 enddo + np_recvl=0 + np_recvr=0 + + np_recvl( np+1 : np+n_recvl ) = 1 + myvar( np+1 : np+n_recvl ) = p_recvl( 1 : n_recvl ) + + np_recvr( np+n_recvl+1 : np+n_recvl+n_recvr ) = 1 + myvar( np+n_recvl+1 : np+n_recvl+n_recvr ) = p_recvr( 1 : n_recvr ) + + np=np+n_recvl+n_recvr timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end - !#################################################################### !> @author Holger Grosshans !> @brief synchronize fluid between processors subroutine sync(myvar) use var use mpi - real(kind=pr) :: myvar(ii,jj,ll) - real(kind=pr), dimension(gc*jj*ll) :: & - sendleft,sendright,recvleft,recvright - integer :: rsleft,rsright,rrleft,rrright,n - integer :: i,j,l + real(kind=pr), dimension(ii,jj,ll) :: myvar + real(kind=pr), dimension(gc*jj*ll) :: sendleft,sendright,recvleft,recvright + integer :: rsleft,rsright,rrleft,rrright + integer :: n timenow=real(mpi_wtime(),kind=pr) - n=0 - do i= imin,imin+gc-1 - do l= 1,ll; do j= 1,jj - n=n+1 - sendleft(n)= myvar(i,j,l) - enddo; enddo; enddo - - n=0 - do i= imax,imax-gc+1,-1 - do l= 1,ll; do j= 1,jj - n=n+1 - sendright(n)= myvar(i,j,l) - enddo; enddo; enddo - - call mpi_isend(sendleft,gc*jj*ll,mpi_pr,prev,1,mpi_comm_world,rsleft,mpierr) - call mpi_isend(sendright,gc*jj*ll,mpi_pr,next,2,mpi_comm_world,rsright,mpierr) - call mpi_irecv(recvright,gc*jj*ll,mpi_pr,next,1,mpi_comm_world,rrright,mpierr) - call mpi_irecv(recvleft,gc*jj*ll,mpi_pr,prev,2,mpi_comm_world,rrleft,mpierr) + n=gc*jj*ll + sendleft= reshape(myvar(imin:imin+gc-1,1:jj,1:ll),(/n/)) + sendright=reshape(myvar(imax-gc+1:imax,1:jj,1:ll),(/n/)) + + call mpi_isend(sendleft,n,mpi_pr,prev,1,mpi_comm_world,rsleft,mpierr) + call mpi_isend(sendright,n,mpi_pr,next,2,mpi_comm_world,rsright,mpierr) + call mpi_irecv(recvright,n,mpi_pr,next,1,mpi_comm_world,rrright,mpierr) + call mpi_irecv(recvleft,n,mpi_pr,prev,2,mpi_comm_world,rrleft,mpierr) call mpi_wait(rsleft,mpistatus,mpierr) call mpi_wait(rsright,mpistatus,mpierr) call mpi_wait(rrright,mpistatus,mpierr) call mpi_wait(rrleft,mpistatus,mpierr) - if (next.ne.mpi_proc_null) then - n=0 - do i= imax+1,ii - do l= 1,ll; do j= 1,jj - n=n+1 - myvar(i,j,l)= recvright(n) - enddo; enddo; enddo - endif - - if (prev.ne.mpi_proc_null) then - n=0 - do i= gc,1,-1 - do l= 1,ll; do j= 1,jj - n=n+1 - myvar(i,j,l)= recvleft(n) - enddo; enddo; enddo - endif + if (next.ne.mpi_proc_null) myvar(imax+1:ii,1:jj,1:ll)=reshape(recvright,(/gc,jj,ll/)) + if (prev.ne.mpi_proc_null) myvar(1:gc,1:jj,1:ll)= reshape(recvleft,(/gc,jj,ll/)) timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end !#################################################################### !> @author Holger Grosshans -!> @brief compute the max of a scalar over all processors -!> @param myvar scalar - real(kind=pr) function syncMax(myvar) +!> @brief synchronize LE sources between processors, see 'bcELsource' + subroutine syncLEsource(myvar) use var use mpi - real(kind=pr) :: myvar,myvar2 - integer :: proc,rs,rr + real(kind=pr), dimension(ii,jj,ll) :: myvar + real(kind=pr), dimension(gc*jj*ll) :: sendleft,sendright,recvleft,recvright + integer :: rsleft,rsright,rrleft,rrright + integer :: i,j,l,n timenow=real(mpi_wtime(),kind=pr) -! mpi_allreduce does not work with intel compiler - call mpi_allreduce& - (myvar,syncMax,1,mpi_pr,mpi_max,mpi_comm_world,mpierr) - + n=gc*jj*ll + sendleft= reshape(myvar(1:gc,1:jj,1:ll),(/n/)) + sendright=reshape(myvar(imax+1:ii,1:jj,1:ll),(/n/)) + + call mpi_isend(sendleft,n,mpi_pr,prev,1,mpi_comm_world,rsleft,mpierr) + call mpi_isend(sendright,n,mpi_pr,next,2,mpi_comm_world,rsright,mpierr) + call mpi_irecv(recvright,n,mpi_pr,next,1,mpi_comm_world,rrright,mpierr) + call mpi_irecv(recvleft,n,mpi_pr,prev,2,mpi_comm_world,rrleft,mpierr) + call mpi_wait(rsleft,mpistatus,mpierr) + call mpi_wait(rsright,mpistatus,mpierr) + call mpi_wait(rrright,mpistatus,mpierr) + call mpi_wait(rrleft,mpistatus,mpierr) + + if (next.ne.mpi_proc_null) myvar(imax-gc+1:imax,1:jj,1:ll)=reshape(recvright,(/gc,jj,ll/)) + if (prev.ne.mpi_proc_null) myvar(imin:imin+gc-1,1:jj,1:ll)=reshape(recvleft,(/gc,jj,ll/)) + timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end - !#################################################################### !> @author Holger Grosshans -!> @brief compute the sum of a scalar over all processors -!> @param myvar real scalar - real(kind=pr) function syncSum(myvar) +!> @brief compute the max of a scalar over all processors + real(kind=pr) function syncMax(myvar) use var use mpi - real(kind=pr),intent(in) :: myvar - real(kind=pr) :: myvar2,sumvar - integer :: proc,rs,rr + real(kind=pr) :: myvar timenow=real(mpi_wtime(),kind=pr) ! mpi_allreduce does not work with intel compiler - call mpi_allreduce& - (myvar,syncSum,1,mpi_pr,mpi_sum,mpi_comm_world,mpierr) - + call mpi_allreduce(myvar,syncMax,1,mpi_pr,mpi_max,mpi_comm_world,mpierr) + timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return - end function - + end !#################################################################### !> @author Holger Grosshans -!> @brief compute the sum of a scalar over all processors -!> @param myvar integer scalar - integer function syncSumI(myvar) +!> @brief compute the sum of a real scalar over all processors + real(kind=pr) function syncSum(myvar) use var use mpi - integer :: myvar,myvar2 - integer :: proc,rs,rr + real(kind=pr),intent(in) :: myvar timenow=real(mpi_wtime(),kind=pr) ! mpi_allreduce does not work with intel compiler - call mpi_allreduce& - (myvar,syncSumI,1,mpi_integer,mpi_sum,mpi_comm_world,mpierr) + call mpi_allreduce(myvar,syncSum,1,mpi_pr,mpi_sum,mpi_comm_world,mpierr) timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return - end + end function !#################################################################### !> @author Holger Grosshans -!> @brief compute the average of a scalar over all processors -!> @param myvar scalar - real(kind=pr) function syncAv(myvar) +!> @brief compute the sum of a integer scalar over all processors + integer function syncSumI(myvar) use var use mpi - real(kind=pr) :: myvar,myvar2 - integer :: proc,rs,rr + integer :: myvar timenow=real(mpi_wtime(),kind=pr) ! mpi_allreduce does not work with intel compiler - call mpi_allreduce& - (myvar,myvar,1,mpi_pr,mpi_sum,mpi_comm_world,mpierr) - - syncAv=myvar/nrprocs + call mpi_allreduce(myvar,syncSumI,1,mpi_integer,mpi_sum,mpi_comm_world,mpierr) timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end !#################################################################### @@ -330,7 +262,7 @@ subroutine syncCheck use var use mpi - integer :: m,proc,rs,rr,ntproc + integer :: proc,rs,rr,ntproc timenow=real(mpi_wtime(),kind=pr) @@ -346,14 +278,13 @@ endif if (myid.ne.0) then - call mpi_isend(nt,1,mpi_integer,0,0,mpi_comm_world,rs,mpierr) - call mpi_wait(rs,mpistatus,mpierr) + call mpi_isend(nt,1,mpi_integer,0,0,mpi_comm_world,rs,mpierr) + call mpi_wait(rs,mpistatus,mpierr) endif timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end !#################################################################### @@ -386,5 +317,6 @@ timeend=real(mpi_wtime(),kind=pr) timecom(1)=timecom(1)+timeend-timenow - return end + +end module parallel diff --git a/src/particles.f90 b/src/particles.f90 index 9463709..2808a91 100644 --- a/src/particles.f90 +++ b/src/particles.f90 @@ -3,111 +3,22 @@ !> @brief solve particulate phase subroutine solveParticles use var - integer ip,jp,lp if (pnd.ne.0.or.npTot.ne.0) then - if (myid.eq.0) write(*,'(a)',advance='no') 'particle' if (((bcx.eq.'i').and.(nt.ge.ntseed)).or.(nt.eq.ntseed)) call particlesSeed - call fluidVelocity - if (elForceScheme.ne.2) call forcesGauss - if (elForceScheme.ne.1) call forcesCoulomb - call particlesVelocity - call particlesCollide - call particlesTransport !particles from neighbour gc added - call chargeDensity - call momentumCoupling !particles from neighbour gc removed - if (myid.eq.0) write(*,*) + call particlesDrag + call particlesLift + if ((elForceScheme.eq.1).or.(elForceScheme.eq.3)) call forcesGauss + if ((elForceScheme.eq.2).or.(elForceScheme.eq.3)) call forcesCoulomb + call particlesVelocityNext + call particlesCollideNext + call particlesTransportNext + if (myid.eq.0) write(*,'(a,i8,2(a,es8.2e2))') & + 'particles |transp. = ',npTot,' |dt/t_el = ',dtNext*rtau_el_max,' |dt/t_p = ',dtNext*rtau_p_max endif - return end - -!#################################################################### -!> @author Holger Grosshans -!> @brief move particle from storage position n to m - subroutine partN2M(n,m) - use var - integer :: n,m - - xp(m)=xp(n) - yp(m)=yp(n) - zp(m)=zp(n) - radp(m)=radp(n) - partn(m)=partn(n) - up(m)=up(n) - vp(m)=vp(n) - wp(m)=wp(n) - uf(m)=uf(n) - vf(m)=vf(n) - wf(m)=wf(n) - uf01(m)=uf01(n) - vf01(m)=vf01(n) - wf01(m)=wf01(n) - q_el(m)=q_el(n) - partn(m)=partn(n) - wcollnum(m)=wcollnum(n) - ppcollnum(m)=ppcollnum(n) - nGlob(m)=nGlob(n) - - return - end - -!#################################################################### -!> @author Holger Grosshans -!> @brief compute Eulerian indices of particles - integer function ip(n) - use var - integer n - - ip=minloc(xf, dim=1, mask=(xp(n).lt.xf)) - - if (ip.lt.1.or.ip.gt.ii) goto 9000 - - return - -9000 write(*,*) 'particle lost, proc=',myid,', xp=',xp(n) - stop - - end - -!#################################################################### -!> @author Holger Grosshans -!> @brief compute Eulerian indices of particles - integer function jp(n) - use var - integer n - - jp=minloc(yf, dim=1, mask=(yp(n).lt.yf)) - - if (jp.lt.jmin.or.jp.gt.jmax) goto 9000 - - return - -9000 write(*,*) 'particle lost, proc=',myid,', yp=',yp(n) - stop - - end - -!#################################################################### -!> @author Holger Grosshans -!> @brief compute Eulerian indices of particles - integer function lp(n) - use var - integer n - - lp=minloc(zf, dim=1, mask=(zp(n).lt.zf)) - - if (lp.lt.lmin.or.lp.gt.lmax) goto 9000 - - return - -9000 write(*,*) 'particle lost, proc=',myid,', zp=',zp(n) - stop - - end - - !#################################################################### !> @author Holger Grosshans !> @brief compute weigths for interpolation from Lagrangian to @@ -120,144 +31,72 @@ subroutine weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,direction) use var integer,intent(in) :: n,direction - real(kind=pr),dimension(3,3,3),intent(out) :: weight + real(kind=pr),dimension(2,2,2),intent(out) :: weight integer,intent(out) :: ibeg,iend,jbeg,jend,lbeg,lend - real(kind=pr) :: deltaf2,deltaf,dis2, & - disx,disy,disz,sumweights,volE - integer :: i,j,l,ipa,jpa,lpa,ip,jp,lp - - ipa=ip(n) - jpa=jp(n) - lpa=lp(n) + real(kind=pr) :: deltaf2,deltaf,dis2,volE + integer :: i,j,l - weight=0._pr - - -! define distribution block - if (xp(n).lt.xc(ipa)) then - ibeg=ipa-1 - iend=ipa - else - ibeg=ipa - iend=ipa+1 - endif - if (yp(n).lt.yc(jpa)) then - jbeg=max(jpa-1,jmin) - jend=jpa +! define distribution block and correct for staggered variables + if ((direction.eq.1).or.(xp(n).lt.xc(ip(n)))) then + ibeg=ip(n)-1 else - jbeg=jpa - jend=min(jpa+1,jmax) + ibeg=ip(n) endif - if (zp(n).lt.zc(lpa)) then - lbeg=max(lpa-1,lmin) - lend=lpa + iend=ibeg+1 + + if ((direction.eq.2).or.(yp(n).lt.yc(jp(n)))) then + jbeg=jp(n)-1 else - lbeg=lpa - lend=min(lpa+1,lmax) + jbeg=jp(n) endif + jend=jbeg+1 -! correct for variables on faces - if (direction.eq.1) then - ibeg=ipa-1 - iend=ipa - elseif (direction.eq.2) then - jbeg=jpa-1 - jend=jpa - elseif (direction.eq.3) then - lbeg=lpa-1 - lend=lpa + if ((direction.eq.3).or.(zp(n).lt.zc(lp(n)))) then + lbeg=lp(n)-1 + else + lbeg=lp(n) endif + lend=lbeg+1 ! volume on the Eulerian grid - if (direction.eq.0) volE=(xf(iend)-xf(ibeg-1))*(yf(jend)-yf(jbeg-1))*(zf(lend)-zf(lbeg-1)) - if (direction.eq.1) volE=(xc(iend+1)-xc(ibeg))*(yf(jend)-yf(jbeg-1))*(zf(lend)-zf(lbeg-1)) - if (direction.eq.2) volE=(xf(iend)-xf(ibeg-1))*(yc(jend+1)-yc(jbeg))*(zf(lend)-zf(lbeg-1)) - if (direction.eq.3) volE=(xf(iend)-xf(ibeg-1))*(yf(jend)-yf(jbeg-1))*(zc(lend+1)-zc(lbeg)) - -! deltaf2=2*variance=3*sigma**2 -! if (direction.eq.1) then -! deltaf=2._pr*(xc(iend)-xc(ibeg)+yf(jbeg)-yf(jend)+zf(lbeg)-zf(lend))/3._pr -! elseif (direction.eq.2) then -! deltaf=2._pr*(xf(iend)-xf(ibeg)+yc(jbeg)-yc(jend)+zf(lbeg)-zf(lend))/3._pr -! elseif (direction.eq.3) then -! deltaf=2._pr*(xf(iend)-xf(ibeg)+yf(jbeg)-yf(jend)+zc(lbeg)-zc(lend))/3._pr -! endif -! deltaf2=(deltaf**2)/6._pr + if (direction.eq.0) then + volE=(xf(iend)-xf(ibeg-1))*(yf(jend)-yf(jbeg-1))*(zf(lend)-zf(lbeg-1)) + else if (direction.eq.1) then + volE=(xc(iend+1)-xc(ibeg))*(yf(jend)-yf(jbeg-1))*(zf(lend)-zf(lbeg-1)) + else if (direction.eq.2) then + volE=(xf(iend)-xf(ibeg-1))*(yc(jend+1)-yc(jbeg))*(zf(lend)-zf(lbeg-1)) + else if (direction.eq.3) then + volE=(xf(iend)-xf(ibeg-1))*(yf(jend)-yf(jbeg-1))*(zc(lend+1)-zc(lbeg)) + endif deltaf=xc(iend)-xc(ibeg) deltaf2=(deltaf**2)/6._pr !compute weights - do i=ibeg,iend; do j=jbeg,jend; do l=lbeg,lend - disx=xp(n)-xc(i) - if (direction.eq.1) disx=xp(n)-xf(i) - disy=yp(n)-yc(j) - if (direction.eq.2) disy=yp(n)-yf(j) - disz=zp(n)-zc(l) - if (direction.eq.3) disz=zp(n)-zf(l) - dis2=disx*disx+disy*disy+disz*disz - + do l=lbeg,lend; do j=jbeg,jend; do i=ibeg,iend + if (direction.eq.0) then + dis2= (xp(n)-xc(i))**2 + (yp(n)-yc(j))**2 + (zp(n)-zc(l))**2 + elseif (direction.eq.1) then + dis2= (xp(n)-xf(i))**2 + (yp(n)-yc(j))**2 + (zp(n)-zc(l))**2 + elseif (direction.eq.2) then + dis2= (xp(n)-xc(i))**2 + (yp(n)-yf(j))**2 + (zp(n)-zc(l))**2 + elseif (direction.eq.3) then + dis2= (xp(n)-xc(i))**2 + (yp(n)-yc(j))**2 + (zp(n)-zf(l))**2 + endif weight(i+1-ibeg,j+1-jbeg,l+1-lbeg)=exp(-dis2/deltaf2) - enddo; enddo; enddo - - weight=weight/sum(weight) ! sum normalized - - - return - end - - -!#################################################################### -!> @author Holger Grosshans -!> @brief couple Lagrangian to closest Eulerian point -!> param weight weights of involved cells -!> param volE volume of the involved cells -!> param n particle number -!> param direction 0 if Eulerian variable is stored in the cell -!> center, 1-3 if on the x,y or z-face - subroutine weightLE1(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,direction) - use var - integer,intent(in) :: n,direction - real(kind=pr),dimension(3,3,3),intent(out) :: weight - integer,intent(out) :: ibeg,iend,jbeg,jend,lbeg,lend - real(kind=pr) :: volE - integer :: i,j,l,ipa,jpa,lpa,ip,jp,lp - - ipa=ip(n) - jpa=jp(n) - lpa=lp(n) - -! define distribution block - if ((direction.eq.1).and.(xp(n).lt.xc(ipa))) ipa=ipa-1 - if ((direction.eq.2).and.(yp(n).lt.yc(jpa))) jpa=jpa-1 - if ((direction.eq.3).and.(zp(n).lt.zc(lpa))) lpa=lpa-1 - - ibeg=ipa; iend=ipa - jbeg=jpa; jend=jpa - lbeg=lpa; lend=lpa - -! volume on the Eulerian grid - if (direction.eq.0) volE=(xf(ipa)-xf(ipa-1))*(yf(jpa)-yf(jpa-1))*(zf(lpa)-zf(lpa-1)) - if (direction.eq.1) volE=(xc(ipa+1)-xc(ipa))*(yf(jpa)-yf(jpa-1))*(zf(lpa)-zf(lpa-1)) - if (direction.eq.2) volE=(xf(ipa)-xf(ipa-1))*(yc(jpa+1)-yc(jpa))*(zf(lpa)-zf(lpa-1)) - if (direction.eq.3) volE=(xf(ipa)-xf(ipa-1))*(yf(jpa)-yf(jpa-1))*(zc(lpa+1)-zc(lpa)) + enddo; enddo; enddo - weight=1._pr + weight=weight/sum(weight) ! normalized - return end !#################################################################### !> @author Holger Grosshans -!> @brief allocate particle arrays +!> @brief allocate all public particle arrays subroutine allocateParticleArrays use var - real(kind=pr), allocatable, dimension(:) :: & - tup,tvp,twp,tuf,tvf,twf,tuf01,tvf01,twf01,txp,typ,tzp,tradp, & - tq_el,tfx_el,tfy_el,tfz_el,tpartn,tnGlob - integer, allocatable, dimension(:) :: & - twcollnum,tppcollnum - integer :: syncSumI,nppTot + use parallel + integer :: nppTot npTot=syncSumI(np) nppTot=syncSumI(npp) @@ -266,22 +105,37 @@ call allocateParticleArray(nppTot,up) call allocateParticleArray(nppTot,vp) call allocateParticleArray(nppTot,wp) + call allocateParticleArray(nppTot,upNext) + call allocateParticleArray(nppTot,vpNext) + call allocateParticleArray(nppTot,wpNext) call allocateParticleArray(nppTot,uf) call allocateParticleArray(nppTot,vf) call allocateParticleArray(nppTot,wf) - call allocateParticleArray(nppTot,uf01) - call allocateParticleArray(nppTot,vf01) - call allocateParticleArray(nppTot,wf01) + call allocateParticleArray(nppTot,dufdy) + call allocateParticleArray(nppTot,dufdz) call allocateParticleArray(nppTot,xp) call allocateParticleArray(nppTot,yp) call allocateParticleArray(nppTot,zp) + call allocateParticleArray(nppTot,xpNext) + call allocateParticleArray(nppTot,ypNext) + call allocateParticleArray(nppTot,zpNext) call allocateParticleArray(nppTot,radp) call allocateParticleArray(nppTot,q_el) + call allocateParticleArray(nppTot,q_elNext) call allocateParticleArray(nppTot,fx_el) call allocateParticleArray(nppTot,fy_el) call allocateParticleArray(nppTot,fz_el) + call allocateParticleArray(nppTot,fx_d) + call allocateParticleArray(nppTot,fy_d) + call allocateParticleArray(nppTot,fz_d) + call allocateParticleArray(nppTot,fx_l) + call allocateParticleArray(nppTot,fy_l) + call allocateParticleArray(nppTot,fz_l) call allocateParticleArray(nppTot,partn) + call allocateParticleArrayI(nppTot,ip) + call allocateParticleArrayI(nppTot,jp) + call allocateParticleArrayI(nppTot,lp) call allocateParticleArrayI(nppTot,wcollnum) call allocateParticleArrayI(nppTot,ppcollnum) call allocateParticleArrayI(nppTot,nGlob) @@ -290,8 +144,7 @@ subroutine allocateParticleArray(nppTot,myvar) use var - real(kind=pr), allocatable, dimension(:) :: & - myvar,tmyvar + real(kind=pr), allocatable, dimension(:) :: myvar,tmyvar integer :: nppTot if (nppTot.ge.1) then @@ -309,8 +162,7 @@ subroutine allocateParticleArrayI(nppTot,myvar) use var - integer, allocatable, dimension(:) :: & - myvar,tmyvar + integer, allocatable, dimension(:) :: myvar,tmyvar integer :: nppTot if (nppTot.ge.1) then @@ -328,31 +180,142 @@ end +!#################################################################### +!> @author Holger Grosshans +!> @brief send particles to next processor, all required variables for further transport + subroutine particlesNextProc + use var + use parallel + use mpi + integer, dimension (maxnp) :: np_sendr,np_sendl,np_recvl,np_recvr + integer :: n,m + + np_sendl=0 + np_sendr=0 + + do 1 n=1,np + + if (prev.ne.mpi_proc_null) then + if (xp(n).le.xmin) then + np_sendl(n)=1 + else + np_sendl(n)=0 + endif + endif + if (next.ne.mpi_proc_null) then + if (xp(n).ge.xmax) then + np_sendr(n)=1 + else + np_sendr(n)=0 + endif + endif + +1 enddo + + npp=np + np_recvl=0 + np_recvr=0 + + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,xp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,yp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,zp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,xpNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,ypNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,zpNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,radp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,up) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,vp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,wp) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,upNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,vpNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,wpNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,q_el) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,q_elNext) + call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,partn) + call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,wcollnum) + call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,ppcollnum) + call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,nGlob) + + if ((bcx.eq.'p').and.(myid.eq.nrprocs-1)) then + do 2 n=npp+1,np + if (np_recvr(n).eq.1) xp(n)= xp(n) + dimxtot +2 enddo + endif + if ((bcx.eq.'p').and.(myid.eq.0)) then + do 3 n=npp+1,np + if (np_recvl(n).eq.1) xp(n)= xp(n) - dimxtot +3 enddo + endif + + m=0 ! remove sent particles + do 4 n=1,np + if ((xp(n).ge.xmin).and.(xp(n).le.xmax)) then + m=m+1 + call partN2M(n,m) + endif +4 enddo + np=m + + end !#################################################################### !> @author Holger Grosshans -!> @brief locate particles on Eulerian grid - subroutine particlesToCells +!> @brief move particle from storage position n to m, all required variables for further transport + subroutine partN2M(n,m) use var - integer :: i,j,l,n,ip,jp,lp + integer :: n,m - npic(:,:,:)=0 + xp(m)=xp(n) + yp(m)=yp(n) + zp(m)=zp(n) + xpNext(m)=xpNext(n) + ypNext(m)=ypNext(n) + zpNext(m)=zpNext(n) + radp(m)=radp(n) + up(m)=up(n) + vp(m)=vp(n) + wp(m)=wp(n) + upNext(m)=upNext(n) + vpNext(m)=vpNext(n) + wpNext(m)=wpNext(n) + q_el(m)=q_el(n) + q_elNext(m)=q_elNext(n) + partn(m)=partn(n) + wcollnum(m)=wcollnum(n) + ppcollnum(m)=ppcollnum(n) + nGlob(m)=nGlob(n) + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief locate particles on Eulerian grid, required after moving +!> particles: nextTimestep, particlesNextProc, particlesSeed + subroutine particlesToCells + use var + integer :: n + + npic=0 do 1 n=1,np - i=ip(n); j=jp(n); l=lp(n) - npic(i,j,l)=npic(i,j,l)+1 + ip(n)=minloc(xf, dim=1, mask=(xp(n).lt.xf)) + jp(n)=minloc(yf, dim=1, mask=(yp(n).lt.yf)) + lp(n)=minloc(zf, dim=1, mask=(zp(n).lt.zf)) + + if (celltype(ip(n),jp(n),lp(n)).ne.active) then + write(*,*) 'particle lost, proc=',myid,', xp=',xp(n),', yp=',yp(n),', zp=',zp(n) + stop + endif + + npic(ip(n),jp(n),lp(n))=npic(ip(n),jp(n),lp(n))+1 1 enddo if (allocated(nic)) deallocate(nic) allocate(nic(ii,jj,ll,maxval(npic))) nic=0 - do 2 n=1,np - i=ip(n); j=jp(n); l=lp(n) - nic(i,j,l,count(nic(i,j,l,:).ne.0)+1)=n + nic(ip(n),jp(n),lp(n),count(nic(ip(n),jp(n),lp(n),:).ne.0)+1)=n 2 enddo - - return end diff --git a/src/particlesTransport.f90 b/src/particlesTransport.f90 index ee4045f..b24d406 100644 --- a/src/particlesTransport.f90 +++ b/src/particlesTransport.f90 @@ -1,135 +1,180 @@ !#################################################################### !> @author Holger Grosshans -!> @brief calculate the fluid velocity around each particle - subroutine fluidVelocity - use var - real(kind=pr),dimension(3,3,3) :: weight - real(kind=pr) volE - integer :: n,ibeg,iend,jbeg,jend,lbeg,lend,i,j,l,iw,jw,lw - integer :: direction,ip,jp,lp +!> @brief explicit first-order Euler forward integration of particle +!> velocities to next time-step + subroutine particlesVelocityNext + use var + use parallel + real(kind=pr),dimension(maxnp) :: dup,dvp,dwp + real(kind=pr) :: f_g(3) + + f_g= (1-rhof/rhop)*g + + dup(1:np)= (fx_d(1:np) + fx_l(1:np) + fx_el(1:np) + f_g(1)) * dtNext + dvp(1:np)= (fy_d(1:np) + fy_l(1:np) + fy_el(1:np) + f_g(2)) * dtNext + dwp(1:np)= (fz_d(1:np) + fz_l(1:np) + fz_el(1:np) + f_g(3)) * dtNext + + upNext(1:np)= up(1:np) + dup(1:np) + vpNext(1:np)= vp(1:np) + dvp(1:np) + wpNext(1:np)= wp(1:np) + dwp(1:np) + + dup_max=max(maxval(abs(dup(1:np))),maxval(abs(dvp(1:np))),maxval(abs(dwp(1:np)))) + dup_max=syncMax(dup_max) + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief particle drag force + subroutine particlesDrag + use var + use parallel + real(kind=pr) :: rtau_p + integer :: n + + call fluidVelocity + + rtau_p_max=0._pr - uf01=uf; vf01=vf; wf01=wf - uf=0._pr; vf=0._pr; wf=0._pr - do 1 n=1,np - if (celltype(ip(n),jp(n),lp(n)).ne.active) cycle - do 4 direction=1,3 - call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,direction) - do i=ibeg,iend; do j=jbeg,jend; do l=lbeg,lend - iw=i+1-ibeg - jw=j+1-jbeg - lw=l+1-lbeg - if (direction.eq.1) uf(n)=uf(n)+weight(iw,jw,lw)*u(i,j,l) - if (direction.eq.2) vf(n)=vf(n)+weight(iw,jw,lw)*v(i,j,l) - if (direction.eq.3) wf(n)=wf(n)+weight(iw,jw,lw)*w(i,j,l) - enddo; enddo; enddo -4 enddo + call calcRtau_p(rtau_p,n) + fx_d(n)= (uf(n)-up(n))*rtau_p + fy_d(n)= (vf(n)-vp(n))*rtau_p + fz_d(n)= (wf(n)-wp(n))*rtau_p 1 enddo - return + rtau_p_max=syncMax(rtau_p_max) + end - !#################################################################### !> @author Holger Grosshans -!> @brief calculate drag coefficient and steady state drag - real(kind=pr) function drag(n) +!> @brief particle lift force (Saffman, 1965, 1968, correction by Mei, 1992) + subroutine particlesLift use var - real(kind=pr) :: urel,Reyp,cd + real(kind=pr) :: urel,Reyp,Reyf,beta,Cls integer :: n + call fluidVelocityGradient - urel= sqrt(( uf01(n)-up(n))*(uf01(n)-up(n)) & - +(vf01(n)-vp(n))*(vf01(n)-vp(n)) & - +(wf01(n)-wp(n))*(wf01(n)-wp(n))) + do 1 n=1,np + urel= sqrt((uf(n)-up(n))**2+(vf(n)-vp(n))**2+(wf(n)-wp(n))**2) + Reyp= max(1.e-10_pr,2._pr*radp(n)*urel/nuf) + Reyf= radp(n)**2/nuf*sqrt(dufdy(n)**2+dufdz(n)**2) + beta= Reyf/Reyp/2._pr + + if (Reyp.le.40._pr) then + Cls= (1._pr-0.3314_pr*sqrt(beta))*exp(-Reyp/10._pr)+0.3314_pr*sqrt(beta) + else + Cls= 0.0524_pr*sqrt(beta*Reyp) + endif + + fx_l(n)= 0._pr + fy_l(n)= 1.54_pr*sqrt(nuf)*rhof/rhop/radp(n)*(uf(n)-up(n))*sign(sqrt(abs(dufdy(n))),dufdy(n))*Cls + fz_l(n)= 1.54_pr*sqrt(nuf)*rhof/rhop/radp(n)*(uf(n)-up(n))*sign(sqrt(abs(dufdz(n))),dufdz(n))*Cls +1 enddo + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief reciprocal (to avoid NaN) particle response time (Putnam, 1961) + subroutine calcRtau_p(rtau_p,n) + use var + real(kind=pr) :: urel,Reyp,Cd,rtau_p + integer :: n + + urel= sqrt((uf(n)-up(n))**2+(vf(n)-vp(n))**2+(wf(n)-wp(n))**2) Reyp= max(1.e-10_pr,2._pr*radp(n)*urel/nuf) - if (Reyp.gt.1000._pr) then - cd= 0.424_pr + + if (Reyp.lt.1000._pr) then + Cd= 24._pr/Reyp * (1._pr + 1._pr/6._pr*Reyp**(2._pr/3._pr)) else - cd= 24._pr/Reyp * (1._pr + 1._pr/6._pr*Reyp**(2._pr/3._pr)) + Cd= 0.424_pr endif - drag= 0.375_pr*rhof*urel*cd/(rhop*radp(n)) - !drag=0._pr + + rtau_p= 3._pr*rhof*urel*Cd/(8._pr*rhop*radp(n)) + rtau_p_max=max(rtau_p_max,rtau_p) + if (rtau_p.gt.(1._pr/dtNext)) rtau_p= 1._pr/dtNext ! stability criteria Euler forward - return end !#################################################################### !> @author Holger Grosshans -!> @brief explicit first order integration of particle velocities - subroutine particlesVelocity - use var - real(kind=pr),dimension(3) :: f_fl,f_g - real(kind=pr) :: fact,dragdt,drag - integer :: n,ip,jp,lp +!> @brief calculate the fluid velocity around each particle + subroutine fluidVelocity + use var + real(kind=pr),dimension(2,2,2) :: weight + real(kind=pr) volE + integer :: n,ibeg,iend,jbeg,jend,lbeg,lend + integer :: direction do 1 n=1,np - if (celltype(ip(n),jp(n),lp(n)).ne.active) cycle - - f_fl(1)= drag(n)*(uf01(n)-up(n)) - f_fl(2)= drag(n)*(vf01(n)-vp(n)) - f_fl(3)= drag(n)*(wf01(n)-wp(n)) - - f_g(1)= (1-rhof/rhop)*g(1) - f_g(2)= (1-rhof/rhop)*g(2) - f_g(3)= (1-rhof/rhop)*g(3) + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,1) + uf(n)=sum(weight*u(ibeg:iend,jbeg:jend,lbeg:lend)) + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,2) + vf(n)=sum(weight*v(ibeg:iend,jbeg:jend,lbeg:lend)) + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,3) + wf(n)=sum(weight*w(ibeg:iend,jbeg:jend,lbeg:lend)) +1 enddo - up(n)= up(n) + (f_fl(1) + fx_el(n) + f_g(1))*dt - up(n)= max(up(n),-2._pr*ubulk) - up(n)= min(up(n),2._pr*ubulk) + end - vp(n)= vp(n) + (f_fl(2) + fy_el(n) + f_g(2))*dt - vp(n)= max(vp(n),-ubulk) - vp(n)= min(vp(n),ubulk) +!#################################################################### +!> @author Holger Grosshans +!> @brief calculate the fluid velocity gradient around each particle + subroutine fluidVelocityGradient + use var + real(kind=pr),dimension(2,2,2) :: weight + real(kind=pr) volE + integer :: n,ibeg,iend,jbeg,jend,lbeg,lend,i,j,l,iw,jw,lw - wp(n)= wp(n) + (f_fl(3) + fz_el(n) + f_g(3))*dt - wp(n)= max(wp(n),-ubulk) - wp(n)= min(wp(n),ubulk) + dufdy=0._pr; dufdz=0._pr + + do 1 n=1,np + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,1) ! could be extended for 2 and 3 + do l=lbeg,lend; do j=jbeg,jend; do i=ibeg,iend + iw=i+1-ibeg; jw=j+1-jbeg; lw=l+1-lbeg + dufdy(n)=dufdy(n)+weight(iw,jw,lw)*(u(i,j+1,l)-u(i,j-1,l))/(yc(j+1)-yc(j-1)) + dufdz(n)=dufdz(n)+weight(iw,jw,lw)*(u(i,j,l+1)-u(i,j,l-1))/(zc(l+1)-zc(l-1)) + enddo; enddo; enddo 1 enddo - return end - !#################################################################### !> @author Holger Grosshans -!> @brief move particles - subroutine particlesTransport +!> @brief second-order Crank-Nicolson integration of particle positions to next time-step + subroutine particlesTransportNext use var - use mpi - real(kind=pr) :: xpold,ypold,zpold - integer, dimension (maxnp) :: & - np_sendr,np_sendl,np_recvl,np_recvr - integer :: n,m,i,j,l - integer :: syncSumI + use parallel + integer :: n,m character(70) :: filename logical :: remove(maxnp) remove=.false. npTot=syncSumI(np) - if (myid.eq.0) write(*,'(a,i9)',advance='no') ' |transp. =',npTot - - np_sendl=0 - np_sendr=0 - - do 1 n=1,np - xpold=xp(n) - ypold=yp(n) - zpold=zp(n) - xp(n)=xpold+up(n)*dt - yp(n)=ypold+vp(n)*dt - zp(n)=zpold+wp(n)*dt - -! boundary conditions - if (bcx.eq.'w') then - if (((myid.eq.0.).and.(xp(n).lt.xmin+radp(n))).or. & - ((myid.eq.nrprocs-1).and.(xp(n).gt.xmax-radp(n)))) then - up(n)=-up(n)*restRatio - xp(n)=xpold+up(n)*dt + xpNext(1:np)= xp(1:np)+(up(1:np)*dt+upNext(1:np)*dtNext)*dtNext/(dt+dtNext) + ypNext(1:np)= yp(1:np)+(vp(1:np)*dt+vpNext(1:np)*dtNext)*dtNext/(dt+dtNext) + zpNext(1:np)= zp(1:np)+(wp(1:np)*dt+wpNext(1:np)*dtNext)*dtNext/(dt+dtNext) + + do 1 n=1,np ! boundary conditions + + if (bcx.eq.'p') then ! x-direction + ! done in particlesNextProc + elseif (bcx.eq.'w') then + if (((myid.eq.0.).and.(xpNext(n).lt.xmin+radp(n))).or. & + ((myid.eq.nrprocs-1).and.(xpNext(n).gt.xmax-radp(n)))) then + upNext(n)=-upNext(n)*restRatio + if (xpNext(n).gt.xmax-radp(n)) then + xpNext(n)=(xmax-radp(n)) - (xpNext(n)-(xmax-radp(n))) + elseif (xpNext(n).lt.xmin+radp(n)) then + xpNext(n)=(xmin+radp(n)) - (xpNext(n)-(xmin+radp(n))) + endif + wcollnum(n)=wcollnum(n)+1 if (qpmax.ne.qp0) call chargeParticleWall(n,1) endif elseif (bcx.eq.'i') then @@ -142,89 +187,42 @@ endif endif - if (bcy.eq.'p') then - if (yp(n).lt.ymin) yp(n)=yp(n)+dimy - if (yp(n).gt.ymax) yp(n)=yp(n)-dimy + if (bcy.eq.'p') then ! y-direction + if (ypNext(n).lt.ymin) ypNext(n)=ypNext(n)+dimy + if (ypNext(n).gt.ymax) ypNext(n)=ypNext(n)-dimy elseif (bcy.eq.'w') then - if ((yp(n).lt.ymin+radp(n)).or.(yp(n).gt.ymax-radp(n))) then - vp(n)=-vp(n)*restRatio - yp(n)=ypold+vp(n)*dt + if ((ypNext(n).lt.ymin+radp(n)).or.(ypNext(n).gt.ymax-radp(n))) then + vpNext(n)=-vpNext(n)*restRatio + if (ypNext(n).gt.ymax-radp(n)) then + ypNext(n)=(ymax-radp(n)) - (ypNext(n)-(ymax-radp(n))) + elseif (ypNext(n).lt.ymin+radp(n)) then + ypNext(n)=(ymin+radp(n)) - (ypNext(n)-(ymin+radp(n))) + endif wcollnum(n)=wcollnum(n)+1 if (qpmax.ne.qp0) call chargeParticleWall(n,2) endif endif - if (bcz.eq.'p') then - if (zp(n).lt.zmin) zp(n)=zp(n)+dimz - if (zp(n).gt.zmax) zp(n)=zp(n)-dimz + if (bcz.eq.'p') then ! z-direction + if (zpNext(n).lt.zmin) zpNext(n)=zpNext(n)+dimz + if (zpNext(n).gt.zmax) zpNext(n)=zpNext(n)-dimz elseif (bcz.eq.'w') then - if ((zp(n).lt.zmin+radp(n)).or.(zp(n).gt.zmax-radp(n))) then - wp(n)=-wp(n)*restRatio - zp(n)=zpold+wp(n)*dt + if ((zpNext(n).lt.zmin+radp(n)).or.(zpNext(n).gt.zmax-radp(n))) then + wpNext(n)=-wpNext(n)*restRatio + if (zpNext(n).gt.zmax-radp(n)) then + zpNext(n)=(zmax-radp(n)) - (zpNext(n)-(zmax-radp(n))) + elseif (zpNext(n).lt.zmin+radp(n)) then + zpNext(n)=(zmin+radp(n)) - (zpNext(n)-(zmin+radp(n))) + endif wcollnum(n)=wcollnum(n)+1 if (qpmax.ne.qp0) call chargeParticleWall(n,3) endif endif - -! particles are send (=1) if they are either on the active ghost -! cells or crossed the border to the next processor - if (prev.ne.mpi_proc_null) then - if ((xp(n).gt.xmin).and.(xp(n).lt.xf(gc+gc)).or. & - (xpold.gt.xmin).and.(xp(n).le.xmin)) then - np_sendl(n)=1 - else - np_sendl(n)=0 - endif - endif - if (next.ne.mpi_proc_null) then - if ((xp(n).gt.xf(imax-gc)).and.(xp(n).lt.xmax).or. & - (xpold.lt.xmax).and.(xp(n).ge.xmax)) then - np_sendr(n)=1 - else - np_sendr(n)=0 - endif - endif - 1 enddo - npp=np - np_recvl=0 - np_recvr=0 - - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,xp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,yp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,zp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,radp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,up) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,vp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,wp) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,q_el) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,uf) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,vf) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,wf) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,uf01) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,vf01) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,wf01) - call syncPart(np_sendl,np_sendr,np_recvl,np_recvr,partn) - call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,wcollnum) - call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,ppcollnum) - call syncPartI(np_sendl,np_sendr,np_recvl,np_recvr,nGlob) - - - if ((bcx.eq.'p').and.(myid.eq.nrprocs-1)) then - do 2 n=npp+1,np - if (np_recvr(n).eq.1) xp(n)= xp(n) + dimxtot -2 enddo - endif - if ((bcx.eq.'p').and.(myid.eq.0)) then - do 3 n=npp+1,np - if (np_recvl(n).eq.1) xp(n)= xp(n) - dimxtot -3 enddo - endif - - if ((bcx.eq.'i').and.(myid.eq.nrprocs-1)) then + if ((bcx.eq.'i').and.(myid.eq.nrprocs-1)) then ! remove particles from outlet m=0 do 4 n=1,np if (remove(n)) then @@ -241,9 +239,6 @@ np=m endif - call particlesToCells - - return end !#################################################################### @@ -251,235 +246,143 @@ !> @brief compute momentum source term for fluid phase (habil eq 2.12) subroutine momentumCoupling use var - real(kind=pr), dimension(ii,jj,ll) :: & - rui,rvi,rwi,source_u,source_v,source_w - real(kind=pr) :: f_d(3),volp,source,drag,sp_r,volE - real(kind=pr),dimension(3,3,3) :: weight - integer :: n,ibeg,iend,jbeg,jend,lbeg,lend,i,j,l,iw,jw,lw - integer :: direction,m,ip,jp,lp - - - rui=0._pr - rvi=0._pr - rwi=0._pr - source_u=0._pr - source_v=0._pr - source_w=0._pr - - do 1 n=1,np - - if ((ip(n).lt.(imin-1)).or.(ip(n).gt.(imax+1)).or. & - (jp(n).lt.(jmin-1)).or.(jp(n).gt.(jmax+1)).or. & - (lp(n).lt.(lmin-1)).or.(lp(n).gt.(lmax+1))) cycle - + real(kind=pr) :: volE,partmass + real(kind=pr),dimension(2,2,2) :: weight + integer :: n,ibeg,iend,jbeg,jend,lbeg,lend -! only drag forces - f_d(1)= drag(n)*(uf(n)-up(n)) - f_d(2)= drag(n)*(vf(n)-vp(n)) - f_d(3)= drag(n)*(wf(n)-wp(n)) - - volp= 4._pr/3._pr*pi*partn(n)*radp(n)**3 - - do 2 direction=1,3 - call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,direction) - -! compute source terms for the parcel - do l=lbeg,lend; do i=ibeg,iend; do j=jbeg,jend - iw=i+1-ibeg - jw=j+1-jbeg - lw=l+1-lbeg - if (direction.eq.1) then - source= rhop/rhof * volp/volE * f_d(1) - rui(i,j,l)= rui(i,j,l) + source*weight(iw,jw,lw) - elseif (direction.eq.2) then - source= rhop/rhof * volp/volE * f_d(2) - rvi(i,j,l)= rvi(i,j,l) + source*weight(iw,jw,lw) - elseif (direction.eq.3) then - source= rhop/rhof * volp/volE * f_d(3) - rwi(i,j,l)= rwi(i,j,l) + source*weight(iw,jw,lw) - endif - enddo; enddo; enddo + Fsx=0._pr; Fsy=0._pr; Fsz=0._pr + + call particlesDrag ! only aerodynamic forces + call particlesLift -2 enddo + do 1 n=1,np + partmass= rhop*4._pr/3._pr*pi*partn(n)*radp(n)**3 + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,1) + Fsx(ibeg:iend,jbeg:jend,lbeg:lend)= Fsx(ibeg:iend,jbeg:jend,lbeg:lend) & + - partmass/rhof/volE*(fx_d(n)+fx_l(n))*weight + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,2) + Fsy(ibeg:iend,jbeg:jend,lbeg:lend)= Fsy(ibeg:iend,jbeg:jend,lbeg:lend) & + - partmass/rhof/volE*(fy_d(n)+fy_l(n))*weight + call weightLE8(weight,ibeg,iend,jbeg,jend,lbeg,lend,volE,n,3) + Fsz(ibeg:iend,jbeg:jend,lbeg:lend)= Fsz(ibeg:iend,jbeg:jend,lbeg:lend) & + - partmass/rhof/volE*(fz_d(n)+fz_l(n))*weight 1 enddo -! hg not sure if I want this -! sp_r=0.70 ! relax the contribution to the momentum equation -! -! do 6 i=imin,imax; do 6 j=jmin,jmax; do 6 l=lmin,lmax -! rup(i,j,l) = -((1.-sp_r)*rui(i,j,l)+rui_o(i,j,l)*sp_r) -! rvp(i,j,l) = -((1.-sp_r)*rvi(i,j,l)+rvi_o(i,j,l)*sp_r) -! rwp(i,j,l) = -((1.-sp_r)*rwi(i,j,l)+rwi_o(i,j,l)*sp_r) -! -! rui_o(i,j,l)=rui(io) -! rvi_o(i,j,l)=rvi(io) -! rwi_o(i,j,l)=rwi(io) -!6 enddo - - do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax - fsx(i,j,l)= -rui(i,j,l) - fsy(i,j,l)= -rvi(i,j,l) - fsz(i,j,l)= -rwi(i,j,l) -! fsx(i,j,l)= 0._pr -! fsy(i,j,l)= 0._pr -! fsz(i,j,l)= 0._pr - enddo; enddo; enddo - -! remove particles of another processor, they were only needed for source term - m=0 - do 3 n=1,np - if ((xp(n).ge.xmin).and.(xp(n).le.xmax)) then - m=m+1 - call partN2M(n,m) - endif -3 enddo - np=m + call bcLEsource(Fsx); call bcLEsource(Fsy); call bcLEsource(Fsz) - - return end - !#################################################################### !> @author Holger Grosshans -!> @brief compute particles collisions using ray casting - subroutine particlesCollide +!> @brief particles collisions in next time-step using ray casting + subroutine particlesCollideNext use var real(kind=pr),dimension(maxnp) :: xpc,ypc,zpc - real(kind=pr),dimension(3) :: relvelo,midlink,ncontact + real(kind=pr),dimension(3) :: relvelo,midlink,ncontact,vn,ve real(kind=pr) :: sumrad,upp1,vpp1,wpp1,upp2,vpp2,wpp2, & - partn1,partn2,partdist, & - r3n1,r3n2,rxx,projvtox,srel,projvton, & - closestrelvelo,fracdt, & - vex,vey,vez,vnx,vny,vnz - integer :: n1,n2,numcol,ip,jp,lp,m1,m2,i,j,l,syncSumI + partdist,r3n1,r3n2,projvtox,srel,projvton, & + closestrelvelo,fracdt + integer :: n1,n2,m1,m2,i,j,l,syncSumI - - numcol=0 - - do i=1,ii; do j=1,jj; do l=1,ll + do l=1,ll; do j=1,jj; do i=1,ii ! condition I only particles in same cell: do 1 m1=2,npic(i,j,l) do 2 m2=1,(m1-1) - n1=nic(i,j,l,m1) - n2=nic(i,j,l,m2) + n1=nic(i,j,l,m1) + n2=nic(i,j,l,m2) ! setting the 2 particles in the rest frame of particle n2 - relvelo(1)=up(n1)-up(n2) - relvelo(2)=vp(n1)-vp(n2) - relvelo(3)=wp(n1)-wp(n2) - midlink(1)=xp(n2)-xp(n1) - midlink(2)=yp(n2)-yp(n1) - midlink(3)=zp(n2)-zp(n1) - projvtox=dot_product(midlink,(relvelo*dt)) + relvelo= (/ up(n1)-up(n2) , vp(n1)-vp(n2) , wp(n1)-wp(n2) /) + midlink= (/ xp(n2)-xp(n1) , yp(n2)-yp(n1) , zp(n2)-zp(n1) /) + projvtox=dot_product(midlink,(relvelo*dtNext)) ! condition IIa to check collision (propagation direction): - if (projvtox.lt.0._pr) cycle + if (projvtox.lt.0._pr) cycle - srel=sqrt(dot_product((relvelo*dt),(relvelo*dt))) + srel= sqrt(dot_product((relvelo*dtNext),(relvelo*dtNext))) ! condition IIb to check collision (no rel velocity, no collision): - if (abs(srel).lt.1.e-19_pr) cycle + if (abs(srel).lt.1.e-19_pr) cycle - partdist=sqrt(dot_product(midlink,midlink)) - sumrad=radp(n1)+radp(n2) + partdist= sqrt(dot_product(midlink,midlink)) + sumrad= radp(n1)+radp(n2) ! condition III to check collision (contact expected): - if ((partdist**2-(projvtox/srel)**2).gt.sumrad**2) then - cycle - elseif (partdist.le.sumrad) then ! if overlapping after seeding - cycle - endif + if ((partdist**2-(projvtox/srel)**2).gt.sumrad**2) then + cycle + elseif (partdist.le.sumrad) then ! if overlapping after seeding + cycle + endif - closestrelvelo=sqrt(sumrad**2-(partdist**2-(projvtox/srel)**2)) - fracdt=(projvtox/srel-closestrelvelo)/srel + closestrelvelo= sqrt(sumrad**2-(partdist**2-(projvtox/srel)**2)) + fracdt= (projvtox/srel-closestrelvelo)/srel ! condition IV to check collision (contact during next timestep): - if ((fracdt.gt.1._pr).or.(fracdt.lt.0._pr)) cycle + if ((fracdt.gt.1._pr).or.(fracdt.lt.0._pr)) cycle ! all conditions fullfilled -> collision happens - ppcollnum(n1)=ppcollnum(n1)+1 - ppcollnum(n2)=ppcollnum(n2)+1 - numcol=numcol+1 - if (q_el(n1).ne.q_el(n2)) call chargeParticleParticle(n1,n2) + ppcollnum(n1)= ppcollnum(n1)+1 + ppcollnum(n2)= ppcollnum(n2)+1 + if (q_el(n1).ne.q_el(n2)) call chargeParticleParticle(n1,n2) ! fictitious contact point - xpc(n1)=xp(n1)+fracdt*up(n1)*dt - ypc(n1)=yp(n1)+fracdt*vp(n1)*dt - zpc(n1)=zp(n1)+fracdt*wp(n1)*dt - xpc(n2)=xp(n2)+fracdt*up(n2)*dt - ypc(n2)=yp(n2)+fracdt*vp(n2)*dt - zpc(n2)=zp(n2)+fracdt*wp(n2)*dt + xpc(n1)= xp(n1)+fracdt*up(n1)*dtNext + ypc(n1)= yp(n1)+fracdt*vp(n1)*dtNext + zpc(n1)= zp(n1)+fracdt*wp(n1)*dtNext + xpc(n2)= xp(n2)+fracdt*up(n2)*dtNext + ypc(n2)= yp(n2)+fracdt*vp(n2)*dtNext + zpc(n2)= zp(n2)+fracdt*wp(n2)*dtNext - r3n1=radp(n1)**3 - r3n2=radp(n2)**3 + r3n1= radp(n1)**3 + r3n2= radp(n2)**3 ! normal vector to the contact point ('Stossnormale') - ncontact(1)=xpc(n1)-xpc(n2) - ncontact(2)=ypc(n1)-ypc(n2) - ncontact(3)=zpc(n1)-zpc(n2) + ncontact= (/ xpc(n1)-xpc(n2) , ypc(n1)-ypc(n2) , zpc(n1)-zpc(n2) /) ! project the contact velocity on the contact normal ! these components are zero for n2 bc it is in rest - projvton=dot_product(ncontact,relvelo)/(sumrad**2) - vnx=projvton*ncontact(1) - vny=projvton*ncontact(2) - vnz=projvton*ncontact(3) + projvton= dot_product(ncontact,relvelo)/(sumrad**2) + vn= projvton*ncontact ! velocity components in the contact plane which do not change during contact ! these components are zero for n2 bc it is in rest - vex=relvelo(1)-vnx - vey=relvelo(2)-vny - vez=relvelo(3)-vnz + ve= relvelo-vn ! new v = rest frame + unchanged components in contact plane + central collision - upp1=up(n2) + vex + (r3n1-restRatio*r3n2)*vnx/(r3n1+r3n2) - vpp1=vp(n2) + vey + (r3n1-restRatio*r3n2)*vny/(r3n1+r3n2) - wpp1=wp(n2) + vez + (r3n1-restRatio*r3n2)*vnz/(r3n1+r3n2) - - upp2=up(n2) + (1._pr+restRatio)*r3n1*vnx/(r3n1+r3n2) - vpp2=vp(n2) + (1._pr+restRatio)*r3n1*vny/(r3n1+r3n2) - wpp2=wp(n2) + (1._pr+restRatio)*r3n1*vnz/(r3n1+r3n2) - - if (max(vpp1,wpp1,vpp2,wpp2,.5_pr*upp1,.5_pr*upp2).gt.2._pr*ubulk) then - print* - print*,up(n1),vp(n1),wp(n1) - print*,upp1,vpp1,wpp1 - print*,up(n2),vp(n2),wp(n2) - print*,upp2,vpp2,wpp2 - print*,projvtox,midlink,vnx,vny,vnz,vex,vey,vez - print*,up(n1)+up(n2)-upp1-upp2,vp(n1)+vp(n2)-vpp1-vpp2,wp(n1)+wp(n2)-wpp1-wpp2 - endif + upp1= up(n2) + ve(1) + (r3n1-restRatio*r3n2)*vn(1)/(r3n1+r3n2) + vpp1= vp(n2) + ve(2) + (r3n1-restRatio*r3n2)*vn(2)/(r3n1+r3n2) + wpp1= wp(n2) + ve(3) + (r3n1-restRatio*r3n2)*vn(3)/(r3n1+r3n2) - partn1=partn(n1) - partn2=partn(n2) - if(partn1.gt.partn2) then - up(n2)=upp2 - vp(n2)=vpp2 - wp(n2)=wpp2 - up(n1)=(partn2*upp1+(partn1-partn2)*up(n1))/partn1 - vp(n1)=(partn2*vpp1+(partn1-partn2)*vp(n1))/partn1 - wp(n1)=(partn2*wpp1+(partn1-partn2)*wp(n1))/partn1 - else - up(n1)=upp1 - vp(n1)=vpp1 - wp(n1)=wpp1 - up(n2)=(partn1*upp2+(partn2-partn1)*up(n2))/partn2 - vp(n2)=(partn1*vpp2+(partn2-partn1)*vp(n2))/partn2 - wp(n2)=(partn1*wpp2+(partn2-partn1)*wp(n2))/partn2 - endif + upp2= up(n2) + (1._pr+restRatio)*r3n1*vn(1)/(r3n1+r3n2) + vpp2= vp(n2) + (1._pr+restRatio)*r3n1*vn(2)/(r3n1+r3n2) + wpp2= wp(n2) + (1._pr+restRatio)*r3n1*vn(3)/(r3n1+r3n2) + if (max(vpp1,wpp1,vpp2,wpp2,.5_pr*upp1,.5_pr*upp2).gt.2._pr*ubulk) then + write(*,*) 'Warning: post-collision velocity too high' + write(*,*) up(n1),vp(n1),wp(n1),upp1,vpp1,wpp1,up(n2),vp(n2),wp(n2),upp2,vpp2,wpp2 + endif + + if(partn(n1).gt.partn(n2)) then + upNext(n2)= upp2 + vpNext(n2)= vpp2 + wpNext(n2)= wpp2 + upNext(n1)= (partn(n2)*upp1+(partn(n1)-partn(n2))*up(n1))/partn(n1) + vpNext(n1)= (partn(n2)*vpp1+(partn(n1)-partn(n2))*vp(n1))/partn(n1) + wpNext(n1)= (partn(n2)*wpp1+(partn(n1)-partn(n2))*wp(n1))/partn(n1) + else + upNext(n1)= upp1 + vpNext(n1)= vpp1 + wpNext(n1)= wpp1 + upNext(n2)= (partn(n1)*upp2+(partn(n2)-partn(n1))*up(n2))/partn(n2) + vpNext(n2)= (partn(n1)*vpp2+(partn(n2)-partn(n1))*vp(n2))/partn(n2) + wpNext(n2)= (partn(n1)*wpp2+(partn(n2)-partn(n1))*wp(n2))/partn(n2) + endif 2 enddo 1 enddo enddo; enddo; enddo - numcol=syncSumI(numcol) - if (myid.eq.0) write(*,'(a,i9)',advance='no') & - ' |collide =',numcol - - return end !#################################################################### @@ -487,9 +390,9 @@ !> @brief seed particles subroutine particlesSeed use var + use parallel real(kind=pr),allocatable,dimension(:) :: randomx,randomy,randomz - integer :: n,i,j,l,ip,jp,lp,npseed,npseedTot, & - syncSumI + integer :: n,npseed,npseedTot character(70) :: filename !> number of particles to be seeded @@ -508,9 +411,6 @@ np=npp+npseed call allocateParticleArrays - if (myid.eq.0) write(*,'(a,i9)',advance='no') & - ' |seed =',npseedTot - if (npseed.eq.0) return write(filename,'(a,i3.3,a)') 'results/particlesSeed_p',myid,'.dat' @@ -531,11 +431,11 @@ do 1 n=npp+1,np !> seed not directly on wall or an active gc: - if (bcx.eq.'i') then - xp(n)=randomx(n-npp)*ubulk*dt+xf(imin-1) - else - xp(n)=randomx(n-npp)*(dimx-2._pr*prad)+xf(imin-1)+prad - endif + if (bcx.eq.'i') then + xp(n)=randomx(n-npp)*ubulk*dt+xf(imin-1) + else + xp(n)=randomx(n-npp)*(dimx-2._pr*prad)+xf(imin-1)+prad + endif yp(n)=randomy(n-npp)*(dimy-2._pr*prad)+yf(jmin-1)+prad zp(n)=randomz(n-npp)*(dimz-2._pr*prad)+zf(lmin-1)+prad @@ -545,34 +445,26 @@ wcollnum(n)=0 ppcollnum(n)=0 - i=ip(n) - j=jp(n) - l=lp(n) - - up(n)=u(i,j,l) - if (xp(n).lt.xc(i)) up(n)=u(i-1,j,l) - vp(n)=v(i,j,l) - if (yp(n).lt.yc(j)) vp(n)=v(i,j-1,l) - wp(n)=w(i,j,l) - if (zp(n).lt.zc(l)) wp(n)=w(i,j,l-1) - + radp(n)=prad + partn(n)=1._pr + q_el(n)=qp0 + q_elNext(n)=q_el(n) ! xp(1)=0.02;yp(1)=0.;zp(1)=0. ! xp(2)=0.03;yp(2)=0.;zp(2)=0. ! up(1)=1.;up(2)=-1;vp(1)=0.;vp(2)=0.;wp(1)=0.;wp(2)=0. - uf(n)=up(n); vf(n)=vp(n); wf(n)=wp(n); - radp(n)=prad - partn(n)=1._pr - q_el(n)=qp0 - write(10,'(3(es10.2e2,x))') radp(n),q_el(n),partn(n) 1 enddo call particlesToCells - + call fluidVelocity + + up(npp+1:np)= uf(npp+1:np) + vp(npp+1:np)= vf(npp+1:np) + wp(npp+1:np)= wf(npp+1:np) + close(10) - return end diff --git a/src/post.f90 b/src/post.f90 index 515f085..9caaa17 100644 --- a/src/post.f90 +++ b/src/post.f90 @@ -3,79 +3,57 @@ subroutine postProcessing use var - if (mod(nt,int_results).eq.0.or.(nt).eq.1) then - - call monitor - call writevtk_fluid_xy - call writevtk_fluid_xz - call writevtk_fluid_yz - call writedat_ufluid_xy - call writedat_vfluid_xy - call writedat_wfluid_xy -! call writedat_ufluid_xz -! call writedat_vfluid_xz -! call writedat_wfluid_xz -! call writedat_coulomb -! call writevtk_fluid_xyz - call writevtk_particles - call writedat_particles -! call writevtk_fluid_av -! call writedat_ufluid_3d -! call writedat_vfluid_3d -! call writedat_wfluid_3d - + if ((mod(nt,int_results).eq.0).or.(nt.eq.1).or.(nt.eq.ntend)) then + call monitor + call writevtk_fluid_xy + call writevtk_fluid_xz + call writevtk_fluid_yz + call writevtk_fluid_xyz + call writevtk_particles + call writedat_particles endif - if (mod(nt,int_restart).eq.0) call saveField + if ((mod(nt,int_restart).eq.0).or.(nt.eq.ntend)) call saveField - return end !#################################################################### !> @author Holger Grosshans subroutine monitor use var + use parallel real(kind=pr) :: ucl,avu,avv,avw,tke,gradu,graduy,graduz, & Rec,Reb,avvp,avwp,avyp,avzp,avvf,avwf,avxp,avqp, & - syncAv,syncSum,C01,A01 - integer :: i,j,l,m,N01,syncSumI + rmsv,rmsw,C05,A05 + integer :: i,j,l,m,N05 logical :: file_ex character(70) :: filename2 + if (bcy.eq.'w'.and.bcz.eq.'w') then + ucl= sum(u(imin:imax,int(jj/2),int(ll/2)))/(imax-imin+1) + elseif (bcy.eq.'w'.and.bcz.eq.'p') then + ucl= sum(u(imin:imax,int(jj/2),lmin:lmax))/(imax-imin+1)/(lmax-lmin+1) + elseif (bcy.eq.'p'.and.bcz.eq.'w') then + ucl= sum(u(imin:imax,jmin:jmax,int(ll/2)))/(imax-imin+1)/(jmax-jmin+1) + endif + avu= sum(u(imin:imax,jmin:jmax,lmin:lmax)*volu(imin:imax,jmin:jmax,lmin:lmax)) / volTot + avv= sum(v(imin:imax,jmin:jmax,lmin:lmax)*volv(imin:imax,jmin:jmax,lmin:lmax)) / volTot + avw= sum(w(imin:imax,jmin:jmax,lmin:lmax)*volw(imin:imax,jmin:jmax,lmin:lmax)) / volTot - j=int(jj/2); l=int(ll/2) - - ucl= sum(u(imin:imax,j,l))/(imax-imin+1) - - avu= sum(u(imin:imax,jmin:jmax,lmin:lmax) & - *vol(imin:imax,jmin:jmax,lmin:lmax)) / volTot - avv= sum(v(imin:imax,jmin:jmax,lmin:lmax) & - *vol(imin:imax,jmin:jmax,lmin:lmax)) / volTot - avw= sum(w(imin:imax,jmin:jmax,lmin:lmax) & - *vol(imin:imax,jmin:jmax,lmin:lmax)) / volTot - - rmsv = sum((v(imin:imax,jmin:jmax,lmin:lmax))**2 & - *vol(imin:imax,jmin:jmax,lmin:lmax)) / volTot + rmsv=sum((v(imin:imax,jmin:jmax,lmin:lmax))**2 *volv(imin:imax,jmin:jmax,lmin:lmax)) / volTot rmsv=sqrt(rmsv) - rmsw = sum((w(imin:imax,jmin:jmax,lmin:lmax))**2 & - *vol(imin:imax,jmin:jmax,lmin:lmax)) / volTot + rmsw=sum((w(imin:imax,jmin:jmax,lmin:lmax))**2 *volw(imin:imax,jmin:jmax,lmin:lmax)) / volTot rmsw=sqrt(rmsw) - graduy= & - (sum(u(imin:imax,jmin,lmin:lmax)*vol(imin:imax,jmin,lmin:lmax)) & - +sum(u(imin:imax,jmax,lmin:lmax)*vol(imin:imax,jmax,lmin:lmax)))& - / & - (sum(vol(imin:imax,jmin,lmin:lmax)) & - +sum(vol(imin:imax,jmax,lmin:lmax)))& - / (ymax-yc(jmax)) - graduz= & - (sum(u(imin:imax,jmin:jmax,lmin)*vol(imin:imax,jmin:jmax,lmin)) & - +sum(u(imin:imax,jmin:jmax,lmax)*vol(imin:imax,jmin:jmax,lmax))) & - / & - (sum(vol(imin:imax,jmin:jmax,lmin)) & - +sum(vol(imin:imax,jmin:jmax,lmax))) & - / (zmax-zc(lmax)) + graduy= ( sum(u(imin:imax,jmin,lmin:lmax)*volu(imin:imax,jmin,lmin:lmax)) & + +sum(u(imin:imax,jmax,lmin:lmax)*volu(imin:imax,jmax,lmin:lmax))) & + / (sum(volu(imin:imax,jmin,lmin:lmax))+sum(volu(imin:imax,jmax,lmin:lmax))) & + / (ymax-yc(jmax)) + graduz= ( sum(u(imin:imax,jmin:jmax,lmin)*volu(imin:imax,jmin:jmax,lmin)) & + +sum(u(imin:imax,jmin:jmax,lmax)*volu(imin:imax,jmin:jmax,lmax))) & + / (sum(volu(imin:imax,jmin:jmax,lmin))+sum(volu(imin:imax,jmin:jmax,lmax))) & + / (zmax-zc(lmax)) if (bcy.eq.'w'.and.bcz.eq.'w') gradu=(graduy+graduz)/2._pr if (bcy.eq.'w'.and.bcz.eq.'p') gradu=graduy @@ -86,45 +64,43 @@ avzp=syncSum(sum(zp(1:np)))/npTot avqp=syncSum(sum(q_el(1:np)))/npTot if (bcy.eq.'w'.and.bcz.eq.'w') then - N01=count((min((yp(1:np)-ymin),(ymax-yp(1:np))).le.(dimy*0.01_pr)).or. & - (min((zp(1:np)-zmin),(zmax-zp(1:np))).le.(dimz*0.01_pr))) - A01=(dimy*dimz)-(dimy*0.98_pr)*(dimz*0.98_pr) + N05=count((min((yp(1:np)-ymin),(ymax-yp(1:np))).le.(dimy*0.05_pr)).or. & + (min((zp(1:np)-zmin),(zmax-zp(1:np))).le.(dimz*0.05_pr))) + A05=(dimy*dimz)-(dimy*0.90_pr)*(dimz*0.90_pr) elseif (bcy.eq.'w'.and.bcz.eq.'p') then - N01=count(min((yp(1:np)-ymin),(ymax-yp(1:np))).le.(dimy*0.01_pr)) - A01=(dimy*dimz)-(dimy*0.98_pr)*dimz + N05=count(min((yp(1:np)-ymin),(ymax-yp(1:np))).le.(dimy*0.05_pr)) + A05=(dimy*dimz)-(dimy*0.90_pr)*dimz elseif (bcy.eq.'p'.and.bcz.eq.'w') then - N01=count(min((zp(1:np)-zmin),(zmax-zp(1:np))).le.(dimz*0.01_pr)) - A01=(dimy*dimz)-dimy*(dimz*0.98_pr) + N05=count(min((zp(1:np)-zmin),(zmax-zp(1:np))).le.(dimz*0.05_pr)) + A05=(dimy*dimz)-dimy*(dimz*0.90_pr) endif - C01=syncSumI(N01)/(A01*dimxTot)/pnd + C05=real(syncSumI(N05),kind=pr)/(A05*dimxTot)/pnd else npTot=0 - avyp=0._pr - avzp=0._pr - avqp=0._pr - C01=0._pr + avyp= 0._pr + avzp= 0._pr + avqp= 0._pr + C05= 0._pr endif - - ucl=syncAv(ucl) - avu=syncAv(avu) - avv=syncAv(avv) - avw=syncAv(avw) + ucl= syncSum(ucl)/nrprocs ubulk=avu - rmsv=syncAv(rmsv) - rmsw=syncAv(rmsw) - gradu=syncAv(gradu) + avu= syncSum(avu)/nrprocs + avv= syncSum(avv)/nrprocs + avw= syncSum(avw)/nrprocs + rmsv= syncSum(rmsv)/nrprocs + rmsw= syncSum(rmsw)/nrprocs + gradu=syncSum(gradu)/nrprocs - if (myid.eq.0) then + if (myid.ne.0) return - Rec = ucl*delta/nuf - Reb = avu*delta/nuf - tau_w = muf*abs(gradu) - u_tau = sqrt(tau_w/rhof) - Re_tau = u_tau*delta/nuf + Rec= ucl*delta/nuf + Reb= avu*delta/nuf + tau_w= muf*abs(gradu) + u_tau= sqrt(tau_w/rhof) + Re_tau= u_tau*delta/nuf if (Re_tau.gt.0._pr) delta_v= delta/Re_tau - filename2='output/monitor.dat' inquire(file=filename2,exist=file_ex) if (file_ex.and.nt.ne.1) then @@ -135,18 +111,12 @@ write(10,'(a,i10,i14,15(i10))') '#',(m,m=1,16) write(10,'(a,a10,a14,14(a10))') & '#','nt','t','dt','ucl','av(u)','av(v)','av(w)','rms(v)','rms(w)', & - 'Rec','Reb','tau_w','u_{tau}','Re_{tau}', & - 'C_{01}','av(qp)' + 'Rec','Reb','tau_w','u_{tau}','Re_{tau}','C_{05}','av(qp)' endif write(10,'(x,i10,es14.6e2,20(es10.2e2))') & - nt,t,dt,ucl,avu,avv,avw,rmsv,rmsw,Rec,Reb, & - tau_w,u_tau,Re_tau,C01,avqp - + nt,t,dt,ucl,avu,avv,avw,rmsv,rmsw,Rec,Reb,tau_w,u_tau,Re_tau,C05,avqp close(10) - endif - - return end diff --git a/src/pre.f90 b/src/pre.f90 index 99c0b01..d656408 100644 --- a/src/pre.f90 +++ b/src/pre.f90 @@ -3,25 +3,19 @@ !> @brief pre processing subroutine preProcessing use var - integer n nt=0 call flowConditions call initVariables call gridGeneration + call computeCoefficients call writevtk_grid - if (ntstart.gt.1) then - call readField -! do n=1,np -! q_el(n)=qelp !> possible variation of particle charge -! enddo -! q_el(:)=qelp !> possible variation of particle charge - elseif (ntstart.eq.1) then + if (ntstart.eq.1) then call initFlow - call writevtk_fluid_xz + elseif (ntstart.gt.1) then + call readField endif - return end !#################################################################### @@ -31,9 +25,7 @@ use var use mpi integer :: dimitotTemp - character(8) :: comp_date - character(10) :: comp_time - + character :: filename*70,comp_date*8,comp_time*10 ! read input file open(unit=10,file='input/input.dat',status='old') @@ -53,7 +45,7 @@ read(10,*) read(10,*) int_results,int_restart read(10,*) - read(10,*) cfl + read(10,*) cfl,itmax,tol read(10,*) read(10,*) ubulk0,dpdx read(10,*) @@ -61,7 +53,7 @@ read(10,*) read(10,*) pnd,ntseed read(10,*) - read(10,*) prad,rhop + read(10,*) prad,rhop,restRatio read(10,*) read(10,*) qp0,qpmax read(10,*) @@ -88,8 +80,7 @@ dimx=dimxtot/nrprocs dimi=int(dimitotTemp/nrprocs) dimitot=dimi*nrprocs - if (myid.eq.0.and.dimitot.ne.dimitotTemp) & - write(*,'(a,i8)') 'dimi set to ',dimitot + if (myid.eq.0.and.dimitot.ne.dimitotTemp) write(*,'(a,i8)') 'dimi set to ',dimitot npTot=int(pnd*dimxtot*dimy*dimz) muf=nuf*rhof @@ -102,63 +93,50 @@ Re = ubulk*delta/nuf ftt = dimxtot/ubulk - ! write output file - if (myid.eq.0) then - open(unit=20,file='output/output.dat',status='replace') - + if (myid.ne.0) return call date_and_time(date=comp_date,time=comp_time) - write(20,'(a,x,a8,a,x,a6)') & - 'Simulation start date:',comp_date,', time',comp_time + + write(filename,'(3a,a6,a)') 'output/output_',comp_date,'_',comp_time,'.dat' + open(unit=20,file=filename,status='replace') + + write(20,'(a,x,a8,a,x,a6)') 'Simulation start date:',comp_date,', time',comp_time write(20,*) write(20,'(a)') 'Conditions:' write(20,'(a,i4)') & 'Nr. of processors = ',nrprocs - write(20,'(a,3(es11.2e2,x))') & - 'dimensions in x,y,z-direction (m,m,m) = ', & - dimxtot,dimy,dimz + write(20,'(a,3(es11.2e2))') & + 'dimensions in x,y,z-direction (m,m,m) = ',dimxtot,dimy,dimz write(20,'(a,3x,3(a,x))') & 'BCs in x,y,z-direction [(w)all/(p)eriodic] = ',bcx,bcy,bcz write(20,'(a,3(i5),a,x,i8)') & - 'Nr. of cells in x,y,z-direction (-,-,-) = ', & - dimitot,dimj,diml,', total =',dimitot*dimj*diml + 'Nr. of cells in x,y,z-direction (-,-,-) = ',dimitot,dimj,diml,', total =',dimitot*dimj*diml write(20,'(a,3(i5),a,x,i8)') & - 'Nr. of cells in x,y,z-direction per proc. (-,-,-) = ', & - dimi,dimj,diml,', total =',dimi*dimj*diml + 'Nr. of cells in x,y,z-direction per proc. (-,-,-) = ',dimi,dimj,diml,', total =',dimi*dimj*diml write(20,'(a,3x,3(a,x))') & 'Grid in x,y,z-direction [(u)niform/(s)tretch] = ',gridx,gridy,gridz write(20,'(a,4(i8))') & - 'nt: start, compute, results, restart (-,-,-,-) = ', & - ntstart,ntime,int_results,int_restart - write(20,'(a,es11.2e2)') & - 'CFL number (-) = ', cfl + 'nt: start, compute, results, restart (-,-,-,-) = ',ntstart,ntime,int_results,int_restart + write(20,'(a,es11.2e2,i11,es11.2e2)') & + 'CFL number (-), max number iterations (-), rel. tol. = ',cfl,itmax,tol write(20,'(a,2(es11.2e2))') & - 'in/initial flow (m/s), pressure gradient (N/m**3) = ', ubulk,dpdx + 'in/initial flow (m/s), pressure gradient (N/m**3) = ',ubulk,dpdx write(20,'(a,2(es11.2e2))') & - 'fluid density (kg/m**3), kinematic visc. (m**2/s) = ', & - rhof,nuf - write(20,'(a,i8,es11.2,i8)') & - 'particle number (-), (-/m**3) or (-/s), seed nt (-) = ', npTot,pnd,ntseed + 'fluid density (kg/m**3), kinematic visc. (m**2/s) = ',rhof,nuf + write(20,'(a,i11,es11.2,i11)') & + 'particle number (-), (-/m**3) or (-/s), seed nt (-) = ',npTot,pnd,ntseed write(20,'(a,3(es11.2e2))') & - 'particle rad. (m), mat. density (kg/m**3) = ', & - prad,rhop + 'particle rad (m),mat density (kg/m**3),rest coeff (-) = ',prad,rhop,restRatio write(20,'(a,3(es11.2e2))') & - 'particle charge initial, maximum (C,C) = ', & - qp0,qpmax + 'particle charge initial, maximum (C,C) = ',qp0,qpmax write(20,'(a,3(es11.2e2))') & - 'gravity vector in x,y,z-dir. (m/s**2,m/s**2,m/s**2) = ', & - g(1),g(2),g(3) + 'gravity vector in x,y,z-dir. (m/s**2,m/s**2,m/s**2) = ',g(1),g(2),g(3) write(20,'(a,8(es11.2e2))') & - 'delta (m), Re (-), flow through time (s) = ', & - delta,Re,ftt + 'delta (m), Re (-), flow through time (s) = ',delta,Re,ftt - endif - close(20) - return end - !#################################################################### !> @brief allocate and initialize all variables @@ -166,7 +144,6 @@ use var use mpi - ii=dimi+2*gc; jj=dimj+2*gc; ll=diml+2*gc maxnp=0 @@ -174,22 +151,19 @@ allocate(mpistatus(mpi_status_size)) ! grid - allocate( & - celltype(ii,jj,ll), & - xc(ii),yc(jj),zc(ll),xf(ii),yf(jj),zf(ll), & - dxcdi(ii),dycdj(jj),dzcdl(ll),dxfdi(ii),dyfdj(jj),dzfdl(ll), & - vol(ii,jj,ll)) + allocate(celltype(ii,jj,ll)) + allocate(xc(ii),yc(jj),zc(ll),xf(ii),yf(jj),zf(ll), & + vol(ii,jj,ll),volu(ii,jj,ll),volv(ii,jj,ll),volw(ii,jj,ll), & + Ca(ii,jj,ll),Cb1(ii,jj,ll),Cb2(ii,jj,ll),Cc1(ii,jj,ll),Cc2(ii,jj,ll), & + Cd1(ii,jj,ll),Cd2(ii,jj,ll)) ! fluid - allocate( & - u(ii,jj,ll),v(ii,jj,ll),w(ii,jj,ll),p(ii,jj,ll), & + allocate(u(ii,jj,ll),v(ii,jj,ll),w(ii,jj,ll),p(ii,jj,ll), & rho_el(ii,jj,ll),phi_el(ii,jj,ll), & Ex_el(ii,jj,ll),Ey_el(ii,jj,ll),Ez_el(ii,jj,ll), & - defect_c(ii,jj,ll),defect_u(ii,jj,ll), & - defect_v(ii,jj,ll),defect_w(ii,jj,ll), & u01(ii,jj,ll),v01(ii,jj,ll),w01(ii,jj,ll), & - fsx(ii,jj,ll),fsy(ii,jj,ll),fsz(ii,jj,ll), & - dudt(ii,jj,ll),dvdt(ii,jj,ll),dwdt(ii,jj,ll)) + u02(ii,jj,ll),v02(ii,jj,ll),w02(ii,jj,ll), & + Fsx(ii,jj,ll),Fsy(ii,jj,ll),Fsz(ii,jj,ll)) ! particles allocate(npic(ii,jj,ll)) @@ -198,49 +172,58 @@ ! init u=0._pr; v=0._pr; w=0._pr; p=0._pr - dudt=0._pr; dvdt=0._pr; dwdt=0._pr u01=u; v01=v; w01= w - fsx=0._pr; fsy=0._pr; fsz=0._pr - defect_c=0._pr; defect_u=0._pr; defect_v=0._pr; defect_w=0._pr + u02=u; v02=v; w02= w + Fsx=0._pr; Fsy=0._pr; Fsz=0._pr celltype=active - dxcdi=0._pr; dycdj=0._pr; dzcdl=0._pr; dxfdi=0._pr; dyfdj=0._pr; dzfdl=0._pr - t=0._pr + t=0._pr; timecom=0._pr + rtau_p_max=0._pr; Dup_max=0._pr + vol=0._pr; volu=0._pr; volv=0._pr; volw=0._pr; + Ca=0._pr; Cb1=0._pr; Cb2=0._pr; Cc1=0._pr; Cc2=0._pr; Cd1=0._pr; Cd2=0._pr; ! electrostatics rho_el=0._pr phi_el=0._pr - Ex_el=0._pr; Ey_el=0._pr; Ez_el=0._pr - fx_el=0._pr; fy_el=0._pr; fz_el=0._pr - q_el=0._pr + Ex_el= 0._pr; Ey_el=0._pr; Ez_el=0._pr + fx_el= 0._pr; fy_el=0._pr; fz_el=0._pr + fx_d= 0._pr; fy_d= 0._pr; fz_d= 0._pr + fx_l= 0._pr; fy_l= 0._pr; fz_l= 0._pr + q_el= 0._pr; q_elNext=0._pr; call init_random_seed() - return end +!#################################################################### +!> @author Holger Grosshans +!> @brief initialize random number generator + subroutine init_random_seed() + use var + integer :: i,n,clock + integer, dimension(:), allocatable :: seed + + call random_seed(size=n) + allocate(seed(n)) + call system_clock(count=clock) + seed = clock + 37 * (/ (i - 1, i = 1, n) /) + call random_seed(put=seed) + deallocate(seed) + + end !#################################################################### !> @author Holger Grosshans !> @brief generate grid for gaseous phase subroutine gridGeneration use var - real(kind=pr) :: hy_temp,hz_temp,fluxplu,fluxmin, & - dimi_pr,dimj_pr,diml_pr,gc_pr,jj_pr,ll_pr + real(kind=pr) :: hy_temp,hz_temp integer :: i,j,l,m - imin=1+gc; imax=ii-gc jmin=1+gc; jmax=jj-gc lmin=1+gc; lmax=ll-gc gp=ii*jj*ll; dimgp=dimi*dimj*diml; dimgptot=(dimi*nrprocs)*dimj*diml - dimi_pr=real(dimi,kind=pr) - dimj_pr=real(dimj,kind=pr) - diml_pr=real(diml,kind=pr) - gc_pr=real(gc,kind=pr) - jj_pr=real(jj,kind=pr) - ll_pr=real(ll,kind=pr) - !> celltypes, default=active do 1 i=1,ii select case (bcx) @@ -278,13 +261,13 @@ !> grid do 4 i=1,ii if (gridx.eq.'u') then - xf(i)=real(i-gc,kind=pr)*dimx/dimi_pr + xf(i)=real(i-gc,kind=pr)*dimx/real(dimi,kind=pr) elseif (gridx.eq.'s') then !not implemented yet endif if (i.eq.1) then - xc(i)= xf(1)-(dimx/dimi_pr)/2._pr + xc(i)= xf(1)-(dimx/real(dimi,kind=pr))/2._pr else xc(i)= (xf(i)+xf(i-1))/2._pr endif @@ -292,16 +275,16 @@ do 5 j=1,jj if (gridy.eq.'u') then - hy_temp=dimy/dimj_pr - yf(j)=(real(j,kind=pr)-real(jj_pr)/2._pr)*hy_temp + hy_temp=dimy/real(dimj,kind=pr) + yf(j)=(real(j,kind=pr)-real(jj,kind=pr)/2._pr)*hy_temp elseif (gridy.eq.'s') then - hy_temp= (1._pr-cos(pi/dimj_pr))*dimy/2._pr !width of first active cell + hy_temp= (1._pr-cos(pi/real(dimj,kind=pr)))*dimy/2._pr !width of first active cell if (j.lt.jmin) then yf(j)= real(j+1-jmin,kind=pr)*hy_temp-dimy/2._pr elseif (j.gt.jmax) then yf(j)= real(j-jmax,kind=pr)*hy_temp+dimy/2._pr else - yf(j)=-(cos(real(j-gc,kind=pr)*pi/dimj_pr))*dimy/2._pr + yf(j)=-(cos(real(j-gc,kind=pr)*pi/real(dimj,kind=pr)))*dimy/2._pr endif endif @@ -314,16 +297,16 @@ do 6 l=1,ll if (gridz.eq.'u') then - hz_temp=dimz/diml_pr - zf(l)=(real(l,kind=pr)-real(ll_pr)/2._pr)*hz_temp + hz_temp=dimz/real(diml,kind=pr) + zf(l)=(real(l,kind=pr)-real(ll,kind=pr)/2._pr)*hz_temp elseif (gridz.eq.'s') then - hz_temp= (1._pr-cos(pi/diml_pr))*dimz/2._pr !width of first active cell + hz_temp= (1._pr-cos(pi/real(diml,kind=pr)))*dimz/2._pr !width of first active cell if (l.lt.lmin) then zf(l)= real(l+1-lmin,kind=pr)*hz_temp-dimz/2._pr elseif (l.gt.lmax) then zf(l)= real(l-lmax,kind=pr)*hz_temp+dimz/2._pr else - zf(l)=-(cos(real(l-gc,kind=pr)*pi/diml_pr))*dimz/2._pr + zf(l)=-(cos(real(l-gc,kind=pr)*pi/real(diml,kind=pr)))*dimz/2._pr endif endif @@ -343,127 +326,73 @@ ymin=yf(gc); ymax=yf(jj-gc) zmin=zf(gc); zmax=zf(ll-gc) + end - do i=2,ii; do j=2,jj; do l=2,ll - vol(i,j,l)=(xf(i)-xf(i-1))*(yf(j)-yf(j-1))*(zf(l)-zf(l-1)) +!#################################################################### +!> @author Holger Grosshans +!> @brief pre-compute coefficients to speed of the solution loops + subroutine computeCoefficients + use var + integer :: i,j,l + + do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax + vol(i,j,l)= (xf(i)-xf(i-1))*(yf(j)-yf(j-1))*(zf(l)-zf(l-1)) + volu(i,j,l)=(xc(i+1)-xc(i))*(yf(j)-yf(j-1))*(zf(l)-zf(l-1)) + volv(i,j,l)=(xf(i)-xf(i-1))*(yc(j+1)-yc(j))*(zf(l)-zf(l-1)) + volw(i,j,l)=(xf(i)-xf(i-1))*(yf(j)-yf(j-1))*(zc(l+1)-zc(l)) enddo; enddo; enddo volTot= sum(vol(imin:imax,jmin:jmax,lmin:lmax)) -! compute derivatives of grid spacing for mapping - do 8 i=imin,imax - if ((celltype(i+2,jmin,lmin).ne.wall).and.(celltype(i-2,jmin,lmin).ne.wall)) then - if (xc(i).gt.0._pr) then - call weno(fluxplu,xc(i-2),xc(i-1),xc(i),xc(i+1),xc(i+2)) - call weno(fluxmin,xc(i-3),xc(i-2),xc(i-1),xc(i),xc(i+1)) - else - call weno(fluxplu,xc(i+3),xc(i+2),xc(i+1),xc(i),xc(i-1)) - call weno(fluxmin,xc(i+2),xc(i+1),xc(i),xc(i-1),xc(i-2)) - endif - dxcdi(i)=fluxplu-fluxmin - if (xf(i).gt.0._pr) then - call weno(fluxplu,xf(i-2),xf(i-1),xf(i),xf(i+1),xf(i+2)) - call weno(fluxmin,xf(i-3),xf(i-2),xf(i-1),xf(i),xf(i+1)) - else - call weno(fluxplu,xf(i+3),xf(i+2),xf(i+1),xf(i),xf(i-1)) - call weno(fluxmin,xf(i+2),xf(i+1),xf(i),xf(i-1),xf(i-2)) - endif - dxfdi(i)=fluxplu-fluxmin - endif -8 enddo - do 9 j=jmin,jmax - if ((celltype(imin,j+2,lmin).ne.wall).and.(celltype(imin,j-2,lmin).ne.wall)) then - if (yc(j).gt.0._pr) then - call weno(fluxplu,yc(j-2),yc(j-1),yc(j),yc(j+1),yc(j+2)) - call weno(fluxmin,yc(j-3),yc(j-2),yc(j-1),yc(j),yc(j+1)) - else - call weno(fluxplu,yc(j+3),yc(j+2),yc(j+1),yc(j),yc(j-1)) - call weno(fluxmin,yc(j+2),yc(j+1),yc(j),yc(j-1),yc(j-2)) - endif - dycdj(j)=fluxplu-fluxmin - if (yf(j).gt.0._pr) then - call weno(fluxplu,yf(j-2),yf(j-1),yf(j),yf(j+1),yf(j+2)) - call weno(fluxmin,yf(j-3),yf(j-2),yf(j-1),yf(j),yf(j+1)) - else - call weno(fluxplu,yf(j+3),yf(j+2),yf(j+1),yf(j),yf(j-1)) - call weno(fluxmin,yf(j+2),yf(j+1),yf(j),yf(j-1),yf(j-2)) - endif - dyfdj(j)=fluxplu-fluxmin - endif -9 enddo - do 10 l=lmin,lmax - if ((celltype(imin,jmin,l+2).ne.wall).and.(celltype(imin,jmin,l-2).ne.wall)) then - if (zc(l).gt.0._pr) then - call weno(fluxplu,zc(l-2),zc(l-1),zc(l),zc(l+1),zc(l+2)) - call weno(fluxmin,zc(l-3),zc(l-2),zc(l-1),zc(l),zc(l+1)) - else - call weno(fluxplu,zc(l+3),zc(l+2),zc(l+1),zc(l),zc(l-1)) - call weno(fluxmin,zc(l+2),zc(l+1),zc(l),zc(l-1),zc(l-2)) - endif - dzcdl(l)=fluxplu-fluxmin - if (zf(l).gt.0._pr) then - call weno(fluxplu,zf(l-2),zf(l-1),zf(l),zf(l+1),zf(l+2)) - call weno(fluxmin,zf(l-3),zf(l-2),zf(l-1),zf(l),zf(l+1)) - else - call weno(fluxplu,zf(l+3),zf(l+2),zf(l+1),zf(l),zf(l-1)) - call weno(fluxmin,zf(l+2),zf(l+1),zf(l),zf(l-1),zf(l-2)) - endif - dzfdl(l)=fluxplu-fluxmin - endif -10 enddo - +! coefficients for PISO algorithm, not sure which version is better + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + Cb1(i,j,l)=0._pr; Cb2(i,j,l)=0._pr; Cc1(i,j,l)=0._pr + Cc2(i,j,l)=0._pr; Cd1(i,j,l)=0._pr; Cd2(i,j,l)=0._pr + if (celltype(i+1,j,l).ne.wall) Cb1(i,j,l)= 1._pr/((xc(i+1)-xc(i))*(xf(i)-xf(i-1))) + if (celltype(i-1,j,l).ne.wall) Cb2(i,j,l)= 1._pr/((xc(i)-xc(i-1))*(xf(i)-xf(i-1))) + if (celltype(i,j+1,l).ne.wall) Cc1(i,j,l)= 1._pr/((yc(j+1)-yc(j))*(yf(j)-yf(j-1))) + if (celltype(i,j-1,l).ne.wall) Cc2(i,j,l)= 1._pr/((yc(j)-yc(j-1))*(yf(j)-yf(j-1))) + if (celltype(i,j,l+1).ne.wall) Cd1(i,j,l)= 1._pr/((zc(l+1)-zc(l))*(zf(l)-zf(l-1))) + if (celltype(i,j,l-1).ne.wall) Cd2(i,j,l)= 1._pr/((zc(l)-zc(l-1))*(zf(l)-zf(l-1))) + Ca(i,j,l)= Cb1(i,j,l)+Cb2(i,j,l)+Cc1(i,j,l)+Cc2(i,j,l)+Cd1(i,j,l)+Cd2(i,j,l) + enddo; enddo; enddo + !do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax + ! Cb1(i,j,l)= 1._pr/((xc(i+1)-xc(i))*(xf(i)-xf(i-1))) + ! Cb2(i,j,l)= 1._pr/((xc(i)-xc(i-1))*(xf(i)-xf(i-1))) + ! Cc1(i,j,l)= 1._pr/((yc(j+1)-yc(j))*(yf(j)-yf(j-1))) + ! Cc2(i,j,l)= 1._pr/((yc(j)-yc(j-1))*(yf(j)-yf(j-1))) + ! Cd1(i,j,l)= 1._pr/((zc(l+1)-zc(l))*(zf(l)-zf(l-1))) + ! Cd2(i,j,l)= 1._pr/((zc(l)-zc(l-1))*(zf(l)-zf(l-1))) + ! Ca(i,j,l)= Cb1(i,j,l)+Cb2(i,j,l)+Cc1(i,j,l)+Cc2(i,j,l)+Cd1(i,j,l)+Cd2(i,j,l) + !enddo; enddo; enddo - return end !#################################################################### !> @author Holger Grosshans -!> @brief Initialize the flow according to Nelson & Fringer (2017) -!> turbulence spin-up time to reduce +!> @brief Initialize the flow to reduce spin-up time (Nelson & Fringer, 2017) subroutine initFlow use var + use parallel real(kind=pr) yplus,random(gp),uplus,vplus,wplus,dist,alpha,utau integer :: i,j,l,m - call syncRandom(gp,random) - alpha=0.5_pr - -! delta_v=delta/150._pr -! utau=0.05_pr + alpha=0.25_pr m=0 - do i=imin,imax; do j=jmin,jmax; do l=lmin,lmax + do l=lmin,lmax; do j=jmin,jmax; do i=imin,imax m=m+1 - -! law of the wall/log law: -! yplus=min(dimy/2.-abs(yc(j)),dimy/2-abs(zc(l)))/delta_v -! if (yplus.lt.10)then -! uplus = yplus ! u+ = y+ -! else -! uplus = 2.5*log(yplus) + 5. ! u+ = 2.5ln(y+) + 5. -! end if -! Setting perturbation on velocity -! uplus = 1.5*uplus + uplus*(random(m)-.5) -! vplus = uplus*(random(m)-.5) -! wplus = uplus*(random(m)-.5) -! u(i,j,l)=uplus*utau -! v(i,j,l)=vplus*utau -! w(i,j,l)=wplus*utau - -! linear: if (bcy.eq.'w'.and.bcz.eq.'w') dist=delta-max(abs(yc(j)),abs(zc(l))) if (bcy.eq.'w'.and.bcz.eq.'p') dist=delta-abs(yc(j)) if (bcy.eq.'p'.and.bcz.eq.'w') dist=delta-abs(zc(l)) - u(i,j,l)=ubulk*dist/delta + (random(m)-.5_pr)*alpha*ubulk + u(i,j,l)= (1._pr + (2._pr*random(m)-1._pr)*alpha) * ubulk*dist/delta enddo; enddo; enddo v=0._pr w=0._pr + call bcUVW(u,v,w) u01=u; v01=v; w01=w - call bcUVWP - call sync(u); call sync(v); call sync(w) + u02=u01; v02=v01; w02=w01 - return end - diff --git a/src/pressure.f90 b/src/pressure.f90 deleted file mode 100644 index 3224269..0000000 --- a/src/pressure.f90 +++ /dev/null @@ -1,65 +0,0 @@ -!> @author Holger Grosshans -!> @brief one sweep to relax mass conservation using distributive -!> Jacobi method based on distributive Gauss-Seidel by Brandt (1972) -!> @param err L2 error norm - subroutine pressure(err) - use var - real(kind=pr),dimension(ii,jj,ll) :: u1,v1,w1 - real(kind=pr) :: err,h2sum,de,dex,dey,dez,ra,dpa,dpm, & - erru,errv,errw,syncSum - integer :: i,j,l - - - err=0._pr - erru=0._pr - errv=0._pr - errw=0._pr - - - u1=u; v1=v; w1=w - - do i=imin,imax+1; do j=jmin,jmax+1; do l=lmin,lmax+1 - - if (celltype(i,j,l).eq.wall) cycle - - h2sum=0._pr - if (celltype(i+1,j,l).ne.wall) h2sum=h2sum+1._pr/(xf(i)-xf(i-1))**2 - if (celltype(i-1,j,l).ne.wall) h2sum=h2sum+1._pr/(xf(i)-xf(i-1))**2 - if (celltype(i,j+1,l).ne.wall) h2sum=h2sum+1._pr/(yf(j)-yf(j-1))**2 - if (celltype(i,j-1,l).ne.wall) h2sum=h2sum+1._pr/(yf(j)-yf(j-1))**2 - if (celltype(i,j,l+1).ne.wall) h2sum=h2sum+1._pr/(zf(l)-zf(l-1))**2 - if (celltype(i,j,l-1).ne.wall) h2sum=h2sum+1._pr/(zf(l)-zf(l-1))**2 - - call mass2(ra,i,j,l) - de= (defect_c(i,j,l)+ra)/h2sum*urfp - dpa= de*rhof*(1._pr/dt+2._pr*nuf/((xf(i)-xf(i-1))**2+(yf(j)-yf(j-1))**2+(zf(l)-zf(l-1))**2)) - dex= de/(xf(i)-xf(i-1)) - dey= de/(yf(j)-yf(j-1)) - dez= de/(zf(l)-zf(l-1)) - - if (celltype(i,j,l).eq.active) p(i,j,l)= p(i,j,l)+dpa - if (celltype(i,j,l).eq.active.and.celltype(i+1,j,l).ne.wall) u1(i,j,l)= u1(i,j,l)+dex - if (celltype(i-1,j,l).eq.active.and.celltype(i,j,l).ne.wall) u1(i-1,j,l)= u1(i-1,j,l)-dex - if (celltype(i,j,l).eq.active.and.celltype(i,j+1,l).ne.wall) v1(i,j,l)= v1(i,j,l)+dey - if (celltype(i,j-1,l).eq.active.and.celltype(i,j,l).ne.wall) v1(i,j-1,l)= v1(i,j-1,l)-dey - if (celltype(i,j,l).eq.active.and.celltype(i,j,l+1).ne.wall) w1(i,j,l)= w1(i,j,l)+dez - if (celltype(i,j,l-1).eq.active.and.celltype(i,j,l).ne.wall) w1(i,j,l-1)= w1(i,j,l-1)-dez - - if(dpm.lt.dpa) dpm=dpa - erru=erru+dex*dex - errv=errv+dey*dey - errw=errw+dez*dez - err=err+dpa*dpa - - enddo; enddo; enddo - - u=u1; v=v1; w=w1 - - call sync(u); call sync(v); call sync(w); call sync(p) - call bcUVWP - - err=(syncSum(err)/dimgptot)**(0.5_pr) -! write(*,'(x,a,4(es9.2e2))') 'res. inner it. pressure corr. =',err - - return - end diff --git a/src/restart.f90 b/src/restart.f90 index e6a8cbf..e2778c0 100644 --- a/src/restart.f90 +++ b/src/restart.f90 @@ -1,85 +1,103 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief initialize random number generator - subroutine init_random_seed() - use var - integer :: i,n,clock - integer, dimension(:), allocatable :: seed - - call random_seed(size=n) - allocate(seed(n)) - call system_clock(count=clock) - seed = clock + 37 * (/ (i - 1, i = 1, n) /) - call random_seed(put=seed) - deallocate(seed) - - return - end - !#################################################################### !> @author Holger Grosshans !> @brief save fluid and particle field for restart subroutine saveField use var - integer :: i,j,l,n + integer :: n character(70) :: filename + integer :: fileformat=-9999003 ! current format identifier write(filename,'(a,i3.3,a,i3.3,a,i3.3,a,i3.3,a,i6.6)') & 'restart/fluidField_p',myid,'_',dimi,'_',dimj,'_',diml,'_',nt open(unit=11,file=filename,form='unformatted') - write(11) u,u01,v,v01,w,w01,p,fsx,fsy,fsz,rho_el,t,dt,dt01 + write(11) fileformat + write(11) u(imin:imax,jmin:jmax,lmin:lmax),u01(imin:imax,jmin:jmax,lmin:lmax), & + v(imin:imax,jmin:jmax,lmin:lmax),v01(imin:imax,jmin:jmax,lmin:lmax), & + w(imin:imax,jmin:jmax,lmin:lmax),w01(imin:imax,jmin:jmax,lmin:lmax), & + p(imin:imax,jmin:jmax,lmin:lmax),t,dtNext,dt,dt01,timecom close(11) - write(filename,'("restart/particleField_p",i3.3,"_",i6.6)') myid,nt - open(unit=12,file=filename,form='unformatted') - write(12) np - write(12) (up(n),vp(n),wp(n),xp(n),yp(n),zp(n),uf(n),vf(n),wf(n), & - radp(n),partn(n),q_el(n),wcollnum(n),ppcollnum(n),n=1,np) - close(12) + if (npTot.gt.0) then + write(filename,'("restart/particleField_p",i3.3,"_",i6.6)') myid,nt + open(unit=12,file=filename,form='unformatted') + write(12) fileformat + write(12) np + write(12) (upNext(n),vpNext(n),wpNext(n),xpNext(n),ypNext(n),zpNext(n), & + radp(n),partn(n),q_elNext(n),wcollnum(n),ppcollnum(n),nGlob(n),n=1,np) + close(12) + endif - return end - !#################################################################### !> @author Holger Grosshans -!> @brief read fluid and particle field for restart +!> @brief read fluid and particle field for restart, old or new format subroutine readField use var - integer :: i,j,l,n + integer :: n,stat character(70) :: filename + integer :: fileformat if (myid.eq.0) write(*,'(a)') 'read old data' write(filename,'(a,i3.3,a,i3.3,a,i3.3,a,i3.3,a,i6.6)') & 'restart/fluidField_p',myid,'_',dimi,'_',dimj,'_',diml,'_',ntstart - open(unit=11,file=filename,form='unformatted',status='old',err=9000) - rewind 11 - read(11) u,u01,v,v01,w,w01,p,fsx,fsy,fsz,rho_el,t,dt,dt01 + open(unit=11,file=filename,form='unformatted',status='old',iostat=stat) + if (stat.ne.0) then + write(*,'(a)') 'old field not existing ',filename + stop + endif + rewind(11) + read(11) fileformat + if (fileformat.eq.-9999003) then + read(11) u(imin:imax,jmin:jmax,lmin:lmax),u01(imin:imax,jmin:jmax,lmin:lmax), & + v(imin:imax,jmin:jmax,lmin:lmax),v01(imin:imax,jmin:jmax,lmin:lmax), & + w(imin:imax,jmin:jmax,lmin:lmax),w01(imin:imax,jmin:jmax,lmin:lmax), & + p(imin:imax,jmin:jmax,lmin:lmax),t,dtNext,dt,dt01,timecom + call bcUVW(u,v,w) + call bcUVW(u01,v01,w01) + call bcNeumann(p) + timecom(10)=timecom(9) + elseif (fileformat.eq.-9999002) then ! works with gc=3 + read(11) u,u01,v,v01,w,w01,p,t,dtNext,dt,dt01,timecom + else ! oldest format, works with gc=3 + rewind(11) + read(11) u,u01,v,v01,w,w01,p,Fsx,Fsy,Fsz,rho_el,t,dt,dt01 + call nextTimestepSize + endif close(11) write(filename,'("restart/particleField_p",i3.3,"_",i6.6)') myid,ntstart - open(unit=12,file=filename,form='unformatted',status='old',err=9000) - rewind(12) - read(12) np - call allocateParticleArrays - read(12) (up(n),vp(n),wp(n),xp(n),yp(n),zp(n),uf(n),vf(n),wf(n), & - radp(n),partn(n),q_el(n),wcollnum(n),ppcollnum(n),n=1,np) + open(unit=12,file=filename,form='unformatted',status='old',iostat=stat) + if (stat.ne.0) then + np=0 + call allocateParticleArrays + else + rewind(12) + read(12) fileformat + if (fileformat.eq.-9999002.or.fileformat.eq.-9999003) then ! newest format + read(12) np + call allocateParticleArrays + read(12) (upNext(n),vpNext(n),wpNext(n),xpNext(n),ypNext(n),zpNext(n), & + radp(n),partn(n),q_elNext(n),wcollnum(n),ppcollnum(n),nGlob(n),n=1,np) + else ! oldest format + rewind(12) + read(12) np + call allocateParticleArrays + read(12) (up(n),vp(n),wp(n),xp(n),yp(n),zp(n),uf(n),vf(n),wf(n), & + radp(n),partn(n),q_el(n),wcollnum(n),ppcollnum(n),n=1,np) + xpNext=xp; ypNext=yp; zpNext=zp; + upNext=up; vpNext=vp; wpNext=wp; + q_elNext=q_el + do n=1,np + nseedLoc=nseedLoc+1 + nGlob(n)=nseedLoc*1000+myid + enddo + endif + endif close(12) ntstart=ntstart+1 ntend=ntend+1 - do n=1,np - nseedLoc=nseedLoc+1 - nGlob(n)=nseedLoc*1000+myid - enddo - call particlesToCells - - return - -9000 write(*,'(a)') 'old field not existing ',filename - stop - end - diff --git a/src/schemes.f90 b/src/schemes.f90 deleted file mode 100644 index a5efc79..0000000 --- a/src/schemes.f90 +++ /dev/null @@ -1,98 +0,0 @@ -!!#################################################################### -!> @author Holger Grosshans -!!> @brief spatial first order discretization of first derivative -! real(kind=pr) function d1o2(phi,node,i,j,l) -! use var -! real(kind=pr) phi,node -! integer :: i,j,l,im1,jm1,lm1,ip1,jp1,lp1 -! -!! uux= ua*d1o2(u,xf,i,j,l) -abs(ua)*d2o2(u,xf,i,j,l) -! if (node.eq.xc.or.node.eq.xf) then -! im1=i-1; ip1=i+1 -! jm1=j; jp1=j -! lm1=l; lp1=l -! endif -! if (node.eq.yc.or.node.eq.yf) then -! im1=i; ip1=i -! jm1=j-1; jp1=j+1 -! lm1=l; lp1=l -! endif -! if (node.eq.zc.or.node.eq.zf) then -! im1=i; ip1=i -! jm1=j; jp1=j -! lm1=l-1; lp1=l+1 -! endif -! -! d1o2= (u(ip1,jp1,lp1)-u(im1,jm1,lm1))/(xf(i+1)-xf(i-1)) -! -! return -! end -! - -!#################################################################### -!> @author Holger Grosshans -!> @brief 5th order WENO on a uniform grid - subroutine weno(flux,phi1,phi2,phi3,phi4,phi5) - use var - real(kind=pr) :: flux,phi1,phi2,phi3,phi4,phi5, & - beta11,beta12,beta21,beta22,beta31,beta32, & - beta1,beta2,beta3,omega1,omega2,omega3, & - omega,weight1,weight2,weight3,flux1,flux2,flux3 - - -! compute brackets beta11, beta12, ... - beta11=phi1-2._pr*phi2+phi3 - beta12=phi1-4._pr*phi2+3._pr*phi3 - beta21=phi2-2._pr*phi3+phi4 - beta22=phi2-phi4 - beta31=phi3-2._pr*phi4+phi5 - beta32=3._pr*phi3-4._pr*phi4+phi5 - -! compute the smoothness indicators for flux -! epsilon=1.e-6, avoids that the denominiator (next operation) becomes zero - beta1=13._pr/12._pr*beta11**2 + 0.25_pr*beta12**2 + 1.e-6_pr - beta2=13._pr/12._pr*beta21**2 + 0.25_pr*beta22**2 + 1.e-6_pr - beta3=13._pr/12._pr*beta31**2 + 0.25_pr*beta32**2 + 1.e-6_pr - -! the linear weights are gamma1=0.1, gamma2=0.6, gamme3=0.3 -! compute the nonlinear weights - omega1=0.1_pr/(beta1**2) - omega2=0.6_pr/(beta2**2) - omega3=0.3_pr/(beta3**2) - omega=omega1+omega2+omega3 - weight1=omega1/omega - weight2=omega2/omega - weight3=omega3/omega - -! compute 3 3rd order downwind fluxes on 3 stencils - flux1=(2._pr*phi1-7._pr*phi2+11._pr*phi3)/6._pr - flux2=(-phi2+5._pr*phi3+2._pr*phi4)/6._pr - flux3=(2._pr*phi3+5._pr*phi4-phi5)/6._pr - -! compute the numerical flux - flux=weight1*flux1+weight2*flux2+weight3*flux3 - - return - end - -!#################################################################### -!> @author Holger Grosshans -!> @brief 1st derivative 4th order discretization of phi at loc (Castillo et al., 1995) - real(kind=pr) function d1o4(loc,phi0,phi1,phi2,phi3,loc0,loc1,loc2,loc3) - use var - real(kind=pr) :: d01,d12,d23,d012,d123,d0123,loc,phi0,phi1,phi2,phi3,loc0,loc1,loc2,loc3 - -! Eq. (2.9) - d01= (phi1-phi0)/(loc1-loc0) - d12= (phi2-phi1)/(loc2-loc1) - d23= (phi3-phi2)/(loc3-loc2) - d012= (d12-d01)/(loc2-loc0) - d123= (d23-d12)/(loc3-loc1) - d0123=(d123-d012)/(loc3-loc0) - -! Eq. (2.10) - d1o4= d01 + ((loc-loc0)+(loc-loc1))*d012 & - + ((loc-loc0)*(loc-loc1)+(loc-loc2)*((loc-loc0)+(loc-loc1)))*d0123 - - return - end diff --git a/src/timestep.f90 b/src/timestep.f90 new file mode 100644 index 0000000..13f2bc3 --- /dev/null +++ b/src/timestep.f90 @@ -0,0 +1,52 @@ +!#################################################################### +!> @author Holger Grosshans +!> @brief copy variables between time-steps + subroutine prepareTimestep + use var + + if (nt.eq.1) then + dt=cfl*dimx/dimi/10._pr + dt01=dt + dt02=dt01 + else + dt02=dt01 + dt01=dt + dt=dtNext + endif + +! fixed time-step: +! dt=cfl*minval(hx)/ubulk +! dt01=dt +! dt02=dt + + tau01=dt/(dt+dt01) + tau02=dt01/(dt01+dt02) + t=t+dt + + u02=u01; v02=v01; w02=w01 + u01=u; v01=v; w01=w + xp=xpNext; yp=ypNext; zp=zpNext; + up=upNext; vp=vpNext; wp=wpNext; + q_el=q_elNext + + call particlesNextProc + call particlesToCells + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief next time-step size, needed AFTER flow field and BEFORE particle calculation + subroutine nextTimestepSize + use var + use parallel + real(kind=pr) umax + + umax= syncMax(maxval(abs(u))) + if (umax.eq.0._pr) then + dtNext=dt + else + dtNext=cfl*dimx/dimi/umax + endif + + end diff --git a/src/var.f90 b/src/var.f90 index 20090b9..33a4ac8 100644 --- a/src/var.f90 +++ b/src/var.f90 @@ -1,26 +1,29 @@ !> @author Holger Grosshans -!> @brief definition of public variables, global denotes -!! the complete domain, local only one processor +!> @brief definition of public variables, global denotes the complete domain, local only one processor +!> +!> how to add a new public variable: +!> fluid: var,initVariables(allocate+init) +!> particles: var,allocateParticleArrays,initVariables,particlesNextProc(?),partN2M(?) + module var implicit none ! hardcoded parameters which the user cannot change + character(70) :: version='pafiX v1.1.0 (Copyright 2015-21 by H. Grosshans)' + integer, parameter :: & precision=8, & !< number precision pr=selected_real_kind(precision), & elforceScheme=3, & !< 1=Gauss, 2=Coulomb, 3=Hybrid (Grosshans&Papalexandris, 2017) - itmax=100, & !< max number of iterations for 1 equation - gc= 3 !< number of ghost cells, for consistence always 3, also at walls + gc= 2 !< number of ghost cells, depends on stencils, but >= 2 real(kind=pr), parameter :: & - eps_el= 8.85e-12_pr, & !< permittivity vacuum/air + eps_el= 8.85e-12_pr, & !< permittivity vacuum/air (F/m) pi= 4._pr*atan(1._pr), & - tol= 1.e-2_pr, & !< factor by which L2 shall decrease - urfu= .25_pr, & !< under relaxation factor variable u + urfu= 0.25_pr, & !< under relaxation factor variable u urfv= urfu, & urfw= urfv, & - urfp= .5_pr, & - restRatio= 1._pr !< particle material restitution ratio + urfp= 4._pr real(kind=pr), parameter :: & Ew=1.e11_pr, & !< duct Young's modulus (kg/s**2/m) @@ -29,8 +32,6 @@ nyw=0.28_pr, & !< duct Poisson ratio Qaccfactor= 0.1_pr !< artificially accelerate the charging rate - character(70) :: version='pafiX v1.1.0 (Copyright 2019 by H. Grosshans)' - ! input real(kind=pr) :: & cfl, & !< CFL number (-) @@ -42,7 +43,9 @@ nuf, & !< fluid kinematic viscosity (m**2/s) pnd, & !< particle number density (-/m**3) rhop, & !< particle material density (kg/m**3) + restRatio, & !< particle material restitution ratio g(3), & !< gravity vector (m/s**2,m/s**2,m/s**2) + tol, & !< factor by which L2 shall decrease dimxtot, & !< dimension of domain (m) delta, & !< duct half width tau_w, & !< wall shear stress @@ -51,25 +54,28 @@ Re_tau, & !< friction Reynolds number delta_v, & !< viscous length scale (m) t_tau, & !< viscous time scale (s) - ftt, & !< flow through time (s) - rmsv,rmsw + ftt !< flow through time (s) + integer :: & ntstart, & !< start time step ntime, & !< end time step dimi,dimj,diml, & !< local number of cells in x-direction int_results, & !< interval write out results int_restart, & !< interval write out restart files + itmax, & !< max number of iterations for 1 equation dimitot, & !< global number of cells in x-direction ntseed !< time step particle seeding ! run real(kind=pr) :: & - dt, & !< size of time step nt (s) dpdx, & !< streamwise pressure gradient (N/m**3) - dt01, & !< time step size nt-1 - dt02, & !< time step size nt-2 + dtNext, & !< time-step size from (nt) to (nt+1) (s) + dt, & !< time-step size from (nt-1) to (nt) (s) + dt01, & !< time step size from (nt-2) to (nt-1) (s) + dt02, & !< time step size from (nt-3) to (nt-2) (s) tau01,tau02, & t !< physical time (s) + integer :: nt, & !< time step ntend !< last time step of computation @@ -77,13 +83,14 @@ character(1) :: & bcx,bcy,bcz, & !< type of boundary condition [(w)all/(p)eriodic] gridx,gridy,gridz !< grid [(u)niform/(s)tretch] + real(kind=pr), allocatable, dimension(:,:,:) :: & - vol !< volume per cell (m**3) + vol,volu,volv,volw !< volume per cell (m**3), centered and staggered variables + real(kind=pr), allocatable, dimension(:) :: & xc,yc,zc, & !< center point of a cell (m) - xf,yf,zf, & !< face of a cell in pos. direction from xc (m) - dxcdi,dycdj,dzcdl, & !< derivative of grid mapping at cell center (m/m) - dxfdi,dyfdj,dzfdl !< derivative of grid mapping at cell face (m/m) + xf,yf,zf !< face of a cell in pos. direction from xc (m) + real(kind=pr) :: & xmin,ymin,zmin, & !< lower local boundary in global coordinates (m) xmax,ymax,zmax, & !< upper local boundary in global coordinates (m) @@ -92,6 +99,7 @@ integer, allocatable, dimension(:,:,:) :: & celltype !< celltype + integer, parameter :: active=1, passive=2, wall=3 integer :: & @@ -102,51 +110,71 @@ imin,jmin,lmin, & !< local min index of cell containing fluid imax,jmax,lmax !< local max index of cell containing fluid +! pre-computed coefficients + real(kind=pr), allocatable, dimension(:,:,:) :: & + Ca,Cb1,Cb2,Cc1,Cc2,Cd1,Cd2 !< coefficients for SIMPLE algorithm + ! fluid real(kind=pr) :: muf !< fluid dynamic viscosity (kg/s/m) + real(kind=pr), allocatable, dimension(:,:,:) :: & u,v,w, & !< fluid velocity (m/s) p, & !< fluid pressure (N/m**2) - dudt,dvdt,dwdt, & !< term for time integration (m/s) u01,v01,w01, & !< fluid velocity previous time-step - fsx,fsy,fsz, & !< source term particles -> fluid (m/s**2) - defect_c, & !< defect correction terms - defect_u,defect_v,defect_w + u02,v02,w02, & !< fluid velocity previous time-step + Fsx,Fsy,Fsz !< source term particles -> fluid (m/s**2) ! particles + real(kind=pr) :: & + rtau_p_max, & !< max reciprocal particle time-scale in a time-step + rtau_el_max, & !< max reciprocal Coulomb force time-scale in a time-step + dup_max !< max particle velocity change in a time-step + integer :: & np, & !< local number of particles npTot, & !< total number of particles npp, & !< local number of particles before some operation maxnp, & !< maximum possible local number of particles nseedLoc !< local counter for seeded particles + real(kind=pr), allocatable, dimension(:) :: & - up,vp,wp, & !< particle velocity (m/s) - uf,vf,wf, & !< average fluid velocity around a particle (m/s) - uf01,vf01,wf01, & !< fluid vel. around particle prev. time-step (m/s) - xp,yp,zp, & !< particle position (m) + up,vp,wp, & !< particle velocity at t (m/s) + upNext,vpNext,wpNext, & !< particle velocity at t+dt (m/s) + uf,vf,wf, & !< fluid velocity around a particle (m/s) + dufdy,dufdz, & !< fluid velocity gradient around a particle (m/s) + xp,yp,zp, & !< particle position at t (m) + xpNext,ypNext,zpNext, & !< particle position at t+dt (m) radp, & !< particle radius (m) - q_el, & !< particle charge (C) + q_el, & !< particle charge at t (C) + q_elNext, & !< particle charge at t+dt (C) fx_el,fy_el,fz_el, & !< electrostatic force on particle (m/s**2) + fx_d,fy_d,fz_d, & !< drag force on particle (m/s**2) + fx_l,fy_l,fz_l, & !< lift force on particle (m/s**2) partn !< number of particles represented by parcel + integer, allocatable, dimension(:) :: & + ip,jp,lp, & !< Eulerian indice of particle position wcollnum, & !< number of particle-wall collisions ppcollnum, & !< number of particle-particle collisions nGlob !< global particle id + integer, allocatable, dimension(:,:,:) :: & npic !< number of particles in a Eulerian cell + integer, allocatable, dimension(:,:,:,:) :: & nic !< indices of particles in a Eulerian cell - ! parallel - real(kind=pr) :: timebeg,timecom(10),timenow,timeend + real(kind=pr) :: timebeg,timenow,timeend, & + timecom(10) !< 1-8: sync operations, 9: physical time, 10: restart + integer :: & mpi_pr, & myid, & !< id of current processor nrprocs, & !< total number of processors mpierr, & next,prev !< id of next and previous processor + integer, allocatable, dimension(:) :: & mpistatus diff --git a/src/write_vtk.f90 b/src/write_vtk.f90 new file mode 100644 index 0000000..57c3f64 --- /dev/null +++ b/src/write_vtk.f90 @@ -0,0 +1,449 @@ +!#################################################################### +!> @author Holger Grosshans +!> @brief write out particle field in vtk format + subroutine writevtk_particles + use var + integer :: n + character(80) :: filename,rowfmt,rowfm2 + +100 format(es13.4e2) +101 format(3(es13.4e2)) +102 format(3(es14.5e2)) + rowfmt='(10(1x,es11.4e2))' + rowfm2='(10(1x,i9))' + + if(myid.eq.0) call write_visit_container('particles') + + write(filename,'("results/particles_p",i3.3,"_",i6.6,".vtk")') myid,nt + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 3.0' + write(10,'(a,es14.6e2,a,x,a)') 'particle data: t=',t,' s --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET UNSTRUCTURED_GRID' + write(10,'(a6,i9,a6)') 'POINTS ',np,' FLOAT' + write(10,102) (xp(n),yp(n),zp(n),n=1,np) + write(10,'(a5,i9,i9)') 'CELLS ',np,2*np + write(10,*) ('1 ',n-1,n=1,np) + write(10,'(a10,i9)') 'CELL_TYPES ',np + write(10,*) ('1 ', n=1,np) + write(10,'(a,i9)') 'POINT_DATA ',np + + call writeVar('radp',radp) + call writeVar('up',up) + call writeVar('vp',vp) + call writeVar('wp',wp) + call writeVar('uf',uf) + call writeVar('vf',vf) + call writeVar('wf',wf) + call writeVar('partn',partn) + call writeVar('q_el',q_el) + call writeVar('fx_d',fx_d) + call writeVar('fy_d',fy_d) + call writeVar('fz_d',fz_d) + call writeVar('fx_l',fx_l) + call writeVar('fy_l',fy_l) + call writeVar('fz_l',fz_l) + call writeVar('fx_el',fx_el) + call writeVar('fy_el',fy_el) + call writeVar('fz_el',fz_el) + call writeVarI('wcollnum',wcollnum) + call writeVarI('ppcollnum',ppcollnum) + + write(10,'(a)') 'VECTORS UPVPWP FLOAT' + write(10,101) (up(n),vp(n),wp(n),n=1,np) + write(10,'(a)') + + close(10) + + contains + + subroutine writeVar(name,myvar) + use var + real(kind=pr) :: myvar(:) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + write(10,'(a)') 'LOOKUP_TABLE default ' + write(10,fmt=rowfmt) (myvar(n),n=1,np) + write(10,'(a)') + + end + + subroutine writeVarI(name,myvar) + use var + integer :: myvar(:) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + write(10,'(a)') 'LOOKUP_TABLE default ' + write(10,fmt=rowfm2) (myvar(n),n=1,np) + write(10,'(a)') + + end + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine writevtk_fluid_xyz + use var + real(kind=pr) :: temp(ii,jj,ll) + integer :: i,j,l + character(70) :: filename,rowfmt,vecfmt + +100 format(es11.4e2) + write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' + write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' + + if(myid.eq.0) call write_visit_container('fluid_xyz') + + write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xyz_p',myid,'_',nt,'.vtk' + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 3.0' + write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET RECTILINEAR_GRID' + write(10,'(a10,3(i4))') 'DIMENSIONS',(imax-imin+2),(jmax-jmin+3),(lmax-lmin+3) + write(10,*) 'X_COORDINATES',(imax-imin+2),'float' + write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) + write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' + write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) + write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' + write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) + write(10,*) 'POINT_DATA ',(imax-imin+2)*(jmax-jmin+3)*(lmax-lmin+3) + + temp=0._pr + temp(2:ii,:,:)=(u(2:ii,:,:)+u(1:ii-1,:,:))/2._pr + call writeVar('u',temp) + temp(:,2:jj,:)=(v(:,2:jj,:)+v(:,1:jj-1,:))/2._pr + call writeVar('v',temp) + temp(:,:,2:ll)=(w(:,:,2:ll)+w(:,:,1:ll-1))/2._pr + call writeVar('w',temp) + call writeVar('p',p) + call writeVar('rho_el',rho_el) + call writeVar('phi_el',phi_el) + call writeVar('Ex_el',Ex_el) + call writeVar('Ey_el',Ey_el) + call writeVar('Ez_el',Ez_el) + + !temp=sqrt(Ex_el**2+Ey_el**2+Ez_el**2) + !call writeVar('Emag',temp) + +! write(10,'(a)') 'VECTORS uvw float' +! do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 +! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & +! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & +! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) +! enddo; enddo + +! write(10,'(a)') 'VECTORS coordinates float 1' +! write(10,'(a)') 'LOOKUP_TABLE default ' +! do l=lmin-1,lmax+1 +! do i=imin,imax+1 +! write(10,'(3(i8))') i,j,l +! enddo +! enddo + + close(10) + + contains + + subroutine writeVar(name,myvar) + use var + real(kind=pr) :: myvar(ii,jj,ll) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + do l=lmin-1,lmax+1; do j=jmin-1,jmax+1 + write(10,fmt=rowfmt) (myvar(i,j,l),i=imin,imax+1) + enddo; enddo + + end + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine writevtk_fluid_xy + use var + real(kind=pr) :: temp(ii,jj,ll) + integer :: i,j,l + character(70) :: filename,rowfmt,vecfmt + +100 format(es11.4e2) + write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' + write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' + + l=int(ll/2.)+1 + + if(myid.eq.0) call write_visit_container('fluid_xy') + + write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xy_p',myid,'_',nt,'.vtk' + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 3.0' + write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET RECTILINEAR_GRID' + write(10,'(a10,i4,i4,a4)') 'DIMENSIONS',(imax-imin+2),(jmax-jmin+3),'1' + write(10,*) 'X_COORDINATES',(imax-imin+2),'float' + write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) + write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' + write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) + write(10,*) 'Z_COORDINATES 1 float' + write(10,100) zc(l) + write(10,*) 'POINT_DATA ',(imax-imin+2)*(jmax-jmin+3) + + temp=0._pr + temp(2:ii,:,:)=(u(2:ii,:,:)+u(1:ii-1,:,:))/2._pr + call writeVar('u',temp) + temp(:,2:jj,:)=(v(:,2:jj,:)+v(:,1:jj-1,:))/2._pr + call writeVar('v',temp) + temp(:,:,2:ll)=(w(:,:,2:ll)+w(:,:,1:ll-1))/2._pr + call writeVar('w',temp) + !call writeVar('uraw',u) + !call writeVar('vraw',v) + !call writeVar('wraw',w) + call writeVar('p',p) + call writeVar('rho_el',rho_el) + call writeVar('phi_el',phi_el) + call writeVar('Ex_el',Ex_el) + call writeVar('Ey_el',Ey_el) + call writeVar('Ez_el',Ez_el) + !temp=sqrt(Ex_el**2+Ey_el**2+Ez_el**2) + !call writeVar('Emag',temp) + +! write(10,'(a)') 'VECTORS uvw float' +! do j=jmin-1,jmax+1 +! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & +! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & +! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) +! enddo + + close(10) + + contains + + subroutine writeVar(name,myvar) + use var + real(kind=pr) :: myvar(ii,jj,ll) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + write(10,'(a)') 'LOOKUP_TABLE default ' + do j=jmin-1,jmax+1 + write(10,fmt=rowfmt) (myvar(i,j,l),i=imin,imax+1) + enddo + + end + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine writevtk_fluid_xz + use var + real(kind=pr) :: temp(ii,jj,ll) + integer :: i,j,l + character(70) :: filename,rowfmt,vecfmt + +100 format(es11.4e2) + write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' + write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' + + j=int(jj/2.)+1 + + if(myid.eq.0) call write_visit_container('fluid_xz') + + write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xz_p',myid,'_',nt,'.vtk' + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 3.0' + write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET RECTILINEAR_GRID' + write(10,'(a10,i4,a4,i4)') 'DIMENSIONS',(imax-imin+2),'1',(lmax-lmin+3) + write(10,*) 'X_COORDINATES',(imax-imin+2),'float' + write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) + write(10,*) 'Y_COORDINATES 1 float' + write(10,100) yc(j) + write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' + write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) + write(10,*) 'POINT_DATA ',(imax-imin+2)*(lmax-lmin+3) + + temp=0._pr + temp(2:ii,:,:)=(u(2:ii,:,:)+u(1:ii-1,:,:))/2._pr + call writeVar('u',temp) + temp(:,2:jj,:)=(v(:,2:jj,:)+v(:,1:jj-1,:))/2._pr + call writeVar('v',temp) + temp(:,:,2:ll)=(w(:,:,2:ll)+w(:,:,1:ll-1))/2._pr + call writeVar('w',temp) + !call writeVar('uraw',u) + !call writeVar('vraw',v) + !call writeVar('wraw',w) + call writeVar('p',p) + call writeVar('rho_el',rho_el) + call writeVar('phi_el',phi_el) + call writeVar('Ex_el',Ex_el) + call writeVar('Ey_el',Ey_el) + call writeVar('Ez_el',Ez_el) + !temp=sqrt(Ex_el**2+Ey_el**2+Ez_el**2) + !call writeVar('Emag',temp) + +! write(10,'(a)') 'VECTORS uvw float' +! do l=lmin-1,lmax+1 +! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & +! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & +! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) +! enddo + + close(10) + + contains + + subroutine writeVar(name,myvar) + use var + real(kind=pr) :: myvar(ii,jj,ll) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + write(10,'(a)') 'LOOKUP_TABLE default ' + do l=lmin-1,lmax+1 + write(10,fmt=rowfmt) (myvar(i,j,l),i=imin,imax+1) + enddo + + end + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine writevtk_fluid_yz + use var + real(kind=pr) :: temp(ii,jj,ll) + integer :: i,j,l + character(70) :: filename,rowfmt + +100 format(es11.4e2) + write(rowfmt,'(a,i4,a)') '(',(jmax-jmin+3),'(1x,es11.4e2))' + + i=int(ii/2.)+1 + + if(myid.eq.0) call write_visit_container('fluid_yz') + + write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_yz_p',myid,'_',nt,'.vtk' + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 3.0' + write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET RECTILINEAR_GRID' + write(10,'(a12,i8,i8)') 'DIMENSIONS 1',(jmax-jmin+3),(lmax-lmin+3) + write(10,*) 'X_COORDINATES 1 float' + write(10,100) xc(i) + write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' + write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) + write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' + write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) + write(10,*) 'POINT_DATA ',(jmax-jmin+3)*(lmax-lmin+3) + + temp=0._pr + temp(2:ii,:,:)=(u(2:ii,:,:)+u(1:ii-1,:,:))/2._pr + call writeVar('u',temp) + temp(:,2:jj,:)=(v(:,2:jj,:)+v(:,1:jj-1,:))/2._pr + call writeVar('v',temp) + temp(:,:,2:ll)=(w(:,:,2:ll)+w(:,:,1:ll-1))/2._pr + call writeVar('w',temp) + !call writeVar('uraw',u) + !call writeVar('vraw',v) + !call writeVar('wraw',w) + call writeVar('p',p) + call writeVar('rho_el',rho_el) + call writeVar('phi_el',phi_el) + call writeVar('Ex_el',Ex_el) + call writeVar('Ey_el',Ey_el) + call writeVar('Ez_el',Ez_el) + !temp=sqrt(Ex_el**2+Ey_el**2+Ez_el**2) + !call writeVar('Emag',temp) + + close(10) + + contains + + subroutine writeVar(name,myvar) + use var + real(kind=pr) :: myvar(ii,jj,ll) + character(*) :: name + + write(10,'(3a)') 'SCALARS ',name,' float 1' + write(10,'(a)') 'LOOKUP_TABLE default ' + do l=lmin-1,lmax+1 + write(10,fmt=rowfmt) (myvar(i,j,l),j=jmin-1,jmax+1) + enddo + + end + + end + +!#################################################################### +!> @author Holger Grosshans + subroutine writevtk_grid + use var + integer :: i,j,l + character(70) :: filename,rowfmt + +100 format(es11.4e2) + write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' + + write(filename,'("output/grid_p",i3.3,".vtk")') myid + open(10,file=filename) + + write(10,'(a)') '# vtk DataFile Version 2.0' + write(10,'(a,x,a)') 'grid --',version + write(10,'(a)') 'ASCII' + write(10,'(a)') 'DATASET RECTILINEAR_GRID' + write(10,*) 'DIMENSIONS',ii,jj,ll + write(10,*) 'X_COORDINATES',ii,'float' + write(10,fmt=rowfmt) (xc(i),i=1,ii) + write(10,*) 'Y_COORDINATES',jj,'float' + write(10,fmt=rowfmt) (yc(j),j=1,jj) + write(10,*) 'Z_COORDINATES',ll,'float' + write(10,fmt=rowfmt) (zc(l),l=1,ll) + write(10,*) 'POINT_DATA ',ii*jj*ll + + write(10,*) 'SCALARS celltype int 1' + write(10,*) 'LOOKUP_TABLE default ' + do l=1,ll; do j=1,jj; do i=1,ii + write(10,'(i2)') celltype(i,j,l) + enddo; enddo; enddo + + close(10) + + end + +!#################################################################### +!> @author Holger Grosshans +!> @brief write visit container file + subroutine write_visit_container(filename) + use var + integer :: m + character(*) :: filename + character(80) :: filename2 + logical :: file_ex + + write(filename2,'(3a)') 'results/',filename,'.visit' + inquire(file=filename2,exist=file_ex) + if (file_ex.and.nt.ne.1) then + open(11,file=filename2,access='append') + else + open(11,file=filename2) + write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs + endif + do m=1,nrprocs + write(11,'(2a,i3.3,a,i6.6,a)') filename,'_p',(m-1),'_',nt,'.vtk' + enddo + close(11) + + end diff --git a/src/writedat_fluid_xy.f90 b/src/writedat_fluid_xy.f90 deleted file mode 100644 index a3c0e89..0000000 --- a/src/writedat_fluid_xy.f90 +++ /dev/null @@ -1,93 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_ufluid_xy - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - l=int(ll/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_u_xy_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# u: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# y/x' - write(10,fmt=rowfmt) (xf(i),i=imin,imax+1) - do j=jmin-1,jmax+1 - write(10,fmt=100,advance='no') yc(j) - write(10,fmt=rowfmt) (u(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_vfluid_xy - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - l=int(ll/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_v_xy_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# v: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# y/x' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - do j=jmin-1,jmax+1 - write(10,fmt=100,advance='no') yf(j) - write(10,fmt=rowfmt) (v(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_wfluid_xy - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - l=int(ll/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_w_xy_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# w: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# y/x' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - do j=jmin-1,jmax+1 - write(10,fmt=100,advance='no') yc(j) - write(10,fmt=rowfmt) (w(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - diff --git a/src/writedat_fluid_xz.f90 b/src/writedat_fluid_xz.f90 deleted file mode 100644 index 7798953..0000000 --- a/src/writedat_fluid_xz.f90 +++ /dev/null @@ -1,93 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_ufluid_xz - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - j=int(jj/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_u_xz_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# u: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# z/x' - write(10,fmt=rowfmt) (xf(i),i=imin,imax+1) - do l=lmin-1,lmax+1 - write(10,fmt=100,advance='no') zc(l) - write(10,fmt=rowfmt) (u(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_vfluid_xz - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - j=int(jj/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_v_xz_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# v: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# z/x' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - do l=lmin-1,lmax+1 - write(10,fmt=100,advance='no') zc(l) - write(10,fmt=rowfmt) (v(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - -!#################################################################### -!> @author Holger Grosshans - subroutine writedat_wfluid_xz - use var - character(70) :: filename,rowfmt - integer :: i,j,l - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - j=int(jj/2) - - write(filename,'(a,i3.3,a,i6.6,a)') & - 'results/fluid_w_xz_p',myid,'_',nt,'.dat' - open(10,file=filename) - - write(10,'(a,es14.6e2,a,x,a)') '# w: t=',t,' s --',version - - write(10,'(a11)',advance='no') '# z/x' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - do l=lmin-1,lmax+1 - write(10,fmt=100,advance='no') zf(l) - write(10,fmt=rowfmt) (w(i,j,l),i=imin,imax+1) - enddo - - close(10) - - return - - end - diff --git a/src/writedat_particles.f90 b/src/writedat_particles.f90 index 187b225..5374c5a 100644 --- a/src/writedat_particles.f90 +++ b/src/writedat_particles.f90 @@ -7,23 +7,26 @@ integer n character(80) :: filename -100 format(10(es13.4e2,x),2(i6,x)) - - write(filename, & - '("results/particles_p",i3.3,"_",i6.6,".dat")') myid,nt +100 format(22(es13.4e2,x),2(i6,x)) + write(filename,'("results/particles_p",i3.3,"_",i6.6,".dat")') myid,nt open(10,file=filename) write(10,'(a,es14.6e2,a,x,a)') '# t=',t,' s --',version do n=1,np partmass=4._pr/3._pr*pi*rhop*partn(n)*radp(n)**3 - write(10,100) xp(n),yp(n),zp(n),radp(n),up(n),vp(n),wp(n), & + write(10,100) xp(n),yp(n),zp(n), & + radp(n), & + up(n),vp(n),wp(n), & + uf(n),vf(n),wf(n), & partn(n),q_el(n),q_el(n)/partmass, & + fx_el(n),fy_el(n),fz_el(n), & + fx_d(n),fy_d(n),fz_d(n), & + fx_l(n),fy_l(n),fz_l(n), & wcollnum(n),ppcollnum(n) enddo close(10) - return end diff --git a/src/writevtk_fluid_xy.f90 b/src/writevtk_fluid_xy.f90 deleted file mode 100644 index 3ef111e..0000000 --- a/src/writevtk_fluid_xy.f90 +++ /dev/null @@ -1,144 +0,0 @@ -!> @author Holger Grosshans - subroutine writevtk_fluid_xy - use var - integer :: i,j,l,m - character(70) :: filename,filename2,rowfmt,vecfmt - logical :: file_ex - - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' - - l=int(ll/2.)+1 - - write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xy_p',myid,'_',nt,'.vtk' - open(10,file=filename) - -! write visit container file - filename2='results/fluid_xy.visit' - if(myid.eq.0) then - inquire(file=filename2,exist=file_ex) - if (file_ex.and.nt.gt.1) then - open(11,file=filename2,access='append') - else - open(11,file=filename2) - write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs - endif - do m=1,nrprocs - write(11,'(a,i3.3,a,i6.6,a)') 'fluid_xy_p',(m-1),'_',nt,'.vtk' - enddo - close(11) - endif - - - write(10,'(a)') '# vtk DataFile Version 3.0' - write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET RECTILINEAR_GRID' - write(10,'(a10,i4,i4,a4)') & - 'DIMENSIONS',(imax-imin+2),(jmax-jmin+3),'1' - - write(10,*) 'X_COORDINATES',(imax-imin+2),'float' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - - write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' - write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) - - write(10,*) 'Z_COORDINATES 1 float' - write(10,100) zc(l) - - write(10,*) 'POINT_DATA ',(imax-imin+2)*(jmax-jmin+3) - - write(10,'(a)') 'SCALARS u float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS v float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS w float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) - enddo - -! write(10,'(a)') 'SCALARS uraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do j=jmin-1,jmax+1 -! write(10,fmt=rowfmt) (u(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS vraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do j=jmin-1,jmax+1 -! write(10,fmt=rowfmt) (v(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS wraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do j=jmin-1,jmax+1 -! write(10,fmt=rowfmt) (w(i,j,l),i=imin,imax+1) -! enddo - - write(10,'(a)') 'SCALARS p float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (p(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS rho_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (rho_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS phi_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (phi_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ex_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (Ex_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ey_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (Ey_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ez_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1 - write(10,fmt=rowfmt) (Ez_el(i,j,l),i=imin,imax+1) - enddo - -! write(10,'(a)') 'SCALARS Emag_el float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do j=jmin-1,jmax+1 -! write(10,fmt=rowfmt) & -! (sqrt(Ex_el(i,j,l)**2+Ey_el(i,j,l)**2+Ez_el(i,j,l)**2)**(0.5),i=imin,imax+1) -! enddo -! -! -! write(10,'(a)') 'VECTORS uvw float' -! do j=jmin-1,jmax+1 -! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & -! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & -! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) -! enddo - - - close(10) - - return - end diff --git a/src/writevtk_fluid_xyz.f90 b/src/writevtk_fluid_xyz.f90 deleted file mode 100644 index 22a9429..0000000 --- a/src/writevtk_fluid_xyz.f90 +++ /dev/null @@ -1,138 +0,0 @@ -!> @author Holger Grosshans - subroutine writevtk_fluid_xyz - use var - real(kind=pr) :: pp - integer :: i,j,l,m - character(70) :: filename,filename2,rowfmt,vecfmt - logical :: file_ex - - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' - - pp=0._pr - - write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xyz_p',myid,'_',nt,'.vtk' - open(10,file=filename) - -! write visit container file - filename2='results/fluid_xyz.visit' - if(myid.eq.0) then - inquire(file=filename2,exist=file_ex) - if (file_ex.and.nt.gt.1) then - open(11,file=filename2,access='append') - else - open(11,file=filename2) - write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs - endif - do m=1,nrprocs - write(11,'(a,i3.3,a,i6.6,a)') 'fluid_xyz_p',(m-1),'_',nt,'.vtk' - enddo - close(11) - endif - - - write(10,'(a)') '# vtk DataFile Version 3.0' - write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET RECTILINEAR_GRID' - write(10,'(a10,3(i4))') & - 'DIMENSIONS',(imax-imin+2),(jmax-jmin+3),(lmax-lmin+3) - - write(10,*) 'X_COORDINATES',(imax-imin+2),'float' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - - write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' - write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) - - write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' - write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) - - write(10,*) 'POINT_DATA ',(imax-imin+2)*(jmax-jmin+3)*(lmax-lmin+3) - - write(10,'(a)') 'SCALARS u float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS v float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS w float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS p float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (p(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS rho_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (rho_el(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS phi_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (phi_el(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS Ex_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ex_el(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS Ey_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ey_el(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS Ez_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ez_el(i,j,l),i=imin,imax+1) - enddo; enddo - - write(10,'(a)') 'SCALARS Emag_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) & - (sqrt(Ex_el(i,j,l)**2+Ey_el(i,j,l)**2+Ez_el(i,j,l)**2)**(0.5),i=imin,imax+1) - enddo; enddo - -! write(10,'(a)') 'VECTORS uvw float' -! do j=jmin-1,jmax+1; do l=lmin-1,lmax+1 -! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & -! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & -! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) -! enddo; enddo - - -! write(10,'(a)') 'VECTORS coordinates float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! do i=imin,imax+1 -! write(10,'(3(i8))') i,j,l -! enddo -! enddo - - - close(10) - - - - return - - end diff --git a/src/writevtk_fluid_xz.f90 b/src/writevtk_fluid_xz.f90 deleted file mode 100644 index 832508e..0000000 --- a/src/writevtk_fluid_xz.f90 +++ /dev/null @@ -1,150 +0,0 @@ -!> @author Holger Grosshans - subroutine writevtk_fluid_xz - use var - real(kind=pr) :: pp - integer :: i,j,l,m - character(70) :: filename,filename2,rowfmt,vecfmt - logical :: file_ex - - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - write(vecfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,3(es11.4e2)))' - - j=int(jj/2.)+1 - pp=0._pr - - write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_xz_p',myid,'_',nt,'.vtk' - open(10,file=filename) - -! write visit container file - filename2='results/fluid_xz.visit' - if(myid.eq.0) then - inquire(file=filename2,exist=file_ex) - if (file_ex.and.nt.gt.1) then - open(11,file=filename2,access='append') - else - open(11,file=filename2) - write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs - endif - do m=1,nrprocs - write(11,'(a,i3.3,a,i6.6,a)') 'fluid_xz_p',(m-1),'_',nt,'.vtk' - enddo - close(11) - endif - - - write(10,'(a)') '# vtk DataFile Version 3.0' - write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET RECTILINEAR_GRID' - write(10,'(a10,i4,a4,i4)') & - 'DIMENSIONS',(imax-imin+2),'1',(lmax-lmin+3) - - write(10,*) 'X_COORDINATES',(imax-imin+2),'float' - write(10,fmt=rowfmt) (xc(i),i=imin,imax+1) - - write(10,*) 'Y_COORDINATES 1 float' - write(10,100) yc(j) - - write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' - write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) - - write(10,*) 'POINT_DATA ',(imax-imin+2)*(lmax-lmin+3) - - write(10,'(a)') 'SCALARS u float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS v float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS w float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) - enddo - -! write(10,'(a)') 'SCALARS uraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (u(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS vraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (v(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS wraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (w(i,j,l),i=imin,imax+1) -! enddo - - write(10,'(a)') 'SCALARS p float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (p(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS rho_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (rho_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS phi_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (phi_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ex_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ex_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ey_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ey_el(i,j,l),i=imin,imax+1) - enddo - - write(10,'(a)') 'SCALARS Ez_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ez_el(i,j,l),i=imin,imax+1) - enddo - -! write(10,'(a)') 'SCALARS Emag_el float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) & -! (sqrt(Ex_el(i,j,l)**2+Ey_el(i,j,l)**2+Ez_el(i,j,l)**2)**(0.5),i=imin,imax+1) -! enddo -! -! -! write(10,'(a)') 'VECTORS uvw float' -! do l=lmin-1,lmax+1 -! write(10,fmt='(3(es12.2e2))') (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)), & -! 0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)), & -! 0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),i=imin,imax+1) -! enddo - - - - close(10) - - - - return - - end diff --git a/src/writevtk_fluid_yz.f90 b/src/writevtk_fluid_yz.f90 deleted file mode 100644 index 59f40d5..0000000 --- a/src/writevtk_fluid_yz.f90 +++ /dev/null @@ -1,138 +0,0 @@ -!> @author Holger Grosshans - subroutine writevtk_fluid_yz - use var - real(kind=pr), dimension(jj) :: temp4 - real(kind=pr) :: temp,temp1,temp2,temp3 - integer :: i,j,l,m - character(70) :: filename,filename2,rowfmt - logical :: file_ex - - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(jmax-jmin+3),'(1x,es11.4e2))' - - i=int(ii/2.)+1 - - write(filename,'(a,i3.3,a,i6.6,a)') 'results/fluid_yz_p',myid,'_',nt,'.vtk' - open(10,file=filename) - -! write visit container file - filename2='results/fluid_yz.visit' - if(myid.eq.0) then - inquire(file=filename2,exist=file_ex) - if (file_ex.and.nt.gt.1) then - open(11,file=filename2,access='append') - else - open(11,file=filename2) - write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs - endif - do m=1,nrprocs - write(11,'(a,i3.3,a,i6.6,a)') 'fluid_yz_p',(m-1),'_',nt,'.vtk' - enddo - close(11) - endif - - - write(10,'(a)') '# vtk DataFile Version 3.0' - write(10,'(a,es14.6e2,a,x,a)') 'fluid data: t=',t,' s --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET RECTILINEAR_GRID' - write(10,'(a12,i8,i8)') & - 'DIMENSIONS 1',(jmax-jmin+3),(lmax-lmin+3) - - write(10,*) 'X_COORDINATES 1 float' - write(10,100) xc(i) - - write(10,*) 'Y_COORDINATES',(jmax-jmin+3),'float' - write(10,fmt=rowfmt) (yc(j),j=jmin-1,jmax+1) - - write(10,*) 'Z_COORDINATES',(lmax-lmin+3),'float' - write(10,fmt=rowfmt) (zc(l),l=lmin-1,lmax+1) - - write(10,*) 'POINT_DATA ',(jmax-jmin+3)*(lmax-lmin+3) - - write(10,'(a)') 'SCALARS u float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(u(i,j,l)+u(max(i-1,1),j,l)),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS v float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(v(i,j,l)+v(i,max(j-1,1),l)),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS w float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (0.5_pr*(w(i,j,l)+w(i,j,max(l-1,1))),j=jmin-1,jmax+1) - enddo - -! write(10,'(a)') 'SCALARS uraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (u(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS vraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (v(i,j,l),i=imin,imax+1) -! enddo -! -! write(10,'(a)') 'SCALARS wraw float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) (w(i,j,l),i=imin,imax+1) -! enddo - - write(10,'(a)') 'SCALARS p float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (p(i,j,l),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS rho_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (rho_el(i,j,l),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS phi_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (phi_el(i,j,l),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS Ex_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ex_el(i,j,l),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS Ey_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ey_el(i,j,l),j=jmin-1,jmax+1) - enddo - - write(10,'(a)') 'SCALARS Ez_el float 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - do l=lmin-1,lmax+1 - write(10,fmt=rowfmt) (Ez_el(i,j,l),j=jmin-1,jmax+1) - enddo - -! write(10,'(a)') 'SCALARS Emag_el float 1' -! write(10,'(a)') 'LOOKUP_TABLE default ' -! do l=lmin-1,lmax+1 -! write(10,fmt=rowfmt) & -! (sqrt(Ex_el(i,j,l)**2+Ey_el(i,j,l)**2+Ez_el(i,j,l)**2)**(0.5),j=jmin-1,jmax+1) -! enddo - - - close(10) - - - return - end diff --git a/src/writevtk_grid.f90 b/src/writevtk_grid.f90 deleted file mode 100644 index 346d0e6..0000000 --- a/src/writevtk_grid.f90 +++ /dev/null @@ -1,41 +0,0 @@ -!> @author Holger Grosshans - subroutine writevtk_grid - use var - integer :: i,j,l - character(70) :: filename,rowfmt - -100 format(es11.4e2) - write(rowfmt,'(a,i4,a)') '(',(imax-imin+2),'(1x,es11.4e2))' - - write(filename,'("output/grid_p",i3.3,".vtk")') myid - open(10,file=filename) - - write(10,'(a)') '# vtk DataFile Version 2.0' - write(10,'(a,x,a)') 'grid --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET RECTILINEAR_GRID' - write(10,*) 'DIMENSIONS',ii,jj,ll - - write(10,*) 'X_COORDINATES',ii,'float' - write(10,fmt=rowfmt) (xc(i),i=1,ii) - - write(10,*) 'Y_COORDINATES',jj,'float' - write(10,fmt=rowfmt) (yc(j),j=1,jj) - - write(10,*) 'Z_COORDINATES',ll,'float' - write(10,fmt=rowfmt) (zc(l),l=1,ll) - - write(10,*) 'POINT_DATA ',ii*jj*ll - - write(10,*) 'SCALARS celltype int 1' - write(10,*) 'LOOKUP_TABLE default ' - do l=1,ll; do j=1,jj; do i=1,ii - write(10,'(i2)') celltype(i,j,l) - enddo - enddo - enddo - - close(10) - - return - end diff --git a/src/writevtk_particles.f90 b/src/writevtk_particles.f90 deleted file mode 100644 index b519f06..0000000 --- a/src/writevtk_particles.f90 +++ /dev/null @@ -1,124 +0,0 @@ -!#################################################################### -!> @author Holger Grosshans -!> @brief write out particle field in vtk format - subroutine writevtk_particles - use var - integer :: i,j,l,n,m - character(80) :: filename,filename2,rowfmt,rowfm2 - logical :: file_ex - - -100 format(es13.4e2) -101 format(3(es13.4e2)) -102 format(3(es14.5e2)) - rowfmt='(10(1x,es11.4e2))' - rowfm2='(10(1x,i9))' - - write(filename, & - '("results/particles_p",i3.3,"_",i6.6,".vtk")') myid,nt - - open(10,file=filename) - -! write visit container file - filename2='results/particles.visit' - if(myid.eq.0) then - inquire(file=filename2,exist=file_ex) - if (file_ex.and.nt.ne.1) then - open(11,file=filename2,access='append') - else - open(11,file=filename2) - write(11,'(a8,x,i3)') '!NBLOCKS',nrprocs - endif - do m=1,nrprocs - write(11,'(a,i3.3,a,i6.6,a)') 'particles_p',(m-1),'_',nt,'.vtk' - enddo - close(11) - endif - - - write(10,'(a)') '# vtk DataFile Version 3.0' - write(10,'(a,es14.6e2,a,x,a)') 'particle data: t=',t,' s --',version - write(10,'(a)') 'ASCII' - write(10,'(a)') 'DATASET UNSTRUCTURED_GRID' - write(10,*) - - write(10,'(a6,i9,a6)') 'POINTS ',np,' FLOAT' - do n=1,np - write(10,102) (xp(n)),yp(n),zp(n) - end do - write(10,*) - - write(10,'(a5,i9,i9)') 'CELLS ',np,2*np - write(10,*) ('1',n-1,n=1,np) - write(10,*) - - write(10,'(a10,i9)') 'CELL_TYPES ',np - write(10,*) ('1 ', n=1,np) - write(10,*) - - write(10,'(a,i9)') 'POINT_DATA ',np - write(10,'(a)') 'SCALARS RadP FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (radp(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS UP FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (up(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS VP FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (vp(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS WP FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (wp(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS partn FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (partn(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS q_el FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (q_el(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS fx_el FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (fx_el(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS fy_el FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (fy_el(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS fz_el FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfmt) (fz_el(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS wcollnum FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfm2) (wcollnum(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'SCALARS np FLOAT 1' - write(10,'(a)') 'LOOKUP_TABLE default ' - write(10,fmt=rowfm2) (nGlob(n),n=1,np) - write(10,'(a)') - - write(10,'(a)') 'VECTORS UPVPWP FLOAT' - write(10,101) (up(n),vp(n),wp(n),n=1,np) - write(10,'(a)') - - close(10) - - - return - - end -- GitLab