diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Makefile b/Makefile index 9fbbaa8..9ee88ce 100755 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ FFILES = rhs.f90 vis.f90 fluid_time_step.f90 init_fields.f90 \ sponge.f90 fft_unit_test.f90 draw_plate.f90 draw_sphere.f90 \ rotation_matrices.f90 add_channel.f90 add_cavity.f90 init_scalar.f90 dry_run.f90 \ noncircular_cylinder.f90 draw_flexible_plate.f90 \ - runtime_backuping.f90 io_test.f90 + runtime_backuping.f90 io_test.f90 POD.f90 post_force.f90 ifndef NOHDF5 # Case WITH HDF5 (all machines except earth simulator) @@ -31,6 +31,11 @@ else # Case WITHOUT Hdf FFILES += flusi_nohdf5_interface.f90 postprocessing_nohdf5.f90 endif + +ifdef SUPERLU +FFILES += test_superlu.f90 +endif + # Object and module directory: OBJDIR=obj OBJS := $(FFILES:%.f90=$(OBJDIR)/%.o) @@ -43,7 +48,7 @@ MFILES = vars.f90 module_helpers.f90 cof_p3dfft.f90 solid_solver.f90 flexible_so interpolation.f90 basic_operators.f90 module_insects.f90 turbulent_inlet.f90 \ ghostpoints.f90 passive_scalar.f90 ini_files_parser.f90 \ ini_files_parser_mpi.f90 wavelet_library.f90 module_insects_integration_flusi_wabbit.f90 \ - krylov_time_stepper.f90 + module_timing.f90 ifndef NOHDF5 MFILES += hdf5_wrapper.f90 slicing.f90 stlreader.f90 @@ -53,6 +58,14 @@ endif MOBJS := $(MFILES:%.f90=$(OBJDIR)/%.o) +#-------------------------------------------------------------- +# Files in C used for super_lu library: +#-------------------------------------------------------------- +ifdef SUPERLU +CFILES = c_fortran_dgssv.c +COBJS := $(CFILES:%.c=$(OBJDIR)/%.o) +endif + #-------------------------------------------------------------- # Source code directories (colon-separated): #-------------------------------------------------------------- @@ -73,6 +86,10 @@ ifeq ($(FC),sxf90) FC = sxmpif90 endif +ifndef CC +CC = gcc +endif + #------------------------------------------------------------------------------- # SX compiler #------------------------------------------------------------------------------- @@ -88,6 +105,10 @@ ifdef NOHDF5 PRE_FLAGS=-DNOHDF5 endif +ifdef SUPERLU +PRE_FLAGS += -DSUPERLU +endif + # Note that shell $(FC) makes an error on FC system and should be bypassed else @@ -102,12 +123,18 @@ FFLAGS += -J$(OBJDIR) # specify directory for modules. #FFLAGS += -pedantic PPFLAG= -cpp #preprocessor flag # Debug flags for gfortran: -FFLAGS += -Wuninitialized -fimplicit-none -fbounds-check -g -ggdb -fbacktrace +#FFLAGS += -Wuninitialized -fimplicit-none -fbounds-check -g -ggdb -fbacktrace FFLAGS += -O3 +# Debug flags for gcc: +CFLAGS += -DNDEBUG -DPRNTlevel=0 -DDEBUGlevel=0 +CFLAGS += -O #FFLAGS += -ffpe-trap=zero,overflow,underflow -ffree-line-length-none -fbacktrace ifdef NOHDF5 PRE_FLAGS=-DNOHDF5 endif +ifdef SUPERLU +PRE_FLAGS += -DSUPERLU +endif endif #------------------------------------------------------------------------------- @@ -120,8 +147,11 @@ PRE_FLAGS= -DIFORT # define the IFORT variable ifdef NOHDF5 PRE_FLAGS += -DNOHDF5 endif +ifdef SUPERLU +PRE_FLAGS += -DSUPERLU +endif FFLAGS += -module $(OBJDIR) # specify directory for modules. -FFLAGS += -vec_report0 +#FFLAGS += -vec_report0 # debug flags # FFLAGS+= -g -debug all -traceback -check all -CB endif @@ -137,6 +167,9 @@ PRE_FLAGS = -WF,-DTURING ifdef NOHDF5 PRE_FLAGS:=$(PRE_FLAGS),-DNOHDF5 endif +ifdef SUPERLU +PRE_FLAGS:=$(PRE_FLAGS),-DSUPERLU +endif PPFLAG=-qsuffix=cpp=f90 #preprocessor flag endif @@ -157,6 +190,13 @@ P3DFFT_INC = $(P3DFFT_ROOT)/include HDF_LIB = $(HDF_ROOT)/lib HDF_INC = $(HDF_ROOT)/include +# SuperLU +ifdef SUPERLU +SUPERLU_LIB = $(SUPERLU_ROOT)/build/SRC/libsuperlu.a +SUPERLUBLAS_LIB = $(SUPERLU_ROOT)/build/CBLAS/libblas.a +SUPERLU_SRC = $(SUPERLU_ROOT)/SRC +endif + # Common build flags LDFLAGS = -L$(P3DFFT_LIB) -lp3dfft -L$(FFT_LIB) -lfftw3 ifndef NOHDF5 @@ -188,21 +228,27 @@ ifndef NOHDF5 FFLAGS += -I$(HDF_INC) endif - +# Super_LU compile flags +ifdef SUPERLU +LDFLAGS += $(SUPERLU_LIB) $(SUPERLUBLAS_LIB) +CFLAGS += -I$(SUPERLU_SRC) +endif # Both programs are compiled by default. all: directories $(PROGRAMS) # Compile main programs, with dependencies. -flusi: flusi.f90 $(MOBJS) $(OBJS) +flusi: flusi.f90 $(MOBJS) $(COBJS) $(OBJS) $(FC) $(FFLAGS) -o $@ $^ $(LDFLAGS) -mhd: mhd.f90 $(MOBJS) $(OBJS) +mhd: mhd.f90 $(MOBJS) $(COBJS) $(OBJS) $(FC) $(FFLAGS) -o $@ $^ $(LDFLAGS) # Compile modules (module dependency must be specified by hand in # Fortran). Objects are specified in MOBJS (module objects). -$(OBJDIR)/vars.o: vars.f90 +$(OBJDIR)/vars.o: vars.f90 $(OBJDIR)/module_timing.o + $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) +$(OBJDIR)/module_timing.o: module_timing.f90 $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) $(OBJDIR)/cof_p3dfft.o: cof_p3dfft.f90 $(OBJDIR)/vars.o $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) @@ -217,10 +263,21 @@ $(OBJDIR)/solid_solver.o: solid_solver.f90 $(OBJDIR)/vars.o $(OBJDIR)/interpola mouvement.f90 integrate_position.f90 init_beam.f90 save_beam.f90 BeamForces.f90 plate_geometry.f90 aux.f90 \ prescribed_beam.f90 solid_solver_wrapper.f90 $(OBJDIR)/ghostpoints.o $(FC) -Isrc/solid_solver/ $(FFLAGS) -c -o $@ $< $(LDFLAGS) + +ifdef SUPERLU +$(OBJDIR)/flexible_solver.o: flexible_solver.f90 $(OBJDIR)/vars.o $(OBJDIR)/interpolation.o $(OBJDIR)/basic_operators.o $(OBJDIR)/module_helpers.o \ + flexible_tri_mask.f90 internal_force.f90 internal_force_derivative.f90 \ + init_wing.f90 flexible_solver_wrapper.f90 flexible_solid_time_stepper_superlu.f90 \ + supplementary_calc.f90 save_wing.f90 + $(FC) -Isrc/flexible_solver/ $(FFLAGS) -c -o $@ $< $(LDFLAGS) +else $(OBJDIR)/flexible_solver.o: flexible_solver.f90 $(OBJDIR)/vars.o $(OBJDIR)/interpolation.o $(OBJDIR)/basic_operators.o $(OBJDIR)/module_helpers.o \ flexible_tri_mask.f90 internal_force.f90 internal_force_derivative.f90 \ - init_wing.f90 flexible_solver_wrapper.f90 + init_wing.f90 flexible_solver_wrapper.f90 flexible_solid_time_stepper.f90 \ + supplementary_calc.f90 save_wing.f90 $(FC) -Isrc/flexible_solver/ $(FFLAGS) -c -o $@ $< $(LDFLAGS) +endif + $(OBJDIR)/ghostpoints.o: ghostpoints.f90 $(OBJDIR)/vars.o $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) $(OBJDIR)/interpolation.o: interpolation.f90 $(OBJDIR)/vars.o $(OBJDIR)/basic_operators.o @@ -251,12 +308,16 @@ $(OBJDIR)/runtime_backuping.o: runtime_backuping.f90 $(OBJDIR)/vars.o $(OBJDIR)/ $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) $(OBJDIR)/io_test.o: io_test.f90 $(OBJDIR)/vars.o $(OBJDIR)/runtime_backuping.o $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) -$(OBJDIR)/krylov_time_stepper.o: krylov_time_stepper.f90 $(OBJDIR)/vars.o $(OBJDIR)/module_helpers.o $(OBJDIR)/module_insects_integration_flusi_wabbit.o $(OBJDIR)/solid_solver.o - $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) $(OBJDIR)/wavelet_library.o: wavelet_library.f90 $(OBJDIR)/vars.o $(OBJDIR)/cof_p3dfft.o coherent_vortex_extraction.f90 FWT3_PO.f90 \ IWT3_PO.f90 $(FC) -Isrc/wavelets/ $(FFLAGS) -c -o $@ $< $(LDFLAGS) +# Compile remaining C objects from Fortran files for SuperLU. +ifdef SUPERLU +$(OBJDIR)/c_fortran_dgssv.o: c_fortran_dgssv.c + $(CC) $(CFLAGS) -c -o $@ $< $(VERBOSE) +endif + # Compile remaining objects from Fortran files. $(OBJDIR)/%.o: %.f90 $(MOBJS) $(FC) $(FFLAGS) -c -o $@ $< $(LDFLAGS) diff --git a/doc/INSECTS_CHEATS.pdf b/doc/INSECTS_CHEATS.pdf index 2de7e37..480da0b 100644 Binary files a/doc/INSECTS_CHEATS.pdf and b/doc/INSECTS_CHEATS.pdf differ diff --git a/params/params_template_fsi.ini b/params/params_template_fsi.ini index 32f5ee5..c50352c 100644 --- a/params/params_template_fsi.ini +++ b/params/params_template_fsi.ini @@ -183,7 +183,7 @@ itkine=; [MeanFlow] -; type of mean flow (free/constant/dynamic) +; type of mean flow (free/constant/dynamic/sinusoidal) ; free: do nothing particular about the mean flow ; fixed: fix mean flow to values given here ; dynamic: solve mean flow eqn for a given (domain-independent) fluid mass @@ -202,6 +202,7 @@ T_release_meanflow=0.0; ux=0.0; uy=0.0; uz=0.0; +umean_freq=0.0; [Sponge] ; use a vorticity sponge or not? @@ -249,6 +250,8 @@ iSaveMask=1; iSaveSolidVelocity=0; # save spectrum every itdrag / tdrag times? iSaveSpectrae=no; +# [one-file-backup | individual-files ] +backup_type=one-file-backup; [Forcing] ; Forcing for isotropic turbulence. To be used with cubic boxes (nx=ny=nz and xl=yl=zl=2*pi) diff --git a/src/c_fortran_dgssv.c b/src/c_fortran_dgssv.c new file mode 100644 index 0000000..81e6e7e --- /dev/null +++ b/src/c_fortran_dgssv.c @@ -0,0 +1,205 @@ +/*! \file +Copyright (c) 2003, The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required +approvals from U.S. Dept. of Energy) + +All rights reserved. + +The source code is distributed under BSD license, see the file License.txt +at the top-level directory. +*/ + +/* + * -- SuperLU routine (version 5.0) -- + * Univ. of California Berkeley, Xerox Palo Alto Research Center, + * and Lawrence Berkeley National Lab. + * October 15, 2003 + * + */ + +#include "slu_ddefs.h" +#include "time.h" + +#define HANDLE_SIZE 8 + +/* kind of integer to hold a pointer. Use 64-bit. */ +typedef long long int fptr; + +typedef struct { + SuperMatrix *L; + SuperMatrix *U; + int *perm_c; + int *perm_r; +} factors_t; + +void +c_fortran_dgssv_(int *iopt, int *n, int *nnz, int *nrhs, + double *values, int *rowind, int *colptr, + double *b, int *ldb, + fptr *f_factors, /* a handle containing the address + pointing to the factored matrices */ + int *info) + +{ +/* + * This routine can be called from Fortran. + * + * iopt (input) int + * Specifies the operation: + * = 1, performs LU decomposition for the first time + * = 2, performs triangular solve + * = 3, free all the storage in the end + * + * f_factors (input/output) fptr* + * If iopt == 1, it is an output and contains the pointer pointing to + * the structure of the factored matrices. + * Otherwise, it it an input. + * + */ + + SuperMatrix A, AC, B; + SuperMatrix *L, *U; + int *perm_r; /* row permutations from partial pivoting */ + int *perm_c; /* column permutation vector */ + int *etree; /* column elimination tree */ + SCformat *Lstore; + NCformat *Ustore; + int i, panel_size, permc_spec, relax; + trans_t trans; + mem_usage_t mem_usage; + superlu_options_t options; + SuperLUStat_t stat; + factors_t *LUfactors; + GlobalLU_t Glu; /* Not needed on return. */ + int *rowind0; /* counter 1-based indexing from Frotran arrays. */ + int *colptr0; + + trans = NOTRANS; + + if ( *iopt == 1 ) { /* LU decomposition */ + + clock_t tbegin = clock(); + + /* Set the default input options. */ + set_default_options(&options); + + /* Initialize the statistics variables. */ + StatInit(&stat); + + /* clock_t begin1 = clock(); */ + /* Adjust to 0-based indexing */ + if ( !(rowind0 = intMalloc(*nnz)) ) ABORT("Malloc fails for rowind0[]."); + if ( !(colptr0 = intMalloc(*n+1)) ) ABORT("Malloc fails for colptr0[]."); + for (i = 0; i < *nnz; ++i) rowind0[i] = rowind[i] - 1; + for (i = 0; i <= *n; ++i) colptr0[i] = colptr[i] - 1; + + dCreate_CompCol_Matrix(&A, *n, *n, *nnz, values, rowind0, colptr0, + SLU_NC, SLU_D, SLU_GE); + L = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); + U = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); + if ( !(perm_r = intMalloc(*n)) ) ABORT("Malloc fails for perm_r[]."); + if ( !(perm_c = intMalloc(*n)) ) ABORT("Malloc fails for perm_c[]."); + if ( !(etree = intMalloc(*n)) ) ABORT("Malloc fails for etree[]."); + + /*clock_t end1 = clock(); + double time_spent1 = (double)(end1 - begin1) / CLOCKS_PER_SEC; + printf("Time spent on dCreate_Compcol_Matrix %lf\n", time_spent1); */ + + /* + * Get column permutation vector perm_c[], according to permc_spec: + * permc_spec = 0: natural ordering + * permc_spec = 1: minimum degree on structure of A'*A + * permc_spec = 2: minimum degree on structure of A'+A + * permc_spec = 3: approximate minimum degree for unsymmetric matrices + */ + clock_t begin = clock(); + permc_spec = options.ColPerm; + get_perm_c(permc_spec, &A, perm_c); + + sp_preorder(&options, &A, perm_c, etree, &AC); + + panel_size = sp_ienv(1); + relax = sp_ienv(2); + + dgstrf(&options, &AC, relax, panel_size, etree, + NULL, 0, perm_c, perm_r, L, U, &Glu, &stat, info); +/* + clock_t end = clock(); + double time_spent = (double)(end - begin) / CLOCKS_PER_SEC; + printf("Time spent on dgstrf %lf\n", time_spent);*/ + + + if ( *info == 0 ) { + Lstore = (SCformat *) L->Store; + Ustore = (NCformat *) U->Store; +/* + * printf("No of nonzeros in factor L = %d\n", Lstore->nnz); + * printf("No of nonzeros in factor U = %d\n", Ustore->nnz); + * printf("No of nonzeros in L+U = %d\n", Lstore->nnz + Ustore->nnz); + * dQuerySpace(L, U, &mem_usage); + * printf("L\\U MB %.3f\ttotal MB needed %.3f\n", + * mem_usage.for_lu/1e6, mem_usage.total_needed/1e6); + */ + } else { + printf("dgstrf() error returns INFO= %d\n", *info); + if ( *info <= *n ) { /* factorization completes */ + dQuerySpace(L, U, &mem_usage); + printf("L\\U MB %.3f\ttotal MB needed %.3f\n", + mem_usage.for_lu/1e6, mem_usage.total_needed/1e6); + } + } + + /* Save the LU factors in the factors handle */ + LUfactors = (factors_t*) SUPERLU_MALLOC(sizeof(factors_t)); + LUfactors->L = L; + LUfactors->U = U; + LUfactors->perm_c = perm_c; + LUfactors->perm_r = perm_r; + *f_factors = (fptr) LUfactors; + + /* Free un-wanted storage */ + SUPERLU_FREE(etree); + Destroy_SuperMatrix_Store(&A); + Destroy_CompCol_Permuted(&AC); + SUPERLU_FREE(rowind0); + SUPERLU_FREE(colptr0); + StatFree(&stat); + +/* clock_t tend = clock(); + double ttime_spent = (double)(tend - tbegin) / CLOCKS_PER_SEC; + printf("Total time spent on LU factorization %lf\n", ttime_spent);*/ + + } else if ( *iopt == 2 ) { /* Triangular solve */ + /* Initialize the statistics variables. */ + StatInit(&stat); + + /* Extract the LU factors in the factors handle */ + LUfactors = (factors_t*) *f_factors; + L = LUfactors->L; + U = LUfactors->U; + perm_c = LUfactors->perm_c; + perm_r = LUfactors->perm_r; + + dCreate_Dense_Matrix(&B, *n, *nrhs, b, *ldb, SLU_DN, SLU_D, SLU_GE); + + /* Solve the system A*X=B, overwriting B with X. */ + dgstrs (trans, L, U, perm_c, perm_r, &B, &stat, info); + + Destroy_SuperMatrix_Store(&B); + StatFree(&stat); + + } else if ( *iopt == 3 ) { /* Free storage */ + /* Free the LU factors in the factors handle */ + LUfactors = (factors_t*) *f_factors; + SUPERLU_FREE (LUfactors->perm_r); + SUPERLU_FREE (LUfactors->perm_c); + Destroy_SuperNode_Matrix(LUfactors->L); + Destroy_CompCol_Matrix(LUfactors->U); + SUPERLU_FREE (LUfactors->L); + SUPERLU_FREE (LUfactors->U); + SUPERLU_FREE (LUfactors); + } else { + fprintf(stderr,"Invalid iopt=%d passed to c_fortran_dgssv()\n",*iopt); + exit(-1); + } +} diff --git a/src/cof_p3dfft.f90 b/src/cof_p3dfft.f90 index 0ccc7d5..80d9eb5 100644 --- a/src/cof_p3dfft.f90 +++ b/src/cof_p3dfft.f90 @@ -30,7 +30,7 @@ module p3dfft_wrapper ! Compute the FFT of the real-valued 3D array inx and save the output ! in the complex-valued 3D array outk. -subroutine fft(outk,inx) +subroutine fft(inx, outk) use mpi use p3dfft use vars ! For precision specficiation and array sizes @@ -44,9 +44,9 @@ subroutine fft(outk,inx) call abort(33343,'P3DFFT is not initialized, you cannot perform FFTs') endif - t1 = MPI_wtime() ! Compute forward FFT + outk = 0.0d0 call p3dfft_ftran_r2c( inx, outk, 'fff') ! Normalize @@ -55,13 +55,14 @@ subroutine fft(outk,inx) norm = 1.d0 / dble(npoints) outk = outk * norm - time_fft = time_fft + MPI_wtime() - t1 ! for global % of FFTS + ! save timing + call toc( "FFT", MPI_wtime() - t1) end subroutine fft ! Compute the inverse FFT of the complex-valued 3D array ink and save the ! output in the real-valued 3D array outx. -subroutine ifft(outx,ink) +subroutine ifft(ink, outx) use mpi use p3dfft use vars ! For precision specficiation and array sizes @@ -77,13 +78,14 @@ subroutine ifft(outx,ink) ! Compute backward FFT call p3dfft_btran_c2r(ink, outx, 'fff') - time_ifft = time_ifft + MPI_wtime() - t1 + ! save timing + call toc( "iFFT", MPI_wtime() - t1) end subroutine ifft ! Compute the FFT of the real-valued 3D array inx and save the output ! in the complex-valued 3D array outk. -subroutine fft3(outk,inx) +subroutine fft3(inx, outk) use mpi use p3dfft use vars ! For precision specficiation and array sizes @@ -100,8 +102,7 @@ subroutine fft3(outk,inx) call abort(33343,'P3DFFT is not initialized, you cannot perform FFTs') endif -! call p3dfft_ftran_r2c_many( inx, rs(1)*rs(2)*rs(3), outk, cs(1)*cs(2)*cs(3), 3, 'fff') -! FIXME: p3dfft_ftran_r2c_many is unstable, use p3dfft_ftran_r2c + outk = 0.0d0 call p3dfft_ftran_r2c(inx(:,:,:,1), outk(:,:,:,1), 'fff') call p3dfft_ftran_r2c(inx(:,:,:,2), outk(:,:,:,2), 'fff') call p3dfft_ftran_r2c(inx(:,:,:,3), outk(:,:,:,3), 'fff') @@ -111,14 +112,15 @@ subroutine fft3(outk,inx) norm = 1.d0 / dble(npoints) outk = outk * norm - time_fft = time_fft + MPI_wtime() - t1 ! for global % of FFTS + ! save timing + call toc( "FFT", MPI_wtime() - t1) end subroutine fft3 ! Compute the inverse FFT of the complex-valued 3D array ink and save the ! output in the real-valued 3D array outx. -subroutine ifft3(outx,ink) +subroutine ifft3(ink, outx) use mpi use p3dfft use vars ! For precision specficiation and array sizes @@ -132,16 +134,15 @@ subroutine ifft3(outx,ink) t1 = MPI_wtime() if (using_p3dfft .eqv. .false.) then - call abort(33343,'P3DFFT is not initialized, you cannot perform FFTs') + call abort(33343,'P3DFFT is not initialized, you cannot perform iFFTs') endif -! call p3dfft_btran_c2r_many( ink, cs(1)*cs(2)*cs(3), outx, rs(1)*rs(2)*rs(3), 3, 'fff') -! FIXME: p3dfft_btran_c2r_many is unstable, use p3dfft_btran_c2r call p3dfft_btran_c2r(ink(:,:,:,1), outx(:,:,:,1), 'fff') call p3dfft_btran_c2r(ink(:,:,:,2), outx(:,:,:,2), 'fff') call p3dfft_btran_c2r(ink(:,:,:,3), outx(:,:,:,3), 'fff') - time_ifft = time_ifft + MPI_wtime() - t1 + ! save timing + call toc( "iFFT", MPI_wtime() - t1) end subroutine ifft3 @@ -163,7 +164,7 @@ subroutine fft_initialize include 'fftw3.f' integer,parameter :: nmpidims = 2 - integer :: mpicode,idir,L,n,ix,iy,iz + integer :: mpicode,idir,L,n,ix,iy,iz,nxc integer,dimension(1:3) :: ka,kb,ks,kat,kbt,kst logical,dimension(2) :: subcart real(kind=pr),dimension(:,:),allocatable :: f,ft @@ -230,7 +231,20 @@ subroutine fft_initialize endif !-- Initialize P3DFFT - call p3dfft_setup(mpidims,nx,ny,nz,MPI_COMM_WORLD, overwrite=.false.) + if (iDealias==1) then + !-- Pruned fft for dealiasing. Only stable in the x direction (Why?) + nxc = ceiling((3.d0/4.d0)*dble(nx)) ! 3/4*nx is more likely an integer than 3/4*nx + if (nxc < 2) then ! Do not use pruned for small nx + nxc = nx + endif + call p3dfft_setup(mpidims,nx,ny,nz,MPI_COMM_WORLD,nxc,ny,nz,overwrite=.false.) + if (mpirank==0) then + write(*,*) "Using pruned FFT" + endif + else + !-- No pruned if no dealiasing + call p3dfft_setup(mpidims,nx,ny,nz,MPI_COMM_WORLD,overwrite=.false.) + endif !-- Get Cartesian topology info call p3dfft_get_mpi_info(mpitaskid,mpitasks,mpicommcart) diff --git a/src/drag.f90 b/src/drag.f90 index efff8f8..0cf29ad 100644 --- a/src/drag.f90 +++ b/src/drag.f90 @@ -9,6 +9,8 @@ ! 1 Interesting parts (e.g. a cylinder), for the insects this is BODY ! 2 Other parts, for the insects, this is LEFT WING ! 3 For the insects, this is RIGHT WING +! 4 For the insects, this is SECOND LEFT WING +! 5 For the insects, this is SECOND RIGHT WING ! Currently, we store the torque / forces over all colors greater than 0 in the ! global structure "GlobalIntegrals". If we're running in "insects" mode, the ! colors 1 and 2 are the forces on wings and body, respectively. These are stored @@ -125,7 +127,7 @@ subroutine cal_drag ( time, u, Insect ) ! for insects, moment of the body is computed with respect to (x0,y0,z0) ! but for the wings it is computed with respect tot the pivot points - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then if (color==Insect%color_l) then xlev = xlev - Insect%x_pivot_l_g(1) ylev = ylev - Insect%x_pivot_l_g(2) @@ -134,6 +136,14 @@ subroutine cal_drag ( time, u, Insect ) xlev = xlev - Insect%x_pivot_r_g(1) ylev = ylev - Insect%x_pivot_r_g(2) zlev = zlev - Insect%x_pivot_r_g(3) + elseif (color==Insect%color_l2) then + xlev = xlev - Insect%x_pivot_l2_g(1) + ylev = ylev - Insect%x_pivot_l2_g(2) + zlev = zlev - Insect%x_pivot_l2_g(3) + elseif (color==Insect%color_r2) then + xlev = xlev - Insect%x_pivot_r2_g(1) + ylev = ylev - Insect%x_pivot_r2_g(2) + zlev = zlev - Insect%x_pivot_r2_g(3) endif xc = periodize_coordinate((/xlev,ylev,zlev/), (/xl,yl,zl/)) xlev = xc(1) @@ -272,7 +282,7 @@ subroutine cal_drag ( time, u, Insect ) powerz = powerz + us(ix,iy,iz,3)*penalz(i) enddo - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then !cdir shortloop do ix=ix_,min(ix_+blksz-1,rb(1)) i = ix-ix_+1 @@ -287,6 +297,14 @@ subroutine cal_drag ( time, u, Insect ) xlev(i) = xlev(i) - Insect%x_pivot_r_g(1) ylev(i) = ylev(i) - Insect%x_pivot_r_g(2) zlev(i) = zlev(i) - Insect%x_pivot_r_g(3) + elseif (color_(i)==Insect%color_l2) then + xlev(i) = xlev(i) - Insect%x_pivot_l2_g(1) + ylev(i) = ylev(i) - Insect%x_pivot_l2_g(2) + zlev(i) = zlev(i) - Insect%x_pivot_l2_g(3) + elseif (color_(i)==Insect%color_r2) then + xlev(i) = xlev(i) - Insect%x_pivot_r2_g(1) + ylev(i) = ylev(i) - Insect%x_pivot_r2_g(2) + zlev(i) = zlev(i) - Insect%x_pivot_r2_g(3) endif xc = periodize_coordinate((/xlev(i),ylev(i),zlev(i)/), (/xl,yl,zl/)) xlev(i) = xc(1) @@ -367,8 +385,8 @@ subroutine cal_drag ( time, u, Insect ) call MPI_ALLREDUCE ( u_residual,u_residual_glob,6,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,mpicode) ! the insects have forces on the wing and body separate - if (iMask=="Insect") then - do color = Insect%color_body, Insect%color_r + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then + do color = Insect%color_body, endcolor call MPI_ALLREDUCE (forcex(color),Insect%PartIntegrals(color)%Force(1),1,& MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,mpicode) call MPI_ALLREDUCE (forcey(color),Insect%PartIntegrals(color)%Force(2),1,& @@ -396,8 +414,8 @@ subroutine cal_drag ( time, u, Insect ) MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,mpicode) ! the insects have torques on the wing and body separate - if (iMask=="Insect") then - do color = Insect%color_body, Insect%color_r + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then + do color = Insect%color_body, endcolor call MPI_ALLREDUCE (torquex(color),Insect%PartIntegrals(color)%Torque(1),1,& MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,mpicode) call MPI_ALLREDUCE (torquey(color),Insect%PartIntegrals(color)%Torque(2),1,& @@ -408,7 +426,7 @@ subroutine cal_drag ( time, u, Insect ) endif ! compute aerodynamic power - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then call aero_power (Insect,apowtotal) call inert_power(Insect,ipowtotal) endif @@ -419,7 +437,7 @@ subroutine cal_drag ( time, u, Insect ) ! have been computed ( call cal_unst_corrections first! ) !--------------------------------------------------------------------------- if(mpirank == 0) then - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then ! Aerodynamic power is only computed for insects open(14,file='forces.t',status='unknown',position='append') write (14,'(15(es15.8,1x))') time, GlobalIntegrals%Force, & @@ -427,7 +445,7 @@ subroutine cal_drag ( time, u, Insect ) GlobalIntegrals%Torque_unst, apowtotal, ipowtotal close(14) ! currently, only insects have different colors - do color = Insect%color_body, Insect%color_r + do color = Insect%color_body, endcolor write (forcepartfilename, "(A11,I1,A2)") "forces_part", color, ".t" open(14,file=trim(forcepartfilename),status='unknown',position='append') write (14,'(15(es15.8,1x))') time, Insect%PartIntegrals(color)%Force, & @@ -590,9 +608,9 @@ subroutine cal_unst_corrections ( time, dt, Insect ) GlobalIntegrals%Force_unst(3) = sum(force_newz(1:5))-sum(force_oldz(1:5)) GlobalIntegrals%Force_unst = GlobalIntegrals%Force_unst / dt - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then ! for the insects, we save separately the WINGs and the BODY - do color = Insect%color_body, Insect%color_r + do color = Insect%color_body, endcolor Insect%PartIntegrals(color)%Force_unst(1) = force_newx(color)-force_oldx(color) Insect%PartIntegrals(color)%Force_unst(2) = force_newy(color)-force_oldy(color) Insect%PartIntegrals(color)%Force_unst(3) = force_newz(color)-force_oldz(color) @@ -603,7 +621,7 @@ subroutine cal_unst_corrections ( time, dt, Insect ) ! we cannot compute the time derivative, because we lack the old value of the ! integral. As a hack, return zero. GlobalIntegrals%Force_unst = 0.d0 - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then do color = Insect%color_body, Insect%color_r Insect%PartIntegrals(color)%Force_unst = 0.d0 enddo @@ -649,15 +667,23 @@ subroutine cal_unst_corrections ( time, dt, Insect ) ! for insects, moment of the body is computed with respect to (x0,y0,z0) ! but for the wings it is computed with respect tot the pivot points - if (iMask=="Insect") then - if (color==2) then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then + if (color==Insect%color_l) then xlev = xlev - Insect%x_pivot_l_g(1) ylev = ylev - Insect%x_pivot_l_g(2) zlev = zlev - Insect%x_pivot_l_g(3) - elseif (color==3) then + elseif (color==Insect%color_r) then xlev = xlev - Insect%x_pivot_r_g(1) ylev = ylev - Insect%x_pivot_r_g(2) zlev = zlev - Insect%x_pivot_r_g(3) + elseif (color==Insect%color_l2) then + xlev = xlev - Insect%x_pivot_l2_g(1) + ylev = ylev - Insect%x_pivot_l2_g(2) + zlev = zlev - Insect%x_pivot_l2_g(3) + elseif (color==Insect%color_r2) then + xlev = xlev - Insect%x_pivot_r2_g(1) + ylev = ylev - Insect%x_pivot_r2_g(2) + zlev = zlev - Insect%x_pivot_r2_g(3) endif endif @@ -697,15 +723,23 @@ subroutine cal_unst_corrections ( time, dt, Insect ) ! for insects, moment of the body is computed with respect to (x0,y0,z0) ! but for the wings it is computed with respect tot the pivot points - if (iMask=="Insect") then - if (color_(i)==2) then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then + if (color_(i)==Insect%color_l) then xlev = xlev - Insect%x_pivot_l_g(1) ylev = ylev - Insect%x_pivot_l_g(2) zlev = zlev - Insect%x_pivot_l_g(3) - elseif (color_(i)==3) then + elseif (color_(i)==Insect%color_r) then xlev = xlev - Insect%x_pivot_r_g(1) ylev = ylev - Insect%x_pivot_r_g(2) zlev = zlev - Insect%x_pivot_r_g(3) + elseif (color_(i)==Insect%color_l2) then + xlev = xlev - Insect%x_pivot_l2_g(1) + ylev = ylev - Insect%x_pivot_l2_g(2) + zlev = zlev - Insect%x_pivot_l2_g(3) + elseif (color_(i)==Insect%color_r2) then + xlev = xlev - Insect%x_pivot_r2_g(1) + ylev = ylev - Insect%x_pivot_r2_g(2) + zlev = zlev - Insect%x_pivot_r2_g(3) endif endif @@ -763,9 +797,9 @@ subroutine cal_unst_corrections ( time, dt, Insect ) GlobalIntegrals%Torque_unst(2) = torque_newy0-torque_oldy0 GlobalIntegrals%Torque_unst(3) = torque_newz0-torque_oldz0 GlobalIntegrals%Torque_unst = GlobalIntegrals%Torque_unst / dt - if (iMask=="Insect") then + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then ! for the insects, we save separately the WINGs and the BODY - do color = Insect%color_body, Insect%color_r + do color = Insect%color_body, endcolor Insect%PartIntegrals(color)%Torque_unst(1) = torque_newx(color)-torque_oldx(color) Insect%PartIntegrals(color)%Torque_unst(2) = torque_newy(color)-torque_oldy(color) Insect%PartIntegrals(color)%Torque_unst(3) = torque_newz(color)-torque_oldz(color) @@ -776,8 +810,8 @@ subroutine cal_unst_corrections ( time, dt, Insect ) ! we cannot compute the time derivative, because we lack the old value of the ! integral. As a hack, return zero. GlobalIntegrals%Torque_unst = 0.d0 - if (iMask=="Insect") then - do color = Insect%color_body, Insect%color_r + if ((iMask=="Insect") .or. (iMask=="Insect_with_Flexible_wings")) then + do color = Insect%color_body, endcolor Insect%PartIntegrals(color)%Torque_unst = 0.d0 enddo endif diff --git a/src/dry_run.f90 b/src/dry_run.f90 index 2401f20..d77ac9b 100644 --- a/src/dry_run.f90 +++ b/src/dry_run.f90 @@ -28,16 +28,6 @@ subroutine dry_run() nd=3*nf ! The one field has three components. neq=nd ! number of equations, can be higher than 3 if using passive scalar - - ! initialize timing variables - time_fft=0.d0; time_ifft=0.d0; time_vis=0.d0; time_mask=0.d0; time_nlk2=0.d0 - time_vor=0.d0; time_curl=0.d0; time_p=0.d0; time_nlk=0.d0; time_fluid=0.d0 - time_bckp=0.d0; time_save=0.d0; time_total=MPI_wtime(); time_u=0.d0; time_sponge=0.d0 - time_scalar=0.d0 - time_solid=0.d0; time_drag=0.d0; time_surf=0.d0; time_LAPACK=0.d0 - time_hdf5=0.d0; time_integrals=0.d0; time_rhs=0.d0; time_nlk_scalar=0.d0 - tslices=0.d0 - if (root) then write(*,'(A)') '--------------------------------------' write(*,'(A)') ' FLUSI--dry run' @@ -81,6 +71,10 @@ subroutine dry_run() Insect%BodyMotion = "command-line" Insect%FlappingMotion_left = "command-line-left" Insect%FlappingMotion_right = "command-line-right" + if (Insect%second_wing_pair) then + Insect%FlappingMotion_left2 = "command-line-left" + Insect%FlappingMotion_right2 = "command-line-right" + endif ! since the kinematics do not change in time (we have a single snapshot), we ! save only one file tmax = 0.d0 @@ -129,7 +123,7 @@ subroutine dry_run() ! Load kinematics from file (Dmitry, 14 Nov 2013) if (iMask=="Insect") then - call insect_init( 0.d0, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx) + call insect_init( 0.d0, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) ! If required, initialize rigid solid dynamics solver. Note that if the --post flag ! is set, the insect state is read from file, so we skip the initialization . @@ -143,14 +137,31 @@ subroutine dry_run() if (root) then open (14,file=Insect%kinematics_file, status='replace') - write (14,'(26(A15,1x))') "% time","xc_body_g","yc_body","zc_body",& - "psi","beta","gamma","eta_stroke",& - "alpha_l","phi_l","theta_l",& - "alpha_r","phi_r","theta_r",& - "rot_l_x","rot_l_y","rot_l_z",& - "rot_r_x","rot_r_y","rot_r_z",& - "rot_dt_l_x","rot_dt_l_y","rot_dt_l_z",& - "rot_dt_r_x","rot_dt_r_y","rot_dt_r_z" + if (Insect%second_wing_pair) then + write (14,'(44(A15,1x))') "% time","xc_body_g","yc_body","zc_body",& + "psi","beta","gamma","eta_stroke",& + "alpha_l","phi_l","theta_l",& + "alpha_r","phi_r","theta_r",& + "rot_l_x","rot_l_y","rot_l_z",& + "rot_r_x","rot_r_y","rot_r_z",& + "rot_dt_l_x","rot_dt_l_y","rot_dt_l_z",& + "rot_dt_r_x","rot_dt_r_y","rot_dt_r_z",& + "alpha_l2","phi_l2","theta_l2",& + "alpha_r2","phi_r2","theta_r2",& + "rot_l2_x","rot_l2_y","rot_l2_z",& + "rot_r2_x","rot_r2_y","rot_r2_z",& + "rot_dt_l2_x","rot_dt_l2_y","rot_dt_l2_z",& + "rot_dt_r2_x","rot_dt_r2_y","rot_dt_r2_z" + else + write (14,'(26(A15,1x))') "% time","xc_body_g","yc_body","zc_body",& + "psi","beta","gamma","eta_stroke",& + "alpha_l","phi_l","theta_l",& + "alpha_r","phi_r","theta_r",& + "rot_l_x","rot_l_y","rot_l_z",& + "rot_r_x","rot_r_y","rot_r_z",& + "rot_dt_l_x","rot_dt_l_y","rot_dt_l_z",& + "rot_dt_r_x","rot_dt_r_y","rot_dt_r_z" + endif close (14) endif endif @@ -223,9 +234,6 @@ subroutine dry_run() time = tstart + dble(it)*tsave enddo - if(mpirank==0) then - write(*,'("time for mask creation ",es12.4)') time_mask - endif !----------------------------------------------------------------------------- ! Deallocate memory @@ -253,6 +261,7 @@ subroutine dry_run_flexible_wing() !use helpers !use module_ini_files_parser_mpi implicit none + real(kind=pr) :: t1,t2 real(kind=pr) :: time,memory,mem_field integer :: it, i, j character(len=strlen) :: infile, mode @@ -262,7 +271,7 @@ subroutine dry_run_flexible_wing() ! this is the solid model beams: type(solid), dimension(1:nBeams) :: beams ! this is the wings we're using (object oriented) - type(Wing),dimension(1:nWings) :: Wings + type(flexible_wing),dimension(1:nWings) :: Wings logical :: exists @@ -272,16 +281,6 @@ subroutine dry_run_flexible_wing() nd=3*nf ! The one field has three components. neq=nd ! number of equations, can be higher than 3 if using passive scalar - - ! initialize timing variables - time_fft=0.d0; time_ifft=0.d0; time_vis=0.d0; time_mask=0.d0; time_nlk2=0.d0 - time_vor=0.d0; time_curl=0.d0; time_p=0.d0; time_nlk=0.d0; time_fluid=0.d0 - time_bckp=0.d0; time_save=0.d0; time_total=MPI_wtime(); time_u=0.d0; time_sponge=0.d0 - time_scalar=0.d0 - time_solid=0.d0; time_drag=0.d0; time_surf=0.d0; time_LAPACK=0.d0 - time_hdf5=0.d0; time_integrals=0.d0; time_rhs=0.d0; time_nlk_scalar=0.d0 - tslices=0.d0 - if (root) then write(*,'(A)') '--------------------------------------' write(*,'(A)') ' FLUSI--dry run flexible wing' @@ -296,7 +295,6 @@ subroutine dry_run_flexible_wing() endif - !----------------------------------------------------------------------------- ! Read input parameters and mesh data !----------------------------------------------------------------------------- @@ -305,8 +303,6 @@ subroutine dry_run_flexible_wing() ! get filename of PARAMS file from command line call get_command_argument(2,infile) - write(*,*) infile - ! read all parameters from that file call get_params(infile,Insect,.true.) @@ -316,7 +312,7 @@ subroutine dry_run_flexible_wing() !----------------------------------------------------------------------------- ! Checking !----------------------------------------------------------------------------- - if (iMask/="Flexible_wing") then + if ((iMask/="Flexible_wing") .and. (iMask/="Insect_with_Flexible_wings")) then call abort(476659, "dry-run-flexible-wing is used only for flexible wing model, & change iMask into Flexible_wing to continue") endif @@ -367,7 +363,8 @@ subroutine dry_run_flexible_wing() !----------------------------------------------------------------------------- ! initalize wings !----------------------------------------------------------------------------- - call init_wings( infile, Wings) + call insect_init( 0.d0, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) + call init_wings( infile, Wings, Insect, dx) if (tsave == 0.d0) then if(mpirank==0) write(*,*) "Warning, tsave NOT set assuming 0.05d0!!!" @@ -383,71 +380,75 @@ subroutine dry_run_flexible_wing() it = 0 ! create the startup mask function + if (isaveMask == 1) then call create_mask(time,Insect,beams,wings) + endif ! Save data write(name,'(i6.6)') floor(time*1000.d0) + if (isaveMask == 1) then call save_field_hdf5(time,'mask_'//name,mask) + endif + !call save_field_hdf5(time,'unsigned_distance_'//name,unsigned_distance) if (isaveSolidVelocity == 1) then - call save_field_hdf5(time,'usx_'//name,us(:,:,:,1)) - call save_field_hdf5(time,'usy_'//name,us(:,:,:,2)) - call save_field_hdf5(time,'usz_'//name,us(:,:,:,3)) + call save_field_hdf5(time,'usx_'//name,us(:,:,:,1)) + call save_field_hdf5(time,'usy_'//name,us(:,:,:,2)) + call save_field_hdf5(time,'usz_'//name,us(:,:,:,3)) endif do while (time (A + 1.0d-15)) then + ! write(*,*) "WARNING: The projection of the centroid may be outside of the triangle!" + ! write(*,*) A1, A2, A3 + ! write(*,*) A + ! write(*,*) tri1, tri2, tri3 + ! write(*,*) concentrated_force_position + ! endif + !endif + distributed_force(1,1:3) = - A1/A*normal(1:3)*concentrated_force*direction + distributed_force(2,1:3) = - A2/A*normal(1:3)*concentrated_force*direction + distributed_force(3,1:3) = - A3/A*normal(1:3)*concentrated_force*direction end subroutine diff --git a/src/flexible_solver/external_force_derivative.f90 b/src/flexible_solver/external_force_derivative.f90 new file mode 100644 index 0000000..78c6c20 --- /dev/null +++ b/src/flexible_solver/external_force_derivative.f90 @@ -0,0 +1,46 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Construct Jacobian matrix of internal force vector for Newton-Raphson method +! since we use implicit scheme for time stepping +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +subroutine external_forces_derivatives_construction(FJ,Wing,dt1) + +type(flexible_wing), intent(in) :: Wing +real(kind=pr), intent(inout) :: FJ(1:,1:) +real(kind=pr), intent(in) :: dt1 +real(kind=pr) :: t0 +integer :: np,j + +! Get the number of mass points for the sake of simplicity in coding +np = wing%np + +! Initialize +!t0 = MPI_wtime() +!wing%FJ = 0.d0 +!call toc("Flexible wing (FJ_initialize)", MPI_wtime() - t0) + + !Construct external force derivative matrix aka Jacobian matrix + do j=1,np + FJ(j,j) = FJ(j,j) - & + wing%coef*dt1*wing%m(j)*(wing%vr0(2)**2 + wing%vr0(3)**2) + FJ(j,j+np) = FJ(j,j+np) - & + wing%coef*dt1*wing%m(j)*( - wing%vr0(1)*wing%vr0(2) + wing%ar0(3)) + FJ(j,j+2*np) = FJ(j,j+2*np) + & + wing%coef*dt1*wing%m(j)*(wing%vr0(1)*wing%vr0(3) + wing%ar0(2)) + + FJ(j+np,j) = FJ(j+np,j) + & + wing%coef*dt1*wing%m(j)*(wing%vr0(1)*wing%vr0(2) + wing%ar0(3)) + FJ(j+np,j+np) = FJ(j+np,j+np) - & + wing%coef*dt1*wing%m(j)*(wing%vr0(1)**2 + wing%vr0(3)**2) + FJ(j+np,j+2*np) = FJ(j+np,j+2*np) - & + wing%coef*dt1*wing%m(j)*( - wing%vr0(2)*wing%vr0(3) + wing%ar0(1)) + + FJ(j+2*np,j) = FJ(j+2*np,j) - & + wing%coef*dt1*wing%m(j)*( - wing%vr0(1)*wing%vr0(3) + wing%ar0(2)) + FJ(j+2*np,j+np) = FJ(j+2*np,j+np) + & + wing%coef*dt1*wing%m(j)*(wing%vr0(2)*wing%vr0(3) + wing%ar0(1)) + FJ(j+2*np,j+2*np) = FJ(j+2*np,j+2*np) - & + wing%coef*dt1*wing%m(j)*(wing%vr0(1)**2 + wing%vr0(2)**2) + enddo + +end subroutine diff --git a/src/flexible_solver/flexible_solid_time_stepper.f90 b/src/flexible_solver/flexible_solid_time_stepper.f90 index 20d854a..d8c4f69 100644 --- a/src/flexible_solver/flexible_solid_time_stepper.f90 +++ b/src/flexible_solver/flexible_solid_time_stepper.f90 @@ -3,234 +3,422 @@ ! BDF2 method with Euler startup !------------------------------------------------------------------------------- -subroutine flexible_solid_time_step(time, dt0, dt1, it, wings) +subroutine flexible_solid_time_step(time, dt0, dt1, it, wing, Insect) + use vars + use mpi + use module_insects implicit none real(kind=pr),intent(in) :: time, dt1, dt0 integer,intent (in) :: it - type(wing), dimension(1:nWings), intent (inout) :: wings + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing real(kind=pr) :: c1, c2, c3 - integer :: i + real(kind=pr) :: t0 + integer :: i,itri,j,np + + !----------------------------------------------------------------------------- + ! Startup time step: use EE1 as first step of BDF2 + !----------------------------------------------------------------------------- + if (wing%StartupStep) then ! this is the first time step + wing%StartupStep = .false. ! we're about to do the first step + if (TimeMethodFlexibleSolid=="BDF2") then ! if we deal with BDF2 + ActuallyBDF2 = .true. ! Remember to switch back to BDF2 (at the end of the step) + endif + endif - ! select scheme - if (it == 0) then + !----------------------------------------------------------------------------- + ! fetch current motion state + !----------------------------------------------------------------------------- + call BodyMotion (time, Insect) + call StrokePlane (time, Insect) + if (wing%ID == "left") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_l ) + elseif (wing%ID == "right") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_r ) + endif - call translation_acceleration_of_wing_plane (time,dt0,dt1,it,wings) + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + call body_rotation_matrix( Insect, Insect%M_body ) + Insect%M_body_inv = transpose(Insect%M_body) + call MSM_solver_rotation_matrix( Wing, wing%M_solver ) + Wing%M_solver_inv = transpose(Wing%M_solver) + call flexible_wing_rotation_matrix( Wing, Insect, Wing%M_wing ) + Wing%M_wing_inv = transpose(Wing%M_wing) + + ! rel+abs wing angular velocities in the w/b/g coordinate system + call flexible_wing_angular_velocities (time, Wing, Insect, Insect%M_body ) + call flexible_wing_angular_accel( time, wing, Insect ) + + ! select scheme + if (TimeMethodFlexibleSolid=='EI1' .or. ((ActuallyBDF2) .and. (TimeMethodFlexibleSolid=="BDF2"))) then - ! Construct the external force vector - write(*,*) wings(1)%at_inertia - call external_forces_construction(time,dt0,dt1, it,wings) ! EULER startup scheme - ! compute position and velocity at new time step - ! (updates wings%u_new using wings%u_old) - call flexible_solid_solver_euler(time, dt1, it, wings) - !call moving_noninertial_frame_in_reference_frame(time,dt0,dt1, it,Wings) - else + ! compute position and velocity at the first time step + call flexible_solid_solver_euler(time, dt1, it, wing, Insect) + + !----------------------------------------------------------------------------- + ! Change marching scheme, if necessary + !----------------------------------------------------------------------------- + if (TimeMethodFlexibleSolid=="BDF2") then ! Remember to switch back to BDF2 + ActuallyBDF2 = .false. + endif - call translation_acceleration_of_wing_plane (time,dt0,dt1,it,wings) + elseif (TimeMethodFlexibleSolid=='BDF2') then - write(*,*) wings(1)%at_inertia - ! Construct the external force vector - call external_forces_construction(time,dt0,dt1, it,wings) ! BDF2 scheme - ! compute position and velocity at new time step - ! (updates wings%u_new using wings%u_old and wings%u_old) - call flexible_solid_solver_BDF2(time, dt0, dt1, it, wings) - !call moving_noninertial_frame_in_reference_frame(time,dt0,dt1, it,Wings) + ! compute position and velocity at new time step using BDF2 scheme + call flexible_solid_solver_BDF2(time, dt0, dt1, it, wing, Insect) + elseif (TimeMethodFlexibleSolid=='Verlet') then + + + ! Verlet explicit scheme + ! compute position and velocity at new time step using Verlet scheme + call flexible_solid_solver_Verlet(time, dt1, it, wing, Insect) endif - do i=1,nWings !----------------------------------------------------------------------------- ! emergency brake !----------------------------------------------------------------------------- - if ((maxval(abs(wings(i)%u_new(1:6*wings(i)%np) - & - wings(i)%u_old(1:6*wings(i)%np)))>100.d0 ).and.(root)) then + if ((maxval(abs(wing%u_new(1:6*wing%np) - & + wing%u_old(1:6*wing%np)))>100.d0 ).and.(root)) then write (*,'(A)') "!!! Flexible-Solid-Solver: " write(*,'("Running on ",i5," CPUs")') mpisize write(*,'("I found maxval(abs(wings(",i5,")%u_new - wings(",i5,")%u_old))>100.d0")') i, i write (*,'(A)') " That indicates a possible instability." write (*,'("time=",es11.4)') time endif - enddo ! TODO Adding periodization: if the insect moves out of the box for free flight end subroutine -subroutine flexible_solid_solver_euler(time, dt1, it, wings) +subroutine flexible_solid_solver_euler(time, dt1, it, wing, Insect) + + use vars implicit none real(kind=pr),intent(in) :: time, dt1 integer,intent (in) :: it - type(wing), dimension(1:nWings), intent (inout) :: wings - real(kind=pr) :: du, err, err_rel, coef=1.0 - integer :: i, iter, i_NAN, j_NAN, iJ,jJ,np + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr), allocatable :: FJ(:,:) + real(kind=pr) :: du, coef=1.0 + integer :: i, i_NAN, j_NAN, iJ, jJ, np logical :: iterate + real(kind=pr) :: t0 - do i=1,nWings + iterate = .true. + wing%err_abs = 1.0d0 + wing%err_rel = 1.0d0 + wing%iter = 0 + wing%coef = 1.0 - iterate = .true. - err = 1.0d0 - err_rel = 1.0d0 - iter = 0 + ! Get total number of mass points + np = wing%np ! Assign the initial guess value for the Newton-Raphson method equal to the ! value of the state vector of the previous time step - wings(i)%u_new = wings(i)%u_old + wing%u_new = wing%u_old + + if (.not.allocated(FJ)) allocate(FJ(1:3*np,1:3*np)) ! Begin the Newton-Raphson iterations do while (iterate) - iter = iter + 1 + wing%iter = wing%iter + 1 - ! Get total number of mass points - np = wings(i)%np + t0 = MPI_wtime() + + ! Construct the external force vector + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + t0 = MPI_wtime() ! Calculate internal force vector from the new state vector u_new - call internal_forces_construction(wings(i)) + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) - if (Vector_isNAN(wings(i)%Fint(1:3*wings(i)%np))) then + if (Vector_isNAN(wing%Fint(1:3*wing%np))) then if (root) write(*,*) "FlexibleSolidSolver: Internal force vector contains NaNs" call abort(9836,"The internal force vector for the solid solver contains NaN..abort") endif ! Calculate RHS vector - call RHS_for_NR_method(dt1, dt1, it, wings(i)) + call RHS_for_NR_method(dt1, dt1, it, wing) + t0 = MPI_wtime() + FJ = 0.0 + call toc("Flexible wing (FJ_initialize)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the external force vector + call external_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (external_forces_derivatives_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() ! Calculate the Jacobian matrix of the internal force vector - call internal_forces_derivatives_construction(wings(i)) + call internal_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (internal_forces_derivatives_construction)", MPI_wtime() - t0) - if (Matrix_isNAN(wings(i)%FJ(1:3*wings(i)%np,1:3*wings(i)%np),i_NAN, j_NAN)) then + if (Matrix_isNAN(FJ(1:3*np,1:3*np),i_NAN, j_NAN)) then if (root) write(*,*) "FlexibleSolidSolver: Jacobian matrix contains NaNs" call abort(9835,"The Jacobian matrix for the solid solver contains NaN..abort") endif + t0 = MPI_wtime() ! Solve for the step of NR method - call solve_linear_system_using_schur_complement(wings(i)%du(1:6*np), np, & - wings(i)%FJ(1:3*np,1:3*np), & - wings(i)%m(1:np), wings(i)%c(1:np), & - dt1, wings(i)%RHS_a(1:3*np), wings(i)%RHS_b(1:3*np), coef) - + if (wing%HB_matrix_given) then + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID, & + wing%colptr,wing%rowind) + else + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID) + endif + call toc("Flexible wing (solve_linear_system_using_schur_complement)", MPI_wtime() - t0) - wings(i)%u_new(1:6*wings(i)%np) = wings(i)%u_new(1:6*wings(i)%np) - wings(i)%du(1:6*wings(i)%np) - err = dsqrt(sum(wings(i)%du**2)) - err_rel = abs(dsqrt(sum(wings(i)%du**2)) / dsqrt(sum(wings(i)%u_new**2))) + wing%u_new(1:6*wing%np) = wing%u_new(1:6*wing%np) - wing%du(1:6*wing%np) + wing%err_abs = dsqrt(sum(wing%du**2)) + wing%err_rel = abs(dsqrt(sum(wing%du**2)) / dsqrt(sum(wing%u_new**2))) ! convergence test - if ( (((err2))) then + if ( (((wing%err_abs2))) then iterate = .false. + endif ! emergency brake - if (iter>20) then - call abort(309214,"!!! ERROR: The flexible solid solver performed like 50 iterations. This is not normal!") + if (wing%iter>100) then + call abort(309214,"!!! ERROR: The flexible solid solver performed like 200 iterations. This is not normal!") endif enddo ! Update results - wings(i)%u_oldold = wings(i)%u_old - wings(i)%u_old = wings(i)%u_new - wings(i)%x(1:wings(i)%np) = wings(i)%u_old(1:wings(i)%np) - wings(i)%y(1:wings(i)%np) = wings(i)%u_old(wings(i)%np+1:2*wings(i)%np) - wings(i)%z(1:wings(i)%np) = wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np) - wings(i)%vx(1:wings(i)%np) = wings(i)%u_old(3*wings(i)%np+1:4*wings(i)%np) - wings(i)%vy(1:wings(i)%np) = wings(i)%u_old(4*wings(i)%np+1:5*wings(i)%np) - wings(i)%vz(1:wings(i)%np) = wings(i)%u_old(5*wings(i)%np+1:6*wings(i)%np) - enddo + wing%u_oldold = wing%u_old + wing%u_old = wing%u_new + + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + + if (allocated(FJ)) deallocate(FJ) end subroutine -subroutine flexible_solid_solver_BDF2(time, dt1, dt0, it, wings) +subroutine flexible_solid_solver_BDF2(time, dt1, dt0, it, wing, Insect) + + use vars implicit none real(kind=pr),intent(in) :: time, dt1, dt0 integer,intent (in) :: it - type(Wing), dimension(1:nWings), intent (inout) :: wings - real(kind=pr) :: r, coef - real(kind=pr) :: du, err, err_rel - integer :: i, iter, np + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr), allocatable :: FJ(:,:) + real(kind=pr) :: r + real(kind=pr) :: du + integer :: i, np, nnz_BDF2 logical :: iterate + real(kind=pr) :: t0 ! Calculate the coefficient for time stepping scheme r = dt1/dt0 - coef = (1+r)/(1+2*r) - - do i=1,nWings + wing%coef = (1+r)/(1+2*r) ! Get total number of mass points - np = wings(i)%np + np = wing%np iterate = .true. - err = 1.0d0 - err_rel = 1.0d0 - iter = 0 + wing%err_abs = 1.0d0 + wing%err_rel = 1.0d0 + wing%iter = 0 ! Assign the initial guess value for the Newton-Raphson method equal to the ! value of the state vector of the previous time step - wings(i)%u_new = wings(i)%u_old + wing%u_new = wing%u_old + + if (.not.allocated(FJ)) allocate(FJ(1:3*np,1:3*np)) do while (iterate) - iter = iter + 1 + wing%iter = wing%iter + 1 + + t0 = MPI_wtime() + ! Construct the external force vector + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + t0 = MPI_wtime() ! Calculate internal force vector from the new state vector u_new - call internal_forces_construction(wings(i)) + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) ! Calculate RHS vector - call RHS_for_NR_method(dt1, dt0, it, wings(i)) + call RHS_for_NR_method(dt1, dt0, it, wing) + t0 = MPI_wtime() + FJ = 0.0 + call toc("Flexible wing (FJ_initialize)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the external force vector + call external_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (external_forces_derivatives_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() ! Calculate the Jacobian matrix of the internal force vector - call internal_forces_derivatives_construction(wings(i)) + call internal_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (internal_forces_derivatives_construction)", MPI_wtime() - t0) + t0 = MPI_wtime() ! Solve for the step of NR method - call solve_linear_system_using_schur_complement(wings(i)%du(1:6*np), np, & - wings(i)%FJ(1:3*np,1:3*np), & - wings(i)%m(1:np), wings(i)%c(1:np), & - dt1, wings(i)%RHS_a(1:3*np), wings(i)%RHS_b(1:3*np), coef) + if (wing%HB_matrix_given) then + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID, & + wing%colptr, wing%rowind) + else + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID) + endif + call toc("Flexible wing (solve_linear_system_using_schur_complement)", MPI_wtime() - t0) - wings(i)%u_new = wings(i)%u_new - wings(i)%du - err = dsqrt(sum(wings(i)%du**2)) - err_rel = abs(dsqrt(sum(wings(i)%du**2)) / dsqrt(sum(wings(i)%u_new**2))) + wing%u_new = wing%u_new - wing%du + wing%err_abs = dsqrt(sum(wing%du**2)) + wing%err_rel = abs(dsqrt(sum(wing%du**2)) / dsqrt(sum(wing%u_new**2))) ! convergence test - if ( (((err2))) then + if ( (((wing%err_abs2))) then iterate = .false. - if (root) then - write(*,*) minval((/err, err_rel/)) - write(*,*) iter - endif - endif + endif ! emergency brake - if (iter>100) then - call abort(337214,"!!! ERROR: The flexible solid solver performed like 50 iterations. This is not normal!") + if (wing%iter>200) then + call abort(337214,"!!! ERROR: The flexible solid solver performed like 200 iterations. This is not normal!") endif enddo ! Update results - wings(i)%u_oldold = wings(i)%u_old - wings(i)%u_old = wings(i)%u_new - wings(i)%x(1:wings(i)%np) = wings(i)%u_old(1:wings(i)%np) - wings(i)%y(1:wings(i)%np) = wings(i)%u_old(wings(i)%np+1:2*wings(i)%np) - wings(i)%z(1:wings(i)%np) = wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np) - wings(i)%vx(1:wings(i)%np) = wings(i)%u_old(3*wings(i)%np+1:4*wings(i)%np) - wings(i)%vy(1:wings(i)%np) = wings(i)%u_old(4*wings(i)%np+1:5*wings(i)%np) - wings(i)%vz(1:wings(i)%np) = wings(i)%u_old(5*wings(i)%np+1:6*wings(i)%np) + wing%u_oldold = wing%u_old + wing%u_old = wing%u_new - enddo + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + + if (allocated(FJ)) deallocate(FJ) end subroutine -subroutine RHS_for_NR_method(dt1, dt0, it, wings) +subroutine flexible_solid_solver_verlet(time, dt1, it, wing, Insect) + + use vars + + implicit none + + real(kind=pr),intent(in) :: time, dt1 + integer,intent (in) :: it + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr) :: du, coef=1.0 + real(kind=pr), allocatable :: point_forces(:) + integer :: i, i_NAN, j_NAN, iJ, jJ, nop + logical :: iterate + real(kind=pr) :: t0 + + + ! Assign the initial guess value for the Newton-Raphson method equal to the + ! value of the state vector of the previous time step + wing%u_new = wing%u_old + + ! Get total number of mass points + nop = wing%np + + allocate(point_forces(1:3*nop)) + + ! Update position from previous velovity and acceleration + do i=1,nop + + wing%u_new(i) = wing%u_old(i) + wing%u_old(i+3*nop)*dt1 + wing%ax_old(i)*0.5*dt1**2 + wing%u_new(i+nop) = wing%u_old(i+nop) + wing%u_old(i+4*nop)*dt1 + wing%ay_old(i)*0.5*dt1**2 + wing%u_new(i+2*nop) = wing%u_old(i+2*nop) + wing%u_old(i+5*nop)*dt1 + wing%az_old(i)*0.5*dt1**2 + + enddo + + ! Update forces from the new position and velocity + + ! Construct the external force vector + t0 = MPI_wtime() + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate internal force vector from the new state vector u_new + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) + + if (Vector_isNAN(wing%Fint(1:3*wing%np))) then + if (root) write(*,*) "FlexibleSolidSolver: Internal force vector contains NaNs" + call abort(9836,"The internal force vector for the solid solver contains NaN..abort") + endif + + !Update acceleration from the new forces + point_forces(1:3*nop) = (wing%Fext(1:3*nop) + wing%Fint(1:3*nop) - & + (/wing%c(1:nop), wing%c(1:nop), wing%c(1:nop)/)*wing%u_new(3*nop+1:6*nop)) + + do i=1,nop + + wing%ax_new(i) = point_forces(i)/wing%m(i) + wing%ay_new(i) = point_forces(i+nop)/wing%m(i) + wing%az_new(i) = point_forces(i+2*nop)/wing%m(i) + + enddo + + !Update the velocity from the new acceleration + + do i=1,nop + + wing%u_new(i+3*nop) = wing%u_old(i+3*nop) + 0.5*dt1*(wing%ax_old(i) + wing%ax_new(i)) + wing%u_new(i+4*nop) = wing%u_old(i+4*nop) + 0.5*dt1*(wing%ay_old(i) + wing%ay_new(i)) + wing%u_new(i+5*nop) = wing%u_old(i+5*nop) + 0.5*dt1*(wing%az_old(i) + wing%az_new(i)) + + enddo + + ! emergency brake + if (maxval(wing%u_new)>1e6) then + call abort(309214,"!!! ERROR: The flexible solid solver returns large value. This is not normal!") + endif + + ! Update results + wing%ax_old = wing%ax_new + wing%ay_old = wing%ay_new + wing%az_old = wing%az_new + wing%u_old = wing%u_new + + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + +end subroutine + +subroutine RHS_for_NR_method(dt1, dt0, it, wing) ! Calculate the right hand side (RHS) F for the Newton Raphson method which is ! J*dx = F @@ -240,24 +428,24 @@ subroutine RHS_for_NR_method(dt1, dt0, it, wings) implicit none integer, intent(in) :: it real(kind=pr),intent(in) :: dt1, dt0 - type(wing), intent (inout) :: wings + type(flexible_wing), intent (inout) :: wing real(kind=pr) :: c1, c2, c3, r integer :: np !Get total number of points for the simplification of writing array bounds - np = wings%np + np = wing%np if (it==0) then ! this is the first time step - wings%RHS_a(1:3*np) = (/wings%m(1:np), wings%m(1:np), & - wings%m(1:np)/)*(wings%u_new(3*np+1:6*np) - wings%u_old(3*np+1:6*np)) - & - dt1*(wings%Fext(1:3*np) + wings%Fint(1:3*np) - & - (/wings%c(1:np), wings%c(1:np), wings%c(1:np)/)*(wings%u_new(3*np+1:6*np) + & - wings%u_old(3*np+1:6*np))) + wing%RHS_a(1:3*np) = (/wing%m(1:np), wing%m(1:np), & + wing%m(1:np)/)*(wing%u_new(3*np+1:6*np) - wing%u_old(3*np+1:6*np)) - & + dt1*(wing%Fext(1:3*np) + wing%Fint(1:3*np) - & + (/wing%c(1:np), wing%c(1:np), wing%c(1:np)/)*(wing%u_new(3*np+1:6*np) + & + wing%u_old(3*np+1:6*np))) - wings%RHS_b(1:3*np) = wings%u_new(1:3*np) - wings%u_old(1:3*np) - & - (wings%u_new(3*np+1:6*np))*dt1 + wing%RHS_b(1:3*np) = wing%u_new(1:3*np) - wing%u_old(1:3*np) - & + (wing%u_new(3*np+1:6*np))*dt1 else @@ -267,22 +455,25 @@ subroutine RHS_for_NR_method(dt1, dt0, it, wings) c2=r**2/(1+2*r) c3=(1+r)/(1+2*r) - wings%RHS_a(1:3*np) = (/wings%m(1:np), wings%m(1:np), & - wings%m(1:np)/)*(wings%u_new(3*np+1:6*np) - c1*wings%u_old(3*np+1:6*np) + & - c2*wings%u_oldold(3*np+1:6*np)) - & - c3*dt1*(wings%Fext(1:3*np) + wings%Fint(1:3*np) - & - (/wings%c(1:np), wings%c(1:np), & - wings%c(1:np)/)*wings%u_new(3*np+1:6*np)) + wing%RHS_a(1:3*np) = (/wing%m(1:np), wing%m(1:np), & + wing%m(1:np)/)*(wing%u_new(3*np+1:6*np) - c1*wing%u_old(3*np+1:6*np) + & + c2*wing%u_oldold(3*np+1:6*np)) - & + c3*dt1*(wing%Fext(1:3*np) + wing%Fint(1:3*np) - & + (/wing%c(1:np), wing%c(1:np), & + wing%c(1:np)/)*wing%u_new(3*np+1:6*np)) - wings%RHS_b(1:3*np) = wings%u_new(1:3*np) - c1*wings%u_old(1:3*np) + & - c2*wings%u_oldold(1:3*np) - c3*(wings%u_new(3*np+1:6*np))*dt1 + wing%RHS_b(1:3*np) = wing%u_new(1:3*np) - c1*wing%u_old(1:3*np) + & + c2*wing%u_oldold(1:3*np) - c3*(wing%u_new(3*np+1:6*np))*dt1 endif end subroutine -subroutine solve_linear_system_using_schur_complement(du,np,FJ,m,c,dt,a,b,coef) +subroutine solve_linear_system_using_schur_complement(du,np,FJ,m,c,dt,a,b,& + coef,SparseSolver,it,wing_ID,colptr_in,rowind_in) + +use vars ! This subroutine solves a linear system under the form ! [ | ] [ ] [ ] @@ -308,46 +499,98 @@ subroutine solve_linear_system_using_schur_complement(du,np,FJ,m,c,dt,a,b,coef) real(kind=pr), intent(in) :: dt, coef real(kind=pr), intent(in) :: m(1:), c(1:), a(1:), b(1:) -real(kind=pr), intent(in) :: FJ(1:,1:) -integer, intent(in) :: np +real(kind=pr), intent(inout) :: FJ(1:,1:) +character, intent(in) :: SparseSolver +integer, intent(in) :: np, it +character(len=strlen), intent(in) :: wing_ID real(kind=pr), intent(inout) :: du(1:) -real(kind=pr), allocatable :: y(:), m_array3D(:), c_array3D(:) -real(kind=pr), allocatable :: F(:,:) -integer :: i, j +integer, intent(in),optional :: rowind_in(1:,1:), colptr_in(1:) +real(kind=pr), allocatable :: y(:) +real(kind=pr) :: t0 +integer :: i, j, iopt, nnz, info, nrhs_lu, nnz_FJ, nnz_FJext, nnz_pre +integer :: p, col +integer :: factors(8) +integer, allocatable :: rowind(:), colptr(:) +real(kind=pr), allocatable :: values(:) +character(len=3) :: wingstr + + +allocate(y(1:3*np)) -allocate(y(1:3*np),m_array3D(1:3*np),c_array3D(1:3*np)) -allocate(F(1:3*np,1:3*np)) +!Initialize F +y = 0.0d0 ! Transform the mass array m() into an array (/m,m,m/) corresponding to three dimensions ! x,y and z -m_array3D = (/m,m,m/) -c_array3D = (/c,c,c/) - -do i=1,3*np - do j=1,3*np - if (i .eq. j) then - F(i,i) = coef*dt*FJ(i,i) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) - y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) - else - F(i,j) = coef*dt*FJ(i,j) - endif - enddo +!m_array3D = (/m,m,m/) +!c_array3D = (/c,c,c/) + +!do i=1,3*np +! do j=1,3*np +! if (i .eq. j) then +! F(i,i) = coef*dt*(FJ(i,i)+FJ_ext(i,i)) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) +! y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +! else +! F(i,j) = coef*dt*(FJ(i,j)+FJ_ext(i,j)) +! endif +! enddo +!enddo + +write (wingstr,'(i3)') it + + +t0 = MPI_wtime() +do i=1,np + do j=0,2 + FJ(i+j*np,i+j*np) = FJ(i+j*np,i+j*np) + (1/(coef*dt))*m(i) + c(i) + y(i+j*np) = a(i+j*np) + ((1/(coef*dt))*m(i) + c(i))*b(i+j*np) + enddo enddo +call toc("Flexible wing (Construct global jacobian:diagonal)", MPI_wtime() - t0) -call solve_linear_system_wing ( F, y, du(1:3*np) ) +t0 = MPI_wtime() +call solve_linear_system_wing ( FJ(1:3*np,1:3*np), y(1:3*np), du(1:3*np) ) +call toc("Flexible wing (solve linear system using lu factorization)", MPI_wtime() - t0) do i=1,3*np - du(i + 3*np) = (1/(coef*dt))*(du(i) - b(i)) - enddo deallocate(y) -deallocate(F) + end subroutine -! y_(n+1) - C1*y_(n) + C2*y_(n-1) - C3*dt*f(t_n+1,y_n+1) = 0 -! -! e = dt1/dt0 -! c1=(1+e)**2/(1+2*e); c2=e**2/(1+2*e); c3=(1+e)/(1+2*e); +subroutine update_solver_solutions_to_create_wing_mask(time, wing, Insect) + +implicit none + +real(kind=pr), intent(in) :: time +type(diptera), intent(inout) :: Insect +type(flexible_wing), intent (inout) :: wing +real(kind=pr), dimension(1:3) :: u, v, w +integer :: j +real(kind=pr) :: tau, vr + +if ((wing%Motion .eq. "stationary") .or. (wing%Motion .eq. "simple_harmonic") & + .or. (wing%Motion .eq. "harmonic_ocsillation")) then + wing%x(1:wing%np) = wing%u_old(1:wing%np) + wing%y(1:wing%np) = wing%u_old(wing%np+1:2*wing%np) + wing%z(1:wing%np) = wing%u_old(2*wing%np+1:3*wing%np) + wing%vx(1:wing%np) = wing%u_old(3*wing%np+1:4*wing%np) + wing%vy(1:wing%np) = wing%u_old(4*wing%np+1:5*wing%np) + wing%vz(1:wing%np) = wing%u_old(5*wing%np+1:6*wing%np) +elseif ((wing%Motion .eq. "from_file") .or. (wing%Motion .eq. "revolving_wing")) then + + !call rotate_wing(wing) + + !call translate_wing(wing) + + call rotate_and_translate_wing_into_global_system(wing, Insect) + + call construct_total_velocity(wing,Insect%M_body,Insect%M_body_inv) + +endif + + +end subroutine diff --git a/src/flexible_solver/flexible_solid_time_stepper_superlu.f90 b/src/flexible_solver/flexible_solid_time_stepper_superlu.f90 new file mode 100644 index 0000000..0997c1c --- /dev/null +++ b/src/flexible_solver/flexible_solid_time_stepper_superlu.f90 @@ -0,0 +1,721 @@ +!------------------------------------------------------------------------------- +! Flexible solid time stepping routines +! BDF2 method with Euler startup +!------------------------------------------------------------------------------- + +subroutine flexible_solid_time_step(time, dt0, dt1, it, wing, Insect) + use vars + use mpi + use module_insects + implicit none + + real(kind=pr),intent(in) :: time, dt1, dt0 + integer,intent (in) :: it + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr) :: c1, c2, c3 + real(kind=pr) :: t0 + integer :: i,itri,j,np + + !----------------------------------------------------------------------------- + ! Startup time step: use EE1 as first step of BDF2 + !----------------------------------------------------------------------------- + if (wing%StartupStep) then ! this is the first time step + wing%StartupStep = .false. ! we're about to do the first step + if (TimeMethodFlexibleSolid=="BDF2") then ! if we deal with BDF2 + ActuallyBDF2 = .true. ! Remember to switch back to BDF2 (at the end of the step) + endif + endif + + !----------------------------------------------------------------------------- + ! fetch current motion state + !----------------------------------------------------------------------------- + call BodyMotion (time, Insect) + call StrokePlane (time, Insect) + if (wing%ID == "left") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_l ) + elseif (wing%ID == "right") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_r ) + endif + + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + call body_rotation_matrix( Insect, Insect%M_body ) + Insect%M_body_inv = transpose(Insect%M_body) + call MSM_solver_rotation_matrix( Wing, wing%M_solver ) + Wing%M_solver_inv = transpose(Wing%M_solver) + call flexible_wing_rotation_matrix( Wing, Insect, Wing%M_wing ) + Wing%M_wing_inv = transpose(Wing%M_wing) + + ! rel+abs wing angular velocities in the w/b/g coordinate system + call flexible_wing_angular_velocities (time, Wing, Insect, Insect%M_body ) + call flexible_wing_angular_accel( time, wing, Insect ) + + ! select scheme + if (TimeMethodFlexibleSolid=='EI1' .or. ((ActuallyBDF2) .and. (TimeMethodFlexibleSolid=="BDF2"))) then + + ! EULER startup scheme + ! compute position and velocity at the first time step + call flexible_solid_solver_euler(time, dt1, it, wing, Insect) + + !----------------------------------------------------------------------------- + ! Change marching scheme, if necessary + !----------------------------------------------------------------------------- + if (TimeMethodFlexibleSolid=="BDF2") then ! Remember to switch back to BDF2 + ActuallyBDF2 = .false. + endif + + elseif (TimeMethodFlexibleSolid=='BDF2') then + + + ! BDF2 scheme + ! compute position and velocity at new time step using BDF2 scheme + call flexible_solid_solver_BDF2(time, dt0, dt1, it, wing, Insect) + elseif (TimeMethodFlexibleSolid=='Verlet') then + + + ! Verlet explicit scheme + ! compute position and velocity at new time step using Verlet scheme + call flexible_solid_solver_Verlet(time, dt1, it, wing, Insect) + + endif + + !----------------------------------------------------------------------------- + ! emergency brake + !----------------------------------------------------------------------------- + if ((maxval(abs(wing%u_new(1:6*wing%np) - & + wing%u_old(1:6*wing%np)))>100.d0 ).and.(root)) then + write (*,'(A)') "!!! Flexible-Solid-Solver: " + write(*,'("Running on ",i5," CPUs")') mpisize + write(*,'("I found maxval(abs(wings(",i5,")%u_new - wings(",i5,")%u_old))>100.d0")') i, i + write (*,'(A)') " That indicates a possible instability." + write (*,'("time=",es11.4)') time + endif + + ! TODO Adding periodization: if the insect moves out of the box for free flight + +end subroutine + +subroutine flexible_solid_solver_euler(time, dt1, it, wing, Insect) + + use vars + + implicit none + + real(kind=pr),intent(in) :: time, dt1 + integer,intent (in) :: it + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr), allocatable :: FJ(:,:) + real(kind=pr) :: du, coef=1.0 + integer :: i, i_NAN, j_NAN, iJ, jJ, np + logical :: iterate + real(kind=pr) :: t0 + + iterate = .true. + wing%err_abs = 1.0d0 + wing%err_rel = 1.0d0 + wing%iter = 0 + wing%coef = 1.0 + + ! Get total number of mass points + np = wing%np + + ! Assign the initial guess value for the Newton-Raphson method equal to the + ! value of the state vector of the previous time step + wing%u_new = wing%u_old + + if (.not.allocated(FJ)) allocate(FJ(1:3*np,1:3*np)) + + ! Begin the Newton-Raphson iterations + do while (iterate) + + wing%iter = wing%iter + 1 + + t0 = MPI_wtime() + + ! Construct the external force vector + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate internal force vector from the new state vector u_new + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) + + if (Vector_isNAN(wing%Fint(1:3*wing%np))) then + if (root) write(*,*) "FlexibleSolidSolver: Internal force vector contains NaNs" + call abort(9836,"The internal force vector for the solid solver contains NaN..abort") + endif + + ! Calculate RHS vector + call RHS_for_NR_method(dt1, dt1, it, wing) + + t0 = MPI_wtime() + FJ = 0.0 + call toc("Flexible wing (FJ_initialize)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the external force vector + call external_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (external_forces_derivatives_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the internal force vector + call internal_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (internal_forces_derivatives_construction)", MPI_wtime() - t0) + + if (Matrix_isNAN(FJ(1:3*np,1:3*np),i_NAN, j_NAN)) then + if (root) write(*,*) "FlexibleSolidSolver: Jacobian matrix contains NaNs" + call abort(9835,"The Jacobian matrix for the solid solver contains NaN..abort") + endif + + t0 = MPI_wtime() + ! Solve for the step of NR method + if (wing%HB_matrix_given) then + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID, & + wing%colptr,wing%rowind) + else + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID) + endif + call toc("Flexible wing (solve_linear_system_using_schur_complement)", MPI_wtime() - t0) + + wing%u_new(1:6*wing%np) = wing%u_new(1:6*wing%np) - wing%du(1:6*wing%np) + wing%err_abs = dsqrt(sum(wing%du**2)) + wing%err_rel = abs(dsqrt(sum(wing%du**2)) / dsqrt(sum(wing%u_new**2))) + + + ! convergence test + if ( (((wing%err_abs2))) then + iterate = .false. + + endif + + ! emergency brake + if (wing%iter>100) then + call abort(309214,"!!! ERROR: The flexible solid solver performed like 200 iterations. This is not normal!") + endif + + enddo + + ! Update results + wing%u_oldold = wing%u_old + wing%u_old = wing%u_new + + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + + if (allocated(FJ)) deallocate(FJ) + +end subroutine + +subroutine flexible_solid_solver_BDF2(time, dt1, dt0, it, wing, Insect) + + use vars + + implicit none + + real(kind=pr),intent(in) :: time, dt1, dt0 + integer,intent (in) :: it + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr), allocatable :: FJ(:,:) + real(kind=pr) :: r + real(kind=pr) :: du + integer :: i, np, nnz_BDF2 + logical :: iterate + real(kind=pr) :: t0 + + ! Calculate the coefficient for time stepping scheme + r = dt1/dt0 + wing%coef = (1+r)/(1+2*r) + + ! Get total number of mass points + np = wing%np + + iterate = .true. + wing%err_abs = 1.0d0 + wing%err_rel = 1.0d0 + wing%iter = 0 + + ! Assign the initial guess value for the Newton-Raphson method equal to the + ! value of the state vector of the previous time step + wing%u_new = wing%u_old + + if (.not.allocated(FJ)) allocate(FJ(1:3*np,1:3*np)) + + do while (iterate) + + wing%iter = wing%iter + 1 + + t0 = MPI_wtime() + ! Construct the external force vector + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + + + t0 = MPI_wtime() + ! Calculate internal force vector from the new state vector u_new + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) + + ! Calculate RHS vector + call RHS_for_NR_method(dt1, dt0, it, wing) + + t0 = MPI_wtime() + FJ = 0.0 + call toc("Flexible wing (FJ_initialize)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the external force vector + call external_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (external_forces_derivatives_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate the Jacobian matrix of the internal force vector + call internal_forces_derivatives_construction(FJ,wing,dt1) + call toc("Flexible wing (internal_forces_derivatives_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Solve for the step of NR method + if (wing%HB_matrix_given) then + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID, & + wing%colptr, wing%rowind) + else + call solve_linear_system_using_schur_complement(wing%du(1:6*np), np, & + FJ(1:3*np,1:3*np), & + wing%m(1:np), wing%c(1:np), & + dt1, wing%RHS_a(1:3*np), wing%RHS_b(1:3*np), & + wing%coef, wing%SparseSolver, it, wing%ID) + endif + call toc("Flexible wing (solve_linear_system_using_schur_complement)", MPI_wtime() - t0) + + wing%u_new = wing%u_new - wing%du + wing%err_abs = dsqrt(sum(wing%du**2)) + wing%err_rel = abs(dsqrt(sum(wing%du**2)) / dsqrt(sum(wing%u_new**2))) + + ! convergence test + if ( (((wing%err_abs2))) then + iterate = .false. + + endif + + ! emergency brake + if (wing%iter>200) then + call abort(337214,"!!! ERROR: The flexible solid solver performed like 200 iterations. This is not normal!") + endif + + enddo + + ! Update results + wing%u_oldold = wing%u_old + wing%u_old = wing%u_new + + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + + if (allocated(FJ)) deallocate(FJ) + +end subroutine + +subroutine flexible_solid_solver_verlet(time, dt1, it, wing, Insect) + + use vars + + implicit none + + real(kind=pr),intent(in) :: time, dt1 + integer,intent (in) :: it + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr) :: du, coef=1.0 + real(kind=pr), allocatable :: point_forces(:) + integer :: i, i_NAN, j_NAN, iJ, jJ, nop + logical :: iterate + real(kind=pr) :: t0 + + + ! Assign the initial guess value for the Newton-Raphson method equal to the + ! value of the state vector of the previous time step + wing%u_new = wing%u_old + + ! Get total number of mass points + nop = wing%np + + allocate(point_forces(1:3*nop)) + + ! Update position from previous velovity and acceleration + do i=1,nop + + wing%u_new(i) = wing%u_old(i) + wing%u_old(i+3*nop)*dt1 + wing%ax_old(i)*0.5*dt1**2 + wing%u_new(i+nop) = wing%u_old(i+nop) + wing%u_old(i+4*nop)*dt1 + wing%ay_old(i)*0.5*dt1**2 + wing%u_new(i+2*nop) = wing%u_old(i+2*nop) + wing%u_old(i+5*nop)*dt1 + wing%az_old(i)*0.5*dt1**2 + + enddo + + ! Update forces from the new position and velocity + + ! Construct the external force vector + t0 = MPI_wtime() + call external_forces_construction(time,it,wing,Insect) + call toc("Flexible wing (external_forces_construction)", MPI_wtime() - t0) + + t0 = MPI_wtime() + ! Calculate internal force vector from the new state vector u_new + call internal_forces_construction(wing) + call toc("Flexible wing (internal_forces_construction)", MPI_wtime() - t0) + + if (Vector_isNAN(wing%Fint(1:3*wing%np))) then + if (root) write(*,*) "FlexibleSolidSolver: Internal force vector contains NaNs" + call abort(9836,"The internal force vector for the solid solver contains NaN..abort") + endif + + !Update acceleration from the new forces + point_forces(1:3*nop) = (wing%Fext(1:3*nop) + wing%Fint(1:3*nop) - & + (/wing%c(1:nop), wing%c(1:nop), wing%c(1:nop)/)*wing%u_new(3*nop+1:6*nop)) + + do i=1,nop + + wing%ax_new(i) = point_forces(i)/wing%m(i) + wing%ay_new(i) = point_forces(i+nop)/wing%m(i) + wing%az_new(i) = point_forces(i+2*nop)/wing%m(i) + + enddo + + !Update the velocity from the new acceleration + + do i=1,nop + + wing%u_new(i+3*nop) = wing%u_old(i+3*nop) + 0.5*dt1*(wing%ax_old(i) + wing%ax_new(i)) + wing%u_new(i+4*nop) = wing%u_old(i+4*nop) + 0.5*dt1*(wing%ay_old(i) + wing%ay_new(i)) + wing%u_new(i+5*nop) = wing%u_old(i+5*nop) + 0.5*dt1*(wing%az_old(i) + wing%az_new(i)) + + enddo + + ! emergency brake + if (maxval(wing%u_new)>1e6) then + call abort(309214,"!!! ERROR: The flexible solid solver returns large value. This is not normal!") + endif + + ! Update results + wing%ax_old = wing%ax_new + wing%ay_old = wing%ay_new + wing%az_old = wing%az_new + wing%u_old = wing%u_new + + call update_solver_solutions_to_create_wing_mask(time,wing,Insect) + +end subroutine + +subroutine RHS_for_NR_method(dt1, dt0, it, wing) + +! Calculate the right hand side (RHS) F for the Newton Raphson method which is +! J*dx = F +! where J is the Jacobian matrix and dx is the step needed for searching +! the root of the equations + + implicit none + integer, intent(in) :: it + real(kind=pr),intent(in) :: dt1, dt0 + type(flexible_wing), intent (inout) :: wing + real(kind=pr) :: c1, c2, c3, r + integer :: np + + !Get total number of points for the simplification of writing array bounds + np = wing%np + + + if (it==0) then ! this is the first time step + + wing%RHS_a(1:3*np) = (/wing%m(1:np), wing%m(1:np), & + wing%m(1:np)/)*(wing%u_new(3*np+1:6*np) - wing%u_old(3*np+1:6*np)) - & + dt1*(wing%Fext(1:3*np) + wing%Fint(1:3*np) - & + (/wing%c(1:np), wing%c(1:np), wing%c(1:np)/)*(wing%u_new(3*np+1:6*np) + & + wing%u_old(3*np+1:6*np))) + + wing%RHS_b(1:3*np) = wing%u_new(1:3*np) - wing%u_old(1:3*np) - & + (wing%u_new(3*np+1:6*np))*dt1 + + else + + !Calculate scheme coefficients + r = dt1/dt0 + c1=(1+r)**2/(1+2*r) + c2=r**2/(1+2*r) + c3=(1+r)/(1+2*r) + + wing%RHS_a(1:3*np) = (/wing%m(1:np), wing%m(1:np), & + wing%m(1:np)/)*(wing%u_new(3*np+1:6*np) - c1*wing%u_old(3*np+1:6*np) + & + c2*wing%u_oldold(3*np+1:6*np)) - & + c3*dt1*(wing%Fext(1:3*np) + wing%Fint(1:3*np) - & + (/wing%c(1:np), wing%c(1:np), & + wing%c(1:np)/)*wing%u_new(3*np+1:6*np)) + + wing%RHS_b(1:3*np) = wing%u_new(1:3*np) - c1*wing%u_old(1:3*np) + & + c2*wing%u_oldold(1:3*np) - c3*(wing%u_new(3*np+1:6*np))*dt1 + + endif + + +end subroutine + +subroutine solve_linear_system_using_schur_complement(du,np,FJ,m,c,dt,a,b,& + coef,SparseSolver,it,wing_ID,colptr_in,rowind_in) + +use vars + +! This subroutine solves a linear system under the form +! [ | ] [ ] [ ] +! [ FJ | M ] [ dx ] [ a ] +! [----|------] [----] = [---] +! [ I | c.I ] [ dv ] [ b ] +! [ | ] [ ] [ ] +! where A is an arbitrary matrix deriving from Jacobian matrix getting from +! taking derivatives of all the internal forces, M is the mass and damping +! matrix who MUST be DIAGONAL where M = diag(m) + coef*dt*diag(c), +! I is IDENTICAL matrix, D is IDENTICAL matrix times a CONSTANT COEFFICIENT coef +! determined by the discretization scheme +! ATTENTION to the structure of matrices M, I and D +! a and b are the RHS getting from evaluating the state of the system from +! previous time step. +! x and v and position and velocity vector respectively, and the phase vector is +! defined as u = [x ; v]^T +! +! (FJ-M*c**(-1))*dx = a - M*c**(-1)*b +! du = 1/(c*dt)*(dx - b) + +implicit none + +real(kind=pr), intent(in) :: dt, coef +real(kind=pr), intent(in) :: m(1:), c(1:), a(1:), b(1:) +real(kind=pr), intent(inout) :: FJ(1:,1:) +character, intent(in) :: SparseSolver +integer, intent(in) :: np, it +character(len=strlen), intent(in) :: wing_ID +real(kind=pr), intent(inout) :: du(1:) +integer, intent(in),optional :: rowind_in(1:,1:), colptr_in(1:) +real(kind=pr), allocatable :: y(:) +real(kind=pr) :: t0 +integer :: i, j, iopt, nnz, info, nrhs_lu, nnz_FJ, nnz_FJext, nnz_pre +integer :: p, col +integer :: factors(8) +integer, allocatable :: rowind(:), colptr(:) +real(kind=pr), allocatable :: values(:) +character(len=3) :: wingstr + + +allocate(y(1:3*np)) + +!Initialize F +y = 0.0d0 + +! Transform the mass array m() into an array (/m,m,m/) corresponding to three dimensions +! x,y and z +!m_array3D = (/m,m,m/) +!c_array3D = (/c,c,c/) + +!do i=1,3*np +! do j=1,3*np +! if (i .eq. j) then +! F(i,i) = coef*dt*(FJ(i,i)+FJ_ext(i,i)) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) +! y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +! else +! F(i,j) = coef*dt*(FJ(i,j)+FJ_ext(i,j)) +! endif +! enddo +!enddo + +write (wingstr,'(i3)') it + + +t0 = MPI_wtime() +do i=1,np + do j=0,2 + FJ(i+j*np,i+j*np) = FJ(i+j*np,i+j*np) + (1/(coef*dt))*m(i) + c(i) + y(i+j*np) = a(i+j*np) + ((1/(coef*dt))*m(i) + c(i))*b(i+j*np) + enddo +enddo +call toc("Flexible wing (Construct global jacobian:diagonal)", MPI_wtime() - t0) + + +if (present(colptr_in) .and. present(rowind_in)) then + t0 = MPI_wtime() + + if (.not.allocated(values)) allocate(values(1:size(rowind_in,DIM=1))) + + nnz = maxval(rowind_in(:,1)) + + p=1; + col=1; + + do i=1,3*np + if (colptr_in(i) /= colptr_in(i+1)) then + do j=colptr_in(i),colptr_in(i+1)-1 + + values(p) = FJ(rowind_in(j,2),col) + p = p + 1 + enddo + col = col + 1 + endif + enddo + + call toc("Flexible wing (get_value_for_HB_matrix)", MPI_wtime() - t0) + + nrhs_lu = 1 + + iopt = 1 + !t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind_in(1:nnz,2), & + colptr_in, y, 3*np, factors, info ) + call toc("Factorization LU)", MPI_wtime() - t0) +!if (root) write(*,'("[Fortran ]Time spent on Factorization LU: ",es15.8," ")') MPI_wtime() - t0 + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Factorization failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + + + +! Solve the factored system. +! + iopt = 2 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind_in(1:nnz,2), & + colptr_in, y, 3*np, factors, info ) + call toc("Flexible wing (solve_linear_system_superLU)", MPI_wtime() - t0) + + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Backsolve failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + +! +! Free memory. +! + iopt = 3 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind_in(1:nnz,2), & + colptr_in, y, 3*np, factors, info ) + call toc("Flexible wing (free_memory_superLU)", MPI_wtime() - t0) + du(1:3*np) = y(1:3*np) + +else + t0 = MPI_wtime() + call dense_to_HB_matrix(FJ, 3*np, nnz, colptr, rowind, values) + !write(*,*) '-------' + !write(*,*) values(1), nnz + !write(*,*) '-------' + call toc("Flexible wing (dense_to_HB_matrix)", MPI_wtime() - t0) + + nrhs_lu = 1 + + iopt = 1 + !t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind, & + colptr, y, 3*np, factors, info ) + call toc("Factorization LU)", MPI_wtime() - t0) +!if (root) write(*,'("[Fortran ]Time spent on Factorization LU: ",es15.8," ")') MPI_wtime() - t0 + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Factorization failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + + + +! Solve the factored system. +! + iopt = 2 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind, & + colptr, y, 3*np, factors, info ) + call toc("Flexible wing (solve_linear_system_superLU)", MPI_wtime() - t0) + + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Backsolve failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + +! +! Free memory. +! + iopt = 3 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind, & + colptr, y, 3*np, factors, info ) + call toc("Flexible wing (free_memory_superLU)", MPI_wtime() - t0) + du(1:3*np) = y(1:3*np) + + deallocate(rowind, colptr) +endif + + + +do i=1,3*np + + du(i + 3*np) = (1/(coef*dt))*(du(i) - b(i)) + +enddo + +deallocate(y) + +deallocate(values) + + +end subroutine + +subroutine update_solver_solutions_to_create_wing_mask(time, wing, Insect) + +implicit none + +real(kind=pr), intent(in) :: time +type(diptera), intent(inout) :: Insect +type(flexible_wing), intent (inout) :: wing +real(kind=pr), dimension(1:3) :: u, v, w +integer :: j +real(kind=pr) :: tau, vr + +if ((wing%Motion .eq. "stationary") .or. (wing%Motion .eq. "simple_harmonic") & + .or. (wing%Motion .eq. "harmonic_ocsillation")) then + wing%x(1:wing%np) = wing%u_old(1:wing%np) + wing%y(1:wing%np) = wing%u_old(wing%np+1:2*wing%np) + wing%z(1:wing%np) = wing%u_old(2*wing%np+1:3*wing%np) + wing%vx(1:wing%np) = wing%u_old(3*wing%np+1:4*wing%np) + wing%vy(1:wing%np) = wing%u_old(4*wing%np+1:5*wing%np) + wing%vz(1:wing%np) = wing%u_old(5*wing%np+1:6*wing%np) +elseif ((wing%Motion .eq. "from_file") .or. (wing%Motion .eq. "revolving_wing")) then + + !call rotate_wing(wing) + + !call translate_wing(wing) + + call rotate_and_translate_wing_into_global_system(wing, Insect) + + call construct_total_velocity(wing,Insect%M_body,Insect%M_body_inv) + +endif + + +end subroutine diff --git a/src/flexible_solver/flexible_solver.f90 b/src/flexible_solver/flexible_solver.f90 index 8da3815..251bec7 100644 --- a/src/flexible_solver/flexible_solver.f90 +++ b/src/flexible_solver/flexible_solver.f90 @@ -4,26 +4,35 @@ module flexible_model ! we need the following line for presribed wings: use module_helpers use basic_operators + use interpolation use module_ini_files_parser_mpi + use module_insects implicit none !---------------------------------------------- ! module global variables !---------------------------------------------- - integer,parameter :: nWings = 1 - integer,parameter :: nVeins = 5 - integer,parameter :: nVeins_BC = 2 + integer,parameter :: nWings = 2 + integer,parameter :: nVeins = 3 + integer,parameter :: nVeins_BC = 1 integer,parameter :: nMembranes = 1 + integer,parameter :: nMembrane_edges = 2 + integer,parameter :: nJoints = 2 + integer,parameter :: nOptJoints = 1 ! see "type solid" about nsmax 06 Aug 2014 - integer,parameter :: npmax = 1000 + integer,parameter :: npmax = 1200 integer,parameter :: nvmax = 2*npmax - integer,parameter :: nmmax = 2*npmax + integer,parameter :: nmmax = 3*npmax ! TODO: move these into the solid model datastructure real(kind=pr),dimension(1:3),save :: grav real(kind=pr), parameter :: error_stop = 1.0e-6 - !character(len=strlen),save :: imposed_motion_leadingedge, TimeMethodSolid - + logical :: ActuallyBDF2 + !real(kind=pr),save,dimension(:,:),allocatable :: press_surface_local,p_surface + character(len=strlen),save :: TimeMethodFlexibleSolid + character(len=strlen),save :: use_flexible_wing_model + logical,save :: load_mass_from_file + character(len=strlen),save :: activate_press_force,activate_noninertial_force,wing_interp ! this is a hack to avoid allocating/deallacting these arrays in every time ! step. turing fails with memory issues if done otherwise. 7 Aug 2014 @@ -35,7 +44,7 @@ module flexible_model !---------------------------------------------- ! Wing datatype !---------------------------------------------- - type Wing + type Flexible_wing ! These arrays are statically allocated (they lie thus on ! the stack), since on turing we had problems with memory fragmentation. It ! is still possible to use npnpmax. @@ -43,9 +52,13 @@ module flexible_model ! coordinates, velocities and phase vector at time t^(n) and t^(n-1): real(kind=pr),dimension(1:npmax) :: x,y,z real(kind=pr),dimension(1:npmax) :: vx,vy,vz + real(kind=pr),dimension(1:npmax) :: ax_new,ay_new,az_new,ax_old,ay_old,az_old real(kind=pr),dimension(1:6*npmax) :: du, u_new, u_old, u_oldold - real(kind=pr),dimension(-1:0,1:nVeins_BC) :: x_BC, y_BC, z_BC + real(kind=pr),dimension(-1:0,1:nVeins_BC) :: x_BC,y_BC,z_BC,x0_BC,y0_BC,z0_BC integer,dimension(1:nmmax,4) :: tri_elements + real(kind=pr),dimension(1:nmmax) :: tri_element_areas + real(kind=pr),dimension(1:nmmax,4) :: tri_element_normals + ! Wing_id is 1 if left wing and 2 if right wing integer :: np, ntri ! Veins : @@ -60,64 +73,93 @@ module flexible_model real(kind=pr),dimension(1:nvmax,2,nVeins_BC) :: Veins_BC real(kind=pr),dimension(-1:nvmax,8,nVeins_BC) :: Veins_bending_BC real(kind=pr),dimension(0:nvmax,5,nVeins_BC) :: Veins_extension_BC + ! Vein connectors + real(kind=pr),dimension(1:nJoints,8) :: Joints + real(kind=pr),dimension(1:nJoints) :: Joint_stiffness_IDs ! Membrane: real(kind=pr),dimension(1:nmmax,2,nMembranes) :: Membranes - real(kind=pr),dimension(1:nmmax,5,nMembranes) :: Membranes_extension - real(kind=pr),dimension(1:nmmax,5) :: Membrane_edge + real(kind=pr),dimension(1:nmmax,5,nMembranes) :: Membranes_extension, Membranes_cross + real(kind=pr),dimension(1:nmmax,5,nMembrane_edges) :: Membrane_edge ! Internal and external forces: real(kind=pr),dimension(1:3*npmax) :: Fint, Fext !, Fint_old, Fext_old + real(kind=pr),dimension(1:nmmax,3) :: press_upside, press_downside ! Internal force derivative matrix: - real(kind=pr),dimension(1:3*npmax,1:3*npmax) :: FJ + !real(kind=pr),dimension(1:3*npmax,1:3*npmax) :: FJ, FJ_ext + integer,dimension(1:3*npmax) :: colptr + integer,dimension(1:0.25*npmax*npmax,1:2) :: rowind + ! material properties: real(kind=pr),dimension(1:nVeins) :: EIy, EIz, kby0, kbz0, ke0_v real(kind=pr),dimension(1:nVeins_BC) :: EIy_BC, EIz_BC, kby0_BC, kbz0_BC, ke0_vBC + real(kind=pr),dimension(1:3,1:nVeins) :: d_veins + real(kind=pr),dimension(1:nVeins) :: middle_point_indices + real(kind=pr),dimension(1:3,1:nVeins_BC) :: d_veins_BC + real(kind=pr),dimension(1:nVeins_BC) :: middle_point_indices_BC + real(kind=pr) :: E, stiff_coef real(kind=pr),dimension(1:nVeins) :: rho_v real(kind=pr),dimension(1:nVeins_BC) :: rho_vBC - real(kind=pr),dimension(1:nMembranes) :: rho_m, ke0_m - real(kind=pr) :: rho_me - real(kind=pr) :: c0 + real(kind=pr),dimension(1:nMembranes) :: rho_m, ke0_m, ke0_mc + real(kind=pr) :: rho_me, m_coef + real(kind=pr) :: damping_v, damping_m, damping_e real(kind=pr),dimension(1:nvmax,1:nVeins) :: ke_v, kby, kbz real(kind=pr),dimension(1:nvmax,1:nVeins) :: m_v + real(kind=pr),dimension(1:nvmax) :: kby_c, kbz_c real(kind=pr),dimension(-1:nvmax,1:nVeins_BC) :: ke_vBC, kby_BC, kbz_BC real(kind=pr),dimension(-1:nvmax,1:nVeins_BC) :: m_vBC - real(kind=pr),dimension(1:nmmax,1:nMembranes) :: ke_m + real(kind=pr),dimension(1:nmmax,1:nMembranes) :: ke_m, ke_mc real(kind=pr),dimension(1:nmmax,1:nMembranes) :: m_m - real(kind=pr),dimension(1:nmmax) :: ke_me + real(kind=pr),dimension(1:nmmax,1:nMembrane_edges) :: ke_me real(kind=pr),dimension(1:nmmax) :: m_me real(kind=pr),dimension(1:npmax) :: m, c - ! Boundary conditions - real(kind=pr) :: x0, y0, z0 + ! Position, velocity and acceleration (t: translation, r: rotation) of the + ! local coordinate system + real(kind=pr),dimension(1:3) :: x0, x_pivot_b, x_pivot_g + real(kind=pr) :: phi, alpha, theta + real(kind=pr) :: phi_dt, alpha_dt, theta_dt + real(kind=pr),dimension(1:3,1:3) :: M_wing, M_wing_inv, M_solver, M_solver_inv + integer :: NumCorrection, ControlPoint + real(kind=pr),dimension(1:3) :: vt0, at0 + real(kind=pr),dimension(1:3) :: vr0, ar0 + real(kind=pr), dimension(1:3) :: rot_body_b, rot_body_g + real(kind=pr), dimension(1:3) :: rot_rel_wing_w!, rot_rel_wing_r_w=0.d0 + real(kind=pr), dimension(1:3) :: rot_rel_wing_b!, rot_rel_wing_r_b=0.d0 + real(kind=pr), dimension(1:3) :: rot_rel_wing_g!, rot_rel_wing_r_g=0.d0 + real(kind=pr), dimension(1:3) :: rot_abs_wing_g!, rot_abs_wing_r_g=0.d0 + real(kind=pr), dimension(1:3) :: rot_dt_wing_w + real(kind=pr), dimension(1:3) :: rot_dt_wing_g - ! - real(kind=pr),dimension(1:3) :: at_inertia ! grid and width in rigid direction: real(kind=pr) :: t_wing, wing_smoothing - ! values of theta and theta_dot at times t^(n) and t^(n-1) - !real(kind=pr),dimension(0:nsmax) :: theta_old, theta_oldold - !real(kind=pr),dimension(0:nsmax) :: theta_dot_old, theta_dot_oldold - - ! real(kind=pr),dimension(0:nsmax,1:6) :: wing_oldold - !real(kind=pr),dimension(1:2) :: Force, Force_unst, Force_press, Inertial_Force - !real(kind=pr) :: E_kinetic, E_elastic + ! Info to monitor the performance of the Newton-Raphson method + real(kind=pr) :: err_rel, err_abs + integer :: iter - real(kind=pr) :: Anglewing_y, Anglewing_z ! we need the previous time step for the BDF solver - real(kind=pr) :: dt_old + real(kind=pr) :: dt_old, coef, dt ! these replace the save variables in the unst correction computation: !real(kind=pr) :: drag_unst_new, drag_unst_old, lift_unst_new, lift_unst_old logical :: StartupStep!, UnsteadyCorrectionsReady - character(len=strlen) :: TimeMethodSolid - character(len=strlen) :: Motion + logical :: Young_modulus_given,OptJoint_stiffness_given, vein_diameters_given + logical :: HB_matrix_given + logical :: save_lagrangian_data + character(len=strlen) :: SparseSolver + !character(len=strlen) :: TimeMethodFlexibleSolid + character(len=strlen) :: Motion, ID real(kind=pr),dimension(1:3*npmax) :: RHS_a, RHS_b + real(kind=pr) :: T_release, tau - end type wing + !For optimization parameter identification + real(kind=pr),dimension(1:4*nOptJoints,1:4) :: OptJoint_IDs + real(kind=pr),dimension(1:nOptJoints) :: k_OptJoints + + end type flexible_wing contains @@ -128,30 +170,21 @@ module flexible_model include "save_wing.f90" include "internal_force.f90" include "external_force.f90" + include "external_force_derivative.f90" include "internal_force_derivative.f90" include "flexible_wing_motions.f90" include "flexible_solver_wrapper.f90" - include "flexible_solid_time_stepper.f90" - include "flexible_tri_mask.f90" - include "supplementary_calc.f90" +#ifdef SUPERLU +#include "flexible_solid_time_stepper_superlu.f90" +#else +#include "flexible_solid_time_stepper.f90" +#endif + include "flexible_tri_mask.f90" + include "prescribed_wing.f90" + include "supplementary_calc.f90" -!------------------------------------------------------------------------------- -! SOLID SOLVER INITIALIZATION -!------------------------------------------------------------------------------- -subroutine InitializeFlexibleSolidSolver( wings ) - implicit none - integer :: i - type(wing), dimension(1:nWings), intent (inout) :: wings - - ! marks all wings to be in the very first time step - ! the solver then uses CN2 instead of BDF2, because the old old time level - ! t_n-1 is not available - do i=1,nWings - wings(i)%StartupStep = .true. - enddo -end subroutine InitializeFlexibleSolidSolver !------------------------------------------------------------------------------- @@ -159,7 +192,7 @@ end subroutine InitializeFlexibleSolidSolver !------------------------------------------------------------------------------- !subroutine MassSpringEnergies( wing ) ! implicit none -! type(wing), intent (inout) :: wing +! type(flexible_wing), intent (inout) :: wing ! wing%E_kinetic = 0.5d0*ds*sum( wing%mu(0:ns-1) * (wing%vx(0:ns-1)**2 + wing%vy(0:ns-1)**2) ) ! wing%E_pot = grav*ds *sum( wing%mu(0:ns-1) * (wing%y(0:ns-1)-wing%y0) ) diff --git a/src/flexible_solver/flexible_solver_wrapper.f90 b/src/flexible_solver/flexible_solver_wrapper.f90 index 626efc8..65138f4 100644 --- a/src/flexible_solver/flexible_solver_wrapper.f90 +++ b/src/flexible_solver/flexible_solver_wrapper.f90 @@ -1,5 +1,5 @@ !------------------------------------------------------------------------------- -! FLEXIBLE SOLID SOLVER WRAPPER +! FLEXIBLE WING SOLVER WRAPPER ! Input: ! time: current time level (t^n) ! dt: time step for new level (t^n+1 - t^n) @@ -7,48 +7,134 @@ ! Output: ! wings: array of wings, all at the new time level t^n+1 !------------------------------------------------------------------------------- -!subroutine FlexibleSolidSolverWrapper ( time, dt, wings ) -! use penalization ! mask array etc -! implicit none -! real(kind=pr), intent (in) :: dt, time -! real(kind=pr) :: t0 -! type(wing), dimension(1:nWings), intent (inout) :: wings -! integer :: i -! t0 = MPI_wtime() - -! do i = 1, nWings -! if (time>=T_release) then - !------------------------------------------- - ! the wings are released (now: active FSI), call IBES solvers - !------------------------------------------- -! select case (TimeMethodFlexibleSolid) -! ! all implicit solvers are in one subroutine -! call IBES_solver (time, dt, wings(i)) - !case ("prescribed") - ! this is not a solver, but for passive FSI with prescribed deformation: - ! call prescribed_beam (time, dt, wings(i)) -! case default -! call abort(723763,"FlexibleSolidSolver::invalid value of TimeMethodFlexibleSolid"//& -! trim(adjustl(TimeMethodSolid))) -! end select -! else +subroutine FlexibleSolidSolverWrapper ( time, dt0, dt1, it, wings, Insect ) + + use penalization ! mask array etc + use vars + use module_insects + + implicit none + real(kind=pr), intent (in) :: dt0, dt1, time + integer, intent (in) :: it + real(kind=pr) :: t0 + type(diptera), intent(inout) :: Insect + type(flexible_wing), dimension(1:nWings), intent (inout) :: wings + integer :: i, mpicode + logical :: run_in_parallel + t0 = MPI_wtime() + + run_in_parallel = .true. + + do i = 1, nWings + if (run_in_parallel) then + if (mpirank==i-1) then + !if (time>=T_release) then + !------------------------------------------- + ! the wings are released (now: active FSI), call IBES solvers + !------------------------------------------- + select case (TimeMethodFlexibleSolid) + case ("BDF2","EI1") + ! all implicit solvers are in one subroutine + call Flexible_solid_time_step(time, dt0, dt1, it, wings(i), Insect) + + case ("prescribed_wing") + ! this is not a solver, but for passive FSI with prescribed deformation: + call prescribed_wing (time, wings(i), Insect) + + if (time_for_output(time, dt1, it, 1.d0, 99999999, 6.d0, 0.d0)) then + + if (root) then + call external_forces_construction(time, it,wings(i),Insect) + call SaveWingData( time, it, dt1, wings ) + endif + endif + + case default + call abort(723763,"FlexibleSolidSolver::invalid value of TimeMethodFlexibleSolid"//& + trim(adjustl(TimeMethodFlexibleSolid))) + end select + !else + !------------------------------------------- + ! the wings are not yet released, but their leading edges may move + ! (passive FSI) + !------------------------------------------- + ! call integrate_position (time+dt, wings(i)) + ! endif + !------------------------------------------- - ! the wings are not yet released, but their leading edges may move - ! (passive FSI) + ! compute energies and stuff !------------------------------------------- -! call integrate_position (time+dt, wings(i)) -! endif + !call MassSpringEnergies ( wings(i) ) + + !-- check if everything seems okay, if not show beam and abort + !call show_beam_on_error( wings(i) ) + endif + else + select case (TimeMethodFlexibleSolid) + case ("BDF2","EI1") + ! all implicit solvers are in one subroutine + call Flexible_solid_time_step(time, dt0, dt1, it, wings(i), Insect) + + case ("prescribed_wing") + ! this is not a solver, but for passive FSI with prescribed deformation: + call prescribed_wing (time, wings(i), Insect) + + if (time_for_output(time, dt1, it, 1.d0, 99999999, 6.d0, 0.d0)) then + + if (root) then + call external_forces_construction(time, it,wings(i),Insect) + call SaveWingData( time, it, dt1, wings ) + endif + endif + + case default + call abort(723763,"FlexibleSolidSolver::invalid value of TimeMethodFlexibleSolid"//& + trim(adjustl(TimeMethodFlexibleSolid))) + end select + endif + enddo + - !------------------------------------------- - ! compute energies and stuff - !------------------------------------------- - !call MassSpringEnergies ( wings(i) ) - !-- check if everything seems okay, if not show beam and abort - !call show_beam_on_error( wings(i) ) -! enddo -! time_solid = time_solid + MPI_wtime() - t0 -!end subroutine FlexibleSolidSolverWrapper + ! cpu timing + call toc("Flexible wing (FlexibleSolidSolverWrapper)", MPI_wtime() - t0) + + run_in_parallel = .true. + + if (run_in_parallel) then + t0 = MPI_wtime() + + + do i =1, nwings + !call MPI_Bcast( wings(i), nWings, Flexible_wing, i, MPI_COMM_WORLD, mpicode ) + !call MPI_Bcast( wings(i), nWings, Flexible_wing, i, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%y, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%z, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vx, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vy, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vz, npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%u_old, 6*npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%u_oldold, 6*npmax, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x0, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x_pivot_b, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x_pivot_g, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%phi, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%alpha, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%theta, 1, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vt0, 3, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%at0, 3, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vr0, 3, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%ar0, 3, MPI_DOUBLE_PRECISION, i-1, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%StartupStep, 1, MPI_LOGICAL, i-1, MPI_COMM_WORLD, mpicode ) + + enddo + + call toc("Flexible wing (Transfer_solid_data_to_all_CPUs)", MPI_wtime() - t0) + endif + + +end subroutine FlexibleSolidSolverWrapper !------------------------------------------------------------------------------- @@ -56,45 +142,42 @@ !------------------------------------------------------------------------------- subroutine OnlyFlexibleSolidSimulation() use vars + use module_helpers + use module_ini_files_parser_mpi + use p3dfft_wrapper + use penalization, only : mask_color + use module_insects use mpi implicit none - type(wing), dimension(1:nWings) :: wings - !real (kind=pr) :: time - !integer :: it!,nsave + character(len=strlen) :: infile + ! this is the insect we're using (object oriented) + type(diptera) :: Insect + ! this is the wings we're using (object oriented) + type(flexible_wing), dimension(1:nWings) :: Wings + real(kind=pr) :: t1,t2 + real(kind=pr) :: time, dt0, dt1 + integer :: it!,nsave + real(kind=pr), allocatable :: work(:,:,:) ! in case you forgot to set it ! if (itdrag==0) itdrag=10 - ! if (dt_fixed<=1.0d-10) dt_fixed=1.d-3 + if (dt_fixed<=1.0d-10) dt_fixed=1.d-3 + dt0 = dt_fixed + dt1 = dt_fixed write (*,*) "*** information: starting OnlyFlexibleSolidSimulation" - !time = 0.0 - !it = 0 - - !call show_solid_model_information - - !-- initialization - !call init_wings(wings) - - !call read_mesh_data(wings) - + !----------------------------------------------------------------------------- + ! Read input parameters and mesh data + !----------------------------------------------------------------------------- + if (root) write(*,'(A)') '*** info: Reading input data...' + ! get filename of PARAMS file from command line + call get_command_argument(2,infile) - !--loop over time steps - !do while ((time<=tmax)) - !-- external loads for testing purposes - !if (debug_pressure==1) then - ! wings(1)%pressure_new=0.1*dsin(time) - ! wings(1)%tau_new=0.1*dsin(time) - !endif - !-- time stepping - !call FlexibleSolidSolverWrapper( time, dt_fixed , wings ) - ! it = it+1 - ! time = dble(it)*dt_fixed - ! call SaveWingData( time, wings ) - !enddo - !call SaveWingData( time, wings ) + ! prints the profiling on screen + call summarize_profiling( MPI_COMM_WORLD ) end subroutine diff --git a/src/flexible_solver/flexible_tri_mask.f90 b/src/flexible_solver/flexible_tri_mask.f90 index d6f5f88..9061965 100644 --- a/src/flexible_solver/flexible_tri_mask.f90 +++ b/src/flexible_solver/flexible_tri_mask.f90 @@ -1,4 +1,4 @@ -! TO DO migrate this one into create_mask_fsi subroutine +! TODO migrate this one into create_mask_fsi subroutine subroutine Draw_flexible_wing(time, wings, mask, mask_color, us)!, unsigned_distance) implicit none @@ -7,12 +7,12 @@ subroutine Draw_flexible_wing(time, wings, mask, mask_color, us)!, unsigned_dist real(kind=pr),intent(inout)::mask(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) real(kind=pr),intent(inout)::us(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) integer(kind=2),intent(inout)::mask_color(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) - type(wing),dimension(1:nWings), intent(inout) :: wings + type(flexible_wing),dimension(1:nWings), intent(inout) :: wings ! initialize everything - mask = 0.d0 - mask_color = 0 - us = 0.d0 + ! mask = 0.d0 + ! mask_color = 0 + ! us = 0.d0 ! Create mask function and us field from triangular mesh call create_mask_from_triangular_mesh(wings,mask,us,mask_color) @@ -21,6 +21,51 @@ subroutine Draw_flexible_wing(time, wings, mask, mask_color, us)!, unsigned_dist end subroutine Draw_flexible_wing +subroutine calculate_normal_vectors_of_wing(wings) + + implicit none + + type(flexible_wing),dimension(1:nWings), intent(inout) :: wings + real(kind=pr),allocatable :: normal(:,:) + integer :: i, itri + +do i = 1, nWings + +allocate(normal(1:wings(i)%ntri,1:3)) + + do itri = 1, wings(i)%ntri + + + + ! Calculate the normal vector of one triangle + normal(itri,1:3) = cross((/wings(i)%x(wings(i)%tri_elements(itri,2)) - & + wings(i)%x(wings(i)%tri_elements(itri,3)), & + wings(i)%y(wings(i)%tri_elements(itri,2)) - & + wings(i)%y(wings(i)%tri_elements(itri,3)), & + wings(i)%z(wings(i)%tri_elements(itri,2)) - & + wings(i)%z(wings(i)%tri_elements(itri,3))/),& + (/wings(i)%x(wings(i)%tri_elements(itri,3)) - & + wings(i)%x(wings(i)%tri_elements(itri,4)), & + wings(i)%y(wings(i)%tri_elements(itri,3)) - & + wings(i)%y(wings(i)%tri_elements(itri,4)), & + wings(i)%z(wings(i)%tri_elements(itri,3)) - & + wings(i)%z(wings(i)%tri_elements(itri,4))/)) + + ! dimentionalized to get a unit vector + wings(i)%tri_element_normals(itri,1) = normal(itri,1)/norm2(normal(itri,1:3)) + wings(i)%tri_element_normals(itri,2) = normal(itri,2)/norm2(normal(itri,1:3)) + wings(i)%tri_element_normals(itri,3) = normal(itri,3)/norm2(normal(itri,1:3)) + + enddo + +deallocate(normal) + +enddo + + +end subroutine + + subroutine create_mask_from_triangular_mesh(wings,mask,us,mask_color) implicit none @@ -28,29 +73,30 @@ subroutine create_mask_from_triangular_mesh(wings,mask,us,mask_color) !real(kind=pr),intent(inout)::unsigned_distance(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) real(kind=pr),intent(inout)::us(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) integer(kind=2),intent(inout)::mask_color(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) - type(wing),dimension(1:nWings), intent(inout) :: wings + type(flexible_wing),dimension(1:nWings), intent(inout) :: wings integer :: ix, iy, iz, itri, i, j integer :: ixmin, ixmax, iymin, iymax, izmin, izmax integer :: xmin, xmax, ymin, ymax, zmin, zmax integer, parameter :: safety = 2 - real(kind=pr) :: x,y,z, distance + real(kind=pr) :: x,y,z, distance, mask_tmp real(kind=pr),dimension(1:3) :: velocity - real(kind=pr),allocatable::unsigned_distance(:,:,:) + + real(kind=pr),allocatable :: unsigned_distance(:,:,:) + allocate(unsigned_distance(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3))) - unsigned_distance = 100.d0 !assign the distance to be really far away + unsigned_distance = 1.d10 !assign the distance to be really far away - do i = 1, nWings - !ntri = maxval(wings(i)%tri_elements(:,1)) + do i = 1, nWings - !write(*,*) wings(i)%ntri ! outer loop over triangles. in every triangle we loop over the union of its ! bounding box with the local CPUS part of the mask array do itri = 1, wings(i)%ntri - ! determine bounding box for one triangle + + ! Determine bounding box for one triangle ixmin = wings(i)%tri_elements(itri,& minloc(wings(i)%x(wings(i)%tri_elements(itri,2:4)),DIM=1) + 1) @@ -116,25 +162,28 @@ subroutine create_mask_from_triangular_mesh(wings,mask,us,mask_color) (/wings(i)%vx(wings(i)%tri_elements(itri,4)), & wings(i)%vy(wings(i)%tri_elements(itri,4)), & wings(i)%vz(wings(i)%tri_elements(itri,4))/), & - (/x,y,z/), (/0.0_pr,0.0_pr,1.0_pr/)) + (/x,y,z/), wings(i)%tri_element_normals(itri,1:3)) if (distance < unsigned_distance(ix,iy,iz)) then unsigned_distance(ix,iy,iz) = distance - us(ix,iy,iz,1:3) = velocity - endif - enddo - enddo - enddo + call smoothstep(mask_tmp,unsigned_distance(ix,iy,iz),& + wings(i)%t_wing,wings(i)%wing_smoothing) - ! Then we calculate mask function from unsigned distance - do iz = max(ra(3),zmin),min(rb(3),zmax) - do iy = max(ra(2),ymin),min(rb(2),ymax) - do ix = max(ra(1),xmin),min(rb(1),xmax) + if ((mask(ix,iy,iz) < mask_tmp).and.(mask_tmp>0.0)) then + mask(ix,iy,iz) = mask_tmp + + if (wings(i)%ID == "left") then + mask_color(ix,iy,iz) = 2 !color of left wing + elseif (wings(i)%ID == "right") then + mask_color(ix,iy,iz) = 3 !color of right wing + endif - call smoothstep(mask(ix,iy,iz),unsigned_distance(ix,iy,iz),& - wings(i)%t_wing,wings(i)%wing_smoothing) + us(ix,iy,iz,1:3) = velocity + endif + + endif enddo enddo @@ -258,7 +307,7 @@ subroutine calculate_unsigned_distance_and_us(distance,us,tri1,tri2,tri3,utri1,u s = b*e - c*d t = b*d - a*e - if (det < 1.0d-11) then + if (det < 1.0d-15) then distance = 9.0d9 return endif @@ -541,13 +590,13 @@ subroutine project_point_onto_triangle(point_projected,tri1,point,normal) c = normal(3) d = - (a*tri1(1) + b*tri1(2) + c*tri1(3)) - point_projected(1) = ((b**2 + c**2)*tri1(1) - a*b*tri1(2) - a*c*tri1(3) - d*a)/ & + point_projected(1) = ((b**2 + c**2)*point(1) - a*b*point(2) - a*c*point(3) - d*a)/ & (a**2 + b**2 + c**2) - point_projected(2) = (-a*b*tri1(1) + (a**2 + c**2)*tri1(2) - b*c*tri1(3) - d*b)/ & + point_projected(2) = (-a*b*point(1) + (a**2 + c**2)*point(2) - b*c*point(3) - d*b)/ & (a**2 + b**2 + c**2) - point_projected(3) = (-a*c*tri1(1) - b*c*tri1(2) - (a**2 + b**2)*tri1(3) - d*c)/ & + point_projected(3) = (-a*c*point(1) - b*c*point(2) + (a**2 + b**2)*point(3) - d*c)/ & (a**2 + b**2 + c**2) end subroutine @@ -577,20 +626,20 @@ function interpolationPointTriangle(tri1,tri2,tri3,utri1,utri2,utri3,point,norma tmp = cross(tri1-point_projected,tri2-point_projected) A3 = 0.5*sqrt(tmp(1)**2 + tmp(2)**2 + tmp(3)**2) - tmp = cross(tri1,tri2) + tmp = cross(tri1-tri3,tri2-tri3) A = 0.5*sqrt(tmp(1)**2 + tmp(2)**2 + tmp(3)**2) !Check if the projection of the point is inside the triangle - if (mpirank == 0) then + if ((A1 + A2 + A3) > (A + 1.0d-15)) then - write(*,*) "WARNING: The projection of the point may be out of the triangle" + write(*,*) "WARNING: The projection of the point may be outside of the triangle" write(*,*) A1, A2, A3 write(*,*) A write(*,*) tri1, tri2, tri3 write(*,*) point write(*,*) point_projected endif -endif + interpolationPointTriangle(1:3) = (A1*utri1(1:3) + A2*utri2(1:3) + A3*utri3(1:3))/ & (A1 + A2 + A3) diff --git a/src/flexible_solver/flexible_wing_motions.f90 b/src/flexible_solver/flexible_wing_motions.f90 index 3c356f6..9a86b0f 100644 --- a/src/flexible_solver/flexible_wing_motions.f90 +++ b/src/flexible_solver/flexible_wing_motions.f90 @@ -1,35 +1,242 @@ !------------------------------------------------------------------------------- ! WRAPPER Motion protocoll wrapper of flexible wings !------------------------------------------------------------------------------- -subroutine flexible_wing_motions ( time, wings ) +subroutine flexible_wing_motions ( time, wing, kine) implicit none real(kind=pr),intent(in) :: time - type(wing), dimension (1:nWings), intent (inout) :: wings + type(wingkinematics), intent(inout) :: kine + type(flexible_wing), intent (inout) :: wing integer :: i - do i=1,nWings - select case(wings(i)%Motion) + select case(wing%Motion) case ("simple_harmonic") - call simple_harmonic_motion (time, wings(i)) + call simple_harmonic_motion (time, wing) case ("stationary") - wings(i) = wings(i) + continue + case ("from_file") + call read_kine_from_file (time, wing, kine) + case ("revolving_wing") + call revolving_wing(time,wing) + case ("harmonic_ocsillation") + wing%vt0(1) = 0.d0 + wing%vt0(2) = 0.25*(1*pi)*cos(1*pi*time) + wing%vt0(3) = 0.d0 + + wing%at0(1) = 0.d0 + wing%at0(2) = - 0.25*(1*pi)**2*sin(1*pi*time) + wing%at0(3) = 0.d0 end select - enddo end subroutine -subroutine simple_harmonic_motion (time, wings) +subroutine revolving_wing (time, wing) + + implicit none + + real(kind=pr),intent(in) :: time + type(flexible_wing), intent (inout) :: wing + integer :: j + real(kind=pr) :: phi_y, ttau + real(kind=pr) :: phi, phi_dt, alpha, alpha_dt, theta, theta_dt + real(kind=pr),dimension(1:3,1:3) :: mat_Rx + real(kind=pr),dimension(1:3) :: u + + ! revolving wing kinematics, pre-defined set. We fix alpha to 45deg and increase + ! phi linearily with a short startup conditioner as suggested in [1]. The startup + ! time is fixed to 0.4, which gives phi=31.35deg at the end of that interval + ! [3] D. Kolomenskiy, Y. Elimelech and K. Schneider. Leading-edge vortex shedding from rotating wings. Fluid Dyn. Res., 46, 031421, 2014. + ttau = 0.4 + ! position angle (is directly given in radiant) + ! we use PHI_DOT = 1 as normalization as well (since we have no frequency in this case) + phi = 1.d0*( ttau*dexp(-time/ttau) + time) - ttau + phi_dt = 1.d0*(1.d0-dexp(-time/ttau)) + ! feathering angle is constant + alpha = deg2rad(-45.d0) + alpha_dt = 0.d0 + ! elevation angle is always zero + theta = 0.d0 + theta_dt = 0.d0 + + wing%phi = phi + wing%alpha = alpha + wing%theta = theta + + wing%phi_dt = phi_dt + wing%alpha_dt = alpha_dt + wing%theta_dt = theta_dt + + !wing%ar0 = 0.d0 + !wing%ar0(3) = 1.0d0/ttau*dexp(-time/ttau) + + + !call rotate_vector_into_global_system(wing,wing%ar0) + !wing%vr0(1) = phi_dt + !wing%vr0(2) = alpha_dt + !wing%vr0(3) = theta_dt + + !This angular velocity is defined in the wing system, we need to put it back into + !the coordinate system of the MSM solver + !wing%vr0 = matmul(wing%M_solver,wing%vr0) + +end subroutine + +subroutine read_kine_from_file (time, wing, kine) + + implicit none + + real(kind=pr),intent(in) :: time + type(wingkinematics), intent(inout) :: kine + type(flexible_wing), intent (inout) :: wing + real(kind=pr) :: phi, phi_dt, alpha, alpha_dt, theta, theta_dt + type(inifile) :: kinefile + + !--------------------------------------------------------------------------- + ! Load kinematics for one stroke from file. This can be applied for example + ! in hovering. if the wing motion varies appreciably between strokes, + ! the kinematic loader is the method of choice. The file is specified + ! in the params file and stored in Insect%infile. An example file + ! (kinematics_fourier_example.ini) is in the git-repository + !--------------------------------------------------------------------------- + if (index( kine%infile,".ini")==0) then + call abort(2030,"you're trying to load an old kinematics file,please convert it to & + &a new *.ini file (see src/insects/kinematics_example.ini& + & the insects-tools repository can help you do that!") + endif + + !--------------------------------------------------------------------------- + ! this block is excecuted only once + !--------------------------------------------------------------------------- + if (.not.kine%initialized) then + if (root) then + write(*,'(80("<"))') + write(*,*) "Initializing wing kinematics!" + write(*,*) "*.ini file is: "//trim(adjustl(kine%infile)) + write(*,'(80("<"))') + endif + ! parse ini file + call read_ini_file_mpi(kinefile, kine%infile, .true.) + + ! how to interpret numbers: Fourier or Hermite? + call read_param_mpi(kinefile,"kinematics","type",kine%infile_type,"none") + ! what units are given, degree or radiant? + call read_param_mpi(kinefile,"kinematics","units",kine%infile_units,"degree") + ! what convention/definition does the data follow? + call read_param_mpi(kinefile,"kinematics","convention",kine%infile_convention,"flusi") + + ! inform about your interpretation + select case (kine%infile_type) + case ("Fourier","fourier","FOURIER") + if (root) write(*,*) "The input file is interpreted as FOURIER coefficients" + case ("Hermite","hermite","HERMITE") + if (root) write(*,*) "The input file is interpreted as HERMITE coefficients" + case default + call abort(77771, "kinematics file does not appear to be valid, set type=fourier or type=hermite") + end select + + ! how many coefficients will be read + call read_param_mpi(kinefile,"kinematics","nfft_phi",kine%nfft_phi,0) + call read_param_mpi(kinefile,"kinematics","nfft_alpha",kine%nfft_alpha,0) + call read_param_mpi(kinefile,"kinematics","nfft_theta",kine%nfft_theta,0) + + ! read coefficients + call read_param_mpi(kinefile,"kinematics","a0_phi",kine%a0_phi,0.d0) + call read_param_mpi(kinefile,"kinematics","a0_alpha",kine%a0_alpha,0.d0) + call read_param_mpi(kinefile,"kinematics","a0_theta",kine%a0_theta,0.d0) + + call read_param_mpi(kinefile,"kinematics","ai_phi",kine%ai_phi(1:kine%nfft_phi)) + call read_param_mpi(kinefile,"kinematics","bi_phi",kine%bi_phi(1:kine%nfft_phi)) + call read_param_mpi(kinefile,"kinematics","ai_alpha",kine%ai_alpha(1:kine%nfft_alpha)) + + call read_param_mpi(kinefile,"kinematics","bi_alpha",kine%bi_alpha(1:kine%nfft_alpha)) + call read_param_mpi(kinefile,"kinematics","ai_theta",kine%ai_theta(1:kine%nfft_theta)) + call read_param_mpi(kinefile,"kinematics","bi_theta",kine%bi_theta(1:kine%nfft_theta)) + kine%initialized = .true. + call clean_ini_file_mpi( kinefile ) + + if (root) write(*,'(80(">"))') + endif + + !--------------------------------------------------------------------------- + ! get actual kinematics from the coefficients + !--------------------------------------------------------------------------- + ! this block is executed every time. it is called a few times only per time step + ! so don't worry about performance, we can use the string comparison + select case (kine%infile_type) + case ("Fourier","fourier","FOURIER") + ! evaluate fourier series + call fseries_eval(time,phi,phi_dt, kine%a0_phi, kine%ai_phi(1:kine%nfft_phi), kine%bi_phi(1:kine%nfft_phi)) + call fseries_eval(time,alpha,alpha_dt, kine%a0_alpha, kine%ai_alpha(1:kine%nfft_alpha), kine%bi_alpha(1:kine%nfft_alpha)) + call fseries_eval(time,theta,theta_dt, kine%a0_theta, kine%ai_theta(1:kine%nfft_theta), kine%bi_theta(1:kine%nfft_theta)) + + case ("Hermite","hermite","HERMITE") + ! evaluate hermite interpolation + call hermite_eval(time,phi,phi_dt , kine%ai_phi(1:kine%nfft_phi), kine%bi_phi(1:kine%nfft_phi)) + call hermite_eval(time,alpha,alpha_dt, kine%ai_alpha(1:kine%nfft_alpha), kine%bi_alpha(1:kine%nfft_alpha)) + call hermite_eval(time,theta,theta_dt, kine%ai_theta(1:kine%nfft_theta), kine%bi_theta(1:kine%nfft_theta)) + + case default + call abort(1717,"kinematics file does not appear to be valid, set type=fourier or type=hermite") + end select + + !--------------------------------------------------------------------------- + ! make sure the output is in the right units (it HAS to be radiants!) + !--------------------------------------------------------------------------- + select case (kine%infile_units) + case ("degree","DEGREE","Degree") + ! the rest of the code gets radiants, so convert here + phi = deg2rad(phi) + alpha = deg2rad(alpha) + theta = deg2rad(theta) + phi_dt = deg2rad(phi_dt) + alpha_dt = deg2rad(alpha_dt) + theta_dt = deg2rad(theta_dt) + case ("radiant","RADIANT","Radiant") + ! if the file is already in radiants, do nothing and be happy! + case default + call abort(1718,"kinematics file does not appear to be valid, set units=degree or units=radiant") + end select + + !--------------------------------------------------------------------------- + ! make sure convention / definition of angles is respected + !--------------------------------------------------------------------------- + select case (kine%infile_convention) + case ("FLUSI","flusi","Flusi","FluSI") + ! defintion as used in flusi. all angles are positive in the right hand rule + ! that means especially that positive deviation puts wing downwards in a + ! horizontal stroke plane + case ("SISC","sisc","siam-sisc") + ! the same as FLUSI, except for the deviation angle. The sign has been changed + ! to be more in agreement with other people's definitions. however, flusi + ! always internally works with the right hand rule + theta = -theta + theta_dt = -theta_dt + case default + call abort(1719,"kinematics file does not appear to be valid, set convention=flusi or convention=sisc") + end select + + ! Transger the kinematics into Wing variable + wing%phi = phi + wing%alpha = alpha + wing%theta = theta + + wing%phi_dt = phi_dt + wing%alpha_dt = alpha_dt + wing%theta_dt = theta_dt + +end subroutine + +subroutine simple_harmonic_motion (time, wing) implicit none real(kind=pr),intent(in) :: time - type(wing), intent (inout) :: wings + type(flexible_wing), intent (inout) :: wing integer :: j do j=1,nVeins_BC - wings%z_BC(-1,j) = wings%z0 + 0.075/10*sin(10*pi*time) - wings%z_BC(0,j) = wings%z_BC(-1,j) + wing%z_BC(-1,j) = wing%z0_BC(-1,j) + 0.25*sin(1*pi*time) + wing%z_BC(0,j) = wing%z0_BC(0,j) + 0.25*sin(1*pi*time) enddo end subroutine @@ -40,13 +247,13 @@ subroutine translation_acceleration_of_wing_plane (time,dt0,dt1,it,wings) real(kind=pr),intent(in) :: time,dt0,dt1 integer,intent(in) :: it -type(wing), dimension (1:nWings), intent(inout) :: wings +type(flexible_wing), dimension (1:nWings), intent(inout) :: wings integer :: i do i=1,nWings - wings(i)%at_inertia(1) = 0.d0 - wings(i)%at_inertia(2) = 0.d0 - wings(i)%at_inertia(3) = - 0.075/10*(10*pi)**2*sin(10*pi*time) + wings(i)%at0(1) = 0.d0 + wings(i)%at0(2) = - 0.25*(1*pi)**2*sin(1*pi*time) + wings(i)%at0(3) = 0.d0 enddo end subroutine @@ -57,7 +264,7 @@ subroutine moving_noninertial_frame_in_reference_frame(time,dt0,dt1, it,wings) real(kind=pr),intent(in) :: time,dt0,dt1 integer,intent(in) :: it -type(wing), intent(inout) :: wings +type(flexible_wing), intent(inout) :: wings real(kind=pr) :: c1, c2, c3, r integer :: np @@ -71,15 +278,15 @@ subroutine moving_noninertial_frame_in_reference_frame(time,dt0,dt1, it,wings) if (it==0) then - wings%x(1:np) = wings%x(1:np) + dt1**2*wings%at_inertia(1) - wings%y(1:np) = wings%y(1:np) + dt1**2*wings%at_inertia(2) - wings%z(1:np) = wings%z(1:np) + dt1**2*wings%at_inertia(3) + wings%x(1:np) = wings%x(1:np) + dt1*wings%vt0(1) !dt1**2*wings%at0(1) + wings%y(1:np) = wings%y(1:np) + dt1*wings%vt0(2) + wings%z(1:np) = wings%z(1:np) + dt1*wings%vt0(3) else - wings%x(1:np) = wings%x(1:np) + dt1**2*wings%at_inertia(1) - wings%y(1:np) = wings%y(1:np) + dt1**2*wings%at_inertia(2) - wings%z(1:np) = wings%z(1:np) + dt1**2*wings%at_inertia(3) + wings%x(1:np) = wings%x(1:np) + dt1*wings%vt0(1) !dt1**2*wings%at0(1) + wings%y(1:np) = wings%y(1:np) + dt1*wings%vt0(2) + wings%z(1:np) = wings%z(1:np) + dt1*wings%vt0(3) endif diff --git a/src/flexible_solver/init_wing.f90 b/src/flexible_solver/init_wing.f90 index 25f140c..a761511 100644 --- a/src/flexible_solver/init_wing.f90 +++ b/src/flexible_solver/init_wing.f90 @@ -1,20 +1,25 @@ -subroutine init_wings ( fname, wings ) +subroutine init_wings ( fname, wings, Insect, dx_reference) !--------------------------------------------------- ! initializes an array of wings. the initial state is always ! straight lines, possible oriented with different angles, at rest. !--------------------------------------------------- implicit none - integer :: n, i, a,j, ind - character(len=*), intent(in) :: fname - type(wing), dimension (1:nWings), intent (inout) :: wings - real(kind=pr) :: alpha + integer :: n, i, a, j, ind, itri + character(len=strlen), intent(in) :: fname + type(diptera), intent(inout) :: Insect + type(flexible_wing), dimension (1:nWings), intent (inout) :: Wings + real(kind=pr), intent(in) :: dx_reference + character(len=strlen) :: filename + real(kind=pr) :: alpha, time, stiff_coef real(kind=pr) :: delta(1:3) + real(kind=pr), dimension(1:3) :: u + real(kind=pr), allocatable :: normal(:,:) type(inifile) :: PARAMS ! LeadingEdge: x, y, vx, vy, ax, ay (Array) !real (kind=pr), dimension(1:6) :: LeadingEdge character(len=1) :: wingstr - character(len=16) :: frmt + character(len=20) :: frmt if (root) then @@ -24,7 +29,10 @@ subroutine init_wings ( fname, wings ) write(*,'(80("<"))') endif - !call lapack_unit_test() + + + !TIME + time = 0.d0 !------------------------------------------- ! allocate wing storage for each wing @@ -32,13 +40,19 @@ subroutine init_wings ( fname, wings ) !TODO Add reading from backup file procedure do i = 1, nWings + + !-- for naming files.. + write (wingstr,'(i1)') i + !--------------------------------------------- ! define adjustable parameters for each wing ! this is position and motion protocoll !-------------------------------------------- - !rotation angles only used to determine the starting position of the wings - wings(i)%Anglewing_y = 0.d0 - wings(i)%Anglewing_z = -pi/4 + if (i==1) then + wings(i)%ID = "left" + elseif (i==2) then + wings(i)%ID = "right" + endif !-------------------------------------- !-- initialize wing @@ -52,111 +66,224 @@ subroutine init_wings ( fname, wings ) wings(i)%vx = 0.d0 wings(i)%vy = 0.d0 wings(i)%vz = 0.d0 + wings(i)%ax_old = 0.d0 + wings(i)%ay_old = 0.d0 + wings(i)%az_old = 0.d0 + wings(i)%ax_new = 0.d0 + wings(i)%ay_new = 0.d0 + wings(i)%az_new = 0.d0 wings(i)%u_old = 0.d0 wings(i)%u_oldold = 0.d0 wings(i)%tri_elements = 0 + wings(i)%tri_element_areas = 0.d0 + wings(i)%tri_element_normals = 0.d0 wings(i)%Veins_bending = 0.d0 wings(i)%Veins_extension = 0.d0 wings(i)%Veins_bending_BC = 0.d0 wings(i)%Veins_extension_BC = 0.d0 wings(i)%Membranes_extension = 0.d0 + wings(i)%Membranes_cross = 0.d0 wings(i)%Membrane_edge = 0.d0 wings(i)%m=0.d0 - wings(i)%at_inertia=0.d0 + wings(i)%c=0.d0 wings(i)%StartupStep = .true. wings(i)%dt_old = 0.d0 + wings(i)%press_upside = 0.d0 + wings(i)%press_downside = 0.d0 + wings(i)%x_pivot_b = 0.d0 + wings(i)%x_pivot_g = 0.d0 + wings(i)%phi = 0.d0 + wings(i)%alpha = 0.d0 + wings(i)%theta = 0.d0 + wings(i)%M_wing = 0.d0 + wings(i)%M_wing_inv = 0.d0 + wings(i)%M_solver = 0.d0 + wings(i)%M_solver_inv = 0.d0 + wings(i)%vt0 = 0.d0 + wings(i)%at0 = 0.d0 + wings(i)%vr0 = 0.d0 + wings(i)%ar0 = 0.d0 + wings(i)%rot_body_b=0.d0 + wings(i)%rot_body_g=0.d0 + wings(i)%rot_rel_wing_w=0.d0 + wings(i)%rot_rel_wing_b=0.d0 + wings(i)%rot_rel_wing_g=0.d0 + wings(i)%rot_abs_wing_g=0.d0 + wings(i)%colptr=0 + wings(i)%rowind=0 - ! Reading mesh data from ASCII files - call read_wing_mesh_data(wings(i), i) + !----------------------------------------------------------------------------- + ! read in parameters form ini file + !----------------------------------------------------------------------------- + ! read in the complete ini file, from which we initialize the flexible wings + call read_ini_file_mpi(PARAMS, fname, verbose=.true.) - call rotate_wing(wings(i)) + call read_param_mpi(PARAMS,"Flexible_wing","Young_modulus_given",wings(i)%Young_modulus_given,.false.) + call read_param_mpi(PARAMS,"Flexible_wing","HB_matrix_given",wings(i)%HB_matrix_given,.false.) + ! Reading mesh data from ASCII files and save them into the state vector of + ! the mass-spring model u_old + call read_wing_mesh_data(wings(i), i) - ! write(*,*) wings(i)%veins_bending_BC(1:nint(maxval(wings(i)%veins_bending_BC(:,1,2))),:,2) + if (wings(i)%ID == "left") then + call read_param_mpi(PARAMS,"Flexible_wing","Left_wing_motion",wings(i)%Motion,"stationary") + elseif (wings(i)%ID == "right") then + call read_param_mpi(PARAMS,"Flexible_wing","Right_wing_motion",wings(i)%Motion,"stationary") + endif - !----------------------------------------------------------------------------- - ! read in parameters form ini file - !----------------------------------------------------------------------------- + call read_param_mpi(PARAMS,"Flexible_wing","t_wing",wings(i)%t_wing, 2.0d0*dx_reference) + call read_param_mpi(PARAMS,"Flexible_wing","wing_smoothing",wings(i)%wing_smoothing, 1.0d0*dx_reference) + + call read_param_mpi(PARAMS,"Flexible_wing","vein_diameters_given",wings(i)%vein_diameters_given,.false.) + if (wings(i)%Young_modulus_given) then + call read_param_mpi(PARAMS,"Flexible_wing","Young_modulus",wings(i)%E,0.0d0) + else + call read_param_mpi(PARAMS,"Flexible_wing","EIy",wings(i)%EIy) + call read_param_mpi(PARAMS,"Flexible_wing","EIz",wings(i)%EIz) + call read_param_mpi(PARAMS,"Flexible_wing","EIy_with_BC",wings(i)%EIy_BC) + call read_param_mpi(PARAMS,"Flexible_wing","EIz_with_BC",wings(i)%EIz_BC) + endif - ! read in the complete ini file, from which we initialize the insect - call read_ini_file_mpi(PARAMS, fname, verbose=.true.) + call read_param_mpi(PARAMS,"Flexible_wing","Joint_stiffness_IDs",wings(i)%Joint_stiffness_IDs) - call read_param_mpi(PARAMS,"Geometry","x0",wings(i)%x0, 0.d0) - call read_param_mpi(PARAMS,"Geometry","y0",wings(i)%y0, 0.d0) - call read_param_mpi(PARAMS,"Geometry","z0",wings(i)%z0, 0.d0) - !call read_param_mpi(PARAMS,"Flexible_wing","v0",wings(i)%v0, (/0.d0, 0.d0, 0.d0/)) - call read_param_mpi(PARAMS,"Flexible_wing","t_wing",wings(i)%t_wing, 0.01d0) - call read_param_mpi(PARAMS,"Flexible_wing","wing_smoothing",wings(i)%wing_smoothing, 3*dz) + call read_param_mpi(PARAMS,"Flexible_wing","OptJoint_stiffness_given",wings(i)%OptJoint_stiffness_given,.false.) + if (wings(i)%OptJoint_stiffness_given) then + call read_param_mpi(PARAMS,"Flexible_wing","OptJoint_stiffness",wings(i)%k_OptJoints) + endif - call read_param_mpi(PARAMS,"Flexible_wing","EIy",wings(i)%EIy) - call read_param_mpi(PARAMS,"Flexible_wing","EIz",wings(i)%EIz) - call read_param_mpi(PARAMS,"Flexible_wing","EIy_with_BC",wings(i)%EIy_BC) - call read_param_mpi(PARAMS,"Flexible_wing","EIz_with_BC",wings(i)%EIz_BC) + !HACK: to change the stiffness of all veins by a factor of stiff_coef + call read_param_mpi(PARAMS,"Flexible_wing","stiff_coef",wings(i)%stiff_coef, 1.0d0) call read_param_mpi(PARAMS,"Flexible_wing","ke_veins",wings(i)%ke0_v) call read_param_mpi(PARAMS,"Flexible_wing","ke_veins_with_BC",wings(i)%ke0_vBC) call read_param_mpi(PARAMS,"Flexible_wing","ke_membranes",wings(i)%ke0_m) + call read_param_mpi(PARAMS,"Flexible_wing","ke_membranes_cross_springs",wings(i)%ke0_mc) + + call read_param_mpi(PARAMS,"Flexible_wing","damping_veins",wings(i)%damping_v, 0.0d0) + call read_param_mpi(PARAMS,"Flexible_wing","damping_membranes",wings(i)%damping_m, 0.0d0) + call read_param_mpi(PARAMS,"Flexible_wing","damping_edge",wings(i)%damping_e, 0.0d0) + call read_param_mpi(PARAMS,"Flexible_wing","m_coef",wings(i)%m_coef, 1.0d0) + if (.not.load_mass_from_file) then call read_param_mpi(PARAMS,"Flexible_wing","density_veins",wings(i)%rho_v) call read_param_mpi(PARAMS,"Flexible_wing","density_veins_with_BC",wings(i)%rho_vBC) call read_param_mpi(PARAMS,"Flexible_wing","density_membranes",wings(i)%rho_m) + endif - call read_param_mpi(PARAMS,"Flexible_wing","damping",wings(i)%c0, 0.d0) + call read_param_mpi(PARAMS,"Flexible_wing","Gravity",grav, (/0.d0, 0.d0, -9.8d0/)) + call read_param_mpi(PARAMS,"Flexible_wing","TimeMethodFlexibleSolid",TimeMethodFlexibleSolid,"EI1") + call read_param_mpi(PARAMS,"Flexible_wing","Sparse_Solver",wings(i)%SparseSolver,"yes") - call read_param_mpi(PARAMS,"Flexible_wing","Rotation_angle_y",wings(i)%Anglewing_y, 0.d0) - call read_param_mpi(PARAMS,"Flexible_wing","Rotation_angle_z",wings(i)%Anglewing_z, 0.d0) + call read_param_mpi(PARAMS,"Flexible_wing","T_release",wings(i)%T_release,0.0d0) + call read_param_mpi(PARAMS,"Flexible_wing","tau",wings(i)%tau,0.0d0) + call read_param_mpi(PARAMS,"Flexible_wing","ControlPoint",wings(i)%ControlPoint,0) + call read_param_mpi(PARAMS,"Flexible_wing","Solid_time_step",wings(i)%dt,1.0d-2) - call read_param_mpi(PARAMS,"Flexible_wing","Motion",wings(i)%Motion,"stationary") + call read_param_mpi(PARAMS,"Flexible_wing","Save_lagrangian_data",wings(i)%save_lagrangian_data,.false.) - call read_param_mpi(PARAMS,"Flexible_wing","Gravity",grav, (/0.d0, 0.d0, -9.8d0/)) ! clean ini file call clean_ini_file_mpi(PARAMS) - !-------------------------------------------------------------------------- - ! Move the wing to the desired position X0 - !-------------------------------------------------------------------------- - ! - ! <--2*delta--><-delta-> - ! O-----O------X-------X---..... - ! |................ - ! |................. - ! |................ - ! x-----x----...... - ! - write(*,*) wings(i)%x(nint(wings(i)%veins_bending_BC(1,2,1))), wings(i)%x(nint(wings(i)%veins_bending_BC(1,3,1))) + wings(i)%x0 = Insect%x0 + if (wings(i)%ID == "left") then + wings(i)%x_pivot_b = Insect%x_pivot_l_b + wings(i)%x_pivot_g = Insect%x_pivot_l_g + elseif (wings(i)%ID == "right") then + wings(i)%x_pivot_b = Insect%x_pivot_r_b + wings(i)%x_pivot_g = Insect%x_pivot_r_g + endif + !----------------------------------------------------------------------------- + ! fetch current motion state + !----------------------------------------------------------------------------- + call BodyMotion (time, Insect) + call StrokePlane (time, Insect) + if (wings(i)%ID == "left") then + call Flexible_wing_motions ( time, wings(i), Insect%kine_wing_l ) + elseif (wings(i)%ID == "right") then + call Flexible_wing_motions ( time, wings(i), Insect%kine_wing_r ) + endif - delta(1) = abs(wings(i)%x(nint(wings(i)%veins_bending_BC(1,3,1))) - & - wings(i)%x(nint(wings(i)%veins_bending_BC(1,2,1)))) - delta(2) = abs(wings(i)%y(nint(wings(i)%veins_bending_BC(1,3,1))) - & - wings(i)%y(nint(wings(i)%veins_bending_BC(1,2,1)))) - delta(3) = abs(wings(i)%z(nint(wings(i)%veins_bending_BC(1,3,1))) - & - wings(i)%z(nint(wings(i)%veins_bending_BC(1,2,1)))) + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + call body_rotation_matrix( Insect, Insect%M_body ) + Insect%M_body_inv = transpose(Insect%M_body) + call MSM_solver_rotation_matrix( Wings(i), wings(i)%M_solver ) + Wings(i)%M_solver_inv = transpose(Wings(i)%M_solver) + call flexible_wing_rotation_matrix( Wings(i), Insect, Wings(i)%M_wing ) + Wings(i)%M_wing_inv = transpose(Wings(i)%M_wing) - wings(i)%x = wings(i)%x + wings(i)%x0 + 2*delta(1) - wings(i)%y = wings(i)%y + wings(i)%y0 + 2*delta(2) - wings(i)%z = wings(i)%z + wings(i)%z0 + 2*delta(3) + !----------------------------------------------------------------------------- + ! rel+abs wing angular velocities in the w/b/g coordinate system + !----------------------------------------------------------------------------- + call flexible_wing_angular_velocities (time, Wings(i), Insect, Insect%M_body ) + call flexible_wing_angular_accel( time, Wings(i), Insect ) - call determine_boundary_points_from_origin(wings(i)) + !-------------------------------------------------------------------------- + ! Move the wing to the desired position X0 + !-------------------------------------------------------------------------- + wings(i)%x(1:wings(i)%np) = wings(i)%u_old(1:wings(i)%np) + wings(i)%y(1:wings(i)%np) = wings(i)%u_old(wings(i)%np+1:2*wings(i)%np) + wings(i)%z(1:wings(i)%np) = wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np) + !call rotate_wing(wings(i)) - ! Update position and phase vector + !call translate_wing(wings(i)) + call rotate_and_translate_wing_into_global_system(wings(i), Insect) + + call construct_total_velocity(wings(i), Insect%M_body, Insect%M_body_inv ) if (root) then - write(*,*) maxval(wings(i)%x), minval(wings(i)%x) - write(*,*) maxval(wings(i)%y), minval(wings(i)%y) - write(*,*) maxval(wings(i)%z), minval(wings(i)%z) - do j=1,nVeins_BC - write(*,*) wings(i)%x_BC(-1,j), wings(i)%x_BC(0,j) - write(*,*) wings(i)%y_BC(-1,j), wings(i)%y_BC(0,j) - write(*,*) wings(i)%z_BC(-1,j), wings(i)%z_BC(0,j) - enddo + write(*,*) maxval(wings(i)%x), minval(wings(i)%x) + write(*,*) maxval(wings(i)%y), minval(wings(i)%y) + write(*,*) maxval(wings(i)%z), minval(wings(i)%z) endif - wings(i)%u_old(1:wings(i)%np) = wings(i)%x(1:wings(i)%np) - wings(i)%u_old(wings(i)%np+1:2*wings(i)%np) = wings(i)%y(1:wings(i)%np) - wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np) = wings(i)%z(1:wings(i)%np) + call determine_boundary_points_from_origin(wings(i)) + + !-------------------------------------------------------------------------- + ! Determine initial geometrical properties of the wings: initial lengths, + ! angles of springs and orientation of the wings + !-------------------------------------------------------------------------- + allocate(normal(1:wings(i)%ntri,1:3)) + do itri=1,wings(i)%ntri + ! Calculate the normal vector of one triangle + normal(itri,1:3) = cross((/wings(i)%x(wings(i)%tri_elements(itri,2)) - & + wings(i)%x(wings(i)%tri_elements(itri,3)), & + wings(i)%y(wings(i)%tri_elements(itri,2)) - & + wings(i)%y(wings(i)%tri_elements(itri,3)), & + wings(i)%z(wings(i)%tri_elements(itri,2)) - & + wings(i)%z(wings(i)%tri_elements(itri,3))/),& + (/wings(i)%x(wings(i)%tri_elements(itri,3)) - & + wings(i)%x(wings(i)%tri_elements(itri,4)), & + wings(i)%y(wings(i)%tri_elements(itri,3)) - & + wings(i)%y(wings(i)%tri_elements(itri,4)), & + wings(i)%z(wings(i)%tri_elements(itri,3)) - & + wings(i)%z(wings(i)%tri_elements(itri,4))/)) + + ! dimentionalized to get a unit vector + wings(i)%tri_element_normals(itri,1) = normal(itri,1)/norm2(normal(itri,1:3)) + wings(i)%tri_element_normals(itri,2) = normal(itri,2)/norm2(normal(itri,1:3)) + wings(i)%tri_element_normals(itri,3) = normal(itri,3)/norm2(normal(itri,1:3)) + + !Calculate area of triangle elements + wings(i)%tri_element_areas(itri) = 0.5*norm2(normal(itri,1:3)) + + ! Check the orientation of the normal vectors comparing with Oz axis. This is + ! done only at the first time step of the simulation. + if (dot_product(wings(i)%tri_element_normals(itri,1:3),(/0.0d0,0.0d0,1.0d0/))<-1.0d-10) then + wings(i)%tri_element_normals(itri,4) = -1 + elseif (dot_product(wings(i)%tri_element_normals(itri,1:3),(/0.0d0,0.0d0,1.0d0/))>1.0d-10) then + wings(i)%tri_element_normals(itri,4) = 1 + !else + ! call abort(1412, "Wing normal vector is perpendicular with the Oz axis. & + ! The wing should be placed on the Oxy plane for the best performance of the solver.") + endif + enddo + deallocate(normal) + do j=1,nMembranes @@ -165,16 +292,26 @@ subroutine init_wings ( fname, wings ) wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np), & wings(i)%membranes_extension(:,:,j)) - wings(i)%membranes_extension(:,4,j) = wings(i)%membranes_extension(:,5,j) + wings(i)%membranes_extension(:,4,j) = 1.0d0*wings(i)%membranes_extension(:,5,j) + enddo + do j=1,nMembranes + call length_calculation_wrapper(wings(i)%u_old(1:wings(i)%np), & + wings(i)%u_old(wings(i)%np+1:2*wings(i)%np), & + wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np), & + wings(i)%membranes_cross(:,:,j)) + + wings(i)%membranes_cross(:,4,j) = 1.0d0*wings(i)%membranes_cross(:,5,j) enddo - call length_calculation_wrapper(wings(i)%u_old(1:wings(i)%np), & + do j=1,nMembrane_edges + call length_calculation_wrapper(wings(i)%u_old(1:wings(i)%np), & wings(i)%u_old(wings(i)%np+1:2*wings(i)%np), & wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np), & - wings(i)%membrane_edge(:,:)) + wings(i)%membrane_edge(:,:,j)) - wings(i)%membrane_edge(:,4) = wings(i)%membrane_edge(:,5) + wings(i)%membrane_edge(:,4,j) = wings(i)%membrane_edge(:,5,j) + enddo do j=1,nVeins @@ -210,6 +347,13 @@ subroutine init_wings ( fname, wings ) wings(i)%veins_bending_BC(1:,6,j) = wings(i)%veins_bending_BC(1:,8,j) end do + call angle_calculation_wrapper(wings(i)%u_old(1:wings(i)%np), & + wings(i)%u_old(wings(i)%np+1:2*wings(i)%np), & + wings(i)%u_old(2*wings(i)%np+1:3*wings(i)%np), & + wings(i)%Joints) + + wings(i)%Joints(1:,5) = wings(i)%Joints(1:,7) + wings(i)%Joints(1:,6) = wings(i)%Joints(1:,8) !-------------------------------------------------------------------------- ! Set up material properties @@ -217,50 +361,101 @@ subroutine init_wings ( fname, wings ) do j=1,nMembranes wings(i)%ke_m(:,j) = wings(i)%ke0_m(j) + do ind=1,nint(maxval(wings(i)%membranes(:,1,j))) + wings(i)%c(nint(wings(i)%membranes(ind,2,j))) = wings(i)%damping_m + enddo + + wings(i)%ke_mc(:,j) = wings(i)%ke0_mc(j) + + if (.not.load_mass_from_file) then do ind=1,nint(maxval(wings(i)%membranes(:,1,j))) wings(i)%m(nint(wings(i)%membranes(ind,2,j))) = wings(i)%rho_m(j) enddo + endif enddo - wings(i)%ke_me(:) = wings(i)%ke0_m(1) + do j=1,nMembrane_edges + wings(i)%ke_me(:,j) = wings(i)%ke0_m(1) + enddo + + if (wings(i)%Young_modulus_given) then + call set_diameters_for_veins(wings(i)%d_veins,wings(i)%d_veins_BC,& + wings(i)%middle_point_indices,wings(i)%middle_point_indices_BC) + endif do j=1,nVeins - call convert_flexural_rigidity_into_spring_stiffness(wings(i)%EIy(j), wings(i)%EIz(j), & + if (wings(i)%Young_modulus_given) then + + call calculate_flexural_rigidity_from_Young_modulus(j,wings(i)%kby(:,j), wings(i)%kbz(:,j), & + wings(i)%E, wings(i)%d_veins(:,j), wings(i)%middle_point_indices(j), wings(i)%veins_extension(1:,:,j)) + else + call convert_flexural_rigidity_into_spring_stiffness(wings(i)%EIy(j)*wings(i)%stiff_coef, & + wings(i)%EIz(j)*wings(i)%stiff_coef, & wings(i)%kby0(j), wings(i)%kbz0(j), & wings(i)%veins_extension(:,:,j)) - wings(i)%kby(:,j) = wings(i)%kby0(j) - wings(i)%kbz(:,j) = wings(i)%kbz0(j) - wings(i)%ke_v(:,j) = wings(i)%ke0_v(j) + wings(i)%kby(:,j) = wings(i)%kby0(j) + wings(i)%kbz(:,j) = wings(i)%kbz0(j) + endif + wings(i)%ke_v(:,j) = wings(i)%ke0_v(j) + if (.not.(load_mass_from_file)) then do ind=1,nint(maxval(wings(i)%veins(:,1,j))) wings(i)%m(nint(wings(i)%veins(ind,2,j))) = wings(i)%rho_v(j) enddo + endif enddo + !HACK + wings(i)%kby(:,24) = 0.0d0 + wings(i)%kbz(:,24) = 0.0d0 + do j=1,nVeins_BC - call convert_flexural_rigidity_into_spring_stiffness(wings(i)%EIy_BC(j), wings(i)%EIz_BC(j), & + + if (wings(i)%Young_modulus_given) then + call calculate_flexural_rigidity_from_Young_modulus(j,wings(i)%kby_BC(1:,j), wings(i)%kbz_BC(1:,j), & + wings(i)%E, wings(i)%d_veins_BC(:,j), wings(i)%middle_point_indices_BC(j), wings(i)%veins_extension_BC(1:,:,j)) + else + call convert_flexural_rigidity_into_spring_stiffness(wings(i)%EIy_BC(j)*wings(i)%stiff_coef, & + wings(i)%EIz_BC(j)*wings(i)%stiff_coef, & wings(i)%kby0_BC(j), wings(i)%kbz0_BC(j), & wings(i)%veins_extension_BC(1:,:,j)) - wings(i)%kby_BC(:,j) = wings(i)%kby0_BC(j) - wings(i)%kbz_BC(:,j) = wings(i)%kbz0_BC(j) + wings(i)%kby_BC(:,j) = wings(i)%kby0_BC(j) + wings(i)%kbz_BC(:,j) = wings(i)%kbz0_BC(j) + endif + wings(i)%ke_vBC(:,j) = wings(i)%ke0_vBC(j) + + if (j==1) then + wings(i)%kby_BC(-1,j) = 50.d0*wings(i)%kby_BC(1,j) + wings(i)%kby_BC(0,j) = 50.d0*wings(i)%kby_BC(1,j) + wings(i)%kbz_BC(-1,j) = 50.d0*wings(i)%kbz_BC(1,j) + wings(i)%kbz_BC(0,j) = 50.d0*wings(i)%kbz_BC(1,j) + else + wings(i)%kby_BC(-1,j) = 10.d0*wings(i)%kby_BC(1,j) + wings(i)%kby_BC(0,j) = 10.d0*wings(i)%kby_BC(1,j) + wings(i)%kbz_BC(-1,j) = 50.d0*wings(i)%kbz_BC(1,j) + wings(i)%kbz_BC(0,j) = 50.d0*wings(i)%kbz_BC(1,j) + endif + + if (.not.load_mass_from_file) then do ind=1,nint(maxval(wings(i)%veins_BC(:,1,j))) wings(i)%m(nint(wings(i)%veins_BC(ind,2,j))) = wings(i)%rho_vBC(j) enddo + endif enddo - - - + call set_stiffness_for_joints(wings(i)) if (mpirank ==0) then write(*,'(80("-"))') write(*,'("Setting up material properties for the wing number ",i2.2," with")') i - write(frmt,'("(",i3.3,"(es12.4,1x))")') wings(i)%np + write(frmt,'("(",i4.4,"(es12.4,1x))")') wings(i)%np write(*,*) "Mass points:" write(*,frmt) wings(i)%m(1:wings(i)%np) + write(*,*) "Damping coeficients:" + write(*,frmt) wings(i)%c(1:wings(i)%np) do j=1,nVeins_BC write(frmt,'("(",i3.3,"(es12.4,1x))")') nint(maxval(wings(i)%veins_bending_BC(:,1,j)))+2 write(*,'("bending stiffness of y-direction bending springs of the vein with BC number ",i2.2,":")',advance='yes') j @@ -281,50 +476,60 @@ subroutine init_wings ( fname, wings ) write(*,'("extension stiffness of extension springs of the vein number ",i2.2,":")') j write(*,frmt) wings(i)%ke_v(1:nint(maxval(wings(i)%veins_extension(:,1,j))),j) enddo - do j=1,nMembranes - write(frmt,'("(",i3.3,"(es12.4,1x))")') nint(maxval(wings(i)%membranes_extension(:,1,j))) - write(*,'("extension stiffness of extension springs of the membrane number ",i2.2,":")',advance='yes') j - write(*,frmt) wings(i)%ke_m(1:nint(maxval(wings(i)%membranes_extension(:,1,j))),j) - enddo + !do j=1,nMembranes + !write(*,*) nint(maxval(wings(i)%membranes_extension(:,1,j))) + ! write(frmt,'("(",i6.6,"(es12.4,1x))")') nint(maxval(wings(i)%membranes_extension(:,1,j))) + ! write(*,'("extension stiffness of extension springs of the membrane number ",i2.2,":")',advance='yes') j + ! write(*,frmt) wings(i)%ke_m(1:nint(maxval(wings(i)%membranes_extension(:,1,j))),j) + !enddo + write(frmt,'("(",i3.3,"(es12.4,1x))")') nint(maxval(wings(i)%Joints(:,1))) + write(*,*) "bending stiffness of y-direction bending springs of the vein connectors:" + write(*,frmt) wings(i)%kby_c(1:nint(maxval(wings(i)%Joints(:,1)))) + write(*,*) "bending stiffness of z-direction bending springs of the vein connectors:" + write(*,frmt) wings(i)%kbz_c(1:nint(maxval(wings(i)%Joints(:,1)))) endif + !------------------------------------------- + ! Initialize files to save MSM solver info + !------------------------------------------- + open (14,file='MSM_solver_info'//wingstr//'.t',status='replace') + write (14,'((A6,1x),5(A15,1x))') "%","time","dt","Iterations","Absolute_error","Relative_error" + close (14) + + if ((root) .and. (i==1)) then + write(*,'(80("<"))') + write(*,*) "Left flexible wing initialization is complete." + write(*,'(80("<"))') + elseif ((root) .and. (i==2)) then + write(*,'(80("<"))') + write(*,*) "Right flexible wing initialization is complete." + write(*,'(80("<"))') + endif - - !if (TimeMethodSolid=="prescribed") then - ! if(mpirank==0) write(*,*) "prescribed deformation: initializing..." - ! call prescribed_wing ( 0.d0, 0.d0, wings(i) ) - !endif - - ! to take static angle into account - !call integrate_position (0.d0, wings(i)) enddo + !------------------------------------------- ! If we resume a backup, read from file (all ranks do that) !------------------------------------------- - !if ( index(inicond,'backup::') /= 0 ) then - ! fname = inicond(index(inicond,'::')+2:index(inicond,'.'))//'fsi_bckp' - ! call read_solid_backup( wings, trim(adjustl(fname)) ) - !endif - - if (root) then - write(*,'(80("<"))') - write(*,*) "Flexible wings initialization is complete." - write(*,'(80("<"))') + if ( index(inicond,'backup::') /= 0 ) then + filename = inicond(index(inicond,'::')+2:index(inicond,'.'))//'fsi_bckp' + call read_flexible_wing_backup( wings, trim(adjustl(filename)) ) endif + end subroutine init_wings -subroutine read_wing_mesh_data(wings, i) +subroutine read_wing_mesh_data(wing, i) use vars implicit none integer, intent(in) :: i !ordinal number of the current wing - type (wing), intent (inout) :: wings !for the ith wing + type(flexible_wing), intent (inout) :: wing !for the ith wing character(len=strlen) :: data_file character(len=1) :: wingstr - integer :: j + integer :: j, np real(kind=pr), allocatable :: tmp2D(:,:) real(kind=pr), allocatable :: tmp1D(:,:) @@ -337,36 +542,37 @@ subroutine read_wing_mesh_data(wings, i) call read_mesh_data_2D_array(data_file, tmp2D) ! Saving number of points - wings%np = nint(maxval(tmp2D(:,1))) + wing%np = nint(maxval(tmp2D(:,1))) + np = wing%np do j=1, nint(maxval(tmp2D(:,1))) - wings%x(j) = tmp2D(j,2)!*2*pi/xl*20 - wings%y(j) = tmp2D(j,3)!*2*pi/yl*20 - wings%z(j) = tmp2D(j,4)!*2*pi/zl + wing%u_old(j) = tmp2D(j,2)!*2*pi/xl*20 + wing%u_old(j + np) = tmp2D(j,4)!*2*pi/yl*20 + wing%u_old(j + 2*np) = tmp2D(j,3)!*2*pi/zl end do deallocate(tmp2D) ! Read indices of three vertices (correnponding to 3rd, 4th and 5tn columms) ! of all triangle elements of the mesh - data_file = 'mesh_triangle_elements'//wingstr//'.dat' + data_file = 'triangle_elements'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) do j=1, size(tmp2D,DIM=1) - wings%tri_elements(j,1) = j - wings%tri_elements(j,2) = int(tmp2D(j,3)) - wings%tri_elements(j,3) = int(tmp2D(j,4)) - wings%tri_elements(j,4) = int(tmp2D(j,5)) + wing%tri_elements(j,1) = j + wing%tri_elements(j,2) = int(tmp2D(j,3)) + wing%tri_elements(j,3) = int(tmp2D(j,4)) + wing%tri_elements(j,4) = int(tmp2D(j,5)) end do deallocate(tmp2D) ! Saving number of triangle elements - wings%ntri = maxval(wings%tri_elements(:,1)) + wing%ntri = maxval(wing%tri_elements(:,1)) ! Read identification numbers of all points belonging to veins data_file = 'veins'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:2,1:nVeins) = & + wing%veins(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:2,1:nVeins) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins)),2,nVeins/)) deallocate(tmp2D) @@ -375,7 +581,7 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'veins_bending'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins_bending(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:8,1:nVeins) = & + wing%veins_bending(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:8,1:nVeins) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins)),8,nVeins/)) deallocate(tmp2D) @@ -384,7 +590,7 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'veins_BC'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:2,1:nVeins_BC) = & + wing%veins_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:2,1:nVeins_BC) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),2,nVeins_BC/)) deallocate(tmp2D) @@ -393,7 +599,7 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'veins_bending_BC'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins_bending_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:8,1:nVeins_BC) = & + wing%veins_bending_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:8,1:nVeins_BC) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),8,nVeins_BC/)) deallocate(tmp2D) @@ -402,7 +608,7 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'veins_extension'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins_extension(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:5,1:nVeins) = & + wing%veins_extension(1:int((size(tmp2D,DIM=1))*(1.0/nVeins)),1:5,1:nVeins) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins)),5,nVeins/)) deallocate(tmp2D) @@ -411,7 +617,7 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'veins_extension_BC'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%veins_extension_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:5,1:nVeins_BC) = & + wing%veins_extension_BC(1:int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),1:5,1:nVeins_BC) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nVeins_BC)),5,nVeins_BC/)) deallocate(tmp2D) @@ -422,8 +628,8 @@ subroutine read_wing_mesh_data(wings, i) call read_mesh_data_1D_array(data_file, tmp1D) do j=1,int((size(tmp1D))) - wings%membranes(j,2,1) = tmp1D(j,1) - wings%membranes(j,1,1) = j + wing%membranes(j,2,1) = tmp1D(j,1) + wing%membranes(j,1,1) = j enddo deallocate(tmp1D) @@ -432,20 +638,107 @@ subroutine read_wing_mesh_data(wings, i) data_file = 'membranes_extension'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%membranes_extension(1:int((size(tmp2D,DIM=1))*(1.0/nMembranes)),1:5,1:nMembranes) = & + wing%membranes_extension(1:int((size(tmp2D,DIM=1))*(1.0/nMembranes)),1:5,1:nMembranes) = & reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nMembranes)),5,nMembranes/)) deallocate(tmp2D) ! Read extension springs information of the edge of the wing - data_file = 'membrane_edge'//wingstr//'.dat' + data_file = 'membranes_edge'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + wing%membrane_edge(1:int((size(tmp2D,DIM=1))*(1.0/nMembrane_edges)),1:5,1:nMembrane_edges) = & + reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nMembrane_edges)),5,nMembrane_edges/)) + + deallocate(tmp2D) + + ! Read extension springs information of the edge of the wing + data_file = 'membranes_cross'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + wing%membranes_cross(1:int((size(tmp2D,DIM=1))*(1.0/nMembranes)),1:5,1:nMembranes) = & + reshape(tmp2D,(/int((size(tmp2D,DIM=1))*(1.0/nMembranes)),5,nMembranes/)) + + deallocate(tmp2D) + + ! Read mass + if (load_mass_from_file) then + data_file = 'mass'//wingstr//'.dat' + call read_mesh_data_1D_array(data_file, tmp1D) + + do j=1,int((size(tmp1D))) + wing%m(j) = wing%m_coef*tmp1D(j,1) + enddo + + deallocate(tmp1D) + endif + + ! Read HB matrix index + if (wing%HB_matrix_given) then + data_file = 'colptr'//wingstr//'.dat' + call read_mesh_data_1D_array(data_file, tmp1D) + + do j=1,int((size(tmp1D))) + wing%colptr(j) = int(tmp1D(j,1)) + enddo + + deallocate(tmp1D) + + data_file = 'rowind'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + do j=1,int((size(tmp2D,DIM=1))) + wing%rowind(j,1) = int(tmp2D(j,1)) + wing%rowind(j,2) = int(tmp2D(j,2)) + enddo + + deallocate(tmp2D) + endif + + ! + if (wing%vein_diameters_given) then + + ! + data_file = 'd_veins_BC'//wingstr//'.dat' call read_mesh_data_2D_array(data_file, tmp2D) - wings%membrane_edge(1:(size(tmp2D,DIM=1)),1:5) = & - reshape(tmp2D,(/(size(tmp2D,DIM=1)),5/)) + wing%d_veins_BC(1:3,1:int((size(tmp2D,DIM=2)))) = tmp2D deallocate(tmp2D) + ! + data_file = 'd_veins'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + wing%d_veins(1:3,1:int((size(tmp2D,DIM=2)))) = tmp2D + + deallocate(tmp2D) + + endif + + ! Read bending springs information of joints + data_file = 'joints'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + wing%Joints(1:int((size(tmp2D,DIM=1))),1:8) = tmp2D + + deallocate(tmp2D) + + ! Read data of which bending springs the stiffness are given + if (wing%OptJoint_stiffness_given) then + + data_file = 'Optimized_joint_IDs'//wingstr//'.dat' + call read_mesh_data_2D_array(data_file, tmp2D) + + do j=1,int((size(tmp2D,DIM=1))) + wing%OptJoint_IDs(j,1) = int(tmp2D(j,1)) + wing%OptJoint_IDs(j,2) = int(tmp2D(j,2)) + wing%OptJoint_IDs(j,3) = int(tmp2D(j,3)) + wing%OptJoint_IDs(j,4) = int(tmp2D(j,4)) + enddo + + deallocate(tmp2D) + endif end subroutine read_wing_mesh_data @@ -474,67 +767,153 @@ subroutine read_mesh_data_2D_array(data_file, data_2D_array) end subroutine read_mesh_data_2D_array -subroutine determine_boundary_points_from_origin(wings) +subroutine determine_boundary_points_from_origin(wing) implicit none - type (wing), intent (inout) :: wings - integer :: i + type(flexible_wing), intent (inout) :: wing + integer :: i, np real(kind=pr), dimension(1:3) :: delta + np = wing%np + ! Calculate the second boundary point for the Leading edge vein from the first ! point which is read from param file since the first point of the LE vein is - ! where we define the root of the wing (x0, y0, z0) - wings%x_BC(-1,1) = wings%x0 - wings%y_BC(-1,1) = wings%y0 - wings%z_BC(-1,1) = wings%z0 + ! where we define the root of the wing at (0, 0, 0) + !wing%x_BC(-1,1) = 0.d0 + !wing%y_BC(-1,1) = 0.d0 + !wing%z_BC(-1,1) = 0.d0 + + !wing%x0_BC(-1,1) = wing%x_BC(-1,1) + !wing%y0_BC(-1,1) = wing%y_BC(-1,1) + !wing%z0_BC(-1,1) = wing%z_BC(-1,1) - wings%x_BC(0,1) = (wings%x0 + wings%x(nint(wings%veins_bending_BC(1,2,1))))/2 - wings%y_BC(0,1) = (wings%y0 + wings%y(nint(wings%veins_bending_BC(1,2,1))))/2 - wings%z_BC(0,1) = (wings%z0 + wings%z(nint(wings%veins_bending_BC(1,2,1))))/2 + !wing%x_BC(0,1) = wing%u_old(nint(wing%veins_bending_BC(1,2,1)))/2 + !wing%y_BC(0,1) = wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + np)/2 + !wing%z_BC(0,1) = wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + 2*np)/2 - wings%veins_extension_BC(0,4,1) = sqrt(((wings%x0 - wings%x(nint(wings%veins_bending_BC(1,2,1))))/2)**2 + & - ((wings%y0 - wings%y(nint(wings%veins_bending_BC(1,2,1))))/2)**2 + & - ((wings%z0 - wings%z(nint(wings%veins_bending_BC(1,2,1))))/2)**2) + !wing%x0_BC(0,1) = wing%x_BC(0,1) + !wing%y0_BC(0,1) = wing%y_BC(0,1) + !wing%z0_BC(0,1) = wing%z_BC(0,1) + + !wing%veins_extension_BC(0,4,1) = sqrt(((wing%u_old(nint(wing%veins_bending_BC(1,2,1))))/2)**2 + & + ! ((wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + np))/2)**2 + & + ! ((wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + 2*np))/2)**2) ! Calculate initial angles - call angle_calculation(wings%x_BC(0,1),wings%x(nint(wings%veins_bending_BC(1,2,1))), & - wings%x(nint(wings%veins_bending_BC(1,3,1))), wings%y_BC(0,1),& - wings%y(nint(wings%veins_bending_BC(1,2,1))),wings%y(nint(wings%veins_bending_BC(1,3,1))), & - wings%z_BC(0,1),wings%z(nint(wings%veins_bending_BC(1,2,1))), & - wings%z(nint(wings%veins_bending_BC(1,3,1))), & - wings%veins_bending_BC(0,5,1),wings%veins_bending_BC(0,6,1)) + !call angle_calculation(wing%x_BC(0,1),wing%u_old(nint(wing%veins_bending_BC(1,2,1))), & + ! wing%u_old(nint(wing%veins_bending_BC(1,3,1))), wing%y_BC(0,1),& + ! wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + np), & + ! wing%u_old(nint(wing%veins_bending_BC(1,3,1)) + np), & + ! wing%z_BC(0,1),wing%u_old(nint(wing%veins_bending_BC(1,2,1)) + 2*np), & + ! wing%u_old(nint(wing%veins_bending_BC(1,3,1)) + 2*np), & + ! wing%veins_bending_BC(0,5,1),wing%veins_bending_BC(0,6,1)) ! Calculate boundary for other veins - do i=2,nVeins_BC + !if (nVeins_BC>1) then + do i=1,nVeins_BC + + delta(1) = wing%u_old(nint(wing%veins_bending_BC(1,3,i))) - & + wing%u_old(nint(wing%veins_bending_BC(1,2,i))) + delta(2) = wing%u_old(nint(wing%veins_bending_BC(1,3,i)) + np) - & + wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + np) + delta(3) = wing%u_old(nint(wing%veins_bending_BC(1,3,i)) + 2*np) - & + wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + 2*np) + + wing%x_BC(-1,i) = wing%u_old(nint(wing%veins_bending_BC(1,2,i))) - 2*delta(1) + wing%y_BC(-1,i) = wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + np) - 2*delta(2) + wing%z_BC(-1,i) = wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + 2*np) - 2*delta(3) + + wing%x0_BC(-1,i) = wing%x_BC(-1,i) + wing%y0_BC(-1,i) = wing%y_BC(-1,i) + wing%z0_BC(-1,i) = wing%z_BC(-1,i) + + wing%x_BC(0,i) = (wing%x_BC(-1,i) + wing%u_old(nint(wing%veins_bending_BC(1,2,i))))/2 + wing%y_BC(0,i) = (wing%y_BC(-1,i) + wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + np))/2 + wing%z_BC(0,i) = (wing%z_BC(-1,i) + wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + 2*np))/2 + + wing%x0_BC(0,i) = wing%x_BC(0,i) + wing%y0_BC(0,i) = wing%y_BC(0,i) + wing%z0_BC(0,i) = wing%z_BC(0,i) + + ! Calculate initial lengths of springs connecting veins with the BC + wing%veins_extension_BC(0,4,i) = sqrt((delta(1))**2 + (delta(2))**2 + (delta(3))**2) + + ! Calculate initial angles + call angle_calculation(wing%x_BC(0,i),wing%u_old(nint(wing%veins_bending_BC(1,2,i))), & + wing%u_old(nint(wing%veins_bending_BC(1,3,i))), wing%y_BC(0,i),& + wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + np),& + wing%u_old(nint(wing%veins_bending_BC(1,3,i)) + np), & + wing%z_BC(0,i),wing%u_old(nint(wing%veins_bending_BC(1,2,i)) + 2*np), & + wing%u_old(nint(wing%veins_bending_BC(1,3,i)) + 2*np), & + wing%veins_bending_BC(0,5,i),wing%veins_bending_BC(0,6,i)) + + + enddo + !endif + +end subroutine - delta(1) = abs(wings%x(nint(wings%veins_bending_BC(1,3,i))) - & - wings%x(nint(wings%veins_bending_BC(1,2,i)))) - delta(2) = abs(wings%y(nint(wings%veins_bending_BC(1,3,i))) - & - wings%y(nint(wings%veins_bending_BC(1,2,i)))) - delta(3) = abs(wings%z(nint(wings%veins_bending_BC(1,3,i))) - & - wings%z(nint(wings%veins_bending_BC(1,2,i)))) +subroutine set_stiffness_for_joints(wing) - wings%x_BC(-1,i) = wings%x(nint(wings%veins_bending_BC(1,2,i))) - 2*delta(1) - wings%y_BC(-1,i) = wings%y(nint(wings%veins_bending_BC(1,2,i))) - 2*delta(2) - wings%z_BC(-1,i) = wings%z(nint(wings%veins_bending_BC(1,2,i))) - 2*delta(3) + implicit none + type(flexible_wing), intent (inout) :: wing + integer :: i, np + real(kind=pr), dimension(1:3) :: delta + + np = wing%np + + ! Calculate boundary for other veins + do i=1,nJoints - wings%x_BC(0,i) = (wings%x_BC(-1,i) + wings%x(nint(wings%veins_bending_BC(1,2,i))))/2 - wings%y_BC(0,i) = (wings%y_BC(-1,i) + wings%y(nint(wings%veins_bending_BC(1,2,i))))/2 - wings%z_BC(0,i) = (wings%z_BC(-1,i) + wings%z(nint(wings%veins_bending_BC(1,2,i))))/2 + if (nint(wing%Joint_stiffness_IDs(i))==0) then - ! Calculate initial lengths of springs connecting veins with the BC - wings%veins_extension_BC(0,4,i) = sqrt((delta(1))**2 + (delta(2))**2 + (delta(3))**2) + wing%kby_c(i) = 0.0d0 + wing%kbz_c(i) = 0.0d0 - ! Calculate initial angles - call angle_calculation(wings%x_BC(0,i),wings%x(nint(wings%veins_bending_BC(1,2,i))), & - wings%x(nint(wings%veins_bending_BC(1,3,i))), wings%y_BC(0,i),& - wings%y(nint(wings%veins_bending_BC(1,2,i))),wings%y(nint(wings%veins_bending_BC(1,3,i))), & - wings%z_BC(0,i),wings%z(nint(wings%veins_bending_BC(1,2,i))), & - wings%z(nint(wings%veins_bending_BC(1,3,i))), & - wings%veins_bending_BC(0,5,i),wings%veins_bending_BC(0,6,i)) + else + wing%kby_c(i) = wing%kby(1,nint(wing%Joint_stiffness_IDs(i))) + wing%kbz_c(i) = wing%kbz(1,nint(wing%Joint_stiffness_IDs(i))) + + endif enddo + if (wing%OptJoint_stiffness_given) then + + !OptJoint_IDs indicates which bending springs are optimized + !First column indicates which joints the bending spring belong to + !Second column indicates which meshing data file of the wing model the + !bending spring belong to + ! 1 is for vein_connectors + ! 2 is for vein_bendings + !Third column indicates which connector/vein the bending spring belong to + !Fourth indicates of which bending spring the optimized stiffness is + + i=1 + + do while (nint(wing%OptJoint_IDs(i,1)) .ne. 0) + + if (nint(wing%OptJoint_IDs(i,2)) == 1) then + + !assign the stiffness for vein_connectors + wing%kby_c(nint(wing%OptJoint_IDs(i,3))) = wing%k_OptJoints(nint(wing%OptJoint_IDs(i,1))) + wing%kbz_c(nint(wing%OptJoint_IDs(i,3))) = wing%k_OptJoints(nint(wing%OptJoint_IDs(i,1))) + + elseif (nint(wing%OptJoint_IDs(i,2)) == 2) then + + !assign the stiffness for vein_bendings + wing%kby(wing%OptJoint_IDs(i,4),wing%OptJoint_IDs(i,3)) = & + wing%k_OptJoints(nint(wing%OptJoint_IDs(i,1))) + wing%kbz(wing%OptJoint_IDs(i,4),wing%OptJoint_IDs(i,3)) = & + wing%k_OptJoints(nint(wing%OptJoint_IDs(i,1))) + + endif + + i=i+1 + enddo + + endif + end subroutine diff --git a/src/flexible_solver/internal_force.f90 b/src/flexible_solver/internal_force.f90 index ec376b9..ee56094 100644 --- a/src/flexible_solver/internal_force.f90 +++ b/src/flexible_solver/internal_force.f90 @@ -8,7 +8,7 @@ subroutine internal_forces_construction(Wings) implicit none -type(Wing), intent(inout) :: Wings +type(flexible_wing), intent(inout) :: Wings integer :: j, np, ind ! Get the number of mass points for the sake of simplicity in coding @@ -24,12 +24,19 @@ subroutine internal_forces_construction(Wings) wings%u_new(2*np+1:3*np), & wings%membranes_extension(:,:,j)) + call length_calculation_wrapper(wings%u_new(1:np), & + wings%u_new(np+1:2*np), & + wings%u_new(2*np+1:3*np), & + wings%membranes_cross(:,:,j)) + enddo - call length_calculation_wrapper(wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%membrane_edge(:,:)) + do j=1,nMembrane_edges + call length_calculation_wrapper(wings%u_new(1:np), & + wings%u_new(np+1:2*np), & + wings%u_new(2*np+1:3*np), & + wings%membrane_edge(:,:,j)) + enddo do j=1,nVeins @@ -55,6 +62,11 @@ subroutine internal_forces_construction(Wings) wings%veins_bending_BC(1:,:,j)) end do + call angle_calculation_wrapper(wings%u_new(1:np), & + wings%u_new(np+1:2*np), & + wings%u_new(2*np+1:3*np), & + wings%Joints(:,:)) + !Construct internal force vector do j=1,nMembranes call internal_extension_force(wings%Fint, & @@ -64,15 +76,25 @@ subroutine internal_forces_construction(Wings) wings%membranes_extension(:,:,j), & np, & wings%ke_m(:,j)) + + call internal_extension_force(wings%Fint, & + wings%u_new(1:np), & + wings%u_new(np+1:2*np), & + wings%u_new(2*np+1:3*np), & + wings%membranes_cross(:,:,j), & + np, & + wings%ke_mc(:,j)) enddo + do j=1,nMembrane_edges call internal_extension_force(wings%Fint, & wings%u_new(1:np), & wings%u_new(np+1:2*np), & wings%u_new(2*np+1:3*np), & - wings%membrane_edge, & + wings%membrane_edge(:,:,j), & np, & - wings%ke_me) + wings%ke_me(:,j)) + enddo do j=1,nVeins call internal_extension_force(wings%Fint, & @@ -107,6 +129,10 @@ subroutine internal_forces_construction(Wings) end do + call internal_bending_force(wings%Fint, & + wings%u_new(1:np),wings%u_new(np+1:2*np),wings%u_new(2*np+1:3*np), & + wings%Joints(1:,1:), np, & + wings%kby_c,wings%kbz_c) end subroutine @@ -483,6 +509,12 @@ subroutine calculate_bending_spring_force( x1, x2, y1, y2, z1, z2, & Fy = - kby*(theta - theta0)*(x2-x1)*idxy +!if ((theta > pi/2.0d0) .or. (theta<(-pi/2.0d0))) then +! Fy = 0.0d0 +!else +! Fy = - kby*(theta - theta0)*(x2-x1)*idxy +!endif + Fz = - kbz*(phi - phi0)*(x2-x1)*idxz end subroutine diff --git a/src/flexible_solver/internal_force_derivative.f90 b/src/flexible_solver/internal_force_derivative.f90 index 7894520..a5a553e 100644 --- a/src/flexible_solver/internal_force_derivative.f90 +++ b/src/flexible_solver/internal_force_derivative.f90 @@ -3,81 +3,130 @@ ! since we use implicit scheme for time stepping !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -subroutine internal_forces_derivatives_construction(Wings) +subroutine internal_forces_derivatives_construction(FJ,wing,dt1) -type(Wing), intent(inout) :: Wings -integer :: np,j, ij +type(flexible_wing), intent(inout) :: wing +real(kind=pr), intent(inout) :: FJ(1:,1:) +real(kind=pr), intent(in) :: dt1 +real(kind=pr), allocatable :: ke_m(:,:), ke_mc(:,:), ke_me(:,:), ke_v(:,:), ke_vBC(:,:) +real(kind=pr), allocatable :: kby(:,:), kbz(:,:), kby_BC(:,:), kbz_BC(:,:), kby_c(:), kbz_c(:) +integer :: np,j + + +if (.not.allocated(ke_m)) allocate(ke_m(size(wing%ke_m,DIM=1),size(wing%ke_m,DIM=2))) +if (.not.allocated(ke_mc)) allocate(ke_mc(size(wing%ke_mc,DIM=1),size(wing%ke_mc,DIM=2))) +if (.not.allocated(ke_me)) allocate(ke_me(size(wing%ke_me,DIM=1),size(wing%ke_me,DIM=2))) +if (.not.allocated(ke_v)) allocate(ke_v(size(wing%ke_v,DIM=1),size(wing%ke_v,DIM=2))) +if (.not.allocated(ke_vBC)) allocate(ke_vBC(size(wing%ke_vBC,DIM=1),size(wing%ke_vBC,DIM=2))) + +if (.not.allocated(kby)) allocate(kby(size(wing%kby,DIM=1),size(wing%kby,DIM=2))) +if (.not.allocated(kbz)) allocate(kbz(size(wing%kbz,DIM=1),size(wing%kbz,DIM=2))) +if (.not.allocated(kby_BC)) allocate(kby_BC(size(wing%kby_BC,DIM=1),size(wing%kby_BC,DIM=2))) +if (.not.allocated(kbz_BC)) allocate(kbz_BC(size(wing%kbz_BC,DIM=1),size(wing%kbz_BC,DIM=2))) +if (.not.allocated(kby_c)) allocate(kby_c(size(wing%kby_c,DIM=1))) +if (.not.allocated(kbz_c)) allocate(kbz_c(size(wing%kbz_c,DIM=1))) ! Get the number of mass points for the sake of simplicity in coding -np = wings%np +np = wing%np +!write(*,*) '------------' +!write(*,*) wing%coef, dt1 +!write(*,*) '------------' -! Initialize -wings%FJ = 0.d0 +! Attention! The Jacobian matrix of force FJ already initialized in external force routine +! wing%FJ = 0.d0 !Construct internal force derivative matrix aka Jacobian matrix do j=1,nMembranes - call internal_extension_force_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%membranes_extension(:,:,j), & - wings%np, & - wings%ke_m(:,j)) + ke_m(:,j) = wing%coef*dt1*wing%ke_m(:,j) + ke_mc(:,j) = wing%coef*dt1*wing%ke_mc(:,j) + + call internal_extension_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%membranes_extension(:,:,j), & + wing%np, ke_m(:,j)) + + call internal_extension_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%membranes_cross(:,:,j), & + wing%np, ke_mc(:,j)) enddo + do j=1,nMembrane_edges + ke_me(:,j) = wing%coef*dt1*wing%ke_me(:,j) - call internal_extension_force_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%membrane_edge, & - wings%np, & - wings%ke_me) - + call internal_extension_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%membrane_edge(:,:,j), & + wing%np, ke_me(:,j)) + enddo do j=1,nVeins - - - call internal_extension_force_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%veins_extension(:,:,j), & - wings%np, & - wings%ke_v(:,j)) - - - call internal_bending_force_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%veins_bending(:,:,j), & - wings%np, & - wings%kby(:,j),wings%kbz(:,j)) + ke_v(:,j) = wing%coef*dt1*wing%ke_v(:,j) + kby(:,j) = wing%coef*dt1*wing%kby(:,j) + kbz(:,j) = wing%coef*dt1*wing%kbz(:,j) + + call internal_extension_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%veins_extension(:,:,j), & + wing%np, ke_v(:,j)) + + + call internal_bending_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%veins_bending(:,:,j), & + wing%np, & + kby(:,j), & + kbz(:,j)) enddo do j=1,nVeins_BC - call internal_extension_force_BC_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%x_BC(0,j), wings%y_BC(0,j), wings%z_BC(0,j), & - wings%veins_extension_BC(:,:,j), & - wings%np, & - wings%ke_vBC(:,j)) - - - call internal_bending_force_BC_derivative(wings%FJ, & - wings%u_new(1:np), & - wings%u_new(np+1:2*np), & - wings%u_new(2*np+1:3*np), & - wings%x_BC(-1:0,j), wings%y_BC(-1:0,j), wings%z_BC(-1:0,j), & - wings%veins_bending_BC(:,:,j), & - wings%np, & - wings%kby_BC(:,j),wings%kbz_BC(:,j)) + ke_vBC(:,j) = wing%coef*dt1*wing%ke_vBC(:,j) + kby_BC(:,j) = wing%coef*dt1*wing%kby_BC(:,j) + kbz_BC(:,j) = wing%coef*dt1*wing%kbz_BC(:,j) + + call internal_extension_force_BC_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%x_BC(0,j), wing%y_BC(0,j), wing%z_BC(0,j), & + wing%veins_extension_BC(:,:,j), & + wing%np, & + ke_vBC(:,j)) + + + call internal_bending_force_BC_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%x_BC(-1:0,j), wing%y_BC(-1:0,j), wing%z_BC(-1:0,j), & + wing%veins_bending_BC(:,:,j), & + wing%np, & + kby_BC(:,j), & + kbz_BC(:,j)) end do + kby_c = wing%coef*dt1*wing%kby_c + kbz_c = wing%coef*dt1*wing%kbz_c + + call internal_bending_force_derivative(FJ, & + wing%u_new(1:np), & + wing%u_new(np+1:2*np), & + wing%u_new(2*np+1:3*np), & + wing%Joints, & + wing%np, & + kby_c, kbz_c) + end subroutine subroutine internal_extension_force_derivative(FJa,x,y,z,extension_springs,np,ke) diff --git a/src/flexible_solver/lapacklu_solver.f90 b/src/flexible_solver/lapacklu_solver.f90 new file mode 100644 index 0000000..40e297f --- /dev/null +++ b/src/flexible_solver/lapacklu_solver.f90 @@ -0,0 +1,110 @@ +module lapacklu_solver + + use vars + implicit none + +contains + +subroutine solve_linear_system_using_schur_complement(du,np,FJ,FJ_ext,m,c,dt,a,b,coef,SparseSolver) + + +! This subroutine solves a linear system under the form +! [ | ] [ ] [ ] +! [ FJ | M ] [ dx ] [ a ] +! [----|------] [----] = [---] +! [ I | c.I ] [ dv ] [ b ] +! [ | ] [ ] [ ] +! where A is an arbitrary matrix deriving from Jacobian matrix getting from +! taking derivatives of all the internal forces, M is the mass and damping +! matrix who MUST be DIAGONAL where M = diag(m) + coef*dt*diag(c), +! I is IDENTICAL matrix, D is IDENTICAL matrix times a CONSTANT COEFFICIENT coef +! determined by the discretization scheme +! ATTENTION to the structure of matrices M, I and D +! a and b are the RHS getting from evaluating the state of the system from +! previous time step. +! x and v and position and velocity vector respectively, and the phase vector is +! defined as u = [x ; v]^T +! +! (FJ-M*c**(-1))*dx = a - M*c**(-1)*b +! du = 1/(c*dt)*(dx - b) + +implicit none + +real(kind=pr), intent(in) :: dt, coef +real(kind=pr), intent(in) :: m(1:), c(1:), a(1:), b(1:) +real(kind=pr), intent(in) :: FJ(1:,1:), FJ_ext(1:,1:) +character, intent(in) :: SparseSolver +integer, intent(in) :: np +real(kind=pr), intent(inout) :: du(1:) +real(kind=pr), allocatable :: y(:), m_array3D(:), c_array3D(:) +real(kind=pr), allocatable :: F(:,:) +real(kind=pr) :: t0 +integer :: i, j, iopt, nnz, info, nrhs_lu, nnz_FJ, nnz_FJext, nnz_pre +integer :: factors(8) +integer, allocatable :: rowind(:), colptr(:) +real(kind=pr), allocatable :: values(:) + + +allocate(y(1:3*np),m_array3D(1:3*np),c_array3D(1:3*np)) +allocate(F(1:3*np,1:3*np)) + +!Initialize F +F = 0.0d0 +y = 0.0d0 + +! Transform the mass array m() into an array (/m,m,m/) corresponding to three dimensions +! x,y and z +m_array3D = (/m,m,m/) +c_array3D = (/c,c,c/) + +!do i=1,3*np +! do j=1,3*np +! if (i .eq. j) then +! F(i,i) = coef*dt*(FJ(i,i)+FJ_ext(i,i)) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) +! y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +! else +! F(i,j) = coef*dt*(FJ(i,j)+FJ_ext(i,j)) +! endif +! enddo +!enddo + + +t0 = MPI_wtime() + F = coef*dt*(FJ+FJ_ext) +call toc("Flexible wing (Construct global jacobian matrix:the remainings)", MPI_wtime() - t0) + +t0 = MPI_wtime() +do i=1,3*np + F(i,i) = F(i,i) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) + y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +enddo +call toc("Flexible wing (Construct global jacobian:diagonal)", MPI_wtime() - t0) + + + if (root) then + write(*,*) "Warning! You are solving the dynamics of the mass-spring system without & + SuperLU solver. This can take forever to run the simulation. It is recommanded & + to model flexible wing with SuperLU solver!" + endif + + + t0 = MPI_wtime() + call solve_linear_system_wing ( F, y, du(1:3*np) ) + call toc("Flexible wing (solve linear system using lu factorization)", MPI_wtime() - t0) + + + + +do i=1,3*np + + du(i + 3*np) = (1/(coef*dt))*(du(i) - b(i)) + +enddo + +deallocate(y) +deallocate(F) + +end subroutine + + +end module lapacklu_solver diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/membrane_edge1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membrane_edge1.dat new file mode 100644 index 0000000..0e3b6f7 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membrane_edge1.dat @@ -0,0 +1,66 @@ +1.0000000000000000e+00 3.6000000000000000e+01 8.3000000000000000e+01 7.1564425815668919e-01 0.0000000000000000e+00 +2.0000000000000000e+00 8.3000000000000000e+01 3.5000000000000000e+01 7.1730990034959718e-01 0.0000000000000000e+00 +3.0000000000000000e+00 3.5000000000000000e+01 8.4000000000000000e+01 7.1942826286487627e-01 0.0000000000000000e+00 +4.0000000000000000e+00 8.4000000000000000e+01 3.4000000000000000e+01 7.1244030574196582e-01 0.0000000000000000e+00 +5.0000000000000000e+00 3.4000000000000000e+01 8.5000000000000000e+01 7.0603866833881901e-01 0.0000000000000000e+00 +6.0000000000000000e+00 8.5000000000000000e+01 3.3000000000000000e+01 6.9421130855893531e-01 0.0000000000000000e+00 +7.0000000000000000e+00 3.3000000000000000e+01 8.6000000000000000e+01 6.8265223172561607e-01 0.0000000000000000e+00 +8.0000000000000000e+00 8.6000000000000000e+01 3.2000000000000000e+01 6.6331801855314887e-01 0.0000000000000000e+00 +9.0000000000000000e+00 3.2000000000000000e+01 8.7000000000000000e+01 6.4421742040373187e-01 0.0000000000000000e+00 +1.0000000000000000e+01 8.7000000000000000e+01 3.1000000000000000e+01 6.2502321995623467e-01 0.0000000000000000e+00 +1.1000000000000000e+01 3.1000000000000000e+01 8.8000000000000000e+01 6.0596793579603991e-01 0.0000000000000000e+00 +1.2000000000000000e+01 8.8000000000000000e+01 3.0000000000000000e+01 5.8547038489736214e-01 0.0000000000000000e+00 +1.3000000000000000e+01 3.0000000000000000e+01 8.9000000000000000e+01 5.6512159795664008e-01 0.0000000000000000e+00 +1.4000000000000000e+01 8.9000000000000000e+01 2.9000000000000000e+01 5.4384512326934276e-01 0.0000000000000000e+00 +1.5000000000000000e+01 2.9000000000000000e+01 9.0000000000000000e+01 5.2268094625861228e-01 0.0000000000000000e+00 +1.6000000000000000e+01 9.0000000000000000e+01 2.8000000000000000e+01 5.0195065136146877e-01 0.0000000000000000e+00 +1.7000000000000000e+01 2.8000000000000000e+01 9.1000000000000000e+01 4.8128755843142262e-01 0.0000000000000000e+00 +1.8000000000000000e+01 9.1000000000000000e+01 2.7000000000000000e+01 4.6144011698665321e-01 0.0000000000000000e+00 +1.9000000000000000e+01 2.7000000000000000e+01 9.2000000000000000e+01 4.4165043033075480e-01 0.0000000000000000e+00 +2.0000000000000000e+01 9.2000000000000000e+01 2.6000000000000000e+01 4.2264883524826830e-01 0.0000000000000000e+00 +2.1000000000000000e+01 2.6000000000000000e+01 9.3000000000000000e+01 4.0374075959723671e-01 0.0000000000000000e+00 +2.2000000000000000e+01 9.3000000000000000e+01 2.5000000000000000e+01 3.8266139948965910e-01 0.0000000000000000e+00 +2.3000000000000000e+01 2.5000000000000000e+01 9.4000000000000000e+01 3.6160881243186682e-01 0.0000000000000000e+00 +2.4000000000000000e+01 9.4000000000000000e+01 2.4000000000000000e+01 3.3768185376877347e-01 0.0000000000000000e+00 +2.5000000000000000e+01 2.4000000000000000e+01 9.5000000000000000e+01 3.1378117345221307e-01 0.0000000000000000e+00 +2.6000000000000000e+01 9.5000000000000000e+01 2.3000000000000000e+01 2.9118656605030152e-01 0.0000000000000000e+00 +2.7000000000000000e+01 2.3000000000000000e+01 9.6000000000000000e+01 2.6863987419982449e-01 0.0000000000000000e+00 +2.8000000000000000e+01 9.6000000000000000e+01 2.2000000000000000e+01 2.6077840918203171e-01 0.0000000000000000e+00 +2.9000000000000000e+01 2.2000000000000000e+01 2.1000000000000000e+01 2.5502377984650859e-01 0.0000000000000000e+00 +3.0000000000000000e+01 2.1000000000000000e+01 2.0000000000000000e+01 2.3563156890941539e-01 0.0000000000000000e+00 +3.1000000000000000e+01 2.0000000000000000e+01 9.7000000000000000e+01 2.1010801187089315e-01 0.0000000000000000e+00 +3.2000000000000000e+01 9.7000000000000000e+01 1.9000000000000000e+01 1.9043181839725082e-01 0.0000000000000000e+00 +3.3000000000000000e+01 1.9000000000000000e+01 9.8000000000000000e+01 1.7095815842751283e-01 0.0000000000000000e+00 +3.4000000000000000e+01 9.8000000000000000e+01 1.8000000000000000e+01 1.5412646076870815e-01 0.0000000000000000e+00 +3.5000000000000000e+01 1.8000000000000000e+01 9.9000000000000000e+01 1.3777491025865332e-01 0.0000000000000000e+00 +3.6000000000000000e+01 9.9000000000000000e+01 1.7000000000000000e+01 1.1864335931124360e-01 0.0000000000000000e+00 +3.7000000000000000e+01 1.7000000000000000e+01 1.0000000000000000e+02 9.9689931944297899e-02 0.0000000000000000e+00 +3.8000000000000000e+01 1.0000000000000000e+02 1.6000000000000000e+01 7.6074775257258448e-02 0.0000000000000000e+00 +3.9000000000000000e+01 1.6000000000000000e+01 1.0100000000000000e+02 5.3721302084922901e-02 0.0000000000000000e+00 +4.0000000000000000e+01 1.0100000000000000e+02 1.5000000000000000e+01 3.6471306464353932e-02 0.0000000000000000e+00 +4.1000000000000000e+01 1.5000000000000000e+01 1.0200000000000000e+02 1.9424334691928488e-02 0.0000000000000000e+00 +4.2000000000000000e+01 1.0200000000000000e+02 1.4000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 +4.3000000000000000e+01 1.4000000000000000e+01 1.3000000000000000e+01 1.9424334691928526e-02 0.0000000000000000e+00 +4.4000000000000000e+01 1.3000000000000000e+01 1.2000000000000000e+01 4.4759242719394361e-02 0.0000000000000000e+00 +4.5000000000000000e+01 1.2000000000000000e+01 1.0300000000000000e+02 7.2815952397876443e-02 0.0000000000000000e+00 +4.6000000000000000e+01 1.0300000000000000e+02 1.1000000000000000e+01 9.2414995467188468e-02 0.0000000000000000e+00 +4.7000000000000000e+01 1.1000000000000000e+01 1.0400000000000000e+02 1.1204917887926054e-01 0.0000000000000000e+00 +4.8000000000000000e+01 1.0400000000000000e+02 1.0000000000000000e+01 1.3417690914956984e-01 0.0000000000000000e+00 +4.9000000000000000e+01 1.0000000000000000e+01 1.0500000000000000e+02 1.5639783849378497e-01 0.0000000000000000e+00 +5.0000000000000000e+01 1.0500000000000000e+02 9.0000000000000000e+00 1.8092172064910456e-01 0.0000000000000000e+00 +5.1000000000000000e+01 9.0000000000000000e+00 1.0600000000000000e+02 2.0554211471055439e-01 0.0000000000000000e+00 +5.2000000000000000e+01 1.0600000000000000e+02 8.0000000000000000e+00 2.3167316924045125e-01 0.0000000000000000e+00 +5.3000000000000000e+01 8.0000000000000000e+00 1.0700000000000000e+02 2.5811027155216254e-01 0.0000000000000000e+00 +5.4000000000000000e+01 1.0700000000000000e+02 7.0000000000000000e+00 2.7685324592738914e-01 0.0000000000000000e+00 +5.5000000000000000e+01 7.0000000000000000e+00 6.0000000000000000e+00 2.9646816711829549e-01 0.0000000000000000e+00 +5.6000000000000000e+01 6.0000000000000000e+00 1.0800000000000000e+02 3.1908312131291783e-01 0.0000000000000000e+00 +5.7000000000000000e+01 1.0800000000000000e+02 5.0000000000000000e+00 3.3702088937482905e-01 0.0000000000000000e+00 +5.8000000000000000e+01 5.0000000000000000e+00 1.0900000000000000e+02 3.5508733346104360e-01 0.0000000000000000e+00 +5.9000000000000000e+01 1.0900000000000000e+02 4.0000000000000000e+00 3.7794804425014444e-01 0.0000000000000000e+00 +6.0000000000000000e+01 4.0000000000000000e+00 1.1000000000000000e+02 4.0102260512145904e-01 0.0000000000000000e+00 +6.1000000000000000e+01 1.1000000000000000e+02 3.0000000000000000e+00 4.1387576189886310e-01 0.0000000000000000e+00 +6.2000000000000000e+01 3.0000000000000000e+00 1.1100000000000000e+02 4.2721895625835210e-01 0.0000000000000000e+00 +6.3000000000000000e+01 1.1100000000000000e+02 2.0000000000000000e+00 4.4296605056927613e-01 0.0000000000000000e+00 +6.4000000000000000e+01 2.0000000000000000e+00 1.1200000000000000e+02 4.5906529392538631e-01 0.0000000000000000e+00 +6.5000000000000000e+01 1.1200000000000000e+02 1.0000000000000000e+00 4.7190738162793472e-01 0.0000000000000000e+00 +6.6000000000000000e+01 1.0000000000000000e+00 5.6000000000000000e+01 4.8501891746382370e-01 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes1.dat new file mode 100755 index 0000000..0fae48a --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes1.dat @@ -0,0 +1,797 @@ +1.0000000000000000e+00 +2.0000000000000000e+00 +3.0000000000000000e+00 +4.0000000000000000e+00 +5.0000000000000000e+00 +6.0000000000000000e+00 +7.0000000000000000e+00 +8.0000000000000000e+00 +9.0000000000000000e+00 +1.0000000000000000e+01 +1.1000000000000000e+01 +1.2000000000000000e+01 +1.3000000000000000e+01 +1.4000000000000000e+01 +1.5000000000000000e+01 +1.6000000000000000e+01 +1.7000000000000000e+01 +1.8000000000000000e+01 +1.9000000000000000e+01 +2.0000000000000000e+01 +2.1000000000000000e+01 +2.2000000000000000e+01 +2.3000000000000000e+01 +2.4000000000000000e+01 +2.5000000000000000e+01 +2.6000000000000000e+01 +2.7000000000000000e+01 +2.8000000000000000e+01 +2.9000000000000000e+01 +3.0000000000000000e+01 +3.1000000000000000e+01 +3.2000000000000000e+01 +3.3000000000000000e+01 +3.4000000000000000e+01 +3.5000000000000000e+01 +8.3000000000000000e+01 +8.4000000000000000e+01 +8.5000000000000000e+01 +8.6000000000000000e+01 +8.7000000000000000e+01 +8.8000000000000000e+01 +8.9000000000000000e+01 +9.0000000000000000e+01 +9.1000000000000000e+01 +9.2000000000000000e+01 +9.3000000000000000e+01 +9.4000000000000000e+01 +9.5000000000000000e+01 +9.6000000000000000e+01 +9.7000000000000000e+01 +9.8000000000000000e+01 +9.9000000000000000e+01 +1.0000000000000000e+02 +1.0100000000000000e+02 +1.0200000000000000e+02 +1.0300000000000000e+02 +1.0400000000000000e+02 +1.0500000000000000e+02 +1.0600000000000000e+02 +1.0700000000000000e+02 +1.0800000000000000e+02 +1.0900000000000000e+02 +1.1000000000000000e+02 +1.1100000000000000e+02 +1.1200000000000000e+02 +1.1300000000000000e+02 +1.1400000000000000e+02 +1.1500000000000000e+02 +1.1600000000000000e+02 +1.1700000000000000e+02 +1.1800000000000000e+02 +1.1900000000000000e+02 +1.2000000000000000e+02 +1.2100000000000000e+02 +1.2200000000000000e+02 +1.2300000000000000e+02 +1.2400000000000000e+02 +1.2500000000000000e+02 +1.2600000000000000e+02 +1.2700000000000000e+02 +1.2800000000000000e+02 +1.2900000000000000e+02 +1.3000000000000000e+02 +1.3100000000000000e+02 +1.3200000000000000e+02 +1.3300000000000000e+02 +1.3400000000000000e+02 +1.3500000000000000e+02 +1.3600000000000000e+02 +1.3700000000000000e+02 +1.3800000000000000e+02 +1.3900000000000000e+02 +1.4000000000000000e+02 +1.4100000000000000e+02 +1.4200000000000000e+02 +1.4300000000000000e+02 +1.4400000000000000e+02 +1.4500000000000000e+02 +1.4600000000000000e+02 +1.4700000000000000e+02 +1.4800000000000000e+02 +1.4900000000000000e+02 +1.5000000000000000e+02 +1.5100000000000000e+02 +1.5200000000000000e+02 +1.5300000000000000e+02 +1.5400000000000000e+02 +1.5500000000000000e+02 +1.5600000000000000e+02 +1.5700000000000000e+02 +1.5800000000000000e+02 +1.5900000000000000e+02 +1.6000000000000000e+02 +1.6100000000000000e+02 +1.6200000000000000e+02 +1.6300000000000000e+02 +1.6400000000000000e+02 +1.6500000000000000e+02 +1.6600000000000000e+02 +1.6700000000000000e+02 +1.6800000000000000e+02 +1.6900000000000000e+02 +1.7000000000000000e+02 +1.7100000000000000e+02 +1.7200000000000000e+02 +1.7300000000000000e+02 +1.7400000000000000e+02 +1.7500000000000000e+02 +1.7600000000000000e+02 +1.7700000000000000e+02 +1.7800000000000000e+02 +1.7900000000000000e+02 +1.8000000000000000e+02 +1.8100000000000000e+02 +1.8200000000000000e+02 +1.8300000000000000e+02 +1.8400000000000000e+02 +1.8500000000000000e+02 +1.8600000000000000e+02 +1.8700000000000000e+02 +1.8800000000000000e+02 +1.8900000000000000e+02 +1.9000000000000000e+02 +1.9100000000000000e+02 +1.9200000000000000e+02 +1.9300000000000000e+02 +1.9400000000000000e+02 +1.9500000000000000e+02 +1.9600000000000000e+02 +1.9700000000000000e+02 +1.9800000000000000e+02 +1.9900000000000000e+02 +2.0000000000000000e+02 +2.0100000000000000e+02 +2.0200000000000000e+02 +2.0300000000000000e+02 +2.0400000000000000e+02 +2.0500000000000000e+02 +2.0600000000000000e+02 +2.0700000000000000e+02 +2.0800000000000000e+02 +2.0900000000000000e+02 +2.1000000000000000e+02 +2.1100000000000000e+02 +2.1200000000000000e+02 +2.1300000000000000e+02 +2.1400000000000000e+02 +2.1500000000000000e+02 +2.1600000000000000e+02 +2.1700000000000000e+02 +2.1800000000000000e+02 +2.1900000000000000e+02 +2.2000000000000000e+02 +2.2100000000000000e+02 +2.2200000000000000e+02 +2.2300000000000000e+02 +2.2400000000000000e+02 +2.2500000000000000e+02 +2.2600000000000000e+02 +2.2700000000000000e+02 +2.2800000000000000e+02 +2.2900000000000000e+02 +2.3000000000000000e+02 +2.3100000000000000e+02 +2.3200000000000000e+02 +2.3300000000000000e+02 +2.3400000000000000e+02 +2.3500000000000000e+02 +2.3600000000000000e+02 +2.3700000000000000e+02 +2.3800000000000000e+02 +2.3900000000000000e+02 +2.4000000000000000e+02 +2.4100000000000000e+02 +2.4200000000000000e+02 +2.4300000000000000e+02 +2.4400000000000000e+02 +2.4500000000000000e+02 +2.4600000000000000e+02 +2.4700000000000000e+02 +2.4800000000000000e+02 +2.4900000000000000e+02 +2.5000000000000000e+02 +2.5100000000000000e+02 +2.5200000000000000e+02 +2.5300000000000000e+02 +2.5400000000000000e+02 +2.5500000000000000e+02 +2.5600000000000000e+02 +2.5700000000000000e+02 +2.5800000000000000e+02 +2.5900000000000000e+02 +2.6000000000000000e+02 +2.6100000000000000e+02 +2.6200000000000000e+02 +2.6300000000000000e+02 +2.6400000000000000e+02 +2.6500000000000000e+02 +2.6600000000000000e+02 +2.6700000000000000e+02 +2.6800000000000000e+02 +2.6900000000000000e+02 +2.7000000000000000e+02 +2.7100000000000000e+02 +2.7200000000000000e+02 +2.7300000000000000e+02 +2.7400000000000000e+02 +2.7500000000000000e+02 +2.7600000000000000e+02 +2.7700000000000000e+02 +2.7800000000000000e+02 +2.7900000000000000e+02 +2.8000000000000000e+02 +2.8100000000000000e+02 +2.8200000000000000e+02 +2.8300000000000000e+02 +2.8400000000000000e+02 +2.8500000000000000e+02 +2.8600000000000000e+02 +2.8700000000000000e+02 +2.8800000000000000e+02 +2.8900000000000000e+02 +2.9000000000000000e+02 +2.9100000000000000e+02 +2.9200000000000000e+02 +2.9300000000000000e+02 +2.9400000000000000e+02 +2.9500000000000000e+02 +2.9600000000000000e+02 +2.9700000000000000e+02 +2.9800000000000000e+02 +2.9900000000000000e+02 +3.0000000000000000e+02 +3.0100000000000000e+02 +3.0200000000000000e+02 +3.0300000000000000e+02 +3.0400000000000000e+02 +3.0500000000000000e+02 +3.0600000000000000e+02 +3.0700000000000000e+02 +3.0800000000000000e+02 +3.0900000000000000e+02 +3.1000000000000000e+02 +3.1100000000000000e+02 +3.1200000000000000e+02 +3.1300000000000000e+02 +3.1400000000000000e+02 +3.1500000000000000e+02 +3.1600000000000000e+02 +3.1700000000000000e+02 +3.1800000000000000e+02 +3.1900000000000000e+02 +3.2000000000000000e+02 +3.2100000000000000e+02 +3.2200000000000000e+02 +3.2300000000000000e+02 +3.2400000000000000e+02 +3.2500000000000000e+02 +3.2600000000000000e+02 +3.2700000000000000e+02 +3.2800000000000000e+02 +3.2900000000000000e+02 +3.3000000000000000e+02 +3.3100000000000000e+02 +3.3200000000000000e+02 +3.3300000000000000e+02 +3.3400000000000000e+02 +3.3500000000000000e+02 +3.3600000000000000e+02 +3.3700000000000000e+02 +3.3800000000000000e+02 +3.3900000000000000e+02 +3.4000000000000000e+02 +3.4100000000000000e+02 +3.4200000000000000e+02 +3.4300000000000000e+02 +3.4400000000000000e+02 +3.4500000000000000e+02 +3.4600000000000000e+02 +3.4700000000000000e+02 +3.4800000000000000e+02 +3.4900000000000000e+02 +3.5000000000000000e+02 +3.5100000000000000e+02 +3.5200000000000000e+02 +3.5300000000000000e+02 +3.5400000000000000e+02 +3.5500000000000000e+02 +3.5600000000000000e+02 +3.5700000000000000e+02 +3.5800000000000000e+02 +3.5900000000000000e+02 +3.6000000000000000e+02 +3.6100000000000000e+02 +3.6200000000000000e+02 +3.6300000000000000e+02 +3.6400000000000000e+02 +3.6500000000000000e+02 +3.6600000000000000e+02 +3.6700000000000000e+02 +3.6800000000000000e+02 +3.6900000000000000e+02 +3.7000000000000000e+02 +3.7100000000000000e+02 +3.7200000000000000e+02 +3.7300000000000000e+02 +3.7400000000000000e+02 +3.7500000000000000e+02 +3.7600000000000000e+02 +3.7700000000000000e+02 +3.7800000000000000e+02 +3.7900000000000000e+02 +3.8000000000000000e+02 +3.8100000000000000e+02 +3.8200000000000000e+02 +3.8300000000000000e+02 +3.8400000000000000e+02 +3.8500000000000000e+02 +3.8600000000000000e+02 +3.8700000000000000e+02 +3.8800000000000000e+02 +3.8900000000000000e+02 +3.9000000000000000e+02 +3.9100000000000000e+02 +3.9200000000000000e+02 +3.9300000000000000e+02 +3.9400000000000000e+02 +3.9500000000000000e+02 +3.9600000000000000e+02 +3.9700000000000000e+02 +3.9800000000000000e+02 +3.9900000000000000e+02 +4.0000000000000000e+02 +4.0100000000000000e+02 +4.0200000000000000e+02 +4.0300000000000000e+02 +4.0400000000000000e+02 +4.0500000000000000e+02 +4.0600000000000000e+02 +4.0700000000000000e+02 +4.0800000000000000e+02 +4.0900000000000000e+02 +4.1000000000000000e+02 +4.1100000000000000e+02 +4.1200000000000000e+02 +4.1300000000000000e+02 +4.1400000000000000e+02 +4.1500000000000000e+02 +4.1600000000000000e+02 +4.1700000000000000e+02 +4.1800000000000000e+02 +4.1900000000000000e+02 +4.2000000000000000e+02 +4.2100000000000000e+02 +4.2200000000000000e+02 +4.2300000000000000e+02 +4.2400000000000000e+02 +4.2500000000000000e+02 +4.2600000000000000e+02 +4.2700000000000000e+02 +4.2800000000000000e+02 +4.2900000000000000e+02 +4.3000000000000000e+02 +4.3100000000000000e+02 +4.3200000000000000e+02 +4.3300000000000000e+02 +4.3400000000000000e+02 +4.3500000000000000e+02 +4.3600000000000000e+02 +4.3700000000000000e+02 +4.3800000000000000e+02 +4.3900000000000000e+02 +4.4000000000000000e+02 +4.4100000000000000e+02 +4.4200000000000000e+02 +4.4300000000000000e+02 +4.4400000000000000e+02 +4.4500000000000000e+02 +4.4600000000000000e+02 +4.4700000000000000e+02 +4.4800000000000000e+02 +4.4900000000000000e+02 +4.5000000000000000e+02 +4.5100000000000000e+02 +4.5200000000000000e+02 +4.5300000000000000e+02 +4.5400000000000000e+02 +4.5500000000000000e+02 +4.5600000000000000e+02 +4.5700000000000000e+02 +4.5800000000000000e+02 +4.5900000000000000e+02 +4.6000000000000000e+02 +4.6100000000000000e+02 +4.6200000000000000e+02 +4.6300000000000000e+02 +4.6400000000000000e+02 +4.6500000000000000e+02 +4.6600000000000000e+02 +4.6700000000000000e+02 +4.6800000000000000e+02 +4.6900000000000000e+02 +4.7000000000000000e+02 +4.7100000000000000e+02 +4.7200000000000000e+02 +4.7300000000000000e+02 +4.7400000000000000e+02 +4.7500000000000000e+02 +4.7600000000000000e+02 +4.7700000000000000e+02 +4.7800000000000000e+02 +4.7900000000000000e+02 +4.8000000000000000e+02 +4.8100000000000000e+02 +4.8200000000000000e+02 +4.8300000000000000e+02 +4.8400000000000000e+02 +4.8500000000000000e+02 +4.8600000000000000e+02 +4.8700000000000000e+02 +4.8800000000000000e+02 +4.8900000000000000e+02 +4.9000000000000000e+02 +4.9100000000000000e+02 +4.9200000000000000e+02 +4.9300000000000000e+02 +4.9400000000000000e+02 +4.9500000000000000e+02 +4.9600000000000000e+02 +4.9700000000000000e+02 +4.9800000000000000e+02 +4.9900000000000000e+02 +5.0000000000000000e+02 +5.0100000000000000e+02 +5.0200000000000000e+02 +5.0300000000000000e+02 +5.0400000000000000e+02 +5.0500000000000000e+02 +5.0600000000000000e+02 +5.0700000000000000e+02 +5.0800000000000000e+02 +5.0900000000000000e+02 +5.1000000000000000e+02 +5.1100000000000000e+02 +5.1200000000000000e+02 +5.1300000000000000e+02 +5.1400000000000000e+02 +5.1500000000000000e+02 +5.1600000000000000e+02 +5.1700000000000000e+02 +5.1800000000000000e+02 +5.1900000000000000e+02 +5.2000000000000000e+02 +5.2100000000000000e+02 +5.2200000000000000e+02 +5.2300000000000000e+02 +5.2400000000000000e+02 +5.2500000000000000e+02 +5.2600000000000000e+02 +5.2700000000000000e+02 +5.2800000000000000e+02 +5.2900000000000000e+02 +5.3000000000000000e+02 +5.3100000000000000e+02 +5.3200000000000000e+02 +5.3300000000000000e+02 +5.3400000000000000e+02 +5.3500000000000000e+02 +5.3600000000000000e+02 +5.3700000000000000e+02 +5.3800000000000000e+02 +5.3900000000000000e+02 +5.4000000000000000e+02 +5.4100000000000000e+02 +5.4200000000000000e+02 +5.4300000000000000e+02 +5.4400000000000000e+02 +5.4500000000000000e+02 +5.4600000000000000e+02 +5.4700000000000000e+02 +5.4800000000000000e+02 +5.4900000000000000e+02 +5.5000000000000000e+02 +5.5100000000000000e+02 +5.5200000000000000e+02 +5.5300000000000000e+02 +5.5400000000000000e+02 +5.5500000000000000e+02 +5.5600000000000000e+02 +5.5700000000000000e+02 +5.5800000000000000e+02 +5.5900000000000000e+02 +5.6000000000000000e+02 +5.6100000000000000e+02 +5.6200000000000000e+02 +5.6300000000000000e+02 +5.6400000000000000e+02 +5.6500000000000000e+02 +5.6600000000000000e+02 +5.6700000000000000e+02 +5.6800000000000000e+02 +5.6900000000000000e+02 +5.7000000000000000e+02 +5.7100000000000000e+02 +5.7200000000000000e+02 +5.7300000000000000e+02 +5.7400000000000000e+02 +5.7500000000000000e+02 +5.7600000000000000e+02 +5.7700000000000000e+02 +5.7800000000000000e+02 +5.7900000000000000e+02 +5.8000000000000000e+02 +5.8100000000000000e+02 +5.8200000000000000e+02 +5.8300000000000000e+02 +5.8400000000000000e+02 +5.8500000000000000e+02 +5.8600000000000000e+02 +5.8700000000000000e+02 +5.8800000000000000e+02 +5.8900000000000000e+02 +5.9000000000000000e+02 +5.9100000000000000e+02 +5.9200000000000000e+02 +5.9300000000000000e+02 +5.9400000000000000e+02 +5.9500000000000000e+02 +5.9600000000000000e+02 +5.9700000000000000e+02 +5.9800000000000000e+02 +5.9900000000000000e+02 +6.0000000000000000e+02 +6.0100000000000000e+02 +6.0200000000000000e+02 +6.0300000000000000e+02 +6.0400000000000000e+02 +6.0500000000000000e+02 +6.0600000000000000e+02 +6.0700000000000000e+02 +6.0800000000000000e+02 +6.0900000000000000e+02 +6.1000000000000000e+02 +6.1100000000000000e+02 +6.1200000000000000e+02 +6.1300000000000000e+02 +6.1400000000000000e+02 +6.1500000000000000e+02 +6.1600000000000000e+02 +6.1700000000000000e+02 +6.1800000000000000e+02 +6.1900000000000000e+02 +6.2000000000000000e+02 +6.2100000000000000e+02 +6.2200000000000000e+02 +6.2300000000000000e+02 +6.2400000000000000e+02 +6.2500000000000000e+02 +6.2600000000000000e+02 +6.2700000000000000e+02 +6.2800000000000000e+02 +6.2900000000000000e+02 +6.3000000000000000e+02 +6.3100000000000000e+02 +6.3200000000000000e+02 +6.3300000000000000e+02 +6.3400000000000000e+02 +6.3500000000000000e+02 +6.3600000000000000e+02 +6.3700000000000000e+02 +6.3800000000000000e+02 +6.3900000000000000e+02 +6.4000000000000000e+02 +6.4100000000000000e+02 +6.4200000000000000e+02 +6.4300000000000000e+02 +6.4400000000000000e+02 +6.4500000000000000e+02 +6.4600000000000000e+02 +6.4700000000000000e+02 +6.4800000000000000e+02 +6.4900000000000000e+02 +6.5000000000000000e+02 +6.5100000000000000e+02 +6.5200000000000000e+02 +6.5300000000000000e+02 +6.5400000000000000e+02 +6.5500000000000000e+02 +6.5600000000000000e+02 +6.5700000000000000e+02 +6.5800000000000000e+02 +6.5900000000000000e+02 +6.6000000000000000e+02 +6.6100000000000000e+02 +6.6200000000000000e+02 +6.6300000000000000e+02 +6.6400000000000000e+02 +6.6500000000000000e+02 +6.6600000000000000e+02 +6.6700000000000000e+02 +6.6800000000000000e+02 +6.6900000000000000e+02 +6.7000000000000000e+02 +6.7100000000000000e+02 +6.7200000000000000e+02 +6.7300000000000000e+02 +6.7400000000000000e+02 +6.7500000000000000e+02 +6.7600000000000000e+02 +6.7700000000000000e+02 +6.7800000000000000e+02 +6.7900000000000000e+02 +6.8000000000000000e+02 +6.8100000000000000e+02 +6.8200000000000000e+02 +6.8300000000000000e+02 +6.8400000000000000e+02 +6.8500000000000000e+02 +6.8600000000000000e+02 +6.8700000000000000e+02 +6.8800000000000000e+02 +6.8900000000000000e+02 +6.9000000000000000e+02 +6.9100000000000000e+02 +6.9200000000000000e+02 +6.9300000000000000e+02 +6.9400000000000000e+02 +6.9500000000000000e+02 +6.9600000000000000e+02 +6.9700000000000000e+02 +6.9800000000000000e+02 +6.9900000000000000e+02 +7.0000000000000000e+02 +7.0100000000000000e+02 +7.0200000000000000e+02 +7.0300000000000000e+02 +7.0400000000000000e+02 +7.0500000000000000e+02 +7.0600000000000000e+02 +7.0700000000000000e+02 +7.0800000000000000e+02 +7.0900000000000000e+02 +7.1000000000000000e+02 +7.1100000000000000e+02 +7.1200000000000000e+02 +7.1300000000000000e+02 +7.1400000000000000e+02 +7.1500000000000000e+02 +7.1600000000000000e+02 +7.1700000000000000e+02 +7.1800000000000000e+02 +7.1900000000000000e+02 +7.2000000000000000e+02 +7.2100000000000000e+02 +7.2200000000000000e+02 +7.2300000000000000e+02 +7.2400000000000000e+02 +7.2500000000000000e+02 +7.2600000000000000e+02 +7.2700000000000000e+02 +7.2800000000000000e+02 +7.2900000000000000e+02 +7.3000000000000000e+02 +7.3100000000000000e+02 +7.3200000000000000e+02 +7.3300000000000000e+02 +7.3400000000000000e+02 +7.3500000000000000e+02 +7.3600000000000000e+02 +7.3700000000000000e+02 +7.3800000000000000e+02 +7.3900000000000000e+02 +7.4000000000000000e+02 +7.4100000000000000e+02 +7.4200000000000000e+02 +7.4300000000000000e+02 +7.4400000000000000e+02 +7.4500000000000000e+02 +7.4600000000000000e+02 +7.4700000000000000e+02 +7.4800000000000000e+02 +7.4900000000000000e+02 +7.5000000000000000e+02 +7.5100000000000000e+02 +7.5200000000000000e+02 +7.5300000000000000e+02 +7.5400000000000000e+02 +7.5500000000000000e+02 +7.5600000000000000e+02 +7.5700000000000000e+02 +7.5800000000000000e+02 +7.5900000000000000e+02 +7.6000000000000000e+02 +7.6100000000000000e+02 +7.6200000000000000e+02 +7.6300000000000000e+02 +7.6400000000000000e+02 +7.6500000000000000e+02 +7.6600000000000000e+02 +7.6700000000000000e+02 +7.6800000000000000e+02 +7.6900000000000000e+02 +7.7000000000000000e+02 +7.7100000000000000e+02 +7.7200000000000000e+02 +7.7300000000000000e+02 +7.7400000000000000e+02 +7.7500000000000000e+02 +7.7600000000000000e+02 +7.7700000000000000e+02 +7.7800000000000000e+02 +7.7900000000000000e+02 +7.8000000000000000e+02 +7.8100000000000000e+02 +7.8200000000000000e+02 +7.8300000000000000e+02 +7.8400000000000000e+02 +7.8500000000000000e+02 +7.8600000000000000e+02 +7.8700000000000000e+02 +7.8800000000000000e+02 +7.8900000000000000e+02 +7.9000000000000000e+02 +7.9100000000000000e+02 +7.9200000000000000e+02 +7.9300000000000000e+02 +7.9400000000000000e+02 +7.9500000000000000e+02 +7.9600000000000000e+02 +7.9700000000000000e+02 +7.9800000000000000e+02 +7.9900000000000000e+02 +8.0000000000000000e+02 +8.0100000000000000e+02 +8.0200000000000000e+02 +8.0300000000000000e+02 +8.0400000000000000e+02 +8.0500000000000000e+02 +8.0600000000000000e+02 +8.0700000000000000e+02 +8.0800000000000000e+02 +8.0900000000000000e+02 +8.1000000000000000e+02 +8.1100000000000000e+02 +8.1200000000000000e+02 +8.1300000000000000e+02 +8.1400000000000000e+02 +8.1500000000000000e+02 +8.1600000000000000e+02 +8.1700000000000000e+02 +8.1800000000000000e+02 +8.1900000000000000e+02 +8.2000000000000000e+02 +8.2100000000000000e+02 +8.2200000000000000e+02 +8.2300000000000000e+02 +8.2400000000000000e+02 +8.2500000000000000e+02 +8.2600000000000000e+02 +8.2700000000000000e+02 +8.2800000000000000e+02 +8.2900000000000000e+02 +8.3000000000000000e+02 +8.3100000000000000e+02 +8.3200000000000000e+02 +8.3300000000000000e+02 +8.3400000000000000e+02 +8.3500000000000000e+02 +8.3600000000000000e+02 +8.3700000000000000e+02 +8.3800000000000000e+02 +8.3900000000000000e+02 +8.4000000000000000e+02 +8.4100000000000000e+02 +8.4200000000000000e+02 +8.4300000000000000e+02 +8.4400000000000000e+02 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes_extension1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes_extension1.dat new file mode 100644 index 0000000..cb6fd04 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/membranes_extension1.dat @@ -0,0 +1,2392 @@ +1.0000000000000000e+00 1.0000000000000000e+00 5.6000000000000000e+01 2.5472664888663885e-02 0.0000000000000000e+00 +2.0000000000000000e+00 1.0000000000000000e+00 1.1200000000000000e+02 1.7192159764180794e-02 0.0000000000000000e+00 +3.0000000000000000e+00 1.0000000000000000e+00 1.1300000000000000e+02 2.4134196740128580e-02 0.0000000000000000e+00 +4.0000000000000000e+00 1.0000000000000000e+00 1.7400000000000000e+02 1.7357220941944616e-02 0.0000000000000000e+00 +5.0000000000000000e+00 2.0000000000000000e+00 1.1100000000000000e+02 2.0237795821088794e-02 0.0000000000000000e+00 +6.0000000000000000e+00 2.0000000000000000e+00 1.1200000000000000e+02 1.7192159764180794e-02 0.0000000000000000e+00 +7.0000000000000000e+00 2.0000000000000000e+00 1.7300000000000000e+02 2.4338604375630787e-02 0.0000000000000000e+00 +8.0000000000000000e+00 2.0000000000000000e+00 2.1700000000000000e+02 2.1067923903513482e-02 0.0000000000000000e+00 +9.0000000000000000e+00 3.0000000000000000e+00 1.1000000000000000e+02 1.9350372478955585e-02 0.0000000000000000e+00 +1.0000000000000000e+01 3.0000000000000000e+00 1.1100000000000000e+02 2.0237795821088977e-02 0.0000000000000000e+00 +1.1000000000000000e+01 3.0000000000000000e+00 1.7200000000000000e+02 2.4870804284460785e-02 0.0000000000000000e+00 +1.2000000000000000e+01 3.0000000000000000e+00 2.1600000000000000e+02 2.2299396697325512e-02 0.0000000000000000e+00 +1.3000000000000000e+01 4.0000000000000000e+00 1.0900000000000000e+02 2.4664710598928493e-02 0.0000000000000000e+00 +1.4000000000000000e+01 4.0000000000000000e+00 1.1000000000000000e+02 1.9350372478955668e-02 0.0000000000000000e+00 +1.5000000000000000e+01 4.0000000000000000e+00 1.7100000000000000e+02 1.9756744520585193e-02 0.0000000000000000e+00 +1.6000000000000000e+01 5.0000000000000000e+00 1.0800000000000000e+02 1.9168893307479111e-02 0.0000000000000000e+00 +1.7000000000000000e+01 5.0000000000000000e+00 1.0900000000000000e+02 2.4664710598928535e-02 0.0000000000000000e+00 +1.8000000000000000e+01 5.0000000000000000e+00 1.7000000000000000e+02 2.6823217395017467e-02 0.0000000000000000e+00 +1.9000000000000000e+01 5.0000000000000000e+00 2.1500000000000000e+02 2.2337142388392028e-02 0.0000000000000000e+00 +2.0000000000000000e+01 6.0000000000000000e+00 7.0000000000000000e+00 2.6084541095514717e-02 0.0000000000000000e+00 +2.1000000000000000e+01 6.0000000000000000e+00 1.0800000000000000e+02 1.9168893307479111e-02 0.0000000000000000e+00 +2.2000000000000000e+01 6.0000000000000000e+00 1.6800000000000000e+02 2.5790695036807532e-02 0.0000000000000000e+00 +2.3000000000000000e+01 6.0000000000000000e+00 1.6900000000000000e+02 2.1289370047771941e-02 0.0000000000000000e+00 +2.4000000000000000e+01 7.0000000000000000e+00 1.0700000000000000e+02 2.4686502730741935e-02 0.0000000000000000e+00 +2.5000000000000000e+01 7.0000000000000000e+00 1.6700000000000000e+02 2.9735606804169055e-02 0.0000000000000000e+00 +2.6000000000000000e+01 7.0000000000000000e+00 1.6800000000000000e+02 2.3632537959434419e-02 0.0000000000000000e+00 +2.7000000000000000e+01 8.0000000000000000e+00 1.0600000000000000e+02 2.7600348807472131e-02 0.0000000000000000e+00 +2.8000000000000000e+01 8.0000000000000000e+00 1.0700000000000000e+02 2.4686502730741976e-02 0.0000000000000000e+00 +2.9000000000000000e+01 8.0000000000000000e+00 1.6600000000000000e+02 2.8137262774918174e-02 0.0000000000000000e+00 +3.0000000000000000e+01 8.0000000000000000e+00 2.1400000000000000e+02 2.2674094400110062e-02 0.0000000000000000e+00 +3.1000000000000000e+01 9.0000000000000000e+00 1.0500000000000000e+02 2.4924955365551886e-02 0.0000000000000000e+00 +3.2000000000000000e+01 9.0000000000000000e+00 1.0600000000000000e+02 2.7600348807472180e-02 0.0000000000000000e+00 +3.3000000000000000e+01 9.0000000000000000e+00 1.6500000000000000e+02 1.9904699118567928e-02 0.0000000000000000e+00 +3.4000000000000000e+01 9.0000000000000000e+00 2.1300000000000000e+02 2.2808779156811444e-02 0.0000000000000000e+00 +3.5000000000000000e+01 1.0000000000000000e+01 1.0400000000000000e+02 2.2454581661442159e-02 0.0000000000000000e+00 +3.6000000000000000e+01 1.0000000000000000e+01 1.0500000000000000e+02 2.4924955365551893e-02 0.0000000000000000e+00 +3.7000000000000000e+01 1.0000000000000000e+01 1.6400000000000000e+02 2.5504999109866606e-02 0.0000000000000000e+00 +3.8000000000000000e+01 1.0000000000000000e+01 2.1200000000000000e+02 2.3813954148581326e-02 0.0000000000000000e+00 +3.9000000000000000e+01 1.1000000000000000e+01 1.0300000000000000e+02 1.9699221262849616e-02 0.0000000000000000e+00 +4.0000000000000000e+01 1.1000000000000000e+01 1.0400000000000000e+02 2.2454581661442215e-02 0.0000000000000000e+00 +4.1000000000000000e+01 1.1000000000000000e+01 1.6300000000000000e+02 2.1562470776097398e-02 0.0000000000000000e+00 +4.2000000000000000e+01 1.1000000000000000e+01 2.1100000000000000e+02 2.1652518242303957e-02 0.0000000000000000e+00 +4.3000000000000000e+01 1.2000000000000000e+01 1.3000000000000000e+01 2.8463567554134941e-02 0.0000000000000000e+00 +4.4000000000000000e+01 1.2000000000000000e+01 1.0300000000000000e+02 1.9699221262849672e-02 0.0000000000000000e+00 +4.5000000000000000e+01 1.2000000000000000e+01 1.6200000000000000e+02 1.9599273446394404e-02 0.0000000000000000e+00 +4.6000000000000000e+01 1.2000000000000000e+01 2.1000000000000000e+02 2.3497589342119703e-02 0.0000000000000000e+00 +4.7000000000000000e+01 1.3000000000000000e+01 1.4000000000000000e+01 2.5528896528182136e-02 0.0000000000000000e+00 +4.8000000000000000e+01 1.3000000000000000e+01 1.6100000000000000e+02 2.6134893385727220e-02 0.0000000000000000e+00 +4.9000000000000000e+01 1.3000000000000000e+01 2.1000000000000000e+02 2.4548867025157226e-02 0.0000000000000000e+00 +5.0000000000000000e+01 1.4000000000000000e+01 1.0200000000000000e+02 1.9424334691928526e-02 0.0000000000000000e+00 +5.1000000000000000e+01 1.4000000000000000e+01 1.6000000000000000e+02 2.2480124065962153e-02 0.0000000000000000e+00 +5.2000000000000000e+01 1.4000000000000000e+01 1.6100000000000000e+02 2.1887507449688787e-02 0.0000000000000000e+00 +5.3000000000000000e+01 1.5000000000000000e+01 1.0100000000000000e+02 1.7363333284394791e-02 0.0000000000000000e+00 +5.4000000000000000e+01 1.5000000000000000e+01 1.0200000000000000e+02 1.9424334691928488e-02 0.0000000000000000e+00 +5.5000000000000000e+01 1.5000000000000000e+01 1.5900000000000000e+02 1.7729162749407827e-02 0.0000000000000000e+00 +5.6000000000000000e+01 1.6000000000000000e+01 1.0000000000000000e+02 2.4993178748145634e-02 0.0000000000000000e+00 +5.7000000000000000e+01 1.6000000000000000e+01 1.0100000000000000e+02 1.7363333284394843e-02 0.0000000000000000e+00 +5.8000000000000000e+01 1.6000000000000000e+01 1.5700000000000000e+02 2.4910220927415062e-02 0.0000000000000000e+00 +5.9000000000000000e+01 1.6000000000000000e+01 1.5800000000000000e+02 2.5587760900004631e-02 0.0000000000000000e+00 +6.0000000000000000e+01 1.6000000000000000e+01 2.0900000000000000e+02 2.6136150536493069e-02 0.0000000000000000e+00 +6.1000000000000000e+01 1.7000000000000000e+01 9.9000000000000000e+01 1.9589729586252547e-02 0.0000000000000000e+00 +6.2000000000000000e+01 1.7000000000000000e+01 1.0000000000000000e+02 2.4993178748145644e-02 0.0000000000000000e+00 +6.3000000000000000e+01 1.7000000000000000e+01 1.5600000000000000e+02 2.3335315818574363e-02 0.0000000000000000e+00 +6.4000000000000000e+01 1.8000000000000000e+01 9.8000000000000000e+01 1.8690719776539706e-02 0.0000000000000000e+00 +6.5000000000000000e+01 1.8000000000000000e+01 9.9000000000000000e+01 1.9589729586252602e-02 0.0000000000000000e+00 +6.6000000000000000e+01 1.8000000000000000e+01 1.5500000000000000e+02 2.2557051713936422e-02 0.0000000000000000e+00 +6.7000000000000000e+01 1.9000000000000000e+01 9.7000000000000000e+01 2.0536719176867332e-02 0.0000000000000000e+00 +6.8000000000000000e+01 1.9000000000000000e+01 9.8000000000000000e+01 1.8690719776539823e-02 0.0000000000000000e+00 +6.9000000000000000e+01 1.9000000000000000e+01 1.5400000000000000e+02 2.1279995900420505e-02 0.0000000000000000e+00 +7.0000000000000000e+01 1.9000000000000000e+01 2.0700000000000000e+02 2.3325785832693836e-02 0.0000000000000000e+00 +7.1000000000000000e+01 2.0000000000000000e+01 2.1000000000000000e+01 3.1952518640213597e-02 0.0000000000000000e+00 +7.2000000000000000e+01 2.0000000000000000e+01 9.7000000000000000e+01 2.0536719176867120e-02 0.0000000000000000e+00 +7.3000000000000000e+01 2.0000000000000000e+01 1.5300000000000000e+02 2.8259598295290952e-02 0.0000000000000000e+00 +7.4000000000000000e+01 2.0000000000000000e+01 2.0800000000000000e+02 2.2856625627222914e-02 0.0000000000000000e+00 +7.5000000000000000e+01 2.1000000000000000e+01 2.2000000000000000e+01 2.7541839732694903e-02 0.0000000000000000e+00 +7.6000000000000000e+01 2.1000000000000000e+01 1.5200000000000000e+02 3.0854784629738119e-02 0.0000000000000000e+00 +7.7000000000000000e+01 2.1000000000000000e+01 1.5300000000000000e+02 2.1605140570137276e-02 0.0000000000000000e+00 +7.8000000000000000e+01 2.2000000000000000e+01 9.6000000000000000e+01 2.4431055096696370e-02 0.0000000000000000e+00 +7.9000000000000000e+01 2.2000000000000000e+01 1.5200000000000000e+02 2.1345039538362844e-02 0.0000000000000000e+00 +8.0000000000000000e+01 2.3000000000000000e+01 9.5000000000000000e+01 2.2877656422940346e-02 0.0000000000000000e+00 +8.1000000000000000e+01 2.3000000000000000e+01 9.6000000000000000e+01 2.4431055096696332e-02 0.0000000000000000e+00 +8.2000000000000000e+01 2.3000000000000000e+01 1.5000000000000000e+02 1.8998609884033364e-02 0.0000000000000000e+00 +8.3000000000000000e+01 2.3000000000000000e+01 1.5100000000000000e+02 2.2199329868590908e-02 0.0000000000000000e+00 +8.4000000000000000e+01 2.3000000000000000e+01 2.0600000000000000e+02 1.9475045117471473e-02 0.0000000000000000e+00 +8.5000000000000000e+01 2.4000000000000000e+01 9.4000000000000000e+01 2.4098644277243984e-02 0.0000000000000000e+00 +8.6000000000000000e+01 2.4000000000000000e+01 9.5000000000000000e+01 2.2877656422940235e-02 0.0000000000000000e+00 +8.7000000000000000e+01 2.4000000000000000e+01 1.4900000000000000e+02 2.3745772106091838e-02 0.0000000000000000e+00 +8.8000000000000000e+01 2.4000000000000000e+01 2.0500000000000000e+02 2.5014810148156888e-02 0.0000000000000000e+00 +8.9000000000000000e+01 2.5000000000000000e+01 9.3000000000000000e+01 2.1307755275600814e-02 0.0000000000000000e+00 +9.0000000000000000e+01 2.5000000000000000e+01 9.4000000000000000e+01 2.4098644277243984e-02 0.0000000000000000e+00 +9.1000000000000000e+01 2.5000000000000000e+01 1.4800000000000000e+02 2.1801947671788870e-02 0.0000000000000000e+00 +9.2000000000000000e+01 2.5000000000000000e+01 2.0400000000000000e+02 2.3639712296529742e-02 0.0000000000000000e+00 +9.3000000000000000e+01 2.6000000000000000e+01 9.2000000000000000e+01 1.9970324209421197e-02 0.0000000000000000e+00 +9.4000000000000000e+01 2.6000000000000000e+01 9.3000000000000000e+01 2.1307755275600939e-02 0.0000000000000000e+00 +9.5000000000000000e+01 2.6000000000000000e+01 1.4700000000000000e+02 2.3557339396902972e-02 0.0000000000000000e+00 +9.6000000000000000e+01 2.6000000000000000e+01 2.0300000000000000e+02 2.3775621968153270e-02 0.0000000000000000e+00 +9.7000000000000000e+01 2.7000000000000000e+01 9.1000000000000000e+01 2.0479909459132976e-02 0.0000000000000000e+00 +9.8000000000000000e+01 2.7000000000000000e+01 9.2000000000000000e+01 1.9970324209421290e-02 0.0000000000000000e+00 +9.9000000000000000e+01 2.7000000000000000e+01 1.4600000000000000e+02 2.2366332115402020e-02 0.0000000000000000e+00 +1.0000000000000000e+02 2.7000000000000000e+01 2.0200000000000000e+02 2.1561098202193998e-02 0.0000000000000000e+00 +1.0100000000000000e+02 2.8000000000000000e+01 9.0000000000000000e+01 2.1496193596458185e-02 0.0000000000000000e+00 +1.0200000000000000e+02 2.8000000000000000e+01 9.1000000000000000e+01 2.0479909459132976e-02 0.0000000000000000e+00 +1.0300000000000000e+02 2.8000000000000000e+01 1.4500000000000000e+02 2.2947013410560907e-02 0.0000000000000000e+00 +1.0400000000000000e+02 2.8000000000000000e+01 2.0100000000000000e+02 2.1730844666843600e-02 0.0000000000000000e+00 +1.0500000000000000e+02 2.9000000000000000e+01 8.9000000000000000e+01 2.2613666787709399e-02 0.0000000000000000e+00 +1.0600000000000000e+02 2.9000000000000000e+01 9.0000000000000000e+01 2.1496193596458091e-02 0.0000000000000000e+00 +1.0700000000000000e+02 2.9000000000000000e+01 1.4400000000000000e+02 2.3371322841991657e-02 0.0000000000000000e+00 +1.0800000000000000e+02 2.9000000000000000e+01 2.0000000000000000e+02 2.2328039907935388e-02 0.0000000000000000e+00 +1.0900000000000000e+02 3.0000000000000000e+01 8.8000000000000000e+01 2.2454582007340799e-02 0.0000000000000000e+00 +1.1000000000000000e+02 3.0000000000000000e+01 8.9000000000000000e+01 2.2613666787709482e-02 0.0000000000000000e+00 +1.1100000000000000e+02 3.0000000000000000e+01 1.4300000000000000e+02 2.2838780981501897e-02 0.0000000000000000e+00 +1.1200000000000000e+02 3.0000000000000000e+01 1.9900000000000000e+02 2.2999651180325143e-02 0.0000000000000000e+00 +1.1300000000000000e+02 3.1000000000000000e+01 8.7000000000000000e+01 2.1274080422342283e-02 0.0000000000000000e+00 +1.1400000000000000e+02 3.1000000000000000e+01 8.8000000000000000e+01 2.2454582007340781e-02 0.0000000000000000e+00 +1.1500000000000000e+02 3.1000000000000000e+01 1.4200000000000000e+02 2.2666218711868726e-02 0.0000000000000000e+00 +1.1600000000000000e+02 3.1000000000000000e+01 1.9800000000000000e+02 2.2134753938362169e-02 0.0000000000000000e+00 +1.1700000000000000e+02 3.2000000000000000e+01 8.6000000000000000e+01 2.2897235172085788e-02 0.0000000000000000e+00 +1.1800000000000000e+02 3.2000000000000000e+01 8.7000000000000000e+01 2.1274080422342623e-02 0.0000000000000000e+00 +1.1900000000000000e+02 3.2000000000000000e+01 1.4100000000000000e+02 2.5635175100697551e-02 0.0000000000000000e+00 +1.2000000000000000e+02 3.2000000000000000e+01 1.9700000000000000e+02 2.1958505864274769e-02 0.0000000000000000e+00 +1.2100000000000000e+02 3.3000000000000000e+01 8.5000000000000000e+01 1.7972045061691685e-02 0.0000000000000000e+00 +1.2200000000000000e+02 3.3000000000000000e+01 8.6000000000000000e+01 2.2897235172085612e-02 0.0000000000000000e+00 +1.2300000000000000e+02 3.3000000000000000e+01 1.4000000000000000e+02 2.0513023764558564e-02 0.0000000000000000e+00 +1.2400000000000000e+02 3.4000000000000000e+01 8.4000000000000000e+01 2.1508697159701318e-02 0.0000000000000000e+00 +1.2500000000000000e+02 3.4000000000000000e+01 8.5000000000000000e+01 1.7972045061691304e-02 0.0000000000000000e+00 +1.2600000000000000e+02 3.4000000000000000e+01 1.3900000000000000e+02 2.0846324911535170e-02 0.0000000000000000e+00 +1.2700000000000000e+02 3.5000000000000000e+01 8.3000000000000000e+01 1.8121028700295305e-02 0.0000000000000000e+00 +1.2800000000000000e+02 3.5000000000000000e+01 8.4000000000000000e+01 2.1508697159701308e-02 0.0000000000000000e+00 +1.2900000000000000e+02 3.5000000000000000e+01 1.3800000000000000e+02 2.0490425692056776e-02 0.0000000000000000e+00 +1.3000000000000000e+02 3.6000000000000000e+01 8.2000000000000000e+01 1.9308643769608065e-02 0.0000000000000000e+00 +1.3100000000000000e+02 3.6000000000000000e+01 8.3000000000000000e+01 1.8121028700295284e-02 0.0000000000000000e+00 +1.3200000000000000e+02 3.6000000000000000e+01 1.3700000000000000e+02 2.0186951927569124e-02 0.0000000000000000e+00 +1.3300000000000000e+02 3.6000000000000000e+01 1.9600000000000000e+02 2.3936287073689846e-02 0.0000000000000000e+00 +1.3400000000000000e+02 3.7000000000000000e+01 8.1000000000000000e+01 2.2358587722609097e-02 0.0000000000000000e+00 +1.3500000000000000e+02 3.7000000000000000e+01 8.2000000000000000e+01 1.9308643769608249e-02 0.0000000000000000e+00 +1.3600000000000000e+02 3.7000000000000000e+01 1.3600000000000000e+02 2.4160940221150902e-02 0.0000000000000000e+00 +1.3700000000000000e+02 3.7000000000000000e+01 1.9500000000000000e+02 1.9615215444348917e-02 0.0000000000000000e+00 +1.3800000000000000e+02 3.8000000000000000e+01 8.0000000000000000e+01 2.2100564041950467e-02 0.0000000000000000e+00 +1.3900000000000000e+02 3.8000000000000000e+01 8.1000000000000000e+01 2.2358587722609097e-02 0.0000000000000000e+00 +1.4000000000000000e+02 3.8000000000000000e+01 1.3500000000000000e+02 2.3117369649426633e-02 0.0000000000000000e+00 +1.4100000000000000e+02 3.8000000000000000e+01 1.9400000000000000e+02 2.0406895597220632e-02 0.0000000000000000e+00 +1.4200000000000000e+02 3.9000000000000000e+01 7.9000000000000000e+01 2.0259925516494772e-02 0.0000000000000000e+00 +1.4300000000000000e+02 3.9000000000000000e+01 8.0000000000000000e+01 2.2100564041950561e-02 0.0000000000000000e+00 +1.4400000000000000e+02 3.9000000000000000e+01 1.3400000000000000e+02 2.3288048681908643e-02 0.0000000000000000e+00 +1.4500000000000000e+02 3.9000000000000000e+01 1.9300000000000000e+02 2.2302661787400847e-02 0.0000000000000000e+00 +1.4600000000000000e+02 4.0000000000000000e+01 7.8000000000000000e+01 2.7306546334010817e-02 0.0000000000000000e+00 +1.4700000000000000e+02 4.0000000000000000e+01 7.9000000000000000e+01 2.0259925516494661e-02 0.0000000000000000e+00 +1.4800000000000000e+02 4.0000000000000000e+01 1.3300000000000000e+02 2.5449852241045744e-02 0.0000000000000000e+00 +1.4900000000000000e+02 4.0000000000000000e+01 1.9200000000000000e+02 2.0865692920938941e-02 0.0000000000000000e+00 +1.5000000000000000e+02 4.1000000000000000e+01 7.7000000000000000e+01 2.7548346315223151e-02 0.0000000000000000e+00 +1.5100000000000000e+02 4.1000000000000000e+01 7.8000000000000000e+01 2.7306546334010817e-02 0.0000000000000000e+00 +1.5200000000000000e+02 4.1000000000000000e+01 1.3100000000000000e+02 2.2969725710976403e-02 0.0000000000000000e+00 +1.5300000000000000e+02 4.1000000000000000e+01 1.3200000000000000e+02 2.4269648761415404e-02 0.0000000000000000e+00 +1.5400000000000000e+02 4.2000000000000000e+01 7.6000000000000000e+01 1.8963112454581529e-02 0.0000000000000000e+00 +1.5500000000000000e+02 4.2000000000000000e+01 7.7000000000000000e+01 2.7548346315222932e-02 0.0000000000000000e+00 +1.5600000000000000e+02 4.2000000000000000e+01 1.3000000000000000e+02 2.6293115336935055e-02 0.0000000000000000e+00 +1.5700000000000000e+02 4.2000000000000000e+01 1.9100000000000000e+02 2.2668359919046938e-02 0.0000000000000000e+00 +1.5800000000000000e+02 4.3000000000000000e+01 7.4000000000000000e+01 2.1007952879184662e-02 0.0000000000000000e+00 +1.5900000000000000e+02 4.3000000000000000e+01 7.5000000000000000e+01 1.8963112454580752e-02 0.0000000000000000e+00 +1.6000000000000000e+02 4.3000000000000000e+01 1.2800000000000000e+02 2.2213231709395206e-02 0.0000000000000000e+00 +1.6100000000000000e+02 4.3000000000000000e+01 1.9000000000000000e+02 2.1660941484957751e-02 0.0000000000000000e+00 +1.6200000000000000e+02 4.4000000000000000e+01 7.2000000000000000e+01 1.9399198689242340e-02 0.0000000000000000e+00 +1.6300000000000000e+02 4.4000000000000000e+01 7.3000000000000000e+01 2.1007952879185544e-02 0.0000000000000000e+00 +1.6400000000000000e+02 4.4000000000000000e+01 1.2700000000000000e+02 2.2081709379608561e-02 0.0000000000000000e+00 +1.6500000000000000e+02 4.4000000000000000e+01 1.8800000000000000e+02 2.1797926716444226e-02 0.0000000000000000e+00 +1.6600000000000000e+02 4.5000000000000000e+01 7.1000000000000000e+01 1.9399198689243217e-02 0.0000000000000000e+00 +1.6700000000000000e+02 4.5000000000000000e+01 1.2500000000000000e+02 2.4327482279085683e-02 0.0000000000000000e+00 +1.6800000000000000e+02 4.5000000000000000e+01 1.8700000000000000e+02 2.0580369616026491e-02 0.0000000000000000e+00 +1.6900000000000000e+02 4.6000000000000000e+01 1.2400000000000000e+02 2.0990655668035971e-02 0.0000000000000000e+00 +1.7000000000000000e+02 4.6000000000000000e+01 1.8600000000000000e+02 2.5120299484254968e-02 0.0000000000000000e+00 +1.7100000000000000e+02 4.7000000000000000e+01 1.2300000000000000e+02 2.1522031271962474e-02 0.0000000000000000e+00 +1.7200000000000000e+02 4.7000000000000000e+01 1.8400000000000000e+02 2.0444412098428344e-02 0.0000000000000000e+00 +1.7300000000000000e+02 4.8000000000000000e+01 1.2100000000000000e+02 2.1873310449758449e-02 0.0000000000000000e+00 +1.7400000000000000e+02 4.8000000000000000e+01 1.8300000000000000e+02 2.2560960366010768e-02 0.0000000000000000e+00 +1.7500000000000000e+02 4.9000000000000000e+01 1.2000000000000000e+02 2.0548599550184465e-02 0.0000000000000000e+00 +1.7600000000000000e+02 4.9000000000000000e+01 1.8100000000000000e+02 2.3640754451479704e-02 0.0000000000000000e+00 +1.7700000000000000e+02 5.0000000000000000e+01 1.1900000000000000e+02 2.1311823708142563e-02 0.0000000000000000e+00 +1.7800000000000000e+02 5.0000000000000000e+01 1.8000000000000000e+02 2.1155220340730863e-02 0.0000000000000000e+00 +1.7900000000000000e+02 5.1000000000000000e+01 1.1800000000000000e+02 2.2929613369388733e-02 0.0000000000000000e+00 +1.8000000000000000e+02 5.1000000000000000e+01 1.7900000000000000e+02 2.0794554631731226e-02 0.0000000000000000e+00 +1.8100000000000000e+02 5.2000000000000000e+01 1.1700000000000000e+02 2.1430521755584853e-02 0.0000000000000000e+00 +1.8200000000000000e+02 5.2000000000000000e+01 1.7800000000000000e+02 2.0998760829095731e-02 0.0000000000000000e+00 +1.8300000000000000e+02 5.3000000000000000e+01 1.1600000000000000e+02 2.1906667255102392e-02 0.0000000000000000e+00 +1.8400000000000000e+02 5.3000000000000000e+01 1.7700000000000000e+02 2.2759443588535645e-02 0.0000000000000000e+00 +1.8500000000000000e+02 5.4000000000000000e+01 1.1500000000000000e+02 2.3973924319967522e-02 0.0000000000000000e+00 +1.8600000000000000e+02 5.4000000000000000e+01 1.7600000000000000e+02 2.3739764951336076e-02 0.0000000000000000e+00 +1.8700000000000000e+02 5.5000000000000000e+01 1.1400000000000000e+02 2.2773026494149369e-02 0.0000000000000000e+00 +1.8800000000000000e+02 5.5000000000000000e+01 1.7500000000000000e+02 2.3974499047530663e-02 0.0000000000000000e+00 +1.8900000000000000e+02 5.6000000000000000e+01 1.1300000000000000e+02 1.8574191954608979e-02 0.0000000000000000e+00 +1.9000000000000000e+02 5.7000000000000000e+01 1.1300000000000000e+02 2.1514186985611750e-02 0.0000000000000000e+00 +1.9100000000000000e+02 5.7000000000000000e+01 1.7500000000000000e+02 1.9579763645659137e-02 0.0000000000000000e+00 +1.9200000000000000e+02 5.8000000000000000e+01 1.1400000000000000e+02 2.3143778158482557e-02 0.0000000000000000e+00 +1.9300000000000000e+02 5.8000000000000000e+01 1.7600000000000000e+02 2.3834734210617305e-02 0.0000000000000000e+00 +1.9400000000000000e+02 5.9000000000000000e+01 1.1500000000000000e+02 2.2603221711244889e-02 0.0000000000000000e+00 +1.9500000000000000e+02 5.9000000000000000e+01 1.7700000000000000e+02 2.2730221008687383e-02 0.0000000000000000e+00 +1.9600000000000000e+02 6.0000000000000000e+01 1.1600000000000000e+02 2.2003569079479205e-02 0.0000000000000000e+00 +1.9700000000000000e+02 6.0000000000000000e+01 1.7800000000000000e+02 2.1805660105845212e-02 0.0000000000000000e+00 +1.9800000000000000e+02 6.1000000000000000e+01 1.1700000000000000e+02 2.1203981378046102e-02 0.0000000000000000e+00 +1.9900000000000000e+02 6.1000000000000000e+01 1.7900000000000000e+02 2.2046226536611667e-02 0.0000000000000000e+00 +2.0000000000000000e+02 6.2000000000000000e+01 1.1800000000000000e+02 2.1701451575192897e-02 0.0000000000000000e+00 +2.0100000000000000e+02 6.2000000000000000e+01 1.8000000000000000e+02 2.2647030009609097e-02 0.0000000000000000e+00 +2.0200000000000000e+02 6.3000000000000000e+01 1.1900000000000000e+02 2.2535643258588693e-02 0.0000000000000000e+00 +2.0300000000000000e+02 6.3000000000000000e+01 1.8100000000000000e+02 2.0896016093325392e-02 0.0000000000000000e+00 +2.0400000000000000e+02 6.4000000000000000e+01 1.2000000000000000e+02 2.2499423608503079e-02 0.0000000000000000e+00 +2.0500000000000000e+02 6.4000000000000000e+01 1.8200000000000000e+02 2.1241799109311673e-02 0.0000000000000000e+00 +2.0600000000000000e+02 6.5000000000000000e+01 1.2100000000000000e+02 2.1489871900248585e-02 0.0000000000000000e+00 +2.0700000000000000e+02 6.5000000000000000e+01 1.8200000000000000e+02 2.2447726396991649e-02 0.0000000000000000e+00 +2.0800000000000000e+02 6.6000000000000000e+01 1.2200000000000000e+02 2.2162931028060228e-02 0.0000000000000000e+00 +2.0900000000000000e+02 6.6000000000000000e+01 1.8300000000000000e+02 2.1599429376748334e-02 0.0000000000000000e+00 +2.1000000000000000e+02 6.7000000000000000e+01 1.2200000000000000e+02 2.1428063888800850e-02 0.0000000000000000e+00 +2.1100000000000000e+02 6.7000000000000000e+01 1.8400000000000000e+02 2.2450269807734392e-02 0.0000000000000000e+00 +2.1200000000000000e+02 6.8000000000000000e+01 1.2300000000000000e+02 2.0944920864493830e-02 0.0000000000000000e+00 +2.1300000000000000e+02 6.8000000000000000e+01 1.8500000000000000e+02 2.2424495723026214e-02 0.0000000000000000e+00 +2.1400000000000000e+02 6.9000000000000000e+01 1.2400000000000000e+02 2.3083899931772362e-02 0.0000000000000000e+00 +2.1500000000000000e+02 6.9000000000000000e+01 1.8500000000000000e+02 2.1554970448312026e-02 0.0000000000000000e+00 +2.1600000000000000e+02 7.0000000000000000e+01 1.2500000000000000e+02 2.2371739708027132e-02 0.0000000000000000e+00 +2.1700000000000000e+02 7.0000000000000000e+01 1.8600000000000000e+02 2.2048599239655034e-02 0.0000000000000000e+00 +2.1800000000000000e+02 7.1000000000000000e+01 7.2000000000000000e+01 1.9399198689242867e-02 0.0000000000000000e+00 +2.1900000000000000e+02 7.1000000000000000e+01 1.2600000000000000e+02 2.1229111265257488e-02 0.0000000000000000e+00 +2.2000000000000000e+02 7.1000000000000000e+01 1.8700000000000000e+02 2.2541675083643752e-02 0.0000000000000000e+00 +2.2100000000000000e+02 7.2000000000000000e+01 1.2600000000000000e+02 2.2058614704964515e-02 0.0000000000000000e+00 +2.2200000000000000e+02 7.2000000000000000e+01 1.8800000000000000e+02 2.1628962717044647e-02 0.0000000000000000e+00 +2.2300000000000000e+02 7.3000000000000000e+01 7.4000000000000000e+01 2.1007952879185637e-02 0.0000000000000000e+00 +2.2400000000000000e+02 7.3000000000000000e+01 1.2700000000000000e+02 2.1434137731254015e-02 0.0000000000000000e+00 +2.2500000000000000e+02 7.3000000000000000e+01 1.8900000000000000e+02 2.2057301849543985e-02 0.0000000000000000e+00 +2.2600000000000000e+02 7.4000000000000000e+01 1.2800000000000000e+02 2.1468215426702259e-02 0.0000000000000000e+00 +2.2700000000000000e+02 7.4000000000000000e+01 1.8900000000000000e+02 2.2023571642165875e-02 0.0000000000000000e+00 +2.2800000000000000e+02 7.5000000000000000e+01 7.6000000000000000e+01 1.8963112454581529e-02 0.0000000000000000e+00 +2.2900000000000000e+02 7.5000000000000000e+01 1.2900000000000000e+02 2.2755165124388521e-02 0.0000000000000000e+00 +2.3000000000000000e+02 7.5000000000000000e+01 1.9000000000000000e+02 2.1811402657495513e-02 0.0000000000000000e+00 +2.3100000000000000e+02 7.6000000000000000e+01 1.2900000000000000e+02 2.2257172860325213e-02 0.0000000000000000e+00 +2.3200000000000000e+02 7.6000000000000000e+01 1.9100000000000000e+02 2.4647149488044081e-02 0.0000000000000000e+00 +2.3300000000000000e+02 7.7000000000000000e+01 1.3000000000000000e+02 2.2325088562687029e-02 0.0000000000000000e+00 +2.3400000000000000e+02 7.7000000000000000e+01 1.3100000000000000e+02 2.4405570038895420e-02 0.0000000000000000e+00 +2.3500000000000000e+02 7.8000000000000000e+01 1.3200000000000000e+02 2.3823039040695038e-02 0.0000000000000000e+00 +2.3600000000000000e+02 7.8000000000000000e+01 1.3300000000000000e+02 2.1985149015433639e-02 0.0000000000000000e+00 +2.3700000000000000e+02 7.9000000000000000e+01 1.3400000000000000e+02 2.1718502845964188e-02 0.0000000000000000e+00 +2.3800000000000000e+02 7.9000000000000000e+01 1.9200000000000000e+02 2.3311741971734530e-02 0.0000000000000000e+00 +2.3900000000000000e+02 8.0000000000000000e+01 1.3500000000000000e+02 2.1544021385472588e-02 0.0000000000000000e+00 +2.4000000000000000e+02 8.0000000000000000e+01 1.9300000000000000e+02 2.2852689343335869e-02 0.0000000000000000e+00 +2.4100000000000000e+02 8.1000000000000000e+01 1.3600000000000000e+02 1.9496838856715392e-02 0.0000000000000000e+00 +2.4200000000000000e+02 8.1000000000000000e+01 1.9400000000000000e+02 2.2707464244133231e-02 0.0000000000000000e+00 +2.4300000000000000e+02 8.2000000000000000e+01 1.3700000000000000e+02 2.0195319966426026e-02 0.0000000000000000e+00 +2.4400000000000000e+02 8.2000000000000000e+01 1.9500000000000000e+02 1.9581740751811069e-02 0.0000000000000000e+00 +2.4500000000000000e+02 8.3000000000000000e+01 1.3800000000000000e+02 2.6996783714740843e-02 0.0000000000000000e+00 +2.4600000000000000e+02 8.3000000000000000e+01 1.9600000000000000e+02 1.9984537287942399e-02 0.0000000000000000e+00 +2.4700000000000000e+02 8.4000000000000000e+01 1.3800000000000000e+02 2.2364634086065899e-02 0.0000000000000000e+00 +2.4800000000000000e+02 8.4000000000000000e+01 1.3900000000000000e+02 2.5859174266251769e-02 0.0000000000000000e+00 +2.4900000000000000e+02 8.5000000000000000e+01 1.3900000000000000e+02 2.4930377371757427e-02 0.0000000000000000e+00 +2.5000000000000000e+02 8.5000000000000000e+01 1.4000000000000000e+02 2.5400125154711767e-02 0.0000000000000000e+00 +2.5100000000000000e+02 8.6000000000000000e+01 1.4000000000000000e+02 2.7677690306606592e-02 0.0000000000000000e+00 +2.5200000000000000e+02 8.6000000000000000e+01 1.4100000000000000e+02 2.0599757644347138e-02 0.0000000000000000e+00 +2.5300000000000000e+02 8.7000000000000000e+01 1.4200000000000000e+02 2.1904445360951593e-02 0.0000000000000000e+00 +2.5400000000000000e+02 8.7000000000000000e+01 1.9700000000000000e+02 2.3135020508979896e-02 0.0000000000000000e+00 +2.5500000000000000e+02 8.8000000000000000e+01 1.4300000000000000e+02 2.1756670041277529e-02 0.0000000000000000e+00 +2.5600000000000000e+02 8.8000000000000000e+01 1.9800000000000000e+02 2.2755277712056075e-02 0.0000000000000000e+00 +2.5700000000000000e+02 8.9000000000000000e+01 1.4400000000000000e+02 2.2515941968164203e-02 0.0000000000000000e+00 +2.5800000000000000e+02 8.9000000000000000e+01 1.9900000000000000e+02 2.2616404510299320e-02 0.0000000000000000e+00 +2.5900000000000000e+02 9.0000000000000000e+01 1.4500000000000000e+02 2.2224500704707311e-02 0.0000000000000000e+00 +2.6000000000000000e+02 9.0000000000000000e+01 2.0000000000000000e+02 2.2310770721394962e-02 0.0000000000000000e+00 +2.6100000000000000e+02 9.1000000000000000e+01 1.4600000000000000e+02 2.1377284217601190e-02 0.0000000000000000e+00 +2.6200000000000000e+02 9.1000000000000000e+01 2.0100000000000000e+02 2.2242820949565086e-02 0.0000000000000000e+00 +2.6300000000000000e+02 9.2000000000000000e+01 1.4700000000000000e+02 2.2606774136568253e-02 0.0000000000000000e+00 +2.6400000000000000e+02 9.2000000000000000e+01 2.0200000000000000e+02 2.3524462036619329e-02 0.0000000000000000e+00 +2.6500000000000000e+02 9.3000000000000000e+01 1.4800000000000000e+02 2.3374544407528196e-02 0.0000000000000000e+00 +2.6600000000000000e+02 9.3000000000000000e+01 2.0300000000000000e+02 2.1605645336800584e-02 0.0000000000000000e+00 +2.6700000000000000e+02 9.4000000000000000e+01 1.4900000000000000e+02 2.3301451722479768e-02 0.0000000000000000e+00 +2.6800000000000000e+02 9.4000000000000000e+01 2.0400000000000000e+02 2.2248381252572662e-02 0.0000000000000000e+00 +2.6900000000000000e+02 9.5000000000000000e+01 1.5000000000000000e+02 2.3419538753983907e-02 0.0000000000000000e+00 +2.7000000000000000e+02 9.5000000000000000e+01 2.0500000000000000e+02 2.0454911403106010e-02 0.0000000000000000e+00 +2.7100000000000000e+02 9.6000000000000000e+01 1.5100000000000000e+02 2.1451694030616222e-02 0.0000000000000000e+00 +2.7200000000000000e+02 9.6000000000000000e+01 1.5200000000000000e+02 2.5348533936726085e-02 0.0000000000000000e+00 +2.7300000000000000e+02 9.7000000000000000e+01 1.5400000000000000e+02 2.2077642501613981e-02 0.0000000000000000e+00 +2.7400000000000000e+02 9.7000000000000000e+01 2.0800000000000000e+02 2.2847496164159219e-02 0.0000000000000000e+00 +2.7500000000000000e+02 9.8000000000000000e+01 1.5500000000000000e+02 2.7949741109519571e-02 0.0000000000000000e+00 +2.7600000000000000e+02 9.8000000000000000e+01 2.0700000000000000e+02 2.1753090147439674e-02 0.0000000000000000e+00 +2.7700000000000000e+02 9.9000000000000000e+01 1.5500000000000000e+02 2.6036738300423880e-02 0.0000000000000000e+00 +2.7800000000000000e+02 9.9000000000000000e+01 1.5600000000000000e+02 2.7264775571997558e-02 0.0000000000000000e+00 +2.7900000000000000e+02 1.0000000000000000e+02 1.5600000000000000e+02 2.7429018270734764e-02 0.0000000000000000e+00 +2.8000000000000000e+02 1.0000000000000000e+02 1.5700000000000000e+02 2.3331595126274963e-02 0.0000000000000000e+00 +2.8100000000000000e+02 1.0100000000000000e+02 1.5800000000000000e+02 2.1501071370158574e-02 0.0000000000000000e+00 +2.8200000000000000e+02 1.0100000000000000e+02 1.5900000000000000e+02 2.4454434940772339e-02 0.0000000000000000e+00 +2.8300000000000000e+02 1.0200000000000000e+02 1.5900000000000000e+02 2.3063552679650611e-02 0.0000000000000000e+00 +2.8400000000000000e+02 1.0200000000000000e+02 1.6000000000000000e+02 2.0882697366077153e-02 0.0000000000000000e+00 +2.8500000000000000e+02 1.0300000000000000e+02 1.6200000000000000e+02 2.3110888254495563e-02 0.0000000000000000e+00 +2.8600000000000000e+02 1.0300000000000000e+02 2.1100000000000000e+02 2.1584061119947217e-02 0.0000000000000000e+00 +2.8700000000000000e+02 1.0400000000000000e+02 1.6300000000000000e+02 2.2301517248854749e-02 0.0000000000000000e+00 +2.8800000000000000e+02 1.0400000000000000e+02 2.1200000000000000e+02 2.2561722834704791e-02 0.0000000000000000e+00 +2.8900000000000000e+02 1.0500000000000000e+02 1.6400000000000000e+02 2.1351646769083556e-02 0.0000000000000000e+00 +2.9000000000000000e+02 1.0500000000000000e+02 1.6500000000000000e+02 2.0515657914581632e-02 0.0000000000000000e+00 +2.9100000000000000e+02 1.0600000000000000e+02 1.6600000000000000e+02 2.2701539989274645e-02 0.0000000000000000e+00 +2.9200000000000000e+02 1.0600000000000000e+02 2.1300000000000000e+02 2.4528136486793490e-02 0.0000000000000000e+00 +2.9300000000000000e+02 1.0700000000000000e+02 1.6700000000000000e+02 2.8017166465817565e-02 0.0000000000000000e+00 +2.9400000000000000e+02 1.0700000000000000e+02 2.1400000000000000e+02 2.1776624922779080e-02 0.0000000000000000e+00 +2.9500000000000000e+02 1.0800000000000000e+02 1.6900000000000000e+02 2.3225778876820397e-02 0.0000000000000000e+00 +2.9600000000000000e+02 1.0800000000000000e+02 2.1500000000000000e+02 2.2960007654669191e-02 0.0000000000000000e+00 +2.9700000000000000e+02 1.0900000000000000e+02 1.7000000000000000e+02 2.2348922058046585e-02 0.0000000000000000e+00 +2.9800000000000000e+02 1.0900000000000000e+02 1.7100000000000000e+02 2.4751906576527184e-02 0.0000000000000000e+00 +2.9900000000000000e+02 1.1000000000000000e+02 1.7100000000000000e+02 2.6166076802328533e-02 0.0000000000000000e+00 +3.0000000000000000e+02 1.1000000000000000e+02 1.7200000000000000e+02 2.2129315957252121e-02 0.0000000000000000e+00 +3.0100000000000000e+02 1.1100000000000000e+02 1.7300000000000000e+02 2.2791662917797412e-02 0.0000000000000000e+00 +3.0200000000000000e+02 1.1100000000000000e+02 2.1600000000000000e+02 2.5078228885698439e-02 0.0000000000000000e+00 +3.0300000000000000e+02 1.1200000000000000e+02 1.7400000000000000e+02 1.7510148087570537e-02 0.0000000000000000e+00 +3.0400000000000000e+02 1.1200000000000000e+02 2.1700000000000000e+02 1.9943777240684180e-02 0.0000000000000000e+00 +3.0500000000000000e+02 1.1300000000000000e+02 1.7400000000000000e+02 1.8542084454807851e-02 0.0000000000000000e+00 +3.0600000000000000e+02 1.1300000000000000e+02 1.7500000000000000e+02 2.1102529008301240e-02 0.0000000000000000e+00 +3.0700000000000000e+02 1.1300000000000000e+02 2.7600000000000000e+02 2.0612369554866641e-02 0.0000000000000000e+00 +3.0800000000000000e+02 1.1400000000000000e+02 1.7500000000000000e+02 2.1251694989945797e-02 0.0000000000000000e+00 +3.0900000000000000e+02 1.1400000000000000e+02 1.7600000000000000e+02 2.1489875623548000e-02 0.0000000000000000e+00 +3.1000000000000000e+02 1.1400000000000000e+02 2.7500000000000000e+02 2.3610056007032310e-02 0.0000000000000000e+00 +3.1100000000000000e+02 1.1400000000000000e+02 2.8700000000000000e+02 2.2388458549841068e-02 0.0000000000000000e+00 +3.1200000000000000e+02 1.1500000000000000e+02 1.7600000000000000e+02 2.1076300373743820e-02 0.0000000000000000e+00 +3.1300000000000000e+02 1.1500000000000000e+02 1.7700000000000000e+02 2.0582300869749461e-02 0.0000000000000000e+00 +3.1400000000000000e+02 1.1500000000000000e+02 2.1800000000000000e+02 2.2348652444575467e-02 0.0000000000000000e+00 +3.1500000000000000e+02 1.1500000000000000e+02 2.9000000000000000e+02 2.2244274647767188e-02 0.0000000000000000e+00 +3.1600000000000000e+02 1.1600000000000000e+02 1.7700000000000000e+02 2.1231013473101929e-02 0.0000000000000000e+00 +3.1700000000000000e+02 1.1600000000000000e+02 1.7800000000000000e+02 2.1323676460204975e-02 0.0000000000000000e+00 +3.1800000000000000e+02 1.1600000000000000e+02 2.1900000000000000e+02 2.2598042950226514e-02 0.0000000000000000e+00 +3.1900000000000000e+02 1.1600000000000000e+02 3.1000000000000000e+02 2.2942361490515154e-02 0.0000000000000000e+00 +3.2000000000000000e+02 1.1700000000000000e+02 1.7800000000000000e+02 2.0656717527428183e-02 0.0000000000000000e+00 +3.2100000000000000e+02 1.1700000000000000e+02 1.7900000000000000e+02 2.0759389423697195e-02 0.0000000000000000e+00 +3.2200000000000000e+02 1.1700000000000000e+02 2.2300000000000000e+02 2.2653624213850553e-02 0.0000000000000000e+00 +3.2300000000000000e+02 1.1700000000000000e+02 3.1500000000000000e+02 2.2527520421432867e-02 0.0000000000000000e+00 +3.2400000000000000e+02 1.1800000000000000e+02 1.7900000000000000e+02 2.1526362963749591e-02 0.0000000000000000e+00 +3.2500000000000000e+02 1.1800000000000000e+02 1.8000000000000000e+02 2.3344634943276606e-02 0.0000000000000000e+00 +3.2600000000000000e+02 1.1800000000000000e+02 2.2000000000000000e+02 2.1614587842477526e-02 0.0000000000000000e+00 +3.2700000000000000e+02 1.1800000000000000e+02 2.9100000000000000e+02 2.2732359880721181e-02 0.0000000000000000e+00 +3.2800000000000000e+02 1.1900000000000000e+02 1.8000000000000000e+02 2.2107407806294579e-02 0.0000000000000000e+00 +3.2900000000000000e+02 1.1900000000000000e+02 1.8100000000000000e+02 2.1183691731509611e-02 0.0000000000000000e+00 +3.3000000000000000e+02 1.1900000000000000e+02 2.2200000000000000e+02 2.2086348772616039e-02 0.0000000000000000e+00 +3.3100000000000000e+02 1.1900000000000000e+02 2.9200000000000000e+02 2.1404871994305980e-02 0.0000000000000000e+00 +3.3200000000000000e+02 1.2000000000000000e+02 1.8100000000000000e+02 2.1195864597078451e-02 0.0000000000000000e+00 +3.3300000000000000e+02 1.2000000000000000e+02 1.8200000000000000e+02 1.9726259334097111e-02 0.0000000000000000e+00 +3.3400000000000000e+02 1.2000000000000000e+02 2.2400000000000000e+02 2.1176729998921520e-02 0.0000000000000000e+00 +3.3500000000000000e+02 1.2000000000000000e+02 2.6000000000000000e+02 2.2477165212378580e-02 0.0000000000000000e+00 +3.3600000000000000e+02 1.2100000000000000e+02 1.8200000000000000e+02 1.9848467983215386e-02 0.0000000000000000e+00 +3.3700000000000000e+02 1.2100000000000000e+02 1.8300000000000000e+02 1.9174307607238063e-02 0.0000000000000000e+00 +3.3800000000000000e+02 1.2100000000000000e+02 2.2100000000000000e+02 2.1949616470546666e-02 0.0000000000000000e+00 +3.3900000000000000e+02 1.2100000000000000e+02 2.9300000000000000e+02 2.2303002917389576e-02 0.0000000000000000e+00 +3.4000000000000000e+02 1.2200000000000000e+02 1.8300000000000000e+02 1.9459005945512458e-02 0.0000000000000000e+00 +3.4100000000000000e+02 1.2200000000000000e+02 1.8400000000000000e+02 2.1095608849220474e-02 0.0000000000000000e+00 +3.4200000000000000e+02 1.2200000000000000e+02 2.2600000000000000e+02 2.1268903669972142e-02 0.0000000000000000e+00 +3.4300000000000000e+02 1.2200000000000000e+02 3.0400000000000000e+02 2.2438973389277962e-02 0.0000000000000000e+00 +3.4400000000000000e+02 1.2300000000000000e+02 1.8400000000000000e+02 2.0043074297864751e-02 0.0000000000000000e+00 +3.4500000000000000e+02 1.2300000000000000e+02 1.8500000000000000e+02 1.9949330277444652e-02 0.0000000000000000e+00 +3.4600000000000000e+02 1.2300000000000000e+02 2.3000000000000000e+02 2.1920437476395768e-02 0.0000000000000000e+00 +3.4700000000000000e+02 1.2300000000000000e+02 3.1600000000000000e+02 2.1081527316100676e-02 0.0000000000000000e+00 +3.4800000000000000e+02 1.2400000000000000e+02 1.8500000000000000e+02 2.0960455234811316e-02 0.0000000000000000e+00 +3.4900000000000000e+02 1.2400000000000000e+02 1.8600000000000000e+02 2.2134764010880961e-02 0.0000000000000000e+00 +3.5000000000000000e+02 1.2400000000000000e+02 2.2700000000000000e+02 2.1828746505259584e-02 0.0000000000000000e+00 +3.5100000000000000e+02 1.2400000000000000e+02 2.9400000000000000e+02 2.3497410111816591e-02 0.0000000000000000e+00 +3.5200000000000000e+02 1.2500000000000000e+02 1.8600000000000000e+02 2.3679603053639902e-02 0.0000000000000000e+00 +3.5300000000000000e+02 1.2500000000000000e+02 1.8700000000000000e+02 2.2704002588313798e-02 0.0000000000000000e+00 +3.5400000000000000e+02 1.2500000000000000e+02 2.2900000000000000e+02 2.3214618517868279e-02 0.0000000000000000e+00 +3.5500000000000000e+02 1.2500000000000000e+02 2.3200000000000000e+02 2.3364112443308594e-02 0.0000000000000000e+00 +3.5600000000000000e+02 1.2600000000000000e+02 1.8700000000000000e+02 2.0654315415892893e-02 0.0000000000000000e+00 +3.5700000000000000e+02 1.2600000000000000e+02 1.8800000000000000e+02 2.0135785515469313e-02 0.0000000000000000e+00 +3.5800000000000000e+02 1.2600000000000000e+02 2.2500000000000000e+02 2.3136280254054543e-02 0.0000000000000000e+00 +3.5900000000000000e+02 1.2600000000000000e+02 2.3100000000000000e+02 2.1764963559479135e-02 0.0000000000000000e+00 +3.6000000000000000e+02 1.2700000000000000e+02 1.8800000000000000e+02 2.0325521673927996e-02 0.0000000000000000e+00 +3.6100000000000000e+02 1.2700000000000000e+02 1.8900000000000000e+02 2.0375340029580184e-02 0.0000000000000000e+00 +3.6200000000000000e+02 1.2700000000000000e+02 2.2800000000000000e+02 2.1638936932588549e-02 0.0000000000000000e+00 +3.6300000000000000e+02 1.2700000000000000e+02 2.9600000000000000e+02 2.2194322548448098e-02 0.0000000000000000e+00 +3.6400000000000000e+02 1.2800000000000000e+02 1.8900000000000000e+02 2.0199435511332093e-02 0.0000000000000000e+00 +3.6500000000000000e+02 1.2800000000000000e+02 1.9000000000000000e+02 1.9946235845154949e-02 0.0000000000000000e+00 +3.6600000000000000e+02 1.2800000000000000e+02 2.3400000000000000e+02 2.2515265894384108e-02 0.0000000000000000e+00 +3.6700000000000000e+02 1.2800000000000000e+02 2.9500000000000000e+02 2.2479541947601038e-02 0.0000000000000000e+00 +3.6800000000000000e+02 1.2900000000000000e+02 1.9000000000000000e+02 1.9744739759593195e-02 0.0000000000000000e+00 +3.6900000000000000e+02 1.2900000000000000e+02 1.9100000000000000e+02 2.0872556430207724e-02 0.0000000000000000e+00 +3.7000000000000000e+02 1.2900000000000000e+02 2.3500000000000000e+02 2.1549283637771633e-02 0.0000000000000000e+00 +3.7100000000000000e+02 1.2900000000000000e+02 2.9700000000000000e+02 2.2460077000012742e-02 0.0000000000000000e+00 +3.7200000000000000e+02 1.3000000000000000e+02 1.3100000000000000e+02 2.5288084252800571e-02 0.0000000000000000e+00 +3.7300000000000000e+02 1.3000000000000000e+02 1.9100000000000000e+02 2.1779077190408214e-02 0.0000000000000000e+00 +3.7400000000000000e+02 1.3000000000000000e+02 2.3600000000000000e+02 2.2032755156542044e-02 0.0000000000000000e+00 +3.7500000000000000e+02 1.3000000000000000e+02 2.9800000000000000e+02 2.3949822254158405e-02 0.0000000000000000e+00 +3.7600000000000000e+02 1.3100000000000000e+02 1.3200000000000000e+02 2.5046485538516867e-02 0.0000000000000000e+00 +3.7700000000000000e+02 1.3100000000000000e+02 2.7700000000000000e+02 2.4258225709128788e-02 0.0000000000000000e+00 +3.7800000000000000e+02 1.3100000000000000e+02 2.9800000000000000e+02 2.3600105977154354e-02 0.0000000000000000e+00 +3.7900000000000000e+02 1.3200000000000000e+02 1.3300000000000000e+02 2.3910379682004494e-02 0.0000000000000000e+00 +3.8000000000000000e+02 1.3200000000000000e+02 2.7700000000000000e+02 2.3954181155947555e-02 0.0000000000000000e+00 +3.8100000000000000e+02 1.3200000000000000e+02 2.7800000000000000e+02 2.2575619371479793e-02 0.0000000000000000e+00 +3.8200000000000000e+02 1.3300000000000000e+02 1.9200000000000000e+02 2.2857855393631988e-02 0.0000000000000000e+00 +3.8300000000000000e+02 1.3300000000000000e+02 2.3700000000000000e+02 2.2329132106770389e-02 0.0000000000000000e+00 +3.8400000000000000e+02 1.3300000000000000e+02 2.7800000000000000e+02 2.3866390009642427e-02 0.0000000000000000e+00 +3.8500000000000000e+02 1.3400000000000000e+02 1.9200000000000000e+02 2.1190533172464943e-02 0.0000000000000000e+00 +3.8600000000000000e+02 1.3400000000000000e+02 1.9300000000000000e+02 2.0307064715819646e-02 0.0000000000000000e+00 +3.8700000000000000e+02 1.3400000000000000e+02 2.7900000000000000e+02 2.2323823859738887e-02 0.0000000000000000e+00 +3.8800000000000000e+02 1.3400000000000000e+02 3.0000000000000000e+02 2.3086384718233117e-02 0.0000000000000000e+00 +3.8900000000000000e+02 1.3500000000000000e+02 1.9300000000000000e+02 2.1075268993537177e-02 0.0000000000000000e+00 +3.9000000000000000e+02 1.3500000000000000e+02 1.9400000000000000e+02 2.0942248076890924e-02 0.0000000000000000e+00 +3.9100000000000000e+02 1.3500000000000000e+02 2.4000000000000000e+02 2.1983947913635733e-02 0.0000000000000000e+00 +3.9200000000000000e+02 1.3500000000000000e+02 2.4200000000000000e+02 2.2886742661006512e-02 0.0000000000000000e+00 +3.9300000000000000e+02 1.3600000000000000e+02 1.9400000000000000e+02 2.0023092357539084e-02 0.0000000000000000e+00 +3.9400000000000000e+02 1.3600000000000000e+02 1.9500000000000000e+02 1.9331339427885758e-02 0.0000000000000000e+00 +3.9500000000000000e+02 1.3600000000000000e+02 2.3300000000000000e+02 2.2408789680663867e-02 0.0000000000000000e+00 +3.9600000000000000e+02 1.3600000000000000e+02 2.4100000000000000e+02 2.0067486512426853e-02 0.0000000000000000e+00 +3.9700000000000000e+02 1.3700000000000000e+02 1.9500000000000000e+02 1.9295327975864359e-02 0.0000000000000000e+00 +3.9800000000000000e+02 1.3700000000000000e+02 1.9600000000000000e+02 1.8672824024650172e-02 0.0000000000000000e+00 +3.9900000000000000e+02 1.3700000000000000e+02 2.3800000000000000e+02 1.7115885469278412e-02 0.0000000000000000e+00 +4.0000000000000000e+02 1.3700000000000000e+02 2.9900000000000000e+02 2.0247960218638412e-02 0.0000000000000000e+00 +4.0100000000000000e+02 1.3800000000000000e+02 1.3900000000000000e+02 2.8868289942484651e-02 0.0000000000000000e+00 +4.0200000000000000e+02 1.3800000000000000e+02 1.9600000000000000e+02 2.1878252686392208e-02 0.0000000000000000e+00 +4.0300000000000000e+02 1.3800000000000000e+02 2.4300000000000000e+02 2.1873409955236719e-02 0.0000000000000000e+00 +4.0400000000000000e+02 1.3800000000000000e+02 3.0100000000000000e+02 2.2843451107289258e-02 0.0000000000000000e+00 +4.0500000000000000e+02 1.3900000000000000e+02 1.4000000000000000e+02 2.9416334244191628e-02 0.0000000000000000e+00 +4.0600000000000000e+02 1.3900000000000000e+02 2.8000000000000000e+02 2.3810042817744820e-02 0.0000000000000000e+00 +4.0700000000000000e+02 1.3900000000000000e+02 3.0100000000000000e+02 1.9730170822701534e-02 0.0000000000000000e+00 +4.0800000000000000e+02 1.4000000000000000e+02 1.4100000000000000e+02 2.5358814391968531e-02 0.0000000000000000e+00 +4.0900000000000000e+02 1.4000000000000000e+02 2.4600000000000000e+02 2.2734522047521105e-02 0.0000000000000000e+00 +4.1000000000000000e+02 1.4000000000000000e+02 2.8000000000000000e+02 2.4290026946200506e-02 0.0000000000000000e+00 +4.1100000000000000e+02 1.4100000000000000e+02 1.9700000000000000e+02 2.2789635399508932e-02 0.0000000000000000e+00 +4.1200000000000000e+02 1.4100000000000000e+02 2.4600000000000000e+02 2.2610319694689154e-02 0.0000000000000000e+00 +4.1300000000000000e+02 1.4100000000000000e+02 3.0200000000000000e+02 2.1748681152540306e-02 0.0000000000000000e+00 +4.1400000000000000e+02 1.4200000000000000e+02 1.9700000000000000e+02 2.1724787421548864e-02 0.0000000000000000e+00 +4.1500000000000000e+02 1.4200000000000000e+02 1.9800000000000000e+02 2.0950958571873939e-02 0.0000000000000000e+00 +4.1600000000000000e+02 1.4200000000000000e+02 2.4400000000000000e+02 2.1862785158796940e-02 0.0000000000000000e+00 +4.1700000000000000e+02 1.4200000000000000e+02 2.4900000000000000e+02 2.3280424433309754e-02 0.0000000000000000e+00 +4.1800000000000000e+02 1.4300000000000000e+02 1.9800000000000000e+02 2.2001069482037120e-02 0.0000000000000000e+00 +4.1900000000000000e+02 1.4300000000000000e+02 1.9900000000000000e+02 2.1897426289259198e-02 0.0000000000000000e+00 +4.2000000000000000e+02 1.4300000000000000e+02 2.4800000000000000e+02 2.3254438412598076e-02 0.0000000000000000e+00 +4.2100000000000000e+02 1.4300000000000000e+02 2.5100000000000000e+02 2.3833610941403294e-02 0.0000000000000000e+00 +4.2200000000000000e+02 1.4400000000000000e+02 1.9900000000000000e+02 2.1359753183909754e-02 0.0000000000000000e+00 +4.2300000000000000e+02 1.4400000000000000e+02 2.0000000000000000e+02 2.0835140387523494e-02 0.0000000000000000e+00 +4.2400000000000000e+02 1.4400000000000000e+02 2.3900000000000000e+02 2.2646887148299533e-02 0.0000000000000000e+00 +4.2500000000000000e+02 1.4400000000000000e+02 2.5000000000000000e+02 2.1986948383885044e-02 0.0000000000000000e+00 +4.2600000000000000e+02 1.4500000000000000e+02 2.0000000000000000e+02 2.0721188530187600e-02 0.0000000000000000e+00 +4.2700000000000000e+02 1.4500000000000000e+02 2.0100000000000000e+02 2.0381420815413883e-02 0.0000000000000000e+00 +4.2800000000000000e+02 1.4500000000000000e+02 2.4500000000000000e+02 2.1857246032725933e-02 0.0000000000000000e+00 +4.2900000000000000e+02 1.4500000000000000e+02 3.0300000000000000e+02 2.1193897280157113e-02 0.0000000000000000e+00 +4.3000000000000000e+02 1.4600000000000000e+02 2.0100000000000000e+02 1.9973827205452689e-02 0.0000000000000000e+00 +4.3100000000000000e+02 1.4600000000000000e+02 2.0200000000000000e+02 1.9858338792167338e-02 0.0000000000000000e+00 +4.3200000000000000e+02 1.4600000000000000e+02 2.5200000000000000e+02 2.1982303131298259e-02 0.0000000000000000e+00 +4.3300000000000000e+02 1.4600000000000000e+02 3.4700000000000000e+02 2.1932164370314245e-02 0.0000000000000000e+00 +4.3400000000000000e+02 1.4700000000000000e+02 2.0200000000000000e+02 2.1098688486359894e-02 0.0000000000000000e+00 +4.3500000000000000e+02 1.4700000000000000e+02 2.0300000000000000e+02 2.0028022292288068e-02 0.0000000000000000e+00 +4.3600000000000000e+02 1.4700000000000000e+02 2.5600000000000000e+02 2.1819209560970994e-02 0.0000000000000000e+00 +4.3700000000000000e+02 1.4700000000000000e+02 3.1700000000000000e+02 2.3036713353602030e-02 0.0000000000000000e+00 +4.3800000000000000e+02 1.4800000000000000e+02 2.0300000000000000e+02 2.0664154711474824e-02 0.0000000000000000e+00 +4.3900000000000000e+02 1.4800000000000000e+02 2.0400000000000000e+02 2.1491397219961701e-02 0.0000000000000000e+00 +4.4000000000000000e+02 1.4800000000000000e+02 2.5300000000000000e+02 2.1920172631463699e-02 0.0000000000000000e+00 +4.4100000000000000e+02 1.4800000000000000e+02 2.5500000000000000e+02 2.3060615871359155e-02 0.0000000000000000e+00 +4.4200000000000000e+02 1.4900000000000000e+02 2.0400000000000000e+02 2.2351440151933761e-02 0.0000000000000000e+00 +4.4300000000000000e+02 1.4900000000000000e+02 2.0500000000000000e+02 2.2571966521458084e-02 0.0000000000000000e+00 +4.4400000000000000e+02 1.4900000000000000e+02 2.4700000000000000e+02 2.2425526897401685e-02 0.0000000000000000e+00 +4.4500000000000000e+02 1.4900000000000000e+02 2.5700000000000000e+02 2.4589811000233427e-02 0.0000000000000000e+00 +4.4600000000000000e+02 1.5000000000000000e+02 2.0500000000000000e+02 2.2511283984339568e-02 0.0000000000000000e+00 +4.4700000000000000e+02 1.5000000000000000e+02 2.0600000000000000e+02 2.2302248348299931e-02 0.0000000000000000e+00 +4.4800000000000000e+02 1.5000000000000000e+02 2.5400000000000000e+02 2.1366784792410609e-02 0.0000000000000000e+00 +4.4900000000000000e+02 1.5000000000000000e+02 2.5900000000000000e+02 2.2721152657339157e-02 0.0000000000000000e+00 +4.5000000000000000e+02 1.5100000000000000e+02 1.5200000000000000e+02 2.7632406028747298e-02 0.0000000000000000e+00 +4.5100000000000000e+02 1.5100000000000000e+02 2.0600000000000000e+02 2.2892749128118384e-02 0.0000000000000000e+00 +4.5200000000000000e+02 1.5100000000000000e+02 2.6200000000000000e+02 2.1057679752709172e-02 0.0000000000000000e+00 +4.5300000000000000e+02 1.5100000000000000e+02 2.8800000000000000e+02 2.2986134282170771e-02 0.0000000000000000e+00 +4.5400000000000000e+02 1.5200000000000000e+02 1.5300000000000000e+02 2.9081107646981776e-02 0.0000000000000000e+00 +4.5500000000000000e+02 1.5200000000000000e+02 2.6200000000000000e+02 2.5255128756132478e-02 0.0000000000000000e+00 +4.5600000000000000e+02 1.5200000000000000e+02 3.0600000000000000e+02 2.0808780273112393e-02 0.0000000000000000e+00 +4.5700000000000000e+02 1.5300000000000000e+02 2.0800000000000000e+02 2.2744497591138113e-02 0.0000000000000000e+00 +4.5800000000000000e+02 1.5300000000000000e+02 2.6100000000000000e+02 2.2343362757428323e-02 0.0000000000000000e+00 +4.5900000000000000e+02 1.5300000000000000e+02 3.0600000000000000e+02 2.2268765680877663e-02 0.0000000000000000e+00 +4.6000000000000000e+02 1.5400000000000000e+02 2.0700000000000000e+02 2.2339970897885787e-02 0.0000000000000000e+00 +4.6100000000000000e+02 1.5400000000000000e+02 2.0800000000000000e+02 2.1410340724492841e-02 0.0000000000000000e+00 +4.6200000000000000e+02 1.5400000000000000e+02 2.5800000000000000e+02 2.1809148313522066e-02 0.0000000000000000e+00 +4.6300000000000000e+02 1.5400000000000000e+02 3.0500000000000000e+02 2.2740542087427550e-02 0.0000000000000000e+00 +4.6400000000000000e+02 1.5500000000000000e+02 1.5600000000000000e+02 2.8996698249216617e-02 0.0000000000000000e+00 +4.6500000000000000e+02 1.5500000000000000e+02 2.0700000000000000e+02 2.4165331842109443e-02 0.0000000000000000e+00 +4.6600000000000000e+02 1.5500000000000000e+02 2.6400000000000000e+02 2.5193891312959470e-02 0.0000000000000000e+00 +4.6700000000000000e+02 1.5500000000000000e+02 2.8900000000000000e+02 2.7551390539801286e-02 0.0000000000000000e+00 +4.6800000000000000e+02 1.5600000000000000e+02 1.5700000000000000e+02 2.7653295518223823e-02 0.0000000000000000e+00 +4.6900000000000000e+02 1.5600000000000000e+02 2.8200000000000000e+02 2.5067018108808091e-02 0.0000000000000000e+00 +4.7000000000000000e+02 1.5600000000000000e+02 2.8900000000000000e+02 2.7934340041812732e-02 0.0000000000000000e+00 +4.7100000000000000e+02 1.5700000000000000e+02 2.0900000000000000e+02 2.3894925815921127e-02 0.0000000000000000e+00 +4.7200000000000000e+02 1.5700000000000000e+02 2.8200000000000000e+02 2.0884428848884459e-02 0.0000000000000000e+00 +4.7300000000000000e+02 1.5700000000000000e+02 3.1400000000000000e+02 2.6444544158950398e-02 0.0000000000000000e+00 +4.7400000000000000e+02 1.5800000000000000e+02 1.5900000000000000e+02 2.0303787061428134e-02 0.0000000000000000e+00 +4.7500000000000000e+02 1.5800000000000000e+02 2.0900000000000000e+02 2.1732353918495217e-02 0.0000000000000000e+00 +4.7600000000000000e+02 1.5800000000000000e+02 2.6500000000000000e+02 2.7243841742168453e-02 0.0000000000000000e+00 +4.7700000000000000e+02 1.5800000000000000e+02 3.0700000000000000e+02 1.9990177798763199e-02 0.0000000000000000e+00 +4.7800000000000000e+02 1.5900000000000000e+02 1.6000000000000000e+02 2.3334865407941788e-02 0.0000000000000000e+00 +4.7900000000000000e+02 1.5900000000000000e+02 2.6500000000000000e+02 2.3318091919365340e-02 0.0000000000000000e+00 +4.8000000000000000e+02 1.6000000000000000e+02 1.6100000000000000e+02 2.3884088388382792e-02 0.0000000000000000e+00 +4.8100000000000000e+02 1.6000000000000000e+02 2.6500000000000000e+02 2.7691699591222859e-02 0.0000000000000000e+00 +4.8200000000000000e+02 1.6000000000000000e+02 2.8300000000000000e+02 2.3146022442851140e-02 0.0000000000000000e+00 +4.8300000000000000e+02 1.6100000000000000e+02 2.1000000000000000e+02 2.5707456389056797e-02 0.0000000000000000e+00 +4.8400000000000000e+02 1.6100000000000000e+02 2.6300000000000000e+02 2.3895789178500843e-02 0.0000000000000000e+00 +4.8500000000000000e+02 1.6100000000000000e+02 2.8300000000000000e+02 2.5310295986342886e-02 0.0000000000000000e+00 +4.8600000000000000e+02 1.6200000000000000e+02 2.1000000000000000e+02 2.3903264236694512e-02 0.0000000000000000e+00 +4.8700000000000000e+02 1.6200000000000000e+02 2.1100000000000000e+02 2.3438555052954356e-02 0.0000000000000000e+00 +4.8800000000000000e+02 1.6200000000000000e+02 2.6700000000000000e+02 2.3730360714528952e-02 0.0000000000000000e+00 +4.8900000000000000e+02 1.6200000000000000e+02 2.8400000000000000e+02 2.3098752902369048e-02 0.0000000000000000e+00 +4.9000000000000000e+02 1.6300000000000000e+02 2.1100000000000000e+02 2.2557517605713423e-02 0.0000000000000000e+00 +4.9100000000000000e+02 1.6300000000000000e+02 2.1200000000000000e+02 2.1929767056354361e-02 0.0000000000000000e+00 +4.9200000000000000e+02 1.6300000000000000e+02 2.6800000000000000e+02 2.4185918079390349e-02 0.0000000000000000e+00 +4.9300000000000000e+02 1.6300000000000000e+02 2.8100000000000000e+02 2.2439873531262651e-02 0.0000000000000000e+00 +4.9400000000000000e+02 1.6400000000000000e+02 1.6500000000000000e+02 2.1824744265283483e-02 0.0000000000000000e+00 +4.9500000000000000e+02 1.6400000000000000e+02 2.1200000000000000e+02 2.2020003808516212e-02 0.0000000000000000e+00 +4.9600000000000000e+02 1.6400000000000000e+02 2.6600000000000000e+02 2.1168316762006669e-02 0.0000000000000000e+00 +4.9700000000000000e+02 1.6400000000000000e+02 2.8500000000000000e+02 2.6715698386331980e-02 0.0000000000000000e+00 +4.9800000000000000e+02 1.6500000000000000e+02 2.1300000000000000e+02 2.0893487874297643e-02 0.0000000000000000e+00 +4.9900000000000000e+02 1.6500000000000000e+02 2.8500000000000000e+02 2.1158482305087972e-02 0.0000000000000000e+00 +5.0000000000000000e+02 1.6600000000000000e+02 2.1300000000000000e+02 2.4131204957505516e-02 0.0000000000000000e+00 +5.0100000000000000e+02 1.6600000000000000e+02 2.1400000000000000e+02 2.2357515168069237e-02 0.0000000000000000e+00 +5.0200000000000000e+02 1.6600000000000000e+02 2.6900000000000000e+02 2.3513197562309986e-02 0.0000000000000000e+00 +5.0300000000000000e+02 1.6600000000000000e+02 2.7000000000000000e+02 2.5424906155838246e-02 0.0000000000000000e+00 +5.0400000000000000e+02 1.6700000000000000e+02 1.6800000000000000e+02 2.7741925483138551e-02 0.0000000000000000e+00 +5.0500000000000000e+02 1.6700000000000000e+02 2.1400000000000000e+02 2.3142070206915718e-02 0.0000000000000000e+00 +5.0600000000000000e+02 1.6700000000000000e+02 2.6900000000000000e+02 2.8558888151245968e-02 0.0000000000000000e+00 +5.0700000000000000e+02 1.6700000000000000e+02 2.7200000000000000e+02 2.6100433608197755e-02 0.0000000000000000e+00 +5.0800000000000000e+02 1.6700000000000000e+02 3.0800000000000000e+02 3.0672562658740212e-02 0.0000000000000000e+00 +5.0900000000000000e+02 1.6800000000000000e+02 1.6900000000000000e+02 2.5038630548726040e-02 0.0000000000000000e+00 +5.1000000000000000e+02 1.6800000000000000e+02 2.7200000000000000e+02 2.7688958904261145e-02 0.0000000000000000e+00 +5.1100000000000000e+02 1.6800000000000000e+02 2.8600000000000000e+02 2.4138650673102422e-02 0.0000000000000000e+00 +5.1200000000000000e+02 1.6900000000000000e+02 2.1500000000000000e+02 2.2159451319981465e-02 0.0000000000000000e+00 +5.1300000000000000e+02 1.6900000000000000e+02 2.7100000000000000e+02 2.2464221066512611e-02 0.0000000000000000e+00 +5.1400000000000000e+02 1.6900000000000000e+02 2.8600000000000000e+02 2.4414473666378837e-02 0.0000000000000000e+00 +5.1500000000000000e+02 1.7000000000000000e+02 1.7100000000000000e+02 2.4867074262681955e-02 0.0000000000000000e+00 +5.1600000000000000e+02 1.7000000000000000e+02 2.1500000000000000e+02 2.4269049231955497e-02 0.0000000000000000e+00 +5.1700000000000000e+02 1.7000000000000000e+02 2.7400000000000000e+02 2.6908795390279915e-02 0.0000000000000000e+00 +5.1800000000000000e+02 1.7000000000000000e+02 3.0900000000000000e+02 2.1957543322315323e-02 0.0000000000000000e+00 +5.1900000000000000e+02 1.7100000000000000e+02 1.7200000000000000e+02 2.3677285952433003e-02 0.0000000000000000e+00 +5.2000000000000000e+02 1.7100000000000000e+02 2.7400000000000000e+02 2.3568272507117592e-02 0.0000000000000000e+00 +5.2100000000000000e+02 1.7200000000000000e+02 2.1600000000000000e+02 2.1957604293868876e-02 0.0000000000000000e+00 +5.2200000000000000e+02 1.7200000000000000e+02 2.7400000000000000e+02 2.8119132710304737e-02 0.0000000000000000e+00 +5.2300000000000000e+02 1.7200000000000000e+02 3.1300000000000000e+02 2.2513853865867749e-02 0.0000000000000000e+00 +5.2400000000000000e+02 1.7300000000000000e+02 2.1600000000000000e+02 2.1689206838740857e-02 0.0000000000000000e+00 +5.2500000000000000e+02 1.7300000000000000e+02 2.1700000000000000e+02 1.9984962934727343e-02 0.0000000000000000e+00 +5.2600000000000000e+02 1.7300000000000000e+02 2.7300000000000000e+02 2.3171723262929329e-02 0.0000000000000000e+00 +5.2700000000000000e+02 1.7300000000000000e+02 3.1200000000000000e+02 2.6246418004349140e-02 0.0000000000000000e+00 +5.2800000000000000e+02 1.7400000000000000e+02 2.1700000000000000e+02 1.6365782084680664e-02 0.0000000000000000e+00 +5.2900000000000000e+02 1.7400000000000000e+02 2.7600000000000000e+02 1.7604623508979199e-02 0.0000000000000000e+00 +5.3000000000000000e+02 1.7500000000000000e+02 2.7500000000000000e+02 2.2606599003290418e-02 0.0000000000000000e+00 +5.3100000000000000e+02 1.7500000000000000e+02 2.7600000000000000e+02 2.2799939634056215e-02 0.0000000000000000e+00 +5.3200000000000000e+02 1.7600000000000000e+02 2.1800000000000000e+02 2.1784160731818884e-02 0.0000000000000000e+00 +5.3300000000000000e+02 1.7600000000000000e+02 2.8700000000000000e+02 2.2513005469432260e-02 0.0000000000000000e+00 +5.3400000000000000e+02 1.7700000000000000e+02 2.1900000000000000e+02 2.2990944552507702e-02 0.0000000000000000e+00 +5.3500000000000000e+02 1.7700000000000000e+02 2.9000000000000000e+02 2.2363082330993864e-02 0.0000000000000000e+00 +5.3600000000000000e+02 1.7800000000000000e+02 3.1000000000000000e+02 2.3428469269614713e-02 0.0000000000000000e+00 +5.3700000000000000e+02 1.7800000000000000e+02 3.1500000000000000e+02 2.3240977093907593e-02 0.0000000000000000e+00 +5.3800000000000000e+02 1.7900000000000000e+02 2.2000000000000000e+02 2.2707449118472427e-02 0.0000000000000000e+00 +5.3900000000000000e+02 1.7900000000000000e+02 2.2300000000000000e+02 2.2373592276609146e-02 0.0000000000000000e+00 +5.4000000000000000e+02 1.8000000000000000e+02 2.2200000000000000e+02 2.2119083397877964e-02 0.0000000000000000e+00 +5.4100000000000000e+02 1.8000000000000000e+02 2.9100000000000000e+02 2.2003716468463885e-02 0.0000000000000000e+00 +5.4200000000000000e+02 1.8100000000000000e+02 2.6000000000000000e+02 2.0875901053082853e-02 0.0000000000000000e+00 +5.4300000000000000e+02 1.8100000000000000e+02 2.9200000000000000e+02 2.2029140269051076e-02 0.0000000000000000e+00 +5.4400000000000000e+02 1.8200000000000000e+02 2.2100000000000000e+02 2.0958814481275418e-02 0.0000000000000000e+00 +5.4500000000000000e+02 1.8200000000000000e+02 2.2400000000000000e+02 2.1554916274486777e-02 0.0000000000000000e+00 +5.4600000000000000e+02 1.8300000000000000e+02 2.2600000000000000e+02 2.2165302031833284e-02 0.0000000000000000e+00 +5.4700000000000000e+02 1.8300000000000000e+02 2.9300000000000000e+02 2.1329136984948496e-02 0.0000000000000000e+00 +5.4800000000000000e+02 1.8400000000000000e+02 3.0400000000000000e+02 2.1749897487523075e-02 0.0000000000000000e+00 +5.4900000000000000e+02 1.8400000000000000e+02 3.1600000000000000e+02 2.1561978477458870e-02 0.0000000000000000e+00 +5.5000000000000000e+02 1.8500000000000000e+02 2.2700000000000000e+02 2.2000382345299479e-02 0.0000000000000000e+00 +5.5100000000000000e+02 1.8500000000000000e+02 2.3000000000000000e+02 2.1128864706363930e-02 0.0000000000000000e+00 +5.5200000000000000e+02 1.8600000000000000e+02 2.2900000000000000e+02 2.4000719513772882e-02 0.0000000000000000e+00 +5.5300000000000000e+02 1.8600000000000000e+02 2.9400000000000000e+02 2.2913555122569991e-02 0.0000000000000000e+00 +5.5400000000000000e+02 1.8700000000000000e+02 2.2500000000000000e+02 2.2347837234637048e-02 0.0000000000000000e+00 +5.5500000000000000e+02 1.8700000000000000e+02 2.3200000000000000e+02 2.3354834036970494e-02 0.0000000000000000e+00 +5.5600000000000000e+02 1.8800000000000000e+02 2.2800000000000000e+02 2.1436002498649354e-02 0.0000000000000000e+00 +5.5700000000000000e+02 1.8800000000000000e+02 2.3100000000000000e+02 2.2231874764263113e-02 0.0000000000000000e+00 +5.5800000000000000e+02 1.8900000000000000e+02 2.3400000000000000e+02 2.1867091222319116e-02 0.0000000000000000e+00 +5.5900000000000000e+02 1.8900000000000000e+02 2.9600000000000000e+02 2.1302823626020893e-02 0.0000000000000000e+00 +5.6000000000000000e+02 1.9000000000000000e+02 2.3500000000000000e+02 2.2651710763181714e-02 0.0000000000000000e+00 +5.6100000000000000e+02 1.9000000000000000e+02 2.9500000000000000e+02 2.2454232525227984e-02 0.0000000000000000e+00 +5.6200000000000000e+02 1.9100000000000000e+02 2.3600000000000000e+02 2.2555126544578967e-02 0.0000000000000000e+00 +5.6300000000000000e+02 1.9100000000000000e+02 2.9700000000000000e+02 2.1113941020169176e-02 0.0000000000000000e+00 +5.6400000000000000e+02 1.9200000000000000e+02 2.3700000000000000e+02 2.3951491843973469e-02 0.0000000000000000e+00 +5.6500000000000000e+02 1.9200000000000000e+02 3.0000000000000000e+02 2.2395530718859653e-02 0.0000000000000000e+00 +5.6600000000000000e+02 1.9300000000000000e+02 2.4200000000000000e+02 2.2669311572609759e-02 0.0000000000000000e+00 +5.6700000000000000e+02 1.9300000000000000e+02 2.7900000000000000e+02 2.3530769937212075e-02 0.0000000000000000e+00 +5.6800000000000000e+02 1.9400000000000000e+02 2.3300000000000000e+02 2.0854214902917285e-02 0.0000000000000000e+00 +5.6900000000000000e+02 1.9400000000000000e+02 2.4000000000000000e+02 2.3538302169913275e-02 0.0000000000000000e+00 +5.7000000000000000e+02 1.9500000000000000e+02 2.3800000000000000e+02 1.8058463164238932e-02 0.0000000000000000e+00 +5.7100000000000000e+02 1.9500000000000000e+02 2.4100000000000000e+02 2.2001872978617509e-02 0.0000000000000000e+00 +5.7200000000000000e+02 1.9600000000000000e+02 2.4300000000000000e+02 2.1435689742668466e-02 0.0000000000000000e+00 +5.7300000000000000e+02 1.9600000000000000e+02 2.9900000000000000e+02 1.8960284306782156e-02 0.0000000000000000e+00 +5.7400000000000000e+02 1.9700000000000000e+02 2.4900000000000000e+02 2.2297958435932755e-02 0.0000000000000000e+00 +5.7500000000000000e+02 1.9700000000000000e+02 3.0200000000000000e+02 2.2814079908075179e-02 0.0000000000000000e+00 +5.7600000000000000e+02 1.9800000000000000e+02 2.4400000000000000e+02 2.2776048429797129e-02 0.0000000000000000e+00 +5.7700000000000000e+02 1.9800000000000000e+02 2.5100000000000000e+02 2.2418994612453585e-02 0.0000000000000000e+00 +5.7800000000000000e+02 1.9900000000000000e+02 2.3900000000000000e+02 2.2485086684687905e-02 0.0000000000000000e+00 +5.7900000000000000e+02 1.9900000000000000e+02 2.4800000000000000e+02 2.3395108455846268e-02 0.0000000000000000e+00 +5.8000000000000000e+02 2.0000000000000000e+02 2.4500000000000000e+02 2.2454900363853395e-02 0.0000000000000000e+00 +5.8100000000000000e+02 2.0000000000000000e+02 2.5000000000000000e+02 2.2985813454835496e-02 0.0000000000000000e+00 +5.8200000000000000e+02 2.0100000000000000e+02 2.5200000000000000e+02 2.1666884611761233e-02 0.0000000000000000e+00 +5.8300000000000000e+02 2.0100000000000000e+02 3.0300000000000000e+02 2.1826207217297243e-02 0.0000000000000000e+00 +5.8400000000000000e+02 2.0200000000000000e+02 3.1700000000000000e+02 2.1679929509259704e-02 0.0000000000000000e+00 +5.8500000000000000e+02 2.0200000000000000e+02 3.4700000000000000e+02 2.1786879813680264e-02 0.0000000000000000e+00 +5.8600000000000000e+02 2.0300000000000000e+02 2.5300000000000000e+02 2.2836298312992782e-02 0.0000000000000000e+00 +5.8700000000000000e+02 2.0300000000000000e+02 2.5600000000000000e+02 2.3173487146815549e-02 0.0000000000000000e+00 +5.8800000000000000e+02 2.0400000000000000e+02 2.4700000000000000e+02 2.3543947140143198e-02 0.0000000000000000e+00 +5.8900000000000000e+02 2.0400000000000000e+02 2.5500000000000000e+02 2.2440675484384245e-02 0.0000000000000000e+00 +5.9000000000000000e+02 2.0500000000000000e+02 2.5400000000000000e+02 2.4390485124027410e-02 0.0000000000000000e+00 +5.9100000000000000e+02 2.0500000000000000e+02 2.5700000000000000e+02 2.3138160574914083e-02 0.0000000000000000e+00 +5.9200000000000000e+02 2.0600000000000000e+02 2.5900000000000000e+02 2.1662774469797440e-02 0.0000000000000000e+00 +5.9300000000000000e+02 2.0600000000000000e+02 2.8800000000000000e+02 2.1981079050025030e-02 0.0000000000000000e+00 +5.9400000000000000e+02 2.0600000000000000e+02 3.1100000000000000e+02 2.3187493470629098e-02 0.0000000000000000e+00 +5.9500000000000000e+02 2.0700000000000000e+02 2.6400000000000000e+02 2.3776352417876446e-02 0.0000000000000000e+00 +5.9600000000000000e+02 2.0700000000000000e+02 3.0500000000000000e+02 2.1714152678591385e-02 0.0000000000000000e+00 +5.9700000000000000e+02 2.0800000000000000e+02 2.5800000000000000e+02 2.2197245998407240e-02 0.0000000000000000e+00 +5.9800000000000000e+02 2.0800000000000000e+02 2.6100000000000000e+02 2.2889047449297133e-02 0.0000000000000000e+00 +5.9900000000000000e+02 2.0900000000000000e+02 3.0700000000000000e+02 2.2383670528670827e-02 0.0000000000000000e+00 +6.0000000000000000e+02 2.0900000000000000e+02 3.1400000000000000e+02 2.3389457953151668e-02 0.0000000000000000e+00 +6.0100000000000000e+02 2.0900000000000000e+02 3.5500000000000000e+02 2.5933441371470554e-02 0.0000000000000000e+00 +6.0200000000000000e+02 2.1000000000000000e+02 2.6300000000000000e+02 2.5981131869041461e-02 0.0000000000000000e+00 +6.0300000000000000e+02 2.1000000000000000e+02 2.6700000000000000e+02 2.3860661561982799e-02 0.0000000000000000e+00 +6.0400000000000000e+02 2.1100000000000000e+02 2.6800000000000000e+02 2.2397509820419513e-02 0.0000000000000000e+00 +6.0500000000000000e+02 2.1100000000000000e+02 2.8400000000000000e+02 2.3164154875394728e-02 0.0000000000000000e+00 +6.0600000000000000e+02 2.1200000000000000e+02 2.6600000000000000e+02 2.3070591407649967e-02 0.0000000000000000e+00 +6.0700000000000000e+02 2.1200000000000000e+02 2.8100000000000000e+02 2.3218254769853681e-02 0.0000000000000000e+00 +6.0800000000000000e+02 2.1300000000000000e+02 2.7000000000000000e+02 2.3354857615776031e-02 0.0000000000000000e+00 +6.0900000000000000e+02 2.1300000000000000e+02 2.8500000000000000e+02 2.6643665139345470e-02 0.0000000000000000e+00 +6.1000000000000000e+02 2.1400000000000000e+02 2.6900000000000000e+02 2.3224053203079170e-02 0.0000000000000000e+00 +6.1100000000000000e+02 2.1500000000000000e+02 2.7100000000000000e+02 2.2513154423856509e-02 0.0000000000000000e+00 +6.1200000000000000e+02 2.1500000000000000e+02 3.0900000000000000e+02 2.3661577676826757e-02 0.0000000000000000e+00 +6.1300000000000000e+02 2.1600000000000000e+02 3.1200000000000000e+02 2.6849605028701894e-02 0.0000000000000000e+00 +6.1400000000000000e+02 2.1600000000000000e+02 3.1300000000000000e+02 2.4643389875751605e-02 0.0000000000000000e+00 +6.1500000000000000e+02 2.1700000000000000e+02 2.7300000000000000e+02 2.1622783897457049e-02 0.0000000000000000e+00 +6.1600000000000000e+02 2.1700000000000000e+02 2.7600000000000000e+02 2.0697785396500964e-02 0.0000000000000000e+00 +6.1700000000000000e+02 2.1800000000000000e+02 2.8700000000000000e+02 2.1578245865818333e-02 0.0000000000000000e+00 +6.1800000000000000e+02 2.1800000000000000e+02 2.9000000000000000e+02 2.0278479092348176e-02 0.0000000000000000e+00 +6.1900000000000000e+02 2.1800000000000000e+02 3.4900000000000000e+02 2.2335133594314750e-02 0.0000000000000000e+00 +6.2000000000000000e+02 2.1800000000000000e+02 4.0400000000000000e+02 2.2830478144602141e-02 0.0000000000000000e+00 +6.2100000000000000e+02 2.1900000000000000e+02 2.9000000000000000e+02 2.1359158855769219e-02 0.0000000000000000e+00 +6.2200000000000000e+02 2.1900000000000000e+02 3.1000000000000000e+02 2.0570251517390923e-02 0.0000000000000000e+00 +6.2300000000000000e+02 2.1900000000000000e+02 3.2200000000000000e+02 2.2482075955174746e-02 0.0000000000000000e+00 +6.2400000000000000e+02 2.1900000000000000e+02 3.8800000000000000e+02 2.2194472541224447e-02 0.0000000000000000e+00 +6.2500000000000000e+02 2.2000000000000000e+02 2.2300000000000000e+02 2.2192759765265992e-02 0.0000000000000000e+00 +6.2600000000000000e+02 2.2000000000000000e+02 2.9100000000000000e+02 2.2609860895238684e-02 0.0000000000000000e+00 +6.2700000000000000e+02 2.2000000000000000e+02 3.5300000000000000e+02 2.2375590981153343e-02 0.0000000000000000e+00 +6.2800000000000000e+02 2.2000000000000000e+02 3.6000000000000000e+02 2.2973730897394472e-02 0.0000000000000000e+00 +6.2900000000000000e+02 2.2100000000000000e+02 2.2400000000000000e+02 1.9666336242821780e-02 0.0000000000000000e+00 +6.3000000000000000e+02 2.2100000000000000e+02 2.9300000000000000e+02 2.0477586000445431e-02 0.0000000000000000e+00 +6.3100000000000000e+02 2.2100000000000000e+02 3.2300000000000000e+02 2.2576306946438758e-02 0.0000000000000000e+00 +6.3200000000000000e+02 2.2100000000000000e+02 3.5900000000000000e+02 2.3174505249230377e-02 0.0000000000000000e+00 +6.3300000000000000e+02 2.2200000000000000e+02 2.9100000000000000e+02 2.2444591945616068e-02 0.0000000000000000e+00 +6.3400000000000000e+02 2.2200000000000000e+02 2.9200000000000000e+02 2.1783896892116933e-02 0.0000000000000000e+00 +6.3500000000000000e+02 2.2200000000000000e+02 3.1900000000000000e+02 2.2325194005932431e-02 0.0000000000000000e+00 +6.3600000000000000e+02 2.2200000000000000e+02 3.9200000000000000e+02 2.1497464005221255e-02 0.0000000000000000e+00 +6.3700000000000000e+02 2.2300000000000000e+02 3.1500000000000000e+02 2.0907972942165374e-02 0.0000000000000000e+00 +6.3800000000000000e+02 2.2300000000000000e+02 3.5300000000000000e+02 2.2598985361193646e-02 0.0000000000000000e+00 +6.3900000000000000e+02 2.2300000000000000e+02 4.0600000000000000e+02 2.1591887478427493e-02 0.0000000000000000e+00 +6.4000000000000000e+02 2.2400000000000000e+02 2.6000000000000000e+02 2.1434442952098884e-02 0.0000000000000000e+00 +6.4100000000000000e+02 2.2400000000000000e+02 3.2300000000000000e+02 2.2326038660241208e-02 0.0000000000000000e+00 +6.4200000000000000e+02 2.2400000000000000e+02 3.7200000000000000e+02 2.3011156434386344e-02 0.0000000000000000e+00 +6.4300000000000000e+02 2.2500000000000000e+02 2.3100000000000000e+02 2.0838173924102206e-02 0.0000000000000000e+00 +6.4400000000000000e+02 2.2500000000000000e+02 2.3200000000000000e+02 2.0765548752427910e-02 0.0000000000000000e+00 +6.4500000000000000e+02 2.2500000000000000e+02 3.7900000000000000e+02 2.1382725312259519e-02 0.0000000000000000e+00 +6.4600000000000000e+02 2.2500000000000000e+02 4.1100000000000000e+02 2.1372588416105572e-02 0.0000000000000000e+00 +6.4700000000000000e+02 2.2600000000000000e+02 2.9300000000000000e+02 1.8976495455997604e-02 0.0000000000000000e+00 +6.4800000000000000e+02 2.2600000000000000e+02 3.0400000000000000e+02 2.0128911601487998e-02 0.0000000000000000e+00 +6.4900000000000000e+02 2.2600000000000000e+02 3.4200000000000000e+02 2.1433846812308928e-02 0.0000000000000000e+00 +6.5000000000000000e+02 2.2600000000000000e+02 3.9300000000000000e+02 2.1955500666379336e-02 0.0000000000000000e+00 +6.5100000000000000e+02 2.2700000000000000e+02 2.3000000000000000e+02 2.0617004564407126e-02 0.0000000000000000e+00 +6.5200000000000000e+02 2.2700000000000000e+02 2.9400000000000000e+02 2.1299444876903956e-02 0.0000000000000000e+00 +6.5300000000000000e+02 2.2700000000000000e+02 3.4000000000000000e+02 2.3300986749410786e-02 0.0000000000000000e+00 +6.5400000000000000e+02 2.2700000000000000e+02 3.4100000000000000e+02 2.2379422058094317e-02 0.0000000000000000e+00 +6.5500000000000000e+02 2.2800000000000000e+02 2.3100000000000000e+02 2.0592137328747279e-02 0.0000000000000000e+00 +6.5600000000000000e+02 2.2800000000000000e+02 2.9600000000000000e+02 2.0500794834922575e-02 0.0000000000000000e+00 +6.5700000000000000e+02 2.2800000000000000e+02 3.3800000000000000e+02 2.3093737746893484e-02 0.0000000000000000e+00 +6.5800000000000000e+02 2.2800000000000000e+02 3.8300000000000000e+02 2.2997918717469763e-02 0.0000000000000000e+00 +6.5900000000000000e+02 2.2900000000000000e+02 2.3200000000000000e+02 2.1645319188248028e-02 0.0000000000000000e+00 +6.6000000000000000e+02 2.2900000000000000e+02 2.9400000000000000e+02 2.2019575267722722e-02 0.0000000000000000e+00 +6.6100000000000000e+02 2.2900000000000000e+02 3.6900000000000000e+02 2.2228873307502815e-02 0.0000000000000000e+00 +6.6200000000000000e+02 2.2900000000000000e+02 3.8100000000000000e+02 2.2615681156858414e-02 0.0000000000000000e+00 +6.6300000000000000e+02 2.3000000000000000e+02 3.1600000000000000e+02 2.0291496115880086e-02 0.0000000000000000e+00 +6.6400000000000000e+02 2.3000000000000000e+02 3.4100000000000000e+02 2.2715508040810801e-02 0.0000000000000000e+00 +6.6500000000000000e+02 2.3000000000000000e+02 4.0700000000000000e+02 2.1770738555110351e-02 0.0000000000000000e+00 +6.6600000000000000e+02 2.3100000000000000e+02 3.8300000000000000e+02 2.2433739985505085e-02 0.0000000000000000e+00 +6.6700000000000000e+02 2.3100000000000000e+02 4.1100000000000000e+02 2.2016480588890233e-02 0.0000000000000000e+00 +6.6800000000000000e+02 2.3200000000000000e+02 3.7900000000000000e+02 2.1691716768593279e-02 0.0000000000000000e+00 +6.6900000000000000e+02 2.3200000000000000e+02 3.8100000000000000e+02 2.2329551313912725e-02 0.0000000000000000e+00 +6.7000000000000000e+02 2.3300000000000000e+02 2.4000000000000000e+02 1.9136717950596106e-02 0.0000000000000000e+00 +6.7100000000000000e+02 2.3300000000000000e+02 2.4100000000000000e+02 1.8332195194279966e-02 0.0000000000000000e+00 +6.7200000000000000e+02 2.3300000000000000e+02 3.1800000000000000e+02 2.2156344561213487e-02 0.0000000000000000e+00 +6.7300000000000000e+02 2.3300000000000000e+02 3.2500000000000000e+02 2.3156156598975627e-02 0.0000000000000000e+00 +6.7400000000000000e+02 2.3400000000000000e+02 2.9500000000000000e+02 1.9854611831827684e-02 0.0000000000000000e+00 +6.7500000000000000e+02 2.3400000000000000e+02 2.9600000000000000e+02 1.9177017051182507e-02 0.0000000000000000e+00 +6.7600000000000000e+02 2.3400000000000000e+02 3.2700000000000000e+02 2.1794671638571992e-02 0.0000000000000000e+00 +6.7700000000000000e+02 2.3400000000000000e+02 3.3000000000000000e+02 2.1493896505295179e-02 0.0000000000000000e+00 +6.7800000000000000e+02 2.3500000000000000e+02 2.9500000000000000e+02 2.0253492396369588e-02 0.0000000000000000e+00 +6.7900000000000000e+02 2.3500000000000000e+02 2.9700000000000000e+02 2.0249468026280585e-02 0.0000000000000000e+00 +6.8000000000000000e+02 2.3500000000000000e+02 3.2600000000000000e+02 2.2028543535057024e-02 0.0000000000000000e+00 +6.8100000000000000e+02 2.3500000000000000e+02 3.3100000000000000e+02 2.1661000455682401e-02 0.0000000000000000e+00 +6.8200000000000000e+02 2.3600000000000000e+02 2.9700000000000000e+02 2.1339445025407897e-02 0.0000000000000000e+00 +6.8300000000000000e+02 2.3600000000000000e+02 2.9800000000000000e+02 2.1565562741940596e-02 0.0000000000000000e+00 +6.8400000000000000e+02 2.3600000000000000e+02 3.8000000000000000e+02 2.2388733890622240e-02 0.0000000000000000e+00 +6.8500000000000000e+02 2.3600000000000000e+02 3.8600000000000000e+02 2.3090799750161803e-02 0.0000000000000000e+00 +6.8600000000000000e+02 2.3700000000000000e+02 2.7800000000000000e+02 2.1919693733460293e-02 0.0000000000000000e+00 +6.8700000000000000e+02 2.3700000000000000e+02 3.0000000000000000e+02 2.1699711884137850e-02 0.0000000000000000e+00 +6.8800000000000000e+02 2.3700000000000000e+02 3.3400000000000000e+02 2.2151177626883435e-02 0.0000000000000000e+00 +6.8900000000000000e+02 2.3700000000000000e+02 4.0000000000000000e+02 2.2862547159865070e-02 0.0000000000000000e+00 +6.9000000000000000e+02 2.3800000000000000e+02 2.4100000000000000e+02 1.7189138985010295e-02 0.0000000000000000e+00 +6.9100000000000000e+02 2.3800000000000000e+02 2.9900000000000000e+02 1.6128909537291781e-02 0.0000000000000000e+00 +6.9200000000000000e+02 2.3800000000000000e+02 3.3700000000000000e+02 1.7818528713753126e-02 0.0000000000000000e+00 +6.9300000000000000e+02 2.3900000000000000e+02 2.4800000000000000e+02 2.0895869958648273e-02 0.0000000000000000e+00 +6.9400000000000000e+02 2.3900000000000000e+02 2.5000000000000000e+02 1.9717926437912783e-02 0.0000000000000000e+00 +6.9500000000000000e+02 2.3900000000000000e+02 3.3200000000000000e+02 2.1719069258334344e-02 0.0000000000000000e+00 +6.9600000000000000e+02 2.3900000000000000e+02 3.7500000000000000e+02 2.1512569805232813e-02 0.0000000000000000e+00 +6.9700000000000000e+02 2.4000000000000000e+02 2.4200000000000000e+02 1.9923444459453640e-02 0.0000000000000000e+00 +6.9800000000000000e+02 2.4000000000000000e+02 3.2500000000000000e+02 2.2092112474238278e-02 0.0000000000000000e+00 +6.9900000000000000e+02 2.4000000000000000e+02 3.3900000000000000e+02 2.3221455956976344e-02 0.0000000000000000e+00 +7.0000000000000000e+02 2.4100000000000000e+02 3.1800000000000000e+02 2.1442407108920942e-02 0.0000000000000000e+00 +7.0100000000000000e+02 2.4100000000000000e+02 3.3700000000000000e+02 1.9606559764969108e-02 0.0000000000000000e+00 +7.0200000000000000e+02 2.4200000000000000e+02 2.7900000000000000e+02 2.0665649916921269e-02 0.0000000000000000e+00 +7.0300000000000000e+02 2.4200000000000000e+02 3.3900000000000000e+02 2.2665035686802958e-02 0.0000000000000000e+00 +7.0400000000000000e+02 2.4200000000000000e+02 3.6300000000000000e+02 2.2863259928427186e-02 0.0000000000000000e+00 +7.0500000000000000e+02 2.4300000000000000e+02 2.9900000000000000e+02 1.7688406012928072e-02 0.0000000000000000e+00 +7.0600000000000000e+02 2.4300000000000000e+02 3.0100000000000000e+02 1.9045790717337939e-02 0.0000000000000000e+00 +7.0700000000000000e+02 2.4300000000000000e+02 3.3600000000000000e+02 2.1931872316976537e-02 0.0000000000000000e+00 +7.0800000000000000e+02 2.4300000000000000e+02 3.8900000000000000e+02 2.0599358572488506e-02 0.0000000000000000e+00 +7.0900000000000000e+02 2.4400000000000000e+02 2.4900000000000000e+02 2.0746155941432091e-02 0.0000000000000000e+00 +7.1000000000000000e+02 2.4400000000000000e+02 2.5100000000000000e+02 2.0423328909126199e-02 0.0000000000000000e+00 +7.1100000000000000e+02 2.4400000000000000e+02 3.4500000000000000e+02 2.2886739404048399e-02 0.0000000000000000e+00 +7.1200000000000000e+02 2.4400000000000000e+02 4.1900000000000000e+02 2.1620122195906616e-02 0.0000000000000000e+00 +7.1300000000000000e+02 2.4500000000000000e+02 2.5000000000000000e+02 2.0720917425185139e-02 0.0000000000000000e+00 +7.1400000000000000e+02 2.4500000000000000e+02 3.0300000000000000e+02 1.9542370835792473e-02 0.0000000000000000e+00 +7.1500000000000000e+02 2.4500000000000000e+02 3.6200000000000000e+02 2.2174676570690721e-02 0.0000000000000000e+00 +7.1600000000000000e+02 2.4500000000000000e+02 3.9400000000000000e+02 2.2542682038279169e-02 0.0000000000000000e+00 +7.1700000000000000e+02 2.4600000000000000e+02 2.8000000000000000e+02 2.1721641940613167e-02 0.0000000000000000e+00 +7.1800000000000000e+02 2.4600000000000000e+02 3.0200000000000000e+02 2.1270204216527401e-02 0.0000000000000000e+00 +7.1900000000000000e+02 2.4600000000000000e+02 3.2000000000000000e+02 1.9450348033945599e-02 0.0000000000000000e+00 +7.2000000000000000e+02 2.4600000000000000e+02 3.6400000000000000e+02 2.2903425363159480e-02 0.0000000000000000e+00 +7.2100000000000000e+02 2.4700000000000000e+02 2.5500000000000000e+02 2.1072067505865159e-02 0.0000000000000000e+00 +7.2200000000000000e+02 2.4700000000000000e+02 2.5700000000000000e+02 2.0979279570498100e-02 0.0000000000000000e+00 +7.2300000000000000e+02 2.4700000000000000e+02 3.4600000000000000e+02 2.4138785669549540e-02 0.0000000000000000e+00 +7.2400000000000000e+02 2.4700000000000000e+02 3.7300000000000000e+02 2.3221827710493140e-02 0.0000000000000000e+00 +7.2500000000000000e+02 2.4800000000000000e+02 2.5100000000000000e+02 2.1515139019753583e-02 0.0000000000000000e+00 +7.2600000000000000e+02 2.4800000000000000e+02 3.7500000000000000e+02 2.0884442739235988e-02 0.0000000000000000e+00 +7.2700000000000000e+02 2.4800000000000000e+02 3.9500000000000000e+02 2.1494620908790903e-02 0.0000000000000000e+00 +7.2800000000000000e+02 2.4900000000000000e+02 3.0200000000000000e+02 2.0745024406091502e-02 0.0000000000000000e+00 +7.2900000000000000e+02 2.4900000000000000e+02 3.4500000000000000e+02 2.1638878685328284e-02 0.0000000000000000e+00 +7.3000000000000000e+02 2.4900000000000000e+02 3.8700000000000000e+02 2.2664819260648936e-02 0.0000000000000000e+00 +7.3100000000000000e+02 2.5000000000000000e+02 3.3200000000000000e+02 2.2063912328636939e-02 0.0000000000000000e+00 +7.3200000000000000e+02 2.5000000000000000e+02 3.9400000000000000e+02 2.1796173931415492e-02 0.0000000000000000e+00 +7.3300000000000000e+02 2.5100000000000000e+02 3.9500000000000000e+02 2.1273910356114374e-02 0.0000000000000000e+00 +7.3400000000000000e+02 2.5100000000000000e+02 4.1900000000000000e+02 2.2129771283120166e-02 0.0000000000000000e+00 +7.3500000000000000e+02 2.5200000000000000e+02 3.0300000000000000e+02 1.9830730106028791e-02 0.0000000000000000e+00 +7.3600000000000000e+02 2.5200000000000000e+02 3.3500000000000000e+02 2.2572359565862586e-02 0.0000000000000000e+00 +7.3700000000000000e+02 2.5200000000000000e+02 3.4700000000000000e+02 1.9799186999284742e-02 0.0000000000000000e+00 +7.3800000000000000e+02 2.5200000000000000e+02 3.7800000000000000e+02 2.2750352606886261e-02 0.0000000000000000e+00 +7.3900000000000000e+02 2.5300000000000000e+02 2.5500000000000000e+02 2.0494627744382311e-02 0.0000000000000000e+00 +7.4000000000000000e+02 2.5300000000000000e+02 2.5600000000000000e+02 2.0285892389554350e-02 0.0000000000000000e+00 +7.4100000000000000e+02 2.5300000000000000e+02 3.4400000000000000e+02 2.3693472742193626e-02 0.0000000000000000e+00 +7.4200000000000000e+02 2.5300000000000000e+02 3.4800000000000000e+02 2.3035973877651005e-02 0.0000000000000000e+00 +7.4300000000000000e+02 2.5400000000000000e+02 2.5700000000000000e+02 2.2352115501355994e-02 0.0000000000000000e+00 +7.4400000000000000e+02 2.5400000000000000e+02 2.5900000000000000e+02 2.2833244031237043e-02 0.0000000000000000e+00 +7.4500000000000000e+02 2.5400000000000000e+02 3.5200000000000000e+02 2.3239103054382239e-02 0.0000000000000000e+00 +7.4600000000000000e+02 2.5400000000000000e+02 3.9600000000000000e+02 2.1449643736593464e-02 0.0000000000000000e+00 +7.4700000000000000e+02 2.5500000000000000e+02 3.4400000000000000e+02 2.2825917141234411e-02 0.0000000000000000e+00 +7.4800000000000000e+02 2.5500000000000000e+02 3.7300000000000000e+02 2.3327282581565783e-02 0.0000000000000000e+00 +7.4900000000000000e+02 2.5600000000000000e+02 3.1700000000000000e+02 1.9866424581233385e-02 0.0000000000000000e+00 +7.5000000000000000e+02 2.5600000000000000e+02 3.4800000000000000e+02 2.2474108846966288e-02 0.0000000000000000e+00 +7.5100000000000000e+02 2.5600000000000000e+02 4.0800000000000000e+02 2.2725285281155635e-02 0.0000000000000000e+00 +7.5200000000000000e+02 2.5700000000000000e+02 3.4600000000000000e+02 2.1873600688222420e-02 0.0000000000000000e+00 +7.5300000000000000e+02 2.5700000000000000e+02 3.9600000000000000e+02 2.3255874795740809e-02 0.0000000000000000e+00 +7.5400000000000000e+02 2.5800000000000000e+02 2.6100000000000000e+02 1.9650829574988298e-02 0.0000000000000000e+00 +7.5500000000000000e+02 2.5800000000000000e+02 3.0500000000000000e+02 2.0981059268110475e-02 0.0000000000000000e+00 +7.5600000000000000e+02 2.5800000000000000e+02 3.2800000000000000e+02 2.2948299432290615e-02 0.0000000000000000e+00 +7.5700000000000000e+02 2.5800000000000000e+02 3.5000000000000000e+02 2.2086409233318793e-02 0.0000000000000000e+00 +7.5800000000000000e+02 2.5900000000000000e+02 3.1100000000000000e+02 2.2793142121830583e-02 0.0000000000000000e+00 +7.5900000000000000e+02 2.5900000000000000e+02 3.2900000000000000e+02 2.2716061896613151e-02 0.0000000000000000e+00 +7.6000000000000000e+02 2.5900000000000000e+02 3.5200000000000000e+02 2.2296728279918632e-02 0.0000000000000000e+00 +7.6100000000000000e+02 2.6000000000000000e+02 2.9200000000000000e+02 2.0233308507255413e-02 0.0000000000000000e+00 +7.6200000000000000e+02 2.6000000000000000e+02 3.7200000000000000e+02 2.2640831395653444e-02 0.0000000000000000e+00 +7.6300000000000000e+02 2.6000000000000000e+02 3.7400000000000000e+02 2.2939808018713339e-02 0.0000000000000000e+00 +7.6400000000000000e+02 2.6100000000000000e+02 3.0600000000000000e+02 1.8809738113125425e-02 0.0000000000000000e+00 +7.6500000000000000e+02 2.6100000000000000e+02 3.4300000000000000e+02 2.1532642134942305e-02 0.0000000000000000e+00 +7.6600000000000000e+02 2.6100000000000000e+02 3.5000000000000000e+02 2.0837726490999502e-02 0.0000000000000000e+00 +7.6700000000000000e+02 2.6200000000000000e+02 2.8800000000000000e+02 2.2806474101708264e-02 0.0000000000000000e+00 +7.6800000000000000e+02 2.6200000000000000e+02 3.0600000000000000e+02 2.0270323777798121e-02 0.0000000000000000e+00 +7.6900000000000000e+02 2.6200000000000000e+02 3.4300000000000000e+02 2.0728248575311109e-02 0.0000000000000000e+00 +7.7000000000000000e+02 2.6200000000000000e+02 3.7600000000000000e+02 2.2721534427295773e-02 0.0000000000000000e+00 +7.7100000000000000e+02 2.6300000000000000e+02 2.6700000000000000e+02 2.5464755131208602e-02 0.0000000000000000e+00 +7.7200000000000000e+02 2.6300000000000000e+02 2.8300000000000000e+02 2.5462508064068200e-02 0.0000000000000000e+00 +7.7300000000000000e+02 2.6300000000000000e+02 3.5700000000000000e+02 2.3567942241883626e-02 0.0000000000000000e+00 +7.7400000000000000e+02 2.6300000000000000e+02 3.6500000000000000e+02 2.3576106446663195e-02 0.0000000000000000e+00 +7.7500000000000000e+02 2.6400000000000000e+02 2.8900000000000000e+02 2.1102228542965604e-02 0.0000000000000000e+00 +7.7600000000000000e+02 2.6400000000000000e+02 3.0500000000000000e+02 2.1206122457564151e-02 0.0000000000000000e+00 +7.7700000000000000e+02 2.6400000000000000e+02 3.2100000000000000e+02 1.9837957711413036e-02 0.0000000000000000e+00 +7.7800000000000000e+02 2.6400000000000000e+02 3.9000000000000000e+02 2.7214634309860548e-02 0.0000000000000000e+00 +7.7900000000000000e+02 2.6500000000000000e+02 2.8300000000000000e+02 2.9197051448992654e-02 0.0000000000000000e+00 +7.8000000000000000e+02 2.6500000000000000e+02 3.0700000000000000e+02 2.3964502107764594e-02 0.0000000000000000e+00 +7.8100000000000000e+02 2.6500000000000000e+02 3.5100000000000000e+02 2.6130173296324423e-02 0.0000000000000000e+00 +7.8200000000000000e+02 2.6500000000000000e+02 3.5600000000000000e+02 2.7120193416547044e-02 0.0000000000000000e+00 +7.8300000000000000e+02 2.6600000000000000e+02 2.8100000000000000e+02 2.2812707515751211e-02 0.0000000000000000e+00 +7.8400000000000000e+02 2.6600000000000000e+02 2.8500000000000000e+02 2.6189286582543533e-02 0.0000000000000000e+00 +7.8500000000000000e+02 2.6600000000000000e+02 3.5400000000000000e+02 2.0080736778625572e-02 0.0000000000000000e+00 +7.8600000000000000e+02 2.6600000000000000e+02 4.0200000000000000e+02 2.3229744383717211e-02 0.0000000000000000e+00 +7.8700000000000000e+02 2.6700000000000000e+02 2.8400000000000000e+02 2.5598418215509570e-02 0.0000000000000000e+00 +7.8800000000000000e+02 2.6700000000000000e+02 3.5700000000000000e+02 2.3409764952166751e-02 0.0000000000000000e+00 +7.8900000000000000e+02 2.6700000000000000e+02 3.9700000000000000e+02 2.2973972245772103e-02 0.0000000000000000e+00 +7.9000000000000000e+02 2.6800000000000000e+02 2.8100000000000000e+02 2.2711064334563897e-02 0.0000000000000000e+00 +7.9100000000000000e+02 2.6800000000000000e+02 2.8400000000000000e+02 2.3245893863839892e-02 0.0000000000000000e+00 +7.9200000000000000e+02 2.6800000000000000e+02 3.9100000000000000e+02 2.2414528706212591e-02 0.0000000000000000e+00 +7.9300000000000000e+02 2.6800000000000000e+02 4.0300000000000000e+02 2.2219776598679949e-02 0.0000000000000000e+00 +7.9400000000000000e+02 2.6900000000000000e+02 2.7000000000000000e+02 2.5773271877361972e-02 0.0000000000000000e+00 +7.9500000000000000e+02 2.6900000000000000e+02 3.0800000000000000e+02 2.3163636472357644e-02 0.0000000000000000e+00 +7.9600000000000000e+02 2.6900000000000000e+02 3.5800000000000000e+02 2.6646549741226884e-02 0.0000000000000000e+00 +7.9700000000000000e+02 2.7000000000000000e+02 2.8500000000000000e+02 2.6399240392660804e-02 0.0000000000000000e+00 +7.9800000000000000e+02 2.7000000000000000e+02 3.5800000000000000e+02 2.3950929858789358e-02 0.0000000000000000e+00 +7.9900000000000000e+02 2.7000000000000000e+02 3.7000000000000000e+02 2.4107266990102353e-02 0.0000000000000000e+00 +8.0000000000000000e+02 2.7100000000000000e+02 2.8600000000000000e+02 2.4337112727728136e-02 0.0000000000000000e+00 +8.0100000000000000e+02 2.7100000000000000e+02 3.0900000000000000e+02 2.4146112588658647e-02 0.0000000000000000e+00 +8.0200000000000000e+02 2.7100000000000000e+02 3.2400000000000000e+02 2.2872400847453601e-02 0.0000000000000000e+00 +8.0300000000000000e+02 2.7100000000000000e+02 3.6800000000000000e+02 2.3982998792245632e-02 0.0000000000000000e+00 +8.0400000000000000e+02 2.7200000000000000e+02 2.8600000000000000e+02 2.6512083903464864e-02 0.0000000000000000e+00 +8.0500000000000000e+02 2.7200000000000000e+02 3.0800000000000000e+02 2.5245129709917939e-02 0.0000000000000000e+00 +8.0600000000000000e+02 2.7200000000000000e+02 3.6600000000000000e+02 2.3564210269260859e-02 0.0000000000000000e+00 +8.0700000000000000e+02 2.7200000000000000e+02 3.9900000000000000e+02 2.6536982322716639e-02 0.0000000000000000e+00 +8.0800000000000000e+02 2.7300000000000000e+02 2.7500000000000000e+02 2.3350416925835324e-02 0.0000000000000000e+00 +8.0900000000000000e+02 2.7300000000000000e+02 2.7600000000000000e+02 2.0673619548049766e-02 0.0000000000000000e+00 +8.1000000000000000e+02 2.7300000000000000e+02 3.1200000000000000e+02 2.4115776985721937e-02 0.0000000000000000e+00 +8.1100000000000000e+02 2.7300000000000000e+02 3.6700000000000000e+02 2.1155446666275151e-02 0.0000000000000000e+00 +8.1200000000000000e+02 2.7400000000000000e+02 3.0900000000000000e+02 2.8587219304721027e-02 0.0000000000000000e+00 +8.1300000000000000e+02 2.7400000000000000e+02 3.1300000000000000e+02 2.7679292470920099e-02 0.0000000000000000e+00 +8.1400000000000000e+02 2.7400000000000000e+02 3.7100000000000000e+02 2.2634491309367611e-02 0.0000000000000000e+00 +8.1500000000000000e+02 2.7400000000000000e+02 3.7700000000000000e+02 2.6065014854649616e-02 0.0000000000000000e+00 +8.1600000000000000e+02 2.7500000000000000e+02 2.7600000000000000e+02 2.0468507916299981e-02 0.0000000000000000e+00 +8.1700000000000000e+02 2.7500000000000000e+02 2.8700000000000000e+02 2.0711579722987195e-02 0.0000000000000000e+00 +8.1800000000000000e+02 2.7500000000000000e+02 3.6700000000000000e+02 2.0645421102013874e-02 0.0000000000000000e+00 +8.1900000000000000e+02 2.7700000000000000e+02 2.7800000000000000e+02 2.3110177499541310e-02 0.0000000000000000e+00 +8.2000000000000000e+02 2.7700000000000000e+02 2.9800000000000000e+02 2.3360605915854048e-02 0.0000000000000000e+00 +8.2100000000000000e+02 2.7700000000000000e+02 3.8400000000000000e+02 2.2664927118899694e-02 0.0000000000000000e+00 +8.2200000000000000e+02 2.7700000000000000e+02 4.0100000000000000e+02 2.2383533647658393e-02 0.0000000000000000e+00 +8.2300000000000000e+02 2.7800000000000000e+02 4.0000000000000000e+02 2.2175276951440785e-02 0.0000000000000000e+00 +8.2400000000000000e+02 2.7800000000000000e+02 4.0100000000000000e+02 2.3342267723912329e-02 0.0000000000000000e+00 +8.2500000000000000e+02 2.7900000000000000e+02 3.0000000000000000e+02 2.0040686896056092e-02 0.0000000000000000e+00 +8.2600000000000000e+02 2.7900000000000000e+02 3.3300000000000000e+02 2.1862391456912697e-02 0.0000000000000000e+00 +8.2700000000000000e+02 2.7900000000000000e+02 3.6300000000000000e+02 2.2365787812734256e-02 0.0000000000000000e+00 +8.2800000000000000e+02 2.8000000000000000e+02 3.0100000000000000e+02 1.9901908242924982e-02 0.0000000000000000e+00 +8.2900000000000000e+02 2.8000000000000000e+02 3.3600000000000000e+02 2.1986975923422077e-02 0.0000000000000000e+00 +8.3000000000000000e+02 2.8000000000000000e+02 3.6400000000000000e+02 2.2307870437090385e-02 0.0000000000000000e+00 +8.3100000000000000e+02 2.8100000000000000e+02 3.9100000000000000e+02 2.3496202327790903e-02 0.0000000000000000e+00 +8.3200000000000000e+02 2.8100000000000000e+02 4.0200000000000000e+02 2.3164727125569391e-02 0.0000000000000000e+00 +8.3300000000000000e+02 2.8200000000000000e+02 2.8900000000000000e+02 2.1550795803458013e-02 0.0000000000000000e+00 +8.3400000000000000e+02 2.8200000000000000e+02 3.1400000000000000e+02 2.1751292034378221e-02 0.0000000000000000e+00 +8.3500000000000000e+02 2.8200000000000000e+02 4.0500000000000000e+02 2.2184494056806867e-02 0.0000000000000000e+00 +8.3600000000000000e+02 2.8300000000000000e+02 3.5100000000000000e+02 2.6175930150801208e-02 0.0000000000000000e+00 +8.3700000000000000e+02 2.8300000000000000e+02 3.6500000000000000e+02 2.3965021955093573e-02 0.0000000000000000e+00 +8.3800000000000000e+02 2.8400000000000000e+02 3.9700000000000000e+02 2.3304702941730256e-02 0.0000000000000000e+00 +8.3900000000000000e+02 2.8400000000000000e+02 4.0300000000000000e+02 2.1647539219747318e-02 0.0000000000000000e+00 +8.4000000000000000e+02 2.8500000000000000e+02 3.5400000000000000e+02 2.2170069850557705e-02 0.0000000000000000e+00 +8.4100000000000000e+02 2.8500000000000000e+02 3.7000000000000000e+02 2.4675342727348077e-02 0.0000000000000000e+00 +8.4200000000000000e+02 2.8600000000000000e+02 3.6600000000000000e+02 2.5996978834284538e-02 0.0000000000000000e+00 +8.4300000000000000e+02 2.8600000000000000e+02 3.6800000000000000e+02 2.2570409433116126e-02 0.0000000000000000e+00 +8.4400000000000000e+02 2.8700000000000000e+02 3.6700000000000000e+02 2.3255215310761627e-02 0.0000000000000000e+00 +8.4500000000000000e+02 2.8700000000000000e+02 4.0400000000000000e+02 2.1700841062515113e-02 0.0000000000000000e+00 +8.4600000000000000e+02 2.8800000000000000e+02 3.1100000000000000e+02 2.2285593728082462e-02 0.0000000000000000e+00 +8.4700000000000000e+02 2.8800000000000000e+02 3.6100000000000000e+02 2.3820448546494177e-02 0.0000000000000000e+00 +8.4800000000000000e+02 2.8800000000000000e+02 3.7600000000000000e+02 2.1628119539081298e-02 0.0000000000000000e+00 +8.4900000000000000e+02 2.8900000000000000e+02 3.9000000000000000e+02 2.6771930935119124e-02 0.0000000000000000e+00 +8.5000000000000000e+02 2.8900000000000000e+02 4.0500000000000000e+02 2.6561616094848726e-02 0.0000000000000000e+00 +8.5100000000000000e+02 2.9000000000000000e+02 3.2200000000000000e+02 2.2787083634971686e-02 0.0000000000000000e+00 +8.5200000000000000e+02 2.9000000000000000e+02 3.4900000000000000e+02 2.2625850978257065e-02 0.0000000000000000e+00 +8.5300000000000000e+02 2.9100000000000000e+02 3.1900000000000000e+02 2.2820162624367951e-02 0.0000000000000000e+00 +8.5400000000000000e+02 2.9100000000000000e+02 3.6000000000000000e+02 2.2948820682908318e-02 0.0000000000000000e+00 +8.5500000000000000e+02 2.9200000000000000e+02 3.7400000000000000e+02 2.1953362267396456e-02 0.0000000000000000e+00 +8.5600000000000000e+02 2.9200000000000000e+02 3.9200000000000000e+02 2.2480570639222316e-02 0.0000000000000000e+00 +8.5700000000000000e+02 2.9300000000000000e+02 3.4200000000000000e+02 2.2042802637661039e-02 0.0000000000000000e+00 +8.5800000000000000e+02 2.9300000000000000e+02 3.5900000000000000e+02 2.2578817524726482e-02 0.0000000000000000e+00 +8.5900000000000000e+02 2.9400000000000000e+02 3.4000000000000000e+02 2.2165774828794567e-02 0.0000000000000000e+00 +8.6000000000000000e+02 2.9400000000000000e+02 3.6900000000000000e+02 2.2683697292950701e-02 0.0000000000000000e+00 +8.6100000000000000e+02 2.9500000000000000e+02 3.2700000000000000e+02 2.1673021220941578e-02 0.0000000000000000e+00 +8.6200000000000000e+02 2.9500000000000000e+02 3.3100000000000000e+02 2.1771334003727771e-02 0.0000000000000000e+00 +8.6300000000000000e+02 2.9600000000000000e+02 3.3000000000000000e+02 2.2064494852418775e-02 0.0000000000000000e+00 +8.6400000000000000e+02 2.9600000000000000e+02 3.3800000000000000e+02 2.3010724033525106e-02 0.0000000000000000e+00 +8.6500000000000000e+02 2.9700000000000000e+02 3.2600000000000000e+02 2.1951900353191240e-02 0.0000000000000000e+00 +8.6600000000000000e+02 2.9700000000000000e+02 3.8000000000000000e+02 2.2869342692724056e-02 0.0000000000000000e+00 +8.6700000000000000e+02 2.9800000000000000e+02 3.8400000000000000e+02 2.4101996193735514e-02 0.0000000000000000e+00 +8.6800000000000000e+02 2.9800000000000000e+02 3.8600000000000000e+02 2.2433447981312991e-02 0.0000000000000000e+00 +8.6900000000000000e+02 2.9900000000000000e+02 3.3700000000000000e+02 2.0297841325732414e-02 0.0000000000000000e+00 +8.7000000000000000e+02 2.9900000000000000e+02 3.8900000000000000e+02 2.1479444280766164e-02 0.0000000000000000e+00 +8.7100000000000000e+02 3.0000000000000000e+02 3.3300000000000000e+02 2.2222350487944374e-02 0.0000000000000000e+00 +8.7200000000000000e+02 3.0000000000000000e+02 3.3400000000000000e+02 2.2509476478213390e-02 0.0000000000000000e+00 +8.7300000000000000e+02 3.0100000000000000e+02 3.3600000000000000e+02 1.9067122951317884e-02 0.0000000000000000e+00 +8.7400000000000000e+02 3.0200000000000000e+02 3.2000000000000000e+02 1.9553019098148137e-02 0.0000000000000000e+00 +8.7500000000000000e+02 3.0200000000000000e+02 3.8700000000000000e+02 2.1793696184191538e-02 0.0000000000000000e+00 +8.7600000000000000e+02 3.0300000000000000e+02 3.3500000000000000e+02 2.2796917087331930e-02 0.0000000000000000e+00 +8.7700000000000000e+02 3.0300000000000000e+02 3.6200000000000000e+02 2.3031945766133662e-02 0.0000000000000000e+00 +8.7800000000000000e+02 3.0400000000000000e+02 3.1600000000000000e+02 2.1173006095320319e-02 0.0000000000000000e+00 +8.7900000000000000e+02 3.0400000000000000e+02 3.9300000000000000e+02 2.1293087255449039e-02 0.0000000000000000e+00 +8.8000000000000000e+02 3.0400000000000000e+02 4.0900000000000000e+02 2.2614087061290446e-02 0.0000000000000000e+00 +8.8100000000000000e+02 3.0500000000000000e+02 3.2100000000000000e+02 1.9994752363912856e-02 0.0000000000000000e+00 +8.8200000000000000e+02 3.0500000000000000e+02 3.2800000000000000e+02 2.2564412167456249e-02 0.0000000000000000e+00 +8.8300000000000000e+02 3.0600000000000000e+02 3.4300000000000000e+02 1.8743631882809458e-02 0.0000000000000000e+00 +8.8400000000000000e+02 3.0700000000000000e+02 3.5500000000000000e+02 2.2170165185794920e-02 0.0000000000000000e+00 +8.8500000000000000e+02 3.0700000000000000e+02 3.5600000000000000e+02 2.0822148720321534e-02 0.0000000000000000e+00 +8.8600000000000000e+02 3.0800000000000000e+02 3.5800000000000000e+02 2.6142347766738166e-02 0.0000000000000000e+00 +8.8700000000000000e+02 3.0800000000000000e+02 3.9900000000000000e+02 2.2918960664684143e-02 0.0000000000000000e+00 +8.8800000000000000e+02 3.0800000000000000e+02 4.3100000000000000e+02 2.6765252737287748e-02 0.0000000000000000e+00 +8.8900000000000000e+02 3.0900000000000000e+02 3.2400000000000000e+02 2.3011647810625931e-02 0.0000000000000000e+00 +8.9000000000000000e+02 3.0900000000000000e+02 3.7700000000000000e+02 2.3714547662654246e-02 0.0000000000000000e+00 +8.9100000000000000e+02 3.1000000000000000e+02 3.1500000000000000e+02 2.2300148377330509e-02 0.0000000000000000e+00 +8.9200000000000000e+02 3.1000000000000000e+02 3.8800000000000000e+02 2.1577846794343106e-02 0.0000000000000000e+00 +8.9300000000000000e+02 3.1000000000000000e+02 4.2700000000000000e+02 2.2506270253170098e-02 0.0000000000000000e+00 +8.9400000000000000e+02 3.1100000000000000e+02 3.2900000000000000e+02 2.1718978527528517e-02 0.0000000000000000e+00 +8.9500000000000000e+02 3.1100000000000000e+02 3.6100000000000000e+02 2.3310349026790134e-02 0.0000000000000000e+00 +8.9600000000000000e+02 3.1100000000000000e+02 3.8200000000000000e+02 2.2068291141894531e-02 0.0000000000000000e+00 +8.9700000000000000e+02 3.1200000000000000e+02 3.1300000000000000e+02 2.6512575360979434e-02 0.0000000000000000e+00 +8.9800000000000000e+02 3.1200000000000000e+02 3.6700000000000000e+02 2.6460564293618587e-02 0.0000000000000000e+00 +8.9900000000000000e+02 3.1200000000000000e+02 3.9800000000000000e+02 2.9368870566116298e-02 0.0000000000000000e+00 +9.0000000000000000e+02 3.1200000000000000e+02 4.4900000000000000e+02 2.2890749862055283e-02 0.0000000000000000e+00 +9.0100000000000000e+02 3.1300000000000000e+02 3.7100000000000000e+02 2.1266808552402365e-02 0.0000000000000000e+00 +9.0200000000000000e+02 3.1300000000000000e+02 3.9800000000000000e+02 2.6692320845313675e-02 0.0000000000000000e+00 +9.0300000000000000e+02 3.1400000000000000e+02 3.5500000000000000e+02 2.5034378814264055e-02 0.0000000000000000e+00 +9.0400000000000000e+02 3.1400000000000000e+02 4.0500000000000000e+02 2.2642996088777685e-02 0.0000000000000000e+00 +9.0500000000000000e+02 3.1400000000000000e+02 4.2500000000000000e+02 2.7461350307034633e-02 0.0000000000000000e+00 +9.0600000000000000e+02 3.1500000000000000e+02 4.0600000000000000e+02 2.1853530980549415e-02 0.0000000000000000e+00 +9.0700000000000000e+02 3.1500000000000000e+02 4.2700000000000000e+02 2.2207683828967952e-02 0.0000000000000000e+00 +9.0800000000000000e+02 3.1600000000000000e+02 4.0700000000000000e+02 2.2022085376007972e-02 0.0000000000000000e+00 +9.0900000000000000e+02 3.1600000000000000e+02 4.0900000000000000e+02 2.2691389587603642e-02 0.0000000000000000e+00 +9.1000000000000000e+02 3.1700000000000000e+02 3.4700000000000000e+02 1.9505909510143644e-02 0.0000000000000000e+00 +9.1100000000000000e+02 3.1700000000000000e+02 3.8500000000000000e+02 2.2442429160765016e-02 0.0000000000000000e+00 +9.1200000000000000e+02 3.1700000000000000e+02 4.0800000000000000e+02 2.1748192072862497e-02 0.0000000000000000e+00 +9.1300000000000000e+02 3.1800000000000000e+02 3.2500000000000000e+02 1.9097315462347775e-02 0.0000000000000000e+00 +9.1400000000000000e+02 3.1800000000000000e+02 3.3700000000000000e+02 1.9484394465933214e-02 0.0000000000000000e+00 +9.1500000000000000e+02 3.1800000000000000e+02 4.1300000000000000e+02 2.0730351571507360e-02 0.0000000000000000e+00 +9.1600000000000000e+02 3.1800000000000000e+02 4.1500000000000000e+02 2.1040994263306502e-02 0.0000000000000000e+00 +9.1700000000000000e+02 3.1900000000000000e+02 3.6000000000000000e+02 2.3174938699627150e-02 0.0000000000000000e+00 +9.1800000000000000e+02 3.1900000000000000e+02 3.9200000000000000e+02 2.1439098206961993e-02 0.0000000000000000e+00 +9.1900000000000000e+02 3.1900000000000000e+02 4.3800000000000000e+02 2.2195555673998824e-02 0.0000000000000000e+00 +9.2000000000000000e+02 3.1900000000000000e+02 4.5700000000000000e+02 2.2034540042994374e-02 0.0000000000000000e+00 +9.2100000000000000e+02 3.2000000000000000e+02 3.6400000000000000e+02 1.7964654066924605e-02 0.0000000000000000e+00 +9.2200000000000000e+02 3.2000000000000000e+02 3.8700000000000000e+02 1.8466775260925692e-02 0.0000000000000000e+00 +9.2300000000000000e+02 3.2000000000000000e+02 4.3400000000000000e+02 2.2640856127237926e-02 0.0000000000000000e+00 +9.2400000000000000e+02 3.2100000000000000e+02 3.2800000000000000e+02 1.8736142924539852e-02 0.0000000000000000e+00 +9.2500000000000000e+02 3.2100000000000000e+02 3.9000000000000000e+02 1.9961112273309021e-02 0.0000000000000000e+00 +9.2600000000000000e+02 3.2100000000000000e+02 4.4400000000000000e+02 2.1059578679045184e-02 0.0000000000000000e+00 +9.2700000000000000e+02 3.2200000000000000e+02 3.4900000000000000e+02 2.0914050807213098e-02 0.0000000000000000e+00 +9.2800000000000000e+02 3.2200000000000000e+02 3.8800000000000000e+02 2.1328232351194614e-02 0.0000000000000000e+00 +9.2900000000000000e+02 3.2200000000000000e+02 4.2400000000000000e+02 2.2428990318465125e-02 0.0000000000000000e+00 +9.3000000000000000e+02 3.2200000000000000e+02 4.7400000000000000e+02 2.2187787798766477e-02 0.0000000000000000e+00 +9.3100000000000000e+02 3.2300000000000000e+02 3.5900000000000000e+02 2.0183618137040650e-02 0.0000000000000000e+00 +9.3200000000000000e+02 3.2300000000000000e+02 3.7200000000000000e+02 2.0813079045984229e-02 0.0000000000000000e+00 +9.3300000000000000e+02 3.2300000000000000e+02 4.3700000000000000e+02 2.2650976100194991e-02 0.0000000000000000e+00 +9.3400000000000000e+02 3.2300000000000000e+02 4.8100000000000000e+02 2.1563811593650315e-02 0.0000000000000000e+00 +9.3500000000000000e+02 3.2400000000000000e+02 3.6800000000000000e+02 2.4565862095804653e-02 0.0000000000000000e+00 +9.3600000000000000e+02 3.2400000000000000e+02 3.7700000000000000e+02 2.3396103558704581e-02 0.0000000000000000e+00 +9.3700000000000000e+02 3.2400000000000000e+02 4.6600000000000000e+02 2.3608672113869387e-02 0.0000000000000000e+00 +9.3800000000000000e+02 3.2400000000000000e+02 4.7900000000000000e+02 2.4057711727902380e-02 0.0000000000000000e+00 +9.3900000000000000e+02 3.2500000000000000e+02 3.3900000000000000e+02 1.9613624613945894e-02 0.0000000000000000e+00 +9.4000000000000000e+02 3.2500000000000000e+02 4.1300000000000000e+02 2.1545377674348450e-02 0.0000000000000000e+00 +9.4100000000000000e+02 3.2500000000000000e+02 4.1700000000000000e+02 2.1212238981218452e-02 0.0000000000000000e+00 +9.4200000000000000e+02 3.2600000000000000e+02 3.3100000000000000e+02 1.9970834766920093e-02 0.0000000000000000e+00 +9.4300000000000000e+02 3.2600000000000000e+02 3.8000000000000000e+02 2.0650166606324617e-02 0.0000000000000000e+00 +9.4400000000000000e+02 3.2600000000000000e+02 4.1200000000000000e+02 2.2428813263978980e-02 0.0000000000000000e+00 +9.4500000000000000e+02 3.2600000000000000e+02 4.5200000000000000e+02 2.1918823891955985e-02 0.0000000000000000e+00 +9.4600000000000000e+02 3.2700000000000000e+02 3.3000000000000000e+02 1.9012211970022886e-02 0.0000000000000000e+00 +9.4700000000000000e+02 3.2700000000000000e+02 3.3100000000000000e+02 1.9893546584245348e-02 0.0000000000000000e+00 +9.4800000000000000e+02 3.2700000000000000e+02 4.4800000000000000e+02 2.2105504830304903e-02 0.0000000000000000e+00 +9.4900000000000000e+02 3.2700000000000000e+02 4.9100000000000000e+02 2.1335204809145070e-02 0.0000000000000000e+00 +9.5000000000000000e+02 3.2800000000000000e+02 3.5000000000000000e+02 1.9203636549915463e-02 0.0000000000000000e+00 +9.5100000000000000e+02 3.2800000000000000e+02 4.4400000000000000e+02 2.1699787298525994e-02 0.0000000000000000e+00 +9.5200000000000000e+02 3.2800000000000000e+02 4.6700000000000000e+02 2.1497709977711679e-02 0.0000000000000000e+00 +9.5300000000000000e+02 3.2900000000000000e+02 3.5200000000000000e+02 2.3180555375644493e-02 0.0000000000000000e+00 +9.5400000000000000e+02 3.2900000000000000e+02 3.8200000000000000e+02 2.2569497069257479e-02 0.0000000000000000e+00 +9.5500000000000000e+02 3.2900000000000000e+02 4.1800000000000000e+02 2.2175889350957483e-02 0.0000000000000000e+00 +9.5600000000000000e+02 3.2900000000000000e+02 4.3200000000000000e+02 2.2062386633517884e-02 0.0000000000000000e+00 +9.5700000000000000e+02 3.3000000000000000e+02 3.3800000000000000e+02 1.9819342731621427e-02 0.0000000000000000e+00 +9.5800000000000000e+02 3.3000000000000000e+02 4.2600000000000000e+02 2.1534762167242469e-02 0.0000000000000000e+00 +9.5900000000000000e+02 3.3000000000000000e+02 4.9100000000000000e+02 2.1432385535706106e-02 0.0000000000000000e+00 +9.6000000000000000e+02 3.3100000000000000e+02 4.4800000000000000e+02 2.1997074298151870e-02 0.0000000000000000e+00 +9.6100000000000000e+02 3.3100000000000000e+02 4.5200000000000000e+02 2.2103147223294348e-02 0.0000000000000000e+00 +9.6200000000000000e+02 3.3200000000000000e+02 3.7500000000000000e+02 1.9346911318081608e-02 0.0000000000000000e+00 +9.6300000000000000e+02 3.3200000000000000e+02 3.9400000000000000e+02 1.9037543920221153e-02 0.0000000000000000e+00 +9.6400000000000000e+02 3.3200000000000000e+02 4.2300000000000000e+02 2.1672999883144511e-02 0.0000000000000000e+00 +9.6500000000000000e+02 3.3200000000000000e+02 4.4200000000000000e+02 2.1451643074180498e-02 0.0000000000000000e+00 +9.6600000000000000e+02 3.3300000000000000e+02 3.3400000000000000e+02 2.0546640298554849e-02 0.0000000000000000e+00 +9.6700000000000000e+02 3.3300000000000000e+02 3.6300000000000000e+02 1.9561140060397116e-02 0.0000000000000000e+00 +9.6800000000000000e+02 3.3300000000000000e+02 4.4100000000000000e+02 2.1785220521397038e-02 0.0000000000000000e+00 +9.6900000000000000e+02 3.3300000000000000e+02 4.8500000000000000e+02 2.2203823088669451e-02 0.0000000000000000e+00 +9.7000000000000000e+02 3.3400000000000000e+02 4.0000000000000000e+02 2.1165910064679827e-02 0.0000000000000000e+00 +9.7100000000000000e+02 3.3400000000000000e+02 4.4100000000000000e+02 2.1656811853116558e-02 0.0000000000000000e+00 +9.7200000000000000e+02 3.3400000000000000e+02 4.7800000000000000e+02 2.2406012502870030e-02 0.0000000000000000e+00 +9.7300000000000000e+02 3.3500000000000000e+02 3.6200000000000000e+02 1.9589920847208286e-02 0.0000000000000000e+00 +9.7400000000000000e+02 3.3500000000000000e+02 3.7800000000000000e+02 1.9714269504396077e-02 0.0000000000000000e+00 +9.7500000000000000e+02 3.3500000000000000e+02 4.2800000000000000e+02 2.1485043544894503e-02 0.0000000000000000e+00 +9.7600000000000000e+02 3.3500000000000000e+02 4.7500000000000000e+02 2.1571593437416069e-02 0.0000000000000000e+00 +9.7700000000000000e+02 3.3600000000000000e+02 3.6400000000000000e+02 2.0934964640255658e-02 0.0000000000000000e+00 +9.7800000000000000e+02 3.3600000000000000e+02 3.8900000000000000e+02 1.8742370177049984e-02 0.0000000000000000e+00 +9.7900000000000000e+02 3.3600000000000000e+02 4.5800000000000000e+02 2.1371302145612801e-02 0.0000000000000000e+00 +9.8000000000000000e+02 3.3700000000000000e+02 3.8900000000000000e+02 2.0032701766845459e-02 0.0000000000000000e+00 +9.8100000000000000e+02 3.3700000000000000e+02 4.1500000000000000e+02 2.1271287420264989e-02 0.0000000000000000e+00 +9.8200000000000000e+02 3.3800000000000000e+02 3.8300000000000000e+02 1.9956729916920903e-02 0.0000000000000000e+00 +9.8300000000000000e+02 3.3800000000000000e+02 4.2600000000000000e+02 2.0628199553168643e-02 0.0000000000000000e+00 +9.8400000000000000e+02 3.3800000000000000e+02 4.5000000000000000e+02 2.1505067046504567e-02 0.0000000000000000e+00 +9.8500000000000000e+02 3.3900000000000000e+02 3.6300000000000000e+02 1.9479174126493134e-02 0.0000000000000000e+00 +9.8600000000000000e+02 3.3900000000000000e+02 4.1700000000000000e+02 2.1150391506205568e-02 0.0000000000000000e+00 +9.8700000000000000e+02 3.3900000000000000e+02 4.7700000000000000e+02 2.1433399194609664e-02 0.0000000000000000e+00 +9.8800000000000000e+02 3.4000000000000000e+02 3.4100000000000000e+02 2.0926783380165126e-02 0.0000000000000000e+00 +9.8900000000000000e+02 3.4000000000000000e+02 3.6900000000000000e+02 2.1067704941535134e-02 0.0000000000000000e+00 +9.9000000000000000e+02 3.4000000000000000e+02 4.1600000000000000e+02 2.1975894483626378e-02 0.0000000000000000e+00 +9.9100000000000000e+02 3.4000000000000000e+02 4.6800000000000000e+02 2.2021568562305728e-02 0.0000000000000000e+00 +9.9200000000000000e+02 3.4100000000000000e+02 4.0700000000000000e+02 2.1059383274732588e-02 0.0000000000000000e+00 +9.9300000000000000e+02 3.4100000000000000e+02 4.1600000000000000e+02 2.2262560995779147e-02 0.0000000000000000e+00 +9.9400000000000000e+02 3.4100000000000000e+02 4.8400000000000000e+02 2.2494478444194565e-02 0.0000000000000000e+00 +9.9500000000000000e+02 3.4200000000000000e+02 3.5900000000000000e+02 1.9755576133540450e-02 0.0000000000000000e+00 +9.9600000000000000e+02 3.4200000000000000e+02 3.9300000000000000e+02 1.9354156050738262e-02 0.0000000000000000e+00 +9.9700000000000000e+02 3.4200000000000000e+02 4.6300000000000000e+02 2.2136900493266064e-02 0.0000000000000000e+00 +9.9800000000000000e+02 3.4200000000000000e+02 4.7300000000000000e+02 2.1596910652051927e-02 0.0000000000000000e+00 +9.9900000000000000e+02 3.4300000000000000e+02 3.5000000000000000e+02 1.8422408272744693e-02 0.0000000000000000e+00 +1.0000000000000000e+03 3.4300000000000000e+02 3.7600000000000000e+02 2.1847931482546837e-02 0.0000000000000000e+00 +1.0010000000000000e+03 3.4300000000000000e+02 4.9000000000000000e+02 1.8265672244843160e-02 0.0000000000000000e+00 +1.0020000000000000e+03 3.4400000000000000e+02 3.4800000000000000e+02 2.0040078569140061e-02 0.0000000000000000e+00 +1.0030000000000000e+03 3.4400000000000000e+02 3.7300000000000000e+02 1.9234602118946481e-02 0.0000000000000000e+00 +1.0040000000000000e+03 3.4400000000000000e+02 4.3000000000000000e+02 2.2040030213232278e-02 0.0000000000000000e+00 +1.0050000000000000e+03 3.4400000000000000e+02 4.7200000000000000e+02 2.1770231541107864e-02 0.0000000000000000e+00 +1.0060000000000000e+03 3.4500000000000000e+02 3.8700000000000000e+02 2.0341940751800392e-02 0.0000000000000000e+00 +1.0070000000000000e+03 3.4500000000000000e+02 4.1900000000000000e+02 1.9883001900055989e-02 0.0000000000000000e+00 +1.0080000000000000e+03 3.4500000000000000e+02 4.3300000000000000e+02 2.5103638209515694e-02 0.0000000000000000e+00 +1.0090000000000000e+03 3.4500000000000000e+02 4.6400000000000000e+02 2.2139895577942714e-02 0.0000000000000000e+00 +1.0100000000000000e+03 3.4600000000000000e+02 3.7300000000000000e+02 2.0790121147134206e-02 0.0000000000000000e+00 +1.0110000000000000e+03 3.4600000000000000e+02 3.9600000000000000e+02 2.1192717455266640e-02 0.0000000000000000e+00 +1.0120000000000000e+03 3.4600000000000000e+02 4.2000000000000000e+02 2.1833956315200430e-02 0.0000000000000000e+00 +1.0130000000000000e+03 3.4600000000000000e+02 4.8700000000000000e+02 2.1479922415753038e-02 0.0000000000000000e+00 +1.0140000000000000e+03 3.4700000000000000e+02 3.7800000000000000e+02 2.2359375105617720e-02 0.0000000000000000e+00 +1.0150000000000000e+03 3.4700000000000000e+02 3.8500000000000000e+02 2.1876984635114876e-02 0.0000000000000000e+00 +1.0160000000000000e+03 3.4800000000000000e+02 4.0800000000000000e+02 1.9608475344518414e-02 0.0000000000000000e+00 +1.0170000000000000e+03 3.4800000000000000e+02 4.3000000000000000e+02 2.2208505287693452e-02 0.0000000000000000e+00 +1.0180000000000000e+03 3.4800000000000000e+02 4.8600000000000000e+02 2.2650525768750387e-02 0.0000000000000000e+00 +1.0190000000000000e+03 3.4900000000000000e+02 4.0400000000000000e+02 2.0989851651070555e-02 0.0000000000000000e+00 +1.0200000000000000e+03 3.4900000000000000e+02 4.2400000000000000e+02 2.1800985243871505e-02 0.0000000000000000e+00 +1.0210000000000000e+03 3.4900000000000000e+02 4.6100000000000000e+02 2.2803429329819998e-02 0.0000000000000000e+00 +1.0220000000000000e+03 3.5000000000000000e+02 4.6700000000000000e+02 2.2171308413982613e-02 0.0000000000000000e+00 +1.0230000000000000e+03 3.5000000000000000e+02 4.9000000000000000e+02 1.9010907223844204e-02 0.0000000000000000e+00 +1.0240000000000000e+03 3.5100000000000000e+02 3.5600000000000000e+02 2.7736438379164490e-02 0.0000000000000000e+00 +1.0250000000000000e+03 3.5100000000000000e+02 3.6500000000000000e+02 2.8632279489109624e-02 0.0000000000000000e+00 +1.0260000000000000e+03 3.5100000000000000e+02 4.1000000000000000e+02 2.4594765497118604e-02 0.0000000000000000e+00 +1.0270000000000000e+03 3.5100000000000000e+02 4.2900000000000000e+02 2.9507068235239672e-02 0.0000000000000000e+00 +1.0280000000000000e+03 3.5200000000000000e+02 3.9600000000000000e+02 2.1930625264847927e-02 0.0000000000000000e+00 +1.0290000000000000e+03 3.5200000000000000e+02 4.3200000000000000e+02 2.2517573561962555e-02 0.0000000000000000e+00 +1.0300000000000000e+03 3.5200000000000000e+02 4.6200000000000000e+02 2.1321233939382830e-02 0.0000000000000000e+00 +1.0310000000000000e+03 3.5300000000000000e+02 3.6000000000000000e+02 2.2332298229307514e-02 0.0000000000000000e+00 +1.0320000000000000e+03 3.5300000000000000e+02 4.0600000000000000e+02 2.2082366577622990e-02 0.0000000000000000e+00 +1.0330000000000000e+03 3.5300000000000000e+02 4.4600000000000000e+02 2.2487471213573300e-02 0.0000000000000000e+00 +1.0340000000000000e+03 3.5300000000000000e+02 4.7000000000000000e+02 2.1253849056910610e-02 0.0000000000000000e+00 +1.0350000000000000e+03 3.5400000000000000e+02 3.7000000000000000e+02 2.1115334903641668e-02 0.0000000000000000e+00 +1.0360000000000000e+03 3.5400000000000000e+02 4.0200000000000000e+02 2.0580569573814239e-02 0.0000000000000000e+00 +1.0370000000000000e+03 3.5400000000000000e+02 4.5100000000000000e+02 2.0447840859109202e-02 0.0000000000000000e+00 +1.0380000000000000e+03 3.5500000000000000e+02 3.5600000000000000e+02 2.6853393323785689e-02 0.0000000000000000e+00 +1.0390000000000000e+03 3.5500000000000000e+02 4.2500000000000000e+02 2.6686476993629790e-02 0.0000000000000000e+00 +1.0400000000000000e+03 3.5500000000000000e+02 4.3600000000000000e+02 2.4893840484981004e-02 0.0000000000000000e+00 +1.0410000000000000e+03 3.5600000000000000e+02 4.2900000000000000e+02 2.7207847563120547e-02 0.0000000000000000e+00 +1.0420000000000000e+03 3.5600000000000000e+02 4.3600000000000000e+02 2.6116675688723660e-02 0.0000000000000000e+00 +1.0430000000000000e+03 3.5700000000000000e+02 3.6500000000000000e+02 2.5684666840176541e-02 0.0000000000000000e+00 +1.0440000000000000e+03 3.5700000000000000e+02 3.9700000000000000e+02 2.5275152225355292e-02 0.0000000000000000e+00 +1.0450000000000000e+03 3.5700000000000000e+02 4.2200000000000000e+02 2.3353725006101000e-02 0.0000000000000000e+00 +1.0460000000000000e+03 3.5700000000000000e+02 4.4000000000000000e+02 2.2967168540564381e-02 0.0000000000000000e+00 +1.0470000000000000e+03 3.5800000000000000e+02 3.7000000000000000e+02 2.3601593591652349e-02 0.0000000000000000e+00 +1.0480000000000000e+03 3.5800000000000000e+02 4.3100000000000000e+02 2.2301822222017618e-02 0.0000000000000000e+00 +1.0490000000000000e+03 3.5800000000000000e+02 4.8300000000000000e+02 2.5670685671119315e-02 0.0000000000000000e+00 +1.0500000000000000e+03 3.5900000000000000e+02 4.7300000000000000e+02 2.1486293381816811e-02 0.0000000000000000e+00 +1.0510000000000000e+03 3.5900000000000000e+02 4.8100000000000000e+02 2.1569220060220870e-02 0.0000000000000000e+00 +1.0520000000000000e+03 3.6000000000000000e+02 4.4600000000000000e+02 2.1766665590755487e-02 0.0000000000000000e+00 +1.0530000000000000e+03 3.6000000000000000e+02 4.5700000000000000e+02 2.1998341415386688e-02 0.0000000000000000e+00 +1.0540000000000000e+03 3.6100000000000000e+02 3.7600000000000000e+02 2.2407757350020926e-02 0.0000000000000000e+00 +1.0550000000000000e+03 3.6100000000000000e+02 3.8200000000000000e+02 2.2616910926442139e-02 0.0000000000000000e+00 +1.0560000000000000e+03 3.6100000000000000e+02 4.4300000000000000e+02 2.1936938682971006e-02 0.0000000000000000e+00 +1.0570000000000000e+03 3.6100000000000000e+02 4.8900000000000000e+02 2.6074140353227727e-02 0.0000000000000000e+00 +1.0580000000000000e+03 3.6200000000000000e+02 3.9400000000000000e+02 1.9530740893416960e-02 0.0000000000000000e+00 +1.0590000000000000e+03 3.6200000000000000e+02 4.2800000000000000e+02 2.1502959408773666e-02 0.0000000000000000e+00 +1.0600000000000000e+03 3.6200000000000000e+02 4.3500000000000000e+02 2.2217912123248477e-02 0.0000000000000000e+00 +1.0610000000000000e+03 3.6300000000000000e+02 4.7700000000000000e+02 2.1801774784370089e-02 0.0000000000000000e+00 +1.0620000000000000e+03 3.6300000000000000e+02 4.8500000000000000e+02 2.2087953743649125e-02 0.0000000000000000e+00 +1.0630000000000000e+03 3.6400000000000000e+02 4.3400000000000000e+02 2.4053874980135118e-02 0.0000000000000000e+00 +1.0640000000000000e+03 3.6400000000000000e+02 4.5800000000000000e+02 2.0830221542563310e-02 0.0000000000000000e+00 +1.0650000000000000e+03 3.6500000000000000e+02 4.1000000000000000e+02 2.4152235817755843e-02 0.0000000000000000e+00 +1.0660000000000000e+03 3.6500000000000000e+02 4.2200000000000000e+02 2.3523752765573700e-02 0.0000000000000000e+00 +1.0670000000000000e+03 3.6600000000000000e+02 3.6800000000000000e+02 2.5284918460111563e-02 0.0000000000000000e+00 +1.0680000000000000e+03 3.6600000000000000e+02 3.9900000000000000e+02 2.4093323659429233e-02 0.0000000000000000e+00 +1.0690000000000000e+03 3.6600000000000000e+02 4.7100000000000000e+02 2.5714771234025487e-02 0.0000000000000000e+00 +1.0700000000000000e+03 3.6600000000000000e+02 4.8200000000000000e+02 2.3262463822627970e-02 0.0000000000000000e+00 +1.0710000000000000e+03 3.6700000000000000e+02 4.0400000000000000e+02 2.1843263444369716e-02 0.0000000000000000e+00 +1.0720000000000000e+03 3.6700000000000000e+02 4.4900000000000000e+02 2.0003297055771384e-02 0.0000000000000000e+00 +1.0730000000000000e+03 3.6800000000000000e+02 4.7900000000000000e+02 2.3190490310251017e-02 0.0000000000000000e+00 +1.0740000000000000e+03 3.6800000000000000e+02 4.8200000000000000e+02 2.4546662330373496e-02 0.0000000000000000e+00 +1.0750000000000000e+03 3.6900000000000000e+02 3.8100000000000000e+02 2.0849128241503666e-02 0.0000000000000000e+00 +1.0760000000000000e+03 3.6900000000000000e+02 4.5400000000000000e+02 2.2186221882066877e-02 0.0000000000000000e+00 +1.0770000000000000e+03 3.6900000000000000e+02 4.6800000000000000e+02 2.2291719059982583e-02 0.0000000000000000e+00 +1.0780000000000000e+03 3.7000000000000000e+02 4.5100000000000000e+02 2.5867771934745199e-02 0.0000000000000000e+00 +1.0790000000000000e+03 3.7000000000000000e+02 4.8300000000000000e+02 2.3557366291692354e-02 0.0000000000000000e+00 +1.0800000000000000e+03 3.7100000000000000e+02 3.7700000000000000e+02 2.2229571428704385e-02 0.0000000000000000e+00 +1.0810000000000000e+03 3.7100000000000000e+02 3.9800000000000000e+02 2.2354248844529041e-02 0.0000000000000000e+00 +1.0820000000000000e+03 3.7100000000000000e+02 4.2100000000000000e+02 2.1343357464807273e-02 0.0000000000000000e+00 +1.0830000000000000e+03 3.7200000000000000e+02 3.7400000000000000e+02 2.1257072343333374e-02 0.0000000000000000e+00 +1.0840000000000000e+03 3.7200000000000000e+02 4.3700000000000000e+02 2.2338096077625134e-02 0.0000000000000000e+00 +1.0850000000000000e+03 3.7200000000000000e+02 4.3900000000000000e+02 2.2812599292673045e-02 0.0000000000000000e+00 +1.0860000000000000e+03 3.7300000000000000e+02 4.7200000000000000e+02 2.1207138950479709e-02 0.0000000000000000e+00 +1.0870000000000000e+03 3.7300000000000000e+02 4.8700000000000000e+02 2.2377914149750877e-02 0.0000000000000000e+00 +1.0880000000000000e+03 3.7400000000000000e+02 3.9200000000000000e+02 2.1307326763186429e-02 0.0000000000000000e+00 +1.0890000000000000e+03 3.7400000000000000e+02 4.1400000000000000e+02 2.2200887032229541e-02 0.0000000000000000e+00 +1.0900000000000000e+03 3.7400000000000000e+02 4.3900000000000000e+02 2.2362911876165490e-02 0.0000000000000000e+00 +1.0910000000000000e+03 3.7500000000000000e+02 3.9500000000000000e+02 2.0500778624415471e-02 0.0000000000000000e+00 +1.0920000000000000e+03 3.7500000000000000e+02 4.4200000000000000e+02 2.1419546582856833e-02 0.0000000000000000e+00 +1.0930000000000000e+03 3.7500000000000000e+02 4.6500000000000000e+02 2.2878995624126201e-02 0.0000000000000000e+00 +1.0940000000000000e+03 3.7600000000000000e+02 4.8900000000000000e+02 2.4827297097337254e-02 0.0000000000000000e+00 +1.0950000000000000e+03 3.7600000000000000e+02 4.9000000000000000e+02 1.8527289275064820e-02 0.0000000000000000e+00 +1.0960000000000000e+03 3.7700000000000000e+02 4.2100000000000000e+02 2.3537186089431401e-02 0.0000000000000000e+00 +1.0970000000000000e+03 3.7700000000000000e+02 4.6600000000000000e+02 2.2426858989621500e-02 0.0000000000000000e+00 +1.0980000000000000e+03 3.7800000000000000e+02 3.8500000000000000e+02 1.8422776272767883e-02 0.0000000000000000e+00 +1.0990000000000000e+03 3.7800000000000000e+02 4.5300000000000000e+02 2.0951539765337066e-02 0.0000000000000000e+00 +1.1000000000000000e+03 3.7800000000000000e+02 4.7500000000000000e+02 2.1782813241360912e-02 0.0000000000000000e+00 +1.1010000000000000e+03 3.7900000000000000e+02 3.8100000000000000e+02 2.1029979842528281e-02 0.0000000000000000e+00 +1.1020000000000000e+03 3.7900000000000000e+02 4.1100000000000000e+02 2.0300417933807866e-02 0.0000000000000000e+00 +1.1030000000000000e+03 3.7900000000000000e+02 4.4500000000000000e+02 2.2079139357576130e-02 0.0000000000000000e+00 +1.1040000000000000e+03 3.7900000000000000e+02 4.4700000000000000e+02 2.1997185848944226e-02 0.0000000000000000e+00 +1.1050000000000000e+03 3.8000000000000000e+02 3.8600000000000000e+02 2.0752809296643904e-02 0.0000000000000000e+00 +1.1060000000000000e+03 3.8000000000000000e+02 4.1200000000000000e+02 2.2243635966335103e-02 0.0000000000000000e+00 +1.1070000000000000e+03 3.8000000000000000e+02 4.5600000000000000e+02 2.2432246638772541e-02 0.0000000000000000e+00 +1.1080000000000000e+03 3.8100000000000000e+02 4.4700000000000000e+02 2.1430697997644445e-02 0.0000000000000000e+00 +1.1090000000000000e+03 3.8100000000000000e+02 4.5400000000000000e+02 2.1877755007818540e-02 0.0000000000000000e+00 +1.1100000000000000e+03 3.8200000000000000e+02 4.1800000000000000e+02 2.2672212612094570e-02 0.0000000000000000e+00 +1.1110000000000000e+03 3.8200000000000000e+02 4.4300000000000000e+02 2.3757034012233211e-02 0.0000000000000000e+00 +1.1120000000000000e+03 3.8200000000000000e+02 4.5900000000000000e+02 2.2658891955402209e-02 0.0000000000000000e+00 +1.1130000000000000e+03 3.8300000000000000e+02 4.1100000000000000e+02 2.0753716903199205e-02 0.0000000000000000e+00 +1.1140000000000000e+03 3.8300000000000000e+02 4.5000000000000000e+02 2.1269697483744385e-02 0.0000000000000000e+00 +1.1150000000000000e+03 3.8300000000000000e+02 4.8800000000000000e+02 2.1809275503206774e-02 0.0000000000000000e+00 +1.1160000000000000e+03 3.8400000000000000e+02 3.8600000000000000e+02 2.1764821864634465e-02 0.0000000000000000e+00 +1.1170000000000000e+03 3.8400000000000000e+02 4.0100000000000000e+02 2.1107751677094153e-02 0.0000000000000000e+00 +1.1180000000000000e+03 3.8400000000000000e+02 4.5500000000000000e+02 2.1839414360543010e-02 0.0000000000000000e+00 +1.1190000000000000e+03 3.8400000000000000e+02 4.9200000000000000e+02 2.2756330025296274e-02 0.0000000000000000e+00 +1.1200000000000000e+03 3.8500000000000000e+02 4.0800000000000000e+02 1.9086185165424274e-02 0.0000000000000000e+00 +1.1210000000000000e+03 3.8500000000000000e+02 4.5300000000000000e+02 2.1502742878486799e-02 0.0000000000000000e+00 +1.1220000000000000e+03 3.8500000000000000e+02 5.0600000000000000e+02 2.1544634843416611e-02 0.0000000000000000e+00 +1.1230000000000000e+03 3.8600000000000000e+02 4.5500000000000000e+02 2.2977334336638223e-02 0.0000000000000000e+00 +1.1240000000000000e+03 3.8600000000000000e+02 4.5600000000000000e+02 2.2522951826424716e-02 0.0000000000000000e+00 +1.1250000000000000e+03 3.8700000000000000e+02 4.3300000000000000e+02 2.2259088755432463e-02 0.0000000000000000e+00 +1.1260000000000000e+03 3.8700000000000000e+02 4.3400000000000000e+02 2.5810675914802080e-02 0.0000000000000000e+00 +1.1270000000000000e+03 3.8800000000000000e+02 4.2700000000000000e+02 2.1726445722467531e-02 0.0000000000000000e+00 +1.1280000000000000e+03 3.8800000000000000e+02 4.7400000000000000e+02 2.2393232657066442e-02 0.0000000000000000e+00 +1.1290000000000000e+03 3.8800000000000000e+02 5.2100000000000000e+02 2.2682070457199621e-02 0.0000000000000000e+00 +1.1300000000000000e+03 3.8900000000000000e+02 4.1500000000000000e+02 2.1655365269747623e-02 0.0000000000000000e+00 +1.1310000000000000e+03 3.8900000000000000e+02 4.5800000000000000e+02 2.1930816137811320e-02 0.0000000000000000e+00 +1.1320000000000000e+03 3.9000000000000000e+02 4.0500000000000000e+02 2.4759547789199126e-02 0.0000000000000000e+00 +1.1330000000000000e+03 3.9000000000000000e+02 4.4400000000000000e+02 2.4248641168035399e-02 0.0000000000000000e+00 +1.1340000000000000e+03 3.9000000000000000e+02 5.0300000000000000e+02 2.5099025868377679e-02 0.0000000000000000e+00 +1.1350000000000000e+03 3.9000000000000000e+02 5.5800000000000000e+02 2.8384181464452374e-02 0.0000000000000000e+00 +1.1360000000000000e+03 3.9100000000000000e+02 4.0200000000000000e+02 2.2978161802485152e-02 0.0000000000000000e+00 +1.1370000000000000e+03 3.9100000000000000e+02 4.0300000000000000e+02 2.3861536794738084e-02 0.0000000000000000e+00 +1.1380000000000000e+03 3.9100000000000000e+02 4.6000000000000000e+02 2.2538737832548950e-02 0.0000000000000000e+00 +1.1390000000000000e+03 3.9100000000000000e+02 4.8000000000000000e+02 2.3433076268121859e-02 0.0000000000000000e+00 +1.1400000000000000e+03 3.9200000000000000e+02 4.1400000000000000e+02 2.3302851262868966e-02 0.0000000000000000e+00 +1.1410000000000000e+03 3.9200000000000000e+02 4.3800000000000000e+02 2.2636800454504096e-02 0.0000000000000000e+00 +1.1420000000000000e+03 3.9300000000000000e+02 4.0900000000000000e+02 2.0907240594208971e-02 0.0000000000000000e+00 +1.1430000000000000e+03 3.9300000000000000e+02 4.6300000000000000e+02 2.2113366078514819e-02 0.0000000000000000e+00 +1.1440000000000000e+03 3.9300000000000000e+02 5.0800000000000000e+02 2.3217750573963875e-02 0.0000000000000000e+00 +1.1450000000000000e+03 3.9400000000000000e+02 4.2300000000000000e+02 2.2835677123092937e-02 0.0000000000000000e+00 +1.1460000000000000e+03 3.9400000000000000e+02 4.3500000000000000e+02 2.2667279484420440e-02 0.0000000000000000e+00 +1.1470000000000000e+03 3.9500000000000000e+02 4.1900000000000000e+02 2.0588164842573555e-02 0.0000000000000000e+00 +1.1480000000000000e+03 3.9500000000000000e+02 4.6500000000000000e+02 2.1898100553612083e-02 0.0000000000000000e+00 +1.1490000000000000e+03 3.9500000000000000e+02 4.7600000000000000e+02 2.3366202263071241e-02 0.0000000000000000e+00 +1.1500000000000000e+03 3.9600000000000000e+02 4.2000000000000000e+02 2.1220481482413203e-02 0.0000000000000000e+00 +1.1510000000000000e+03 3.9600000000000000e+02 4.6200000000000000e+02 2.2881965686289814e-02 0.0000000000000000e+00 +1.1520000000000000e+03 3.9700000000000000e+02 4.0300000000000000e+02 2.5286714116868773e-02 0.0000000000000000e+00 +1.1530000000000000e+03 3.9700000000000000e+02 4.4000000000000000e+02 2.3390190303793357e-02 0.0000000000000000e+00 +1.1540000000000000e+03 3.9700000000000000e+02 4.6900000000000000e+02 2.3362101850582018e-02 0.0000000000000000e+00 +1.1550000000000000e+03 3.9800000000000000e+02 4.2100000000000000e+02 2.5108570774525774e-02 0.0000000000000000e+00 +1.1560000000000000e+03 3.9800000000000000e+02 4.4900000000000000e+02 2.2494897639871177e-02 0.0000000000000000e+00 +1.1570000000000000e+03 3.9800000000000000e+02 4.6100000000000000e+02 2.7481072945374461e-02 0.0000000000000000e+00 +1.1580000000000000e+03 3.9800000000000000e+02 5.1600000000000000e+02 2.6700511344849458e-02 0.0000000000000000e+00 +1.1590000000000000e+03 3.9900000000000000e+02 4.3100000000000000e+02 2.5631227608872605e-02 0.0000000000000000e+00 +1.1600000000000000e+03 3.9900000000000000e+02 4.7100000000000000e+02 2.2497832378167451e-02 0.0000000000000000e+00 +1.1610000000000000e+03 3.9900000000000000e+02 5.1000000000000000e+02 2.6861742449717972e-02 0.0000000000000000e+00 +1.1620000000000000e+03 4.0000000000000000e+02 4.0100000000000000e+02 2.1606111547815023e-02 0.0000000000000000e+00 +1.1630000000000000e+03 4.0000000000000000e+02 4.7800000000000000e+02 2.2377138223594412e-02 0.0000000000000000e+00 +1.1640000000000000e+03 4.0000000000000000e+02 5.2300000000000000e+02 2.3360975465609071e-02 0.0000000000000000e+00 +1.1650000000000000e+03 4.0100000000000000e+02 4.9200000000000000e+02 2.3181522715834624e-02 0.0000000000000000e+00 +1.1660000000000000e+03 4.0100000000000000e+02 5.2300000000000000e+02 2.3962242397566020e-02 0.0000000000000000e+00 +1.1670000000000000e+03 4.0200000000000000e+02 4.5100000000000000e+02 2.2787682363657868e-02 0.0000000000000000e+00 +1.1680000000000000e+03 4.0200000000000000e+02 4.8000000000000000e+02 2.1789952340183948e-02 0.0000000000000000e+00 +1.1690000000000000e+03 4.0300000000000000e+02 4.6000000000000000e+02 2.3333701160699008e-02 0.0000000000000000e+00 +1.1700000000000000e+03 4.0300000000000000e+02 4.6900000000000000e+02 2.3757976879583583e-02 0.0000000000000000e+00 +1.1710000000000000e+03 4.0400000000000000e+02 4.4900000000000000e+02 2.1644629799643399e-02 0.0000000000000000e+00 +1.1720000000000000e+03 4.0400000000000000e+02 4.6100000000000000e+02 2.1779280898902634e-02 0.0000000000000000e+00 +1.1730000000000000e+03 4.0500000000000000e+02 4.2500000000000000e+02 2.8089060848736785e-02 0.0000000000000000e+00 +1.1740000000000000e+03 4.0500000000000000e+02 5.0300000000000000e+02 2.2111505679677984e-02 0.0000000000000000e+00 +1.1750000000000000e+03 4.0600000000000000e+02 4.2700000000000000e+02 2.2162468213058169e-02 0.0000000000000000e+00 +1.1760000000000000e+03 4.0600000000000000e+02 4.7000000000000000e+02 2.2466686240755616e-02 0.0000000000000000e+00 +1.1770000000000000e+03 4.0600000000000000e+02 5.1200000000000000e+02 2.2006817740586205e-02 0.0000000000000000e+00 +1.1780000000000000e+03 4.0700000000000000e+02 4.0900000000000000e+02 2.0685040768691820e-02 0.0000000000000000e+00 +1.1790000000000000e+03 4.0700000000000000e+02 4.8400000000000000e+02 2.3262699042460561e-02 0.0000000000000000e+00 +1.1800000000000000e+03 4.0700000000000000e+02 5.0700000000000000e+02 2.2381726555770764e-02 0.0000000000000000e+00 +1.1810000000000000e+03 4.0800000000000000e+02 4.8600000000000000e+02 2.2761664144896190e-02 0.0000000000000000e+00 +1.1820000000000000e+03 4.0800000000000000e+02 5.0600000000000000e+02 2.2273332994759448e-02 0.0000000000000000e+00 +1.1830000000000000e+03 4.0900000000000000e+02 5.0700000000000000e+02 2.2005975951398259e-02 0.0000000000000000e+00 +1.1840000000000000e+03 4.0900000000000000e+02 5.0800000000000000e+02 2.2164557246254227e-02 0.0000000000000000e+00 +1.1850000000000000e+03 4.1000000000000000e+02 4.2200000000000000e+02 2.6720466073756808e-02 0.0000000000000000e+00 +1.1860000000000000e+03 4.1000000000000000e+02 4.2900000000000000e+02 3.1357297126539167e-02 0.0000000000000000e+00 +1.1870000000000000e+03 4.1000000000000000e+02 4.9800000000000000e+02 2.4171494939947843e-02 0.0000000000000000e+00 +1.1880000000000000e+03 4.1000000000000000e+02 5.1100000000000000e+02 2.2413142636381812e-02 0.0000000000000000e+00 +1.1890000000000000e+03 4.1100000000000000e+02 4.4500000000000000e+02 2.1747282289299417e-02 0.0000000000000000e+00 +1.1900000000000000e+03 4.1100000000000000e+02 4.8800000000000000e+02 2.2493295898564445e-02 0.0000000000000000e+00 +1.1910000000000000e+03 4.1200000000000000e+02 4.5200000000000000e+02 1.9775981536830946e-02 0.0000000000000000e+00 +1.1920000000000000e+03 4.1200000000000000e+02 4.5600000000000000e+02 1.9996419885715551e-02 0.0000000000000000e+00 +1.1930000000000000e+03 4.1200000000000000e+02 5.3700000000000000e+02 2.1394747026581427e-02 0.0000000000000000e+00 +1.1940000000000000e+03 4.1200000000000000e+02 5.4200000000000000e+02 2.1431226504735720e-02 0.0000000000000000e+00 +1.1950000000000000e+03 4.1300000000000000e+02 4.1500000000000000e+02 1.9913775946227358e-02 0.0000000000000000e+00 +1.1960000000000000e+03 4.1300000000000000e+02 4.1700000000000000e+02 2.0417028991880852e-02 0.0000000000000000e+00 +1.1970000000000000e+03 4.1300000000000000e+02 4.9700000000000000e+02 2.3302234458673333e-02 0.0000000000000000e+00 +1.1980000000000000e+03 4.1300000000000000e+02 5.2700000000000000e+02 2.1885938817640352e-02 0.0000000000000000e+00 +1.1990000000000000e+03 4.1400000000000000e+02 4.3800000000000000e+02 2.2282218046839063e-02 0.0000000000000000e+00 +1.2000000000000000e+03 4.1400000000000000e+02 4.3900000000000000e+02 2.0458237260029401e-02 0.0000000000000000e+00 +1.2010000000000000e+03 4.1400000000000000e+02 5.0200000000000000e+02 2.2416945574667523e-02 0.0000000000000000e+00 +1.2020000000000000e+03 4.1400000000000000e+02 5.7400000000000000e+02 2.1385322077180781e-02 0.0000000000000000e+00 +1.2030000000000000e+03 4.1500000000000000e+02 4.5800000000000000e+02 2.1897239864014519e-02 0.0000000000000000e+00 +1.2040000000000000e+03 4.1500000000000000e+02 4.9700000000000000e+02 2.1525805440494233e-02 0.0000000000000000e+00 +1.2050000000000000e+03 4.1600000000000000e+02 4.6800000000000000e+02 2.0563646903657126e-02 0.0000000000000000e+00 +1.2060000000000000e+03 4.1600000000000000e+02 4.8400000000000000e+02 2.0854826964937359e-02 0.0000000000000000e+00 +1.2070000000000000e+03 4.1600000000000000e+02 4.9500000000000000e+02 2.2081558938171222e-02 0.0000000000000000e+00 +1.2080000000000000e+03 4.1600000000000000e+02 5.5900000000000000e+02 2.2206053850456722e-02 0.0000000000000000e+00 +1.2090000000000000e+03 4.1700000000000000e+02 4.7700000000000000e+02 1.9719661372191801e-02 0.0000000000000000e+00 +1.2100000000000000e+03 4.1700000000000000e+02 5.2700000000000000e+02 2.3405195150811579e-02 0.0000000000000000e+00 +1.2110000000000000e+03 4.1700000000000000e+02 5.5500000000000000e+02 2.2333700923382240e-02 0.0000000000000000e+00 +1.2120000000000000e+03 4.1800000000000000e+02 4.3200000000000000e+02 2.2104337700370191e-02 0.0000000000000000e+00 +1.2130000000000000e+03 4.1800000000000000e+02 4.5900000000000000e+02 2.3003446524403896e-02 0.0000000000000000e+00 +1.2140000000000000e+03 4.1800000000000000e+02 4.9900000000000000e+02 2.2607144845678669e-02 0.0000000000000000e+00 +1.2150000000000000e+03 4.1800000000000000e+02 5.1300000000000000e+02 2.2929311664284587e-02 0.0000000000000000e+00 +1.2160000000000000e+03 4.1900000000000000e+02 4.6400000000000000e+02 2.3745828362606247e-02 0.0000000000000000e+00 +1.2170000000000000e+03 4.1900000000000000e+02 4.7600000000000000e+02 2.2340530011509582e-02 0.0000000000000000e+00 +1.2180000000000000e+03 4.2000000000000000e+02 4.6200000000000000e+02 2.1400985206830793e-02 0.0000000000000000e+00 +1.2190000000000000e+03 4.2000000000000000e+02 4.8700000000000000e+02 2.0329800650307997e-02 0.0000000000000000e+00 +1.2200000000000000e+03 4.2000000000000000e+02 5.2800000000000000e+02 2.3718011763102839e-02 0.0000000000000000e+00 +1.2210000000000000e+03 4.2000000000000000e+02 5.6200000000000000e+02 2.1761079994606244e-02 0.0000000000000000e+00 +1.2220000000000000e+03 4.2100000000000000e+02 4.6600000000000000e+02 2.2624653478278293e-02 0.0000000000000000e+00 +1.2230000000000000e+03 4.2100000000000000e+02 5.1600000000000000e+02 2.3471530186594484e-02 0.0000000000000000e+00 +1.2240000000000000e+03 4.2100000000000000e+02 5.3100000000000000e+02 2.2770786021068624e-02 0.0000000000000000e+00 +1.2250000000000000e+03 4.2200000000000000e+02 4.4000000000000000e+02 2.5342400261154883e-02 0.0000000000000000e+00 +1.2260000000000000e+03 4.2200000000000000e+02 4.9800000000000000e+02 2.3847080567367888e-02 0.0000000000000000e+00 +1.2270000000000000e+03 4.2200000000000000e+02 5.0400000000000000e+02 2.3677833622003191e-02 0.0000000000000000e+00 +1.2280000000000000e+03 4.2300000000000000e+02 4.3500000000000000e+02 1.9801986079776356e-02 0.0000000000000000e+00 +1.2290000000000000e+03 4.2300000000000000e+02 4.4200000000000000e+02 1.7911952487977081e-02 0.0000000000000000e+00 +1.2300000000000000e+03 4.2300000000000000e+02 5.0100000000000000e+02 2.1856706047062659e-02 0.0000000000000000e+00 +1.2310000000000000e+03 4.2300000000000000e+02 5.2200000000000000e+02 2.2963620163382929e-02 0.0000000000000000e+00 +1.2320000000000000e+03 4.2400000000000000e+02 4.6100000000000000e+02 2.1343183440710397e-02 0.0000000000000000e+00 +1.2330000000000000e+03 4.2400000000000000e+02 4.7400000000000000e+02 2.1810154864802735e-02 0.0000000000000000e+00 +1.2340000000000000e+03 4.2400000000000000e+02 5.1600000000000000e+02 2.3837906383244085e-02 0.0000000000000000e+00 +1.2350000000000000e+03 4.2400000000000000e+02 5.3200000000000000e+02 2.2667878775109583e-02 0.0000000000000000e+00 +1.2360000000000000e+03 4.2500000000000000e+02 4.3600000000000000e+02 3.2123006369583998e-02 0.0000000000000000e+00 +1.2370000000000000e+03 4.2500000000000000e+02 5.0300000000000000e+02 2.5148573518557843e-02 0.0000000000000000e+00 +1.2380000000000000e+03 4.2500000000000000e+02 5.0500000000000000e+02 2.9352666499802102e-02 0.0000000000000000e+00 +1.2390000000000000e+03 4.2500000000000000e+02 5.6300000000000000e+02 3.2654390170349164e-02 0.0000000000000000e+00 +1.2400000000000000e+03 4.2600000000000000e+02 4.5000000000000000e+02 1.9706183504394102e-02 0.0000000000000000e+00 +1.2410000000000000e+03 4.2600000000000000e+02 4.9100000000000000e+02 1.9372954673521098e-02 0.0000000000000000e+00 +1.2420000000000000e+03 4.2600000000000000e+02 5.0000000000000000e+02 2.3152003320050445e-02 0.0000000000000000e+00 +1.2430000000000000e+03 4.2600000000000000e+02 5.3600000000000000e+02 2.3144901794303702e-02 0.0000000000000000e+00 +1.2440000000000000e+03 4.2700000000000000e+02 5.1200000000000000e+02 2.2073454058194501e-02 0.0000000000000000e+00 +1.2450000000000000e+03 4.2700000000000000e+02 5.2100000000000000e+02 2.2046585247176124e-02 0.0000000000000000e+00 +1.2460000000000000e+03 4.2800000000000000e+02 4.3500000000000000e+02 1.8978698011771686e-02 0.0000000000000000e+00 +1.2470000000000000e+03 4.2800000000000000e+02 4.7500000000000000e+02 1.8783224086204822e-02 0.0000000000000000e+00 +1.2480000000000000e+03 4.2800000000000000e+02 5.1800000000000000e+02 2.1688925237613541e-02 0.0000000000000000e+00 +1.2490000000000000e+03 4.2800000000000000e+02 5.2600000000000000e+02 2.3029946817612005e-02 0.0000000000000000e+00 +1.2500000000000000e+03 4.2900000000000000e+02 4.3600000000000000e+02 3.0701560941224275e-02 0.0000000000000000e+00 +1.2510000000000000e+03 4.2900000000000000e+02 5.1100000000000000e+02 2.6791401282892743e-02 0.0000000000000000e+00 +1.2520000000000000e+03 4.2900000000000000e+02 5.1900000000000000e+02 2.9356048124505030e-02 0.0000000000000000e+00 +1.2530000000000000e+03 4.2900000000000000e+02 5.5300000000000000e+02 3.1548668749597067e-02 0.0000000000000000e+00 +1.2540000000000000e+03 4.3000000000000000e+02 4.7200000000000000e+02 1.9441407490439707e-02 0.0000000000000000e+00 +1.2550000000000000e+03 4.3000000000000000e+02 4.8600000000000000e+02 1.8412173548626957e-02 0.0000000000000000e+00 +1.2560000000000000e+03 4.3000000000000000e+02 5.6100000000000000e+02 2.1680199499018192e-02 0.0000000000000000e+00 +1.2570000000000000e+03 4.3000000000000000e+02 5.6800000000000000e+02 2.1803877954380473e-02 0.0000000000000000e+00 +1.2580000000000000e+03 4.3100000000000000e+02 4.8300000000000000e+02 2.5089321248899402e-02 0.0000000000000000e+00 +1.2590000000000000e+03 4.3100000000000000e+02 5.1000000000000000e+02 2.3562856878612898e-02 0.0000000000000000e+00 +1.2600000000000000e+03 4.3100000000000000e+02 5.4700000000000000e+02 2.7314265666236875e-02 0.0000000000000000e+00 +1.2610000000000000e+03 4.3200000000000000e+02 4.6200000000000000e+02 2.2525739808583085e-02 0.0000000000000000e+00 +1.2620000000000000e+03 4.3200000000000000e+02 4.9600000000000000e+02 2.2509706168898008e-02 0.0000000000000000e+00 +1.2630000000000000e+03 4.3200000000000000e+02 5.1300000000000000e+02 2.2601995134091949e-02 0.0000000000000000e+00 +1.2640000000000000e+03 4.3300000000000000e+02 4.3400000000000000e+02 2.2815776284256191e-02 0.0000000000000000e+00 +1.2650000000000000e+03 4.3300000000000000e+02 4.6400000000000000e+02 2.1226813252777400e-02 0.0000000000000000e+00 +1.2660000000000000e+03 4.3300000000000000e+02 5.0900000000000000e+02 2.1517641733343851e-02 0.0000000000000000e+00 +1.2670000000000000e+03 4.3300000000000000e+02 5.2500000000000000e+02 2.2264867236892083e-02 0.0000000000000000e+00 +1.2680000000000000e+03 4.3400000000000000e+02 4.5800000000000000e+02 2.3110244214246865e-02 0.0000000000000000e+00 +1.2690000000000000e+03 4.3400000000000000e+02 4.9700000000000000e+02 2.4035692137184393e-02 0.0000000000000000e+00 +1.2700000000000000e+03 4.3400000000000000e+02 5.2500000000000000e+02 2.3885468642348837e-02 0.0000000000000000e+00 +1.2710000000000000e+03 4.3500000000000000e+02 5.0100000000000000e+02 2.3281617785180703e-02 0.0000000000000000e+00 +1.2720000000000000e+03 4.3500000000000000e+02 5.2600000000000000e+02 2.1152076758372100e-02 0.0000000000000000e+00 +1.2730000000000000e+03 4.3600000000000000e+02 5.0500000000000000e+02 2.6641105868502178e-02 0.0000000000000000e+00 +1.2740000000000000e+03 4.3600000000000000e+02 5.1900000000000000e+02 2.6263106125806169e-02 0.0000000000000000e+00 +1.2750000000000000e+03 4.3700000000000000e+02 4.3900000000000000e+02 2.1200787533444107e-02 0.0000000000000000e+00 +1.2760000000000000e+03 4.3700000000000000e+02 4.8100000000000000e+02 2.0281809978622993e-02 0.0000000000000000e+00 +1.2770000000000000e+03 4.3700000000000000e+02 5.4300000000000000e+02 2.0940847097591076e-02 0.0000000000000000e+00 +1.2780000000000000e+03 4.3700000000000000e+02 5.6000000000000000e+02 2.1952485864751563e-02 0.0000000000000000e+00 +1.2790000000000000e+03 4.3800000000000000e+02 4.5700000000000000e+02 2.2480313123305819e-02 0.0000000000000000e+00 +1.2800000000000000e+03 4.3800000000000000e+02 4.9400000000000000e+02 2.2603825531205986e-02 0.0000000000000000e+00 +1.2810000000000000e+03 4.3800000000000000e+02 5.0200000000000000e+02 2.2711554398821707e-02 0.0000000000000000e+00 +1.2820000000000000e+03 4.3900000000000000e+02 5.6000000000000000e+02 2.1720926345122845e-02 0.0000000000000000e+00 +1.2830000000000000e+03 4.3900000000000000e+02 5.7400000000000000e+02 2.1492386607652094e-02 0.0000000000000000e+00 +1.2840000000000000e+03 4.4000000000000000e+02 4.6900000000000000e+02 2.6090405198041174e-02 0.0000000000000000e+00 +1.2850000000000000e+03 4.4000000000000000e+02 5.0400000000000000e+02 2.3919206007765554e-02 0.0000000000000000e+00 +1.2860000000000000e+03 4.4000000000000000e+02 5.2000000000000000e+02 2.4097578639893539e-02 0.0000000000000000e+00 +1.2870000000000000e+03 4.4100000000000000e+02 4.7800000000000000e+02 1.9479004780760194e-02 0.0000000000000000e+00 +1.2880000000000000e+03 4.4100000000000000e+02 4.8500000000000000e+02 1.9471233967807599e-02 0.0000000000000000e+00 +1.2890000000000000e+03 4.4100000000000000e+02 5.5600000000000000e+02 1.9421776144081859e-02 0.0000000000000000e+00 +1.2900000000000000e+03 4.4100000000000000e+02 5.6700000000000000e+02 2.2860724264644017e-02 0.0000000000000000e+00 +1.2910000000000000e+03 4.4200000000000000e+02 4.6500000000000000e+02 1.9056741783608232e-02 0.0000000000000000e+00 +1.2920000000000000e+03 4.4200000000000000e+02 5.2200000000000000e+02 2.2434505662694181e-02 0.0000000000000000e+00 +1.2930000000000000e+03 4.4200000000000000e+02 5.4800000000000000e+02 2.0435221613417178e-02 0.0000000000000000e+00 +1.2940000000000000e+03 4.4300000000000000e+02 4.5900000000000000e+02 2.4208196884433444e-02 0.0000000000000000e+00 +1.2950000000000000e+03 4.4300000000000000e+02 4.8900000000000000e+02 2.6029153133085320e-02 0.0000000000000000e+00 +1.2960000000000000e+03 4.4300000000000000e+02 4.9300000000000000e+02 2.5063939133993580e-02 0.0000000000000000e+00 +1.2970000000000000e+03 4.4300000000000000e+02 5.1400000000000000e+02 2.4218061209590795e-02 0.0000000000000000e+00 +1.2980000000000000e+03 4.4400000000000000e+02 4.6700000000000000e+02 2.0826301097371640e-02 0.0000000000000000e+00 +1.2990000000000000e+03 4.4400000000000000e+02 5.5000000000000000e+02 2.4269894698832971e-02 0.0000000000000000e+00 +1.3000000000000000e+03 4.4400000000000000e+02 5.5800000000000000e+02 2.2250255189299455e-02 0.0000000000000000e+00 +1.3010000000000000e+03 4.4500000000000000e+02 4.4700000000000000e+02 2.0848273031335060e-02 0.0000000000000000e+00 +1.3020000000000000e+03 4.4500000000000000e+02 4.8800000000000000e+02 2.0129929373263092e-02 0.0000000000000000e+00 +1.3030000000000000e+03 4.4500000000000000e+02 5.3300000000000000e+02 2.3104528096831403e-02 0.0000000000000000e+00 +1.3040000000000000e+03 4.4500000000000000e+02 5.6400000000000000e+02 2.2465587793572304e-02 0.0000000000000000e+00 +1.3050000000000000e+03 4.4600000000000000e+02 4.5700000000000000e+02 2.2839062796159579e-02 0.0000000000000000e+00 +1.3060000000000000e+03 4.4600000000000000e+02 4.7000000000000000e+02 2.2132418135202944e-02 0.0000000000000000e+00 +1.3070000000000000e+03 4.4600000000000000e+02 5.1700000000000000e+02 2.1017058073901397e-02 0.0000000000000000e+00 +1.3080000000000000e+03 4.4600000000000000e+02 5.3000000000000000e+02 2.2931276868911010e-02 0.0000000000000000e+00 +1.3090000000000000e+03 4.4700000000000000e+02 4.5400000000000000e+02 2.0407269092016907e-02 0.0000000000000000e+00 +1.3100000000000000e+03 4.4700000000000000e+02 5.3300000000000000e+02 2.3423684097072160e-02 0.0000000000000000e+00 +1.3110000000000000e+03 4.4700000000000000e+02 5.3900000000000000e+02 2.2341298385309894e-02 0.0000000000000000e+00 +1.3120000000000000e+03 4.4800000000000000e+02 4.5200000000000000e+02 1.9385669449494373e-02 0.0000000000000000e+00 +1.3130000000000000e+03 4.4800000000000000e+02 4.9100000000000000e+02 1.9304067812798680e-02 0.0000000000000000e+00 +1.3140000000000000e+03 4.4800000000000000e+02 5.3500000000000000e+02 2.1869276616009386e-02 0.0000000000000000e+00 +1.3150000000000000e+03 4.4800000000000000e+02 5.3800000000000000e+02 2.0968590765681808e-02 0.0000000000000000e+00 +1.3160000000000000e+03 4.4900000000000000e+02 4.6100000000000000e+02 2.0801969569091645e-02 0.0000000000000000e+00 +1.3170000000000000e+03 4.5000000000000000e+02 4.8800000000000000e+02 1.9506865174700013e-02 0.0000000000000000e+00 +1.3180000000000000e+03 4.5000000000000000e+02 5.3600000000000000e+02 2.2340478643170250e-02 0.0000000000000000e+00 +1.3190000000000000e+03 4.5000000000000000e+02 5.7500000000000000e+02 2.1679618707404039e-02 0.0000000000000000e+00 +1.3200000000000000e+03 4.5100000000000000e+02 4.8000000000000000e+02 2.4513232132351067e-02 0.0000000000000000e+00 +1.3210000000000000e+03 4.5100000000000000e+02 4.8300000000000000e+02 2.5025232734921167e-02 0.0000000000000000e+00 +1.3220000000000000e+03 4.5100000000000000e+02 5.2400000000000000e+02 2.5724668841571027e-02 0.0000000000000000e+00 +1.3230000000000000e+03 4.5200000000000000e+02 5.3700000000000000e+02 2.1253324480801517e-02 0.0000000000000000e+00 +1.3240000000000000e+03 4.5200000000000000e+02 5.3800000000000000e+02 2.1341836097729237e-02 0.0000000000000000e+00 +1.3250000000000000e+03 4.5300000000000000e+02 4.7500000000000000e+02 1.8719122383398613e-02 0.0000000000000000e+00 +1.3260000000000000e+03 4.5300000000000000e+02 5.0600000000000000e+02 1.8049027579075713e-02 0.0000000000000000e+00 +1.3270000000000000e+03 4.5300000000000000e+02 5.4400000000000000e+02 2.1001476353637482e-02 0.0000000000000000e+00 +1.3280000000000000e+03 4.5300000000000000e+02 5.4500000000000000e+02 2.1517069479126544e-02 0.0000000000000000e+00 +1.3290000000000000e+03 4.5400000000000000e+02 4.6800000000000000e+02 2.0648577122702249e-02 0.0000000000000000e+00 +1.3300000000000000e+03 4.5400000000000000e+02 5.3400000000000000e+02 2.2405206062271039e-02 0.0000000000000000e+00 +1.3310000000000000e+03 4.5400000000000000e+02 5.3900000000000000e+02 2.2365712725077577e-02 0.0000000000000000e+00 +1.3320000000000000e+03 4.5500000000000000e+02 4.5600000000000000e+02 2.1230001382389289e-02 0.0000000000000000e+00 +1.3330000000000000e+03 4.5500000000000000e+02 4.9200000000000000e+02 1.9985046661116144e-02 0.0000000000000000e+00 +1.3340000000000000e+03 4.5500000000000000e+02 5.4000000000000000e+02 2.1588658766008153e-02 0.0000000000000000e+00 +1.3350000000000000e+03 4.5500000000000000e+02 5.6500000000000000e+02 2.3187081605538645e-02 0.0000000000000000e+00 +1.3360000000000000e+03 4.5600000000000000e+02 5.4000000000000000e+02 2.1944669625065045e-02 0.0000000000000000e+00 +1.3370000000000000e+03 4.5600000000000000e+02 5.4200000000000000e+02 2.0800559908935836e-02 0.0000000000000000e+00 +1.3380000000000000e+03 4.5700000000000000e+02 4.9400000000000000e+02 2.3971256443467898e-02 0.0000000000000000e+00 +1.3390000000000000e+03 4.5700000000000000e+02 5.3000000000000000e+02 2.2418429974516610e-02 0.0000000000000000e+00 +1.3400000000000000e+03 4.5800000000000000e+02 4.9700000000000000e+02 2.1720689171378517e-02 0.0000000000000000e+00 +1.3410000000000000e+03 4.5900000000000000e+02 4.9900000000000000e+02 2.3840773963241222e-02 0.0000000000000000e+00 +1.3420000000000000e+03 4.5900000000000000e+02 5.1400000000000000e+02 2.3455512706465131e-02 0.0000000000000000e+00 +1.3430000000000000e+03 4.5900000000000000e+02 5.4100000000000000e+02 2.3245041348984075e-02 0.0000000000000000e+00 +1.3440000000000000e+03 4.6000000000000000e+02 4.6900000000000000e+02 2.5364390029192753e-02 0.0000000000000000e+00 +1.3450000000000000e+03 4.6000000000000000e+02 4.8000000000000000e+02 2.5516198165820795e-02 0.0000000000000000e+00 +1.3460000000000000e+03 4.6000000000000000e+02 5.1500000000000000e+02 2.4152503927624216e-02 0.0000000000000000e+00 +1.3470000000000000e+03 4.6000000000000000e+02 5.2900000000000000e+02 2.4392909592707207e-02 0.0000000000000000e+00 +1.3480000000000000e+03 4.6100000000000000e+02 5.1600000000000000e+02 2.2188470856439321e-02 0.0000000000000000e+00 +1.3490000000000000e+03 4.6200000000000000e+02 4.9600000000000000e+02 2.3080240125545513e-02 0.0000000000000000e+00 +1.3500000000000000e+03 4.6200000000000000e+02 5.2800000000000000e+02 2.1626200710629193e-02 0.0000000000000000e+00 +1.3510000000000000e+03 4.6300000000000000e+02 4.7300000000000000e+02 1.9115532943397393e-02 0.0000000000000000e+00 +1.3520000000000000e+03 4.6300000000000000e+02 5.0800000000000000e+02 2.0411707704267139e-02 0.0000000000000000e+00 +1.3530000000000000e+03 4.6300000000000000e+02 5.5100000000000000e+02 2.2137927632930703e-02 0.0000000000000000e+00 +1.3540000000000000e+03 4.6300000000000000e+02 5.5400000000000000e+02 2.1734015488766873e-02 0.0000000000000000e+00 +1.3550000000000000e+03 4.6400000000000000e+02 4.7600000000000000e+02 2.0223301903860423e-02 0.0000000000000000e+00 +1.3560000000000000e+03 4.6400000000000000e+02 5.0900000000000000e+02 2.2652110979840566e-02 0.0000000000000000e+00 +1.3570000000000000e+03 4.6400000000000000e+02 5.4600000000000000e+02 2.0689093147930042e-02 0.0000000000000000e+00 +1.3580000000000000e+03 4.6500000000000000e+02 4.7600000000000000e+02 1.9276936217589899e-02 0.0000000000000000e+00 +1.3590000000000000e+03 4.6500000000000000e+02 5.4800000000000000e+02 1.9010168104999302e-02 0.0000000000000000e+00 +1.3600000000000000e+03 4.6500000000000000e+02 5.8900000000000000e+02 2.1361313100433189e-02 0.0000000000000000e+00 +1.3610000000000000e+03 4.6600000000000000e+02 4.7900000000000000e+02 2.4008034814976119e-02 0.0000000000000000e+00 +1.3620000000000000e+03 4.6600000000000000e+02 5.3100000000000000e+02 2.2880082704097138e-02 0.0000000000000000e+00 +1.3630000000000000e+03 4.6600000000000000e+02 5.5700000000000000e+02 2.2141390743391658e-02 0.0000000000000000e+00 +1.3640000000000000e+03 4.6700000000000000e+02 4.8900000000000000e+02 2.5383065732446964e-02 0.0000000000000000e+00 +1.3650000000000000e+03 4.6700000000000000e+02 4.9000000000000000e+02 1.8210710737654384e-02 0.0000000000000000e+00 +1.3660000000000000e+03 4.6700000000000000e+02 5.5000000000000000e+02 2.1876237313438567e-02 0.0000000000000000e+00 +1.3670000000000000e+03 4.6800000000000000e+02 4.9500000000000000e+02 2.2653921188597905e-02 0.0000000000000000e+00 +1.3680000000000000e+03 4.6800000000000000e+02 5.3400000000000000e+02 2.2333184284103691e-02 0.0000000000000000e+00 +1.3690000000000000e+03 4.6900000000000000e+02 5.1500000000000000e+02 2.3096786382057536e-02 0.0000000000000000e+00 +1.3700000000000000e+03 4.6900000000000000e+02 5.2000000000000000e+02 2.4082610829852625e-02 0.0000000000000000e+00 +1.3710000000000000e+03 4.7000000000000000e+02 5.1200000000000000e+02 2.3113297849851007e-02 0.0000000000000000e+00 +1.3720000000000000e+03 4.7000000000000000e+02 5.1700000000000000e+02 2.2394075605480346e-02 0.0000000000000000e+00 +1.3730000000000000e+03 4.7000000000000000e+02 5.4900000000000000e+02 2.2200971791827707e-02 0.0000000000000000e+00 +1.3740000000000000e+03 4.7100000000000000e+02 4.8200000000000000e+02 2.5136194826795560e-02 0.0000000000000000e+00 +1.3750000000000000e+03 4.7100000000000000e+02 5.1000000000000000e+02 2.3898128247498557e-02 0.0000000000000000e+00 +1.3760000000000000e+03 4.7100000000000000e+02 5.5200000000000000e+02 2.4933827895574259e-02 0.0000000000000000e+00 +1.3770000000000000e+03 4.7100000000000000e+02 5.6600000000000000e+02 2.2565811314196910e-02 0.0000000000000000e+00 +1.3780000000000000e+03 4.7200000000000000e+02 4.8700000000000000e+02 1.8938871194069735e-02 0.0000000000000000e+00 +1.3790000000000000e+03 4.7200000000000000e+02 5.6800000000000000e+02 2.2369848367992832e-02 0.0000000000000000e+00 +1.3800000000000000e+03 4.7200000000000000e+02 5.8600000000000000e+02 2.1942842247926145e-02 0.0000000000000000e+00 +1.3810000000000000e+03 4.7300000000000000e+02 4.8100000000000000e+02 2.0585043555369498e-02 0.0000000000000000e+00 +1.3820000000000000e+03 4.7300000000000000e+02 5.5400000000000000e+02 2.2596198686203710e-02 0.0000000000000000e+00 +1.3830000000000000e+03 4.7300000000000000e+02 5.9400000000000000e+02 2.2625145323496305e-02 0.0000000000000000e+00 +1.3840000000000000e+03 4.7400000000000000e+02 5.2100000000000000e+02 2.2111867808730638e-02 0.0000000000000000e+00 +1.3850000000000000e+03 4.7400000000000000e+02 5.3200000000000000e+02 2.3517097860171216e-02 0.0000000000000000e+00 +1.3860000000000000e+03 4.7400000000000000e+02 5.6900000000000000e+02 2.3636550060849068e-02 0.0000000000000000e+00 +1.3870000000000000e+03 4.7500000000000000e+02 5.1800000000000000e+02 2.1793969316299223e-02 0.0000000000000000e+00 +1.3880000000000000e+03 4.7500000000000000e+02 5.4500000000000000e+02 2.0799874754171669e-02 0.0000000000000000e+00 +1.3890000000000000e+03 4.7600000000000000e+02 5.4600000000000000e+02 2.1827905425125273e-02 0.0000000000000000e+00 +1.3900000000000000e+03 4.7600000000000000e+02 5.8900000000000000e+02 2.1347950453175880e-02 0.0000000000000000e+00 +1.3910000000000000e+03 4.7700000000000000e+02 4.8500000000000000e+02 1.9483785029906227e-02 0.0000000000000000e+00 +1.3920000000000000e+03 4.7700000000000000e+02 5.5500000000000000e+02 2.2773665955345714e-02 0.0000000000000000e+00 +1.3930000000000000e+03 4.7700000000000000e+02 5.8400000000000000e+02 2.2584646333552422e-02 0.0000000000000000e+00 +1.3940000000000000e+03 4.7800000000000000e+02 5.2300000000000000e+02 1.9697457918602404e-02 0.0000000000000000e+00 +1.3950000000000000e+03 4.7800000000000000e+02 5.5600000000000000e+02 1.9360999309196054e-02 0.0000000000000000e+00 +1.3960000000000000e+03 4.7800000000000000e+02 6.2200000000000000e+02 2.3261015623726716e-02 0.0000000000000000e+00 +1.3970000000000000e+03 4.7900000000000000e+02 4.8200000000000000e+02 2.3636977248426904e-02 0.0000000000000000e+00 +1.3980000000000000e+03 4.7900000000000000e+02 5.5700000000000000e+02 2.2041075814802157e-02 0.0000000000000000e+00 +1.3990000000000000e+03 4.7900000000000000e+02 5.9800000000000000e+02 2.1995455602206466e-02 0.0000000000000000e+00 +1.4000000000000000e+03 4.8000000000000000e+02 5.2400000000000000e+02 2.7845226958013287e-02 0.0000000000000000e+00 +1.4010000000000000e+03 4.8000000000000000e+02 5.2900000000000000e+02 2.4111480975157827e-02 0.0000000000000000e+00 +1.4020000000000000e+03 4.8100000000000000e+02 5.4300000000000000e+02 2.1967261517959333e-02 0.0000000000000000e+00 +1.4030000000000000e+03 4.8100000000000000e+02 5.9400000000000000e+02 2.2594322992365017e-02 0.0000000000000000e+00 +1.4040000000000000e+03 4.8200000000000000e+02 5.6600000000000000e+02 2.4376782089583496e-02 0.0000000000000000e+00 +1.4050000000000000e+03 4.8200000000000000e+02 5.9800000000000000e+02 2.2162017411704614e-02 0.0000000000000000e+00 +1.4060000000000000e+03 4.8300000000000000e+02 5.2400000000000000e+02 3.0435438754635908e-02 0.0000000000000000e+00 +1.4070000000000000e+03 4.8300000000000000e+02 5.4700000000000000e+02 2.3400226370177746e-02 0.0000000000000000e+00 +1.4080000000000000e+03 4.8400000000000000e+02 5.0700000000000000e+02 2.0948389307307167e-02 0.0000000000000000e+00 +1.4090000000000000e+03 4.8400000000000000e+02 5.5900000000000000e+02 2.1699357881151758e-02 0.0000000000000000e+00 +1.4100000000000000e+03 4.8400000000000000e+02 5.7100000000000000e+02 2.1557636450369490e-02 0.0000000000000000e+00 +1.4110000000000000e+03 4.8500000000000000e+02 5.6700000000000000e+02 2.2314952181358694e-02 0.0000000000000000e+00 +1.4120000000000000e+03 4.8500000000000000e+02 5.8400000000000000e+02 2.1954954251277112e-02 0.0000000000000000e+00 +1.4130000000000000e+03 4.8600000000000000e+02 5.0600000000000000e+02 1.9287821536110819e-02 0.0000000000000000e+00 +1.4140000000000000e+03 4.8600000000000000e+02 5.6100000000000000e+02 2.1109638769640667e-02 0.0000000000000000e+00 +1.4150000000000000e+03 4.8600000000000000e+02 5.7600000000000000e+02 2.0650441089410203e-02 0.0000000000000000e+00 +1.4160000000000000e+03 4.8700000000000000e+02 5.6200000000000000e+02 2.2500525757674167e-02 0.0000000000000000e+00 +1.4170000000000000e+03 4.8700000000000000e+02 5.8600000000000000e+02 2.1176418739951349e-02 0.0000000000000000e+00 +1.4180000000000000e+03 4.8800000000000000e+02 5.6400000000000000e+02 2.2403984006372148e-02 0.0000000000000000e+00 +1.4190000000000000e+03 4.8800000000000000e+02 5.7500000000000000e+02 2.1383373096487940e-02 0.0000000000000000e+00 +1.4200000000000000e+03 4.8900000000000000e+02 4.9000000000000000e+02 2.1573857573410214e-02 0.0000000000000000e+00 +1.4210000000000000e+03 4.8900000000000000e+02 4.9300000000000000e+02 2.5124318952997434e-02 0.0000000000000000e+00 +1.4220000000000000e+03 4.8900000000000000e+02 5.5000000000000000e+02 2.5689317642735292e-02 0.0000000000000000e+00 +1.4230000000000000e+03 4.9100000000000000e+02 5.0000000000000000e+02 2.3033488876281680e-02 0.0000000000000000e+00 +1.4240000000000000e+03 4.9100000000000000e+02 5.3500000000000000e+02 2.1997962419156813e-02 0.0000000000000000e+00 +1.4250000000000000e+03 4.9200000000000000e+02 5.2300000000000000e+02 2.1622184140394379e-02 0.0000000000000000e+00 +1.4260000000000000e+03 4.9200000000000000e+02 5.6500000000000000e+02 2.1743093945928105e-02 0.0000000000000000e+00 +1.4270000000000000e+03 4.9200000000000000e+02 6.0200000000000000e+02 2.4412821544275865e-02 0.0000000000000000e+00 +1.4280000000000000e+03 4.9300000000000000e+02 5.1400000000000000e+02 2.5551775907983118e-02 0.0000000000000000e+00 +1.4290000000000000e+03 4.9300000000000000e+02 5.5000000000000000e+02 2.4456624904790322e-02 0.0000000000000000e+00 +1.4300000000000000e+03 4.9300000000000000e+02 5.8200000000000000e+02 2.4525529413805872e-02 0.0000000000000000e+00 +1.4310000000000000e+03 4.9300000000000000e+02 5.9600000000000000e+02 2.5287244994735010e-02 0.0000000000000000e+00 +1.4320000000000000e+03 4.9400000000000000e+02 5.0200000000000000e+02 2.1721414382556245e-02 0.0000000000000000e+00 +1.4330000000000000e+03 4.9400000000000000e+02 5.3000000000000000e+02 2.3102318942120677e-02 0.0000000000000000e+00 +1.4340000000000000e+03 4.9400000000000000e+02 5.8700000000000000e+02 2.1802978850151547e-02 0.0000000000000000e+00 +1.4350000000000000e+03 4.9400000000000000e+02 6.2500000000000000e+02 2.2114819993916113e-02 0.0000000000000000e+00 +1.4360000000000000e+03 4.9500000000000000e+02 5.3400000000000000e+02 2.0847573770517835e-02 0.0000000000000000e+00 +1.4370000000000000e+03 4.9500000000000000e+02 5.5900000000000000e+02 2.0112141999685265e-02 0.0000000000000000e+00 +1.4380000000000000e+03 4.9500000000000000e+02 5.8500000000000000e+02 2.2117648807310278e-02 0.0000000000000000e+00 +1.4390000000000000e+03 4.9500000000000000e+02 6.2700000000000000e+02 2.2158575418241493e-02 0.0000000000000000e+00 +1.4400000000000000e+03 4.9600000000000000e+02 5.1300000000000000e+02 2.1597061664175472e-02 0.0000000000000000e+00 +1.4410000000000000e+03 4.9600000000000000e+02 5.2800000000000000e+02 2.0932001100444662e-02 0.0000000000000000e+00 +1.4420000000000000e+03 4.9600000000000000e+02 5.9000000000000000e+02 2.1935156813324953e-02 0.0000000000000000e+00 +1.4430000000000000e+03 4.9600000000000000e+02 5.9300000000000000e+02 2.2693167545775640e-02 0.0000000000000000e+00 +1.4440000000000000e+03 4.9700000000000000e+02 5.2500000000000000e+02 2.1201997935130137e-02 0.0000000000000000e+00 +1.4450000000000000e+03 4.9700000000000000e+02 5.2700000000000000e+02 2.1648773694958684e-02 0.0000000000000000e+00 +1.4460000000000000e+03 4.9800000000000000e+02 5.0400000000000000e+02 2.5658970991586004e-02 0.0000000000000000e+00 +1.4470000000000000e+03 4.9800000000000000e+02 5.1100000000000000e+02 2.2807897918240658e-02 0.0000000000000000e+00 +1.4480000000000000e+03 4.9800000000000000e+02 5.7900000000000000e+02 2.4931149191331894e-02 0.0000000000000000e+00 +1.4490000000000000e+03 4.9800000000000000e+02 5.9700000000000000e+02 2.6653762503712788e-02 0.0000000000000000e+00 +1.4500000000000000e+03 4.9900000000000000e+02 5.1300000000000000e+02 2.1764943940995384e-02 0.0000000000000000e+00 +1.4510000000000000e+03 4.9900000000000000e+02 5.4100000000000000e+02 2.3186027592574810e-02 0.0000000000000000e+00 +1.4520000000000000e+03 4.9900000000000000e+02 5.8000000000000000e+02 2.2561795088691741e-02 0.0000000000000000e+00 +1.4530000000000000e+03 4.9900000000000000e+02 6.0900000000000000e+02 2.2855087943033210e-02 0.0000000000000000e+00 +1.4540000000000000e+03 5.0000000000000000e+02 5.3500000000000000e+02 1.8694285668872074e-02 0.0000000000000000e+00 +1.4550000000000000e+03 5.0000000000000000e+02 5.3600000000000000e+02 1.9394531655193295e-02 0.0000000000000000e+00 +1.4560000000000000e+03 5.0000000000000000e+02 5.7000000000000000e+02 2.0340171802312346e-02 0.0000000000000000e+00 +1.4570000000000000e+03 5.0000000000000000e+02 6.0600000000000000e+02 2.1975661041322800e-02 0.0000000000000000e+00 +1.4580000000000000e+03 5.0100000000000000e+02 5.2200000000000000e+02 1.8219525588348870e-02 0.0000000000000000e+00 +1.4590000000000000e+03 5.0100000000000000e+02 5.2600000000000000e+02 1.9333048938242971e-02 0.0000000000000000e+00 +1.4600000000000000e+03 5.0100000000000000e+02 5.8800000000000000e+02 2.4046211803488336e-02 0.0000000000000000e+00 +1.4610000000000000e+03 5.0100000000000000e+02 6.1900000000000000e+02 2.1224303154170961e-02 0.0000000000000000e+00 +1.4620000000000000e+03 5.0200000000000000e+02 5.7400000000000000e+02 2.1523998464354623e-02 0.0000000000000000e+00 +1.4630000000000000e+03 5.0200000000000000e+02 5.8700000000000000e+02 2.2059359994364869e-02 0.0000000000000000e+00 +1.4640000000000000e+03 5.0200000000000000e+02 6.2100000000000000e+02 2.2097572357118535e-02 0.0000000000000000e+00 +1.4650000000000000e+03 5.0300000000000000e+02 5.5800000000000000e+02 2.1804107432553007e-02 0.0000000000000000e+00 +1.4660000000000000e+03 5.0300000000000000e+02 5.6300000000000000e+02 2.5624442313376142e-02 0.0000000000000000e+00 +1.4670000000000000e+03 5.0400000000000000e+02 5.2000000000000000e+02 2.6074747767010280e-02 0.0000000000000000e+00 +1.4680000000000000e+03 5.0400000000000000e+02 5.7900000000000000e+02 2.5309162912505484e-02 0.0000000000000000e+00 +1.4690000000000000e+03 5.0400000000000000e+02 5.8300000000000000e+02 2.4171631309766982e-02 0.0000000000000000e+00 +1.4700000000000000e+03 5.0500000000000000e+02 5.1900000000000000e+02 2.8602724039527752e-02 0.0000000000000000e+00 +1.4710000000000000e+03 5.0500000000000000e+02 5.6300000000000000e+02 2.9918904254072436e-02 0.0000000000000000e+00 +1.4720000000000000e+03 5.0500000000000000e+02 5.7800000000000000e+02 2.4194470083476971e-02 0.0000000000000000e+00 +1.4730000000000000e+03 5.0500000000000000e+02 6.2800000000000000e+02 2.7492353975295727e-02 0.0000000000000000e+00 +1.4740000000000000e+03 5.0600000000000000e+02 5.4400000000000000e+02 2.1053681898101969e-02 0.0000000000000000e+00 +1.4750000000000000e+03 5.0600000000000000e+02 5.7600000000000000e+02 2.1495827010956516e-02 0.0000000000000000e+00 +1.4760000000000000e+03 5.0700000000000000e+02 5.0800000000000000e+02 2.0984590374996330e-02 0.0000000000000000e+00 +1.4770000000000000e+03 5.0700000000000000e+02 5.7100000000000000e+02 2.2082188945325678e-02 0.0000000000000000e+00 +1.4780000000000000e+03 5.0700000000000000e+02 5.7200000000000000e+02 2.2748539256069688e-02 0.0000000000000000e+00 +1.4790000000000000e+03 5.0800000000000000e+02 5.5100000000000000e+02 2.1505374101834226e-02 0.0000000000000000e+00 +1.4800000000000000e+03 5.0800000000000000e+02 5.7200000000000000e+02 2.2384088154081706e-02 0.0000000000000000e+00 +1.4810000000000000e+03 5.0900000000000000e+02 5.2500000000000000e+02 2.0360046466257012e-02 0.0000000000000000e+00 +1.4820000000000000e+03 5.0900000000000000e+02 5.4600000000000000e+02 1.9934094918475108e-02 0.0000000000000000e+00 +1.4830000000000000e+03 5.0900000000000000e+02 6.0100000000000000e+02 2.2149952080939575e-02 0.0000000000000000e+00 +1.4840000000000000e+03 5.0900000000000000e+02 6.3500000000000000e+02 2.1673372615803647e-02 0.0000000000000000e+00 +1.4850000000000000e+03 5.1000000000000000e+02 5.4700000000000000e+02 2.5794132910527769e-02 0.0000000000000000e+00 +1.4860000000000000e+03 5.1000000000000000e+02 5.5200000000000000e+02 2.2230305998825618e-02 0.0000000000000000e+00 +1.4870000000000000e+03 5.1000000000000000e+02 5.8100000000000000e+02 2.5282640489643914e-02 0.0000000000000000e+00 +1.4880000000000000e+03 5.1100000000000000e+02 5.5300000000000000e+02 2.5116634997582953e-02 0.0000000000000000e+00 +1.4890000000000000e+03 5.1100000000000000e+02 5.9700000000000000e+02 2.3149977520361048e-02 0.0000000000000000e+00 +1.4900000000000000e+03 5.1200000000000000e+02 5.2100000000000000e+02 2.2297398961298155e-02 0.0000000000000000e+00 +1.4910000000000000e+03 5.1200000000000000e+02 5.4900000000000000e+02 2.3087501274615237e-02 0.0000000000000000e+00 +1.4920000000000000e+03 5.1200000000000000e+02 6.2300000000000000e+02 2.3706081349192443e-02 0.0000000000000000e+00 +1.4930000000000000e+03 5.1300000000000000e+02 5.8000000000000000e+02 2.2137148328801447e-02 0.0000000000000000e+00 +1.4940000000000000e+03 5.1300000000000000e+02 5.9300000000000000e+02 2.2066173163444891e-02 0.0000000000000000e+00 +1.4950000000000000e+03 5.1400000000000000e+02 5.4100000000000000e+02 2.4034011887067153e-02 0.0000000000000000e+00 +1.4960000000000000e+03 5.1400000000000000e+02 5.8200000000000000e+02 2.3721741895201105e-02 0.0000000000000000e+00 +1.4970000000000000e+03 5.1400000000000000e+02 6.0300000000000000e+02 2.2983053367990020e-02 0.0000000000000000e+00 +1.4980000000000000e+03 5.1500000000000000e+02 5.2000000000000000e+02 2.5553791105669715e-02 0.0000000000000000e+00 +1.4990000000000000e+03 5.1500000000000000e+02 5.2900000000000000e+02 2.7104364030359807e-02 0.0000000000000000e+00 +1.5000000000000000e+03 5.1500000000000000e+02 5.7700000000000000e+02 2.3546186134475858e-02 0.0000000000000000e+00 +1.5010000000000000e+03 5.1500000000000000e+02 6.1100000000000000e+02 2.2618237929719964e-02 0.0000000000000000e+00 +1.5020000000000000e+03 5.1600000000000000e+02 5.3100000000000000e+02 2.2713877946777494e-02 0.0000000000000000e+00 +1.5030000000000000e+03 5.1600000000000000e+02 5.3200000000000000e+02 2.2312039754960458e-02 0.0000000000000000e+00 +1.5040000000000000e+03 5.1700000000000000e+02 5.3000000000000000e+02 2.2813876804108357e-02 0.0000000000000000e+00 +1.5050000000000000e+03 5.1700000000000000e+02 5.4900000000000000e+02 2.2881005723045099e-02 0.0000000000000000e+00 +1.5060000000000000e+03 5.1700000000000000e+02 6.0500000000000000e+02 2.3779592326586774e-02 0.0000000000000000e+00 +1.5070000000000000e+03 5.1700000000000000e+02 6.1300000000000000e+02 2.1370746448533144e-02 0.0000000000000000e+00 +1.5080000000000000e+03 5.1800000000000000e+02 5.2600000000000000e+02 1.9267731962581046e-02 0.0000000000000000e+00 +1.5090000000000000e+03 5.1800000000000000e+02 5.4500000000000000e+02 1.8159255463228753e-02 0.0000000000000000e+00 +1.5100000000000000e+03 5.1800000000000000e+02 5.9900000000000000e+02 2.0499828418158741e-02 0.0000000000000000e+00 +1.5110000000000000e+03 5.1800000000000000e+02 6.2400000000000000e+02 2.2088455884144428e-02 0.0000000000000000e+00 +1.5120000000000000e+03 5.1900000000000000e+02 5.5300000000000000e+02 2.7899272166274434e-02 0.0000000000000000e+00 +1.5130000000000000e+03 5.1900000000000000e+02 5.7800000000000000e+02 2.2907701921976182e-02 0.0000000000000000e+00 +1.5140000000000000e+03 5.1900000000000000e+02 6.1200000000000000e+02 3.0424153616246927e-02 0.0000000000000000e+00 +1.5150000000000000e+03 5.2000000000000000e+02 5.7700000000000000e+02 2.2917505772999960e-02 0.0000000000000000e+00 +1.5160000000000000e+03 5.2000000000000000e+02 5.8300000000000000e+02 2.3987784050937551e-02 0.0000000000000000e+00 +1.5170000000000000e+03 5.2100000000000000e+02 5.6900000000000000e+02 2.2828347827186152e-02 0.0000000000000000e+00 +1.5180000000000000e+03 5.2100000000000000e+02 6.2300000000000000e+02 2.3778298865650273e-02 0.0000000000000000e+00 +1.5190000000000000e+03 5.2200000000000000e+02 5.4800000000000000e+02 1.6831906049357512e-02 0.0000000000000000e+00 +1.5200000000000000e+03 5.2200000000000000e+02 5.8800000000000000e+02 2.0830500316251090e-02 0.0000000000000000e+00 +1.5210000000000000e+03 5.2200000000000000e+02 6.9200000000000000e+02 2.8680217890034033e-02 0.0000000000000000e+00 +1.5220000000000000e+03 5.2300000000000000e+02 6.0200000000000000e+02 2.2860106929966345e-02 0.0000000000000000e+00 +1.5230000000000000e+03 5.2300000000000000e+02 6.2200000000000000e+02 2.3430073156933677e-02 0.0000000000000000e+00 +1.5240000000000000e+03 5.2400000000000000e+02 5.2900000000000000e+02 2.9430102199427908e-02 0.0000000000000000e+00 +1.5250000000000000e+03 5.2400000000000000e+02 5.4700000000000000e+02 2.9087875899400234e-02 0.0000000000000000e+00 +1.5260000000000000e+03 5.2400000000000000e+02 5.9500000000000000e+02 2.5847423452175205e-02 0.0000000000000000e+00 +1.5270000000000000e+03 5.2400000000000000e+02 6.2600000000000000e+02 2.4671338377958853e-02 0.0000000000000000e+00 +1.5280000000000000e+03 5.2500000000000000e+02 5.2700000000000000e+02 2.2921311657582100e-02 0.0000000000000000e+00 +1.5290000000000000e+03 5.2500000000000000e+02 6.0100000000000000e+02 2.1955738067713344e-02 0.0000000000000000e+00 +1.5300000000000000e+03 5.2600000000000000e+02 6.1900000000000000e+02 2.3494206238824679e-02 0.0000000000000000e+00 +1.5310000000000000e+03 5.2600000000000000e+02 6.2400000000000000e+02 2.1017783259000809e-02 0.0000000000000000e+00 +1.5320000000000000e+03 5.2700000000000000e+02 5.5500000000000000e+02 2.1035677763877800e-02 0.0000000000000000e+00 +1.5330000000000000e+03 5.2700000000000000e+02 6.0100000000000000e+02 2.0640576109560393e-02 0.0000000000000000e+00 +1.5340000000000000e+03 5.2800000000000000e+02 5.6200000000000000e+02 2.0526482464963174e-02 0.0000000000000000e+00 +1.5350000000000000e+03 5.2800000000000000e+02 5.9000000000000000e+02 2.2601343944663125e-02 0.0000000000000000e+00 +1.5360000000000000e+03 5.2800000000000000e+02 6.2900000000000000e+02 2.1441289352881567e-02 0.0000000000000000e+00 +1.5370000000000000e+03 5.2900000000000000e+02 5.9500000000000000e+02 2.1501690682480163e-02 0.0000000000000000e+00 +1.5380000000000000e+03 5.2900000000000000e+02 6.1100000000000000e+02 2.4755976037443426e-02 0.0000000000000000e+00 +1.5390000000000000e+03 5.3000000000000000e+02 6.0500000000000000e+02 2.1788619536965894e-02 0.0000000000000000e+00 +1.5400000000000000e+03 5.3000000000000000e+02 6.2500000000000000e+02 2.2863785695687488e-02 0.0000000000000000e+00 +1.5410000000000000e+03 5.3100000000000000e+02 5.3200000000000000e+02 2.2442381440827375e-02 0.0000000000000000e+00 +1.5420000000000000e+03 5.3100000000000000e+02 5.5700000000000000e+02 2.1959634317826587e-02 0.0000000000000000e+00 +1.5430000000000000e+03 5.3100000000000000e+02 5.9100000000000000e+02 2.2166763682454956e-02 0.0000000000000000e+00 +1.5440000000000000e+03 5.3200000000000000e+02 5.6900000000000000e+02 2.3805660404085001e-02 0.0000000000000000e+00 +1.5450000000000000e+03 5.3200000000000000e+02 5.9100000000000000e+02 2.2393040893238431e-02 0.0000000000000000e+00 +1.5460000000000000e+03 5.3300000000000000e+02 5.3900000000000000e+02 1.9949973059544570e-02 0.0000000000000000e+00 +1.5470000000000000e+03 5.3300000000000000e+02 5.6400000000000000e+02 1.9645101740177796e-02 0.0000000000000000e+00 +1.5480000000000000e+03 5.3300000000000000e+02 6.0800000000000000e+02 2.1862128897746046e-02 0.0000000000000000e+00 +1.5490000000000000e+03 5.3300000000000000e+02 6.3400000000000000e+02 2.1582269418669579e-02 0.0000000000000000e+00 +1.5500000000000000e+03 5.3400000000000000e+02 5.3900000000000000e+02 2.0682098579093804e-02 0.0000000000000000e+00 +1.5510000000000000e+03 5.3400000000000000e+02 5.8500000000000000e+02 2.2074857031610197e-02 0.0000000000000000e+00 +1.5520000000000000e+03 5.3400000000000000e+02 6.1400000000000000e+02 2.2387932348176657e-02 0.0000000000000000e+00 +1.5530000000000000e+03 5.3500000000000000e+02 5.3800000000000000e+02 1.9008617386913739e-02 0.0000000000000000e+00 +1.5540000000000000e+03 5.3500000000000000e+02 5.7000000000000000e+02 2.1726336010049956e-02 0.0000000000000000e+00 +1.5550000000000000e+03 5.3500000000000000e+02 6.0000000000000000e+02 2.0883109204694127e-02 0.0000000000000000e+00 +1.5560000000000000e+03 5.3600000000000000e+02 5.7500000000000000e+02 1.9048952484009379e-02 0.0000000000000000e+00 +1.5570000000000000e+03 5.3600000000000000e+02 6.0600000000000000e+02 2.1660837201343711e-02 0.0000000000000000e+00 +1.5580000000000000e+03 5.3600000000000000e+02 6.6800000000000000e+02 2.2598765954634555e-02 0.0000000000000000e+00 +1.5590000000000000e+03 5.3700000000000000e+02 5.3800000000000000e+02 1.9027483938440472e-02 0.0000000000000000e+00 +1.5600000000000000e+03 5.3700000000000000e+02 5.4200000000000000e+02 2.0326009976833474e-02 0.0000000000000000e+00 +1.5610000000000000e+03 5.3700000000000000e+02 5.7300000000000000e+02 2.1331733267988758e-02 0.0000000000000000e+00 +1.5620000000000000e+03 5.3700000000000000e+02 6.0700000000000000e+02 2.1853759156117463e-02 0.0000000000000000e+00 +1.5630000000000000e+03 5.3800000000000000e+02 5.7300000000000000e+02 2.1593260417475672e-02 0.0000000000000000e+00 +1.5640000000000000e+03 5.3800000000000000e+02 6.0000000000000000e+02 2.2117717860480231e-02 0.0000000000000000e+00 +1.5650000000000000e+03 5.3900000000000000e+02 6.0800000000000000e+02 2.2213186896166099e-02 0.0000000000000000e+00 +1.5660000000000000e+03 5.3900000000000000e+02 6.1400000000000000e+02 2.2941288328220774e-02 0.0000000000000000e+00 +1.5670000000000000e+03 5.4000000000000000e+02 5.4200000000000000e+02 1.9925310265335262e-02 0.0000000000000000e+00 +1.5680000000000000e+03 5.4000000000000000e+02 5.6500000000000000e+02 2.0206695436220209e-02 0.0000000000000000e+00 +1.5690000000000000e+03 5.4000000000000000e+02 6.2000000000000000e+02 2.2820681177053201e-02 0.0000000000000000e+00 +1.5700000000000000e+03 5.4000000000000000e+02 6.4100000000000000e+02 2.1796774721559758e-02 0.0000000000000000e+00 +1.5710000000000000e+03 5.4100000000000000e+02 6.0300000000000000e+02 2.2753302610637575e-02 0.0000000000000000e+00 +1.5720000000000000e+03 5.4100000000000000e+02 6.0900000000000000e+02 2.3776209678387381e-02 0.0000000000000000e+00 +1.5730000000000000e+03 5.4100000000000000e+02 6.7400000000000000e+02 2.2284917276741558e-02 0.0000000000000000e+00 +1.5740000000000000e+03 5.4200000000000000e+02 6.0700000000000000e+02 2.2327170535895665e-02 0.0000000000000000e+00 +1.5750000000000000e+03 5.4200000000000000e+02 6.4100000000000000e+02 2.2010211478540466e-02 0.0000000000000000e+00 +1.5760000000000000e+03 5.4300000000000000e+02 5.6000000000000000e+02 2.0475870833034249e-02 0.0000000000000000e+00 +1.5770000000000000e+03 5.4300000000000000e+02 5.9400000000000000e+02 2.0666521398924918e-02 0.0000000000000000e+00 +1.5780000000000000e+03 5.4300000000000000e+02 6.0400000000000000e+02 2.2593348897015007e-02 0.0000000000000000e+00 +1.5790000000000000e+03 5.4300000000000000e+02 6.3000000000000000e+02 2.2129564137285260e-02 0.0000000000000000e+00 +1.5800000000000000e+03 5.4400000000000000e+02 5.4500000000000000e+02 1.8107090441453557e-02 0.0000000000000000e+00 +1.5810000000000000e+03 5.4400000000000000e+02 5.7600000000000000e+02 1.8773502316560314e-02 0.0000000000000000e+00 +1.5820000000000000e+03 5.4400000000000000e+02 5.9200000000000000e+02 2.1473828234121722e-02 0.0000000000000000e+00 +1.5830000000000000e+03 5.4400000000000000e+02 6.1000000000000000e+02 2.1413043358593384e-02 0.0000000000000000e+00 +1.5840000000000000e+03 5.4500000000000000e+02 5.9200000000000000e+02 2.1007748221983379e-02 0.0000000000000000e+00 +1.5850000000000000e+03 5.4500000000000000e+02 5.9900000000000000e+02 2.1817364579967784e-02 0.0000000000000000e+00 +1.5860000000000000e+03 5.4600000000000000e+02 5.8900000000000000e+02 2.0274108591969212e-02 0.0000000000000000e+00 +1.5870000000000000e+03 5.4600000000000000e+02 6.3500000000000000e+02 2.1433529197273073e-02 0.0000000000000000e+00 +1.5880000000000000e+03 5.4600000000000000e+02 6.8600000000000000e+02 2.0179330625266455e-02 0.0000000000000000e+00 +1.5890000000000000e+03 5.4700000000000000e+02 5.8100000000000000e+02 2.2795390216132722e-02 0.0000000000000000e+00 +1.5900000000000000e+03 5.4700000000000000e+02 6.2600000000000000e+02 2.4414450010254208e-02 0.0000000000000000e+00 +1.5910000000000000e+03 5.4800000000000000e+02 5.8900000000000000e+02 1.6578795400834172e-02 0.0000000000000000e+00 +1.5920000000000000e+03 5.4800000000000000e+02 6.9200000000000000e+02 2.5055900643459000e-02 0.0000000000000000e+00 +1.5930000000000000e+03 5.4900000000000000e+02 6.1300000000000000e+02 2.3019695033902849e-02 0.0000000000000000e+00 +1.5940000000000000e+03 5.4900000000000000e+02 6.2300000000000000e+02 2.3679814645789037e-02 0.0000000000000000e+00 +1.5950000000000000e+03 5.4900000000000000e+02 6.6400000000000000e+02 2.2734658374551252e-02 0.0000000000000000e+00 +1.5960000000000000e+03 5.5000000000000000e+02 5.5800000000000000e+02 2.4412890063967740e-02 0.0000000000000000e+00 +1.5970000000000000e+03 5.5000000000000000e+02 5.9600000000000000e+02 2.3867138869321028e-02 0.0000000000000000e+00 +1.5980000000000000e+03 5.5100000000000000e+02 5.5400000000000000e+02 1.9263710930026334e-02 0.0000000000000000e+00 +1.5990000000000000e+03 5.5100000000000000e+02 5.7200000000000000e+02 2.0810050663880728e-02 0.0000000000000000e+00 +1.6000000000000000e+03 5.5100000000000000e+02 6.1500000000000000e+02 2.2457746106502054e-02 0.0000000000000000e+00 +1.6010000000000000e+03 5.5100000000000000e+02 6.1800000000000000e+02 2.1885034427438155e-02 0.0000000000000000e+00 +1.6020000000000000e+03 5.5200000000000000e+02 5.6600000000000000e+02 2.3864041793057237e-02 0.0000000000000000e+00 +1.6030000000000000e+03 5.5200000000000000e+02 5.8100000000000000e+02 2.4520782929022846e-02 0.0000000000000000e+00 +1.6040000000000000e+03 5.5200000000000000e+02 6.1600000000000000e+02 2.3613245346449738e-02 0.0000000000000000e+00 +1.6050000000000000e+03 5.5200000000000000e+02 6.1700000000000000e+02 2.5223007042250566e-02 0.0000000000000000e+00 +1.6060000000000000e+03 5.5300000000000000e+02 5.9700000000000000e+02 2.8104032007359090e-02 0.0000000000000000e+00 +1.6070000000000000e+03 5.5300000000000000e+02 6.1200000000000000e+02 2.8871301626212733e-02 0.0000000000000000e+00 +1.6080000000000000e+03 5.5300000000000000e+02 6.5000000000000000e+02 2.9532033304906100e-02 0.0000000000000000e+00 +1.6090000000000000e+03 5.5400000000000000e+02 5.9400000000000000e+02 2.0261103905711463e-02 0.0000000000000000e+00 +1.6100000000000000e+03 5.5400000000000000e+02 6.1800000000000000e+02 2.1558568229092794e-02 0.0000000000000000e+00 +1.6110000000000000e+03 5.5400000000000000e+02 6.4300000000000000e+02 2.1513412735104244e-02 0.0000000000000000e+00 +1.6120000000000000e+03 5.5500000000000000e+02 5.8400000000000000e+02 2.0953506830198847e-02 0.0000000000000000e+00 +1.6130000000000000e+03 5.5500000000000000e+02 6.0100000000000000e+02 2.2326867960941049e-02 0.0000000000000000e+00 +1.6140000000000000e+03 5.5500000000000000e+02 6.3800000000000000e+02 2.1942719823701148e-02 0.0000000000000000e+00 +1.6150000000000000e+03 5.5600000000000000e+02 5.6700000000000000e+02 1.8213650337453331e-02 0.0000000000000000e+00 +1.6160000000000000e+03 5.5600000000000000e+02 6.2200000000000000e+02 1.8088468324424654e-02 0.0000000000000000e+00 +1.6170000000000000e+03 5.5600000000000000e+02 6.3100000000000000e+02 2.3225856694809414e-02 0.0000000000000000e+00 +1.6180000000000000e+03 5.5700000000000000e+02 5.9100000000000000e+02 2.2008738324408212e-02 0.0000000000000000e+00 +1.6190000000000000e+03 5.5700000000000000e+02 5.9800000000000000e+02 2.2036994423869295e-02 0.0000000000000000e+00 +1.6200000000000000e+03 5.5700000000000000e+02 6.9300000000000000e+02 1.9385960501139998e-02 0.0000000000000000e+00 +1.6210000000000000e+03 5.5800000000000000e+02 5.6300000000000000e+02 2.7499109547045993e-02 0.0000000000000000e+00 +1.6220000000000000e+03 5.5800000000000000e+02 5.9600000000000000e+02 2.6007069635508306e-02 0.0000000000000000e+00 +1.6230000000000000e+03 5.5900000000000000e+02 5.7100000000000000e+02 2.0822401154920338e-02 0.0000000000000000e+00 +1.6240000000000000e+03 5.5900000000000000e+02 6.2700000000000000e+02 2.2760086674041238e-02 0.0000000000000000e+00 +1.6250000000000000e+03 5.5900000000000000e+02 6.6100000000000000e+02 2.2681941615723601e-02 0.0000000000000000e+00 +1.6260000000000000e+03 5.6000000000000000e+02 5.7400000000000000e+02 2.0946978362450328e-02 0.0000000000000000e+00 +1.6270000000000000e+03 5.6000000000000000e+02 6.3000000000000000e+02 2.1652557423839730e-02 0.0000000000000000e+00 +1.6280000000000000e+03 5.6000000000000000e+02 6.3300000000000000e+02 2.1683530622324136e-02 0.0000000000000000e+00 +1.6290000000000000e+03 5.6100000000000000e+02 5.6800000000000000e+02 1.7635218308181027e-02 0.0000000000000000e+00 +1.6300000000000000e+03 5.6100000000000000e+02 5.7600000000000000e+02 1.7598415772888912e-02 0.0000000000000000e+00 +1.6310000000000000e+03 5.6100000000000000e+02 6.3200000000000000e+02 2.1085744883818092e-02 0.0000000000000000e+00 +1.6320000000000000e+03 5.6100000000000000e+02 6.5600000000000000e+02 2.0453363680225239e-02 0.0000000000000000e+00 +1.6330000000000000e+03 5.6200000000000000e+02 5.8600000000000000e+02 1.9386854951914390e-02 0.0000000000000000e+00 +1.6340000000000000e+03 5.6200000000000000e+02 6.2900000000000000e+02 2.2957026358988813e-02 0.0000000000000000e+00 +1.6350000000000000e+03 5.6200000000000000e+02 6.8700000000000000e+02 2.2032656452115267e-02 0.0000000000000000e+00 +1.6360000000000000e+03 5.6300000000000000e+02 5.9600000000000000e+02 2.9116317412251284e-02 0.0000000000000000e+00 +1.6370000000000000e+03 5.6300000000000000e+02 6.2800000000000000e+02 2.9278001899506950e-02 0.0000000000000000e+00 +1.6380000000000000e+03 5.6300000000000000e+02 6.4900000000000000e+02 3.0670015090139349e-02 0.0000000000000000e+00 +1.6390000000000000e+03 5.6400000000000000e+02 5.7500000000000000e+02 1.9928348813995658e-02 0.0000000000000000e+00 +1.6400000000000000e+03 5.6400000000000000e+02 6.3400000000000000e+02 2.2484520665186764e-02 0.0000000000000000e+00 +1.6410000000000000e+03 5.6400000000000000e+02 6.7300000000000000e+02 2.2642074631518079e-02 0.0000000000000000e+00 +1.6420000000000000e+03 5.6500000000000000e+02 6.0200000000000000e+02 2.0789577754873924e-02 0.0000000000000000e+00 +1.6430000000000000e+03 5.6500000000000000e+02 6.2000000000000000e+02 2.1082688954012694e-02 0.0000000000000000e+00 +1.6440000000000000e+03 5.6500000000000000e+02 6.5200000000000000e+02 2.2690220155172910e-02 0.0000000000000000e+00 +1.6450000000000000e+03 5.6600000000000000e+02 5.9800000000000000e+02 2.4443804652320423e-02 0.0000000000000000e+00 +1.6460000000000000e+03 5.6600000000000000e+02 6.1600000000000000e+02 2.4240753361725296e-02 0.0000000000000000e+00 +1.6470000000000000e+03 5.6600000000000000e+02 6.4500000000000000e+02 2.3953835973142774e-02 0.0000000000000000e+00 +1.6480000000000000e+03 5.6700000000000000e+02 5.8400000000000000e+02 1.8851613691493945e-02 0.0000000000000000e+00 +1.6490000000000000e+03 5.6700000000000000e+02 6.3100000000000000e+02 2.4557199785621823e-02 0.0000000000000000e+00 +1.6500000000000000e+03 5.6700000000000000e+02 6.5700000000000000e+02 2.2380578012654029e-02 0.0000000000000000e+00 +1.6510000000000000e+03 5.6800000000000000e+02 5.8600000000000000e+02 1.8981171442451150e-02 0.0000000000000000e+00 +1.6520000000000000e+03 5.6800000000000000e+02 6.3200000000000000e+02 2.0713777544636162e-02 0.0000000000000000e+00 +1.6530000000000000e+03 5.6800000000000000e+02 6.5900000000000000e+02 2.1738420271781068e-02 0.0000000000000000e+00 +1.6540000000000000e+03 5.6900000000000000e+02 5.9100000000000000e+02 2.2954486339356147e-02 0.0000000000000000e+00 +1.6550000000000000e+03 5.6900000000000000e+02 6.2300000000000000e+02 2.2237251119155216e-02 0.0000000000000000e+00 +1.6560000000000000e+03 5.6900000000000000e+02 6.9400000000000000e+02 2.6341443078584100e-02 0.0000000000000000e+00 +1.6570000000000000e+03 5.7000000000000000e+02 6.0000000000000000e+02 1.8400117369591878e-02 0.0000000000000000e+00 +1.6580000000000000e+03 5.7000000000000000e+02 6.0600000000000000e+02 1.8707008672493138e-02 0.0000000000000000e+00 +1.6590000000000000e+03 5.7000000000000000e+02 6.3700000000000000e+02 2.1334542364468783e-02 0.0000000000000000e+00 +1.6600000000000000e+03 5.7000000000000000e+02 6.9800000000000000e+02 2.2280076541348531e-02 0.0000000000000000e+00 +1.6610000000000000e+03 5.7100000000000000e+02 5.7200000000000000e+02 2.1096333849716313e-02 0.0000000000000000e+00 +1.6620000000000000e+03 5.7100000000000000e+02 6.4700000000000000e+02 2.3105266837974186e-02 0.0000000000000000e+00 +1.6630000000000000e+03 5.7100000000000000e+02 6.6100000000000000e+02 2.2688946426695739e-02 0.0000000000000000e+00 +1.6640000000000000e+03 5.7200000000000000e+02 6.1500000000000000e+02 2.1597047528143336e-02 0.0000000000000000e+00 +1.6650000000000000e+03 5.7200000000000000e+02 6.4700000000000000e+02 2.1750631049622892e-02 0.0000000000000000e+00 +1.6660000000000000e+03 5.7300000000000000e+02 6.0000000000000000e+02 1.9395927662241002e-02 0.0000000000000000e+00 +1.6670000000000000e+03 5.7300000000000000e+02 6.0700000000000000e+02 1.8628777312164183e-02 0.0000000000000000e+00 +1.6680000000000000e+03 5.7300000000000000e+02 6.6500000000000000e+02 2.1604299142885499e-02 0.0000000000000000e+00 +1.6690000000000000e+03 5.7300000000000000e+02 6.7000000000000000e+02 2.2457590798175695e-02 0.0000000000000000e+00 +1.6700000000000000e+03 5.7400000000000000e+02 6.2100000000000000e+02 2.2715708907536391e-02 0.0000000000000000e+00 +1.6710000000000000e+03 5.7400000000000000e+02 6.3300000000000000e+02 2.1695679786080072e-02 0.0000000000000000e+00 +1.6720000000000000e+03 5.7500000000000000e+02 6.6800000000000000e+02 2.3300906303976975e-02 0.0000000000000000e+00 +1.6730000000000000e+03 5.7500000000000000e+02 6.7300000000000000e+02 2.3373515969279248e-02 0.0000000000000000e+00 +1.6740000000000000e+03 5.7600000000000000e+02 6.1000000000000000e+02 2.1796721105979220e-02 0.0000000000000000e+00 +1.6750000000000000e+03 5.7600000000000000e+02 6.5600000000000000e+02 2.0802546323629378e-02 0.0000000000000000e+00 +1.6760000000000000e+03 5.7700000000000000e+02 5.8300000000000000e+02 2.5869782945215702e-02 0.0000000000000000e+00 +1.6770000000000000e+03 5.7700000000000000e+02 6.1100000000000000e+02 2.4878074730278803e-02 0.0000000000000000e+00 +1.6780000000000000e+03 5.7700000000000000e+02 6.4200000000000000e+02 2.3478357704226661e-02 0.0000000000000000e+00 +1.6790000000000000e+03 5.7700000000000000e+02 6.6900000000000000e+02 2.2290255559612109e-02 0.0000000000000000e+00 +1.6800000000000000e+03 5.7800000000000000e+02 6.1200000000000000e+02 2.5392262581121247e-02 0.0000000000000000e+00 +1.6810000000000000e+03 5.7800000000000000e+02 6.2800000000000000e+02 2.4024072911310142e-02 0.0000000000000000e+00 +1.6820000000000000e+03 5.7800000000000000e+02 6.9500000000000000e+02 2.3419464816584582e-02 0.0000000000000000e+00 +1.6830000000000000e+03 5.7900000000000000e+02 5.8300000000000000e+02 2.6652763547668244e-02 0.0000000000000000e+00 +1.6840000000000000e+03 5.7900000000000000e+02 5.9700000000000000e+02 2.7109583615507613e-02 0.0000000000000000e+00 +1.6850000000000000e+03 5.7900000000000000e+02 6.4000000000000000e+02 2.4158126027102839e-02 0.0000000000000000e+00 +1.6860000000000000e+03 5.7900000000000000e+02 6.5800000000000000e+02 2.5915851449980640e-02 0.0000000000000000e+00 +1.6870000000000000e+03 5.8000000000000000e+02 5.9300000000000000e+02 2.0606110428543271e-02 0.0000000000000000e+00 +1.6880000000000000e+03 5.8000000000000000e+02 6.0900000000000000e+02 2.1744981374061764e-02 0.0000000000000000e+00 +1.6890000000000000e+03 5.8000000000000000e+02 6.4600000000000000e+02 2.3753618501774557e-02 0.0000000000000000e+00 +1.6900000000000000e+03 5.8000000000000000e+02 6.8100000000000000e+02 2.3876888647916181e-02 0.0000000000000000e+00 +1.6910000000000000e+03 5.8100000000000000e+02 6.1700000000000000e+02 2.3678464086870511e-02 0.0000000000000000e+00 +1.6920000000000000e+03 5.8100000000000000e+02 6.2600000000000000e+02 2.4489222266905714e-02 0.0000000000000000e+00 +1.6930000000000000e+03 5.8100000000000000e+02 6.6200000000000000e+02 2.4173535473683363e-02 0.0000000000000000e+00 +1.6940000000000000e+03 5.8200000000000000e+02 5.9600000000000000e+02 2.6456606662053735e-02 0.0000000000000000e+00 +1.6950000000000000e+03 5.8200000000000000e+02 6.0300000000000000e+02 2.4269012264668672e-02 0.0000000000000000e+00 +1.6960000000000000e+03 5.8200000000000000e+02 6.4900000000000000e+02 2.4170055580142576e-02 0.0000000000000000e+00 +1.6970000000000000e+03 5.8200000000000000e+02 6.5500000000000000e+02 2.2795113042720843e-02 0.0000000000000000e+00 +1.6980000000000000e+03 5.8300000000000000e+02 6.4000000000000000e+02 2.4313981593525363e-02 0.0000000000000000e+00 +1.6990000000000000e+03 5.8300000000000000e+02 6.4200000000000000e+02 2.2750895559146844e-02 0.0000000000000000e+00 +1.7000000000000000e+03 5.8400000000000000e+02 6.3800000000000000e+02 2.2830068242432715e-02 0.0000000000000000e+00 +1.7010000000000000e+03 5.8400000000000000e+02 6.5700000000000000e+02 2.2614054411277514e-02 0.0000000000000000e+00 +1.7020000000000000e+03 5.8500000000000000e+02 6.1400000000000000e+02 1.9937804381031751e-02 0.0000000000000000e+00 +1.7030000000000000e+03 5.8500000000000000e+02 6.2700000000000000e+02 1.9988008233075030e-02 0.0000000000000000e+00 +1.7040000000000000e+03 5.8500000000000000e+02 6.8400000000000000e+02 2.2407367322570728e-02 0.0000000000000000e+00 +1.7050000000000000e+03 5.8500000000000000e+02 6.9000000000000000e+02 2.2966982006672867e-02 0.0000000000000000e+00 +1.7060000000000000e+03 5.8600000000000000e+02 6.5900000000000000e+02 2.1823318384519834e-02 0.0000000000000000e+00 +1.7070000000000000e+03 5.8600000000000000e+02 6.8700000000000000e+02 2.3346205240060734e-02 0.0000000000000000e+00 +1.7080000000000000e+03 5.8700000000000000e+02 6.2100000000000000e+02 2.1757164867708335e-02 0.0000000000000000e+00 +1.7090000000000000e+03 5.8700000000000000e+02 6.2500000000000000e+02 2.2723130092030950e-02 0.0000000000000000e+00 +1.7100000000000000e+03 5.8700000000000000e+02 6.5100000000000000e+02 2.1869432719718203e-02 0.0000000000000000e+00 +1.7110000000000000e+03 5.8700000000000000e+02 6.8900000000000000e+02 2.2837739113691351e-02 0.0000000000000000e+00 +1.7120000000000000e+03 5.8800000000000000e+02 6.1900000000000000e+02 2.0179290750667177e-02 0.0000000000000000e+00 +1.7130000000000000e+03 5.8800000000000000e+02 6.7100000000000000e+02 2.0638168288939114e-02 0.0000000000000000e+00 +1.7140000000000000e+03 5.8800000000000000e+02 6.7500000000000000e+02 2.4110351765223224e-02 0.0000000000000000e+00 +1.7150000000000000e+03 5.8800000000000000e+02 6.9200000000000000e+02 2.3509405418841344e-02 0.0000000000000000e+00 +1.7160000000000000e+03 5.8900000000000000e+02 6.8600000000000000e+02 1.9569321606456587e-02 0.0000000000000000e+00 +1.7170000000000000e+03 5.8900000000000000e+02 6.9200000000000000e+02 2.5323763444922119e-02 0.0000000000000000e+00 +1.7180000000000000e+03 5.9000000000000000e+02 5.9300000000000000e+02 2.1399118165772682e-02 0.0000000000000000e+00 +1.7190000000000000e+03 5.9000000000000000e+02 6.2900000000000000e+02 1.9748519779776302e-02 0.0000000000000000e+00 +1.7200000000000000e+03 5.9000000000000000e+02 6.3600000000000000e+02 2.3100166355779373e-02 0.0000000000000000e+00 +1.7210000000000000e+03 5.9000000000000000e+02 6.9600000000000000e+02 2.1518922576474551e-02 0.0000000000000000e+00 +1.7220000000000000e+03 5.9100000000000000e+02 6.9300000000000000e+02 1.9337567750327436e-02 0.0000000000000000e+00 +1.7230000000000000e+03 5.9100000000000000e+02 6.9400000000000000e+02 2.5510775179923312e-02 0.0000000000000000e+00 +1.7240000000000000e+03 5.9200000000000000e+02 5.9900000000000000e+02 1.7964697871215653e-02 0.0000000000000000e+00 +1.7250000000000000e+03 5.9200000000000000e+02 6.1000000000000000e+02 1.7819679021076094e-02 0.0000000000000000e+00 +1.7260000000000000e+03 5.9200000000000000e+02 6.3900000000000000e+02 2.1291925339241926e-02 0.0000000000000000e+00 +1.7270000000000000e+03 5.9200000000000000e+02 6.6600000000000000e+02 2.0600689113050453e-02 0.0000000000000000e+00 +1.7280000000000000e+03 5.9300000000000000e+02 6.3600000000000000e+02 2.2839296512025216e-02 0.0000000000000000e+00 +1.7290000000000000e+03 5.9300000000000000e+02 6.4600000000000000e+02 2.3365171665729160e-02 0.0000000000000000e+00 +1.7300000000000000e+03 5.9400000000000000e+02 6.0400000000000000e+02 2.1924096933426906e-02 0.0000000000000000e+00 +1.7310000000000000e+03 5.9400000000000000e+02 6.4300000000000000e+02 2.1781141660125482e-02 0.0000000000000000e+00 +1.7320000000000000e+03 5.9500000000000000e+02 6.1100000000000000e+02 2.6381312439336266e-02 0.0000000000000000e+00 +1.7330000000000000e+03 5.9500000000000000e+02 6.2600000000000000e+02 2.4982309732827033e-02 0.0000000000000000e+00 +1.7340000000000000e+03 5.9500000000000000e+02 6.4400000000000000e+02 2.0594599964932288e-02 0.0000000000000000e+00 +1.7350000000000000e+03 5.9500000000000000e+02 6.5300000000000000e+02 2.5770662108169532e-02 0.0000000000000000e+00 +1.7360000000000000e+03 5.9600000000000000e+02 6.4900000000000000e+02 2.4377724333450423e-02 0.0000000000000000e+00 +1.7370000000000000e+03 5.9700000000000000e+02 6.5000000000000000e+02 2.8936381951153063e-02 0.0000000000000000e+00 +1.7380000000000000e+03 5.9700000000000000e+02 6.5800000000000000e+02 2.4950602870434369e-02 0.0000000000000000e+00 +1.7390000000000000e+03 5.9800000000000000e+02 6.4500000000000000e+02 2.3181182103035748e-02 0.0000000000000000e+00 +1.7400000000000000e+03 5.9800000000000000e+02 6.9300000000000000e+02 1.9583601574089601e-02 0.0000000000000000e+00 +1.7410000000000000e+03 5.9900000000000000e+02 6.2400000000000000e+02 1.7949218929515332e-02 0.0000000000000000e+00 +1.7420000000000000e+03 5.9900000000000000e+02 6.3900000000000000e+02 2.0792093747695618e-02 0.0000000000000000e+00 +1.7430000000000000e+03 5.9900000000000000e+02 6.9100000000000000e+02 2.2522869370128845e-02 0.0000000000000000e+00 +1.7440000000000000e+03 6.0000000000000000e+02 6.3700000000000000e+02 2.1713824155237232e-02 0.0000000000000000e+00 +1.7450000000000000e+03 6.0000000000000000e+02 6.7000000000000000e+02 2.1579924484482225e-02 0.0000000000000000e+00 +1.7460000000000000e+03 6.0100000000000000e+02 6.3500000000000000e+02 2.0873560463740531e-02 0.0000000000000000e+00 +1.7470000000000000e+03 6.0100000000000000e+02 6.3800000000000000e+02 2.2095620902270262e-02 0.0000000000000000e+00 +1.7480000000000000e+03 6.0200000000000000e+02 6.2200000000000000e+02 2.0214769711875639e-02 0.0000000000000000e+00 +1.7490000000000000e+03 6.0200000000000000e+02 6.4800000000000000e+02 2.6630547366681481e-02 0.0000000000000000e+00 +1.7500000000000000e+03 6.0200000000000000e+02 6.5200000000000000e+02 2.1031290813311544e-02 0.0000000000000000e+00 +1.7510000000000000e+03 6.0300000000000000e+02 6.5500000000000000e+02 2.1981283679055202e-02 0.0000000000000000e+00 +1.7520000000000000e+03 6.0300000000000000e+02 6.7400000000000000e+02 2.3853113548710010e-02 0.0000000000000000e+00 +1.7530000000000000e+03 6.0300000000000000e+02 7.0000000000000000e+02 2.2380660369382341e-02 0.0000000000000000e+00 +1.7540000000000000e+03 6.0400000000000000e+02 6.3000000000000000e+02 2.0331780749147699e-02 0.0000000000000000e+00 +1.7550000000000000e+03 6.0400000000000000e+02 6.4300000000000000e+02 2.0609002541253217e-02 0.0000000000000000e+00 +1.7560000000000000e+03 6.0400000000000000e+02 6.7600000000000000e+02 2.1745289224686958e-02 0.0000000000000000e+00 +1.7570000000000000e+03 6.0400000000000000e+02 6.9700000000000000e+02 2.0724242135639333e-02 0.0000000000000000e+00 +1.7580000000000000e+03 6.0500000000000000e+02 6.1300000000000000e+02 2.2279136467549390e-02 0.0000000000000000e+00 +1.7590000000000000e+03 6.0500000000000000e+02 6.2500000000000000e+02 2.2142836105011474e-02 0.0000000000000000e+00 +1.7600000000000000e+03 6.0500000000000000e+02 6.5400000000000000e+02 2.2020456172358240e-02 0.0000000000000000e+00 +1.7610000000000000e+03 6.0500000000000000e+02 6.7900000000000000e+02 2.1896759493456222e-02 0.0000000000000000e+00 +1.7620000000000000e+03 6.0600000000000000e+02 6.6800000000000000e+02 1.8371672038346224e-02 0.0000000000000000e+00 +1.7630000000000000e+03 6.0600000000000000e+02 6.9800000000000000e+02 2.0527999719165465e-02 0.0000000000000000e+00 +1.7640000000000000e+03 6.0600000000000000e+02 7.2700000000000000e+02 2.2149443303200574e-02 0.0000000000000000e+00 +1.7650000000000000e+03 6.0700000000000000e+02 6.4100000000000000e+02 1.9760504988209207e-02 0.0000000000000000e+00 +1.7660000000000000e+03 6.0700000000000000e+02 6.6500000000000000e+02 2.1543789945737093e-02 0.0000000000000000e+00 +1.7670000000000000e+03 6.0700000000000000e+02 6.7200000000000000e+02 2.2266869703315768e-02 0.0000000000000000e+00 +1.7680000000000000e+03 6.0800000000000000e+02 6.1400000000000000e+02 1.9953525337562214e-02 0.0000000000000000e+00 +1.7690000000000000e+03 6.0800000000000000e+02 6.3400000000000000e+02 1.9279876936253264e-02 0.0000000000000000e+00 +1.7700000000000000e+03 6.0800000000000000e+02 6.8200000000000000e+02 2.1875167186471978e-02 0.0000000000000000e+00 +1.7710000000000000e+03 6.0800000000000000e+02 7.0100000000000000e+02 2.1402276388275625e-02 0.0000000000000000e+00 +1.7720000000000000e+03 6.0900000000000000e+02 6.7400000000000000e+02 2.2302092051992843e-02 0.0000000000000000e+00 +1.7730000000000000e+03 6.0900000000000000e+02 6.8100000000000000e+02 2.3451281087492414e-02 0.0000000000000000e+00 +1.7740000000000000e+03 6.0900000000000000e+02 7.4000000000000000e+02 2.3556281762879022e-02 0.0000000000000000e+00 +1.7750000000000000e+03 6.1000000000000000e+02 6.5600000000000000e+02 1.7890331215557383e-02 0.0000000000000000e+00 +1.7760000000000000e+03 6.1000000000000000e+02 6.6600000000000000e+02 2.0713985405124730e-02 0.0000000000000000e+00 +1.7770000000000000e+03 6.1000000000000000e+02 6.6700000000000000e+02 2.0214638285258948e-02 0.0000000000000000e+00 +1.7780000000000000e+03 6.1100000000000000e+02 6.5300000000000000e+02 2.2774969639066067e-02 0.0000000000000000e+00 +1.7790000000000000e+03 6.1100000000000000e+02 6.6900000000000000e+02 2.3358257288391551e-02 0.0000000000000000e+00 +1.7800000000000000e+03 6.1200000000000000e+02 6.5000000000000000e+02 3.3496301469979804e-02 0.0000000000000000e+00 +1.7810000000000000e+03 6.1200000000000000e+02 6.9500000000000000e+02 2.7660395432361415e-02 0.0000000000000000e+00 +1.7820000000000000e+03 6.1200000000000000e+02 7.1800000000000000e+02 2.5758130293863490e-02 0.0000000000000000e+00 +1.7830000000000000e+03 6.1200000000000000e+02 7.4500000000000000e+02 2.9518868214988628e-02 0.0000000000000000e+00 +1.7840000000000000e+03 6.1300000000000000e+02 6.6400000000000000e+02 2.4265061095816203e-02 0.0000000000000000e+00 +1.7850000000000000e+03 6.1300000000000000e+02 6.7900000000000000e+02 2.2288793446445108e-02 0.0000000000000000e+00 +1.7860000000000000e+03 6.1300000000000000e+02 7.3800000000000000e+02 2.0158467373173630e-02 0.0000000000000000e+00 +1.7870000000000000e+03 6.1400000000000000e+02 6.8200000000000000e+02 2.1843167392833842e-02 0.0000000000000000e+00 +1.7880000000000000e+03 6.1400000000000000e+02 6.8400000000000000e+02 2.1844988895618783e-02 0.0000000000000000e+00 +1.7890000000000000e+03 6.1500000000000000e+02 6.1800000000000000e+02 2.0471788621269461e-02 0.0000000000000000e+00 +1.7900000000000000e+03 6.1500000000000000e+02 6.4700000000000000e+02 2.0182744084771838e-02 0.0000000000000000e+00 +1.7910000000000000e+03 6.1500000000000000e+02 6.8300000000000000e+02 2.2693311873460686e-02 0.0000000000000000e+00 +1.7920000000000000e+03 6.1500000000000000e+02 6.8800000000000000e+02 2.2101904243300198e-02 0.0000000000000000e+00 +1.7930000000000000e+03 6.1600000000000000e+02 6.1700000000000000e+02 2.4790670081288230e-02 0.0000000000000000e+00 +1.7940000000000000e+03 6.1600000000000000e+02 6.4500000000000000e+02 2.4273937956473347e-02 0.0000000000000000e+00 +1.7950000000000000e+03 6.1600000000000000e+02 6.7800000000000000e+02 2.3305760108115754e-02 0.0000000000000000e+00 +1.7960000000000000e+03 6.1600000000000000e+02 6.8000000000000000e+02 2.7333223800750223e-02 0.0000000000000000e+00 +1.7970000000000000e+03 6.1700000000000000e+02 6.6200000000000000e+02 2.4261533852129823e-02 0.0000000000000000e+00 +1.7980000000000000e+03 6.1700000000000000e+02 6.8000000000000000e+02 2.5205656276768084e-02 0.0000000000000000e+00 +1.7990000000000000e+03 6.1700000000000000e+02 7.5300000000000000e+02 2.5451165420833106e-02 0.0000000000000000e+00 +1.8000000000000000e+03 6.1800000000000000e+02 6.4300000000000000e+02 1.9267123507966478e-02 0.0000000000000000e+00 +1.8010000000000000e+03 6.1800000000000000e+02 6.8800000000000000e+02 2.1892883205158052e-02 0.0000000000000000e+00 +1.8020000000000000e+03 6.1800000000000000e+02 7.0700000000000000e+02 2.1875076768181945e-02 0.0000000000000000e+00 +1.8030000000000000e+03 6.1900000000000000e+02 6.2400000000000000e+02 2.0183069128751403e-02 0.0000000000000000e+00 +1.8040000000000000e+03 6.1900000000000000e+02 6.7100000000000000e+02 2.1319032653329479e-02 0.0000000000000000e+00 +1.8050000000000000e+03 6.1900000000000000e+02 7.2200000000000000e+02 2.0751728686877840e-02 0.0000000000000000e+00 +1.8060000000000000e+03 6.2000000000000000e+02 6.4100000000000000e+02 1.9998576781446557e-02 0.0000000000000000e+00 +1.8070000000000000e+03 6.2000000000000000e+02 6.5200000000000000e+02 1.9708428520165945e-02 0.0000000000000000e+00 +1.8080000000000000e+03 6.2000000000000000e+02 6.6000000000000000e+02 2.2056218818198348e-02 0.0000000000000000e+00 +1.8090000000000000e+03 6.2000000000000000e+02 6.9900000000000000e+02 2.1799195056829798e-02 0.0000000000000000e+00 +1.8100000000000000e+03 6.2100000000000000e+02 6.3300000000000000e+02 2.1381314898974300e-02 0.0000000000000000e+00 +1.8110000000000000e+03 6.2100000000000000e+02 6.8900000000000000e+02 2.2255523738266988e-02 0.0000000000000000e+00 +1.8120000000000000e+03 6.2100000000000000e+02 7.0300000000000000e+02 2.2231755929984838e-02 0.0000000000000000e+00 +1.8130000000000000e+03 6.2200000000000000e+02 6.3100000000000000e+02 2.5957874040495495e-02 0.0000000000000000e+00 +1.8140000000000000e+03 6.2200000000000000e+02 6.4800000000000000e+02 2.3787923291903813e-02 0.0000000000000000e+00 +1.8150000000000000e+03 6.2300000000000000e+02 6.6400000000000000e+02 2.2753643481700808e-02 0.0000000000000000e+00 +1.8160000000000000e+03 6.2300000000000000e+02 6.9400000000000000e+02 2.4915380378823224e-02 0.0000000000000000e+00 +1.8170000000000000e+03 6.2400000000000000e+02 6.9100000000000000e+02 2.0599149012510785e-02 0.0000000000000000e+00 +1.8180000000000000e+03 6.2400000000000000e+02 7.2200000000000000e+02 2.3222561155526546e-02 0.0000000000000000e+00 +1.8190000000000000e+03 6.2500000000000000e+02 6.5100000000000000e+02 2.1990169179356152e-02 0.0000000000000000e+00 +1.8200000000000000e+03 6.2500000000000000e+02 6.5400000000000000e+02 2.1647349244991745e-02 0.0000000000000000e+00 +1.8210000000000000e+03 6.2600000000000000e+02 6.4400000000000000e+02 2.2053493227505563e-02 0.0000000000000000e+00 +1.8220000000000000e+03 6.2600000000000000e+02 6.6200000000000000e+02 2.2961971800890241e-02 0.0000000000000000e+00 +1.8230000000000000e+03 6.2700000000000000e+02 6.6100000000000000e+02 2.1038856737021865e-02 0.0000000000000000e+00 +1.8240000000000000e+03 6.2700000000000000e+02 6.9000000000000000e+02 2.1874766050612136e-02 0.0000000000000000e+00 +1.8250000000000000e+03 6.2700000000000000e+02 7.5400000000000000e+02 2.2077168872128242e-02 0.0000000000000000e+00 +1.8260000000000000e+03 6.2800000000000000e+02 6.4900000000000000e+02 2.4720340390822083e-02 0.0000000000000000e+00 +1.8270000000000000e+03 6.2800000000000000e+02 6.9500000000000000e+02 2.6861030168080682e-02 0.0000000000000000e+00 +1.8280000000000000e+03 6.2800000000000000e+02 7.1400000000000000e+02 2.4385025363580608e-02 0.0000000000000000e+00 +1.8290000000000000e+03 6.2900000000000000e+02 6.8700000000000000e+02 1.9014152987655963e-02 0.0000000000000000e+00 +1.8300000000000000e+03 6.2900000000000000e+02 6.9600000000000000e+02 2.2488804845227743e-02 0.0000000000000000e+00 +1.8310000000000000e+03 6.2900000000000000e+02 7.4200000000000000e+02 2.1215129152864189e-02 0.0000000000000000e+00 +1.8320000000000000e+03 6.3000000000000000e+02 6.3300000000000000e+02 2.1001741358658964e-02 0.0000000000000000e+00 +1.8330000000000000e+03 6.3000000000000000e+02 6.9700000000000000e+02 2.1077252027085536e-02 0.0000000000000000e+00 +1.8340000000000000e+03 6.3000000000000000e+02 7.1900000000000000e+02 2.2258783942385219e-02 0.0000000000000000e+00 +1.8350000000000000e+03 6.3100000000000000e+02 6.4800000000000000e+02 2.4488378961616351e-02 0.0000000000000000e+00 +1.8360000000000000e+03 6.3100000000000000e+02 6.5700000000000000e+02 2.3704383140772858e-02 0.0000000000000000e+00 +1.8370000000000000e+03 6.3100000000000000e+02 6.8500000000000000e+02 2.5019790275889874e-02 0.0000000000000000e+00 +1.8380000000000000e+03 6.3100000000000000e+02 7.0200000000000000e+02 2.9188555332658243e-02 0.0000000000000000e+00 +1.8390000000000000e+03 6.3200000000000000e+02 6.5600000000000000e+02 1.7282571058877216e-02 0.0000000000000000e+00 +1.8400000000000000e+03 6.3200000000000000e+02 6.5900000000000000e+02 1.7314682547767555e-02 0.0000000000000000e+00 +1.8410000000000000e+03 6.3200000000000000e+02 6.6300000000000000e+02 2.0357410391926466e-02 0.0000000000000000e+00 +1.8420000000000000e+03 6.3200000000000000e+02 6.7700000000000000e+02 2.1002431187277498e-02 0.0000000000000000e+00 +1.8430000000000000e+03 6.3300000000000000e+02 7.0300000000000000e+02 2.3099079947703709e-02 0.0000000000000000e+00 +1.8440000000000000e+03 6.3300000000000000e+02 7.1900000000000000e+02 2.2793288943313842e-02 0.0000000000000000e+00 +1.8450000000000000e+03 6.3400000000000000e+02 6.7300000000000000e+02 2.0046796135680101e-02 0.0000000000000000e+00 +1.8460000000000000e+03 6.3400000000000000e+02 7.0100000000000000e+02 2.1334102796679060e-02 0.0000000000000000e+00 +1.8470000000000000e+03 6.3400000000000000e+02 7.3300000000000000e+02 2.1942329762920106e-02 0.0000000000000000e+00 +1.8480000000000000e+03 6.3500000000000000e+02 6.3800000000000000e+02 2.2129042499463392e-02 0.0000000000000000e+00 +1.8490000000000000e+03 6.3500000000000000e+02 6.8600000000000000e+02 1.8856452327588751e-02 0.0000000000000000e+00 +1.8500000000000000e+03 6.3500000000000000e+02 7.1300000000000000e+02 2.1729937409597826e-02 0.0000000000000000e+00 +1.8510000000000000e+03 6.3600000000000000e+02 6.4600000000000000e+02 2.0423597097565541e-02 0.0000000000000000e+00 +1.8520000000000000e+03 6.3600000000000000e+02 6.9600000000000000e+02 1.9932252505842983e-02 0.0000000000000000e+00 +1.8530000000000000e+03 6.3600000000000000e+02 7.1100000000000000e+02 2.2752780974671177e-02 0.0000000000000000e+00 +1.8540000000000000e+03 6.3600000000000000e+02 7.4900000000000000e+02 2.1478241658345096e-02 0.0000000000000000e+00 +1.8550000000000000e+03 6.3700000000000000e+02 6.7000000000000000e+02 1.7846496090190161e-02 0.0000000000000000e+00 +1.8560000000000000e+03 6.3700000000000000e+02 6.9800000000000000e+02 1.9075467483431231e-02 0.0000000000000000e+00 +1.8570000000000000e+03 6.3700000000000000e+02 7.1000000000000000e+02 2.1831237313114916e-02 0.0000000000000000e+00 +1.8580000000000000e+03 6.3700000000000000e+02 7.5200000000000000e+02 2.4054578372010412e-02 0.0000000000000000e+00 +1.8590000000000000e+03 6.3800000000000000e+02 6.5700000000000000e+02 2.0930189486266744e-02 0.0000000000000000e+00 +1.8600000000000000e+03 6.3800000000000000e+02 7.1300000000000000e+02 2.2395352544027754e-02 0.0000000000000000e+00 +1.8610000000000000e+03 6.3900000000000000e+02 6.6600000000000000e+02 1.7266145827553089e-02 0.0000000000000000e+00 +1.8620000000000000e+03 6.3900000000000000e+02 6.9100000000000000e+02 1.8557329404798730e-02 0.0000000000000000e+00 +1.8630000000000000e+03 6.3900000000000000e+02 7.3600000000000000e+02 2.1302828975778225e-02 0.0000000000000000e+00 +1.8640000000000000e+03 6.3900000000000000e+02 7.4600000000000000e+02 2.3321195997965703e-02 0.0000000000000000e+00 +1.8650000000000000e+03 6.4000000000000000e+02 6.4200000000000000e+02 2.5904504962651353e-02 0.0000000000000000e+00 +1.8660000000000000e+03 6.4000000000000000e+02 6.5800000000000000e+02 2.8311070278850922e-02 0.0000000000000000e+00 +1.8670000000000000e+03 6.4000000000000000e+02 7.1700000000000000e+02 2.4018410306627935e-02 0.0000000000000000e+00 +1.8680000000000000e+03 6.4000000000000000e+02 7.2100000000000000e+02 2.6565367843640476e-02 0.0000000000000000e+00 +1.8690000000000000e+03 6.4100000000000000e+02 6.6000000000000000e+02 2.2767816410657084e-02 0.0000000000000000e+00 +1.8700000000000000e+03 6.4100000000000000e+02 6.7200000000000000e+02 2.2314623019062778e-02 0.0000000000000000e+00 +1.8710000000000000e+03 6.4200000000000000e+02 6.6900000000000000e+02 2.4759134146764304e-02 0.0000000000000000e+00 +1.8720000000000000e+03 6.4200000000000000e+02 7.0500000000000000e+02 2.2118895121212359e-02 0.0000000000000000e+00 +1.8730000000000000e+03 6.4200000000000000e+02 7.1700000000000000e+02 2.4871060253798104e-02 0.0000000000000000e+00 +1.8740000000000000e+03 6.4300000000000000e+02 6.7600000000000000e+02 2.1742096727044951e-02 0.0000000000000000e+00 +1.8750000000000000e+03 6.4300000000000000e+02 7.0700000000000000e+02 2.1684171588626139e-02 0.0000000000000000e+00 +1.8760000000000000e+03 6.4400000000000000e+02 6.5300000000000000e+02 2.2163351091709669e-02 0.0000000000000000e+00 +1.8770000000000000e+03 6.4400000000000000e+02 6.6200000000000000e+02 2.1284195479054604e-02 0.0000000000000000e+00 +1.8780000000000000e+03 6.4400000000000000e+02 7.2000000000000000e+02 2.2765682812585376e-02 0.0000000000000000e+00 +1.8790000000000000e+03 6.4500000000000000e+02 6.7800000000000000e+02 2.1334446764315732e-02 0.0000000000000000e+00 +1.8800000000000000e+03 6.4500000000000000e+02 6.9300000000000000e+02 2.0612613990896464e-02 0.0000000000000000e+00 +1.8810000000000000e+03 6.4500000000000000e+02 6.9400000000000000e+02 2.5580734911005040e-02 0.0000000000000000e+00 +1.8820000000000000e+03 6.4600000000000000e+02 6.8100000000000000e+02 2.1201499688926460e-02 0.0000000000000000e+00 +1.8830000000000000e+03 6.4600000000000000e+02 7.1100000000000000e+02 2.1594565806949694e-02 0.0000000000000000e+00 +1.8840000000000000e+03 6.4600000000000000e+02 7.3500000000000000e+02 2.2823627767868240e-02 0.0000000000000000e+00 +1.8850000000000000e+03 6.4700000000000000e+02 6.6100000000000000e+02 2.1546891482687132e-02 0.0000000000000000e+00 +1.8860000000000000e+03 6.4700000000000000e+02 6.8300000000000000e+02 2.1802885159799505e-02 0.0000000000000000e+00 +1.8870000000000000e+03 6.4700000000000000e+02 7.1500000000000000e+02 2.2487212245644851e-02 0.0000000000000000e+00 +1.8880000000000000e+03 6.4800000000000000e+02 6.5200000000000000e+02 2.3766011066274226e-02 0.0000000000000000e+00 +1.8890000000000000e+03 6.4800000000000000e+02 6.8500000000000000e+02 2.6437546959434576e-02 0.0000000000000000e+00 +1.8900000000000000e+03 6.4800000000000000e+02 7.0800000000000000e+02 2.6903607069642614e-02 0.0000000000000000e+00 +1.8910000000000000e+03 6.4800000000000000e+02 7.5500000000000000e+02 2.1507243205994554e-02 0.0000000000000000e+00 +1.8920000000000000e+03 6.4900000000000000e+02 6.5500000000000000e+02 2.5807638165303327e-02 0.0000000000000000e+00 +1.8930000000000000e+03 6.4900000000000000e+02 7.1400000000000000e+02 2.5171280886000513e-02 0.0000000000000000e+00 +1.8940000000000000e+03 6.5000000000000000e+02 6.5800000000000000e+02 3.1535111807659021e-02 0.0000000000000000e+00 +1.8950000000000000e+03 6.5000000000000000e+02 7.0400000000000000e+02 2.9018121147904311e-02 0.0000000000000000e+00 +1.8960000000000000e+03 6.5000000000000000e+02 7.1800000000000000e+02 2.5559526030270816e-02 0.0000000000000000e+00 +1.8970000000000000e+03 6.5000000000000000e+02 7.3900000000000000e+02 2.9965969023676705e-02 0.0000000000000000e+00 +1.8980000000000000e+03 6.5100000000000000e+02 6.5400000000000000e+02 2.2886074023294328e-02 0.0000000000000000e+00 +1.8990000000000000e+03 6.5100000000000000e+02 6.8900000000000000e+02 2.2932636536984428e-02 0.0000000000000000e+00 +1.9000000000000000e+03 6.5100000000000000e+02 7.0600000000000000e+02 2.4130542703612482e-02 0.0000000000000000e+00 +1.9010000000000000e+03 6.5100000000000000e+02 7.1600000000000000e+02 2.2549292485170961e-02 0.0000000000000000e+00 +1.9020000000000000e+03 6.5200000000000000e+02 6.9900000000000000e+02 2.1418893775627511e-02 0.0000000000000000e+00 +1.9030000000000000e+03 6.5200000000000000e+02 7.5500000000000000e+02 1.9494121520041333e-02 0.0000000000000000e+00 +1.9040000000000000e+03 6.5300000000000000e+02 6.6900000000000000e+02 2.4413352810500111e-02 0.0000000000000000e+00 +1.9050000000000000e+03 6.5300000000000000e+02 7.2000000000000000e+02 2.4852865181009640e-02 0.0000000000000000e+00 +1.9060000000000000e+03 6.5300000000000000e+02 7.2300000000000000e+02 2.2307701244565100e-02 0.0000000000000000e+00 +1.9070000000000000e+03 6.5400000000000000e+02 6.7900000000000000e+02 2.2919061596189106e-02 0.0000000000000000e+00 +1.9080000000000000e+03 6.5400000000000000e+02 7.1200000000000000e+02 2.2382727074663229e-02 0.0000000000000000e+00 +1.9090000000000000e+03 6.5400000000000000e+02 7.1600000000000000e+02 2.2707015421770161e-02 0.0000000000000000e+00 +1.9100000000000000e+03 6.5500000000000000e+02 7.0000000000000000e+02 2.4002057246632996e-02 0.0000000000000000e+00 +1.9110000000000000e+03 6.5500000000000000e+02 7.1400000000000000e+02 2.3905915767255179e-02 0.0000000000000000e+00 +1.9120000000000000e+03 6.5500000000000000e+02 7.2400000000000000e+02 2.2967512898842010e-02 0.0000000000000000e+00 +1.9130000000000000e+03 6.5600000000000000e+02 6.6300000000000000e+02 2.0925301506775795e-02 0.0000000000000000e+00 +1.9140000000000000e+03 6.5600000000000000e+02 6.6700000000000000e+02 2.0796432869012418e-02 0.0000000000000000e+00 +1.9150000000000000e+03 6.5700000000000000e+02 7.0200000000000000e+02 2.3786103240657202e-02 0.0000000000000000e+00 +1.9160000000000000e+03 6.5700000000000000e+02 7.1300000000000000e+02 2.3789271729491766e-02 0.0000000000000000e+00 +1.9170000000000000e+03 6.5800000000000000e+02 7.0400000000000000e+02 2.5965963976020027e-02 0.0000000000000000e+00 +1.9180000000000000e+03 6.5800000000000000e+02 7.2100000000000000e+02 2.6394489317768402e-02 0.0000000000000000e+00 +1.9190000000000000e+03 6.5900000000000000e+02 6.7700000000000000e+02 2.0113664230404515e-02 0.0000000000000000e+00 +1.9200000000000000e+03 6.5900000000000000e+02 6.8700000000000000e+02 1.9041222532581017e-02 0.0000000000000000e+00 +1.9210000000000000e+03 6.5900000000000000e+02 7.3700000000000000e+02 2.2577805080878133e-02 0.0000000000000000e+00 +1.9220000000000000e+03 6.6000000000000000e+02 6.7200000000000000e+02 1.9147335386503324e-02 0.0000000000000000e+00 +1.9230000000000000e+03 6.6000000000000000e+02 6.9900000000000000e+02 1.8487529027321030e-02 0.0000000000000000e+00 +1.9240000000000000e+03 6.6000000000000000e+02 7.2500000000000000e+02 2.1810036845937436e-02 0.0000000000000000e+00 +1.9250000000000000e+03 6.6000000000000000e+02 7.2600000000000000e+02 2.0401666365098742e-02 0.0000000000000000e+00 +1.9260000000000000e+03 6.6100000000000000e+02 7.1500000000000000e+02 2.2867351118726068e-02 0.0000000000000000e+00 +1.9270000000000000e+03 6.6100000000000000e+02 7.5400000000000000e+02 2.1919687265535767e-02 0.0000000000000000e+00 +1.9280000000000000e+03 6.6200000000000000e+02 7.2000000000000000e+02 2.9277792767903800e-02 0.0000000000000000e+00 +1.9290000000000000e+03 6.6200000000000000e+02 7.5300000000000000e+02 2.3146163628577611e-02 0.0000000000000000e+00 +1.9300000000000000e+03 6.6300000000000000e+02 6.6700000000000000e+02 1.6988925997088997e-02 0.0000000000000000e+00 +1.9310000000000000e+03 6.6300000000000000e+02 6.7700000000000000e+02 1.6861213330619289e-02 0.0000000000000000e+00 +1.9320000000000000e+03 6.6300000000000000e+02 7.2800000000000000e+02 1.9375863378599270e-02 0.0000000000000000e+00 +1.9330000000000000e+03 6.6300000000000000e+02 7.5600000000000000e+02 2.1401651725953517e-02 0.0000000000000000e+00 +1.9340000000000000e+03 6.6400000000000000e+02 6.7800000000000000e+02 2.3206769127622567e-02 0.0000000000000000e+00 +1.9350000000000000e+03 6.6400000000000000e+02 6.9400000000000000e+02 2.3929396278623630e-02 0.0000000000000000e+00 +1.9360000000000000e+03 6.6400000000000000e+02 7.3800000000000000e+02 2.2029547391450122e-02 0.0000000000000000e+00 +1.9370000000000000e+03 6.6500000000000000e+02 6.7000000000000000e+02 1.8847349564048311e-02 0.0000000000000000e+00 +1.9380000000000000e+03 6.6500000000000000e+02 6.7200000000000000e+02 1.8909715101564226e-02 0.0000000000000000e+00 +1.9390000000000000e+03 6.6500000000000000e+02 7.3100000000000000e+02 2.0815826071848946e-02 0.0000000000000000e+00 +1.9400000000000000e+03 6.6500000000000000e+02 7.4300000000000000e+02 2.0741033242790124e-02 0.0000000000000000e+00 +1.9410000000000000e+03 6.6600000000000000e+02 6.6700000000000000e+02 1.7504549946515222e-02 0.0000000000000000e+00 +1.9420000000000000e+03 6.6600000000000000e+02 7.3600000000000000e+02 2.2399058220452749e-02 0.0000000000000000e+00 +1.9430000000000000e+03 6.6600000000000000e+02 7.7200000000000000e+02 2.0306243688596719e-02 0.0000000000000000e+00 +1.9440000000000000e+03 6.6700000000000000e+02 7.2800000000000000e+02 1.9162102388608410e-02 0.0000000000000000e+00 +1.9450000000000000e+03 6.6700000000000000e+02 7.7200000000000000e+02 2.1094881619956669e-02 0.0000000000000000e+00 +1.9460000000000000e+03 6.6800000000000000e+02 6.7300000000000000e+02 1.9121489940748054e-02 0.0000000000000000e+00 +1.9470000000000000e+03 6.6800000000000000e+02 7.2700000000000000e+02 2.0590433382998680e-02 0.0000000000000000e+00 +1.9480000000000000e+03 6.6800000000000000e+02 7.6300000000000000e+02 2.2305391919578831e-02 0.0000000000000000e+00 +1.9490000000000000e+03 6.6900000000000000e+02 7.0500000000000000e+02 2.2077501919143250e-02 0.0000000000000000e+00 +1.9500000000000000e+03 6.6900000000000000e+02 7.2300000000000000e+02 2.3427926815131929e-02 0.0000000000000000e+00 +1.9510000000000000e+03 6.7000000000000000e+02 7.1000000000000000e+02 2.2033863990797434e-02 0.0000000000000000e+00 +1.9520000000000000e+03 6.7000000000000000e+02 7.4300000000000000e+02 2.0181284711704502e-02 0.0000000000000000e+00 +1.9530000000000000e+03 6.7100000000000000e+02 6.7500000000000000e+02 2.1376924501995735e-02 0.0000000000000000e+00 +1.9540000000000000e+03 6.7100000000000000e+02 7.2200000000000000e+02 1.8619783644958046e-02 0.0000000000000000e+00 +1.9550000000000000e+03 6.7100000000000000e+02 7.3000000000000000e+02 1.9861775069260977e-02 0.0000000000000000e+00 +1.9560000000000000e+03 6.7100000000000000e+02 7.4100000000000000e+02 2.0773469584312965e-02 0.0000000000000000e+00 +1.9570000000000000e+03 6.7200000000000000e+02 7.2600000000000000e+02 2.1346506226738348e-02 0.0000000000000000e+00 +1.9580000000000000e+03 6.7200000000000000e+02 7.3100000000000000e+02 2.0054118020766343e-02 0.0000000000000000e+00 +1.9590000000000000e+03 6.7300000000000000e+02 7.3300000000000000e+02 2.1996474883918940e-02 0.0000000000000000e+00 +1.9600000000000000e+03 6.7300000000000000e+02 7.6300000000000000e+02 2.1586847344775954e-02 0.0000000000000000e+00 +1.9610000000000000e+03 6.7400000000000000e+02 7.0000000000000000e+02 2.1395883481762856e-02 0.0000000000000000e+00 +1.9620000000000000e+03 6.7400000000000000e+02 7.2900000000000000e+02 2.4031205448084146e-02 0.0000000000000000e+00 +1.9630000000000000e+03 6.7400000000000000e+02 7.4000000000000000e+02 2.4738583153449772e-02 0.0000000000000000e+00 +1.9640000000000000e+03 6.7500000000000000e+02 6.8500000000000000e+02 2.6359768164233244e-02 0.0000000000000000e+00 +1.9650000000000000e+03 6.7500000000000000e+02 6.9200000000000000e+02 2.2532014439046361e-02 0.0000000000000000e+00 +1.9660000000000000e+03 6.7500000000000000e+02 7.0200000000000000e+02 2.2461212617450779e-02 0.0000000000000000e+00 +1.9670000000000000e+03 6.7500000000000000e+02 7.3000000000000000e+02 1.9096016212479246e-02 0.0000000000000000e+00 +1.9680000000000000e+03 6.7600000000000000e+02 6.9700000000000000e+02 2.0580844617144517e-02 0.0000000000000000e+00 +1.9690000000000000e+03 6.7600000000000000e+02 7.0700000000000000e+02 1.9191714948313468e-02 0.0000000000000000e+00 +1.9700000000000000e+03 6.7600000000000000e+02 7.3200000000000000e+02 2.1238651839890963e-02 0.0000000000000000e+00 +1.9710000000000000e+03 6.7600000000000000e+02 7.5100000000000000e+02 2.0369882936256242e-02 0.0000000000000000e+00 +1.9720000000000000e+03 6.7700000000000000e+02 7.3700000000000000e+02 1.7600554706013200e-02 0.0000000000000000e+00 +1.9730000000000000e+03 6.7700000000000000e+02 7.5600000000000000e+02 2.1072323516746316e-02 0.0000000000000000e+00 +1.9740000000000000e+03 6.7700000000000000e+02 7.9100000000000000e+02 2.2302223458270706e-02 0.0000000000000000e+00 +1.9750000000000000e+03 6.7800000000000000e+02 6.8000000000000000e+02 2.8309335250282813e-02 0.0000000000000000e+00 +1.9760000000000000e+03 6.7800000000000000e+02 6.9400000000000000e+02 2.6790464674952136e-02 0.0000000000000000e+00 +1.9770000000000000e+03 6.7800000000000000e+02 7.3800000000000000e+02 2.0443134164628483e-02 0.0000000000000000e+00 +1.9780000000000000e+03 6.7900000000000000e+02 6.8000000000000000e+02 2.5818515566321445e-02 0.0000000000000000e+00 +1.9790000000000000e+03 6.7900000000000000e+02 7.1200000000000000e+02 2.1902576858184076e-02 0.0000000000000000e+00 +1.9800000000000000e+03 6.7900000000000000e+02 7.3800000000000000e+02 2.0421056969654159e-02 0.0000000000000000e+00 +1.9810000000000000e+03 6.8000000000000000e+02 7.1200000000000000e+02 2.7060945289601655e-02 0.0000000000000000e+00 +1.9820000000000000e+03 6.8000000000000000e+02 7.3800000000000000e+02 2.2269356331646152e-02 0.0000000000000000e+00 +1.9830000000000000e+03 6.8000000000000000e+02 7.5300000000000000e+02 2.5829546580695802e-02 0.0000000000000000e+00 +1.9840000000000000e+03 6.8100000000000000e+02 7.3500000000000000e+02 2.3158871869624023e-02 0.0000000000000000e+00 +1.9850000000000000e+03 6.8100000000000000e+02 7.4000000000000000e+02 2.1002168572833043e-02 0.0000000000000000e+00 +1.9860000000000000e+03 6.8100000000000000e+02 7.7100000000000000e+02 2.2814021396262582e-02 0.0000000000000000e+00 +1.9870000000000000e+03 6.8200000000000000e+02 6.8400000000000000e+02 1.9716339342191098e-02 0.0000000000000000e+00 +1.9880000000000000e+03 6.8200000000000000e+02 7.0100000000000000e+02 1.8921459289934009e-02 0.0000000000000000e+00 +1.9890000000000000e+03 6.8200000000000000e+02 7.0900000000000000e+02 2.2268037402135326e-02 0.0000000000000000e+00 +1.9900000000000000e+03 6.8200000000000000e+02 7.4700000000000000e+02 2.0301327035091164e-02 0.0000000000000000e+00 +1.9910000000000000e+03 6.8300000000000000e+02 6.8800000000000000e+02 2.1513869293680800e-02 0.0000000000000000e+00 +1.9920000000000000e+03 6.8300000000000000e+02 7.1500000000000000e+02 1.9886309615276758e-02 0.0000000000000000e+00 +1.9930000000000000e+03 6.8300000000000000e+02 7.3400000000000000e+02 2.2633907887835033e-02 0.0000000000000000e+00 +1.9940000000000000e+03 6.8300000000000000e+02 7.5000000000000000e+02 2.2884911562841875e-02 0.0000000000000000e+00 +1.9950000000000000e+03 6.8400000000000000e+02 6.9000000000000000e+02 2.0508662598323582e-02 0.0000000000000000e+00 +1.9960000000000000e+03 6.8400000000000000e+02 7.0900000000000000e+02 2.2172872966154559e-02 0.0000000000000000e+00 +1.9970000000000000e+03 6.8400000000000000e+02 7.4400000000000000e+02 2.2884878083797494e-02 0.0000000000000000e+00 +1.9980000000000000e+03 6.8500000000000000e+02 7.0200000000000000e+02 2.0860892721923725e-02 0.0000000000000000e+00 +1.9990000000000000e+03 6.8500000000000000e+02 7.0800000000000000e+02 1.9848589167536502e-02 0.0000000000000000e+00 +2.0000000000000000e+03 6.8500000000000000e+02 7.3000000000000000e+02 2.0233307277965101e-02 0.0000000000000000e+00 +2.0010000000000000e+03 6.8600000000000000e+02 6.9200000000000000e+02 2.0972768971177481e-02 0.0000000000000000e+00 +2.0020000000000000e+03 6.8600000000000000e+02 7.1300000000000000e+02 2.0244840837300240e-02 0.0000000000000000e+00 +2.0030000000000000e+03 6.8700000000000000e+02 7.3700000000000000e+02 2.1066317196531206e-02 0.0000000000000000e+00 +2.0040000000000000e+03 6.8700000000000000e+02 7.4200000000000000e+02 2.1575644022389637e-02 0.0000000000000000e+00 +2.0050000000000000e+03 6.8800000000000000e+02 7.0700000000000000e+02 1.9900895903133788e-02 0.0000000000000000e+00 +2.0060000000000000e+03 6.8800000000000000e+02 7.5000000000000000e+02 2.3248174161562576e-02 0.0000000000000000e+00 +2.0070000000000000e+03 6.8800000000000000e+02 7.6100000000000000e+02 2.1920899051462207e-02 0.0000000000000000e+00 +2.0080000000000000e+03 6.8900000000000000e+02 7.0300000000000000e+02 2.1205373491881174e-02 0.0000000000000000e+00 +2.0090000000000000e+03 6.8900000000000000e+02 7.0600000000000000e+02 2.3020691682849245e-02 0.0000000000000000e+00 +2.0100000000000000e+03 6.8900000000000000e+02 7.4800000000000000e+02 2.2747964839244336e-02 0.0000000000000000e+00 +2.0110000000000000e+03 6.9000000000000000e+02 7.4400000000000000e+02 2.2511283066416962e-02 0.0000000000000000e+00 +2.0120000000000000e+03 6.9000000000000000e+02 7.5400000000000000e+02 1.9991015554299323e-02 0.0000000000000000e+00 +2.0130000000000000e+03 6.9000000000000000e+02 7.9600000000000000e+02 2.2578417771766411e-02 0.0000000000000000e+00 +2.0140000000000000e+03 6.9100000000000000e+02 7.2200000000000000e+02 1.8394692995386520e-02 0.0000000000000000e+00 +2.0150000000000000e+03 6.9100000000000000e+02 7.4600000000000000e+02 2.1281313842522010e-02 0.0000000000000000e+00 +2.0160000000000000e+03 6.9100000000000000e+02 7.7000000000000000e+02 2.2208686891462336e-02 0.0000000000000000e+00 +2.0170000000000000e+03 6.9200000000000000e+02 7.0200000000000000e+02 3.1249814276964872e-02 0.0000000000000000e+00 +2.0180000000000000e+03 6.9200000000000000e+02 7.1300000000000000e+02 2.8518365498984129e-02 0.0000000000000000e+00 +2.0190000000000000e+03 6.9300000000000000e+02 6.9400000000000000e+02 2.1591493460195215e-02 0.0000000000000000e+00 +2.0200000000000000e+03 6.9500000000000000e+02 7.1400000000000000e+02 2.4236438986561935e-02 0.0000000000000000e+00 +2.0210000000000000e+03 6.9500000000000000e+02 7.4500000000000000e+02 2.4164933771989357e-02 0.0000000000000000e+00 +2.0220000000000000e+03 6.9500000000000000e+02 7.6600000000000000e+02 2.4106939068197355e-02 0.0000000000000000e+00 +2.0230000000000000e+03 6.9600000000000000e+02 7.4200000000000000e+02 1.8747523462581947e-02 0.0000000000000000e+00 +2.0240000000000000e+03 6.9600000000000000e+02 7.4900000000000000e+02 2.2148266455898083e-02 0.0000000000000000e+00 +2.0250000000000000e+03 6.9600000000000000e+02 7.8100000000000000e+02 2.1574984839724011e-02 0.0000000000000000e+00 +2.0260000000000000e+03 6.9700000000000000e+02 7.1900000000000000e+02 2.0200458963116754e-02 0.0000000000000000e+00 +2.0270000000000000e+03 6.9700000000000000e+02 7.5100000000000000e+02 2.1350352759975617e-02 0.0000000000000000e+00 +2.0280000000000000e+03 6.9700000000000000e+02 7.8400000000000000e+02 2.1300074790145552e-02 0.0000000000000000e+00 +2.0290000000000000e+03 6.9800000000000000e+02 7.2700000000000000e+02 1.8252183845276816e-02 0.0000000000000000e+00 +2.0300000000000000e+03 6.9800000000000000e+02 7.5200000000000000e+02 2.2737174466459880e-02 0.0000000000000000e+00 +2.0310000000000000e+03 6.9800000000000000e+02 7.7500000000000000e+02 2.3100234710281480e-02 0.0000000000000000e+00 +2.0320000000000000e+03 6.9900000000000000e+02 7.2500000000000000e+02 2.1666602663370480e-02 0.0000000000000000e+00 +2.0330000000000000e+03 6.9900000000000000e+02 7.5500000000000000e+02 1.7082047272099627e-02 0.0000000000000000e+00 +2.0340000000000000e+03 6.9900000000000000e+02 7.5700000000000000e+02 2.4625964475197704e-02 0.0000000000000000e+00 +2.0350000000000000e+03 7.0000000000000000e+02 7.2400000000000000e+02 2.1778062679658063e-02 0.0000000000000000e+00 +2.0360000000000000e+03 7.0000000000000000e+02 7.2900000000000000e+02 2.4141443227639427e-02 0.0000000000000000e+00 +2.0370000000000000e+03 7.0000000000000000e+02 7.6000000000000000e+02 2.3428895575709631e-02 0.0000000000000000e+00 +2.0380000000000000e+03 7.0100000000000000e+02 7.3300000000000000e+02 1.9083961380118277e-02 0.0000000000000000e+00 +2.0390000000000000e+03 7.0100000000000000e+02 7.4700000000000000e+02 2.1037213043175448e-02 0.0000000000000000e+00 +2.0400000000000000e+03 7.0100000000000000e+02 7.8600000000000000e+02 2.1080777656749001e-02 0.0000000000000000e+00 +2.0410000000000000e+03 7.0200000000000000e+02 7.1300000000000000e+02 1.9157483278137818e-02 0.0000000000000000e+00 +2.0420000000000000e+03 7.0300000000000000e+02 7.1900000000000000e+02 2.1868243315009216e-02 0.0000000000000000e+00 +2.0430000000000000e+03 7.0300000000000000e+02 7.4800000000000000e+02 2.1881251095059583e-02 0.0000000000000000e+00 +2.0440000000000000e+03 7.0300000000000000e+02 8.0800000000000000e+02 2.2527015375370961e-02 0.0000000000000000e+00 +2.0450000000000000e+03 7.0400000000000000e+02 7.2100000000000000e+02 2.8126003948619097e-02 0.0000000000000000e+00 +2.0460000000000000e+03 7.0400000000000000e+02 7.3900000000000000e+02 2.6594475790459208e-02 0.0000000000000000e+00 +2.0470000000000000e+03 7.0400000000000000e+02 7.6200000000000000e+02 2.5894661935772782e-02 0.0000000000000000e+00 +2.0480000000000000e+03 7.0400000000000000e+02 7.9500000000000000e+02 2.6306264298228826e-02 0.0000000000000000e+00 +2.0490000000000000e+03 7.0500000000000000e+02 7.1700000000000000e+02 2.5418118641612159e-02 0.0000000000000000e+00 +2.0500000000000000e+03 7.0500000000000000e+02 7.2300000000000000e+02 2.4796823880383977e-02 0.0000000000000000e+00 +2.0510000000000000e+03 7.0500000000000000e+02 7.5800000000000000e+02 2.3773444146000491e-02 0.0000000000000000e+00 +2.0520000000000000e+03 7.0500000000000000e+02 7.7300000000000000e+02 2.0307526306976631e-02 0.0000000000000000e+00 +2.0530000000000000e+03 7.0600000000000000e+02 7.1600000000000000e+02 2.3466829745849207e-02 0.0000000000000000e+00 +2.0540000000000000e+03 7.0600000000000000e+02 7.4800000000000000e+02 2.3168515790858640e-02 0.0000000000000000e+00 +2.0550000000000000e+03 7.0600000000000000e+02 7.5900000000000000e+02 2.4930948425558444e-02 0.0000000000000000e+00 +2.0560000000000000e+03 7.0600000000000000e+02 8.0900000000000000e+02 2.2590710200025916e-02 0.0000000000000000e+00 +2.0570000000000000e+03 7.0700000000000000e+02 7.3200000000000000e+02 2.1026344656759392e-02 0.0000000000000000e+00 +2.0580000000000000e+03 7.0700000000000000e+02 7.6100000000000000e+02 2.1795074377335660e-02 0.0000000000000000e+00 +2.0590000000000000e+03 7.0800000000000000e+02 7.3000000000000000e+02 1.8185890694913952e-02 0.0000000000000000e+00 +2.0600000000000000e+03 7.0800000000000000e+02 7.4100000000000000e+02 2.2064734238293211e-02 0.0000000000000000e+00 +2.0610000000000000e+03 7.0800000000000000e+02 7.5500000000000000e+02 1.9591568036192209e-02 0.0000000000000000e+00 +2.0620000000000000e+03 7.0800000000000000e+02 7.5700000000000000e+02 2.1148733194654958e-02 0.0000000000000000e+00 +2.0630000000000000e+03 7.0900000000000000e+02 7.4400000000000000e+02 1.9985965912203162e-02 0.0000000000000000e+00 +2.0640000000000000e+03 7.0900000000000000e+02 7.4700000000000000e+02 1.8593061942331280e-02 0.0000000000000000e+00 +2.0650000000000000e+03 7.0900000000000000e+02 7.8300000000000000e+02 2.2172018694559918e-02 0.0000000000000000e+00 +2.0660000000000000e+03 7.0900000000000000e+02 7.9800000000000000e+02 2.1772480438500035e-02 0.0000000000000000e+00 +2.0670000000000000e+03 7.1000000000000000e+02 7.4300000000000000e+02 1.7881426676003401e-02 0.0000000000000000e+00 +2.0680000000000000e+03 7.1000000000000000e+02 7.5200000000000000e+02 1.8963707508578703e-02 0.0000000000000000e+00 +2.0690000000000000e+03 7.1000000000000000e+02 7.6800000000000000e+02 2.1009795993353331e-02 0.0000000000000000e+00 +2.0700000000000000e+03 7.1000000000000000e+02 7.9000000000000000e+02 2.3531559590266458e-02 0.0000000000000000e+00 +2.0710000000000000e+03 7.1100000000000000e+02 7.3500000000000000e+02 1.9839753717333410e-02 0.0000000000000000e+00 +2.0720000000000000e+03 7.1100000000000000e+02 7.4900000000000000e+02 2.0674466553990020e-02 0.0000000000000000e+00 +2.0730000000000000e+03 7.1100000000000000e+02 7.6500000000000000e+02 2.3589955774232126e-02 0.0000000000000000e+00 +2.0740000000000000e+03 7.1100000000000000e+02 7.8700000000000000e+02 2.2992425779596745e-02 0.0000000000000000e+00 +2.0750000000000000e+03 7.1200000000000000e+02 7.1600000000000000e+02 2.4093503310381851e-02 0.0000000000000000e+00 +2.0760000000000000e+03 7.1200000000000000e+02 7.5300000000000000e+02 2.2521745534861630e-02 0.0000000000000000e+00 +2.0770000000000000e+03 7.1200000000000000e+02 7.6900000000000000e+02 2.0858506107883146e-02 0.0000000000000000e+00 +2.0780000000000000e+03 7.1400000000000000e+02 7.2400000000000000e+02 2.3871394937155000e-02 0.0000000000000000e+00 +2.0790000000000000e+03 7.1400000000000000e+02 7.6600000000000000e+02 2.5572076793972227e-02 0.0000000000000000e+00 +2.0800000000000000e+03 7.1500000000000000e+02 7.3400000000000000e+02 2.2812032382975640e-02 0.0000000000000000e+00 +2.0810000000000000e+03 7.1500000000000000e+02 7.5400000000000000e+02 2.1482831810178255e-02 0.0000000000000000e+00 +2.0820000000000000e+03 7.1500000000000000e+02 7.6400000000000000e+02 2.2916416919070672e-02 0.0000000000000000e+00 +2.0830000000000000e+03 7.1600000000000000e+02 7.5900000000000000e+02 2.5716000680457568e-02 0.0000000000000000e+00 +2.0840000000000000e+03 7.1600000000000000e+02 7.6900000000000000e+02 2.0834068195431935e-02 0.0000000000000000e+00 +2.0850000000000000e+03 7.1700000000000000e+02 7.2100000000000000e+02 2.6874102064589844e-02 0.0000000000000000e+00 +2.0860000000000000e+03 7.1700000000000000e+02 7.5800000000000000e+02 2.4243854518355017e-02 0.0000000000000000e+00 +2.0870000000000000e+03 7.1700000000000000e+02 7.6700000000000000e+02 2.7027773876250293e-02 0.0000000000000000e+00 +2.0880000000000000e+03 7.1800000000000000e+02 7.3900000000000000e+02 2.2207260526391312e-02 0.0000000000000000e+00 +2.0890000000000000e+03 7.1800000000000000e+02 7.4500000000000000e+02 2.3415103574708281e-02 0.0000000000000000e+00 +2.0900000000000000e+03 7.1800000000000000e+02 7.8500000000000000e+02 2.4568787447699528e-02 0.0000000000000000e+00 +2.0910000000000000e+03 7.1900000000000000e+02 7.8400000000000000e+02 2.0034794305312076e-02 0.0000000000000000e+00 +2.0920000000000000e+03 7.1900000000000000e+02 8.0800000000000000e+02 2.2251505155640009e-02 0.0000000000000000e+00 +2.0930000000000000e+03 7.2000000000000000e+02 7.2300000000000000e+02 2.6291140165147758e-02 0.0000000000000000e+00 +2.0940000000000000e+03 7.2000000000000000e+02 7.5300000000000000e+02 2.8202215357218143e-02 0.0000000000000000e+00 +2.0950000000000000e+03 7.2000000000000000e+02 7.5900000000000000e+02 2.8782392939282118e-02 0.0000000000000000e+00 +2.0960000000000000e+03 7.2000000000000000e+02 7.6900000000000000e+02 2.1494087713474563e-02 0.0000000000000000e+00 +2.0970000000000000e+03 7.2100000000000000e+02 7.6200000000000000e+02 2.5456481584219811e-02 0.0000000000000000e+00 +2.0980000000000000e+03 7.2100000000000000e+02 7.6700000000000000e+02 2.7407425083894384e-02 0.0000000000000000e+00 +2.0990000000000000e+03 7.2200000000000000e+02 7.4100000000000000e+02 2.1869576491657369e-02 0.0000000000000000e+00 +2.1000000000000000e+03 7.2200000000000000e+02 7.7000000000000000e+02 2.0073790426803823e-02 0.0000000000000000e+00 +2.1010000000000000e+03 7.2300000000000000e+02 7.5900000000000000e+02 2.4532560158810668e-02 0.0000000000000000e+00 +2.1020000000000000e+03 7.2300000000000000e+02 7.7300000000000000e+02 2.0601811711944678e-02 0.0000000000000000e+00 +2.1030000000000000e+03 7.2400000000000000e+02 7.6000000000000000e+02 2.4133448745526486e-02 0.0000000000000000e+00 +2.1040000000000000e+03 7.2400000000000000e+02 7.6600000000000000e+02 2.2664759036019388e-02 0.0000000000000000e+00 +2.1050000000000000e+03 7.2400000000000000e+02 8.0400000000000000e+02 2.1675709818136452e-02 0.0000000000000000e+00 +2.1060000000000000e+03 7.2500000000000000e+02 7.2600000000000000e+02 1.7673774512086640e-02 0.0000000000000000e+00 +2.1070000000000000e+03 7.2500000000000000e+02 7.5700000000000000e+02 2.1040997131741606e-02 0.0000000000000000e+00 +2.1080000000000000e+03 7.2500000000000000e+02 7.7400000000000000e+02 2.3129126204385345e-02 0.0000000000000000e+00 +2.1090000000000000e+03 7.2500000000000000e+02 8.0600000000000000e+02 1.9294410379259282e-02 0.0000000000000000e+00 +2.1100000000000000e+03 7.2600000000000000e+02 7.3100000000000000e+02 1.8858662574156620e-02 0.0000000000000000e+00 +2.1110000000000000e+03 7.2600000000000000e+02 7.7400000000000000e+02 2.4973567559156456e-02 0.0000000000000000e+00 +2.1120000000000000e+03 7.2600000000000000e+02 7.9300000000000000e+02 2.0068663078405279e-02 0.0000000000000000e+00 +2.1130000000000000e+03 7.2700000000000000e+02 7.6300000000000000e+02 1.8486245566936246e-02 0.0000000000000000e+00 +2.1140000000000000e+03 7.2700000000000000e+02 7.7500000000000000e+02 2.1305527861841960e-02 0.0000000000000000e+00 +2.1150000000000000e+03 7.2700000000000000e+02 8.1300000000000000e+02 2.2400094493186796e-02 0.0000000000000000e+00 +2.1160000000000000e+03 7.2800000000000000e+02 7.5600000000000000e+02 1.6755433210970269e-02 0.0000000000000000e+00 +2.1170000000000000e+03 7.2800000000000000e+02 7.7200000000000000e+02 1.6659645725027972e-02 0.0000000000000000e+00 +2.1180000000000000e+03 7.2800000000000000e+02 7.9200000000000000e+02 1.9422759468147924e-02 0.0000000000000000e+00 +2.1190000000000000e+03 7.2800000000000000e+02 7.9400000000000000e+02 1.9810072029877359e-02 0.0000000000000000e+00 +2.1200000000000000e+03 7.2900000000000000e+02 7.4000000000000000e+02 2.2092747276906403e-02 0.0000000000000000e+00 +2.1210000000000000e+03 7.2900000000000000e+02 7.6000000000000000e+02 2.0038486583156268e-02 0.0000000000000000e+00 +2.1220000000000000e+03 7.2900000000000000e+02 7.7600000000000000e+02 2.2646068609162538e-02 0.0000000000000000e+00 +2.1230000000000000e+03 7.2900000000000000e+02 7.9700000000000000e+02 2.2635415474203696e-02 0.0000000000000000e+00 +2.1240000000000000e+03 7.3000000000000000e+02 7.4100000000000000e+02 1.6592952882672141e-02 0.0000000000000000e+00 +2.1250000000000000e+03 7.3100000000000000e+02 7.4300000000000000e+02 1.8830813077883375e-02 0.0000000000000000e+00 +2.1260000000000000e+03 7.3100000000000000e+02 7.8200000000000000e+02 2.0183586517602561e-02 0.0000000000000000e+00 +2.1270000000000000e+03 7.3100000000000000e+02 7.9300000000000000e+02 2.0524007557954308e-02 0.0000000000000000e+00 +2.1280000000000000e+03 7.3200000000000000e+02 7.5100000000000000e+02 1.9540829546366385e-02 0.0000000000000000e+00 +2.1290000000000000e+03 7.3200000000000000e+02 7.6100000000000000e+02 1.9374853388388430e-02 0.0000000000000000e+00 +2.1300000000000000e+03 7.3200000000000000e+02 7.7700000000000000e+02 2.2066941055946560e-02 0.0000000000000000e+00 +2.1310000000000000e+03 7.3200000000000000e+02 7.8900000000000000e+02 2.1560136115540668e-02 0.0000000000000000e+00 +2.1320000000000000e+03 7.3300000000000000e+02 7.6300000000000000e+02 1.8773120922443143e-02 0.0000000000000000e+00 +2.1330000000000000e+03 7.3300000000000000e+02 7.8600000000000000e+02 2.0829038027870110e-02 0.0000000000000000e+00 +2.1340000000000000e+03 7.3300000000000000e+02 8.1600000000000000e+02 2.0947531736704324e-02 0.0000000000000000e+00 +2.1350000000000000e+03 7.3400000000000000e+02 7.5000000000000000e+02 2.0489983547529945e-02 0.0000000000000000e+00 +2.1360000000000000e+03 7.3400000000000000e+02 7.6400000000000000e+02 2.0729962822410641e-02 0.0000000000000000e+00 +2.1370000000000000e+03 7.3400000000000000e+02 7.8000000000000000e+02 2.2551913709282188e-02 0.0000000000000000e+00 +2.1380000000000000e+03 7.3400000000000000e+02 7.8800000000000000e+02 2.1974852018988963e-02 0.0000000000000000e+00 +2.1390000000000000e+03 7.3500000000000000e+02 7.6500000000000000e+02 2.2928772344455808e-02 0.0000000000000000e+00 +2.1400000000000000e+03 7.3500000000000000e+02 7.7100000000000000e+02 2.0933197172340511e-02 0.0000000000000000e+00 +2.1410000000000000e+03 7.3500000000000000e+02 7.7900000000000000e+02 2.3823229162618909e-02 0.0000000000000000e+00 +2.1420000000000000e+03 7.3600000000000000e+02 7.4600000000000000e+02 1.7679289206275525e-02 0.0000000000000000e+00 +2.1430000000000000e+03 7.3600000000000000e+02 7.7200000000000000e+02 1.7185177120766778e-02 0.0000000000000000e+00 +2.1440000000000000e+03 7.3600000000000000e+02 7.7400000000000000e+02 2.5539068842790155e-02 0.0000000000000000e+00 +2.1450000000000000e+03 7.3600000000000000e+02 7.7800000000000000e+02 1.8686530174799501e-02 0.0000000000000000e+00 +2.1460000000000000e+03 7.3700000000000000e+02 7.4200000000000000e+02 1.8040844288273544e-02 0.0000000000000000e+00 +2.1470000000000000e+03 7.3700000000000000e+02 7.9100000000000000e+02 2.0747795358470836e-02 0.0000000000000000e+00 +2.1480000000000000e+03 7.3700000000000000e+02 8.0700000000000000e+02 2.1454691904952829e-02 0.0000000000000000e+00 +2.1490000000000000e+03 7.3900000000000000e+02 7.8500000000000000e+02 2.4853724292553024e-02 0.0000000000000000e+00 +2.1500000000000000e+03 7.3900000000000000e+02 7.9500000000000000e+02 2.3535137462657174e-02 0.0000000000000000e+00 +2.1510000000000000e+03 7.3900000000000000e+02 8.2100000000000000e+02 2.4772696050951309e-02 0.0000000000000000e+00 +2.1520000000000000e+03 7.4000000000000000e+02 7.7100000000000000e+02 2.2752886260945994e-02 0.0000000000000000e+00 +2.1530000000000000e+03 7.4000000000000000e+02 7.9700000000000000e+02 2.3234388378706668e-02 0.0000000000000000e+00 +2.1540000000000000e+03 7.4100000000000000e+02 7.5700000000000000e+02 2.2586322361983754e-02 0.0000000000000000e+00 +2.1550000000000000e+03 7.4100000000000000e+02 7.7000000000000000e+02 1.8118920339185256e-02 0.0000000000000000e+00 +2.1560000000000000e+03 7.4200000000000000e+02 7.8100000000000000e+02 2.2471583349963669e-02 0.0000000000000000e+00 +2.1570000000000000e+03 7.4200000000000000e+02 8.0700000000000000e+02 2.1064132029713960e-02 0.0000000000000000e+00 +2.1580000000000000e+03 7.4300000000000000e+02 7.6800000000000000e+02 2.3283101031445350e-02 0.0000000000000000e+00 +2.1590000000000000e+03 7.4300000000000000e+02 7.8200000000000000e+02 2.0071511978499955e-02 0.0000000000000000e+00 +2.1600000000000000e+03 7.4400000000000000e+02 7.8300000000000000e+02 2.2467893977850973e-02 0.0000000000000000e+00 +2.1610000000000000e+03 7.4400000000000000e+02 7.9600000000000000e+02 1.9819193857543757e-02 0.0000000000000000e+00 +2.1620000000000000e+03 7.4400000000000000e+02 8.2400000000000000e+02 2.2134990586896816e-02 0.0000000000000000e+00 +2.1630000000000000e+03 7.4500000000000000e+02 7.6600000000000000e+02 2.2225322945784550e-02 0.0000000000000000e+00 +2.1640000000000000e+03 7.4500000000000000e+02 7.8500000000000000e+02 2.5298445620632954e-02 0.0000000000000000e+00 +2.1650000000000000e+03 7.4500000000000000e+02 8.2600000000000000e+02 2.7912305125157778e-02 0.0000000000000000e+00 +2.1660000000000000e+03 7.4600000000000000e+02 7.7000000000000000e+02 1.7938565661585710e-02 0.0000000000000000e+00 +2.1670000000000000e+03 7.4600000000000000e+02 7.7400000000000000e+02 2.2880815918209774e-02 0.0000000000000000e+00 +2.1680000000000000e+03 7.4600000000000000e+02 8.0600000000000000e+02 1.9857343095962088e-02 0.0000000000000000e+00 +2.1690000000000000e+03 7.4700000000000000e+02 7.8600000000000000e+02 1.8620768813355736e-02 0.0000000000000000e+00 +2.1700000000000000e+03 7.4700000000000000e+02 7.9800000000000000e+02 2.2493821361099672e-02 0.0000000000000000e+00 +2.1710000000000000e+03 7.4700000000000000e+02 8.2800000000000000e+02 1.8576737973192706e-02 0.0000000000000000e+00 +2.1720000000000000e+03 7.4800000000000000e+02 8.0300000000000000e+02 2.3684722245060380e-02 0.0000000000000000e+00 +2.1730000000000000e+03 7.4800000000000000e+02 8.0800000000000000e+02 2.1358182000097328e-02 0.0000000000000000e+00 +2.1740000000000000e+03 7.4800000000000000e+02 8.0900000000000000e+02 2.1864378574567266e-02 0.0000000000000000e+00 +2.1750000000000000e+03 7.4900000000000000e+02 7.8100000000000000e+02 1.8332906193298408e-02 0.0000000000000000e+00 +2.1760000000000000e+03 7.4900000000000000e+02 7.8700000000000000e+02 2.3275736574123729e-02 0.0000000000000000e+00 +2.1770000000000000e+03 7.4900000000000000e+02 8.1200000000000000e+02 2.2427087018628770e-02 0.0000000000000000e+00 +2.1780000000000000e+03 7.5000000000000000e+02 7.6100000000000000e+02 2.0888142929666727e-02 0.0000000000000000e+00 +2.1790000000000000e+03 7.5000000000000000e+02 7.8800000000000000e+02 2.2272062659349799e-02 0.0000000000000000e+00 +2.1800000000000000e+03 7.5000000000000000e+02 8.0000000000000000e+02 2.2546437308182454e-02 0.0000000000000000e+00 +2.1810000000000000e+03 7.5100000000000000e+02 7.8400000000000000e+02 2.0446550867811043e-02 0.0000000000000000e+00 +2.1820000000000000e+03 7.5100000000000000e+02 7.8900000000000000e+02 2.0991672654357536e-02 0.0000000000000000e+00 +2.1830000000000000e+03 7.5100000000000000e+02 8.3200000000000000e+02 1.8002084001927935e-02 0.0000000000000000e+00 +2.1840000000000000e+03 7.5200000000000000e+02 7.7500000000000000e+02 1.8340464804319154e-02 0.0000000000000000e+00 +2.1850000000000000e+03 7.5200000000000000e+02 7.9000000000000000e+02 2.1931128006216109e-02 0.0000000000000000e+00 +2.1860000000000000e+03 7.5200000000000000e+02 8.2700000000000000e+02 2.1280823539101858e-02 0.0000000000000000e+00 +2.1870000000000000e+03 7.5300000000000000e+02 7.6900000000000000e+02 2.1761525983719984e-02 0.0000000000000000e+00 +2.1880000000000000e+03 7.5400000000000000e+02 7.6400000000000000e+02 2.3906534324107807e-02 0.0000000000000000e+00 +2.1890000000000000e+03 7.5400000000000000e+02 7.9600000000000000e+02 2.3191238542656416e-02 0.0000000000000000e+00 +2.1900000000000000e+03 7.5500000000000000e+02 7.5700000000000000e+02 2.2298679156836025e-02 0.0000000000000000e+00 +2.1910000000000000e+03 7.5600000000000000e+02 7.9100000000000000e+02 1.6330349740688394e-02 0.0000000000000000e+00 +2.1920000000000000e+03 7.5600000000000000e+02 7.9200000000000000e+02 1.7605289826822395e-02 0.0000000000000000e+00 +2.1930000000000000e+03 7.5600000000000000e+02 8.1000000000000000e+02 2.7460141534752527e-02 0.0000000000000000e+00 +2.1940000000000000e+03 7.5700000000000000e+02 7.7000000000000000e+02 2.5151148435916867e-02 0.0000000000000000e+00 +2.1950000000000000e+03 7.5700000000000000e+02 8.0600000000000000e+02 1.9137441962795539e-02 0.0000000000000000e+00 +2.1960000000000000e+03 7.5800000000000000e+02 7.6700000000000000e+02 2.6879872656392235e-02 0.0000000000000000e+00 +2.1970000000000000e+03 7.5800000000000000e+02 7.7300000000000000e+02 2.1388172837519592e-02 0.0000000000000000e+00 +2.1980000000000000e+03 7.5800000000000000e+02 8.0300000000000000e+02 2.2346532306801944e-02 0.0000000000000000e+00 +2.1990000000000000e+03 7.5800000000000000e+02 8.0900000000000000e+02 2.3833250409325948e-02 0.0000000000000000e+00 +2.2000000000000000e+03 7.5900000000000000e+02 7.6900000000000000e+02 2.4851383130583458e-02 0.0000000000000000e+00 +2.2010000000000000e+03 7.5900000000000000e+02 7.7300000000000000e+02 2.2564890322192204e-02 0.0000000000000000e+00 +2.2020000000000000e+03 7.5900000000000000e+02 8.0900000000000000e+02 2.5655355078481018e-02 0.0000000000000000e+00 +2.2030000000000000e+03 7.6000000000000000e+02 7.7600000000000000e+02 2.1951757328999823e-02 0.0000000000000000e+00 +2.2040000000000000e+03 7.6000000000000000e+02 7.9900000000000000e+02 2.2451480238601856e-02 0.0000000000000000e+00 +2.2050000000000000e+03 7.6000000000000000e+02 8.0400000000000000e+02 1.9954610367544010e-02 0.0000000000000000e+00 +2.2060000000000000e+03 7.6100000000000000e+02 7.7700000000000000e+02 2.2967143604557816e-02 0.0000000000000000e+00 +2.2070000000000000e+03 7.6100000000000000e+02 8.0000000000000000e+02 2.2775233128264301e-02 0.0000000000000000e+00 +2.2080000000000000e+03 7.6200000000000000e+02 7.6700000000000000e+02 2.9577472872150491e-02 0.0000000000000000e+00 +2.2090000000000000e+03 7.6200000000000000e+02 7.9500000000000000e+02 2.5348886558995701e-02 0.0000000000000000e+00 +2.2100000000000000e+03 7.6200000000000000e+02 8.0100000000000000e+02 2.2116495466760706e-02 0.0000000000000000e+00 +2.2110000000000000e+03 7.6200000000000000e+02 8.3100000000000000e+02 2.4336702451557665e-02 0.0000000000000000e+00 +2.2120000000000000e+03 7.6300000000000000e+02 8.1300000000000000e+02 2.0760032582981595e-02 0.0000000000000000e+00 +2.2130000000000000e+03 7.6300000000000000e+02 8.1600000000000000e+02 2.1406100399361590e-02 0.0000000000000000e+00 +2.2140000000000000e+03 7.6400000000000000e+02 7.8000000000000000e+02 2.2581818481475235e-02 0.0000000000000000e+00 +2.2150000000000000e+03 7.6400000000000000e+02 7.9600000000000000e+02 2.1376508538151658e-02 0.0000000000000000e+00 +2.2160000000000000e+03 7.6400000000000000e+02 8.0200000000000000e+02 2.2250002741279310e-02 0.0000000000000000e+00 +2.2170000000000000e+03 7.6500000000000000e+02 7.7900000000000000e+02 2.0018935626340190e-02 0.0000000000000000e+00 +2.2180000000000000e+03 7.6500000000000000e+02 7.8700000000000000e+02 2.0530677875644079e-02 0.0000000000000000e+00 +2.2190000000000000e+03 7.6500000000000000e+02 8.2000000000000000e+02 2.5500198281767274e-02 0.0000000000000000e+00 +2.2200000000000000e+03 7.6500000000000000e+02 8.2200000000000000e+02 2.2966404269019747e-02 0.0000000000000000e+00 +2.2210000000000000e+03 7.6600000000000000e+02 8.0400000000000000e+02 2.0429532737207951e-02 0.0000000000000000e+00 +2.2220000000000000e+03 7.6600000000000000e+02 8.2600000000000000e+02 2.7001934520771455e-02 0.0000000000000000e+00 +2.2230000000000000e+03 7.6700000000000000e+02 8.0100000000000000e+02 2.6828763491500887e-02 0.0000000000000000e+00 +2.2240000000000000e+03 7.6700000000000000e+02 8.0300000000000000e+02 2.7725588049880373e-02 0.0000000000000000e+00 +2.2250000000000000e+03 7.6700000000000000e+02 8.1800000000000000e+02 2.5447605864536087e-02 0.0000000000000000e+00 +2.2260000000000000e+03 7.6800000000000000e+02 7.8200000000000000e+02 1.8344119051450006e-02 0.0000000000000000e+00 +2.2270000000000000e+03 7.6800000000000000e+02 7.9000000000000000e+02 1.7690389730889482e-02 0.0000000000000000e+00 +2.2280000000000000e+03 7.6800000000000000e+02 8.1000000000000000e+02 2.7626232683317781e-02 0.0000000000000000e+00 +2.2290000000000000e+03 7.6800000000000000e+02 8.1700000000000000e+02 1.9160045208780365e-02 0.0000000000000000e+00 +2.2300000000000000e+03 7.7000000000000000e+02 8.0600000000000000e+02 1.8266431633877842e-02 0.0000000000000000e+00 +2.2310000000000000e+03 7.7100000000000000e+02 7.7900000000000000e+02 2.4341578857059239e-02 0.0000000000000000e+00 +2.2320000000000000e+03 7.7100000000000000e+02 7.9700000000000000e+02 2.2248998311029958e-02 0.0000000000000000e+00 +2.2330000000000000e+03 7.7100000000000000e+02 8.0500000000000000e+02 2.4180559330538101e-02 0.0000000000000000e+00 +2.2340000000000000e+03 7.7200000000000000e+02 7.7800000000000000e+02 2.1139605386323021e-02 0.0000000000000000e+00 +2.2350000000000000e+03 7.7200000000000000e+02 7.9400000000000000e+02 1.8390385080310150e-02 0.0000000000000000e+00 +2.2360000000000000e+03 7.7300000000000000e+02 8.0900000000000000e+02 1.9250288055355353e-02 0.0000000000000000e+00 +2.2370000000000000e+03 7.7400000000000000e+02 7.7800000000000000e+02 1.9005860720920396e-02 0.0000000000000000e+00 +2.2380000000000000e+03 7.7400000000000000e+02 7.9300000000000000e+02 1.9550036932767380e-02 0.0000000000000000e+00 +2.2390000000000000e+03 7.7400000000000000e+02 8.0600000000000000e+02 1.7450859630664183e-02 0.0000000000000000e+00 +2.2400000000000000e+03 7.7500000000000000e+02 8.1300000000000000e+02 1.8015283785710205e-02 0.0000000000000000e+00 +2.2410000000000000e+03 7.7500000000000000e+02 8.2700000000000000e+02 2.1487855292114194e-02 0.0000000000000000e+00 +2.2420000000000000e+03 7.7500000000000000e+02 8.4200000000000000e+02 2.2386268327541113e-02 0.0000000000000000e+00 +2.2430000000000000e+03 7.7600000000000000e+02 7.9700000000000000e+02 2.0971980669873706e-02 0.0000000000000000e+00 +2.2440000000000000e+03 7.7600000000000000e+02 7.9900000000000000e+02 2.1553426027423616e-02 0.0000000000000000e+00 +2.2450000000000000e+03 7.7600000000000000e+02 8.1900000000000000e+02 2.2465655936083503e-02 0.0000000000000000e+00 +2.2460000000000000e+03 7.7600000000000000e+02 8.2300000000000000e+02 2.2540665086098147e-02 0.0000000000000000e+00 +2.2470000000000000e+03 7.7700000000000000e+02 7.8900000000000000e+02 1.9452937650979440e-02 0.0000000000000000e+00 +2.2480000000000000e+03 7.7700000000000000e+02 8.0000000000000000e+02 2.1079986742237041e-02 0.0000000000000000e+00 +2.2490000000000000e+03 7.7700000000000000e+02 8.1100000000000000e+02 2.2811844498227700e-02 0.0000000000000000e+00 +2.2500000000000000e+03 7.7700000000000000e+02 8.3100000000000000e+02 2.3636589567775649e-02 0.0000000000000000e+00 +2.2510000000000000e+03 7.7800000000000000e+02 7.9300000000000000e+02 2.0522606993353461e-02 0.0000000000000000e+00 +2.2520000000000000e+03 7.7800000000000000e+02 7.9400000000000000e+02 1.7404407279820591e-02 0.0000000000000000e+00 +2.2530000000000000e+03 7.7800000000000000e+02 8.1500000000000000e+02 1.6172764922318221e-02 0.0000000000000000e+00 +2.2540000000000000e+03 7.7900000000000000e+02 8.0500000000000000e+02 2.2063732551458284e-02 0.0000000000000000e+00 +2.2550000000000000e+03 7.7900000000000000e+02 8.2000000000000000e+02 2.5052391968182163e-02 0.0000000000000000e+00 +2.2560000000000000e+03 7.7900000000000000e+02 8.2900000000000000e+02 2.3659947940659603e-02 0.0000000000000000e+00 +2.2570000000000000e+03 7.8000000000000000e+02 7.8800000000000000e+02 2.0581144495942276e-02 0.0000000000000000e+00 +2.2580000000000000e+03 7.8000000000000000e+02 8.0200000000000000e+02 2.1108671964730780e-02 0.0000000000000000e+00 +2.2590000000000000e+03 7.8000000000000000e+02 8.1400000000000000e+02 2.3015144817249901e-02 0.0000000000000000e+00 +2.2600000000000000e+03 7.8000000000000000e+02 8.2500000000000000e+02 2.2903417724794661e-02 0.0000000000000000e+00 +2.2610000000000000e+03 7.8100000000000000e+02 8.0700000000000000e+02 1.7472125856643112e-02 0.0000000000000000e+00 +2.2620000000000000e+03 7.8100000000000000e+02 8.1200000000000000e+02 2.1649554642912849e-02 0.0000000000000000e+00 +2.2630000000000000e+03 7.8100000000000000e+02 8.4000000000000000e+02 2.1576472997971861e-02 0.0000000000000000e+00 +2.2640000000000000e+03 7.8200000000000000e+02 7.9300000000000000e+02 1.8071680648499136e-02 0.0000000000000000e+00 +2.2650000000000000e+03 7.8200000000000000e+02 8.1500000000000000e+02 1.6497301913223784e-02 0.0000000000000000e+00 +2.2660000000000000e+03 7.8200000000000000e+02 8.1700000000000000e+02 2.0427492334935349e-02 0.0000000000000000e+00 +2.2670000000000000e+03 7.8300000000000000e+02 7.9800000000000000e+02 1.9160094317917487e-02 0.0000000000000000e+00 +2.2680000000000000e+03 7.8300000000000000e+02 8.2400000000000000e+02 2.0260424955118244e-02 0.0000000000000000e+00 +2.2690000000000000e+03 7.8300000000000000e+02 8.2900000000000000e+02 2.3200357108172535e-02 0.0000000000000000e+00 +2.2700000000000000e+03 7.8300000000000000e+02 8.3000000000000000e+02 2.2541658958387441e-02 0.0000000000000000e+00 +2.2710000000000000e+03 7.8400000000000000e+02 8.0800000000000000e+02 2.0457591212132944e-02 0.0000000000000000e+00 +2.2720000000000000e+03 7.8400000000000000e+02 8.1800000000000000e+02 2.2063894439708857e-02 0.0000000000000000e+00 +2.2730000000000000e+03 7.8400000000000000e+02 8.3200000000000000e+02 1.8094556558947261e-02 0.0000000000000000e+00 +2.2740000000000000e+03 7.8500000000000000e+02 8.2100000000000000e+02 2.3745506000477475e-02 0.0000000000000000e+00 +2.2750000000000000e+03 7.8500000000000000e+02 8.2600000000000000e+02 2.4767082637670867e-02 0.0000000000000000e+00 +2.2760000000000000e+03 7.8500000000000000e+02 8.4100000000000000e+02 2.4953994763416702e-02 0.0000000000000000e+00 +2.2770000000000000e+03 7.8600000000000000e+02 8.1600000000000000e+02 1.8184328072480743e-02 0.0000000000000000e+00 +2.2780000000000000e+03 7.8600000000000000e+02 8.2800000000000000e+02 1.8492306804711176e-02 0.0000000000000000e+00 +2.2790000000000000e+03 7.8600000000000000e+02 8.3900000000000000e+02 2.0731184572984139e-02 0.0000000000000000e+00 +2.2800000000000000e+03 7.8700000000000000e+02 8.1200000000000000e+02 1.9606790495990699e-02 0.0000000000000000e+00 +2.2810000000000000e+03 7.8700000000000000e+02 8.2200000000000000e+02 2.2382232249850715e-02 0.0000000000000000e+00 +2.2820000000000000e+03 7.8700000000000000e+02 8.3800000000000000e+02 2.2840076237048746e-02 0.0000000000000000e+00 +2.2830000000000000e+03 7.8800000000000000e+02 8.0000000000000000e+02 2.1635662617450001e-02 0.0000000000000000e+00 +2.2840000000000000e+03 7.8800000000000000e+02 8.2500000000000000e+02 2.2987782483743804e-02 0.0000000000000000e+00 +2.2850000000000000e+03 7.8800000000000000e+02 8.3600000000000000e+02 2.4585484530540248e-02 0.0000000000000000e+00 +2.2860000000000000e+03 7.8900000000000000e+02 8.0100000000000000e+02 2.2684749940602277e-02 0.0000000000000000e+00 +2.2870000000000000e+03 7.8900000000000000e+02 8.3100000000000000e+02 2.1316977273341680e-02 0.0000000000000000e+00 +2.2880000000000000e+03 7.8900000000000000e+02 8.3200000000000000e+02 1.8371852954878826e-02 0.0000000000000000e+00 +2.2890000000000000e+03 7.9000000000000000e+02 8.1000000000000000e+02 2.7208199604467048e-02 0.0000000000000000e+00 +2.2900000000000000e+03 7.9000000000000000e+02 8.2700000000000000e+02 1.8239841078637246e-02 0.0000000000000000e+00 +2.2910000000000000e+03 7.9000000000000000e+02 8.3700000000000000e+02 2.1387958290524908e-02 0.0000000000000000e+00 +2.2920000000000000e+03 7.9100000000000000e+02 8.0700000000000000e+02 1.7541440976081929e-02 0.0000000000000000e+00 +2.2930000000000000e+03 7.9100000000000000e+02 8.1000000000000000e+02 2.7243937198692406e-02 0.0000000000000000e+00 +2.2940000000000000e+03 7.9100000000000000e+02 8.3500000000000000e+02 1.8858577006030827e-02 0.0000000000000000e+00 +2.2950000000000000e+03 7.9200000000000000e+02 7.9400000000000000e+02 1.5392788417219068e-02 0.0000000000000000e+00 +2.2960000000000000e+03 7.9200000000000000e+02 8.1000000000000000e+02 1.8292101726700045e-02 0.0000000000000000e+00 +2.2970000000000000e+03 7.9200000000000000e+02 8.1700000000000000e+02 1.7292926291888926e-02 0.0000000000000000e+00 +2.2980000000000000e+03 7.9300000000000000e+02 8.1500000000000000e+02 1.6456940137113157e-02 0.0000000000000000e+00 +2.2990000000000000e+03 7.9400000000000000e+02 8.1500000000000000e+02 1.6123995474341155e-02 0.0000000000000000e+00 +2.3000000000000000e+03 7.9400000000000000e+02 8.1700000000000000e+02 1.8845021171508998e-02 0.0000000000000000e+00 +2.3010000000000000e+03 7.9500000000000000e+02 8.1100000000000000e+02 2.5260554077137152e-02 0.0000000000000000e+00 +2.3020000000000000e+03 7.9500000000000000e+02 8.2100000000000000e+02 2.3996136592923545e-02 0.0000000000000000e+00 +2.3030000000000000e+03 7.9500000000000000e+02 8.3100000000000000e+02 2.3550413016770091e-02 0.0000000000000000e+00 +2.3040000000000000e+03 7.9600000000000000e+02 8.0200000000000000e+02 2.2668994477441869e-02 0.0000000000000000e+00 +2.3050000000000000e+03 7.9600000000000000e+02 8.2400000000000000e+02 2.2216419406528746e-02 0.0000000000000000e+00 +2.3060000000000000e+03 7.9700000000000000e+02 8.0500000000000000e+02 2.4016992002724030e-02 0.0000000000000000e+00 +2.3070000000000000e+03 7.9700000000000000e+02 8.2300000000000000e+02 2.3108851212341880e-02 0.0000000000000000e+00 +2.3080000000000000e+03 7.9800000000000000e+02 8.2000000000000000e+02 2.3843461111064140e-02 0.0000000000000000e+00 +2.3090000000000000e+03 7.9800000000000000e+02 8.2800000000000000e+02 1.7462421463661011e-02 0.0000000000000000e+00 +2.3100000000000000e+03 7.9800000000000000e+02 8.2900000000000000e+02 2.1643055142509474e-02 0.0000000000000000e+00 +2.3110000000000000e+03 7.9900000000000000e+02 8.0400000000000000e+02 2.0497246186193106e-02 0.0000000000000000e+00 +2.3120000000000000e+03 7.9900000000000000e+02 8.1900000000000000e+02 2.2481837254575792e-02 0.0000000000000000e+00 +2.3130000000000000e+03 7.9900000000000000e+02 8.2600000000000000e+02 2.6027934007376494e-02 0.0000000000000000e+00 +2.3140000000000000e+03 7.9900000000000000e+02 8.3400000000000000e+02 2.2178864808960832e-02 0.0000000000000000e+00 +2.3150000000000000e+03 8.0000000000000000e+02 8.1100000000000000e+02 2.4404240519515816e-02 0.0000000000000000e+00 +2.3160000000000000e+03 8.0000000000000000e+02 8.3600000000000000e+02 2.3650037563354549e-02 0.0000000000000000e+00 +2.3170000000000000e+03 8.0100000000000000e+02 8.1800000000000000e+02 2.3700167231437249e-02 0.0000000000000000e+00 +2.3180000000000000e+03 8.0100000000000000e+02 8.3100000000000000e+02 2.1754787977940095e-02 0.0000000000000000e+00 +2.3190000000000000e+03 8.0100000000000000e+02 8.3200000000000000e+02 1.9858222098546652e-02 0.0000000000000000e+00 +2.3200000000000000e+03 8.0200000000000000e+02 8.1400000000000000e+02 2.3363627573922713e-02 0.0000000000000000e+00 +2.3210000000000000e+03 8.0200000000000000e+02 8.2400000000000000e+02 2.1041151736907848e-02 0.0000000000000000e+00 +2.3220000000000000e+03 8.0200000000000000e+02 8.3300000000000000e+02 2.3664104303232861e-02 0.0000000000000000e+00 +2.3230000000000000e+03 8.0300000000000000e+02 8.0800000000000000e+02 2.1866907818990200e-02 0.0000000000000000e+00 +2.3240000000000000e+03 8.0300000000000000e+02 8.0900000000000000e+02 2.3647886194090639e-02 0.0000000000000000e+00 +2.3250000000000000e+03 8.0300000000000000e+02 8.1800000000000000e+02 2.1099585287626867e-02 0.0000000000000000e+00 +2.3260000000000000e+03 8.0400000000000000e+02 8.2600000000000000e+02 2.1473107093054018e-02 0.0000000000000000e+00 +2.3270000000000000e+03 8.0500000000000000e+02 8.2300000000000000e+02 2.2083728047794446e-02 0.0000000000000000e+00 +2.3280000000000000e+03 8.0500000000000000e+02 8.2900000000000000e+02 2.3102898417938004e-02 0.0000000000000000e+00 +2.3290000000000000e+03 8.0500000000000000e+02 8.3000000000000000e+02 2.3122586235835445e-02 0.0000000000000000e+00 +2.3300000000000000e+03 8.0700000000000000e+02 8.3500000000000000e+02 1.9317258374686688e-02 0.0000000000000000e+00 +2.3310000000000000e+03 8.0700000000000000e+02 8.4000000000000000e+02 2.1029360336670914e-02 0.0000000000000000e+00 +2.3320000000000000e+03 8.0800000000000000e+02 8.1800000000000000e+02 2.2123578014909728e-02 0.0000000000000000e+00 +2.3330000000000000e+03 8.1000000000000000e+02 8.1700000000000000e+02 1.9993370943833352e-02 0.0000000000000000e+00 +2.3340000000000000e+03 8.1000000000000000e+02 8.3500000000000000e+02 1.8632707074988722e-02 0.0000000000000000e+00 +2.3350000000000000e+03 8.1000000000000000e+02 8.3700000000000000e+02 2.1012302833308450e-02 0.0000000000000000e+00 +2.3360000000000000e+03 8.1100000000000000e+02 8.2100000000000000e+02 2.3703764899197986e-02 0.0000000000000000e+00 +2.3370000000000000e+03 8.1100000000000000e+02 8.3100000000000000e+02 2.2894379249685161e-02 0.0000000000000000e+00 +2.3380000000000000e+03 8.1100000000000000e+02 8.3600000000000000e+02 2.2693231038304531e-02 0.0000000000000000e+00 +2.3390000000000000e+03 8.1200000000000000e+02 8.3800000000000000e+02 2.1243049853172012e-02 0.0000000000000000e+00 +2.3400000000000000e+03 8.1200000000000000e+02 8.4000000000000000e+02 1.7868145400753273e-02 0.0000000000000000e+00 +2.3410000000000000e+03 8.1200000000000000e+02 8.4400000000000000e+02 2.2017778688391436e-02 0.0000000000000000e+00 +2.3420000000000000e+03 8.1300000000000000e+02 8.1600000000000000e+02 1.8238227475827883e-02 0.0000000000000000e+00 +2.3430000000000000e+03 8.1300000000000000e+02 8.4200000000000000e+02 2.1223732152489922e-02 0.0000000000000000e+00 +2.3440000000000000e+03 8.1300000000000000e+02 8.4300000000000000e+02 2.1967049884182563e-02 0.0000000000000000e+00 +2.3450000000000000e+03 8.1400000000000000e+02 8.1900000000000000e+02 2.3577093221425476e-02 0.0000000000000000e+00 +2.3460000000000000e+03 8.1400000000000000e+02 8.2500000000000000e+02 2.1489306817711676e-02 0.0000000000000000e+00 +2.3470000000000000e+03 8.1400000000000000e+02 8.3300000000000000e+02 2.1389621637022068e-02 0.0000000000000000e+00 +2.3480000000000000e+03 8.1400000000000000e+02 8.3400000000000000e+02 2.5228466872910568e-02 0.0000000000000000e+00 +2.3490000000000000e+03 8.1500000000000000e+02 8.1700000000000000e+02 1.5884456157857146e-02 0.0000000000000000e+00 +2.3500000000000000e+03 8.1600000000000000e+02 8.3900000000000000e+02 2.1857735000183880e-02 0.0000000000000000e+00 +2.3510000000000000e+03 8.1600000000000000e+02 8.4300000000000000e+02 2.1255985507253498e-02 0.0000000000000000e+00 +2.3520000000000000e+03 8.1800000000000000e+02 8.3200000000000000e+02 1.9054130726776659e-02 0.0000000000000000e+00 +2.3530000000000000e+03 8.1900000000000000e+02 8.2300000000000000e+02 2.1369284706806917e-02 0.0000000000000000e+00 +2.3540000000000000e+03 8.1900000000000000e+02 8.3300000000000000e+02 2.3630166579453139e-02 0.0000000000000000e+00 +2.3550000000000000e+03 8.1900000000000000e+02 8.3400000000000000e+02 2.2034868705551762e-02 0.0000000000000000e+00 +2.3560000000000000e+03 8.2000000000000000e+02 8.2200000000000000e+02 2.1764271972116358e-02 0.0000000000000000e+00 +2.3570000000000000e+03 8.2000000000000000e+02 8.2800000000000000e+02 2.2324417927396374e-02 0.0000000000000000e+00 +2.3580000000000000e+03 8.2000000000000000e+02 8.2900000000000000e+02 2.2572881787643575e-02 0.0000000000000000e+00 +2.3590000000000000e+03 8.2000000000000000e+02 8.3900000000000000e+02 2.4837483661429773e-02 0.0000000000000000e+00 +2.3600000000000000e+03 8.2100000000000000e+02 8.3600000000000000e+02 2.5879577191909017e-02 0.0000000000000000e+00 +2.3610000000000000e+03 8.2100000000000000e+02 8.4100000000000000e+02 2.4316172669447245e-02 0.0000000000000000e+00 +2.3620000000000000e+03 8.2200000000000000e+02 8.3800000000000000e+02 2.0943301537474646e-02 0.0000000000000000e+00 +2.3630000000000000e+03 8.2200000000000000e+02 8.3900000000000000e+02 2.2056314710538972e-02 0.0000000000000000e+00 +2.3640000000000000e+03 8.2200000000000000e+02 8.4300000000000000e+02 2.4493766714509875e-02 0.0000000000000000e+00 +2.3650000000000000e+03 8.2300000000000000e+02 8.3000000000000000e+02 2.3582911244581690e-02 0.0000000000000000e+00 +2.3660000000000000e+03 8.2300000000000000e+02 8.3300000000000000e+02 2.2638512353014967e-02 0.0000000000000000e+00 +2.3670000000000000e+03 8.2400000000000000e+02 8.3000000000000000e+02 2.2975488182743090e-02 0.0000000000000000e+00 +2.3680000000000000e+03 8.2400000000000000e+02 8.3300000000000000e+02 2.3568576143648545e-02 0.0000000000000000e+00 +2.3690000000000000e+03 8.2500000000000000e+02 8.3400000000000000e+02 2.4832221167996545e-02 0.0000000000000000e+00 +2.3700000000000000e+03 8.2500000000000000e+02 8.3600000000000000e+02 2.1959145859753490e-02 0.0000000000000000e+00 +2.3710000000000000e+03 8.2500000000000000e+02 8.4100000000000000e+02 2.6951992247458905e-02 0.0000000000000000e+00 +2.3720000000000000e+03 8.2600000000000000e+02 8.3400000000000000e+02 2.8250462673001790e-02 0.0000000000000000e+00 +2.3730000000000000e+03 8.2600000000000000e+02 8.4100000000000000e+02 2.5521908306362841e-02 0.0000000000000000e+00 +2.3740000000000000e+03 8.2700000000000000e+02 8.3700000000000000e+02 2.1866168304591239e-02 0.0000000000000000e+00 +2.3750000000000000e+03 8.2700000000000000e+02 8.4200000000000000e+02 1.8947102384800057e-02 0.0000000000000000e+00 +2.3760000000000000e+03 8.2700000000000000e+02 8.4400000000000000e+02 2.2222003618012024e-02 0.0000000000000000e+00 +2.3770000000000000e+03 8.2800000000000000e+02 8.3900000000000000e+02 1.6578296940375922e-02 0.0000000000000000e+00 +2.3780000000000000e+03 8.2900000000000000e+02 8.3000000000000000e+02 2.1604473956413271e-02 0.0000000000000000e+00 +2.3790000000000000e+03 8.3000000000000000e+02 8.3300000000000000e+02 2.1026601396588743e-02 0.0000000000000000e+00 +2.3800000000000000e+03 8.3400000000000000e+02 8.4100000000000000e+02 2.2669883853304259e-02 0.0000000000000000e+00 +2.3810000000000000e+03 8.3500000000000000e+02 8.3700000000000000e+02 1.8926959474360620e-02 0.0000000000000000e+00 +2.3820000000000000e+03 8.3500000000000000e+02 8.4000000000000000e+02 1.6177535134458399e-02 0.0000000000000000e+00 +2.3830000000000000e+03 8.3600000000000000e+02 8.4100000000000000e+02 2.5125977789540632e-02 0.0000000000000000e+00 +2.3840000000000000e+03 8.3700000000000000e+02 8.4000000000000000e+02 2.0757288700488857e-02 0.0000000000000000e+00 +2.3850000000000000e+03 8.3700000000000000e+02 8.4400000000000000e+02 1.8829038885862778e-02 0.0000000000000000e+00 +2.3860000000000000e+03 8.3800000000000000e+02 8.4200000000000000e+02 2.2375601487009480e-02 0.0000000000000000e+00 +2.3870000000000000e+03 8.3800000000000000e+02 8.4300000000000000e+02 2.1652623151587166e-02 0.0000000000000000e+00 +2.3880000000000000e+03 8.3800000000000000e+02 8.4400000000000000e+02 1.8540235470147989e-02 0.0000000000000000e+00 +2.3890000000000000e+03 8.3900000000000000e+02 8.4300000000000000e+02 1.9020920615656193e-02 0.0000000000000000e+00 +2.3900000000000000e+03 8.4000000000000000e+02 8.4400000000000000e+02 2.0289585078795278e-02 0.0000000000000000e+00 +2.3910000000000000e+03 8.4200000000000000e+02 8.4300000000000000e+02 1.7809357616492574e-02 0.0000000000000000e+00 +2.3920000000000000e+03 8.4200000000000000e+02 8.4400000000000000e+02 2.1134918521104492e-02 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/mesh_triangle_elements1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/mesh_triangle_elements1.dat new file mode 100644 index 0000000..681cb5d --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/mesh_triangle_elements1.dat @@ -0,0 +1,1574 @@ +113 203 56 57 113 +114 203 55 58 114 +115 203 54 59 115 +116 203 53 60 116 +117 203 52 61 117 +118 203 51 62 118 +119 203 50 63 119 +120 203 49 64 120 +121 203 65 48 121 +122 203 66 67 122 +123 203 47 68 123 +124 203 69 46 124 +125 203 70 45 125 +126 203 71 72 126 +127 203 44 73 127 +128 203 74 43 128 +129 203 75 76 129 +130 203 42 77 130 +131 203 77 41 131 +132 203 41 78 132 +133 203 78 40 133 +134 203 79 39 134 +135 203 80 38 135 +136 203 81 37 136 +137 203 82 36 137 +138 203 83 35 138 +139 203 35 84 138 +140 203 84 34 139 +141 203 34 85 139 +142 203 85 33 140 +143 203 33 86 140 +144 203 86 32 141 +145 203 87 31 142 +146 203 88 30 143 +147 203 89 29 144 +148 203 90 28 145 +149 203 91 27 146 +150 203 92 26 147 +151 203 93 25 148 +152 203 94 24 149 +153 203 95 23 150 +154 203 23 96 151 +155 203 96 22 152 +156 203 151 96 152 +157 203 22 21 152 +158 203 21 20 153 +159 203 97 19 154 +160 203 98 18 155 +161 203 18 99 155 +162 203 99 17 156 +163 203 17 100 156 +164 203 100 16 157 +165 203 16 101 158 +166 203 101 15 159 +167 203 158 101 159 +168 203 15 102 159 +169 203 102 14 160 +170 203 14 13 161 +171 203 12 103 162 +172 203 11 104 163 +173 203 10 105 164 +174 203 105 9 165 +175 203 106 8 166 +176 203 107 7 167 +177 203 7 6 168 +178 203 6 108 169 +179 203 5 109 170 +180 203 109 4 171 +181 203 170 109 171 +182 203 4 110 171 +183 203 110 3 172 +184 203 111 2 173 +185 203 112 1 174 +186 203 57 55 175 +187 203 58 54 176 +188 203 59 53 177 +189 203 60 52 178 +190 203 116 60 178 +191 203 52 117 178 +192 203 61 51 179 +193 203 50 119 180 +194 203 62 50 180 +195 203 63 49 181 +196 203 64 65 182 +197 203 48 66 183 +198 203 67 47 184 +199 203 122 67 184 +200 203 47 123 184 +201 203 68 69 185 +202 203 70 125 186 +203 203 46 70 186 +204 203 45 71 187 +205 203 72 44 188 +206 203 73 74 189 +207 203 43 75 190 +208 203 76 42 191 +209 203 77 131 130 +210 203 41 132 131 +211 203 78 133 132 +212 203 40 79 192 +213 203 39 80 193 +214 203 38 81 194 +215 203 37 82 195 +216 203 36 83 196 +217 203 138 84 139 +218 203 85 140 139 +219 203 86 141 140 +220 203 32 87 197 +221 203 31 88 198 +222 203 30 89 199 +223 203 29 90 200 +224 203 28 91 201 +225 203 27 92 202 +226 203 146 27 202 +227 203 92 147 202 +228 203 26 93 203 +229 203 25 94 204 +230 203 24 95 205 +231 203 23 151 206 +232 203 154 19 207 +233 203 19 98 207 +234 203 21 153 152 +235 203 20 97 208 +236 203 98 155 207 +237 203 155 99 156 +238 203 100 157 156 +239 203 157 16 209 +240 203 16 158 209 +241 203 102 160 159 +242 203 14 161 160 +243 203 12 162 210 +244 203 13 12 210 +245 203 11 163 211 +246 203 103 11 211 +247 203 104 10 212 +248 203 105 165 164 +249 203 106 166 213 +250 203 9 106 213 +251 203 8 107 214 +252 203 7 168 167 +253 203 6 169 168 +254 203 108 5 215 +255 203 110 172 171 +256 203 3 111 216 +257 203 172 3 216 +258 203 111 173 216 +259 203 2 112 217 +260 203 57 175 113 +261 203 1 56 113 +262 203 1 113 174 +263 203 114 58 176 +264 203 115 59 177 +265 203 179 51 118 +266 203 117 61 179 +267 203 118 62 180 +268 203 119 63 181 +269 203 120 64 182 +270 203 121 48 183 +271 203 185 69 124 +272 203 123 68 185 +273 203 124 46 186 +274 203 125 45 187 +275 203 126 72 188 +276 203 127 73 189 +277 203 128 43 190 +278 203 129 76 191 +279 203 40 192 133 +280 203 134 39 193 +281 203 135 38 194 +282 203 136 37 195 +283 203 137 36 196 +284 203 142 31 198 +285 203 143 30 199 +286 203 144 29 200 +287 203 145 28 201 +288 203 203 93 148 +289 203 147 26 203 +290 203 148 25 204 +291 203 149 24 205 +292 203 150 23 206 +293 203 153 20 208 +294 203 104 212 163 +295 203 162 103 211 +296 203 8 214 166 +297 203 165 9 213 +298 203 108 215 169 +299 203 217 112 174 +300 203 175 55 114 +301 203 176 54 115 +302 203 177 53 116 +303 203 182 65 121 +304 203 183 66 122 +305 203 188 44 127 +306 203 189 74 128 +307 203 190 75 129 +308 203 191 42 130 +309 203 195 82 137 +310 203 196 83 138 +311 203 200 90 145 +312 203 201 91 146 +313 203 205 95 150 +314 203 181 49 120 +315 203 187 71 126 +316 203 194 81 136 +317 203 193 80 135 +318 203 192 79 134 +319 203 199 89 144 +320 203 198 88 143 +321 203 197 87 142 +322 203 32 197 141 +323 203 204 94 149 +324 203 208 97 154 +325 203 13 210 161 +326 203 212 10 164 +327 203 214 107 167 +328 203 215 5 170 +329 203 2 217 173 +330 203 176 115 218 +331 203 177 116 219 +332 203 179 118 220 +333 203 182 121 221 +334 203 180 119 222 +335 203 117 179 223 +336 203 179 220 223 +337 203 120 182 224 +338 203 182 221 224 +339 203 187 126 225 +340 203 183 122 226 +341 203 185 124 227 +342 203 188 127 228 +343 203 186 125 229 +344 203 123 185 230 +345 203 185 227 230 +346 203 126 188 231 +347 203 225 126 231 +348 203 188 228 231 +349 203 125 187 232 +350 203 229 125 232 +351 203 187 225 232 +352 203 194 136 233 +353 203 189 128 234 +354 203 190 129 235 +355 203 191 130 236 +356 203 133 192 237 +357 203 195 137 238 +358 203 199 144 239 +359 203 135 194 240 +360 203 194 233 240 +361 203 136 195 241 +362 203 195 238 241 +363 203 193 135 242 +364 203 135 240 242 +365 203 196 138 243 +366 203 142 198 244 +367 203 200 145 245 +368 203 140 141 246 +369 203 204 149 247 +370 203 143 199 248 +371 203 199 239 248 +372 203 197 142 249 +373 203 142 244 249 +374 203 144 200 250 +375 203 200 245 250 +376 203 198 143 251 +377 203 244 198 251 +378 203 143 248 251 +379 203 201 146 252 +380 203 203 148 253 +381 203 205 150 254 +382 203 148 204 255 +383 203 204 247 255 +384 203 147 203 256 +385 203 203 253 256 +386 203 149 205 257 +387 203 205 254 257 +388 203 208 154 258 +389 203 150 206 259 +390 203 181 120 260 +391 203 120 224 260 +392 203 153 208 261 +393 203 208 258 261 +394 203 151 152 262 +395 203 161 210 263 +396 203 207 155 264 +397 203 159 160 265 +398 203 158 159 265 +399 203 212 164 266 +400 203 210 162 267 +401 203 211 163 268 +402 203 166 214 269 +403 203 214 167 269 +404 203 213 166 270 +405 203 166 269 270 +406 203 169 215 271 +407 203 167 168 272 +408 203 173 217 273 +409 203 171 172 274 +410 203 170 171 274 +411 203 175 114 275 +412 203 113 175 276 +413 203 174 113 276 +414 203 175 275 276 +415 203 131 132 277 +416 203 132 133 278 +417 203 277 132 278 +418 203 133 237 278 +419 203 134 193 279 +420 203 193 242 279 +421 203 139 140 280 +422 203 140 246 280 +423 203 163 212 281 +424 203 268 163 281 +425 203 212 266 281 +426 203 156 157 282 +427 203 160 161 283 +428 203 161 263 283 +429 203 162 211 284 +430 203 267 162 284 +431 203 211 268 284 +432 203 165 213 285 +433 203 213 270 285 +434 203 168 169 286 +435 203 169 271 286 +436 203 217 174 276 +437 203 114 176 287 +438 203 275 114 287 +439 203 176 218 287 +440 203 206 151 288 +441 203 155 156 289 +442 203 264 155 289 +443 203 156 282 289 +444 203 115 177 290 +445 203 136 241 233 +446 203 180 222 291 +447 203 118 180 291 +448 203 119 181 292 +449 203 121 183 293 +450 203 186 229 294 +451 203 124 186 294 +452 203 234 128 295 +453 203 128 190 295 +454 203 239 144 250 +455 203 127 189 296 +456 203 190 235 295 +457 203 129 191 297 +458 203 130 131 298 +459 203 236 130 298 +460 203 131 277 298 +461 203 238 137 299 +462 203 137 196 299 +463 203 299 196 243 +464 203 192 134 300 +465 203 127 296 228 +466 203 138 139 301 +467 203 119 292 222 +468 203 138 301 243 +469 203 227 124 294 +470 203 141 197 302 +471 203 253 148 255 +472 203 145 201 303 +473 203 149 257 247 +474 203 151 262 288 +475 203 145 303 245 +476 203 226 122 304 +477 203 122 184 304 +478 203 258 154 305 +479 203 154 207 305 +480 203 150 259 254 +481 203 181 260 292 +482 203 207 264 305 +483 203 115 290 218 +484 203 152 153 306 +485 203 209 158 307 +486 203 158 265 307 +487 203 266 164 285 +488 203 210 267 263 +489 203 165 285 164 +490 203 217 276 273 +491 203 269 167 308 +492 203 167 272 308 +493 203 221 121 293 +494 203 271 215 309 +495 203 215 170 309 +496 203 220 118 291 +497 203 219 116 310 +498 203 116 178 310 +499 203 206 288 311 +500 203 216 173 312 +501 203 173 273 312 +502 203 152 306 262 +503 203 160 283 265 +504 203 274 172 313 +505 203 272 168 286 +506 203 172 216 313 +507 203 282 157 314 +508 203 157 209 314 +509 203 178 117 315 +510 203 310 178 315 +511 203 117 223 315 +512 203 290 177 219 +513 203 184 123 316 +514 203 304 184 316 +515 203 123 230 316 +516 203 259 206 311 +517 203 246 141 302 +518 203 202 147 317 +519 203 147 256 317 +520 203 293 183 226 +521 203 129 297 235 +522 203 296 189 234 +523 203 297 191 236 +524 203 300 134 279 +525 203 192 300 237 +526 203 301 139 280 +527 203 302 197 249 +528 203 303 201 252 +529 203 306 153 261 +530 203 233 241 318 +531 203 291 222 319 +532 203 246 302 320 +533 203 305 264 321 +534 203 290 219 322 +535 203 224 221 323 +536 203 271 309 324 +537 203 240 233 325 +538 203 233 318 325 +539 203 235 297 326 +540 203 234 295 327 +541 203 258 305 328 +542 203 305 321 328 +543 203 259 311 329 +544 203 296 234 330 +545 203 234 327 330 +546 203 295 235 331 +547 203 327 295 331 +548 203 235 326 331 +549 203 239 250 332 +550 203 300 279 333 +551 203 237 300 334 +552 203 300 333 334 +553 203 303 252 335 +554 203 301 280 336 +555 203 241 238 337 +556 203 318 241 337 +557 203 238 299 337 +558 203 228 296 338 +559 203 296 330 338 +560 203 242 240 339 +561 203 240 325 339 +562 203 227 294 340 +563 203 230 227 341 +564 203 227 340 341 +565 203 293 226 342 +566 203 306 261 343 +567 203 253 255 344 +568 203 249 244 345 +569 203 247 257 346 +570 203 146 202 347 +571 203 256 253 348 +572 203 253 344 348 +573 203 218 290 349 +574 203 290 322 349 +575 203 261 258 350 +576 203 343 261 350 +577 203 258 328 350 +578 203 265 283 351 +579 203 254 259 352 +580 203 223 220 353 +581 203 266 285 354 +582 203 209 307 355 +583 203 307 265 356 +584 203 265 351 356 +585 203 263 267 357 +586 203 243 301 336 +587 203 309 170 274 +588 203 270 269 358 +589 203 269 308 358 +590 203 273 276 275 +591 203 221 293 359 +592 203 323 221 359 +593 203 293 342 359 +594 203 220 291 360 +595 203 353 220 360 +596 203 291 319 360 +597 203 262 306 343 +598 203 311 288 361 +599 203 245 303 362 +600 203 303 335 362 +601 203 347 202 317 +602 203 279 242 363 +603 203 333 279 363 +604 203 242 339 363 +605 203 280 246 364 +606 203 336 280 364 +607 203 246 320 364 +608 203 283 263 365 +609 203 263 357 365 +610 203 272 286 366 +611 203 273 275 367 +612 203 286 271 368 +613 203 366 286 368 +614 203 271 324 368 +615 203 294 229 369 +616 203 313 216 312 +617 203 285 270 370 +618 203 354 285 370 +619 203 270 358 370 +620 203 274 313 371 +621 203 260 224 372 +622 203 224 323 372 +623 203 255 247 373 +624 203 344 255 373 +625 203 247 346 373 +626 203 292 260 374 +627 203 260 372 374 +628 203 248 239 375 +629 203 239 332 375 +630 203 288 262 376 +631 203 361 288 376 +632 203 262 343 376 +633 203 252 146 347 +634 203 309 274 377 +635 203 324 309 377 +636 203 274 371 377 +637 203 252 347 378 +638 203 283 365 351 +639 203 259 329 352 +640 203 294 369 340 +641 203 232 225 379 +642 203 326 297 380 +643 203 297 236 380 +644 203 229 232 381 +645 203 369 229 381 +646 203 232 379 381 +647 203 329 311 382 +648 203 231 228 383 +649 203 228 338 383 +650 203 298 277 384 +651 203 378 347 385 +652 203 347 317 385 +653 203 236 298 386 +654 203 380 236 386 +655 203 298 384 386 +656 203 335 252 378 +657 203 302 249 387 +658 203 322 219 388 +659 203 219 310 388 +660 203 299 243 389 +661 203 337 299 389 +662 203 243 336 389 +663 203 321 264 390 +664 203 264 289 390 +665 203 268 281 391 +666 203 222 292 392 +667 203 342 226 393 +668 203 226 304 393 +669 203 311 361 382 +670 203 320 302 387 +671 203 249 345 387 +672 203 292 374 392 +673 203 250 245 394 +674 203 251 248 395 +675 203 248 375 395 +676 203 319 222 392 +677 203 257 254 396 +678 203 254 352 396 +679 203 267 284 397 +680 203 209 355 314 +681 203 307 356 355 +682 203 357 267 397 +683 203 371 313 398 +684 203 308 272 399 +685 203 272 366 399 +686 203 312 273 367 +687 203 245 362 394 +688 203 346 257 396 +689 203 275 287 367 +690 203 278 237 400 +691 203 237 334 400 +692 203 277 278 401 +693 203 384 277 401 +694 203 278 400 401 +695 203 281 266 402 +696 203 391 281 402 +697 203 266 354 402 +698 203 284 268 403 +699 203 397 284 403 +700 203 268 391 403 +701 203 313 312 398 +702 203 287 218 404 +703 203 218 349 404 +704 203 289 282 405 +705 203 390 289 405 +706 203 282 314 405 +707 203 315 223 406 +708 203 223 353 406 +709 203 316 230 407 +710 203 230 341 407 +711 203 317 256 408 +712 203 385 317 408 +713 203 256 348 408 +714 203 250 394 332 +715 203 304 316 409 +716 203 316 407 409 +717 203 351 365 410 +718 203 379 225 411 +719 203 326 380 412 +720 203 225 231 411 +721 203 325 318 413 +722 203 392 374 414 +723 203 318 337 415 +724 203 337 389 415 +725 203 341 340 416 +726 203 339 325 417 +727 203 325 413 417 +728 203 329 382 418 +729 203 244 251 419 +730 203 367 287 404 +731 203 346 396 420 +732 203 371 398 421 +733 203 365 357 422 +734 203 332 394 423 +735 203 349 322 424 +736 203 314 355 425 +737 203 338 330 426 +738 203 310 315 427 +739 203 315 406 427 +740 203 362 335 428 +741 203 356 351 429 +742 203 351 410 429 +743 203 348 344 430 +744 203 358 308 431 +745 203 308 399 431 +746 203 352 329 432 +747 203 387 345 433 +748 203 419 251 395 +749 203 320 387 434 +750 203 387 433 434 +751 203 394 362 435 +752 203 362 428 435 +753 203 345 244 419 +754 203 355 356 436 +755 203 372 323 437 +756 203 319 392 438 +757 203 392 414 438 +758 203 374 372 439 +759 203 414 374 439 +760 203 372 437 439 +761 203 357 397 440 +762 203 334 333 441 +763 203 375 332 442 +764 203 332 423 442 +765 203 382 361 443 +766 203 328 321 444 +767 203 379 411 445 +768 203 411 231 383 +769 203 410 365 422 +770 203 329 418 432 +771 203 388 310 427 +772 203 353 360 446 +773 203 381 379 447 +774 203 379 445 447 +775 203 327 331 448 +776 203 312 367 449 +777 203 413 318 415 +778 203 383 338 450 +779 203 338 426 450 +780 203 304 409 393 +781 203 402 354 451 +782 203 331 326 452 +783 203 448 331 452 +784 203 326 412 452 +785 203 378 385 453 +786 203 369 381 454 +787 203 381 447 454 +788 203 364 320 434 +789 203 386 384 455 +790 203 380 386 456 +791 203 412 380 456 +792 203 386 455 456 +793 203 360 319 457 +794 203 389 336 458 +795 203 415 389 458 +796 203 336 364 458 +797 203 418 382 459 +798 203 355 436 425 +799 203 403 391 460 +800 203 461 449 404 +801 203 367 404 449 +802 203 404 349 461 +803 203 420 396 462 +804 203 396 352 462 +805 203 342 393 463 +806 203 433 345 464 +807 203 345 419 464 +808 203 395 375 465 +809 203 375 442 465 +810 203 371 421 377 +811 203 324 377 466 +812 203 382 443 459 +813 203 349 424 461 +814 203 314 425 405 +815 203 350 328 467 +816 203 328 444 467 +817 203 340 369 468 +818 203 397 403 469 +819 203 403 460 469 +820 203 353 446 470 +821 203 399 366 471 +822 203 356 429 436 +823 203 321 390 444 +824 203 430 344 472 +825 203 344 373 472 +826 203 352 432 462 +827 203 353 470 406 +828 203 359 342 473 +829 203 342 463 473 +830 203 424 322 474 +831 203 322 388 474 +832 203 394 435 423 +833 203 335 378 475 +834 203 419 395 476 +835 203 464 419 476 +836 203 395 465 476 +837 203 354 370 451 +838 203 363 339 477 +839 203 339 417 477 +840 203 422 357 440 +841 203 400 334 478 +842 203 334 441 478 +843 203 368 324 479 +844 203 324 466 479 +845 203 391 402 480 +846 203 402 451 480 +847 203 323 359 481 +848 203 437 323 481 +849 203 359 473 481 +850 203 366 368 482 +851 203 471 366 482 +852 203 368 479 482 +853 203 370 358 483 +854 203 358 431 483 +855 203 440 397 469 +856 203 407 341 484 +857 203 341 416 484 +858 203 319 438 457 +859 203 441 333 485 +860 203 333 363 485 +861 203 408 348 486 +862 203 348 430 486 +863 203 373 346 487 +864 203 472 373 487 +865 203 346 420 487 +866 203 445 411 488 +867 203 411 383 488 +868 203 443 361 489 +869 203 376 343 490 +870 203 343 350 490 +871 203 340 468 416 +872 203 330 327 491 +873 203 391 480 460 +874 203 327 448 491 +875 203 378 453 475 +876 203 369 454 468 +877 203 455 384 492 +878 203 384 401 492 +879 203 330 491 426 +880 203 335 475 428 +881 203 489 361 376 +882 203 443 489 493 +883 203 457 438 494 +884 203 446 360 457 +885 203 416 468 495 +886 203 462 432 496 +887 203 364 434 458 +888 203 413 415 497 +889 203 415 458 497 +890 203 410 422 498 +891 203 418 459 499 +892 203 426 491 500 +893 203 423 435 501 +894 203 438 414 502 +895 203 405 425 503 +896 203 422 440 504 +897 203 425 436 505 +898 203 385 408 506 +899 203 453 385 506 +900 203 408 486 506 +901 203 409 407 507 +902 203 407 484 507 +903 203 463 393 508 +904 203 393 409 508 +905 203 433 464 509 +906 203 431 399 510 +907 203 429 410 511 +908 203 410 498 511 +909 203 390 405 503 +910 203 466 377 421 +911 203 427 406 512 +912 203 406 470 512 +913 203 432 418 513 +914 203 459 443 514 +915 203 443 493 514 +916 203 469 460 515 +917 203 461 424 516 +918 203 470 446 517 +919 203 428 475 518 +920 203 399 471 510 +921 203 436 429 519 +922 203 489 376 490 +923 203 440 469 520 +924 203 388 427 521 +925 203 474 388 521 +926 203 427 512 521 +927 203 442 423 522 +928 203 423 501 522 +929 203 401 400 523 +930 203 492 401 523 +931 203 400 478 523 +932 203 480 451 524 +933 203 421 398 516 +934 203 434 433 525 +935 203 433 509 525 +936 203 435 428 526 +937 203 501 435 526 +938 203 428 518 526 +939 203 451 370 483 +940 203 417 413 527 +941 203 420 462 528 +942 203 460 480 529 +943 203 480 524 529 +944 203 398 312 449 +945 203 446 457 530 +946 203 517 446 530 +947 203 457 494 530 +948 203 466 421 531 +949 203 516 424 532 +950 203 516 398 461 +951 203 421 516 531 +952 203 432 513 496 +953 203 469 515 520 +954 203 447 445 533 +955 203 532 424 474 +956 203 495 468 534 +957 203 468 454 534 +958 203 462 496 528 +959 203 458 434 497 +960 203 500 491 535 +961 203 491 448 535 +962 203 498 422 504 +963 203 450 426 536 +964 203 426 500 536 +965 203 452 412 537 +966 203 409 507 508 +967 203 418 499 513 +968 203 363 477 485 +969 203 448 452 538 +970 203 452 537 538 +971 203 454 447 539 +972 203 534 454 539 +973 203 447 533 539 +974 203 524 451 483 +975 203 456 455 540 +976 203 499 459 541 +977 203 459 514 541 +978 203 412 456 542 +979 203 537 412 542 +980 203 456 540 542 +981 203 413 497 527 +982 203 437 481 543 +983 203 383 450 488 +984 203 438 502 494 +985 203 516 532 531 +986 203 453 506 544 +987 203 436 519 505 +988 203 518 475 545 +989 203 475 453 545 +990 203 509 464 546 +991 203 464 476 546 +992 203 431 510 547 +993 203 465 442 548 +994 203 442 522 548 +995 203 512 470 549 +996 203 470 517 549 +997 203 515 460 529 +998 203 483 431 547 +999 203 453 544 545 +1000 203 467 444 550 +1001 203 463 508 551 +1002 203 510 471 552 +1003 203 519 429 553 +1004 203 429 511 553 +1005 203 473 463 554 +1006 203 463 551 554 +1007 203 477 417 555 +1008 203 417 527 555 +1009 203 478 441 556 +1010 203 479 466 557 +1011 203 466 531 557 +1012 203 434 525 497 +1013 203 444 390 558 +1014 203 350 467 490 +1015 203 484 416 559 +1016 203 416 495 559 +1017 203 504 440 520 +1018 203 448 538 535 +1019 203 439 437 560 +1020 203 437 543 560 +1021 203 486 430 561 +1022 203 487 420 562 +1023 203 420 528 562 +1024 203 493 489 550 +1025 203 503 425 563 +1026 203 425 505 563 +1027 203 444 558 550 +1028 203 533 445 564 +1029 203 445 488 564 +1030 203 540 455 565 +1031 203 455 492 565 +1032 203 552 471 566 +1033 203 471 482 566 +1034 203 556 441 567 +1035 203 441 485 567 +1036 203 561 430 568 +1037 203 430 472 568 +1038 203 497 525 527 +1039 203 532 474 569 +1040 203 500 535 570 +1041 203 507 484 571 +1042 203 484 559 571 +1043 203 508 507 572 +1044 203 507 571 572 +1045 203 538 537 573 +1046 203 414 439 574 +1047 203 488 450 575 +1048 203 564 488 575 +1049 203 450 536 575 +1050 203 544 506 576 +1051 203 506 486 576 +1052 203 520 515 577 +1053 203 390 503 558 +1054 203 505 519 578 +1055 203 498 504 579 +1056 203 513 499 580 +1057 203 547 510 581 +1058 203 461 398 449 +1059 203 514 493 582 +1060 203 504 520 583 +1061 203 485 477 584 +1062 203 477 555 584 +1063 203 551 508 572 +1064 203 495 534 585 +1065 203 510 552 581 +1066 203 472 487 586 +1067 203 568 472 586 +1068 203 487 562 586 +1069 203 489 490 467 +1070 203 524 483 547 +1071 203 494 502 587 +1072 203 522 501 588 +1073 203 476 465 589 +1074 203 546 476 589 +1075 203 465 548 589 +1076 203 528 496 590 +1077 203 531 532 591 +1078 203 557 531 591 +1079 203 532 569 591 +1080 203 545 544 592 +1081 203 496 513 593 +1082 203 574 439 560 +1083 203 481 473 594 +1084 203 543 481 594 +1085 203 473 554 594 +1086 203 529 524 595 +1087 203 486 561 576 +1088 203 493 550 596 +1089 203 582 493 596 +1090 203 550 558 596 +1091 203 511 498 597 +1092 203 498 579 597 +1093 203 482 479 598 +1094 203 566 482 598 +1095 203 479 557 598 +1096 203 518 545 599 +1097 203 545 592 599 +1098 203 489 467 550 +1099 203 414 574 502 +1100 203 535 538 600 +1101 203 538 573 600 +1102 203 527 525 601 +1103 203 569 474 521 +1104 203 565 492 602 +1105 203 492 523 602 +1106 203 541 514 603 +1107 203 543 594 604 +1108 203 527 601 555 +1109 203 517 530 605 +1110 203 536 500 606 +1111 203 500 570 606 +1112 203 573 537 607 +1113 203 537 542 607 +1114 203 539 533 608 +1115 203 580 499 609 +1116 203 499 541 609 +1117 203 579 504 583 +1118 203 592 544 610 +1119 203 544 576 610 +1120 203 548 522 692 +1121 203 522 588 692 +1122 203 577 515 611 +1123 203 515 529 611 +1124 203 558 503 563 +1125 203 578 519 612 +1126 203 519 553 612 +1127 203 511 597 553 +1128 203 513 580 593 +1129 203 514 582 603 +1130 203 590 496 593 +1131 203 549 517 613 +1132 203 517 605 613 +1133 203 529 595 611 +1134 203 583 520 577 +1135 203 485 584 567 +1136 203 585 534 614 +1137 203 534 539 614 +1138 203 551 572 615 +1139 203 552 566 616 +1140 203 581 552 617 +1141 203 552 616 617 +1142 203 558 563 596 +1143 203 554 551 618 +1144 203 551 615 618 +1145 203 588 501 619 +1146 203 501 526 619 +1147 203 540 565 620 +1148 203 587 502 621 +1149 203 525 509 601 +1150 203 523 478 622 +1151 203 602 523 622 +1152 203 478 556 622 +1153 203 521 512 623 +1154 203 512 549 623 +1155 203 526 518 624 +1156 203 619 526 624 +1157 203 518 599 624 +1158 203 494 587 625 +1159 203 524 547 626 +1160 203 559 495 627 +1161 203 495 585 627 +1162 203 563 505 628 +1163 203 505 578 628 +1164 203 562 528 629 +1165 203 528 590 629 +1166 203 560 543 630 +1167 203 543 604 630 +1168 203 570 535 600 +1169 203 502 574 621 +1170 203 556 567 631 +1171 203 561 568 632 +1172 203 621 574 633 +1173 203 574 560 633 +1174 203 530 494 625 +1175 203 608 533 634 +1176 203 533 564 634 +1177 203 556 631 622 +1178 203 601 509 635 +1179 203 509 546 635 +1180 203 626 547 581 +1181 203 524 626 595 +1182 203 590 593 636 +1183 203 570 600 637 +1184 203 555 601 638 +1185 203 584 555 638 +1186 203 601 635 638 +1187 203 605 530 625 +1188 203 599 592 639 +1189 203 579 583 640 +1190 203 542 540 641 +1191 203 583 577 642 +1192 203 604 594 643 +1193 203 594 554 643 +1194 203 595 626 644 +1195 203 616 566 645 +1196 203 566 598 645 +1197 203 593 580 646 +1198 203 539 608 614 +1199 203 615 572 647 +1200 203 572 571 647 +1201 203 622 631 648 +1202 203 596 563 649 +1203 203 582 596 649 +1204 203 563 628 649 +1205 203 540 620 641 +1206 203 553 597 650 +1207 203 625 587 651 +1208 203 620 565 652 +1209 203 565 602 652 +1210 203 611 595 653 +1211 203 595 644 653 +1212 203 605 625 654 +1213 203 603 582 655 +1214 203 582 649 655 +1215 203 576 561 656 +1216 203 567 584 657 +1217 203 631 567 657 +1218 203 584 638 657 +1219 203 597 579 658 +1220 203 579 640 658 +1221 203 632 568 659 +1222 203 568 586 659 +1223 203 561 632 656 +1224 203 641 620 660 +1225 203 571 559 661 +1226 203 647 571 661 +1227 203 559 627 661 +1228 203 569 521 623 +1229 203 626 581 662 +1230 203 644 626 662 +1231 203 581 617 662 +1232 203 656 632 663 +1233 203 542 641 607 +1234 203 576 656 610 +1235 203 623 549 664 +1236 203 573 607 665 +1237 203 597 658 650 +1238 203 553 650 612 +1239 203 639 592 666 +1240 203 592 610 666 +1241 203 622 648 602 +1242 203 610 656 667 +1243 203 666 610 667 +1244 203 656 663 667 +1245 203 575 536 668 +1246 203 536 606 668 +1247 203 642 577 669 +1248 203 600 573 670 +1249 203 588 619 671 +1250 203 607 641 672 +1251 203 665 607 672 +1252 203 641 660 672 +1253 203 564 575 673 +1254 203 634 564 673 +1255 203 575 668 673 +1256 203 583 642 640 +1257 203 541 603 674 +1258 203 692 588 675 +1259 203 588 671 675 +1260 203 604 643 676 +1261 203 593 646 636 +1262 203 663 632 677 +1263 203 632 659 677 +1264 203 616 645 678 +1265 203 613 605 679 +1266 203 541 674 609 +1267 203 560 630 633 +1268 203 617 616 680 +1269 203 616 678 680 +1270 203 646 580 681 +1271 203 580 609 681 +1272 203 614 608 682 +1273 203 615 647 683 +1274 203 585 614 684 +1275 203 614 682 684 +1276 203 648 631 685 +1277 203 664 549 613 +1278 203 635 546 686 +1279 203 546 589 686 +1280 203 586 562 687 +1281 203 659 586 687 +1282 203 562 629 687 +1283 203 618 615 688 +1284 203 615 683 688 +1285 203 625 651 654 +1286 203 587 621 689 +1287 203 577 611 669 +1288 203 587 689 651 +1289 203 611 653 669 +1290 203 627 585 690 +1291 203 585 684 690 +1292 203 624 599 691 +1293 203 599 639 691 +1294 203 589 548 692 +1295 203 686 589 692 +1296 203 837 840 844 +1297 203 605 654 679 +1298 203 637 600 670 +1299 203 554 618 643 +1300 203 598 557 693 +1301 203 645 598 693 +1302 203 557 591 693 +1303 203 569 623 694 +1304 203 591 569 694 +1305 203 623 664 694 +1306 203 628 578 695 +1307 203 578 612 695 +1308 203 629 590 696 +1309 203 590 636 696 +1310 203 630 604 697 +1311 203 604 676 697 +1312 203 606 570 698 +1313 203 570 637 698 +1314 203 660 620 699 +1315 203 620 652 699 +1316 203 573 665 670 +1317 203 674 603 700 +1318 203 603 655 700 +1319 203 682 608 701 +1320 203 608 634 701 +1321 203 685 631 702 +1322 203 631 657 702 +1323 203 689 621 703 +1324 203 621 633 703 +1325 203 650 658 704 +1326 203 642 669 705 +1327 203 651 689 706 +1328 203 643 618 707 +1329 203 618 688 707 +1330 203 648 685 708 +1331 203 684 682 709 +1332 203 637 670 710 +1333 203 676 643 707 +1334 203 636 646 711 +1335 203 679 654 712 +1336 203 657 638 713 +1337 203 702 657 713 +1338 203 638 635 713 +1339 203 678 645 694 +1340 203 649 628 714 +1341 203 655 649 714 +1342 203 628 695 714 +1343 203 683 647 715 +1344 203 647 661 715 +1345 203 602 648 652 +1346 203 654 651 716 +1347 203 640 642 717 +1348 203 612 650 718 +1349 203 633 630 719 +1350 203 703 633 719 +1351 203 630 697 719 +1352 203 653 644 720 +1353 203 658 640 721 +1354 203 640 717 721 +1355 203 619 624 722 +1356 203 671 619 722 +1357 203 624 691 722 +1358 203 669 653 723 +1359 203 705 669 723 +1360 203 653 720 723 +1361 203 700 655 724 +1362 203 655 714 724 +1363 203 660 699 725 +1364 203 642 705 717 +1365 203 672 660 726 +1366 203 660 725 726 +1367 203 668 606 727 +1368 203 606 698 727 +1369 203 667 663 728 +1370 203 651 706 716 +1371 203 674 700 729 +1372 203 708 685 730 +1373 203 665 672 731 +1374 203 672 726 731 +1375 203 676 707 732 +1376 203 701 634 733 +1377 203 634 673 733 +1378 203 683 715 734 +1379 203 711 646 735 +1380 203 679 712 680 +1381 203 639 666 736 +1382 203 677 659 737 +1383 203 659 687 737 +1384 203 613 679 738 +1385 203 718 650 739 +1386 203 650 704 739 +1387 203 609 674 740 +1388 203 694 664 678 +1389 203 681 609 740 +1390 203 674 729 740 +1391 203 671 722 741 +1392 203 720 644 662 +1393 203 664 613 738 +1394 203 712 654 716 +1395 203 687 629 742 +1396 203 737 687 742 +1397 203 629 696 742 +1398 203 735 646 681 +1399 203 704 658 721 +1400 203 670 665 743 +1401 203 670 743 710 +1402 203 690 684 744 +1403 203 684 709 744 +1404 203 695 612 745 +1405 203 612 718 745 +1406 203 691 639 746 +1407 203 639 736 746 +1408 203 635 686 713 +1409 203 685 702 675 +1410 203 709 682 747 +1411 203 682 701 747 +1412 203 706 689 748 +1413 203 689 703 748 +1414 203 696 636 749 +1415 203 636 711 749 +1416 203 688 683 750 +1417 203 683 734 750 +1418 203 697 676 751 +1419 203 676 732 751 +1420 203 698 637 752 +1421 203 637 710 752 +1422 203 617 680 753 +1423 203 662 617 753 +1424 203 680 712 753 +1425 203 661 627 754 +1426 203 715 661 754 +1427 203 627 690 754 +1428 203 652 648 755 +1429 203 728 663 756 +1430 203 663 677 756 +1431 203 665 731 743 +1432 203 755 648 708 +1433 203 678 664 738 +1434 203 652 755 699 +1435 203 678 738 680 +1436 203 725 699 757 +1437 203 699 755 757 +1438 203 717 705 758 +1439 203 716 706 759 +1440 203 729 700 760 +1441 203 700 724 760 +1442 203 708 730 741 +1443 203 732 707 761 +1444 203 707 688 761 +1445 203 704 721 762 +1446 203 673 668 763 +1447 203 733 673 763 +1448 203 668 727 763 +1449 203 734 715 764 +1450 203 715 754 764 +1451 203 692 675 702 +1452 203 711 735 765 +1453 203 679 680 738 +1454 203 714 695 766 +1455 203 724 714 766 +1456 203 695 745 766 +1457 203 671 741 730 +1458 203 694 645 693 +1459 203 720 662 753 +1460 203 694 693 591 +1461 203 671 730 675 +1462 203 721 717 767 +1463 203 717 758 767 +1464 203 710 743 768 +1465 203 712 716 769 +1466 203 753 712 769 +1467 203 716 759 769 +1468 203 722 691 770 +1469 203 741 722 770 +1470 203 691 746 770 +1471 203 735 681 771 +1472 203 681 740 771 +1473 203 666 667 772 +1474 203 667 728 772 +1475 203 736 666 772 +1476 203 758 705 773 +1477 203 705 723 773 +1478 203 741 770 757 +1479 203 726 725 774 +1480 203 727 698 775 +1481 203 698 752 775 +1482 203 729 760 776 +1483 203 732 761 777 +1484 203 688 750 761 +1485 203 736 772 778 +1486 203 762 721 767 +1487 203 708 741 757 +1488 203 765 735 779 +1489 203 735 771 779 +1490 203 736 778 774 +1491 203 734 764 780 +1492 203 742 696 781 +1493 203 696 749 781 +1494 203 736 774 746 +1495 203 692 702 713 +1496 203 768 743 782 +1497 203 743 731 782 +1498 203 755 708 757 +1499 203 744 709 783 +1500 203 719 697 784 +1501 203 697 751 784 +1502 203 745 718 785 +1503 203 718 739 785 +1504 203 747 701 786 +1505 203 701 733 786 +1506 203 685 675 730 +1507 203 749 711 787 +1508 203 711 765 787 +1509 203 750 734 788 +1510 203 734 780 788 +1511 203 751 732 789 +1512 203 732 777 789 +1513 203 752 710 790 +1514 203 710 768 790 +1515 203 756 677 791 +1516 203 677 737 791 +1517 203 728 756 792 +1518 203 731 726 793 +1519 203 782 731 793 +1520 203 726 774 793 +1521 203 772 728 794 +1522 203 778 772 794 +1523 203 728 792 794 +1524 203 739 704 795 +1525 203 704 762 795 +1526 203 754 690 796 +1527 203 764 754 796 +1528 203 690 744 796 +1529 203 740 729 797 +1530 203 783 709 798 +1531 203 709 747 798 +1532 203 797 729 776 +1533 203 740 797 771 +1534 203 776 760 799 +1535 203 723 720 759 +1536 203 761 750 800 +1537 203 777 761 800 +1538 203 750 788 800 +1539 203 762 767 801 +1540 203 780 764 802 +1541 203 764 796 802 +1542 203 767 758 803 +1543 203 774 778 793 +1544 203 713 686 692 +1545 203 760 724 804 +1546 203 799 760 804 +1547 203 724 766 804 +1548 203 771 797 805 +1549 203 725 757 806 +1550 203 737 742 807 +1551 203 791 737 807 +1552 203 742 781 807 +1553 203 703 719 808 +1554 203 759 706 809 +1555 203 703 808 748 +1556 203 809 706 748 +1557 203 806 757 770 +1558 203 725 806 774 +1559 203 759 809 773 +1560 203 748 808 803 +1561 203 759 720 769 +1562 203 809 748 803 +1563 203 808 719 784 +1564 203 792 756 810 +1565 203 756 791 810 +1566 203 720 753 769 +1567 203 774 806 746 +1568 203 723 759 773 +1569 203 777 800 811 +1570 203 781 749 812 +1571 203 749 787 812 +1572 203 763 727 813 +1573 203 727 775 813 +1574 203 780 802 814 +1575 203 793 778 815 +1576 203 782 793 815 +1577 203 778 794 815 +1578 203 733 763 816 +1579 203 786 733 816 +1580 203 763 813 816 +1581 203 779 771 805 +1582 203 768 782 817 +1583 203 803 808 818 +1584 203 767 803 818 +1585 203 808 784 818 +1586 203 773 809 758 +1587 203 776 799 819 +1588 203 765 779 820 +1589 203 794 792 817 +1590 203 758 809 803 +1591 203 746 806 770 +1592 203 767 818 801 +1593 203 785 739 821 +1594 203 739 795 821 +1595 203 787 765 822 +1596 203 765 820 822 +1597 203 797 776 823 +1598 203 805 797 823 +1599 203 744 783 824 +1600 203 788 780 825 +1601 203 780 814 825 +1602 203 790 768 810 +1603 203 766 745 826 +1604 203 745 785 826 +1605 203 775 752 827 +1606 203 752 790 827 +1607 203 796 744 824 +1608 203 798 747 828 +1609 203 747 786 828 +1610 203 783 798 829 +1611 203 823 776 819 +1612 203 824 783 830 +1613 203 783 829 830 +1614 203 796 824 802 +1615 203 795 762 831 +1616 203 751 789 832 +1617 203 802 824 833 +1618 203 814 802 833 +1619 203 824 830 833 +1620 203 817 792 810 +1621 203 819 799 834 +1622 203 784 751 832 +1623 203 762 801 831 +1624 203 805 823 830 +1625 203 820 779 829 +1626 203 789 777 831 +1627 203 810 791 835 +1628 203 791 807 835 +1629 203 811 800 836 +1630 203 800 788 836 +1631 203 829 798 820 +1632 203 823 819 833 +1633 203 777 811 831 +1634 203 820 798 828 +1635 203 779 805 829 +1636 203 795 831 811 +1637 203 831 801 789 +1638 203 829 805 830 +1639 203 795 811 821 +1640 203 790 810 837 +1641 203 812 787 838 +1642 203 787 822 838 +1643 203 820 828 839 +1644 203 822 820 839 +1645 203 828 786 839 +1646 203 782 815 817 +1647 203 807 781 840 +1648 203 835 807 840 +1649 203 781 812 840 +1650 203 804 766 826 +1651 203 790 837 827 +1652 203 768 817 810 +1653 203 814 833 819 +1654 203 784 832 818 +1655 203 811 836 821 +1656 203 794 817 815 +1657 203 819 834 814 +1658 203 826 785 841 +1659 203 785 821 841 +1660 203 825 814 834 +1661 203 843 842 838 +1662 203 830 823 833 +1663 203 799 804 826 +1664 203 832 789 801 +1665 203 788 825 836 +1666 203 801 818 832 +1667 203 799 826 834 +1668 203 839 786 816 +1669 203 834 826 841 +1670 203 813 775 842 +1671 203 822 839 843 +1672 203 838 822 843 +1673 203 839 816 843 +1674 203 837 810 835 +1675 203 821 836 841 +1676 203 825 834 841 +1677 203 775 827 842 +1678 203 813 842 843 +1679 203 816 813 843 +1680 203 836 825 841 +1681 203 837 835 840 +1682 203 842 827 844 +1683 203 840 812 844 +1684 203 842 844 838 +1685 203 844 827 837 +1686 203 844 812 838 \ No newline at end of file diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/params_prescribed_revolving_wing.ini b/src/flexible_solver/mesh/Revolving_bumblebee_wing/params_prescribed_revolving_wing.ini new file mode 100644 index 0000000..56dfcdd --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/params_prescribed_revolving_wing.ini @@ -0,0 +1,402 @@ +;------------------------------------------------------------------------------- +; Example parameter file for FSI simulations +; This file contains all possible parameters. When actually running something, +; you don't need to have all of them; all have their defaults which are loaded +; if a value is not found. +; When adding new parameters, please keep in mind to add them here. +;------------------------------------------------------------------------------- + +; Define the resolution +[Resolution] +nx=512; +ny=512; +nz=256; + +[Time] +; final time +Tmax=6.0; +; maximum number of time steps. if not set, unlimited +; nt=; +; Time stepper for Fluid +iTimeMethodFluid=FSI_AB2_staggered; RK2, RK4, FSI_AB2_iteration, FSI_AB2_staggered, FSI_AB2_semiimplicit +CFL=0.15; +; fix time step (no matter what) +dt_fixed=; +; semi-fix time step (cannot be larger than dt_max but may well be smaller) +dt_max=; +; intelligent dt? (make sure you miss neither of tsave/tend/tintegral/tslice) +; may cause problems with AB2!! +intelligent_dt=yes; + + +[ReynoldsNumber] +; viscosity fĂĽr navier-stokes. note density is always unity (we normalized that) +nu=1.477e-4; + +[FSI-equation] +; the fluid-structure interaction module, the actual flusi code, can run on two equations +; Navier-stokes incompressible or artificial compressibility. both are discretized with +; Fourier. Default is Navier-Stokes. Does not affect MHD part of the code. +equation=navier-stokes; artificial-compressibility + +[artificial-compressibility] +c_0=20.0; +gamma_p=1.0; +acm_inipressure=flusi-spectral; zero +acm_sponge=0; + +[InitialCondition] +; currently the follwing is available: "VortexRing", "turbulence", "MeanFlow" +; "quiescent" to retake a backup: "backup::file.h5" +; the option "infile" requires specifying "file_ux=ux.h5", "file_uy=uy.h5",.... +; "turbulence_rogallo": random field with given spectrum +; "random-given-spectrum": improved version of rogallo, can read a spectrum from file, specify file below. +inicond=quiescent; +; parameters for case "turbulence": +nu_smoothing=1.0e-5; +; omega1 is maximum vorticity in "turbulence" case and in "turbulence_rogallo" case +omega1=200.0; + ; parameters for case "infile" +file_ux=none; +file_uy=none; +file_uz=none; +file_p=none; +; if inicond reads a spectrum: (txt file, no header or footer, nothing fancy) +inicond_spectrum_file=spectrum.txt; + + +[Penalization] +; use penalization method or not? (superseeds following parameters) +iPenalization=1; +; does the obstacle move? +iMoving=1; +; which mask to set? (sphere, Flapper, cylinder, moving_cylinder, turek_wan, +; Insect, noncircular_cylinder, Flexibility, couette, empty,romain_open_cavity) +; note noncircular_cylinder reads in shape.in +; from_file::mask_00.h5 reads from file. you can then also set solid velocity +iMask=Flexible_wing; +; if mask is "from_file", set also constant and homogeneous solid velocity: +us_fixed=0 0 0; +; penalization parameter +eps=5.66e-4; +; cavity around the domain? (this is independent of iMask) +; note this may be in conflict with mean flow forcing +; (use iCavity=yes; but set iMeanFlow=0;). Freestream cavity forces flow to umean given in +; meanflow setion. for freestream_smooth, the thickness is given in thick_wall +; choices: yes/o/freestream/freestream_smooth +iCavity=no; +; cavity wall thickness in gridpoints +; note due to periodicity, effective thickness is twice that value +cavity_size=0; +; compute forces/toqrues or dont? +compute_forces=1; +; use unsteady corrections? +unst_corrections=1; +; channel walls? (allowed: no, xy, xz, xy_sliding, xz_sliding, turek) +iChannel=no; +thick_wall=0.2; +pos_wall=0.3; +; periodization of coordinates (i.e. an insect can leave on one side and re-enter +; on the opposite side). NOTE: causes overhead, use only if required. +periodic=no; + +[Geometry] +; domain size +xl=4.0; new: default value is 2*pi +yl=4.0; +zl=2.0; +Size=1.0; generic size parameter +alpha=0.0; generic angle parameter +; Position of obstacle (not used for insects) +x0=2.0; +y0=2.0; +z0=1.0; + + +[Insects] +;------------------------------------------------------------------------------- +; Body geometry +x_pivot_r=0.05 -0.2165 0.0; (vector) position of right wing in body system +x_pivot_l=0.05 +0.2165 0.0; (vector) position of left wing in body system +; Body ( nobody, suzuki_thin_rod, jerry, hawkmoth, particle, platicle, coin, sphere, drosophila, +; drosophila_maeda, drosophila_slimm, bumblebee +; mosquito_iams, pyramid, cone, birch_seed) +BodyType=drosophila +HasDetails=all; legs; antennae_proboscis; no; +RightWing=yes; +LeftWing=yes; +b_body=0.2; +L_body=1.0; +R_head=0.20; +R_eye=0.075; +x_head=0.4 0.0 0.0; (vector) +x_eye_r=; (vector) +x_eye_l=; (vector) +J_body_yawpitchroll=1.0 1.0 1.0; Body moment of inertia in body reference frame +mass=1.0; total mass of animal +gravity=1.0; negative: falling in negative z-direction +;------------------------------------------------------------------------------- +; Wing geometry (Shapes: rectangular, TwoEllipses, pointcloud, mosquito_iams, +; suzuki), Fourier wings: pieris-brassicae1, drosophila, drosophila_mutated, drosophila_maeda, +; drosophila_sun, drosophila_sandberg, bumblebee, b_ignitus, flapper_sane, flapper_dickinsonII, +; robofly_dickinson, hawkmoth1, hawkmoth2, from_file::MY_WING_FILE.ini +WingShape=drosophila; +; if wingshape=pointcloud, read the cloud from this file: +pointcloudfile=calliphora.txt +b_top=0.1; if WingShape=TwoEllipses, thickness of forward ellipse, if WingShape=rectangular, above rotation axis +b_bot=0.3; if WingShape=TwoEllipses, thickness of backward, if WingShape=rectangular, below rotation axis +; length of the wing, root to tip (yw-direction). Note for most wings, you do not +; need to set it (only used in: mosquito_iams, rectangular, TwoEllipses). +L_span=1.0; +WingThickness=; default thickness is 4*dx +; wing inertia tensor (used to compute inertial power) +Jxx=0.0; +Jyy=0.0; +Jzz=0.0; +Jxy=0.0; +;------------------------------------------------------------------------------- +; Body motion +; motion of the body: (tethered, free_flight) +BodyMotion=tethered; +x0=2 2 3; initial (or tethered) position +v0=0 0 0; inital velocity +yawpitchroll_0=90.0 60.0 0.0; initial (or tethered) orientation in degrees +eta0=90.0; stroke plane angle in degrees +DoF=111111; x,y,z,yaw,pitch,roll DoF on=1 or off=0 +;------------------------------------------------------------------------------- +; Wing motion +; (types: Drosophila_hovering_fry, Drosophila_hovering_maeda, flapper_sane, +; flapper_dickinson, takeoff, simplified, from_file, none) +FlappingMotion_right=Drosophila_hovering_fry; +FlappingMotion_left=Drosophila_hovering_fry; +; if flappingmotion=="from_file", which file to use? +infile=motion.in; +wing_fsi=no; +init_alpha_phi_theta=0.0 0.0 0.0; +;------------------------------------------------------------------------------- + + +[MeanFlow] +; type of mean flow (free/constant/dynamic) +; free: do nothing particular about the mean flow +; fixed: fix mean flow to values given here +; dynamic: solve mean flow eqn for a given (domain-independent) fluid mass +iMeanFlow_x=fixed; +iMeanFlow_y=fixed; +iMeanFlow_z=fixed; +; if "dynamic", this is the mass of the fluid +m_fluid=10.0; +; if "dynamic" and mean flow at t=0 is not zero, the forces are singular +; at the beginning. use the startup conditioner to avoid large accelerations in +; mean flow at the beginning +iMeanFlowStartupConditioner=no; +tau_meanflow=0.0; +T_release_meanflow=0.0; +; if "fixed" then this is mean velocities: +ux=0.0; +uy=0.0; +uz=0.0; + +[Sponge] +; use a vorticity sponge or not? +iVorticitySponge=yes; +; what "mask" to use? (note: you can use cavity without actual cavity walls +; ie iCavity=no) +; available: cavity, xmin_xmax_ymin_ymax, xmin_xmax, xmin_xmax_zmin_zmax, top_cover +iSpongeType=cavity; +eps_sponge=1e-1; +sponge_thickness=16; in grid points + +[Saving] +; Time interval for saving fields +tsave=0.01; +; do not save fields before +tsave_first=0.d0; +; Number of hours between saving runtime backups +truntime=1.0; +; Maximum number of walltime hours allowed for simulation +wtimemax=100.0; +; keep only one period of snapshots? (assumes T=1.0 period time) +save_only_one_period=no; +; if saving only one period, this is the period time: +tsave_period=1.0; +; naming scheme for files: time, timestep +naming=time; +; precision of fields (single/double) +field_precision=single; +; field striding (save every 2nd, third, etc point, default: 1) +striding=1; +; Time interval for saving integral quantities +tintegral=0.01; +; Save drag every itdrag time steps +itdrag=10; +; save beam (if in use) every itbeam time steps +itbeam=2; +; make a backup or dont +iDoBackup=1; +; what fields to save? +iSaveVelocity=1; +iSavePress=1; +iSaveVorticity=0; +iSaveMagVorticity=1; +iSaveMask=1; +iSaveSolidVelocity=0; +# save spectrum every itdrag / tdrag times? +iSaveSpectrae=no; + +[Forcing] +; Forcing for isotropic turbulence. To be used with cubic boxes (nx=ny=nz and xl=yl=zl=2*pi) +; It is probably best to use RK4 scheme with larger CFL number, as it will be cheaper than AB2 +; "machiels" forcing tries to impose a given dissipation rate (eps_forcing below) +; "kaneda" forcing compensates the loss of energy through frictiong (parameter eps_forcing unused) +forcing_type=none; machiels, kaneda +; force wavenumbers kf and kf+1 (the shell is always two wavenumbers thick in the +; current implementation +kf=0; +; machiels forcing imposes this dissipation rate: (unused in kaneda's forcing) +eps_forcing=0; + +[Dealiasing] +iDealias=1; 1=yes 0=no (you shouldnt use 0) + + +[PassiveScalar] +; on/off switch, superseeds all following +use_passive_scalar=0; 0=off, 1=on +; how many passive scalars? specify their parameters individually +n_scalars=1; +; stop when the scalar fails? +stop_on_fail=yes; + + +[Scalar1] +; diffusivity +kappa=0.01; +; penalization +eps_scalar=1.0e-4; +; initial condition for scalar dirstibutions +inicond=right_left_discontinuous; +; source term (dirichlet condition on scalar): gauss_blob, none +sourceterm=no; +; 4d vectors x,y,z,sigma for gauss_blob source +sourceterm_x0=1.0 1.0 1.0 0.01; + + +[SolidModel] +; use solid model yes or no? (superseeds all following) +use_solid_model=no; +; resolution +ns=32; +; interpolation method +interp=delta; +; dimensionless density, stiffness. note this is a WIDTH specific quantity, i.e. +; it is multiplied by the width in the rigid direction, which may vary along the +; beam. note the width is NOT NECESSARILY L_span but is dictated by the choice +; plate_shape and L_span in combination +mue=0.0571; +eta=0.008; +; gravity +gravity=0.00; +; damping coefficient +sigma=0.0; +; when is the beam released? +T_release=0.0; +tau=0.0; +; time marching algorithm +TimeMethodSolid=BDF2; +; Options for the embedding of the beam in the 3D domain, for the mask etc +; available options: +; "fixed_middle" plate in the middle of domain bending in xy, z is height +; "pitching_middle" plate in the middle of domain bending in xy, z is height, imposed pitching +imposed_motion_leadingedge=swimmer; +f=1.0; +; spanwise length, for bounding boxes only (chordwise length is always unity) +L_span=1.00; +; (half) beam thickness (centerline-interface) +t_beam=0.15; +; how mouch smoothing (in grid points) +N_smooth=3.0; +; cylinder at the leading edge? +has_cylinder=no; +R_cylinder=0.0; +; infinite span? (you still have to set L_span a bit smaller than zl) +infinite=no; +; shape of the plate in the rigid direction (rectangular, fish). note the shape +; also modifies the effective stiffness and density, \mu(s) and \eta(s) +plate_shape=fish; +; debug pressure? +debug_pressure=0; + +[Flexible_wing] +;switch on solid solver for flexible wings +use_flexible_wing_model=yes; +; interpolation method for pressure +wing_interp=delta; +; switch between one-way and two-way coupling FSI +activate_press_force=yes; +; time marching algorithm +TimeMethodFlexibleSolid=prescribed_wing;BDF2; +; origin where the wing is put +x0= 2.0; +y0= 2.0; +z0= 1.0; +;Wing motion +Motion=prescribed_revolving_wing;stationary;simple_harmonic;revolving_Zimmerman; +; wing thickness +t_wing=; +wing_smoothing=; + +EIy= 5.5533e-5; 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5 5.5533e-5;1.5533e-6; +EIz= 5.9413e-04; 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04 5.9413e-04;9.9413e-05; +EIy_with_BC= 1.2427e-4; 1.2427e-4 1.2427e-4 1.2427e-4; +EIz_with_BC= 1e-3; 1e-3 1e-3 1e-3; + +ke_veins=1e4; 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4 1e4; +ke_veins_with_BC=1e4; +ke_membranes=8.5e1; + +; initial angle of wing with respect to the local wing coordinate system +Wing_angle_x=0.78539; +Wing_angle_y=0.0; +Wing_angle_z=0.0;-1.9708;-0.78539; + +density_veins=5e-8; 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8 5e-8; 1e-8; +density_veins_with_BC=5e-8; 5e-8 5e-8 5e-8; +density_membranes=5e-8; + +Gravity= 0.0 0.0 0.0; +T_release=0.0; +tau=0.0; + +[TurbulentInlet] +use_turbulent_inlet=no; +rescale=1.d0; +inlet_thickness=48; + +[Averaging] +; compute averages? +time_avg=no; +; compute time avg velocity? +vel_avg=yes; +; compute time avg kinetic energy? +ekin_avg=no; +; compute time avg enstrophy? +enstrophy_avg=yes; +; when to start averaging? +tstart_avg=0.0; +; write only to one file? +save_one_only=yes; + +[SaveSlices] +use_slicing=no; +slice1=12; +slice2=16; +slice3=45; +slice4=45; +; save every itslice time steps +itslice=2; +; and/or every tslice time +tslice=0.01; +; but not before tslice_first +tslice_first=0.0; +ncache_slices=250; diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/points_coor1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/points_coor1.dat new file mode 100644 index 0000000..ceb8866 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/points_coor1.dat @@ -0,0 +1,698 @@ +1.0000000000000000e+00 0.0000000000000000e+00 -1.3080016892465135e-01 0.0000000000000000e+00 +2.0000000000000000e+00 5.4826421780192454e-03 -1.6212955102520571e-01 0.0000000000000000e+00 +3.0000000000000000e+00 1.5664691464173510e-02 -1.9815834023389506e-01 0.0000000000000000e+00 +4.0000000000000000e+00 2.1930567056491719e-02 -2.3340389520049276e-01 0.0000000000000000e+00 +5.0000000000000000e+00 5.0910245602978577e-02 -2.6864944933929785e-01 0.0000000000000000e+00 +6.0000000000000000e+00 7.5190517041330451e-02 -2.9449618926183291e-01 0.0000000000000000e+00 +7.0000000000000000e+00 8.9288738365735421e-02 -3.1407705276425718e-01 0.0000000000000000e+00 +8.0000000000000000e+00 1.1278577473420301e-01 -3.5323878059689828e-01 0.0000000000000000e+00 +9.0000000000000000e+00 1.5586367460509482e-01 -3.8065198983140924e-01 0.0000000000000000e+00 +1.0000000000000000e+01 1.9894157530377934e-01 -3.9709991470988171e-01 0.0000000000000000e+00 +1.1000000000000000e+01 2.4045300586269527e-01 -3.9866638402185761e-01 0.0000000000000000e+00 +1.2000000000000000e+01 2.7648179507138465e-01 -4.0414902619987686e-01 0.0000000000000000e+00 +1.3000000000000000e+01 3.0076206650973647e-01 -4.1433107548603115e-01 0.0000000000000000e+00 +1.4000000000000000e+01 3.2425910287820403e-01 -4.1668077904009859e-01 0.0000000000000000e+00 +1.5000000000000000e+01 3.5872142277491753e-01 -4.2686282749846022e-01 0.0000000000000000e+00 +1.6000000000000000e+01 3.9083403911756354e-01 -4.2764606256834448e-01 0.0000000000000000e+00 +1.7000000000000000e+01 4.2686282832625289e-01 -4.5662574028703867e-01 0.0000000000000000e+00 +1.8000000000000000e+01 4.6289161753494223e-01 -4.6054191315308207e-01 0.0000000000000000e+00 +1.9000000000000000e+01 4.9657070318956403e-01 -4.5270956824878800e-01 0.0000000000000000e+00 +2.0000000000000000e+01 5.3416596088243662e-01 -4.4722692607076869e-01 0.0000000000000000e+00 +2.1000000000000000e+01 5.5922946656288008e-01 -4.3156223543438788e-01 0.0000000000000000e+00 +2.2000000000000000e+01 5.7724386158112106e-01 -4.1354784041614678e-01 0.0000000000000000e+00 +2.3000000000000000e+01 5.8429297224332355e-01 -3.6890347123327910e-01 0.0000000000000000e+00 +2.4000000000000000e+01 6.2658763787212379e-01 -3.6733700192130325e-01 0.0000000000000000e+00 +2.5000000000000000e+01 6.6888230350092404e-01 -3.5323878059689828e-01 0.0000000000000000e+00 +2.6000000000000000e+01 7.0569432695170498e-01 -3.3914055844470065e-01 0.0000000000000000e+00 +2.7000000000000000e+01 7.3702370905225933e-01 -3.1955969494227643e-01 0.0000000000000000e+00 +2.8000000000000000e+01 7.6991955963699699e-01 -3.0076206568194380e-01 0.0000000000000000e+00 +2.9000000000000000e+01 8.0359864529161862e-01 -2.7961473286754374e-01 0.0000000000000000e+00 +3.0000000000000000e+01 8.3649449587635627e-01 -2.5376799294500857e-01 0.0000000000000000e+00 +3.1000000000000000e+01 8.6625740866493484e-01 -2.2478831439852176e-01 0.0000000000000000e+00 +3.2000000000000000e+01 8.9288738365735421e-01 -1.9580863667982756e-01 0.0000000000000000e+00 +3.3000000000000000e+01 9.1638442002582177e-01 -1.6056308171322980e-01 0.0000000000000000e+00 +3.4000000000000000e+01 9.2500000000000004e-01 -1.2845046537058386e-01 0.0000000000000000e+00 +3.5000000000000000e+01 9.1795088933779767e-01 -8.9288738365735421e-02 0.0000000000000000e+00 +3.6000000000000000e+01 8.9758679076548908e-01 -6.2658763373316037e-02 0.0000000000000000e+00 +3.7000000000000000e+01 8.6939034728888653e-01 -4.0728196316824332e-02 0.0000000000000000e+00 +3.8000000000000000e+01 8.3022861945624549e-01 -2.7413209234510981e-02 0.0000000000000000e+00 +3.9000000000000000e+01 7.9106689245139705e-01 -1.5664690636380853e-02 0.0000000000000000e+00 +4.0000000000000000e+01 7.5425486900061600e-01 -8.6155799741783595e-03 0.0000000000000000e+00 +4.1000000000000000e+01 7.0412785763972907e-01 -2.3497035540674901e-03 0.0000000000000000e+00 +4.2000000000000000e+01 6.5321761203675044e-01 0.0000000000000000e+00 0.0000000000000000e+00 +4.3000000000000000e+01 6.0074089794958874e-01 -3.9161728660433793e-03 0.0000000000000000e+00 +4.4000000000000000e+01 5.4278154085661501e-01 -1.0182049286154248e-02 0.0000000000000000e+00 +4.5000000000000000e+01 4.8952159169956883e-01 -1.8014394190448344e-02 0.0000000000000000e+00 +4.6000000000000000e+01 4.3861134609659036e-01 -2.6629974164626705e-02 0.0000000000000000e+00 +4.7000000000000000e+01 3.8613463200942855e-01 -4.0728196316824332e-02 0.0000000000000000e+00 +4.8000000000000000e+01 3.3209144778249816e-01 -4.9343776291002693e-02 0.0000000000000000e+00 +4.9000000000000000e+01 2.8118120217951958e-01 -6.1875529131224447e-02 0.0000000000000000e+00 +5.0000000000000000e+01 2.4045300586269527e-01 -7.2057578417378698e-02 0.0000000000000000e+00 +5.1000000000000000e+01 1.9815834023389506e-01 -7.8323454837489551e-02 0.0000000000000000e+00 +5.2000000000000000e+01 1.6212955102520571e-01 -8.3022861945624554e-02 0.0000000000000000e+00 +5.3000000000000000e+01 1.2453429333233315e-01 -8.5372565499692035e-02 0.0000000000000000e+00 +5.4000000000000000e+01 8.3806097015508813e-02 -8.7722269053759530e-02 0.0000000000000000e+00 +5.5000000000000000e+01 4.5427604252751982e-02 -9.3204911231778792e-02 0.0000000000000000e+00 +5.6000000000000000e+01 6.2658764201108958e-03 -1.0808636762606803e-01 0.0000000000000000e+00 +5.7000000000000000e+01 2.5846740336431431e-02 -1.0064563942892341e-01 0.0000000000000000e+00 +5.8000000000000000e+01 6.4616850634130571e-02 -9.0463590142769154e-02 0.0000000000000000e+00 +5.9000000000000000e+01 1.0417019517392098e-01 -8.6547417276725783e-02 0.0000000000000000e+00 +6.0000000000000000e+01 1.4333192217876942e-01 -8.4197713722658288e-02 0.0000000000000000e+00 +6.1000000000000000e+01 1.8014394562954955e-01 -8.0673158391557129e-02 0.0000000000000000e+00 +6.2000000000000000e+01 2.1930567304829518e-01 -7.5190516627434117e-02 0.0000000000000000e+00 +6.3000000000000000e+01 2.6081710402110742e-01 -6.6966553774301649e-02 0.0000000000000000e+00 +6.4000000000000000e+01 2.9815128404717889e-01 -5.7698278184483906e-02 0.0000000000000000e+00 +6.5000000000000000e+01 3.1512136591483814e-01 -5.3521027237743386e-02 0.0000000000000000e+00 +6.6000000000000000e+01 3.5010584252480859e-01 -4.6471916299609624e-02 0.0000000000000000e+00 +6.7000000000000000e+01 3.6812023726711895e-01 -4.3600056308217394e-02 0.0000000000000000e+00 +6.8000000000000000e+01 4.0362687003848274e-01 -3.6028788932758730e-02 0.0000000000000000e+00 +6.9000000000000000e+01 4.2111910806753611e-01 -3.1329381548692303e-02 0.0000000000000000e+00 +7.0000000000000000e+01 4.6406646889807956e-01 -2.2322184177537521e-02 0.0000000000000000e+00 +7.1000000000000000e+01 5.0727490808525122e-01 -1.5403612555683363e-02 0.0000000000000000e+00 +7.2000000000000000e+01 5.2502822447093345e-01 -1.2792830920919230e-02 0.0000000000000000e+00 +7.3000000000000000e+01 5.6210132655427325e-01 -8.0934238127842260e-03 0.0000000000000000e+00 +7.4000000000000000e+01 5.8142111225193127e-01 -6.0047983394134023e-03 0.0000000000000000e+00 +7.5000000000000000e+01 6.1823313597864216e-01 -2.6107819106955862e-03 0.0000000000000000e+00 +7.6000000000000000e+01 6.3572537400769635e-01 -1.3053909553477931e-03 0.0000000000000000e+00 +7.7000000000000000e+01 6.7867273483823976e-01 -1.1748517770337568e-03 0.0000000000000000e+00 +7.8000000000000000e+01 7.2919136332017265e-01 -5.4826417641229367e-03 0.0000000000000000e+00 +7.9000000000000000e+01 7.7266088072600647e-01 -1.2140135305279607e-02 0.0000000000000000e+00 +8.0000000000000000e+01 8.1064775595382133e-01 -2.1538949935445900e-02 0.0000000000000000e+00 +8.1000000000000000e+01 8.4980948337256590e-01 -3.4070702775667649e-02 0.0000000000000000e+00 +8.2000000000000000e+01 8.8348856902718786e-01 -5.1693479845070195e-02 0.0000000000000000e+00 +8.3000000000000000e+01 9.0776884005164338e-01 -7.5973750869525652e-02 0.0000000000000000e+00 +8.4000000000000000e+01 9.2147544466889886e-01 -1.0886960186815964e-01 0.0000000000000000e+00 +8.5000000000000000e+01 9.2069221001291091e-01 -1.4450677354190669e-01 0.0000000000000000e+00 +8.6000000000000000e+01 9.0463590184158793e-01 -1.7818585919652860e-01 0.0000000000000000e+00 +8.7000000000000000e+01 8.7957239616114435e-01 -2.1029847553917483e-01 0.0000000000000000e+00 +8.8000000000000000e+01 8.5137595227064566e-01 -2.3927815367176519e-01 0.0000000000000000e+00 +8.9000000000000000e+01 8.2004657058398756e-01 -2.6669136290627615e-01 0.0000000000000000e+00 +9.0000000000000000e+01 7.8675910246430780e-01 -2.9018839927474377e-01 0.0000000000000000e+00 +9.1000000000000000e+01 7.5347163434462816e-01 -3.1016088031211014e-01 0.0000000000000000e+00 +9.2000000000000000e+01 7.2135901800198210e-01 -3.2935012669348857e-01 0.0000000000000000e+00 +9.3000000000000000e+01 6.8728831522631451e-01 -3.4618966952079949e-01 0.0000000000000000e+00 +9.4000000000000000e+01 6.4773497068652397e-01 -3.6028789125910077e-01 0.0000000000000000e+00 +9.5000000000000000e+01 6.0544030505772373e-01 -3.6812023657729120e-01 0.0000000000000000e+00 +9.6000000000000000e+01 5.8076841691222225e-01 -3.9122565582471297e-01 0.0000000000000000e+00 +9.7000000000000000e+01 5.1536833203600041e-01 -4.4996824715977835e-01 0.0000000000000000e+00 +9.8000000000000000e+01 4.7973116036225316e-01 -4.5662574070093498e-01 0.0000000000000000e+00 +9.9000000000000000e+01 4.4487722293059756e-01 -4.5858382672006037e-01 0.0000000000000000e+00 +1.0000000000000000e+02 4.0884843372190816e-01 -4.4213590142769160e-01 0.0000000000000000e+00 +1.0100000000000000e+02 3.7477773094624051e-01 -4.2725444503340237e-01 0.0000000000000000e+00 +1.0200000000000000e+02 3.4149026282656081e-01 -4.2177180326927943e-01 0.0000000000000000e+00 +1.0300000000000000e+02 2.5846740046703992e-01 -4.0140770511086726e-01 0.0000000000000000e+00 +1.0400000000000000e+02 2.1969729058323728e-01 -3.9788314936586966e-01 0.0000000000000000e+00 +1.0500000000000000e+02 1.7740262495443709e-01 -3.8887595227064548e-01 0.0000000000000000e+00 +1.0600000000000000e+02 1.3432472466964893e-01 -3.6694538521415376e-01 0.0000000000000000e+00 +1.0700000000000000e+02 1.0103725654996921e-01 -3.3365791668057770e-01 0.0000000000000000e+00 +1.0800000000000000e+02 6.3050381322154514e-02 -2.8157281930056538e-01 0.0000000000000000e+00 +1.0900000000000000e+02 3.6420406329735144e-02 -2.5102667226989533e-01 0.0000000000000000e+00 +1.1000000000000000e+02 1.8797629260332613e-02 -2.1578111771719391e-01 0.0000000000000000e+00 +1.1100000000000000e+02 1.0573666821096388e-02 -1.8014394562955030e-01 0.0000000000000000e+00 +1.1200000000000000e+02 2.7413210890096227e-03 -1.4646485997492853e-01 0.0000000000000000e+00 +1.1300000000000000e+02 1.9194780459806250e-02 -1.1940160445509963e-01 0.0000000000000000e+00 +1.1400000000000000e+02 5.7322147655462979e-02 -1.1059042669658742e-01 0.0000000000000000e+00 +1.1500000000000000e+02 9.6415688342672917e-02 -1.0596419494324742e-01 0.0000000000000000e+00 +1.1600000000000000e+02 1.3495901223090612e-01 -1.0274902787621347e-01 0.0000000000000000e+00 +1.1700000000000000e+02 1.7362578160211165e-01 -9.9172079703290117e-02 0.0000000000000000e+00 +1.1800000000000000e+02 2.1240129259845572e-01 -9.4039619832398474e-02 0.0000000000000000e+00 +1.1900000000000000e+02 2.5377646815796934e-01 -8.6587029475858335e-02 0.0000000000000000e+00 +1.2000000000000000e+02 2.9192319992029553e-01 -7.7556498944886157e-02 0.0000000000000000e+00 +1.2100000000000000e+02 3.2752499768724230e-01 -6.9054540397785816e-02 0.0000000000000000e+00 +1.2200000000000000e+02 3.6268354167491218e-01 -6.2660821260553570e-02 0.0000000000000000e+00 +1.2300000000000000e+02 3.9995977014264783e-01 -5.5052622970348325e-02 0.0000000000000000e+00 +1.2400000000000000e+02 4.3668085006758639e-01 -4.5950121279560170e-02 0.0000000000000000e+00 +1.2500000000000000e+02 4.7818409300088877e-01 -3.7452567501159453e-02 0.0000000000000000e+00 +1.2600000000000000e+02 5.1790621449517660e-01 -3.1913738605105817e-02 0.0000000000000000e+00 +1.2700000000000000e+02 5.5495173857558266e-01 -2.6586032152038738e-02 0.0000000000000000e+00 +1.2800000000000000e+02 5.9227130560832164e-01 -2.2636617564446671e-02 0.0000000000000000e+00 +1.2900000000000000e+02 6.2892905643995201e-01 -2.0739152094178190e-02 0.0000000000000000e+00 +1.3000000000000000e+02 6.6833525715947018e-01 -1.9051883173681488e-02 0.0000000000000000e+00 +1.3100000000000000e+02 6.9172036909117363e-01 -1.9597575276472587e-02 0.0000000000000000e+00 +1.3200000000000000e+02 7.1474985264032487e-01 -2.2127213754325473e-02 0.0000000000000000e+00 +1.3300000000000000e+02 7.3675391713949623e-01 -2.4360442642349087e-02 0.0000000000000000e+00 +1.3400000000000000e+02 7.7679483644999203e-01 -3.1799816031191162e-02 0.0000000000000000e+00 +1.3500000000000000e+02 8.1388502139448649e-01 -4.1202470884882179e-02 0.0000000000000000e+00 +1.3600000000000000e+02 8.5015215491554263e-01 -5.2102022905875907e-02 0.0000000000000000e+00 +1.3700000000000000e+02 8.8047331860188360e-01 -7.0129198782031985e-02 0.0000000000000000e+00 +1.3800000000000000e+02 9.0259923436822675e-01 -1.0040482138411728e-01 0.0000000000000000e+00 +1.3900000000000000e+02 9.0577813294911635e-01 -1.2691809722017566e-01 0.0000000000000000e+00 +1.4000000000000000e+02 8.9888023274532447e-01 -1.5323936265597279e-01 0.0000000000000000e+00 +1.4100000000000000e+02 8.8629137138571135e-01 -1.7303195931946636e-01 0.0000000000000000e+00 +1.4200000000000000e+02 8.6008493592247670e-01 -2.0475124085704882e-01 0.0000000000000000e+00 +1.4300000000000000e+02 8.3223025773143988e-01 -2.3307696208528927e-01 0.0000000000000000e+00 +1.4400000000000000e+02 8.0105281807662765e-01 -2.5814668298330040e-01 0.0000000000000000e+00 +1.4500000000000000e+02 7.6916852094256505e-01 -2.7954936943212988e-01 0.0000000000000000e+00 +1.4600000000000000e+02 7.3723678566773865e-01 -2.9887193501334508e-01 0.0000000000000000e+00 +1.4700000000000000e+02 7.0419770105085622e-01 -3.1740147616642533e-01 0.0000000000000000e+00 +1.4800000000000000e+02 6.7007388572036231e-01 -3.3310721288737627e-01 0.0000000000000000e+00 +1.4900000000000000e+02 6.3163322361590757e-01 -3.4595953187683698e-01 0.0000000000000000e+00 +1.5000000000000000e+02 5.9047820987309785e-01 -3.5245420789920723e-01 0.0000000000000000e+00 +1.5100000000000000e+02 5.6591647986979965e-01 -3.7806672913128470e-01 0.0000000000000000e+00 +1.5200000000000000e+02 5.6052129367711367e-01 -4.0305081041161578e-01 0.0000000000000000e+00 +1.5300000000000000e+02 5.4159249872899429e-01 -4.2216394840266003e-01 0.0000000000000000e+00 +1.5400000000000000e+02 5.0265216700325055e-01 -4.3398857723348622e-01 0.0000000000000000e+00 +1.5500000000000000e+02 4.6004033073867645e-01 -4.3987237580700783e-01 0.0000000000000000e+00 +1.5600000000000000e+02 4.3348751360631504e-01 -4.3608229887464800e-01 0.0000000000000000e+00 +1.5700000000000000e+02 4.1287654577975486e-01 -4.2093342071309059e-01 0.0000000000000000e+00 +1.5800000000000000e+02 3.7816127326657906e-01 -4.0765588089427351e-01 0.0000000000000000e+00 +1.5900000000000000e+02 3.5959482624193440e-01 -4.1048662633714406e-01 0.0000000000000000e+00 +1.6000000000000000e+02 3.3951977111891768e-01 -4.0255607679399308e-01 0.0000000000000000e+00 +1.6100000000000000e+02 3.1803328505196993e-01 -3.9741585088875386e-01 0.0000000000000000e+00 +1.6200000000000000e+02 2.7355034473269951e-01 -3.8625827075489128e-01 0.0000000000000000e+00 +1.6300000000000000e+02 2.3139919398745948e-01 -3.8089441443704608e-01 0.0000000000000000e+00 +1.6400000000000000e+02 1.9125271498776841e-01 -3.7479588480032855e-01 0.0000000000000000e+00 +1.6500000000000000e+02 1.7145306959868128e-01 -3.7085572206894313e-01 0.0000000000000000e+00 +1.6600000000000000e+02 1.3785560228992755e-01 -3.4624543997338902e-01 0.0000000000000000e+00 +1.6700000000000000e+02 1.1677566803890201e-01 -3.1306823025371078e-01 0.0000000000000000e+00 +1.6800000000000000e+02 9.9046901879589422e-02 -2.9451581270990723e-01 0.0000000000000000e+00 +1.6900000000000000e+02 8.4018341004844316e-02 -2.7689304553041855e-01 0.0000000000000000e+00 +1.7000000000000000e+02 5.5989900175695863e-02 -2.4436351811964055e-01 0.0000000000000000e+00 +1.7100000000000000e+02 3.9489313370352726e-02 -2.2833776855423382e-01 0.0000000000000000e+00 +1.7200000000000000e+02 3.7077429584720989e-02 -2.0656948751998452e-01 0.0000000000000000e+00 +1.7300000000000000e+02 2.7369737031436969e-02 -1.6740208936001769e-01 0.0000000000000000e+00 +1.7400000000000000e+02 1.5164933446691519e-02 -1.3607289173684053e-01 0.0000000000000000e+00 +1.7500000000000000e+02 3.7978874437377338e-02 -1.1409293786024118e-01 0.0000000000000000e+00 +1.7600000000000000e+02 7.7103743296636551e-02 -1.0863371439010082e-01 0.0000000000000000e+00 +1.7700000000000000e+02 1.1538427791163487e-01 -1.0433263817688254e-01 0.0000000000000000e+00 +1.7800000000000000e+02 1.5459913206852674e-01 -1.0092757879608974e-01 0.0000000000000000e+00 +1.7900000000000000e+02 1.9267620148921527e-01 -9.6760644366182494e-02 0.0000000000000000e+00 +1.8000000000000000e+02 2.3368958419048491e-01 -9.0420187276950684e-02 0.0000000000000000e+00 +1.8100000000000000e+02 2.7284924270582744e-01 -8.2093705640450210e-02 0.0000000000000000e+00 +1.8200000000000000e+02 3.0972985713599643e-01 -7.3572995477481251e-02 0.0000000000000000e+00 +1.8300000000000000e+02 3.4495561277365222e-01 -6.5776175980873056e-02 0.0000000000000000e+00 +1.8400000000000000e+02 3.8187933837641014e-01 -5.9154304639287190e-02 0.0000000000000000e+00 +1.8500000000000000e+02 4.1796617525922308e-01 -5.1016857829421058e-02 0.0000000000000000e+00 +1.8600000000000000e+02 4.5662284486806770e-01 -4.1310249430836325e-02 0.0000000000000000e+00 +1.8700000000000000e+02 4.9898156275846128e-01 -3.4534391069790157e-02 0.0000000000000000e+00 +1.8800000000000000e+02 5.3634617303973664e-01 -2.9290579459300102e-02 0.0000000000000000e+00 +1.8900000000000000e+02 5.7372018278564418e-01 -2.4864969975908424e-02 0.0000000000000000e+00 +1.9000000000000000e+02 6.1067431082950341e-01 -2.1316847173122010e-02 0.0000000000000000e+00 +1.9100000000000000e+02 6.4823258487763447e-01 -2.0367039456555693e-02 0.0000000000000000e+00 +1.9200000000000000e+02 7.5764525757811108e-01 -2.7616233426688858e-02 0.0000000000000000e+00 +1.9300000000000000e+02 7.9512792761736217e-01 -3.5890993606258324e-02 0.0000000000000000e+00 +1.9400000000000000e+02 8.3261735365413070e-01 -4.6137835037644237e-02 0.0000000000000000e+00 +1.9500000000000000e+02 8.6677847474329162e-01 -5.8683294576156668e-02 0.0000000000000000e+00 +1.9600000000000000e+02 8.9102381255247942e-01 -8.3804781919657206e-02 0.0000000000000000e+00 +1.9700000000000000e+02 8.7349076806866344e-01 -1.8978094007054455e-01 0.0000000000000000e+00 +1.9800000000000000e+02 8.4669109788592289e-01 -2.1875750447230194e-01 0.0000000000000000e+00 +1.9900000000000000e+02 8.1667096810927675e-01 -2.4604532223692102e-01 0.0000000000000000e+00 +2.0000000000000000e+02 7.8554303853589869e-01 -2.6958679583752176e-01 0.0000000000000000e+00 +2.0100000000000000e+02 7.5321057735564401e-01 -2.8958792718621945e-01 0.0000000000000000e+00 +2.0200000000000000e+02 7.2106951666199348e-01 -3.0759192518838885e-01 0.0000000000000000e+00 +2.0300000000000000e+02 6.8790195189143755e-01 -3.2621387051560330e-01 0.0000000000000000e+00 +2.0400000000000000e+02 6.5144432116988815e-01 -3.4004519038985054e-01 0.0000000000000000e+00 +2.0500000000000000e+02 6.1116611045553759e-01 -3.5008661347745884e-01 0.0000000000000000e+00 +2.0600000000000000e+02 5.7044556648620492e-01 -3.5738094702841300e-01 0.0000000000000000e+00 +2.0700000000000000e+02 4.8215995891102426e-01 -4.3665125543436578e-01 0.0000000000000000e+00 +2.0800000000000000e+02 5.2203275754191225e-01 -4.2991260962423250e-01 0.0000000000000000e+00 +2.0900000000000000e+02 3.9802453160347256e-01 -4.0456418967534130e-01 0.0000000000000000e+00 +2.1000000000000000e+02 2.9478363706562283e-01 -3.9242449858720896e-01 0.0000000000000000e+00 +2.1100000000000000e+02 2.5220687553431259e-01 -3.8244940096431868e-01 0.0000000000000000e+00 +2.1200000000000000e+02 2.1122130013533055e-01 -3.7881229401329902e-01 0.0000000000000000e+00 +2.1300000000000000e+02 1.5577553897802099e-01 -3.5955405320175116e-01 0.0000000000000000e+00 +2.1400000000000000e+02 1.2117743031009504e-01 -3.3401719417919323e-01 0.0000000000000000e+00 +2.1500000000000000e+02 7.0341614808565461e-02 -2.6162561751683294e-01 0.0000000000000000e+00 +2.1600000000000000e+02 3.2822547222073964e-02 -1.8670937871790771e-01 0.0000000000000000e+00 +2.1700000000000000e+02 2.0824936118829938e-02 -1.5011333200375865e-01 0.0000000000000000e+00 +2.1800000000000000e+02 8.8672911596494181e-02 -1.2513192328232678e-01 0.0000000000000000e+00 +2.1900000000000000e+02 1.2706491572470988e-01 -1.2210430057374320e-01 0.0000000000000000e+00 +2.2000000000000000e+02 2.0601519924205108e-01 -1.1298579633707048e-01 0.0000000000000000e+00 +2.2100000000000000e+02 3.2199191288355039e-01 -8.8589453518507805e-02 0.0000000000000000e+00 +2.2200000000000000e+02 2.4708143170695732e-01 -1.0588874395854762e-01 0.0000000000000000e+00 +2.2300000000000000e+02 1.8575015455637295e-01 -1.1626286500170033e-01 0.0000000000000000e+00 +2.2400000000000000e+02 3.0428342320736024e-01 -9.2752986791579034e-02 0.0000000000000000e+00 +2.2500000000000000e+02 5.1021745911545446e-01 -5.1885928697601690e-02 0.0000000000000000e+00 +2.2600000000000000e+02 3.5783612079025845e-01 -8.1728028576319126e-02 0.0000000000000000e+00 +2.2700000000000000e+02 4.3213591053341438e-01 -6.5623551388508367e-02 0.0000000000000000e+00 +2.2800000000000000e+02 5.4797869467371585e-01 -4.5348163741543594e-02 0.0000000000000000e+00 +2.2900000000000000e+02 4.7144254958513815e-01 -5.7840400760223808e-02 0.0000000000000000e+00 +2.3000000000000000e+02 4.1358951344554157e-01 -7.0064707557875444e-02 0.0000000000000000e+00 +2.3100000000000000e+02 5.2920643126784161e-01 -4.8575861310282492e-02 0.0000000000000000e+00 +2.3200000000000000e+02 4.9121561827695054e-01 -5.4693490375200438e-02 0.0000000000000000e+00 +2.3300000000000000e+02 8.3421960180540589e-01 -6.5361326942520157e-02 0.0000000000000000e+00 +2.3400000000000000e+02 5.8452047938843432e-01 -4.1967236623341536e-02 0.0000000000000000e+00 +2.3500000000000000e+02 6.2152014110796161e-01 -3.9244176965863103e-02 0.0000000000000000e+00 +2.3600000000000000e+02 6.5995186637246595e-01 -3.7628086409773429e-02 0.0000000000000000e+00 +2.3700000000000000e+02 7.4283974859675583e-01 -4.4097941079595450e-02 0.0000000000000000e+00 +2.3800000000000000e+02 8.6552325470503844e-01 -7.5340144781051235e-02 0.0000000000000000e+00 +2.3900000000000000e+02 7.9772491612269925e-01 -2.3746434027532454e-01 0.0000000000000000e+00 +2.4000000000000000e+02 8.1699055497907602e-01 -6.1299089025804152e-02 0.0000000000000000e+00 +2.4100000000000000e+02 8.5032658674040562e-01 -7.0663628340479470e-02 0.0000000000000000e+00 +2.4200000000000000e+02 7.9920822492556121e-01 -5.6459291602609846e-02 0.0000000000000000e+00 +2.4300000000000000e+02 8.8240541345093459e-01 -1.0166180566185110e-01 0.0000000000000000e+00 +2.4400000000000000e+02 8.4084694493842294e-01 -1.9851645803837456e-01 0.0000000000000000e+00 +2.4500000000000000e+02 7.6743868121344927e-01 -2.5940555497086959e-01 0.0000000000000000e+00 +2.4600000000000000e+02 8.7786092315584496e-01 -1.5389179826432894e-01 0.0000000000000000e+00 +2.4700000000000000e+02 6.3521144797771223e-01 -3.2552686770908140e-01 0.0000000000000000e+00 +2.4800000000000000e+02 8.1236007179550351e-01 -2.2483856988963369e-01 0.0000000000000000e+00 +2.4900000000000000e+02 8.5363283104452392e-01 -1.8420615854205716e-01 0.0000000000000000e+00 +2.5000000000000000e+02 7.8317116438024459e-01 -2.4845763008241739e-01 0.0000000000000000e+00 +2.5100000000000000e+02 8.2722550387274751e-01 -2.1160645840167133e-01 0.0000000000000000e+00 +2.5200000000000000e+02 7.3648057467852279e-01 -2.7855237128674748e-01 0.0000000000000000e+00 +2.5300000000000000e+02 6.7151663450680021e-01 -3.1288244768541373e-01 0.0000000000000000e+00 +2.5400000000000000e+02 5.9592212269904066e-01 -3.3345446010355212e-01 0.0000000000000000e+00 +2.5500000000000000e+02 6.5371930407851531e-01 -3.1941260836383695e-01 0.0000000000000000e+00 +2.5600000000000000e+02 6.8844412797455001e-01 -3.0478525274038759e-01 0.0000000000000000e+00 +2.5700000000000000e+02 6.1617148026147894e-01 -3.2927733530404779e-01 0.0000000000000000e+00 +2.5800000000000000e+02 5.0832239482229036e-01 -4.1462838371141969e-01 0.0000000000000000e+00 +2.5900000000000000e+02 5.7528216695384160e-01 -3.3793534597448316e-01 0.0000000000000000e+00 +2.6000000000000000e+02 2.8494872466533444e-01 -9.7143180303202750e-02 0.0000000000000000e+00 +2.6100000000000000e+02 5.2562115331336157e-01 -4.0904654578298338e-01 0.0000000000000000e+00 +2.6200000000000000e+02 5.4729858903592044e-01 -3.8379214671744893e-01 0.0000000000000000e+00 +2.6300000000000000e+02 3.1237367741195932e-01 -3.7604909645762669e-01 0.0000000000000000e+00 +2.6400000000000000e+02 4.6958105555982166e-01 -4.1861050209253609e-01 0.0000000000000000e+00 +2.6500000000000000e+02 3.6124113661959922e-01 -3.8898031187552856e-01 0.0000000000000000e+00 +2.6600000000000000e+02 2.0299032154724950e-01 -3.5912322928809165e-01 0.0000000000000000e+00 +2.6700000000000000e+02 2.8935967634458282e-01 -3.7103023223900217e-01 0.0000000000000000e+00 +2.6800000000000000e+02 2.4490677843768693e-01 -3.6306044704406076e-01 0.0000000000000000e+00 +2.6900000000000000e+02 1.4051412922172965e-01 -3.2465882325024914e-01 0.0000000000000000e+00 +2.7000000000000000e+02 1.6001622476314614e-01 -3.3837111891687915e-01 0.0000000000000000e+00 +2.7100000000000000e+02 9.0693869042235697e-02 -2.5721511433233313e-01 0.0000000000000000e+00 +2.7200000000000000e+02 1.2427932077196280e-01 -2.9012101106300170e-01 0.0000000000000000e+00 +2.7300000000000000e+02 4.0817067448803646e-02 -1.5071140411215847e-01 0.0000000000000000e+00 +2.7400000000000000e+02 5.9516044334263669e-02 -2.1972391473980341e-01 0.0000000000000000e+00 +2.7500000000000000e+02 5.0035582863568129e-02 -1.3117831335183025e-01 0.0000000000000000e+00 +2.7600000000000000e+02 3.1330163981334001e-02 -1.3410744245083678e-01 0.0000000000000000e+00 +2.7700000000000000e+02 7.0142397773930532e-01 -3.9829786292450479e-02 0.0000000000000000e+00 +2.7800000000000000e+02 7.2274167039580695e-01 -4.1419893195942400e-02 0.0000000000000000e+00 +2.7900000000000000e+02 7.8059706947124663e-01 -5.2096278906974693e-02 0.0000000000000000e+00 +2.8000000000000000e+02 8.8539730284725682e-01 -1.3526621659080787e-01 0.0000000000000000e+00 +2.8100000000000000e+02 2.2395574162298301e-01 -3.6151805746637089e-01 0.0000000000000000e+00 +2.8200000000000000e+02 4.3052844464589951e-01 -4.1308489690546679e-01 0.0000000000000000e+00 +2.8300000000000000e+02 3.3526979425329917e-01 -3.8157206319853465e-01 0.0000000000000000e+00 +2.8400000000000000e+02 2.6617819735519926e-01 -3.6620403920612171e-01 0.0000000000000000e+00 +2.8500000000000000e+02 1.7954292447973993e-01 -3.5303434100109077e-01 0.0000000000000000e+00 +2.8600000000000000e+02 1.0633139996637221e-01 -2.7340925166101054e-01 0.0000000000000000e+00 +2.8700000000000000e+02 6.8888017968648588e-02 -1.2776909809470985e-01 0.0000000000000000e+00 +2.8800000000000000e+02 5.5090695080579555e-01 -3.6300704488970542e-01 0.0000000000000000e+00 +2.8900000000000000e+02 4.5019078046950850e-01 -4.1636762241276665e-01 0.0000000000000000e+00 +2.9000000000000000e+02 1.0734986213713286e-01 -1.2339444819633308e-01 0.0000000000000000e+00 +2.9100000000000000e+02 2.2663905025083797e-01 -1.0951344259736139e-01 0.0000000000000000e+00 +2.9200000000000000e+02 2.6675632253178810e-01 -1.0153841208180261e-01 0.0000000000000000e+00 +2.9300000000000000e+02 3.4059382760473728e-01 -8.5017436203633098e-02 0.0000000000000000e+00 +2.9400000000000000e+02 4.5147726865625382e-01 -6.1871200332295331e-02 0.0000000000000000e+00 +2.9500000000000000e+02 6.0283117192544944e-01 -4.0549239895417130e-02 0.0000000000000000e+00 +2.9600000000000000e+02 5.6683398411409924e-01 -4.3327681072532272e-02 0.0000000000000000e+00 +2.9700000000000000e+02 6.4022055175709491e-01 -3.8178374933183337e-02 0.0000000000000000e+00 +2.9800000000000000e+02 6.7989743192408014e-01 -3.7948905928306430e-02 0.0000000000000000e+00 +2.9900000000000000e+02 8.7391762632248315e-01 -8.7673769016131484e-02 0.0000000000000000e+00 +3.0000000000000000e+02 7.6257955679403944e-01 -4.7735870397908692e-02 0.0000000000000000e+00 +3.0100000000000000e+02 8.9015604489930600e-01 -1.1748264505655864e-01 0.0000000000000000e+00 +3.0200000000000000e+02 8.6641946017590576e-01 -1.6989792664094591e-01 0.0000000000000000e+00 +3.0300000000000000e+02 7.5238651771393339e-01 -2.6941551024726945e-01 0.0000000000000000e+00 +3.0400000000000000e+02 3.7616344403696933e-01 -7.8443909041386373e-02 0.0000000000000000e+00 +3.0500000000000000e+02 4.8918129863169302e-01 -4.1783286646258871e-01 0.0000000000000000e+00 +3.0600000000000000e+02 5.4133044901963911e-01 -4.0156700707670023e-01 0.0000000000000000e+00 +3.0700000000000000e+02 3.8338841020974251e-01 -3.8991916876696386e-01 0.0000000000000000e+00 +3.0800000000000000e+02 1.4346281225107180e-01 -3.0343632737017567e-01 0.0000000000000000e+00 +3.0900000000000000e+02 7.5922404266529839e-02 -2.4046211642034526e-01 0.0000000000000000e+00 +3.1000000000000000e+02 1.4605045210129003e-01 -1.2084156361535028e-01 0.0000000000000000e+00 +3.1100000000000000e+02 5.5475691562774487e-01 -3.4275557707241189e-01 0.0000000000000000e+00 +3.1200000000000000e+02 5.1473044714187587e-02 -1.7030876562809538e-01 0.0000000000000000e+00 +3.1300000000000000e+02 5.4177510607640610e-02 -1.9468332049236009e-01 0.0000000000000000e+00 +3.1400000000000000e+02 4.1832668110818921e-01 -3.9708711085000148e-01 0.0000000000000000e+00 +3.1500000000000000e+02 1.6657490219487331e-01 -1.1878089216322375e-01 0.0000000000000000e+00 +3.1600000000000000e+02 3.9523085464582047e-01 -7.3970959480797002e-02 0.0000000000000000e+00 +3.1700000000000000e+02 7.0463698719503431e-01 -2.9609704475741638e-01 0.0000000000000000e+00 +3.1800000000000000e+02 8.3730268029311228e-01 -8.5622719379390005e-02 0.0000000000000000e+00 +3.1900000000000000e+02 2.4047580246289735e-01 -1.2545456586688569e-01 0.0000000000000000e+00 +3.2000000000000000e+02 8.5988994857773227e-01 -1.5303113963539405e-01 0.0000000000000000e+00 +3.2100000000000000e+02 4.7862685061826704e-01 -4.0264490905058825e-01 0.0000000000000000e+00 +3.2200000000000000e+02 1.1871104389145214e-01 -1.4114854182386705e-01 0.0000000000000000e+00 +3.2300000000000000e+02 3.1715302817881280e-01 -1.0890418681855114e-01 0.0000000000000000e+00 +3.2400000000000000e+02 9.6924121937755417e-02 -2.3699627753076524e-01 0.0000000000000000e+00 +3.2500000000000000e+02 8.2012738293116294e-01 -8.1492104513865779e-02 0.0000000000000000e+00 +3.2600000000000000e+02 6.3197465070659864e-01 -5.6734203234977826e-02 0.0000000000000000e+00 +3.2700000000000000e+02 5.9517943390172412e-01 -5.9079079368086519e-02 0.0000000000000000e+00 +3.2800000000000000e+02 4.9528822317698629e-01 -3.9787417791576485e-01 0.0000000000000000e+00 +3.2900000000000000e+02 5.6011493502819121e-01 -3.2339319231353286e-01 0.0000000000000000e+00 +3.3000000000000000e+02 5.7766152609904653e-01 -6.0628503699401794e-02 0.0000000000000000e+00 +3.3100000000000000e+02 6.1352265357366642e-01 -5.7615310213716228e-02 0.0000000000000000e+00 +3.3200000000000000e+02 7.7983496868560642e-01 -2.2832303466248791e-01 0.0000000000000000e+00 +3.3300000000000000e+02 7.6767321783215092e-01 -6.7650446946276754e-02 0.0000000000000000e+00 +3.3400000000000000e+02 7.4910264216506350e-01 -6.3607161435399795e-02 0.0000000000000000e+00 +3.3500000000000000e+02 7.3482762936710477e-01 -2.5773847022448754e-01 0.0000000000000000e+00 +3.3600000000000000e+02 8.7262756402456898e-01 -1.1943693702368582e-01 0.0000000000000000e+00 +3.3700000000000000e+02 8.5514808915365326e-01 -8.8147051034390994e-02 0.0000000000000000e+00 +3.3800000000000000e+02 5.5952715378976825e-01 -6.3319130208775651e-02 0.0000000000000000e+00 +3.3900000000000000e+02 8.0250884335602979e-01 -7.7163005481356184e-02 0.0000000000000000e+00 +3.4000000000000000e+02 4.4644013565894158e-01 -8.1746167318846319e-02 0.0000000000000000e+00 +3.4100000000000000e+02 4.2751244235254143e-01 -8.5801596651297857e-02 0.0000000000000000e+00 +3.4200000000000000e+02 3.5323732310613887e-01 -1.0101360766335034e-01 0.0000000000000000e+00 +3.4300000000000000e+02 5.2896701575875948e-01 -3.8941188923464720e-01 0.0000000000000000e+00 +3.4400000000000000e+02 6.5511572129879603e-01 -2.9834486311642955e-01 0.0000000000000000e+00 +3.4500000000000000e+02 8.3450210589104978e-01 -1.7831938342576018e-01 0.0000000000000000e+00 +3.4600000000000000e+02 6.1979801603251994e-01 -3.0937191417439697e-01 0.0000000000000000e+00 +3.4700000000000000e+02 7.2047180315617509e-01 -2.8744792709910838e-01 0.0000000000000000e+00 +3.4800000000000000e+02 6.7237888539384727e-01 -2.9159162471996458e-01 0.0000000000000000e+00 +3.4900000000000000e+02 9.9433484751378906e-02 -1.4276840837677460e-01 0.0000000000000000e+00 +3.5000000000000000e+02 5.1276331288078358e-01 -3.9468696382765123e-01 0.0000000000000000e+00 +3.5100000000000000e+02 3.5379777269435803e-01 -3.6598454992895973e-01 0.0000000000000000e+00 +3.5200000000000000e+02 5.8089027231918111e-01 -3.1808797667981520e-01 0.0000000000000000e+00 +3.5300000000000000e+02 1.9897736249777728e-01 -1.3244992018665763e-01 0.0000000000000000e+00 +3.5400000000000000e+02 1.9661742529293555e-01 -3.4167602358317500e-01 0.0000000000000000e+00 +3.5500000000000000e+02 4.0179307386695423e-01 -3.8087362151223220e-01 0.0000000000000000e+00 +3.5600000000000000e+02 3.7892164114945931e-01 -3.7118379165697235e-01 0.0000000000000000e+00 +3.5700000000000000e+02 3.0462503516400474e-01 -3.5567230441254521e-01 0.0000000000000000e+00 +3.5800000000000000e+02 1.6378656953202364e-01 -3.1653969088604389e-01 0.0000000000000000e+00 +3.5900000000000000e+02 3.3546439236189024e-01 -1.0526315394002572e-01 0.0000000000000000e+00 +3.6000000000000000e+02 2.1941950488244860e-01 -1.2947569890482816e-01 0.0000000000000000e+00 +3.6100000000000000e+02 5.3406081177870068e-01 -3.4880489695557521e-01 0.0000000000000000e+00 +3.6200000000000000e+02 7.5024624354053104e-01 -2.4821873997257546e-01 0.0000000000000000e+00 +3.6300000000000000e+02 7.8516666505288879e-01 -7.2273661694258445e-02 0.0000000000000000e+00 +3.6400000000000000e+02 8.6485067818428019e-01 -1.3717156878276973e-01 0.0000000000000000e+00 +3.6500000000000000e+02 3.2784886036407618e-01 -3.6068344814790154e-01 0.0000000000000000e+00 +3.6600000000000000e+02 1.2998652851676382e-01 -2.6908455723729457e-01 0.0000000000000000e+00 +3.6700000000000000e+02 6.0104538386752532e-02 -1.4740520763955176e-01 0.0000000000000000e+00 +3.6800000000000000e+02 1.1256195827614164e-01 -2.5348299952083331e-01 0.0000000000000000e+00 +3.6900000000000000e+02 4.6546250197706379e-01 -7.7513297309688867e-02 0.0000000000000000e+00 +3.7000000000000000e+02 1.8078142291348362e-01 -3.3024327504170337e-01 0.0000000000000000e+00 +3.7100000000000000e+02 7.2032553026878512e-02 -2.0294026261746576e-01 0.0000000000000000e+00 +3.7200000000000000e+02 2.9838757309609704e-01 -1.1320546307866143e-01 0.0000000000000000e+00 +3.7300000000000000e+02 6.3834139997551786e-01 -3.0427593855086926e-01 0.0000000000000000e+00 +3.7400000000000000e+02 2.7921608501875245e-01 -1.1757346386785704e-01 0.0000000000000000e+00 +3.7500000000000000e+02 7.9434894642762655e-01 -2.1785367769703298e-01 0.0000000000000000e+00 +3.7600000000000000e+02 5.3195838501630166e-01 -3.6942516872726261e-01 0.0000000000000000e+00 +3.7700000000000000e+02 8.3625360171594998e-02 -2.1992311299385750e-01 0.0000000000000000e+00 +3.7800000000000000e+02 7.1901244631074512e-01 -2.6681705566200303e-01 0.0000000000000000e+00 +3.7900000000000000e+02 5.0356069222941779e-01 -7.0511103137995232e-02 0.0000000000000000e+00 +3.8000000000000000e+02 6.5107193008231168e-01 -5.6337265642933891e-02 0.0000000000000000e+00 +3.8100000000000000e+02 4.8446355048998668e-01 -7.4213525929647722e-02 0.0000000000000000e+00 +3.8200000000000000e+02 5.3993035840174386e-01 -3.2872451574584638e-01 0.0000000000000000e+00 +3.8300000000000000e+02 5.4119783819723055e-01 -6.5511588487177988e-02 0.0000000000000000e+00 +3.8400000000000000e+02 6.9035831838725092e-01 -5.7636662005104644e-02 0.0000000000000000e+00 +3.8500000000000000e+02 7.0425658169290750e-01 -2.7534128347122544e-01 0.0000000000000000e+00 +3.8600000000000000e+02 6.7026827746893525e-01 -5.6330442037784749e-02 0.0000000000000000e+00 +3.8700000000000000e+02 8.4705296807991604e-01 -1.6430050960518885e-01 0.0000000000000000e+00 +3.8800000000000000e+02 1.3834860110811042e-01 -1.3925523957232736e-01 0.0000000000000000e+00 +3.8900000000000000e+02 8.6358593742559142e-01 -1.0464471297541046e-01 0.0000000000000000e+00 +3.9000000000000000e+02 4.6200575152728024e-01 -3.9460380051475646e-01 0.0000000000000000e+00 +3.9100000000000000e+02 2.3679317672014039e-01 -3.4398048472376991e-01 0.0000000000000000e+00 +3.9200000000000000e+02 2.5983342731978798e-01 -1.2114672435046718e-01 0.0000000000000000e+00 +3.9300000000000000e+02 3.7076870038937459e-01 -9.7386805366052806e-02 0.0000000000000000e+00 +3.9400000000000000e+02 7.6556258126313659e-01 -2.3863814406286596e-01 0.0000000000000000e+00 +3.9500000000000000e+02 8.0857864456489614e-01 -2.0531894944620729e-01 0.0000000000000000e+00 +3.9600000000000000e+02 6.0080463879244139e-01 -3.1422367329820150e-01 0.0000000000000000e+00 +3.9700000000000000e+02 2.8167378316408226e-01 -3.5121789187285080e-01 0.0000000000000000e+00 +3.9800000000000000e+02 7.5704130095801930e-02 -1.8259115994677022e-01 0.0000000000000000e+00 +3.9900000000000000e+02 1.4766359301360601e-01 -2.8265664791510403e-01 0.0000000000000000e+00 +4.0000000000000000e+02 7.2974108814804362e-01 -6.0700859890550747e-02 0.0000000000000000e+00 +4.0100000000000000e+02 7.0985169178347163e-01 -5.8741715854676947e-02 0.0000000000000000e+00 +4.0200000000000000e+02 2.1565424824513924e-01 -3.4176413370784503e-01 0.0000000000000000e+00 +4.0300000000000000e+02 2.5855123470114705e-01 -3.4768947827299701e-01 0.0000000000000000e+00 +4.0400000000000000e+02 8.0088826032229443e-02 -1.4442678063756823e-01 0.0000000000000000e+00 +4.0500000000000000e+02 4.3910374213193254e-01 -3.9444189186759299e-01 0.0000000000000000e+00 +4.0600000000000000e+02 1.7870493683085581e-01 -1.3495151129768518e-01 0.0000000000000000e+00 +4.0700000000000000e+02 4.0839069874296308e-01 -8.9520007036036256e-02 0.0000000000000000e+00 +4.0800000000000000e+02 6.8874189946081532e-01 -2.8376647300272484e-01 0.0000000000000000e+00 +4.0900000000000000e+02 3.8985344508118835e-01 -9.4259972797395605e-02 0.0000000000000000e+00 +4.1000000000000000e+02 3.4413363527559043e-01 -3.4538906156776411e-01 0.0000000000000000e+00 +4.1100000000000000e+02 5.2212229223846363e-01 -6.7669267490920726e-02 0.0000000000000000e+00 +4.1200000000000000e+02 6.4208923126134010e-01 -7.4848254150770802e-02 0.0000000000000000e+00 +4.1300000000000000e+02 8.2545116785822414e-01 -1.0069734499319251e-01 0.0000000000000000e+00 +4.1400000000000000e+02 2.7396199138234845e-01 -1.3742577919543958e-01 0.0000000000000000e+00 +4.1500000000000000e+02 8.4356352062969242e-01 -1.0405115179448597e-01 0.0000000000000000e+00 +4.1600000000000000e+02 4.4102657419878621e-01 -1.0133975905371025e-01 0.0000000000000000e+00 +4.1700000000000000e+02 8.0711429142075197e-01 -9.6177324613957879e-02 0.0000000000000000e+00 +4.1800000000000000e+02 5.4588742338429097e-01 -3.0861656626804967e-01 0.0000000000000000e+00 +4.1900000000000000e+02 8.2200519297721408e-01 -1.9181325684756265e-01 0.0000000000000000e+00 +4.2000000000000000e+02 6.0545469270503705e-01 -2.9515347416455912e-01 0.0000000000000000e+00 +4.2100000000000000e+02 9.1494479815064006e-02 -1.9962305238324141e-01 0.0000000000000000e+00 +4.2200000000000000e+02 3.1992201732694348e-01 -3.4041920004748799e-01 0.0000000000000000e+00 +4.2300000000000000e+02 7.6283867764360491e-01 -2.1769150866161299e-01 0.0000000000000000e+00 +4.2400000000000000e+02 1.0996877619174941e-01 -1.5996351276337120e-01 0.0000000000000000e+00 +4.2500000000000000e+02 4.2504682976914593e-01 -3.7259040788896369e-01 0.0000000000000000e+00 +4.2600000000000000e+02 5.7023544897078227e-01 -7.9112173085952475e-02 0.0000000000000000e+00 +4.2700000000000000e+02 1.5837868273012351e-01 -1.3761703212724882e-01 0.0000000000000000e+00 +4.2800000000000000e+02 7.3322404402194252e-01 -2.3792960640892252e-01 0.0000000000000000e+00 +4.2900000000000000e+02 3.7310963874081604e-01 -3.4669682464658186e-01 0.0000000000000000e+00 +4.3000000000000000e+02 6.5694019888194322e-01 -2.7803963743262755e-01 0.0000000000000000e+00 +4.3100000000000000e+02 1.6713464097055897e-01 -2.9618401073724515e-01 0.0000000000000000e+00 +4.3200000000000000e+02 5.6575365038590020e-01 -3.0377994627746441e-01 0.0000000000000000e+00 +4.3300000000000000e+02 8.2822718257866057e-01 -1.5596241751491660e-01 0.0000000000000000e+00 +4.3400000000000000e+02 8.4289706410177256e-01 -1.4079012617675590e-01 0.0000000000000000e+00 +4.3500000000000000e+02 7.4758995199953460e-01 -2.2783955716619939e-01 0.0000000000000000e+00 +4.3600000000000000e+02 3.9916333981252394e-01 -3.5799747389489589e-01 0.0000000000000000e+00 +4.3700000000000000e+02 3.1158633151494075e-01 -1.2910331053941315e-01 0.0000000000000000e+00 +4.3800000000000000e+02 2.5369299158115671e-01 -1.4116517740427648e-01 0.0000000000000000e+00 +4.3900000000000000e+02 2.9246545029933779e-01 -1.3345906220835824e-01 0.0000000000000000e+00 +4.4000000000000000e+02 2.9692555799377418e-01 -3.3587199145079460e-01 0.0000000000000000e+00 +4.4100000000000000e+02 7.5449923404326802e-01 -8.2899125934399784e-02 0.0000000000000000e+00 +4.4200000000000000e+02 7.7676734983864193e-01 -2.0871882007285178e-01 0.0000000000000000e+00 +4.4300000000000000e+02 5.1894999602646696e-01 -3.3526181573457725e-01 0.0000000000000000e+00 +4.4400000000000000e+02 4.8141733832587297e-01 -3.8336570069543813e-01 0.0000000000000000e+00 +4.4500000000000000e+02 5.1588734689581883e-01 -8.6794863223167762e-02 0.0000000000000000e+00 +4.4600000000000000e+02 2.1239498428661954e-01 -1.4834474068452971e-01 0.0000000000000000e+00 +4.4700000000000000e+02 4.9682446687023574e-01 -8.9711098683164417e-02 0.0000000000000000e+00 +4.4800000000000000e+02 6.0590993824802608e-01 -7.6484833984451786e-02 0.0000000000000000e+00 +4.4900000000000000e+02 7.1075848697441740e-02 -1.6230464390746061e-01 0.0000000000000000e+00 +4.5000000000000000e+02 5.5220890982126636e-01 -8.1816222130946539e-02 0.0000000000000000e+00 +4.5100000000000000e+02 2.0394329643218967e-01 -3.2423811743501740e-01 0.0000000000000000e+00 +4.5200000000000000e+02 6.2380175576103059e-01 -7.5288875123045162e-02 0.0000000000000000e+00 +4.5300000000000000e+02 7.0329831125809950e-01 -2.5547434369421412e-01 0.0000000000000000e+00 +4.5400000000000000e+02 4.7833172014603537e-01 -9.3499109265687413e-02 0.0000000000000000e+00 +4.5500000000000000e+02 6.8022071531616524e-01 -7.5110297023417094e-02 0.0000000000000000e+00 +4.5600000000000000e+02 6.6058578429872084e-01 -7.4777491938300522e-02 0.0000000000000000e+00 +4.5700000000000000e+02 2.3316462488014023e-01 -1.4448008949687055e-01 0.0000000000000000e+00 +4.5800000000000000e+02 8.5302110481769056e-01 -1.2196251618149277e-01 0.0000000000000000e+00 +4.5900000000000000e+02 5.2524316075867994e-01 -3.1377172937902431e-01 0.0000000000000000e+00 +4.6000000000000000e+02 2.5001861131444686e-01 -3.2786400720483649e-01 0.0000000000000000e+00 +4.6100000000000000e+02 9.0310699284769952e-02 -1.6178673364057106e-01 0.0000000000000000e+00 +4.6200000000000000e+02 5.8604641150648895e-01 -2.9905177196765576e-01 0.0000000000000000e+00 +4.6300000000000000e+02 3.6575583536398337e-01 -1.1721790795913740e-01 0.0000000000000000e+00 +4.6400000000000000e+02 8.1543141327025248e-01 -1.7085515895324582e-01 0.0000000000000000e+00 +4.6500000000000000e+02 7.9005131715816856e-01 -1.9713156499598122e-01 0.0000000000000000e+00 +4.6600000000000000e+02 1.0406148785955663e-01 -2.1635754695689660e-01 0.0000000000000000e+00 +4.6700000000000000e+02 5.0007617556224060e-01 -3.7857381733675416e-01 0.0000000000000000e+00 +4.6800000000000000e+02 4.5961083553343640e-01 -9.7285393982506324e-02 0.0000000000000000e+00 +4.6900000000000000e+02 2.7322344864001219e-01 -3.3132866023188701e-01 0.0000000000000000e+00 +4.7000000000000000e+02 1.9207749349845235e-01 -1.5085915569161565e-01 0.0000000000000000e+00 +4.7100000000000000e+02 1.5284347144627389e-01 -2.6250111370043644e-01 0.0000000000000000e+00 +4.7200000000000000e+02 6.4025701322233319e-01 -2.8475309142474037e-01 0.0000000000000000e+00 +4.7300000000000000e+02 3.4836014477349575e-01 -1.2038625198748781e-01 0.0000000000000000e+00 +4.7400000000000000e+02 1.3006963207702860e-01 -1.5824254336138749e-01 0.0000000000000000e+00 +4.7500000000000000e+02 7.1821609483445104e-01 -2.4668369663433465e-01 0.0000000000000000e+00 +4.7600000000000000e+02 8.0266638349028641e-01 -1.8452955791769654e-01 0.0000000000000000e+00 +4.7700000000000000e+02 7.8935840768210574e-01 -9.1999855706285369e-02 0.0000000000000000e+00 +4.7800000000000000e+02 7.3668440379112798e-01 -8.0200420846351428e-02 0.0000000000000000e+00 +4.7900000000000000e+02 1.1880867103697886e-01 -2.3296148123225069e-01 0.0000000000000000e+00 +4.8000000000000000e+02 2.2660988890170039e-01 -3.2484590629706184e-01 0.0000000000000000e+00 +4.8100000000000000e+02 3.2974174007749996e-01 -1.2437636252835665e-01 0.0000000000000000e+00 +4.8200000000000000e+02 1.3461296115645807e-01 -2.4807001618426378e-01 0.0000000000000000e+00 +4.8300000000000000e+02 1.8636247707584924e-01 -3.0917955015691173e-01 0.0000000000000000e+00 +4.8400000000000000e+02 4.2229332914837264e-01 -1.0594380215478319e-01 0.0000000000000000e+00 +4.8500000000000000e+02 7.7184133925494969e-01 -8.7761594091415110e-02 0.0000000000000000e+00 +4.8600000000000000e+02 6.7228004892694659e-01 -2.7064012150778394e-01 0.0000000000000000e+00 +4.8700000000000000e+02 6.2349648396435153e-01 -2.8985024303313017e-01 0.0000000000000000e+00 +4.8800000000000000e+02 5.3436466081165857e-01 -8.4492658277813479e-02 0.0000000000000000e+00 +4.8900000000000000e+02 5.1188026353904070e-01 -3.5827744532688122e-01 0.0000000000000000e+00 +4.9000000000000000e+02 5.1689253597873697e-01 -3.7759354760536890e-01 0.0000000000000000e+00 +4.9100000000000000e+02 5.8808220431727809e-01 -7.7493804481715084e-02 0.0000000000000000e+00 +4.9200000000000000e+02 6.9860988915990552e-01 -7.7001513203856037e-02 0.0000000000000000e+00 +4.9300000000000000e+02 4.9645954936903319e-01 -3.4089069912317393e-01 0.0000000000000000e+00 +4.9400000000000000e+02 2.4772423574133182e-01 -1.6120366389394442e-01 0.0000000000000000e+00 +4.9500000000000000e+02 4.5367106542304414e-01 -1.1738081647841003e-01 0.0000000000000000e+00 +4.9600000000000000e+02 5.7122139946592421e-01 -2.8368921023593441e-01 0.0000000000000000e+00 +4.9700000000000000e+02 8.3295744048918385e-01 -1.2090267162572201e-01 0.0000000000000000e+00 +4.9800000000000000e+02 3.3547377162913117e-01 -3.2477558968213066e-01 0.0000000000000000e+00 +4.9900000000000000e+02 5.3216804721450484e-01 -2.9283448441112914e-01 0.0000000000000000e+00 +5.0000000000000000e+02 5.8104013142718514e-01 -9.7602356749532493e-02 0.0000000000000000e+00 +5.0100000000000000e+02 7.4609809708963004e-01 -2.0635579640763085e-01 0.0000000000000000e+00 +5.0200000000000000e+02 2.6739153940589644e-01 -1.5709294381793035e-01 0.0000000000000000e+00 +5.0300000000000000e+02 4.4805065660249643e-01 -3.7604939965039380e-01 0.0000000000000000e+00 +5.0400000000000000e+02 3.1224389544289805e-01 -3.1990715779144679e-01 0.0000000000000000e+00 +5.0500000000000000e+02 4.2058106414118307e-01 -3.4580896850541260e-01 0.0000000000000000e+00 +5.0600000000000000e+02 6.8847994973322935e-01 -2.6316530529804105e-01 0.0000000000000000e+00 +5.0700000000000000e+02 4.0325976698713339e-01 -1.0957721938875531e-01 0.0000000000000000e+00 +5.0800000000000000e+02 3.8436271636836500e-01 -1.1401326965322703e-01 0.0000000000000000e+00 +5.0900000000000000e+02 8.0897203637512682e-01 -1.5092244334084384e-01 0.0000000000000000e+00 +5.1000000000000000e+02 1.7122791374123331e-01 -2.7477618144686311e-01 0.0000000000000000e+00 +5.1100000000000000e+02 3.5623036372381522e-01 -3.2855185597482639e-01 0.0000000000000000e+00 +5.1200000000000000e+02 1.7089398116143470e-01 -1.5374960115250461e-01 0.0000000000000000e+00 +5.1300000000000000e+02 5.5176906899475542e-01 -2.8823878570191641e-01 0.0000000000000000e+00 +5.1400000000000000e+02 5.0407156214769122e-01 -3.1851461702097478e-01 0.0000000000000000e+00 +5.1500000000000000e+02 2.6524087549654274e-01 -3.1151145666579511e-01 0.0000000000000000e+00 +5.1600000000000000e+02 1.0023818717607072e-01 -1.7975040068316439e-01 0.0000000000000000e+00 +5.1700000000000000e+02 2.0559321401968975e-01 -1.6655681905060593e-01 0.0000000000000000e+00 +5.1800000000000000e+02 7.1667870531930788e-01 -2.2658298238249899e-01 0.0000000000000000e+00 +5.1900000000000000e+02 3.9700592664828971e-01 -3.3380008667562505e-01 0.0000000000000000e+00 +5.2000000000000000e+02 2.8858864148537272e-01 -3.1519950914257533e-01 0.0000000000000000e+00 +5.2100000000000000e+02 1.5044008544889434e-01 -1.5640151636728802e-01 0.0000000000000000e+00 +5.2200000000000000e+02 7.5988074347428880e-01 -1.9665711972423666e-01 0.0000000000000000e+00 +5.2300000000000000e+02 7.1849442451206602e-01 -7.9152342647119775e-02 0.0000000000000000e+00 +5.2400000000000000e+02 2.1372235827621833e-01 -3.0254509688785047e-01 0.0000000000000000e+00 +5.2500000000000000e+02 8.2120357158849966e-01 -1.3660207133942401e-01 0.0000000000000000e+00 +5.2600000000000000e+02 7.3150765510089388e-01 -2.1669616413702375e-01 0.0000000000000000e+00 +5.2700000000000000e+02 8.1333345438097382e-01 -1.1691463617765652e-01 0.0000000000000000e+00 +5.2800000000000000e+02 5.9011734176707231e-01 -2.7946614021763194e-01 0.0000000000000000e+00 +5.2900000000000000e+02 2.4050829498058990e-01 -3.0740275675834006e-01 0.0000000000000000e+00 +5.3000000000000000e+02 2.2655675649616186e-01 -1.6413616295593572e-01 0.0000000000000000e+00 +5.3100000000000000e+02 1.1238029469840778e-01 -1.9689693065292688e-01 0.0000000000000000e+00 +5.3200000000000000e+02 1.2079548418913866e-01 -1.7791986322703138e-01 0.0000000000000000e+00 +5.3300000000000000e+02 5.0959040661204691e-01 -1.0721783097904954e-01 0.0000000000000000e+00 +5.3400000000000000e+02 4.7253929361375496e-01 -1.1339799809992097e-01 0.0000000000000000e+00 +5.3500000000000000e+02 5.9816052302326095e-01 -9.5170718403216559e-02 0.0000000000000000e+00 +5.3600000000000000e+02 5.6318321755320788e-01 -9.9326345730053014e-02 0.0000000000000000e+00 +5.3700000000000000e+02 6.3322541326844695e-01 -9.2542389093525967e-02 0.0000000000000000e+00 +5.3800000000000000e+02 6.1563978056404323e-01 -9.3263776368194676e-02 0.0000000000000000e+00 +5.3900000000000000e+02 4.9129409992652262e-01 -1.0962306090576540e-01 0.0000000000000000e+00 +5.4000000000000000e+02 6.7044298537096669e-01 -9.2522284306329000e-02 0.0000000000000000e+00 +5.4100000000000000e+02 5.1122707289372493e-01 -2.9746618420616688e-01 0.0000000000000000e+00 +5.4200000000000000e+02 6.5201931266926827e-01 -9.2005756316602988e-02 0.0000000000000000e+00 +5.4300000000000000e+02 3.2409278980941592e-01 -1.4389507805812407e-01 0.0000000000000000e+00 +5.4400000000000000e+02 6.8784608478865117e-01 -2.4370096785653589e-01 0.0000000000000000e+00 +5.4500000000000000e+02 7.0249861172967742e-01 -2.3558712658478501e-01 0.0000000000000000e+00 +5.4600000000000000e+02 7.9718040424185344e-01 -1.6509832167723784e-01 0.0000000000000000e+00 +5.4700000000000000e+02 1.9105489295431199e-01 -2.8804909055791073e-01 0.0000000000000000e+00 +5.4800000000000000e+02 7.7396699136158020e-01 -1.9002482310137875e-01 0.0000000000000000e+00 +5.4900000000000000e+02 1.8471519770941705e-01 -1.7002996017790087e-01 0.0000000000000000e+00 +5.5000000000000000e+02 4.8841662124227758e-01 -3.6203504340701642e-01 0.0000000000000000e+00 +5.5100000000000000e+02 3.7870248241277965e-01 -1.3308345989381565e-01 0.0000000000000000e+00 +5.5200000000000000e+02 1.7446356955228731e-01 -2.5446931414431961e-01 0.0000000000000000e+00 +5.5300000000000000e+02 3.7679860457300129e-01 -3.1774840633846380e-01 0.0000000000000000e+00 +5.5400000000000000e+02 3.6127909829472399e-01 -1.3681709689333579e-01 0.0000000000000000e+00 +5.5500000000000000e+02 7.9439342230124133e-01 -1.1245492497755147e-01 0.0000000000000000e+00 +5.5600000000000000e+02 7.4321337597168247e-01 -9.6876814162467226e-02 0.0000000000000000e+00 +5.5700000000000000e+02 1.2431754202658317e-01 -2.1333184328888904e-01 0.0000000000000000e+00 +5.5800000000000000e+02 4.6687291845142914e-01 -3.6880350928938843e-01 0.0000000000000000e+00 +5.5900000000000000e+02 4.3544437590268664e-01 -1.2110729058413415e-01 0.0000000000000000e+00 +5.6000000000000000e+02 3.0573287945426036e-01 -1.4854740327267285e-01 0.0000000000000000e+00 +5.6100000000000000e+02 6.5740468639020122e-01 -2.5799083276046936e-01 0.0000000000000000e+00 +5.6200000000000000e+02 6.0863656852361436e-01 -2.7527755237923557e-01 0.0000000000000000e+00 +5.6300000000000000e+02 4.4747100682020802e-01 -3.5235387926852668e-01 0.0000000000000000e+00 +5.6400000000000000e+02 5.2748211632278119e-01 -1.0404008035520325e-01 0.0000000000000000e+00 +5.6500000000000000e+02 6.8900981868500666e-01 -9.4674819291650850e-02 0.0000000000000000e+00 +5.6600000000000000e+02 1.5630569699271904e-01 -2.4191687707153045e-01 0.0000000000000000e+00 +5.6700000000000000e+02 7.5864626110906508e-01 -1.0363466715834009e-01 0.0000000000000000e+00 +5.6800000000000000e+02 6.4230468343053804e-01 -2.6416254863862337e-01 0.0000000000000000e+00 +5.6900000000000000e+02 1.4273726300497611e-01 -1.7606267978598059e-01 0.0000000000000000e+00 +5.7000000000000000e+02 5.9061616687713225e-01 -1.1379775533152585e-01 0.0000000000000000e+00 +5.7100000000000000e+02 4.1659197220639782e-01 -1.2505219247683830e-01 0.0000000000000000e+00 +5.7200000000000000e+02 3.9768109012847397e-01 -1.2986664797273006e-01 0.0000000000000000e+00 +5.7300000000000000e+02 6.2543456472224646e-01 -1.1067106010143521e-01 0.0000000000000000e+00 +5.7400000000000000e+02 2.8676537265771557e-01 -1.5250484152413096e-01 0.0000000000000000e+00 +5.7500000000000000e+02 5.4562110508196371e-01 -1.0075690846814232e-01 0.0000000000000000e+00 +5.7600000000000000e+02 6.7234989522874633e-01 -2.5153859119899907e-01 0.0000000000000000e+00 +5.7700000000000000e+02 2.8023643846566509e-01 -2.9571553411581775e-01 0.0000000000000000e+00 +5.7800000000000000e+02 4.1576835890646374e-01 -3.2395268535380684e-01 0.0000000000000000e+00 +5.7900000000000000e+02 3.2829114267166132e-01 -3.0286134776882917e-01 0.0000000000000000e+00 +5.8000000000000000e+02 5.3824014717536461e-01 -2.7286770375781749e-01 0.0000000000000000e+00 +5.8100000000000000e+02 1.9331334034685177e-01 -2.6708465219374278e-01 0.0000000000000000e+00 +5.8200000000000000e+02 4.8258089908080731e-01 -3.2294514628378668e-01 0.0000000000000000e+00 +5.8300000000000000e+02 3.0391726790953294e-01 -2.9915670294774277e-01 0.0000000000000000e+00 +5.8400000000000000e+02 7.7559886493302388e-01 -1.0771928376529573e-01 0.0000000000000000e+00 +5.8500000000000000e+02 4.6686835282245082e-01 -1.3301395857087631e-01 0.0000000000000000e+00 +5.8600000000000000e+02 6.2589604933185006e-01 -2.7040958540287485e-01 0.0000000000000000e+00 +5.8700000000000000e+02 2.6092901028100729e-01 -1.7644742618211934e-01 0.0000000000000000e+00 +5.8800000000000000e+02 7.4524091386978253e-01 -1.8412957354115164e-01 0.0000000000000000e+00 +5.8900000000000000e+02 7.8391115422182711e-01 -1.7835059160716460e-01 0.0000000000000000e+00 +5.9000000000000000e+02 5.7606607228039364e-01 -2.6398606178081391e-01 0.0000000000000000e+00 +5.9100000000000000e+02 1.3277861345172212e-01 -1.9481531521959544e-01 0.0000000000000000e+00 +5.9200000000000000e+02 6.8700747184572841e-01 -2.2385538743385044e-01 0.0000000000000000e+00 +5.9300000000000000e+02 5.5678246361523676e-01 -2.6845284687567444e-01 0.0000000000000000e+00 +5.9400000000000000e+02 3.4292245252969228e-01 -1.4059574346030135e-01 0.0000000000000000e+00 +5.9500000000000000e+02 2.3332468227785580e-01 -2.8885631314746646e-01 0.0000000000000000e+00 +5.9600000000000000e+02 4.7356805444583455e-01 -3.4569740095115475e-01 0.0000000000000000e+00 +5.9700000000000000e+02 3.5295517927592529e-01 -3.0739007520489825e-01 0.0000000000000000e+00 +5.9800000000000000e+02 1.3852691055110555e-01 -2.2794725517855274e-01 0.0000000000000000e+00 +5.9900000000000000e+02 7.0133612318251592e-01 -2.1543957354800156e-01 0.0000000000000000e+00 +6.0000000000000000e+02 6.0754670186946147e-01 -1.1205388592653995e-01 0.0000000000000000e+00 +6.0100000000000000e+02 8.0145532824276633e-01 -1.3186237620863467e-01 0.0000000000000000e+00 +6.0200000000000000e+02 7.0802767112474974e-01 -9.7525786167618339e-02 0.0000000000000000e+00 +6.0300000000000000e+02 4.9067585777197859e-01 -3.0200661966359027e-01 0.0000000000000000e+00 +6.0400000000000000e+02 3.3731011711342695e-01 -1.6008347190586131e-01 0.0000000000000000e+00 +6.0500000000000000e+02 2.1998680855399780e-01 -1.8318973398172694e-01 0.0000000000000000e+00 +6.0600000000000000e+02 5.7352270320691423e-01 -1.1648872693719989e-01 0.0000000000000000e+00 +6.0700000000000000e+02 6.4266432734342571e-01 -1.1041812957162285e-01 0.0000000000000000e+00 +6.0800000000000000e+02 5.0316670986451806e-01 -1.2639292894153392e-01 0.0000000000000000e+00 +6.0900000000000000e+02 5.1849629141013620e-01 -2.7670925174600469e-01 0.0000000000000000e+00 +6.1000000000000000e+02 6.7234026531110380e-01 -2.3137662647572707e-01 0.0000000000000000e+00 +6.1100000000000000e+02 2.5751508684990276e-01 -2.9206828723175754e-01 0.0000000000000000e+00 +6.1200000000000000e+02 4.0073527043361318e-01 -3.0590594009386929e-01 0.0000000000000000e+00 +6.1300000000000000e+02 1.9949320714123134e-01 -1.8536004713267526e-01 0.0000000000000000e+00 +6.1400000000000000e+02 4.8504658701079595e-01 -1.2990325663330327e-01 0.0000000000000000e+00 +6.1500000000000000e+02 3.9202124992820397e-01 -1.4902539229872205e-01 0.0000000000000000e+00 +6.1600000000000000e+02 1.7676853558580399e-01 -2.3274902175140866e-01 0.0000000000000000e+00 +6.1700000000000000e+02 1.9593435215191188e-01 -2.4533946246704735e-01 0.0000000000000000e+00 +6.1800000000000000e+02 3.7343082785968262e-01 -1.5262867160273105e-01 0.0000000000000000e+00 +6.1900000000000000e+02 7.3007509849922814e-01 -1.9501129097461409e-01 0.0000000000000000e+00 +6.2000000000000000e+02 6.7939292835572396e-01 -1.1164017889946833e-01 0.0000000000000000e+00 +6.2100000000000000e+02 2.8068678235396971e-01 -1.7261842339598285e-01 0.0000000000000000e+00 +6.2200000000000000e+02 7.2664824966785935e-01 -9.9232834700177422e-02 0.0000000000000000e+00 +6.2300000000000000e+02 1.6323062973055019e-01 -1.7429505616666449e-01 0.0000000000000000e+00 +6.2400000000000000e+02 7.1513701339702784e-01 -2.0620940823105169e-01 0.0000000000000000e+00 +6.2500000000000000e+02 2.4025659411437972e-01 -1.8024810650843556e-01 0.0000000000000000e+00 +6.2600000000000000e+02 2.1207143655579638e-01 -2.7978390292199112e-01 0.0000000000000000e+00 +6.2700000000000000e+02 4.4888573256332276e-01 -1.3731105915545405e-01 0.0000000000000000e+00 +6.2800000000000000e+02 4.3777111896882337e-01 -3.2706840677022997e-01 0.0000000000000000e+00 +6.2900000000000000e+02 5.9389225156189696e-01 -2.5999550625802242e-01 0.0000000000000000e+00 +6.3000000000000000e+02 3.1885076964659770e-01 -1.6368234299628553e-01 0.0000000000000000e+00 +6.3100000000000000e+02 7.4127670871718931e-01 -1.1827326313490347e-01 0.0000000000000000e+00 +6.3200000000000000e+02 6.4284735119195413e-01 -2.4500999083013361e-01 0.0000000000000000e+00 +6.3300000000000000e+02 2.9984885106209308e-01 -1.6772218155772609e-01 0.0000000000000000e+00 +6.3400000000000000e+02 5.2080158977980273e-01 -1.2373614401298699e-01 0.0000000000000000e+00 +6.3500000000000000e+02 7.8933365190731741e-01 -1.4689119864664443e-01 0.0000000000000000e+00 +6.3600000000000000e+02 5.6192955697754021e-01 -2.4796309178804940e-01 0.0000000000000000e+00 +6.3700000000000000e+02 6.0051701695570769e-01 -1.3086883470903993e-01 0.0000000000000000e+00 +6.3800000000000000e+02 7.8137928393191503e-01 -1.2803058080285629e-01 0.0000000000000000e+00 +6.3900000000000000e+02 6.8572804103609941e-01 -2.0420195769541513e-01 0.0000000000000000e+00 +6.4000000000000000e+02 3.1904752293558614e-01 -2.8251654194476350e-01 0.0000000000000000e+00 +6.4100000000000000e+02 6.6094244813302672e-01 -1.1030561094316932e-01 0.0000000000000000e+00 +6.4200000000000000e+02 2.9521902032302710e-01 -2.7999385429129936e-01 0.0000000000000000e+00 +6.4300000000000000e+02 3.5592741666835664e-01 -1.5598388571205957e-01 0.0000000000000000e+00 +6.4400000000000000e+02 2.3002294319392530e-01 -2.7009461790727562e-01 0.0000000000000000e+00 +6.4500000000000000e+02 1.5838486034769686e-01 -2.1985734519531880e-01 0.0000000000000000e+00 +6.4600000000000000e+02 5.4337242234599126e-01 -2.5150341572460111e-01 0.0000000000000000e+00 +6.4700000000000000e+02 4.1035319649845087e-01 -1.4549371774031550e-01 0.0000000000000000e+00 +6.4800000000000000e+02 7.1867251430601320e-01 -1.1974030012328292e-01 0.0000000000000000e+00 +6.4900000000000000e+02 4.6063690335432661e-01 -3.2722416228828549e-01 0.0000000000000000e+00 +6.5000000000000000e+02 3.7379760568308223e-01 -2.9059661742517973e-01 0.0000000000000000e+00 +6.5100000000000000e+02 2.5383609363606441e-01 -1.9539240146106651e-01 0.0000000000000000e+00 +6.5200000000000000e+02 6.9748563196412694e-01 -1.1387575092541023e-01 0.0000000000000000e+00 +6.5300000000000000e+02 2.5041200257850488e-01 -2.7223502646048414e-01 0.0000000000000000e+00 +6.5400000000000000e+02 2.3295814883961635e-01 -1.9889442477728531e-01 0.0000000000000000e+00 +6.5500000000000000e+02 4.7065538131909573e-01 -3.0555608436024528e-01 0.0000000000000000e+00 +6.5600000000000000e+02 6.5769066425811973e-01 -2.3907363284604999e-01 0.0000000000000000e+00 +6.5700000000000000e+02 7.6244627128027076e-01 -1.2398495368785037e-01 0.0000000000000000e+00 +6.5800000000000000e+02 3.4503974932394027e-01 -2.8571058234836749e-01 0.0000000000000000e+00 +6.5900000000000000e+02 6.2773247425333956e-01 -2.5030672162888939e-01 0.0000000000000000e+00 +6.6000000000000000e+02 6.6956576097724985e-01 -1.2951945415110799e-01 0.0000000000000000e+00 +6.6100000000000000e+02 4.2984360054075554e-01 -1.4132671480713993e-01 0.0000000000000000e+00 +6.6200000000000000e+02 2.1401517398850856e-01 -2.5863320542124990e-01 0.0000000000000000e+00 +6.6300000000000000e+02 6.4325109929694801e-01 -2.2618371510865268e-01 0.0000000000000000e+00 +6.6400000000000000e+02 1.7748718689268195e-01 -1.8977833254675064e-01 0.0000000000000000e+00 +6.6500000000000000e+02 6.3437847073077924e-01 -1.2854187066903974e-01 0.0000000000000000e+00 +6.6600000000000000e+02 6.7191589171093102e-01 -2.1222089015711848e-01 0.0000000000000000e+00 +6.6700000000000000e+02 6.5762723405424273e-01 -2.1983703701840421e-01 0.0000000000000000e+00 +6.6800000000000000e+02 5.5674907617550085e-01 -1.1921536594864866e-01 0.0000000000000000e+00 +6.6900000000000000e+02 2.7257361308095140e-01 -2.7657387566502206e-01 0.0000000000000000e+00 +6.7000000000000000e+02 6.1697966306471230e-01 -1.2964587093813562e-01 0.0000000000000000e+00 +6.7100000000000000e+02 7.2827719646794720e-01 -1.7537331507189566e-01 0.0000000000000000e+00 +6.7200000000000000e+02 6.5186733719982237e-01 -1.2884460573693324e-01 0.0000000000000000e+00 +6.7300000000000000e+02 5.3919726273495960e-01 -1.2140104487479240e-01 0.0000000000000000e+00 +6.7400000000000000e+02 4.9839235228194784e-01 -2.8133582996964807e-01 0.0000000000000000e+00 +6.7500000000000000e+02 7.4280650635435574e-01 -1.6196076151997352e-01 0.0000000000000000e+00 +6.7600000000000000e+02 3.5043055988806593e-01 -1.7532954577300527e-01 0.0000000000000000e+00 +6.7700000000000000e+02 6.2867217091463690e-01 -2.3172532817289332e-01 0.0000000000000000e+00 +6.7800000000000000e+02 1.7611935411154672e-01 -2.1120097042877314e-01 0.0000000000000000e+00 +6.7900000000000000e+02 2.1195587260262144e-01 -2.0178405947477143e-01 0.0000000000000000e+00 +6.8000000000000000e+02 1.9981385470054297e-01 -2.2234925790508697e-01 0.0000000000000000e+00 +6.8100000000000000e+02 5.2423517785618046e-01 -2.5578971736194323e-01 0.0000000000000000e+00 +6.8200000000000000e+02 4.9749648581614919e-01 -1.4581674806384642e-01 0.0000000000000000e+00 +6.8300000000000000e+02 4.0554494836017102e-01 -1.6507982540801422e-01 0.0000000000000000e+00 +6.8400000000000000e+02 4.7960716890711569e-01 -1.4936398656507258e-01 0.0000000000000000e+00 +6.8500000000000000e+02 7.3270290107901870e-01 -1.3976983112688512e-01 0.0000000000000000e+00 +6.8600000000000000e+02 7.7898542684218341e-01 -1.6093203981873833e-01 0.0000000000000000e+00 +6.8700000000000000e+02 6.1075839340008575e-01 -2.5500809985947998e-01 0.0000000000000000e+00 +6.8800000000000000e+02 3.8594899532275984e-01 -1.6854706100871095e-01 0.0000000000000000e+00 +6.8900000000000000e+02 2.7483006689300810e-01 -1.9235410376781389e-01 0.0000000000000000e+00 +6.9000000000000000e+02 4.6108314319814853e-01 -1.5345554266922895e-01 0.0000000000000000e+00 +6.9100000000000000e+02 6.9999005365677991e-01 -1.9464944986396773e-01 0.0000000000000000e+00 +6.9200000000000000e+02 7.6194724988141305e-01 -1.7020852645240730e-01 0.0000000000000000e+00 +6.9300000000000000e+02 1.4196718375639486e-01 -2.1016210297359686e-01 0.0000000000000000e+00 +6.9400000000000000e+02 1.5633029817121902e-01 -1.9628453189685813e-01 0.0000000000000000e+00 +6.9500000000000000e+02 4.2630597774266982e-01 -3.0502534077095655e-01 0.0000000000000000e+00 +6.9600000000000000e+02 5.8003504517640192e-01 -2.4448076983638234e-01 0.0000000000000000e+00 +6.9700000000000000e+02 3.3164190690411527e-01 -1.7839623735098767e-01 0.0000000000000000e+00 +6.9800000000000000e \ No newline at end of file diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/vein_connectors1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/vein_connectors1.dat new file mode 100644 index 0000000..860e7d7 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/vein_connectors1.dat @@ -0,0 +1 @@ +1.0000000000000000e+00 7.0000000000000000e+01 4.5000000000000000e+01 7.1000000000000000e+01 0.0000000000000000e+00 -2.1630189438656435e-02 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins1.dat new file mode 100644 index 0000000..09e8173 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins1.dat @@ -0,0 +1,22 @@ +1.0000000000000000e+00 4.5000000000000000e+01 +2.0000000000000000e+00 7.1000000000000000e+01 +3.0000000000000000e+00 7.2000000000000000e+01 +4.0000000000000000e+00 4.4000000000000000e+01 +5.0000000000000000e+00 7.3000000000000000e+01 +6.0000000000000000e+00 7.4000000000000000e+01 +7.0000000000000000e+00 4.3000000000000000e+01 +8.0000000000000000e+00 7.5000000000000000e+01 +9.0000000000000000e+00 7.6000000000000000e+01 +1.0000000000000000e+01 4.2000000000000000e+01 +1.1000000000000000e+01 7.7000000000000000e+01 +1.2000000000000000e+01 4.1000000000000000e+01 +1.3000000000000000e+01 7.8000000000000000e+01 +1.4000000000000000e+01 4.0000000000000000e+01 +1.5000000000000000e+01 7.9000000000000000e+01 +1.6000000000000000e+01 3.9000000000000000e+01 +1.7000000000000000e+01 8.0000000000000000e+01 +1.8000000000000000e+01 3.8000000000000000e+01 +1.9000000000000000e+01 8.1000000000000000e+01 +2.0000000000000000e+01 3.7000000000000000e+01 +2.1000000000000000e+01 8.2000000000000000e+01 +2.2000000000000000e+01 3.6000000000000000e+01 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_BC1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_BC1.dat new file mode 100644 index 0000000..45a5536 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_BC1.dat @@ -0,0 +1,26 @@ +1.0000000000000000e+00 5.6000000000000000e+01 +2.0000000000000000e+00 5.7000000000000000e+01 +3.0000000000000000e+00 5.5000000000000000e+01 +4.0000000000000000e+00 5.8000000000000000e+01 +5.0000000000000000e+00 5.4000000000000000e+01 +6.0000000000000000e+00 5.9000000000000000e+01 +7.0000000000000000e+00 5.3000000000000000e+01 +8.0000000000000000e+00 6.0000000000000000e+01 +9.0000000000000000e+00 5.2000000000000000e+01 +1.0000000000000000e+01 6.1000000000000000e+01 +1.1000000000000000e+01 5.1000000000000000e+01 +1.2000000000000000e+01 6.2000000000000000e+01 +1.3000000000000000e+01 5.0000000000000000e+01 +1.4000000000000000e+01 6.3000000000000000e+01 +1.5000000000000000e+01 4.9000000000000000e+01 +1.6000000000000000e+01 6.4000000000000000e+01 +1.7000000000000000e+01 6.5000000000000000e+01 +1.8000000000000000e+01 4.8000000000000000e+01 +1.9000000000000000e+01 6.6000000000000000e+01 +2.0000000000000000e+01 6.7000000000000000e+01 +2.1000000000000000e+01 4.7000000000000000e+01 +2.2000000000000000e+01 6.8000000000000000e+01 +2.3000000000000000e+01 6.9000000000000000e+01 +2.4000000000000000e+01 4.6000000000000000e+01 +2.5000000000000000e+01 7.0000000000000000e+01 +2.6000000000000000e+01 4.5000000000000000e+01 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending1.dat new file mode 100644 index 0000000..66cdaee --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending1.dat @@ -0,0 +1,20 @@ +1.0000000000000000e+00 4.5000000000000000e+01 7.1000000000000000e+01 7.2000000000000000e+01 0.0000000000000000e+00 -4.4961547503833347e-14 0.0000000000000000e+00 0.0000000000000000e+00 +2.0000000000000000e+00 7.1000000000000000e+01 7.2000000000000000e+01 4.4000000000000000e+01 0.0000000000000000e+00 5.1623851298957160e-14 0.0000000000000000e+00 0.0000000000000000e+00 +3.0000000000000000e+00 7.2000000000000000e+01 4.4000000000000000e+01 7.3000000000000000e+01 0.0000000000000000e+00 -3.8322376968561563e-02 0.0000000000000000e+00 0.0000000000000000e+00 +4.0000000000000000e+00 4.4000000000000000e+01 7.3000000000000000e+01 7.4000000000000000e+01 0.0000000000000000e+00 4.0933885115281195e-14 0.0000000000000000e+00 0.0000000000000000e+00 +5.0000000000000000e+00 7.3000000000000000e+01 7.4000000000000000e+01 4.3000000000000000e+01 0.0000000000000000e+00 -3.6389087668124719e-14 0.0000000000000000e+00 0.0000000000000000e+00 +6.0000000000000000e+00 7.4000000000000000e+01 4.3000000000000000e+01 7.5000000000000000e+01 0.0000000000000000e+00 -3.3201076959473691e-02 0.0000000000000000e+00 0.0000000000000000e+00 +7.0000000000000000e+00 4.3000000000000000e+01 7.5000000000000000e+01 7.6000000000000000e+01 0.0000000000000000e+00 -3.0432916624125271e-15 0.0000000000000000e+00 0.0000000000000000e+00 +8.0000000000000000e+00 7.5000000000000000e+01 7.6000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9.0000000000000000e+00 7.6000000000000000e+01 4.2000000000000000e+01 7.7000000000000000e+01 0.0000000000000000e+00 -1.2060990775895840e-01 0.0000000000000000e+00 0.0000000000000000e+00 +1.0000000000000000e+01 4.2000000000000000e+01 7.7000000000000000e+01 4.1000000000000000e+01 0.0000000000000000e+00 1.2857653408615434e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.1000000000000000e+01 7.7000000000000000e+01 4.1000000000000000e+01 7.8000000000000000e+01 0.0000000000000000e+00 -7.8233880279589524e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.2000000000000000e+01 4.1000000000000000e+01 7.8000000000000000e+01 4.0000000000000000e+01 0.0000000000000000e+00 9.2695128767034995e-16 0.0000000000000000e+00 0.0000000000000000e+00 +1.3000000000000000e+01 7.8000000000000000e+01 4.0000000000000000e+01 7.9000000000000000e+01 0.0000000000000000e+00 -6.4844022014920691e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.4000000000000000e+01 4.0000000000000000e+01 7.9000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 1.0235434683759758e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.5000000000000000e+01 7.9000000000000000e+01 3.9000000000000000e+01 8.0000000000000000e+01 0.0000000000000000e+00 -1.0225778955166927e-01 0.0000000000000000e+00 0.0000000000000000e+00 +1.6000000000000000e+01 3.9000000000000000e+01 8.0000000000000000e+01 3.8000000000000000e+01 0.0000000000000000e+00 -3.1076463725843014e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.7000000000000000e+01 8.0000000000000000e+01 3.8000000000000000e+01 8.1000000000000000e+01 0.0000000000000000e+00 -3.6281691951366088e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.8000000000000000e+01 3.8000000000000000e+01 8.1000000000000000e+01 3.7000000000000000e+01 0.0000000000000000e+00 -5.9642279159567493e-16 0.0000000000000000e+00 0.0000000000000000e+00 +1.9000000000000000e+01 8.1000000000000000e+01 3.7000000000000000e+01 8.2000000000000000e+01 0.0000000000000000e+00 -3.3330466875348375e-01 0.0000000000000000e+00 0.0000000000000000e+00 +2.0000000000000000e+01 3.7000000000000000e+01 8.2000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -6.4704837086660499e-15 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending_BC1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending_BC1.dat new file mode 100644 index 0000000..b119210 --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_bending_BC1.dat @@ -0,0 +1,24 @@ +1.0000000000000000e+00 5.6000000000000000e+01 5.7000000000000000e+01 5.5000000000000000e+01 0.0000000000000000e+00 -2.0085183222481783e-15 0.0000000000000000e+00 0.0000000000000000e+00 +2.0000000000000000e+00 5.7000000000000000e+01 5.5000000000000000e+01 5.8000000000000000e+01 0.0000000000000000e+00 -2.2124994221941560e-01 0.0000000000000000e+00 0.0000000000000000e+00 +3.0000000000000000e+00 5.5000000000000000e+01 5.8000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 1.2653126352414632e-15 0.0000000000000000e+00 0.0000000000000000e+00 +4.0000000000000000e+00 5.8000000000000000e+01 5.4000000000000000e+01 5.9000000000000000e+01 0.0000000000000000e+00 -8.4268638133571577e-02 0.0000000000000000e+00 0.0000000000000000e+00 +5.0000000000000000e+00 5.4000000000000000e+01 5.9000000000000000e+01 5.3000000000000000e+01 0.0000000000000000e+00 -1.2192937260887587e-15 0.0000000000000000e+00 0.0000000000000000e+00 +6.0000000000000000e+00 5.9000000000000000e+01 5.3000000000000000e+01 6.0000000000000000e+01 0.0000000000000000e+00 4.7903830955056438e-03 0.0000000000000000e+00 0.0000000000000000e+00 +7.0000000000000000e+00 5.3000000000000000e+01 6.0000000000000000e+01 5.2000000000000000e+01 0.0000000000000000e+00 -1.2748792719757903e-15 0.0000000000000000e+00 0.0000000000000000e+00 +8.0000000000000000e+00 6.0000000000000000e+01 5.2000000000000000e+01 6.1000000000000000e+01 0.0000000000000000e+00 6.7283723619563210e-02 0.0000000000000000e+00 0.0000000000000000e+00 +9.0000000000000000e+00 5.2000000000000000e+01 6.1000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -2.5824096994785276e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.0000000000000000e+01 6.1000000000000000e+01 5.1000000000000000e+01 6.2000000000000000e+01 0.0000000000000000e+00 1.7375823853010723e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.1000000000000000e+01 5.1000000000000000e+01 6.2000000000000000e+01 5.0000000000000000e+01 0.0000000000000000e+00 7.6117595610624688e-16 0.0000000000000000e+00 0.0000000000000000e+00 +1.2000000000000000e+01 6.2000000000000000e+01 5.0000000000000000e+01 6.3000000000000000e+01 0.0000000000000000e+00 9.7900311811442778e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.3000000000000000e+01 5.0000000000000000e+01 6.3000000000000000e+01 4.9000000000000000e+01 0.0000000000000000e+00 7.7110242472365063e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.4000000000000000e+01 6.3000000000000000e+01 4.9000000000000000e+01 6.4000000000000000e+01 0.0000000000000000e+00 -3.6231759186091989e-03 0.0000000000000000e+00 0.0000000000000000e+00 +1.5000000000000000e+01 4.9000000000000000e+01 6.4000000000000000e+01 6.5000000000000000e+01 0.0000000000000000e+00 7.2134204503881268e-16 0.0000000000000000e+00 0.0000000000000000e+00 +1.6000000000000000e+01 6.4000000000000000e+01 6.5000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -2.3158876182824000e-15 0.0000000000000000e+00 0.0000000000000000e+00 +1.7000000000000000e+01 6.5000000000000000e+01 4.8000000000000000e+01 6.6000000000000000e+01 0.0000000000000000e+00 -8.3265523033737021e-02 0.0000000000000000e+00 0.0000000000000000e+00 +1.8000000000000000e+01 4.8000000000000000e+01 6.6000000000000000e+01 6.7000000000000000e+01 0.0000000000000000e+00 -4.4726064038959118e-14 0.0000000000000000e+00 0.0000000000000000e+00 +1.9000000000000000e+01 6.6000000000000000e+01 6.7000000000000000e+01 4.7000000000000000e+01 0.0000000000000000e+00 5.2270429340429957e-14 0.0000000000000000e+00 0.0000000000000000e+00 +2.0000000000000000e+01 6.7000000000000000e+01 4.7000000000000000e+01 6.8000000000000000e+01 0.0000000000000000e+00 1.0436943899427788e-01 0.0000000000000000e+00 0.0000000000000000e+00 +2.1000000000000000e+01 4.7000000000000000e+01 6.8000000000000000e+01 6.9000000000000000e+01 0.0000000000000000e+00 5.5847511151593043e-14 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000000e+01 6.8000000000000000e+01 6.9000000000000000e+01 4.6000000000000000e+01 0.0000000000000000e+00 -5.6589788198544434e-14 0.0000000000000000e+00 0.0000000000000000e+00 +2.3000000000000000e+01 6.9000000000000000e+01 4.6000000000000000e+01 7.0000000000000000e+01 0.0000000000000000e+00 -9.4816971092643088e-02 0.0000000000000000e+00 0.0000000000000000e+00 +2.4000000000000000e+01 4.6000000000000000e+01 7.0000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -6.6111033535511229e-16 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension1.dat new file mode 100644 index 0000000..27617de --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension1.dat @@ -0,0 +1,21 @@ +1.0000000000000000e+00 4.5000000000000000e+01 7.1000000000000000e+01 1.9399198689243217e-02 0.0000000000000000e+00 +2.0000000000000000e+00 7.1000000000000000e+01 7.2000000000000000e+01 1.9399198689242867e-02 0.0000000000000000e+00 +3.0000000000000000e+00 7.2000000000000000e+01 4.4000000000000000e+01 1.9399198689242340e-02 0.0000000000000000e+00 +4.0000000000000000e+00 4.4000000000000000e+01 7.3000000000000000e+01 2.1007952879185544e-02 0.0000000000000000e+00 +5.0000000000000000e+00 7.3000000000000000e+01 7.4000000000000000e+01 2.1007952879185637e-02 0.0000000000000000e+00 +6.0000000000000000e+00 7.4000000000000000e+01 4.3000000000000000e+01 2.1007952879184662e-02 0.0000000000000000e+00 +7.0000000000000000e+00 4.3000000000000000e+01 7.5000000000000000e+01 1.8963112454580752e-02 0.0000000000000000e+00 +8.0000000000000000e+00 7.5000000000000000e+01 7.6000000000000000e+01 1.8963112454581529e-02 0.0000000000000000e+00 +9.0000000000000000e+00 7.6000000000000000e+01 4.2000000000000000e+01 1.8963112454581529e-02 0.0000000000000000e+00 +1.0000000000000000e+01 4.2000000000000000e+01 7.7000000000000000e+01 2.7548346315222932e-02 0.0000000000000000e+00 +1.1000000000000000e+01 7.7000000000000000e+01 4.1000000000000000e+01 2.7548346315223151e-02 0.0000000000000000e+00 +1.2000000000000000e+01 4.1000000000000000e+01 7.8000000000000000e+01 2.7306546334010817e-02 0.0000000000000000e+00 +1.3000000000000000e+01 7.8000000000000000e+01 4.0000000000000000e+01 2.7306546334010817e-02 0.0000000000000000e+00 +1.4000000000000000e+01 4.0000000000000000e+01 7.9000000000000000e+01 2.0259925516494661e-02 0.0000000000000000e+00 +1.5000000000000000e+01 7.9000000000000000e+01 3.9000000000000000e+01 2.0259925516494772e-02 0.0000000000000000e+00 +1.6000000000000000e+01 3.9000000000000000e+01 8.0000000000000000e+01 2.2100564041950561e-02 0.0000000000000000e+00 +1.7000000000000000e+01 8.0000000000000000e+01 3.8000000000000000e+01 2.2100564041950467e-02 0.0000000000000000e+00 +1.8000000000000000e+01 3.8000000000000000e+01 8.1000000000000000e+01 2.2358587722609097e-02 0.0000000000000000e+00 +1.9000000000000000e+01 8.1000000000000000e+01 3.7000000000000000e+01 2.2358587722609097e-02 0.0000000000000000e+00 +2.0000000000000000e+01 3.7000000000000000e+01 8.2000000000000000e+01 1.9308643769608249e-02 0.0000000000000000e+00 +2.1000000000000000e+01 8.2000000000000000e+01 3.6000000000000000e+01 1.9308643769608065e-02 0.0000000000000000e+00 diff --git a/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension_BC1.dat b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension_BC1.dat new file mode 100644 index 0000000..09fe4af --- /dev/null +++ b/src/flexible_solver/mesh/Revolving_bumblebee_wing/veins_extension_BC1.dat @@ -0,0 +1,25 @@ +1.0000000000000000e+00 5.6000000000000000e+01 5.7000000000000000e+01 2.2645350151686158e-02 0.0000000000000000e+00 +2.0000000000000000e+00 5.7000000000000000e+01 5.5000000000000000e+01 2.2645350151686162e-02 0.0000000000000000e+00 +3.0000000000000000e+00 5.5000000000000000e+01 5.8000000000000000e+01 2.0955747119215995e-02 0.0000000000000000e+00 +4.0000000000000000e+00 5.8000000000000000e+01 5.4000000000000000e+01 2.0955747119215613e-02 0.0000000000000000e+00 +5.0000000000000000e+00 5.4000000000000000e+01 5.9000000000000000e+01 2.2051848604707984e-02 0.0000000000000000e+00 +6.0000000000000000e+00 5.9000000000000000e+01 5.3000000000000000e+01 2.2051848604707967e-02 0.0000000000000000e+00 +7.0000000000000000e+00 5.3000000000000000e+01 6.0000000000000000e+01 2.0361413167446277e-02 0.0000000000000000e+00 +8.0000000000000000e+00 6.0000000000000000e+01 5.2000000000000000e+01 2.0361413167446246e-02 0.0000000000000000e+00 +9.0000000000000000e+00 5.2000000000000000e+01 6.1000000000000000e+01 1.9639989013429664e-02 0.0000000000000000e+00 +1.0000000000000000e+01 6.1000000000000000e+01 5.1000000000000000e+01 1.9639989013431447e-02 0.0000000000000000e+00 +1.1000000000000000e+01 5.1000000000000000e+01 6.2000000000000000e+01 2.3111505664339303e-02 0.0000000000000000e+00 +1.2000000000000000e+01 6.2000000000000000e+01 5.0000000000000000e+01 2.3111505664339276e-02 0.0000000000000000e+00 +1.3000000000000000e+01 5.0000000000000000e+01 6.3000000000000000e+01 2.2692791291341639e-02 0.0000000000000000e+00 +1.4000000000000000e+01 6.3000000000000000e+01 4.9000000000000000e+01 2.2692791291341625e-02 0.0000000000000000e+00 +1.5000000000000000e+01 4.9000000000000000e+01 6.4000000000000000e+01 1.8893669763372246e-02 0.0000000000000000e+00 +1.6000000000000000e+01 6.4000000000000000e+01 6.5000000000000000e+01 1.8893669763372194e-02 0.0000000000000000e+00 +1.7000000000000000e+01 6.5000000000000000e+01 4.8000000000000000e+01 1.8893669763373096e-02 0.0000000000000000e+00 +1.8000000000000000e+01 4.8000000000000000e+01 6.6000000000000000e+01 1.9720945774861137e-02 0.0000000000000000e+00 +1.9000000000000000e+01 6.6000000000000000e+01 6.7000000000000000e+01 1.9720945774860939e-02 0.0000000000000000e+00 +2.0000000000000000e+01 6.7000000000000000e+01 4.7000000000000000e+01 1.9720945774860204e-02 0.0000000000000000e+00 +2.1000000000000000e+01 4.7000000000000000e+01 6.8000000000000000e+01 1.9581085998589258e-02 0.0000000000000000e+00 +2.2000000000000000e+01 6.8000000000000000e+01 6.9000000000000000e+01 1.9581085998588692e-02 0.0000000000000000e+00 +2.3000000000000000e+01 6.9000000000000000e+01 4.6000000000000000e+01 1.9581085998589313e-02 0.0000000000000000e+00 +2.4000000000000000e+01 4.6000000000000000e+01 7.0000000000000000e+01 2.7910329782884130e-02 0.0000000000000000e+00 +2.5000000000000000e+01 7.0000000000000000e+01 4.5000000000000000e+01 2.7910329782884241e-02 0.0000000000000000e+00 diff --git a/src/flexible_solver/prescribed_wing.f90 b/src/flexible_solver/prescribed_wing.f90 new file mode 100644 index 0000000..19714ad --- /dev/null +++ b/src/flexible_solver/prescribed_wing.f90 @@ -0,0 +1,61 @@ +!------------------------------------------------------------------------------- +! WRAPPER Motion protocoll wrapper of flexible wings +!------------------------------------------------------------------------------- +subroutine prescribed_wing ( time, wing , Insect) + implicit none + + real(kind=pr),intent(in) :: time + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + integer :: i + + + select case (wing%Motion) + case ("revolving_wing","from_file") + call prescribed_wing_motion (time, wing, Insect) + case ("stationary") + continue + end select +end subroutine + +subroutine prescribed_wing_motion (time, wing, Insect) + + implicit none + + real(kind=pr),intent(in) :: time + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + integer :: j,i + real(kind=pr),dimension(1:3,1:3) :: mat_Rx, mat_Ry + real(kind=pr),dimension(1:3) :: u,v + !real(kind=pr) :: ttau, phi, phi_dt, alpha, alpha_dt, theta, theta_dt + + !----------------------------------------------------------------------------- + ! fetch current motion state + !----------------------------------------------------------------------------- + call BodyMotion (time, Insect) + call StrokePlane (time, Insect) + if (wing%ID == "left") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_l ) + elseif (wing%ID == "right") then + call Flexible_wing_motions ( time, wing, Insect%kine_wing_r ) + endif + + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + call body_rotation_matrix( Insect, Insect%M_body ) + Insect%M_body_inv = transpose(Insect%M_body) + call MSM_solver_rotation_matrix( Wing, wing%M_solver ) + Wing%M_solver_inv = transpose(Wing%M_solver) + call flexible_wing_rotation_matrix( Wing, Insect, Wing%M_wing ) + Wing%M_wing_inv = transpose(Wing%M_wing) + + ! rel+abs wing angular velocities in the w/b/g coordinate system + call flexible_wing_angular_velocities (time, Wing, Insect, Insect%M_body ) + + call rotate_and_translate_wing_into_global_system(wing, Insect) + + call construct_total_velocity(wing,Insect%M_body,Insect%M_body_inv) + +end subroutine diff --git a/src/flexible_solver/save_wing.f90 b/src/flexible_solver/save_wing.f90 index 917046e..7a492f4 100644 --- a/src/flexible_solver/save_wing.f90 +++ b/src/flexible_solver/save_wing.f90 @@ -1,36 +1,44 @@ -subroutine SaveWingData( time, wings ) +subroutine SaveWingData( time, it, dt1, wings ) use vars implicit none - real (kind=pr), intent (in) :: time - type (wing), dimension(1:nWings), intent (inout) :: wings - character(len=16) :: format_ns1 - character(len=3) :: ns1_string + real (kind=pr), intent (in) :: time, dt1 + integer, intent(in) :: it + type(flexible_wing), dimension(1:nWings), intent (inout) :: wings + character(len=20) :: format_ns1 + character(len=4) :: ns1_string, ctrlpoint character(len=1) :: wingstr + integer :: np,step,i !-- loop over wings do i=1, nWings !-- for naming files.. write (wingstr,'(i1)') i + write (ctrlpoint,'(i3)') wings(i)%ControlPoint !Get total number of points np = wings(i)%np ! set up formats - write(ns1_string, '(I3)') np+1 + write(ns1_string,'(i4)') np+1 format_ns1 = '('//ns1_string//'(es15.8,1x))' - !-- save trailing edge data - !open (14, file = 'wing_data'//wingstr//'.t', status = 'unknown',position='append') - !write (14, '(21(es15.8,1x))') & - ! time,& - ! wings(i)%x(np),& - ! wings(i)%y(np),& - ! wings(i)%z(np),& - ! wings(i)%vx(np),& - ! wings(i)%vy(np),& - ! wings(i)%vz(np) - !close (14) + + !-- save control point data + if (wings(i)%ControlPoint /= 0) then + open (14, file = 'wing_data'//wingstr//'_point'//ctrlpoint//'.t', status = 'unknown',position='append') + write (14, '(21(es15.8,1x))') & + time,& + wings(i)%x(wings(i)%ControlPoint),& + wings(i)%y(wings(i)%ControlPoint),& + wings(i)%z(wings(i)%ControlPoint),& + wings(i)%vx(wings(i)%ControlPoint),& + wings(i)%vy(wings(i)%ControlPoint),& + wings(i)%vz(wings(i)%ControlPoint) + close (14) + endif + + if (wings(i)%save_lagrangian_data) then open (14, file = 'wing_x'//wingstr//'.t', status = 'unknown',position='append') write (14, format_ns1) time, wings(i)%x(1:np) @@ -44,6 +52,30 @@ subroutine SaveWingData( time, wings ) write (14, format_ns1) time, wings(i)%z(1:np) close (14) + open (14, file = 'wing_xrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(0*np+1:1*np) + close (14) + + open (14, file = 'wing_yrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(1*np+1:2*np) + close (14) + + open (14, file = 'wing_zrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(2*np+1:3*np) + close (14) + + open (14, file = 'wing_vxrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(3*np+1:4*np) + close (14) + + open (14, file = 'wing_vyrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(4*np+1:5*np) + close (14) + + open (14, file = 'wing_vzrel'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%u_old(5*np+1:6*np) + close (14) + open (14, file = 'wing_vx'//wingstr//'.t', status = 'unknown',position='append') write (14, format_ns1) time, wings(i)%vx(1:np) close (14) @@ -56,7 +88,139 @@ subroutine SaveWingData( time, wings ) write (14, format_ns1) time, wings(i)%vz(1:np) close (14) + open (14, file = 'Fext_x'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%Fext(1:np) + close (14) + + open (14, file = 'Fext_y'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%Fext(np+1:2*np) + close (14) + + open (14, file = 'Fext_z'//wingstr//'.t', status = 'unknown',position='append') + write (14, format_ns1) time, wings(i)%Fext(2*np+1:3*np) + close (14) + + endif + + open (14, file='MSM_solver_info'//wingstr//'.t',status='unknown',position='append') + write(14,'(1(i6,1x),2(es15.8,1x),1(i15,1x),2(es15.8,1x))') it, time, dt1, wings(i)%iter, wings(i)%err_abs, wings(i)%err_rel + close(14) + enddo -end subroutine SavewingData +end subroutine SaveWingData + +!------------------------------------------------------------------------- +! dump runtime backup for the flexible wing solver +!------------------------------------------------------------------------- +subroutine dump_flexible_wing_backup( time, wings, nbackup ) + use vars + implicit none + + real(kind=pr), intent(in) :: time + type(flexible_wing), dimension (1:nWings), intent (in) :: wings + integer, intent (in):: nbackup + integer :: i + character(len=24) :: filename + + !-- only root rank dumps backup + if (root) then + write(*,'(A)',advance='no') "Backuping flexible wing solver..." + write(filename,'("runtime_backup",i1,".fsi_bckp")') nbackup + write(*,'(A)',advance='no') "file="//filename + write(*,'(" time=",e11.4)',advance='no') time + + + open(14,file=filename,status='replace',form='formatted') + + + write(14,*) time + write(14,*) nWings + write(14,*) nVeins, nVeins_BC, nMembranes, nMembrane_edges + + do i=1,nWings + write(14,*) wings(i)%np + write(14,*) wings(i)%x, wings(i)%y, wings(i)%z + write(14,*) wings(i)%vx, wings(i)%vy, wings(i)%vz + write(14,*) wings(i)%u_old, wings(i)%u_oldold + write(14,*) wings(i)%x0, wings(i)%x_pivot_b, wings(i)%x_pivot_g + write(14,*) wings(i)%phi, wings(i)%alpha, wings(i)%theta + write(14,*) wings(i)%vt0, wings(i)%at0 + write(14,*) wings(i)%vr0, wings(i)%ar0 + write(14,*) wings(i)%StartupStep + enddo + + close(14) + write(*,'(A)',advance='yes') "...DONE!" + endif + +end subroutine dump_flexible_wing_backup + +!------------------------------------------------------------------------- +! read runtime backup for the flexible wing solver +!------------------------------------------------------------------------- +subroutine read_flexible_wing_backup( wings, filename ) + use vars + implicit none + + type(flexible_wing), dimension (1:nWings), intent (inout) :: Wings + integer :: nwings_file, nVeins_file, nVeins_BC_file, nMembranes_file, nMembrane_edges_file, i, mpicode + character(len=*), intent(in) :: filename + real(kind=pr) :: time + + ! only root shall read in the file, the results is then send to the other + if (root) then + write(*,'(A)') "Reading in backup of flexible wing solver: "//filename + + open(14,file=filename,status='old',form='formatted',action='read') + read(14,*) time + read(14,*) nwings_file + read(14,*) nVeins_file, nVeins_BC_file, nMembranes_file, nMembrane_edges_file + + write(*,'("(time=",e11.4,")")') time + + if ((nwings_file/=nwings).or.(nVeins_file/=nVeins)) then + call abort(95,"Cant resume flexible_wing backup: wing mesh doesnt match") + endif + + do i =1, nwings + read(14,*) wings(i)%np + read(14,*) wings(i)%x, wings(i)%y, wings(i)%z + read(14,*) wings(i)%vx, wings(i)%vy, wings(i)%vz + read(14,*) wings(i)%u_old, wings(i)%u_oldold + read(14,*) wings(i)%x0, wings(i)%x_pivot_b, wings(i)%x_pivot_g + read(14,*) wings(i)%phi, wings(i)%alpha, wings(i)%theta + read(14,*) wings(i)%vt0, wings(i)%at0 + read(14,*) wings(i)%vr0, wings(i)%ar0 + read(14,*) wings(i)%StartupStep + enddo + close(14) + + write(*,'(A)') "...done reading flexible wing backup." + endif + + do i =1, nwings + call MPI_Bcast( wings(i)%np, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%y, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%z, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vx, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vy, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vz, npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%u_old, 6*npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%u_oldold, 6*npmax, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x0, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x_pivot_b, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%x_pivot_g, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%phi, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%alpha, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%theta, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vt0, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%at0, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%vr0, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%ar0, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, mpicode ) + call MPI_Bcast( wings(i)%StartupStep, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD, mpicode ) + + enddo +end subroutine read_flexible_wing_backup diff --git a/src/flexible_solver/superlu_solver.f90 b/src/flexible_solver/superlu_solver.f90 new file mode 100644 index 0000000..cebc9a1 --- /dev/null +++ b/src/flexible_solver/superlu_solver.f90 @@ -0,0 +1,164 @@ +module superlu_solver + + use vars + implicit none + +contains + +subroutine solve_linear_system_using_schur_complement(du,np,FJ,FJ_ext,m,c,dt,a,b,coef,SparseSolver) + +use vars + +! This subroutine solves a linear system under the form +! [ | ] [ ] [ ] +! [ FJ | M ] [ dx ] [ a ] +! [----|------] [----] = [---] +! [ I | c.I ] [ dv ] [ b ] +! [ | ] [ ] [ ] +! where A is an arbitrary matrix deriving from Jacobian matrix getting from +! taking derivatives of all the internal forces, M is the mass and damping +! matrix who MUST be DIAGONAL where M = diag(m) + coef*dt*diag(c), +! I is IDENTICAL matrix, D is IDENTICAL matrix times a CONSTANT COEFFICIENT coef +! determined by the discretization scheme +! ATTENTION to the structure of matrices M, I and D +! a and b are the RHS getting from evaluating the state of the system from +! previous time step. +! x and v and position and velocity vector respectively, and the phase vector is +! defined as u = [x ; v]^T +! +! (FJ-M*c**(-1))*dx = a - M*c**(-1)*b +! du = 1/(c*dt)*(dx - b) + +implicit none + +real(kind=pr), intent(in) :: dt, coef +real(kind=pr), intent(in) :: m(1:), c(1:), a(1:), b(1:) +real(kind=pr), intent(in) :: FJ(1:,1:), FJ_ext(1:,1:) +character, intent(in) :: SparseSolver +integer, intent(in) :: np +real(kind=pr), intent(inout) :: du(1:) +real(kind=pr), allocatable :: y(:), m_array3D(:), c_array3D(:) +real(kind=pr), allocatable :: F(:,:) +real(kind=pr) :: t0 +integer :: i, j, iopt, nnz, info, nrhs_lu, nnz_FJ, nnz_FJext, nnz_pre +integer :: factors(8) +integer, allocatable :: rowind(:), colptr(:) +real(kind=pr), allocatable :: values(:) + + +allocate(y(1:3*np),m_array3D(1:3*np),c_array3D(1:3*np)) +allocate(F(1:3*np,1:3*np)) + +!Initialize F +F = 0.0d0 +y = 0.0d0 + +! Transform the mass array m() into an array (/m,m,m/) corresponding to three dimensions +! x,y and z +m_array3D = (/m,m,m/) +c_array3D = (/c,c,c/) + +!do i=1,3*np +! do j=1,3*np +! if (i .eq. j) then +! F(i,i) = coef*dt*(FJ(i,i)+FJ_ext(i,i)) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) +! y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +! else +! F(i,j) = coef*dt*(FJ(i,j)+FJ_ext(i,j)) +! endif +! enddo +!enddo + + +t0 = MPI_wtime() + F = coef*dt*(FJ+FJ_ext) +call toc("Flexible wing (Construct global jacobian matrix:the remainings)", MPI_wtime() - t0) + +t0 = MPI_wtime() +do i=1,3*np + F(i,i) = F(i,i) + (1/(coef*dt))*m_array3D(i) + c_array3D(i) + y(i) = a(i) + ((1/(coef*dt))*m_array3D(i) + c_array3D(i))*b(i) +enddo +call toc("Flexible wing (Construct global jacobian:diagonal)", MPI_wtime() - t0) + + +!nnz_FJ = count(FJ(1:3*np,1:3*np) /= 0.0d0) +!if (root) write(*,'("Number of non-zero elements of FJ: ",i7," ")') nnz_FJ + +!nnz_FJext = count(FJ_ext(1:3*np,1:3*np) /= 0.0d0) +!if (root) write(*,'("Number of non-zero elements of FJext: ",i7," ")') nnz_FJext + +!nnz_pre = count(F(1:3*np,1:3*np) /= 0.0d0) +!if (root) write(*,'("Number of non-zero elements of F: ",i7," ")') nnz_pre + +!if (SparseSolver /= 'yes') then +! call solve_linear_system_wing ( F, y, du(1:3*np) ) +!elseif (SparseSolver == 'yes') then + t0 = MPI_wtime() + call dense_to_HB_matrix(F(1:3*np,1:3*np), 3*np, nnz, colptr, rowind, values) + call toc("Flexible wing (dense_to_HB_matrix)", MPI_wtime() - t0) + + nrhs_lu = 1 + + iopt = 1 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values(1:), rowind(1:), & + colptr(1:), y, 3*np, factors, info ) + call toc("Factorization LU)", MPI_wtime() - t0) + + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Factorization failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + + + +! Solve the factored system. +! + iopt = 2 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind, & + colptr, y, 3*np, factors, info ) + call toc("Flexible wing (solve_linear_system_superLU)", MPI_wtime() - t0) + + if ( info /= 0 ) then + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'D_SAMPLE - Fatal error!' + write ( *, '(a)' ) ' Backsolve failed' + write ( *, '(a,i4)' ) ' INFO = ', info + stop 1 + end if + +! +! Free memory. +! + iopt = 3 + t0 = MPI_wtime() + call c_fortran_dgssv( iopt, 3*np, nnz, nrhs_lu, values, rowind, & + colptr, y, 3*np, factors, info ) + call toc("Flexible wing (free_memory_superLU)", MPI_wtime() - t0) + du(1:3*np) = y(1:3*np) + +!endif + + + +do i=1,3*np + + du(i + 3*np) = (1/(coef*dt))*(du(i) - b(i)) + +enddo + +deallocate(y) +deallocate(F) + +deallocate(values) +deallocate(rowind) +deallocate(colptr) + +end subroutine + +end module superlu_solver diff --git a/src/flexible_solver/supplementary_calc.f90 b/src/flexible_solver/supplementary_calc.f90 index 5b6b5ce..7c9720b 100644 --- a/src/flexible_solver/supplementary_calc.f90 +++ b/src/flexible_solver/supplementary_calc.f90 @@ -71,9 +71,213 @@ subroutine angle_calculation(x1,x2,x3,y1,y2,y3,z1,z2,z3,theta,phi) dy2 = y3 - y2 dz2 = z3 - z2 - theta = atan2(dx1*dy2-dx2*dy1,dx1*dx2+dy1*dy2) + ! theta = atan2(dx1*dy2-dx2*dy1,dx1*dx2+dy1*dy2) + + ! phi = atan2(dx1*dz2-dx2*dz1,dx1*dx2+dz1*dz2) + +! if ((dx1<1.0d-16) .or. (dx2<1.0d-16)) then + ! theta = 0.0d0 + ! else + theta = atan2(dx1*dy2-dx2*dy1,dx1*dx2+dy1*dy2) + ! endif + phi = atan2(dx1*dz2-dx2*dz1,dx1*dx2+dz1*dz2) + + +end subroutine + +subroutine set_diameters_for_veins(d_veins, d_veins_BC, & + middle_point_indices, middle_point_indices_BC) + + implicit none + real(kind=pr), intent(inout) :: d_veins(1:,1:), d_veins_BC(1:,1:) + real(kind=pr), intent(inout) :: middle_point_indices(1:), middle_point_indices_BC(1:) + + d_veins_BC(1:3,1) = 200 + d_veins_BC(1:3,2) = 350 + d_veins_BC(1:3,3) = 250 + + !vein 1 + d_veins(1:3,1) = 155 + d_veins(1,2) = 150 + d_veins(2,2) = 100 + d_veins(3,2) = 145 + d_veins(1,3) = 150 + d_veins(2,3) = 115 + d_veins(3,3) = 100 + d_veins(1,4) = 100 + d_veins(2,4) = 0 + d_veins(3,4) = 80 + d_veins(1:3,5) = 80 + + !vein 2 + d_veins(1:3,6) = 200 + d_veins(1:3,7) = 100 + + !vein3 + d_veins(1:3,8) = 150 + d_veins(1:3,9) = 100 + + !vein 4 middle_point_indices 89 + d_veins(1,10) = 125 + d_veins(2,10) = 0 + d_veins(3,10) = 95 + d_veins(1,11) = 85 + d_veins(2,11) = 75 + d_veins(3,11) = 60 + + !vein 5 middle_point_indices 142 126 + d_veins(1,12) = 120 + d_veins(2,12) = 0 + d_veins(3,12) = 150 + d_veins(1,13) = 80 + d_veins(2,13) = 0 + d_veins(3,13) = 70 + d_veins(1,14) = 70 + d_veins(2,14) = 65 + d_veins(3,14) = 60 + d_veins(1,15) = 60 + d_veins(2,15) = 55 + d_veins(3,15) = 50 + + !vein 5 middle_point_indices 204 + d_veins(1:3,16) = 120 + d_veins(1,17) = 120 + d_veins(2,17) = 0 + d_veins(3,17) = 100 + d_veins(1,18) = 120 + d_veins(2,18) = 80 + d_veins(3,18) = 55 + + !vein 7 + d_veins(1:3,19) = 60 + + !vein 8 middle_point_indices 351 + d_veins(1:3,20) = 120 + d_veins(1:3,21) = 120 + d_veins(1,22) = 115 + d_veins(2,22) = 50 + d_veins(3,22) = 5 + + !vein 9 middle_point_indices 192 + d_veins(1,23) = 250 + d_veins(2,23) = 200 + d_veins(3,23) = 80 + + !vein 10 + d_veins(1,24) = 40 + d_veins(2,24) = 0 + d_veins(3,24) = 35 + + !vein 11 + d_veins(1:3,25) = 130 + + !vein 12 + d_veins(1:3,26) = 120 + + !vein 13 + d_veins(1:3,27) = 150 + + !vein 14, 15, 16 and 17 + d_veins(1:3,28) = 10 + d_veins(1:3,29) = 10 + d_veins(1:3,30) = 90 + d_veins(1:3,31) = 110 + + middle_point_indices = (/0, 288, 295, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 142, 126, & + 195, 205, 0, 0, 0, 0, 351, 329, 0, 0, 0, 0, 0, 0, 0, 0/) + + middle_point_indices_BC = (/0, 0, 0/) + + d_veins = d_veins*4.55373406193078d-5 + d_veins_BC = d_veins_BC*4.55373406193078d-5 +end subroutine + +subroutine calculate_flexural_rigidity_from_Young_modulus(j,kby, kbz, E, d_veins, & + middle_point_indices, veins_extension) + + implicit none + integer, intent(in) :: j + real(kind=pr), intent(in) :: E + real(kind=pr), intent(in) :: d_veins(1:3) + real(kind=pr), intent(in) :: veins_extension(1:,1:) + real(kind=pr), intent(in) :: middle_point_indices + real(kind=pr), intent(inout) :: kby(1:), kbz(1:) + real(kind=pr) :: Lv, kb_head, kb_mid, kb_tail, l_head, l_mid, l_tail + real(kind=pr), dimension(1:3) :: Iy, Iz, EIy, EIz + integer :: i, nv, ind_mid + logical :: stop_condition + + stop_condition = .true. + + !vein length + Lv = sum(veins_extension(1:size(veins_extension,1),4)) + + !second moment of inertia + Iy=pi/2*(d_veins/2)**4 + Iz=pi/2*(d_veins/2)**4 + + !flexural rigidity + EIy=E*Iy + EIz=E*Iz + + + if (middle_point_indices == 0) then + !vein with constant diameter + if (d_veins(2)/=0) then + do i=1,nint(maxval(veins_extension(:,1))) + kby(i) = EIz(1)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + kbz(i) = EIy(1)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + enddo + !vein whose diameter decreases or increases linearly + elseif (d_veins(2)==0) then + if ((EIz(2)/=0) .or. (EIz(1)==EIz(3))) then + write(*,*) d_veins(1), d_veins(2), d_veins(3) + write(*,*) j + call abort(032020202,"Diameter data is wrong!") + else + kb_head = EIy(1)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + kb_tail = EIy(3)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + do i=1,nint(maxval(veins_extension(:,1))) + l_head = sum(veins_extension(1:i,4)) !distance from the current point to the head of the vein + l_tail = Lv - l_head; !distance from the current point to the tail of the vein + kby(i) = (l_tail*kb_head + l_head*kb_tail)/Lv + kbz(i) = kby(i) + enddo + endif + endif + elseif (middle_point_indices /= 0) then + kb_head = EIy(1)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + kb_mid = EIy(2)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + kb_tail = EIy(3)*(maxval(veins_extension(:,1))+1)*(2*maxval(veins_extension(:,1))+3)/& + (Lv*(2*maxval(veins_extension(:,1))+4)) + i = 0 + do while (stop_condition) + i = i + 1 + if (nint(veins_extension(i,3))==middle_point_indices) then + ind_mid = i!index of the element corresponding to the measured middle point + stop_condition = .false. + endif + enddo + do i=1,ind_mid + l_head = sum(veins_extension(1:i,4)); !distance from the current point to the head of the vein + l_mid = sum(veins_extension(1:ind_mid,4)) - l_head + kby(i) = (l_mid*kb_head + l_head*kb_mid)/sum(veins_extension(1:ind_mid,4)) + kbz(i) = kby(i) + enddo + do i=ind_mid+1,nint(maxval(veins_extension(:,1))) + l_mid = sum(veins_extension(ind_mid+1:i,4)) + l_tail = Lv - sum(veins_extension(1:ind_mid,4)) - l_mid !distance from the current point to the tail of the vein + kby(i) = (l_mid*kb_tail + l_tail*kb_mid)/sum(veins_extension(ind_mid+1:nint(maxval(veins_extension(:,1))),4)) + kbz(i) = kby(i) + enddo + endif - phi = atan2(dx1*dz2-dx2*dz1,dx1*dx2+dz1*dz2) end subroutine @@ -109,6 +313,7 @@ subroutine solve_linear_system_wing ( A, b, x ) allocate(ipiv(1:nn)) t0 = MPI_wtime() + call dgetrf( nn, nn, A , nn, ipiv, error ) if (error .ne. 0) then write(*,*) "!!! mmCrutial: dgetrf error.", error ,nn @@ -122,7 +327,7 @@ subroutine solve_linear_system_wing ( A, b, x ) call abort(93, "Error in solve liner system (dgetrs)") endif - time_LAPACK = time_LAPACK + MPI_wtime() - t0 + call toc("Flexible wing (solve_linear_system_wing)", MPI_wtime() - t0) end subroutine @@ -130,7 +335,7 @@ subroutine Moving_boundary_point(wings) implicit none - type(wing), dimension(1:nWings), intent(inout) :: wings + type(flexible_wing), dimension(1:nWings), intent(inout) :: wings integer :: i,j do i=1,nWings @@ -148,35 +353,474 @@ subroutine Moving_boundary_point(wings) enddo end subroutine -subroutine rotate_wing(wings) +subroutine rotate_wing(wing) implicit none - type(wing), intent(inout) :: wings - real(kind=pr), dimension(1:3,1:3) :: mat_Ry, mat_Rz + !type(diptera), intent(inout) :: Insect + type(flexible_wing), intent(inout) :: wing integer :: i real(kind=pr), dimension(1:3) :: u - call Ry(mat_Ry,wings%Anglewing_y) - call Rz(mat_Rz,wings%Anglewing_z) - ! Rotate wing around y axis - do i=1,wings%np - u = matmul(mat_Ry,(/wings%x(i), wings%y(i), wings%z(i)/)) - wings%x(i) = u(1) - wings%y(i) = u(2) - wings%z(i) = u(3) + ! Rotate wing into the global coordinate system + do i=1,wing%np + u = matmul(wing%M_wing_inv,matmul(wing%M_solver_inv, & + (/wing%u_old(i), wing%u_old(i+wing%np), wing%u_old(i+2*wing%np)/))) + wing%x(i) = u(1) + wing%y(i) = u(2) + wing%z(i) = u(3) enddo - ! Rotate wing around z axis - do i=1,wings%np - u = matmul(mat_Rz,(/wings%x(i), wings%y(i), wings%z(i)/)) - wings%x(i) = u(1) - wings%y(i) = u(2) - wings%z(i) = u(3) + +end subroutine + +subroutine rotate_and_translate_wing_into_global_system(wing, Insect) + + implicit none + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent(inout) :: wing + integer :: i + real(kind=pr), dimension(1:3) :: u + + + ! Rotate wing into the global coordinate system + do i=1,wing%np + ! wing position in the body coordinate system + ! Rotate the wing into the body coordinate system + u = matmul(wing%M_wing_inv,matmul(wing%M_solver_inv, & + (/wing%u_old(i), wing%u_old(i+wing%np), wing%u_old(i+2*wing%np)/))) + + ! Translate the wing to the pivot point + wing%x(i) = u(1) + wing%x_pivot_b(1) + wing%y(i) = u(2) + wing%x_pivot_b(2) + wing%z(i) = u(3) + wing%x_pivot_b(3) + + ! wing position in the global coordinate system + ! Rotate the wing into the global coordinate system + u = matmul(Insect%M_body_inv,(/wing%x(i), wing%y(i), wing%z(i)/)) + + ! Translate the wing to the body center + wing%x(i) = u(1) + wing%x0(1) + wing%y(i) = u(2) + wing%x0(2) + wing%z(i) = u(3) + wing%x0(3) enddo end subroutine + +subroutine construct_total_velocity(wing,M_body,M_body_inv) + + implicit none + real(kind=pr), intent(in) :: M_body(1:3,1:3), M_body_inv(1:3,1:3) + type(flexible_wing), intent(inout) :: wing + integer :: j, np + real(kind=pr), dimension(1:3) :: u,v,r + + np = wing%np + + !if (root) write(*,*) wing%rot_rel_wing_g(1), wing%rot_rel_wing_g(2), wing%rot_rel_wing_g(3) + !if (root) write(*,*) wing%rot_rel_wing_w(1), wing%rot_rel_wing_w(2), wing%rot_rel_wing_w(3) + !if (root) write(*,*) wing%vr0(1), wing%vr0(2), wing%vr0(3) + + do j=1,np + + r(1) = wing%u_old(0*wing%np+j) + r(2) = wing%u_old(1*wing%np+j) + r(3) = wing%u_old(2*wing%np+j) + + call rotate_vector_into_global_system(wing,M_body,r) + + u = cross(wing%rot_rel_wing_g(1:3),r) + + v(1) = wing%u_old(3*wing%np+j) + v(2) = wing%u_old(4*wing%np+j) + v(3) = wing%u_old(5*wing%np+j) + + call rotate_vector_into_global_system(wing,M_body_inv,v) + + wing%vx(j) = wing%vt0(1) + v(1) + u(1) + wing%vy(j) = wing%vt0(2) + v(2) + u(2) + wing%vz(j) = wing%vt0(3) + v(3) + u(3) + + enddo + +end subroutine + +subroutine translate_wing(wing,M_body) + + implicit none + real(kind=pr), intent(in) :: M_body(1:3,1:3) + type(flexible_wing), intent(inout) :: wing + integer :: j, np + real(kind=pr), dimension(1:3) :: u,v + + np = wing%np + + !if (root) write(*,*) wing%rot_rel_wing_g(1), wing%rot_rel_wing_g(2), wing%rot_rel_wing_g(3) + !if (root) write(*,*) wing%rot_rel_wing_w(1), wing%rot_rel_wing_w(2), wing%rot_rel_wing_w(3) + !if (root) write(*,*) wing%vr0(1), wing%vr0(2), wing%vr0(3) + + do j=1,np + + u = cross(wing%rot_rel_wing_g(1:3),(/wing%x(j),wing%y(j),wing%z(j)/)) + + + v(1) = wing%u_old(3*wing%np+j) + v(2) = wing%u_old(4*wing%np+j) + v(3) = wing%u_old(5*wing%np+j) + + call rotate_vector_into_global_system(wing,M_body,v) + + wing%vx(j) = wing%vt0(1) + v(1) + u(1) + wing%vy(j) = wing%vt0(2) + v(2) + u(2) + wing%vz(j) = wing%vt0(3) + v(3) + u(3) + + wing%x(j) = wing%x(j) + wing%x_pivot_b(1) + wing%y(j) = wing%y(j) + wing%x_pivot_b(2) + wing%z(j) = wing%z(j) + wing%x_pivot_b(3) + + enddo + +end subroutine + +subroutine rotate_vector_into_wing_system(wing,M_body,Vector) + +implicit none + +!real(kind=pr),intent(in) :: time +real(kind=pr), intent(in) :: M_body(1:3,1:3) +type(flexible_wing), intent (in) :: wing +real(kind=pr), intent(inout) :: Vector(1:3) +real(kind=pr), dimension(1:3,1:3) :: Mx, My, Mz +real(kind=pr), dimension(1:3) :: u + + +!The wing is rotated based on conventional Euler angles. It is then rotated in +!order: around z axis (yaw) first, then y axis (pitch) and finally x axis (roll) + +u = matmul(wing%M_solver,matmul(wing%M_wing,matmul(M_body,(/Vector(1), Vector(2), Vector(3)/)))) +Vector(1) = u(1) +Vector(2) = u(2) +Vector(3) = u(3) + + +end subroutine + +subroutine rotate_vector_into_global_system(wing,M_body_inv,Vector) + +implicit none + +!real(kind=pr),intent(in) :: time +real(kind=pr), intent(in) :: M_body_inv(1:3,1:3) +type(flexible_wing), intent (inout) :: wing +real(kind=pr), intent(inout) :: Vector(1:3) +real(kind=pr), dimension(1:3,1:3) :: Mx, My, Mz +real(kind=pr), dimension(1:3) :: u + + +!The wing is rotated based on conventional Euler angles. It is then rotated in +!order: around z axis (yaw) first, then y axis (pitch) and finally x axis (roll) + +! call Rx(Mx,wing%phi) +! call Ry(My,wing%alpha) +! call Rz(Mz,wing%theta) + +! Rotate wing around x axis + u = matmul(M_body_inv,matmul(wing%M_wing_inv,matmul(wing%M_solver_inv,(/Vector(1), Vector(2), Vector(3)/)))) + Vector(1) = u(1) + Vector(2) = u(2) + Vector(3) = u(3) + +! Rotate wing around x axis +! u = matmul(My,(/Vector(1), Vector(2), Vector(3)/))! +! Vector(1) = u(1) +! Vector(2) = u(2) +! Vector(3) = u(3) + +! Rotate wing around x axis +! u = matmul(Mz,(/Vector(1), Vector(2), Vector(3)/)) +! Vector(1) = u(1) +! Vector(2) = u(2) +! Vector(3) = u(3) + + +end subroutine + +subroutine flexible_wing_angular_velocities (time, Wing, Insect, M_body ) + + implicit none + + real(kind=pr), intent(in) :: time + !real(kind=pr), intent(in) :: M_wing(1:3,1:3) + real(kind=pr), intent(in) :: M_body(1:3,1:3) + type(diptera), intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + + real(kind=pr) :: eta_stroke + real(kind=pr) :: phi, alpha, theta, phi_dt, alpha_dt, theta_dt + !real(kind=rk) :: phi_l, alpha_l, theta_l, phi_dt_l, alpha_dt_l, theta_dt_l + real(kind=pr), dimension(1:3) :: rot_alpha, rot_theta, rot_phi, & + rot_r_alpha, rot_r_theta, rot_r_phi + real(kind=pr), dimension(1:3,1:3) :: M_wing, M_wing_r, & + M1_tmp, M2_tmp, M1, M2, M3, M1_r, M2_r, M3_r, & + M_stroke, M_stroke_r + + phi = Wing%phi + alpha = Wing%alpha + theta = Wing%theta + phi_dt = Wing%phi_dt + alpha_dt = Wing%alpha_dt + theta_dt = Wing%theta_dt + + !phi_l = Insect%phi_l + !alpha_l = Insect%alpha_l + !theta_l = Insect%theta_l + !phi_dt_l = Insect%phi_dt_l + !alpha_dt_l = Insect%alpha_dt_l + !theta_dt_l = Insect%theta_dt_l + + eta_stroke = Insect%eta_stroke + + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + if (wing%ID == "left") then + call Ry(M1_tmp,eta_stroke) + M_stroke = M1_tmp + elseif (wing%ID == "right") then + call Rx(M1_tmp,pi) + call Ry(M2_tmp,eta_stroke) + M_stroke = matmul(M1_tmp,M2_tmp) + endif + + if (wing%ID == "left") then + call Ry(M1,alpha) + call Rz(M2,theta) ! Order changed (Dmitry, 7 Nov 2013) + call Rx(M3,phi) + M_wing = matmul(M1,matmul(M2,matmul(M3,M_stroke))) + elseif (wing%ID == "right") then + call Ry(M1,-alpha) + call Rz(M2,theta) ! Order changed (Dmitry, 7 Nov 2013) + call Rx(M3,-phi) + M_wing = matmul(M1,matmul(M2,matmul(M3,M_stroke))) + endif + + + !----------------------------------------------------------------------------- + ! angular velocity vectors (in wing system) + !----------------------------------------------------------------------------- + if (wing%ID == "left") then + rot_alpha = (/ 0.0d0, alpha_dt, 0.0d0 /) + rot_theta = (/ 0.0d0, 0.0d0, theta_dt /) + rot_phi = (/ phi_dt, 0.0d0, 0.0d0 /) + elseif (wing%ID == "right") then + rot_alpha = (/ 0.0d0, -alpha_dt, 0.0d0/) + rot_theta = (/ 0.0d0, 0.0d0, theta_dt /) + rot_phi = (/ -phi_dt, 0.0d0, 0.0d0 /) + endif + + ! in the wing coordinate system + wing%rot_rel_wing_w = matmul(M_wing,matmul(transpose(M_stroke),matmul(transpose(M3), & + rot_phi+matmul(transpose(M2),rot_theta+matmul(transpose(M1), & + rot_alpha))))) + !Insect%rot_rel_wing_r_w = matmul(M_wing_r,matmul(transpose(M_stroke_r),matmul(transpose(M3_r), & + !rot_r_phi+matmul(transpose(M2_r),rot_r_theta+matmul(transpose(M1_r), & + !rot_r_alpha))))) + + ! direct definition, equivalent to what is above. + ! Insect%rot_rel_wing_l_w = (/phi_dt_l*cos(alpha_l)*cos(theta_l)-theta_dt_l*sin(alpha_l),& + ! alpha_dt_l-phi_dt_l*sin(theta_l),& + ! theta_dt_l*cos(alpha_l)+phi_dt_l*sin(alpha_l)*cos(theta_l)/) + + ! prior to the call of this routine, the routine body_angular_velocity has + ! computed the body angular velocity (both g/b frames) so here now we can also + ! compute global and absolute wing angular velocities. + wing%rot_rel_wing_b = matmul( transpose(M_wing), wing%rot_rel_wing_w ) + !Insect%rot_rel_wing_r_b = matmul( transpose(M_wing_r), Insect%rot_rel_wing_r_w ) + + Wing%rot_rel_wing_g = matmul( transpose(M_body), Wing%rot_rel_wing_b ) + !Insect%rot_rel_wing_r_g = matmul( transpose(M_body), Insect%rot_rel_wing_r_b ) + + wing%rot_abs_wing_g = wing%rot_rel_wing_g !+ wing%rot_body_g + !Insect%rot_abs_wing_r_g = Insect%rot_body_g + Insect%rot_rel_wing_r_g + + wing%vr0 = wing%rot_rel_wing_g + + call rotate_vector_into_wing_system(wing,Insect%M_body,wing%vr0) + + + !if (Insect%wing_fsi == "yes") then + !********************************** + !** Wing fsi model ** + !********************************** + ! overwrite the left wing + ! Insect%rot_rel_wing_l_w = Insect%STATE(18:20) + ! Insect%rot_rel_wing_l_b = matmul( transpose(M_wing_l), Insect%rot_rel_wing_l_w ) + ! Insect%rot_rel_wing_l_g = matmul( transpose(M_body), Insect%rot_rel_wing_l_b ) + ! the last guy is actually unused, as we have non-rotating body + ! Insect%rot_abs_wing_l_g = Insect%rot_body_g + Insect%rot_rel_wing_l_g + !endif + + +end subroutine + +subroutine flexible_wing_angular_accel( time, wing, Insect ) + implicit none + real(kind=pr), intent(in) :: time + type(flexible_wing), intent (inout) :: wing + type(diptera), intent(inout) :: Insect + + real(kind=pr) :: M_body(1:3,1:3), rot_dt_wing_g(1:3), M_wing_r(1:3,1:3), M_wing_l(1:3,1:3) + type(diptera) :: Insect2 + type(flexible_wing) :: wing2 + real(kind=pr) :: dt,t + + dt = 1.0d-8 + Insect2 = Insect + Wing2 = Wing + + Wing%rot_dt_wing_w = 0.d0 + !Wing%rot_dt_wing_r_w = 0.d0 + + ! fetch motion state at time+dt + call BodyMotion (time+dt, Insect2) + if (wing2%ID == "left") then + call Flexible_wing_motions ( time+dt, wing2, Insect2%kine_wing_l ) + elseif (wing2%ID == "right") then + call Flexible_wing_motions ( time+dt, wing2, Insect2%kine_wing_r ) + endif + call StrokePlane (time+dt, Insect2) + call body_rotation_matrix( Insect2, M_body ) + call flexible_wing_angular_velocities ( time+dt, Wing2, Insect2, M_body ) + ! the current state is already calculated and saved in Wing and Insect variables + + ! use one-sided finite differences to derive the absolute angular velocity with + ! respect to time. NOte in older code versions, this was wrong, as we derived + ! the ang. vel. in the wing coordinate system, which is a moving reference frame. + + ! now happily, the old results are still correct, as long as the body does not rotate + ! see, e.g., this document https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0ahUKEwjzl-XP6_LNAhWoC5oKHUdDCHwQFggoMAI&url=http%3A%2F%2Focw.mit.edu%2Fcourses%2Faeronautics-and-astronautics%2F16-07-dynamics-fall-2009%2Flecture-notes%2FMIT16_07F09_Lec08.pdf&usg=AFQjCNHzEB-n_NMm6K3J1eRpIaGnuKpW0Q&sig2=yEPNin3bL5DnWauNJk2hcw&bvm=bv.126993452,d.bGs&cad=rjt + ! however, if the body moves, an additional term occurs, and this was indeed missing + ! in previous results. + Wing%rot_dt_wing_g = (Wing2%rot_rel_wing_g - Wing%rot_rel_wing_g) / dt + Wing%rot_dt_wing_w = matmul(Wing%M_solver,matmul(Wing%M_wing,matmul(Insect%M_body, Wing%rot_dt_wing_g))) + + Wing%ar0 = Wing%rot_dt_wing_w + + !rot_dt_wing_g = (Insect2%rot_rel_wing_r_g - Insect%rot_rel_wing_r_g) / dt + !Insect%rot_dt_wing_r_w = matmul(M_wing_r,matmul(M_body, rot_dt_wing_g)) + + + ! if (root) then + ! write(*,*) "L new code", Insect%rot_dt_wing_l_w + ! write(*,*) "L old code", (Insect2%rot_rel_wing_l_w - Insect%rot_rel_wing_l_w)/dt + ! write(*,*) "rot_rel_wing_l_g", Insect%rot_rel_wing_l_g + ! write(*,*) "rot_body_g", Insect%rot_body_g + ! write(*,*) "rot_body_b", Insect%rot_body_b + ! write(*,*) "rot_dt_body_g", (Insect2%rot_body_g-Insect%rot_body_g)/dt + ! endif + ! + ! if (root) then + ! t = 0.d0 + ! open (17,file='test.t',status='replace') + ! do while (t<=6.d0) + ! call FlappingMotion_left ( t, Insect) + ! write (17,'(7(es15.8,1x))') t, & + ! Insect%alpha_l, Insect%phi_l, Insect%theta_l, & + ! Insect%alpha_dt_l, Insect%phi_dt_l, Insect%theta_dt_l + ! + ! t = t + 1.0d-5 + ! end do + ! close (17) + ! call abort(7) + ! endif + + ! ! this is the OLD CODE. It is actually wrong, since it computes the time derivative + ! ! in the moving refrence frame of the wing, which is not the actual angular acceleration + ! Insect%rot_dt_wing_r_w = (Insect2%rot_rel_wing_r_w - Insect%rot_rel_wing_r_w)/dt + ! Insect%rot_dt_wing_l_w = (Insect2%rot_rel_wing_l_w - Insect%rot_rel_wing_l_w)/dt + + + !if (Insect%wing_fsi == "yes") then + !********************************** + !** Wing fsi model ** + !********************************** + ! overwrite the left wings acceleration. the right hand side 18,19,20 is the + ! time derivative of the angular velocity, so the acceleration is readily available + ! Insect%rot_dt_wing_l_w = Insect%RHS_THIS(18:20) + !endif + +end subroutine flexible_wing_angular_accel + +!----------------------------------------------------------------------------- +! Return the rotation matrix for the mass-spring solver +!----------------------------------------------------------------------------- +subroutine MSM_solver_rotation_matrix( Wing, M_solver ) +! Because the MSM solver solves the wing deformation in a coordinate system where +! the wing is aligned along the x-axis and the upper surface is upward, oriented +! by the z-axis + + implicit none + + type(flexible_wing), intent (inout) :: wing + real(kind=pr),intent(out) :: M_solver(1:3,1:3) + real(kind=pr),dimension(1:3,1:3) :: M1, M2 + + call Rx(M1,pi/2) + call Rz(M2,pi/2) + M_solver = matmul(M1,M2) + +end subroutine MSM_solver_rotation_matrix + +!----------------------------------------------------------------------------- +! return the rotation matrix for the flexible wing +!----------------------------------------------------------------------------- +subroutine flexible_wing_rotation_matrix( Wing, Insect, M_wing ) + implicit none + + type(diptera),intent(inout) :: Insect + type(flexible_wing), intent (inout) :: wing + real(kind=pr),intent(out) :: M_wing(1:3,1:3) + real(kind=pr),dimension(1:3,1:3) :: M1, M2, M3, M_stroke, M1_tmp, M2_tmp + + !if ( Insect%wing_fsi /= "yes" ) then + ! we're not using the wing fsi solver, so the wings follow a prescribed + ! motion and we can compute the rotation matrix from the angles + if (wing%ID == "left") then + call Ry(M1_tmp,Insect%eta_stroke) + M_stroke = M1_tmp + elseif (wing%ID == "right") then + call Rx(M1_tmp,pi) + call Ry(M2_tmp,Insect%eta_stroke) + M_stroke = matmul(M1_tmp,M2_tmp) + endif + + if (wing%ID == "left") then + call Ry(M1,Wing%alpha) + call Rz(M2,Wing%theta) ! Order changed (Dmitry, 7 Nov 2013) + call Rx(M3,Wing%phi) + M_wing = matmul(M1,matmul(M2,matmul(M3,M_stroke))) + elseif (wing%ID == "right") then + call Ry(M1,-Wing%alpha) + call Rz(M2,Wing%theta) ! Order changed (Dmitry, 7 Nov 2013) + call Rx(M3,-Wing%phi) + M_wing = matmul(M1,matmul(M2,matmul(M3,M_stroke))) + endif + + !else + !********************************** + !** Wing fsi model ** + !********************************** + ! in the wing FSI case, a quaternion-based formulation is used to get the + ! rotation matrix from the wing quaterion. note the wing quaternion are the + ! entries 14,15,16,17 of the Insect%STATE vector + ! entries 18,19,20 are the angular VELOCITY of the wing + ! call rotation_matrix_from_quaternion( Insect%STATE(14:17), M_wing_l) + !endif +end subroutine flexible_wing_rotation_matrix + + + logical function Vector_isNAN(f) real(kind=pr), intent(in) :: f(:) integer :: a, i @@ -207,3 +851,198 @@ logical function Matrix_isNAN(f,i,j) enddo enddo end function + +subroutine truncated_triangular_prism_centroid(centroid,tri1,tri2,tri3,press_tri1,press_tri2,press_tri3) +!This function calculates the centroid of a truncated triangular prism by simple +!barycentric interpolation +! NOTICE: this can also be done by calculating directly the centroid of the truncated +! formed by the triangle and the pressure at the three vertices by deviding it +! into an ordinary triangular prism "minus" a pyramid + + implicit none + real(kind=pr), dimension(1:3), intent(inout) :: centroid + real(kind=pr), dimension(1:3), intent(in) :: tri1,tri2,tri3 + !array contains the pressure at the three vertices of the triangle tri1, tri2, tri3 + real(kind=pr), intent(in) :: press_tri1,press_tri2,press_tri3 + !the normal vector of the triangle +! real(kind=pr), dimension(1:3), intent(in) :: normal + + centroid(1:3) =(press_tri1*tri1(1:3) + & + press_tri2*tri2(1:3) + & + press_tri3*tri3(1:3))/ & + (press_tri1 + press_tri2 + press_tri3) + +end subroutine + +real(kind=pr) function pressure_trilinear_interp(x0, dx, field, x_target, periodic) + use vars, only: pr, abort, mpirank, ga, gb + use mpi + implicit none + ! origin of array grid. Note this is a compatibility issue with WABBIT. In FLUSI + ! we usually have only one grid start starts at 0,0,0 and then the variables ra(:) and rb(:) + ! inidicate which part is on the mpirank. In WABBIT we have bocks, always 1:n,1:n,1:n but + ! each with its own origin and spacing. For transferability, this routine is written in the + ! general style. In FLUSI: + ! x0=(/dble(ra(1))*dx, dble(ra(2))*dy, dble(ra(3))*dz/) and dx=(/dx,dy,dz/) + ! or, with ghost nodes: + ! x0=(/dble(ga(1))*dx, dble(ga(2))*dy, dble(ga(3))*dz/) and dx=(/dx,dy,dz/) + real(kind=pr),dimension(1:3),intent(in) :: x0 + ! spacing of array grid + real(kind=pr),dimension(1:3),intent(in) :: dx + ! the point at which we wish to interpolate + real(kind=pr),dimension(1:3),intent(in) :: x_target + ! actual field. zero-based indexing. + real(kind=pr),intent(inout) :: field(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) + ! assume periodicity of field or not? + ! ATTENTION: this means we suppose the array FIELDS to be PERIODIC ON ITS OWN + ! the global field may well be PERIODIC, but if you pass mpi-chunks to this routine + ! you MUST set periodic=.false. even if the global field is periodic. + logical, intent(in) :: periodic + + ! array bounds of the field array + integer,dimension(1:3) :: lbounds, ubounds + real(kind=pr) :: xd, yd, zd + real(kind=pr) :: c00, c10, c01, c11, c0, c1 + integer :: ix, iy, iz, ix1, iy1, iz1 + + if (ga(1)==0) then + lbounds(1) = ga(1) + else + lbounds(1) = ga(1)! - 1 + endif + + if (ga(2)==0) then + lbounds(2) = ga(2) + else + lbounds(2) = ga(2) !- 1 + endif + + if (ga(3)==0) then + lbounds(3) = ga(3) + else + lbounds(3) = ga(3) !- 1 + endif + + ubounds = gb(1:3)!(/size(field,1), size(field,2), size(field,3)/) - 1 + + !write(*,'("Im CPU ",i5," gives pressure in x-direction from",i5," to ",i5," & + ! in y-direction from",i5," to ",i5," & + ! and in z-direction from",i5," to ",i5,".")') mpirank, ga(1), gb(1), & + ! ga(2), gb(2), ga(3), gb(3) + + ! indices of cube containing the target point, lower end + ix = floor( (x_target(1)-x0(1))/dx(1) ) + ga(1) + iy = floor( (x_target(2)-x0(2))/dx(2) ) + ga(2) + iz = floor( (x_target(3)-x0(3))/dx(3) ) + ga(3) + + ! distance to lower point, normalized (0..1) + xd = ( x_target(1)-(dble(ix)*dx(1)+x0(1)) ) / dx(1) + yd = ( x_target(2)-(dble(iy)*dx(2)+x0(2)) ) / dx(2) + zd = ( x_target(3)-(dble(iz)*dx(3)+x0(3)) ) / dx(3) + + ! if the point is not on the grid, return a very large, negative value + pressure_trilinear_interp = -9.9d10 + + if (periodic) then + ! *** periodic case *** + if ( (ix>=lbounds(1)).and.(ix<=ubounds(1)) ) then + if ( (iy>=lbounds(2)).and.(iy<=ubounds(2)) ) then + if ( (iz>=lbounds(3)).and.(iz<=ubounds(3)) ) then + ix1 = ix+1 + iy1 = iy+1 + iz1 = iz+1 + + ! periodization. note ix,iy,iz can be ubounds at most, so the next point + ! ix+1 would be the first point again. + if (ix1>ubounds(1)) ix1 = lbounds(1) + if (iy1>ubounds(2)) iy1 = lbounds(2) + if (iz1>ubounds(3)) iz1 = lbounds(3) + + c00 = field(ix,iy ,iz )*(1.d0-xd)+field(ix1 ,iy ,iz )*xd + c10 = field(ix,iy1 ,iz )*(1.d0-xd)+field(ix1 ,iy1 ,iz )*xd + c01 = field(ix,iy ,iz1)*(1.d0-xd)+field(ix1 ,iy ,iz1)*xd + c11 = field(ix,iy1 ,iz1)*(1.d0-xd)+field(ix1 ,iy1 ,iz1)*xd + + c0 = c00*(1.d0-yd) + c10*yd + c1 = c01*(1.d0-yd) + c11*yd + + pressure_trilinear_interp = c0*(1.d0-zd)+c1*zd + endif + endif + endif + else + + ! *** non-periodic case *** + if ( (ix>=lbounds(1)).and.(ix=lbounds(2)).and.(iy=lbounds(3)).and.(iz 1.0d-15) .or. (A < -1.0d-15)) +! nnz = count(A /= 0.0d0) + ! write(*,*) nnz + allocate(colptr(1:n+1)) + allocate(rowind(1:nnz)) + allocate(values(1:nnz)) + + p = 1 ! Index into the rowind and values arrays (1 based) + do j=1,n ! Iterate over each column + colptr(j) = p ! Save the starting index for this column in 0 based format + do i=1,n ! Iterate over the rows, looking for non zero entries + if ((A(i,j) > 1.0d-15) .or. (A(i,j) < -1.0d-15)) then + rowind(p) = i ! Zero based + values(p) = A(i,j) + p = p + 1 + endif + end do + end do + colptr(n+1) = p ! Save the final index in 0 based format +! write(*,*) colptr(n+1), nnz + ! Check that the final index points to the nz'th entry + if (colptr(n+1) /= (nnz + 1)) then + write(*,*) "Something went wrong" + write(*,*) colptr(n+1), nnz + endif + +end subroutine diff --git a/src/fluid_time_step.f90 b/src/fluid_time_step.f90 index e86f324..1d8c8f2 100644 --- a/src/fluid_time_step.f90 +++ b/src/fluid_time_step.f90 @@ -32,14 +32,14 @@ ! scalars passive scalars at new time level !------------------------------------------------------------------------------- subroutine FluidTimestep(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& - expvis,press,scalars,scalars_rhs,Insect,beams) + expvis,press,scalars,scalars_rhs,Insect,beams,Wings) use mpi use p3dfft_wrapper use vars use solid_model + use flexible_model use module_insects use basic_operators - use krylov_module implicit none real(kind=pr),intent(inout)::time,dt1,dt0 @@ -57,42 +57,40 @@ subroutine FluidTimestep(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& complex(kind=pr),intent(inout)::uk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) complex(kind=pr),intent(inout)::nlk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq,0:nrhs-1) complex(kind=pr),intent(inout)::workc(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:ncw) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout)::beams type(diptera),intent(inout)::Insect - t1=MPI_wtime() + t1 = MPI_wtime() ! Call fluid advancement subroutines. select case(iTimeMethodFluid) case("RK2") call RungeKutta2(time,it,dt0,dt1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) case("RK4") call RungeKutta4(time,it,dt0,dt1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) - case("krylov") - call krylov(time,it,dt0,dt1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) case("AB2") if(it == 0) then call euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) else call adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) endif case ("AB2_rigid_solid") call AB2_rigid_solid(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) case("FSI_AB2_iteration") call FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work, & - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) case("FSI_AB2_staggered") call FSI_AB2_staggered(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work, & - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) case("FSI_AB2_semiimplicit") call FSI_AB2_semiimplicit(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work, & - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,Wings) case default call abort(10001, "Error! iTimeMethodFluid unknown. Abort.") end select @@ -144,7 +142,7 @@ subroutine FluidTimestep(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& endif - time_fluid=time_fluid + MPI_wtime() - t1 + call toc('FluidTimestep (wrapper)', MPI_wtime()-t1) end subroutine FluidTimestep @@ -155,11 +153,12 @@ end subroutine FluidTimestep ! adapted from the 2D codes (V12), based on the PhD thesis of von Scheven !------------------------------------------------------------------------------- subroutine FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -175,6 +174,7 @@ subroutine FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& real(kind=pr),intent(inout)::press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout) :: beams type(diptera),intent(inout)::Insect @@ -183,7 +183,6 @@ subroutine FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& real(kind=pr),dimension(0:ns-1) :: deltap_new, deltap_old, bpress_old_iterating real(kind=pr)::bruch, upsilon_new, upsilon_old, kappa2, ROC1,ROC2, norm real(kind=pr)::omega_old, omega_new - type(diptera)::Insect_dummy integer :: inter logical :: iterate ROC1 = 0.d0 @@ -226,7 +225,7 @@ subroutine FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& !--------------------------------------------------------------------------- ! create mask !--------------------------------------------------------------------------- - call create_mask(time, Insect_dummy, beams) + call create_mask(time, Insect, beams, wings) !--------------------------------------------------------------------------- ! advance fluid to from (n) to (n+1) @@ -242,10 +241,10 @@ subroutine FSI_AB2_iteration(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& if(it == 0) then call euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,inter,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,inter,Insect,beams,wings) else call adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,inter,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,inter,Insect,beams,wings) endif !--------------------------------------------------------------------------- @@ -335,11 +334,12 @@ end subroutine FSI_AB2_iteration ! or stable. !------------------------------------------------------------------------------- subroutine FSI_AB2_staggered(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& - workc,expvis,press,scalars,scalars_rhs,Insect,beams) + workc,expvis,press,scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -355,11 +355,12 @@ subroutine FSI_AB2_staggered(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& real(kind=pr),intent(inout)::u(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nd) real(kind=pr),intent(inout)::vort(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nd) real(kind=pr),intent(inout)::expvis(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:nf) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout) :: beams type(diptera),intent(inout)::Insect ! useful error messages - if (use_solid_model/="yes") then + if (use_solid_model/="yes" .and. use_flexible_wing_model/="yes") then call abort(10003, "using FSI_AB2_staggered without solid model?") endif @@ -374,22 +375,34 @@ subroutine FSI_AB2_staggered(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,& !--------------------------------------------------------------------------- if(it == 0) then call euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) else call adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) endif !--------------------------------------------------------------------------- ! get forces at old time level, since press is at t^n. ! save to both beam%pressure_new and beam%pressure_old !--------------------------------------------------------------------------- - call get_surface_pressure_jump (time, beams(1), press) + if (use_solid_model=="yes") then + call get_surface_pressure_jump (time, beams(1), press) + endif + + !--------------------------------------------------------------------------- + ! get external forces at new time level + !--------------------------------------------------------------------------- + if (use_flexible_wing_model=="yes") then + call get_pressure_on_wing_surfaces(wings,press) + endif !--------------------------------------------------------------------------- ! advance solid model from (n) to (n+1) !--------------------------------------------------------------------------- - call SolidSolverWrapper( time, dt1, beams ) + if (use_solid_model=="yes") call SolidSolverWrapper(time, dt1, beams) + if (use_flexible_wing_model=="yes") then + call FlexibleSolidSolverWrapper (time, dt0, dt1, it, wings, Insect) + endif end subroutine FSI_AB2_staggered @@ -402,11 +415,12 @@ end subroutine FSI_AB2_staggered ! FSI_AB2_staggered. !------------------------------------------------------------------------------- subroutine FSI_AB2_semiimplicit(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,& - work,workc,expvis,press,scalars,scalars_rhs,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,Insect,beams,Wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -422,12 +436,13 @@ subroutine FSI_AB2_semiimplicit(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,& real(kind=pr),intent(inout)::press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout) :: beams type(diptera),intent(inout)::Insect - type(diptera)::Insect_dummy + real(kind=pr) :: t0 ! useful error messages - if (use_solid_model/="yes") then + if (use_solid_model/="yes" .and. use_flexible_wing_model/="yes") then call abort(10004, "using FSI_AB2_semiimplicit without solid model?") endif @@ -440,36 +455,56 @@ subroutine FSI_AB2_semiimplicit(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,& ! the right hand side only at the old time level. For a RungeKutta type solver, ! the mask has to be created at every sub-time step, the routine are more intertwined. !--------------------------------------------------------------------------- + t0 = MPI_wtime() if(it == 0) then ! very first time step is euler explicit, as the previous right hand side (n-1) ! is not available call euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,Wings) else ! all other time steps use AB2 call adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,Wings) endif + call toc("FluidTimestep (FSI_AB2_semiimplicit::fluid)", MPI_wtime()-t0) !--------------------------------------------------------------------------- ! get forces at old/new time level !--------------------------------------------------------------------------- - ! getting the pressure at the old time level is not always required - ! if (TimeMethodSolid /= "BDF2") then - call get_surface_pressure_jump (time, beams(1), press, timelevel="old") - ! endif - - ! note the fluid solver advances only the velocity field in fourier space, uk - ! and not the pressure field. "press" is in fact at the old time level (n) at - ! this point. So now we update "press" to be at the new time level (n+1) as well - ! NOTE: we can overwrite NLK(n1) since this is the one overwritten in the next call - call pressure_from_uk_use_existing_mask(time,u,uk,nlk(:,:,:,:,n1),vort,work,workc,press,Insect) - call get_surface_pressure_jump (time, beams(1), press, timelevel="new") + if (use_solid_model=="yes") then + t0 = MPI_wtime() + ! getting the pressure at the old time level is not always required + ! if (TimeMethodSolid /= "BDF2") then + call get_surface_pressure_jump (time, beams(1), press, timelevel="old") + ! endif + + ! note the fluid solver advances only the velocity field in fourier space, uk + ! and not the pressure field. "press" is in fact at the old time level (n) at + ! this point. So now we update "press" to be at the new time level (n+1) as well + ! NOTE: we can overwrite NLK(n1) since this is the one overwritten in the next call + call pressure_from_uk_use_existing_mask(time,u,uk,nlk(:,:,:,:,n1),vort,work,workc,press,Insect) + call get_surface_pressure_jump (time, beams(1), press, timelevel="new") + call toc("FluidTimestep (FSI_AB2_semiimplicit::get_surface_pressure_jump)", MPI_wtime()-t0) + endif + + !--------------------------------------------------------------------------- + ! get external forces at new time level + !--------------------------------------------------------------------------- + if (use_flexible_wing_model=="yes") then + t0 = MPI_wtime() + call get_pressure_on_wing_surfaces(wings,press) + call toc("FluidTimestep (FSI_AB2_semiimplicit::get_pressure_on_wing_surfaces)", MPI_wtime()-t0) + endif !--------------------------------------------------------------------------- ! advance solid model from (n) to (n+1) !--------------------------------------------------------------------------- - call SolidSolverWrapper( time, dt1, beams ) + t0 = MPI_wtime() + if (use_solid_model=="yes") call SolidSolverWrapper( time, dt1, beams ) + if (use_flexible_wing_model=="yes") then + call FlexibleSolidSolverWrapper ( time, dt0, dt1, it, wings, Insect ) + endif + call toc("FluidTimestep (FSI_AB2_semiimplicit::advance solid model)", MPI_wtime()-t0) end subroutine FSI_AB2_semiimplicit @@ -480,12 +515,13 @@ end subroutine FSI_AB2_semiimplicit !------------------------------------------------------------------------------- ! FIXME: add documentation: which arguments are used for what? subroutine rungekutta2(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& - scalars,scalars_rhs,Insect,beams) + scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model use module_insects + use flexible_model implicit none real(kind=pr),intent(inout)::time,dt1,dt0 @@ -503,6 +539,7 @@ subroutine rungekutta2(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) integer::i type(solid),dimension(1:nbeams),intent(inout)::beams + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(diptera),intent(inout)::Insect if ((use_passive_scalar==1).and.(mpirank==1)) then @@ -510,7 +547,7 @@ subroutine rungekutta2(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& endif !-- Calculate fourier coeffs of nonlinear rhs and forcing (for the euler step) - call cal_nlk(time,it,nlk(:,:,:,:,0),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time,it,nlk(:,:,:,:,0),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) call adjust_dt(time,u,dt1) !-- multiply the RHS with the viscosity, first the velocity @@ -545,7 +582,7 @@ subroutine rungekutta2(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& endif !-- RHS using the euler velocity - call cal_nlk(time,it,nlk(:,:,:,:,1),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time,it,nlk(:,:,:,:,1),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) ! do the actual time step. note the minus sign.in the original formulation, it ! reads: u^n+1=u^n + dt/2*( N(u^n)*vis + N(u_euler) ) @@ -563,12 +600,13 @@ end subroutine rungekutta2 ! RK4 scheme with EXPLICIT diffusion subroutine rungekutta4(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& - scalars,scalars_rhs,Insect,beams) + scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model use module_insects + use flexible_model use basic_operators implicit none @@ -586,6 +624,7 @@ subroutine rungekutta4(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) type(solid),dimension(1:nbeams),intent(inout)::beams + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(diptera),intent(inout)::Insect integer::i @@ -605,24 +644,24 @@ subroutine rungekutta4(time,it,dt0,dt1,u,uk,nlk,vort,work,workc,expvis,press,& nlk(:,:,:,:,4) = uk !-- FIRST runge kutta step - call cal_nlk(time,it,nlk(:,:,:,:,0),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time,it,nlk(:,:,:,:,0),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) call dealias(nlk(:,:,:,:,0)) call adjust_dt(time,u,dt1) !-- SECOND runge kutta step uk = nlk(:,:,:,:,4) + 0.5d0*dt1*nlk(:,:,:,:,0) - call cal_nlk(time+0.5d0*dt1,it,nlk(:,:,:,:,1),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time+0.5d0*dt1,it,nlk(:,:,:,:,1),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) call dealias(nlk(:,:,:,:,1)) !--THIRD runge kutta step uk = nlk(:,:,:,:,4) + 0.5d0*dt1*nlk(:,:,:,:,1) - call cal_nlk(time+0.5d0*dt1,it,nlk(:,:,:,:,2),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time+0.5d0*dt1,it,nlk(:,:,:,:,2),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) call dealias(nlk(:,:,:,:,2)) !-- FOURTH runge kutta step uk = nlk(:,:,:,:,4) + dt1*nlk(:,:,:,:,2) - call cal_nlk(time+dt1,it,nlk(:,:,:,:,3),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams) + call cal_nlk(time+dt1,it,nlk(:,:,:,:,3),uk,u,vort,work,workc,press,scalars,scalars_rhs,Insect,beams,wings) call dealias(nlk(:,:,:,:,3)) !-- FINAL step @@ -636,11 +675,12 @@ end subroutine rungekutta4 ! Note this is not an optimized Euler. It only does things we need for AB2. subroutine euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort,work,workc,& - expvis,press,scalars,scalars_rhs,iter,Insect,beams) + expvis,press,scalars,scalars_rhs,iter,Insect,beams,wings) use mpi use p3dfft_wrapper use vars use solid_model + use flexible_model use module_insects implicit none @@ -659,6 +699,7 @@ subroutine euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort,work,workc,& real(kind=pr),intent(inout)::press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout)::beams type(diptera),intent(inout)::Insect real(kind=pr)::t1 @@ -666,7 +707,8 @@ subroutine euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort,work,workc,& !-- Calculate fourier coeffs of nonlinear rhs and forcing call cal_nlk(time,it,nlk(:,:,:,:,n0),uk,u,vort,work,workc,press,& - scalars,scalars_rhs(:,:,:,:,n0),Insect,beams) + scalars,scalars_rhs(:,:,:,:,n0),Insect,beams,wings) + call adjust_dt(time,u,dt1) !-- Compute integrating factor, if necesssary @@ -701,9 +743,7 @@ subroutine euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort,work,workc,& if ((method=="fsi").and.(use_passive_scalar==1).and.(compute_scalar)) then !-- advance passive scalar (no integrating factor here!!) - t1 = MPI_wtime() scalars = scalars + dt1*scalars_rhs(:,:,:,:,n0) - time_scalar = time_scalar + MPI_wtime() - t1 endif if (mpirank ==0) write(*,'(A)') "*** info: did startup euler............" @@ -712,11 +752,12 @@ end subroutine euler_startup ! FIXME: add documentation: which arguments are used for what? subroutine adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& - expvis,press,scalars,scalars_rhs,iter,Insect,beams) + expvis,press,scalars,scalars_rhs,iter,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -735,6 +776,7 @@ subroutine adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& real(kind=pr),intent(inout)::press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout)::beams type(diptera),intent(inout)::Insect real(kind=pr)::b10,b11,t1 @@ -742,7 +784,7 @@ subroutine adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& !-- Calculate fourier coeffs of nonlinear rhs and forcing call cal_nlk(time,it,nlk(:,:,:,:,n0),uk,u,vort,work,workc,press,& - scalars,scalars_rhs(:,:,:,:,n0),Insect,beams) + scalars,scalars_rhs(:,:,:,:,n0),Insect,beams,wings) !-- calculate time step that will be made call adjust_dt(time,u,dt1) !--conceptually, the next line @@ -787,20 +829,19 @@ subroutine adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& !-- advance passive scalar in time if ((method=="fsi").and.(use_passive_scalar==1).and.(compute_scalar)) then !-- advance passive scalar (no integrating factor here!!) - t1 = MPI_wtime() scalars = scalars + b10*scalars_rhs(:,:,:,:,n0) + b11*scalars_rhs(:,:,:,:,n1) - time_scalar = time_scalar + MPI_wtime() - t1 endif end subroutine adamsbashforth ! time stepper for rigid soldi FSI, for example insect takeoff or falling sphere subroutine AB2_rigid_solid(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& - expvis,press,scalars,scalars_rhs,Insect,beams) + expvis,press,scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -820,6 +861,7 @@ subroutine AB2_rigid_solid(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& real(kind=pr),intent(inout) :: scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) real(kind=pr)::b10,b11,t1 integer::i + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nbeams),intent(inout)::beams type(diptera),intent(inout)::Insect @@ -838,10 +880,10 @@ subroutine AB2_rigid_solid(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& !--------------------------------------------------------------------------- if (it == 0) then call euler_startup(time,it,dt0,dt1,n0,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) else call adamsbashforth(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort, & - work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams) + work,workc,expvis,press,scalars,scalars_rhs,0,Insect,beams,wings) endif !--------------------------------------------------------------------------- @@ -852,7 +894,7 @@ subroutine AB2_rigid_solid(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,work,workc,& call cal_unst_corrections ( time, dt0, Insect ) endif call cal_drag ( time, u, Insect ) ! note u is OLD time level - time_drag = time_drag + MPI_wtime() - t1 + call toc("FluidTimestep (AB2_rigid_solid::forces)", MPI_wtime()-t1) !--------------------------------------------------------------------------- ! solve Newton's second law @@ -886,6 +928,8 @@ subroutine adjust_dt(time,u,dt1) real(kind=pr), intent(out)::dt1 real(kind=pr)::umax,t , t1,t2 + + if (dt_fixed>0.0d0) then !-- fix the time step no matter what. the result may be unstable. dt1=dt_fixed @@ -1041,9 +1085,9 @@ subroutine set_mean_flow(uk,time) ! sinusoidal forcing uses f=unity ! for some reason we overwrite uxmean later by the actual, current meanflow ! which means we cannot use uxmean for focing with sinusoidfal mean flow. - if (iMeanFlow_x=="sinusoidal") uk(0,0,0,1)=umean_amplitude(1)*dsin(2.d0*pi*time) - if (iMeanFlow_y=="sinusoidal") uk(0,0,0,2)=umean_amplitude(2)*dsin(2.d0*pi*time) - if (iMeanFlow_z=="sinusoidal") uk(0,0,0,3)=umean_amplitude(3)*dsin(2.d0*pi*time) + if (iMeanFlow_x=="sinusoidal") uk(0,0,0,1)=umean_amplitude(1)*dsin(2.d0*pi*umean_freq*time) + if (iMeanFlow_y=="sinusoidal") uk(0,0,0,2)=umean_amplitude(2)*dsin(2.d0*pi*umean_freq*time) + if (iMeanFlow_z=="sinusoidal") uk(0,0,0,3)=umean_amplitude(3)*dsin(2.d0*pi*umean_freq*time) endif end subroutine set_mean_flow diff --git a/src/flusi.f90 b/src/flusi.f90 index 366fd82..5104705 100644 --- a/src/flusi.f90 +++ b/src/flusi.f90 @@ -17,6 +17,9 @@ program FLUSI call MPI_COMM_SIZE (MPI_COMM_WORLD,mpisize,mpicode) call MPI_COMM_RANK (MPI_COMM_WORLD,mpirank,mpicode) + ! this helps displaying the walltime (in the global var time_total) + time_total = MPI_wtime() + if (mpirank==0) root=.true. ! this is a fallback: @@ -87,6 +90,9 @@ program FLUSI trim(adjustl(infile)) // " is unkown.." endif + ! prints the profiling on screen + call summarize_profiling( MPI_COMM_WORLD ) + ! normal exit if (root) then open (15, file='return', status='replace') @@ -94,6 +100,8 @@ program FLUSI close(15) endif + + call MPI_FINALIZE(mpicode) call exit(0) end program FLUSI @@ -106,6 +114,7 @@ subroutine Start_Simulation() use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects use slicing use turbulent_inlet_module @@ -131,6 +140,8 @@ subroutine Start_Simulation() real(kind=pr),dimension(:,:,:,:,:),allocatable :: scalars_rhs ! this is the insect we're using (object oriented) type(diptera) :: Insect + ! this is the flexible wings we're using (object oriented) + type(flexible_wing),dimension(1:nWings) :: Wings ! this is the solid model beams: type(solid), dimension(1:nBeams) :: beams @@ -143,14 +154,6 @@ subroutine Start_Simulation() ncw=1 ! number of complex values work arrays (decide that later) nrhs=2 ! number of right-hand side registers - ! initialize timing variables - time_fft=0.d0; time_ifft=0.d0; time_vis=0.d0; time_mask=0.d0; time_nlk2=0.d0 - time_vor=0.d0; time_curl=0.d0; time_p=0.d0; time_nlk=0.d0; time_fluid=0.d0 - time_bckp=0.d0; time_save=0.d0; time_total=MPI_wtime(); time_u=0.d0; time_sponge=0.d0 - time_scalar=0.d0 - time_solid=0.d0; time_drag=0.d0; time_surf=0.d0; time_LAPACK=0.d0 - time_hdf5=0.d0; time_integrals=0.d0; time_rhs=0.d0; time_nlk_scalar=0.d0 - tslices=0.d0 if (root) then write(*,'(A)') '--------------------------------------' @@ -178,6 +181,9 @@ subroutine Start_Simulation() if (use_solid_model=="yes") then if (interp=='linear') ng=1 ! one ghost point if (interp=='delta') ng=3 ! three ghost points + elseif (use_flexible_wing_model=="yes") then + if (wing_interp=='linear') ng=1 ! one ghost point + if (wing_interp=='delta') ng=3 ! three ghost points else ! we dont need ghosts when not solving the solid model ng=0 ! zero ghost points @@ -259,7 +265,7 @@ subroutine Start_Simulation() memory = memory + dble(nrw)*mem_field ! pressure array. this is with ghost points for interpolation - if (use_solid_model=="yes") then + if (use_solid_model=="yes" .or. use_flexible_wing_model=="yes") then allocate(press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3))) if(mpirank==0) write(*,*) "press array is allocated" memory = memory + mem_field @@ -349,7 +355,7 @@ subroutine Start_Simulation() ! Initial condition !----------------------------------------------------------------------------- call init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& - press,scalars,scalars_rhs,Insect,beams) + press,scalars,scalars_rhs,Insect,beams,wings) !----------------------------------------------------------------------------- ! Initialize time series output files, if not resuming a backup @@ -387,7 +393,7 @@ subroutine Start_Simulation() t1 = MPI_wtime() call time_step(time,dt0,dt1,n0,n1,it,u,uk,nlk,vort,work,workc,explin,& - press,scalars,scalars_rhs,infile,Insect,beams ) + press,scalars,scalars_rhs,infile,Insect,beams,wings ) t2 = MPI_wtime() - t1 !----------------------------------------------------------------------------- @@ -424,100 +430,12 @@ subroutine Start_Simulation() ! release other memory call fft_free - !------------------------- - ! Show the breakdown of timing information - !------------------------- - call show_timings(t2) end subroutine Start_Simulation - ! Output information on where the algorithm spent the most time. - subroutine show_timings(t2) - use vars - use module_helpers - implicit none - real (kind=pr) :: t2, t3 - - 3 format(80("-")) - 8 format(es12.4," (",f5.1,"%) :: ",A) - t3 = t2 - t2 = mpisum(t2) - - time_fft = mpisum(time_fft) - time_ifft = mpisum(time_ifft) - time_mask = mpisum(time_mask) - time_fluid= mpisum(time_fluid) - time_integrals =mpisum(time_integrals) - time_save=mpisum(time_save) - time_bckp=mpisum(time_bckp) - tslices=mpisum(tslices) - time_hdf5=mpisum(time_hdf5) - time_vis=mpisum(time_vis) - time_solid=mpisum(time_solid) - time_rhs=mpisum(time_rhs) - time_surf=mpisum(time_surf) - time_p=mpisum(time_p) - time_nlk2=mpisum(time_nlk2) - time_nlk_scalar=mpisum(time_nlk_scalar) - time_scalar=mpisum(time_scalar) - time_u=mpisum(time_u) - time_vor=mpisum(time_vor) - time_sponge=mpisum(time_sponge) - time_curl=mpisum(time_curl) - -if (mpirank/=0) return - - write(*,3) - write(*,'("*** Timings")') - write(*,3) - write(*,'("of the total time ",es12.4,", FLUSI spend ",es12.4," (",f5.1,"%) on FFTS")') & - t2, (time_fft)+(time_ifft),100.d0*((time_fft)+(time_ifft))/t2 - write(*,3) - write(*,'("time stepping (top level tasks)")') - - write(*,8) (time_mask), 100.d0*(time_mask)/t2, "create_mask" - write(*,8) (time_fluid), 100.d0*(time_fluid)/t2, "fluid time stepping" - write(*,8) (time_integrals), 100.d0*(time_integrals)/t2, "integrals" - write(*,8) (time_save), 100.d0*(time_save)/t2, "save fields" - write(*,8) (time_bckp), 100.d0*(time_bckp)/t2, "backuping" - write(*,8) (tslices), 100.d0*(tslices)/t2, "slicing" - write(*,3) - write(*,'("save fields:")') - write(*,8) (time_hdf5), 100.d0*(time_hdf5)/t2, "hdf5 disk dumping" - write(*,3) - - write(*,'("Fluid time stepping:")') - write(*,8) (time_vis),100.d0*(time_vis/t2),"cal_vis" - write(*,8) (time_rhs),100.d0*(time_rhs/t2),"cal_nlk" - write(*,8) (time_solid),100.d0*(time_solid/t2),"solid model" - write(*,8) (time_surf),100.d0*(time_surf/t2),"surface interpolation" - write(*,3) - - write(*,'("Fluid right hand side:")') - write(*,8) (time_nlk2),100.d0*(time_nlk2/t2),"cal_nlk_fsi" - write(*,8) (time_p),100.d0*(time_p/t2),"pressure" - write(*,8) (time_nlk_scalar),100.d0*(time_nlk_scalar/t2),"scalar rhs" - write(*,8) (time_scalar),100.d0*(time_scalar/t2),"passive scalar" - write(*,3) - - write(*,'("cal_nlk_fsi:")') - write(*,8) (time_u),100.d0*(time_u)/t2,"velocity" - write(*,8) (time_vor),100.d0*(time_vor)/t2,"vorticity" - write(*,8) (time_sponge),100.d0*(time_sponge)/t2,"sponge" - write(*,8) (time_curl),100.d0*(time_curl)/t2,"nonlinear term" - write(*,3) - write(*,'("Integral walltime ",es12.4," (",i7," CPUh)")') t2, nint( t2*dble(mpisize)/3600.d0 ) - write(*,'("Actual walltime ",es12.4," (",i7," CPUh)")') t3, nint( t3*dble(mpisize)/3600.d0 ) - write(*,3) - write(*,'(A)') 'Finalizing computation....' - write(*,3) - end subroutine show_timings - - - - subroutine initialize_time_series_files() +subroutine initialize_time_series_files() use vars use module_helpers implicit none @@ -552,15 +470,48 @@ subroutine initialize_time_series_files() "Momentx_unst","Momenty_unst","Momentz_unst",& "Aero_Power", "Inert power" close (14) + if (endcolor==5) then + open (14,file='forces_part4.t',status='replace') + write (14,'(15(A15,1x))') "% time","Forcex","Forcey","Forcez",& + "Forcex_unst","Forcey_unst","Forcez_unst",& + "Momentx","Momenty","Momentz",& + "Momentx_unst","Momenty_unst","Momentz_unst",& + "Aero_Power", "Inert power" + close (14) + open (14,file='forces_part5.t',status='replace') + write (14,'(15(A15,1x))') "% time","Forcex","Forcey","Forcez",& + "Forcex_unst","Forcey_unst","Forcez_unst",& + "Momentx","Momenty","Momentz",& + "Momentx_unst","Momenty_unst","Momentz_unst",& + "Aero_Power", "Inert power" + close (14) + endif open (14,file='kinematics.t',status='replace') - write (14,'(26(A15,1x))') "% time","xc_body_g","yc_body_g","zc_body_g",& - "psi","beta","gamma","eta_stroke",& - "alpha_l","phi_l","theta_l",& - "alpha_r","phi_r","theta_r",& - "rot_l_w_x","rot_l_w_y","rot_l_w_z",& - "rot_r_w_x","rot_r_w_y","rot_r_w_z",& - "rot_dt_l_w_x","rot_dt_l_w_y","rot_dt_l_w_z",& - "rot_dt_r_w_x","rot_dt_r_w_y","rot_dt_r_w_z" + if (endcolor==5) then + write (14,'(44(A15,1x))') "% time","xc_body_g","yc_body_g","zc_body_g",& + "psi","beta","gamma","eta_stroke",& + "alpha_l","phi_l","theta_l",& + "alpha_r","phi_r","theta_r",& + "rot_l_w_x","rot_l_w_y","rot_l_w_z",& + "rot_r_w_x","rot_r_w_y","rot_r_w_z",& + "rot_dt_l_w_x","rot_dt_l_w_y","rot_dt_l_w_z",& + "rot_dt_r_w_x","rot_dt_r_w_y","rot_dt_r_w_z",& + "alpha_l2","phi_l2","theta_l2",& + "alpha_r2","phi_r2","theta_r2",& + "rot_l2_w_x","rot_l2_w_y","rot_l2_w_z",& + "rot_r2_w_x","rot_r2_w_y","rot_r2_w_z",& + "rot_dt_l2_w_x","rot_dt_l2_w_y","rot_dt_l2_w_z",& + "rot_dt_r2_w_x","rot_dt_r2_w_y","rot_dt_r2_w_z" + else + write (14,'(26(A15,1x))') "% time","xc_body_g","yc_body_g","zc_body_g",& + "psi","beta","gamma","eta_stroke",& + "alpha_l","phi_l","theta_l",& + "alpha_r","phi_r","theta_r",& + "rot_l_w_x","rot_l_w_y","rot_l_w_z",& + "rot_r_w_x","rot_r_w_y","rot_r_w_z",& + "rot_dt_l_w_x","rot_dt_l_w_y","rot_dt_l_w_z",& + "rot_dt_r_w_x","rot_dt_r_w_y","rot_dt_r_w_z" + endif close (14) open (14,file='muscle.t',status='replace') close (14) @@ -599,8 +550,8 @@ subroutine initialize_time_series_files() close (14) ! this file contains, time, iteration#, time step and performance - open (14,file='timestep.t',status='replace') - write (14,'(5(A15,1x))') "% it","time","dt","avg sec/step", "sec/step" + open (14,file='timesteps_info.t',status='replace') + write (14,'(5(A15,1x))') "% time","sec/it",'it','dt','npcu' close (14) open (14,file='dt.t',status='replace') diff --git a/src/geometry/add_cavity.f90 b/src/geometry/add_cavity.f90 index 9c12ce7..dfb3171 100644 --- a/src/geometry/add_cavity.f90 +++ b/src/geometry/add_cavity.f90 @@ -6,106 +6,144 @@ ! for example when computing the integral forces !------------------------------------------------------------------------------- subroutine add_cavity() - use mpi - use vars - use penalization ! mask array etc - implicit none - integer :: ix,iy,iz - real(kind=pr) :: ux,uy,uz, x,y,z, tmp - - ux = 0.d0 - uy = 0.d0 - uz = 0.d0 - - if (iCavity=="yes") then - ! this is the normal cavity forcing homogeneous dirichlet BC + use mpi + use vars + use penalization ! mask array etc + implicit none + integer :: ix,iy,iz + real(kind=pr) :: ux,uy,uz, x,y,z, tmp, p, offset + ux = 0.d0 uy = 0.d0 uz = 0.d0 - elseif (iCavity=="freestream".or. iCavity=="freestream_smooth") then - ! cavity to force free stream inflow - ux = uxmean - uy = uymean - uz = uzmean - endif - - if (iCavity=="freestream_smooth") then - ! this is a smooth cavity, with a smoothing layer that is not small, but extends - ! over half the width "thick_wall" of the cavity. As for the other freestream cavity, - ! it is not really a cavity in the sense that it is surronded by solid walls, but rather - ! enforces the free-flow conditions "at infinity" which is just mean flow. Its particular - ! smooth shape is for comparison with the artificial compressibility method, where we use - ! this to minimize the reflection of pressure waves. - if (nx>1) then - !-----3D----- - do iz = ra(3), rb(3) - z = dble(iz) * zl / dble(nz) - do iy = ra(2), rb(2) - y = dble(iy) * yl / dble(ny) - do ix = ra(1), rb(1) - x = dble(ix) * xl / dble(nx) - ! distance to borders of domain - tmp = minval( (/x,y,z,-(x-xl),-(y-yl),-(z-zl)/) ) - if (tmp < thick_wall) then - call smoothstep(mask(ix,iy,iz), tmp, 0.5_pr*thick_wall, 0.5_pr*thick_wall) - us(ix,iy,iz,1:3) = (/ux,uy,uz/) - ! external boxes have color 0 (important for forces) - mask_color(ix,iy,iz) = 0 - endif - enddo - enddo - enddo - else - !-----2D----- - do iz = ra(3), rb(3) - z = dble(iz) * zl / dble(nz) - do iy = ra(2), rb(2) - y = dble(iy) * yl / dble(ny) - ! distance to borders of domain - tmp = minval( (/z,y,-(z-zl),-(y-yl)/) ) - if (tmp < thick_wall) then - call smoothstep(mask(0,iy,iz), tmp, 0.5_pr*thick_wall, 0.5_pr*thick_wall) - us(0,iy,iz,1:3) = (/ux,uy,uz/) - ! external boxes have color 0 (important for forces) - mask_color(0,iy,iz) = 0 - endif - enddo - enddo + if (iCavity=="yes") then + ! this is the normal cavity forcing homogeneous dirichlet BC + ux = 0.d0 + uy = 0.d0 + uz = 0.d0 + elseif (iCavity=="freestream" .or. iCavity=="freestream_smooth" .or. iCavity=="freestream_smooth_pnorm") then + ! cavity to force free stream inflow + ux = uxmean + uy = uymean + uz = uzmean endif - !!!! - else - !!!! - - ! non-smooth cavity for free stream or solid walls. - do iz = ra(3), rb(3) - do iy = ra(2), rb(2) - do ix = ra(1), rb(1) - if (nx>1) then - if ((ix<=cavity_size-1).or.(ix>=nx-1-cavity_size+1)) then - mask(ix,iy,iz) = 1.d0 - us(ix,iy,iz,:) = (/ux,uy,uz/) - ! external boxes have color 0 (important for forces) - mask_color(ix,iy,iz) = 0 + if (iCavity=="freestream_smooth") then + ! this is a smooth cavity, with a smoothing layer that is not small, but extends + ! over half the width "thick_wall" of the cavity. As for the other freestream cavity, + ! it is not really a cavity in the sense that it is surronded by solid walls, but rather + ! enforces the free-flow conditions "at infinity" which is just mean flow. Its particular + ! smooth shape is for comparison with the artificial compressibility method, where we use + ! this to minimize the reflection of pressure waves. + if (nx>1) then + !-----3D----- + do iz = ra(3), rb(3) + z = dble(iz) * zl / dble(nz) + do iy = ra(2), rb(2) + y = dble(iy) * yl / dble(ny) + do ix = ra(1), rb(1) + x = dble(ix) * xl / dble(nx) + ! distance to borders of domain + tmp = minval( (/x,y,z,-(x-xl),-(y-yl),-(z-zl)/) ) + if (tmp < thick_wall) then + call smoothstep(mask(ix,iy,iz), tmp, 0.5_pr*thick_wall, 0.5_pr*thick_wall) + us(ix,iy,iz,1:3) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(ix,iy,iz) = 0 + endif + enddo + enddo + enddo + else + !-----2D----- + do iz = ra(3), rb(3) + z = dble(iz) * zl / dble(nz) + do iy = ra(2), rb(2) + y = dble(iy) * yl / dble(ny) + ! distance to borders of domain + tmp = minval( (/z,y,-(z-zl),-(y-yl)/) ) + if (tmp < thick_wall) then + call smoothstep(mask(0,iy,iz), tmp, 0.5_pr*thick_wall, 0.5_pr*thick_wall) + us(0,iy,iz,1:3) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(0,iy,iz) = 0 + endif + + enddo + enddo + endif + + !!!! + elseif (iCavity=="freestream_smooth_pnorm") then + + if (nx == 1) then + ! p-norm sponge. The shape of the sponge is dictated as the p-norm + ! https://de.wikipedia.org/wiki/P-Norm + ! which is a nice and simple way to get a rectangle with round corners. + + if ( abs(yl-zl) > 1.0e-10_pr) then + call abort(1610184,"ERROR: for the p-norm sponge, the domain has to be same size in all directions.") endif - endif - if ((iy<=cavity_size-1).or.(iy>=ny-1-cavity_size+1)) then - mask(ix,iy,iz) = 1.d0 - us(ix,iy,iz,:) = (/ux,uy,uz/) - ! external boxes have color 0 (important for forces) - mask_color(ix,iy,iz) = 0 - endif - - if ((iz<=cavity_size-1).or.(iz>=nz-1-cavity_size+1)) then - mask(ix,iy,iz) = 1.d0 - us(ix,iy,iz,:) = (/ux,uy,uz/) - ! external boxes have color 0 (important for forces) - mask_color(ix,iy,iz) = 0 - endif + + p = 8.0 + offset = 0.5_pr * yl + + do iz = ra(3), rb(3) + z = dble(iz) * zl / dble(nz) - offset + do iy = ra(2), rb(2) + y = dble(iy) * yl / dble(ny) - offset + + ! distance to borders of domain + tmp = -( (y**p + z**p)**(1.0_pr/p) - offset) + + if (tmp < thick_wall+4.0*dy) then + + call smoothstep(mask(0,iy,iz), tmp, 0.5_pr*thick_wall, 0.5_pr*thick_wall) + + us(0,iy,iz,1:3) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(0,iy,iz) = 0 + endif + + enddo + enddo + else + call abort(250419, "pnorm sponge 3d not yet implemented") + endif + !!!! + !!!! + else + !!!! + + ! non-smooth cavity for free stream or solid walls. + do iz = ra(3), rb(3) + do iy = ra(2), rb(2) + do ix = ra(1), rb(1) + if (nx>1) then + if ((ix<=cavity_size-1).or.(ix>=nx-1-cavity_size+1)) then + mask(ix,iy,iz) = 1.d0 + us(ix,iy,iz,:) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(ix,iy,iz) = 0 + endif + endif + if ((iy<=cavity_size-1).or.(iy>=ny-1-cavity_size+1)) then + mask(ix,iy,iz) = 1.d0 + us(ix,iy,iz,:) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(ix,iy,iz) = 0 + endif + + if ((iz<=cavity_size-1).or.(iz>=nz-1-cavity_size+1)) then + mask(ix,iy,iz) = 1.d0 + us(ix,iy,iz,:) = (/ux,uy,uz/) + ! external boxes have color 0 (important for forces) + mask_color(ix,iy,iz) = 0 + endif + enddo + enddo enddo - enddo - enddo - endif + endif end subroutine Add_Cavity diff --git a/src/geometry/hyd/mask_fsi.f90 b/src/geometry/hyd/mask_fsi.f90 index 9b78dac..cd6f20a 100644 --- a/src/geometry/hyd/mask_fsi.f90 +++ b/src/geometry/hyd/mask_fsi.f90 @@ -9,7 +9,7 @@ subroutine create_mask_fsi (time, Insect, beams ,wings) use penalization ! mask array etc implicit none real(kind=pr), intent(in) :: time - type(wing), dimension(1:nWings), intent (inout) :: wings + type(flexible_wing), dimension(1:nWings), intent (inout) :: wings type(solid),dimension(1:nBeams), intent(inout) :: beams type(diptera),intent(inout)::Insect logical, save :: mask_already_read = .false. @@ -38,11 +38,18 @@ subroutine create_mask_fsi (time, Insect, beams ,wings) select case (iMask) case ("oscillating_cylinder_2D") call oscillating_cylinder_2D(time) + + case ("rotating_cylinder") + call draw_rotating_cylinder(time) case ("active_grid") call draw_active_grid_winglets(time, Insect, xx0, ddx, mask, mask_color, us) case ("fractal_tree") + ! read in the fractal tree array. we cannot do this in Draw_fractal_tree anymore + ! since we have to take care of the possibility that some mpiranks might not call + ! Draw_fractal_tree + call fractal_tree_init() call Draw_fractal_tree(Insect, xx0, ddx, mask, mask_color, us) case ("floor_yz","floor_zy","flooryz","floorzy") @@ -79,9 +86,17 @@ subroutine create_mask_fsi (time, Insect, beams ,wings) call Update_Insect( time, Insect ) call Draw_Insect ( time, Insect, xx0, ddx, mask, mask_color, us) + case ("Insect_with_Flexible_wings") + call Update_Insect( time, Insect ) + call Draw_insect( time, Insect, xx0, ddx, mask, mask_color, us) + + call calculate_normal_vectors_of_wing(wings) + call Draw_flexible_wing(time, wings, mask, mask_color, us) + case ("Flexible_wing") + call calculate_normal_vectors_of_wing(wings) call Draw_flexible_wing(time, wings, mask, mask_color, us) - + case("Flexibility") call Draw_flexible_plate(time, beams(1)) @@ -548,3 +563,59 @@ subroutine Draw_floor_yz() enddo end subroutine + + +subroutine draw_rotating_cylinder(time) + use vars + use penalization + implicit none + + real(kind=pr) :: time + + ! auxiliary variables + real(kind=pr) :: x, y, r, h, dx_min, tmp, x00, y00, radius, frequ, alpha + ! loop variables + integer :: iy, iz + + + ! frequency of rotation is unity: + frequ = 1.0_pr + ! radius of rotation: + radius = 1.0_pr + alpha = 2.0_pr * pi * time * frequ + ! cylinder mid-point as a function of time: + x00 = x0 + dcos(alpha)*radius + y00 = y0 + dsin(alpha)*radius + + ! reset everything + mask = 0.d0 + mask_color = 0 + us = 0.d0 + + h = 1.5_pr * dy + + ! Note: this basic mask function is set on the ghost nodes as well. + do iz = ra(3), rb(3) + y = dble(iz) * dz + do iy = ra(2), rb(2) + x = dble(iy) * dy + ! distance from center of cylinder + r = dsqrt( (x-x00)*(x-x00) + (y-y00)*(y-y00) ) + + ! tmp = smoothstep(r, 0.5_pr, h) + call SmoothStep (tmp, r, 0.5_pr, h) + + if (tmp >= mask(1,iy,iz) .and. tmp > 0.0_pr) then + ! mask function + mask(1,iy,iz) = tmp + ! usx (=y) + us(1,iy,iz,2) = -2.0_pr * pi * frequ * sin(alpha) + ! usy (=z) + us(1,iy,iz,3) = +2.0_pr * pi * frequ * cos(alpha) + ! color + mask_color(1,iy,iz) = 1 + endif + end do + end do + +end subroutine draw_rotating_cylinder diff --git a/src/geometry/mask.f90 b/src/geometry/mask.f90 index 70fda5d..500d4f3 100644 --- a/src/geometry/mask.f90 +++ b/src/geometry/mask.f90 @@ -11,7 +11,7 @@ subroutine create_mask(time,Insect,beams,wings) real(kind=pr), intent(in) :: time - type(wing), dimension(1:nWings), intent (inout) :: wings + type(flexible_wing), dimension(1:nWings), intent (inout) :: wings type(solid), dimension(1:nbeams), intent(inout) :: beams type(diptera), intent(inout) :: Insect @@ -27,7 +27,7 @@ subroutine create_mask(time,Insect,beams,wings) end select ! for global timing. - time_mask = time_mask + MPI_wtime() - t1 + call toc("create_mask (main wrapper)", MPI_wtime() - t1) end subroutine create_mask diff --git a/src/geometry/mhd/mask_mhd.f90 b/src/geometry/mhd/mask_mhd.f90 index 23d9e8f..2042574 100644 --- a/src/geometry/mhd/mask_mhd.f90 +++ b/src/geometry/mhd/mask_mhd.f90 @@ -409,9 +409,9 @@ subroutine pseudosource(ux,uy,uz,ukx,uky,ukz,sx,sy,sz) ! Compute gradient - call fft(ukx,ux) - call fft(uky,uy) - call fft(ukz,uz) + call fft(ux,ukx) + call fft(uy,uky) + call fft(uz,ukz) do ix=ca(3),cb(3) kx=wave_x(ix) @@ -431,9 +431,9 @@ subroutine pseudosource(ux,uy,uz,ukx,uky,ukz,sx,sy,sz) ! call dealias(ukx,uky,ukz) - call ifft(sx,ukx) - call ifft(sy,uky) - call ifft(sz,ukz) + call ifft(ukx,sx) + call ifft(uky,sy) + call ifft(ukz,sz) ! Compute penalisation do iy=ra(2),rb(2) @@ -600,13 +600,13 @@ subroutine smcnum_us_mhd() usz = usz +pseudodt*(s2z) ! Project onto the solenoidal manifold - call fft(uskx,usx) - call fft(usky,usy) - call fft(uskz,usz) + call fft(usx, uskx) + call fft(usy, usky) + call fft(usz, uskz) call div_field_nul(uskx,usky,uskz) - call ifft(usx,uskx) - call ifft(usy,usky) - call ifft(usz,uskz) + call ifft(uskx, usx) + call ifft(usky, usy) + call ifft(uskz, usz) ! output a sample bc point and what it should reach: ! ix=8 diff --git a/src/ini_files_parser.f90 b/src/ini_files_parser.f90 index fcbdd29..31f719d 100644 --- a/src/ini_files_parser.f90 +++ b/src/ini_files_parser.f90 @@ -59,46 +59,65 @@ module module_ini_files_parser ! note: array is assumed-shape and its size defines what we try to read ! --> MPI wrapper in the MPI parser module !----------------------------------------------------------------------------- - subroutine read_array_from_ascii_file(file, array, n_header) - implicit none - character(len=*), intent(in) :: file - integer, intent(in) :: n_header - real(kind=pr), intent(inout) :: array (1:,1:) - integer :: nlines, ncols, i, io_error - character(len=maxcolumns) :: dummy - character(len=16) :: fmt - character(len=3) :: ncols_str - - ! check if the specified file exists - call check_file_exists( file ) - - nlines = size(array,1) - ncols = size(array,2) - - write(*,'(80("-"))') - write(*,'("INFO: reading ",i8," lines with ",i8," colums from ",A)') nlines, ncols, file - - ! set up format string - write(ncols_str,'(i3.3)') ncols - fmt = '('//ncols_str//'(es12.4,1x))' - - io_error = 0 - i = 0 - - open(unit=14,file=trim(adjustl(file)),action='read',status='old') - do while (io_error==0) - ! read a line from file - read (14,'(A)',iostat=io_error) dummy - i = i + 1 - ! if we're past the header AND the read worked (i.e. not end of file) - if (i > n_header .and. io_error==0) then - read(dummy,*) array(i-n_header,:) + subroutine read_array_from_ascii_file(file, array, n_header, user_separator) + implicit none + character(len=*), intent(in) :: file + integer, intent(in) :: n_header + real(kind=pr), intent(inout) :: array (1:,1:) + character(len=1), optional, intent(in) :: user_separator + integer :: nlines, ncols, i, io_error, k + character(len=maxcolumns) :: dummy + character(len=16) :: fmt + character(len=3) :: ncols_str + character(len=1) :: sep + + ! check if the specified file exists + call check_file_exists( file ) + + nlines = size(array,1) + ncols = size(array,2) + + if (present(user_separator)) then + sep = user_separator + else + sep = " " endif - enddo - close (14) - write(*,'("Done reading.")') - write(*,'(80("-"))') + write(*,'(80("-"))') + write(*,'("INFO: reading ",i8," lines with ",i8," colums from ",A)') nlines, ncols, file + write(*,'("INFO: separator is -->",A1,"<--")') sep + + ! set up format string + write(ncols_str,'(i3.3)') ncols + fmt = '('//ncols_str//'(es12.4,1x))' + + io_error = 0 + i = 0 + + open(unit=14,file=trim(adjustl(file)),action='read',status='old') + do while (io_error==0) + ! read a line from file + read (14,'(A)',iostat=io_error) dummy + i = i + 1 + + ! if we're past the header AND the read worked (i.e. not end of file) + if (i > n_header .and. io_error==0) then + + k = count_seperators_in_line(dummy, sep) + if (k == ncols) then + dummy = adjustl(dummy) + read(dummy,*) array(i-n_header,:) + else + write(*,*) "ERROR in file ",trim(adjustl(file))," line ", i, "has wrong number of columns, skip" + ! this module is not MPI aware so abort is not available + stop + endif + endif + enddo + close (14) + + write(*,'("Done reading.")') + write(*,'(80("-"))') end subroutine read_array_from_ascii_file @@ -106,63 +125,96 @@ end subroutine read_array_from_ascii_file ! count the number of lines in an ascii file, skip n_header lines ! --> MPI wrapper in the MPI parser module !----------------------------------------------------------------------------- - subroutine count_lines_in_ascii_file(file, num_lines, n_header) - implicit none - character(len=*), intent(in) :: file - integer, intent(out) :: num_lines - integer, intent(in) :: n_header - integer :: io_error, i - character(len=maxcolumns) :: dummy - - ! check if the specified file exists - call check_file_exists( file ) + subroutine count_lines_in_ascii_file(file, num_lines, n_header, user_separator) + implicit none + character(len=*), intent(in) :: file + integer, intent(out) :: num_lines + integer, intent(in) :: n_header + character(len=1), optional, intent(in) :: user_separator + integer :: io_error, i + character(len=maxcolumns) :: dummy + character(len=1) :: sep + + ! check if the specified file exists + call check_file_exists( file ) + + if (present(user_separator)) then + sep = user_separator + else + sep = " " + endif - ! count the lines - io_error = 0 - i = 0 - open(unit=14,file=trim(adjustl(file)),action='read',status='old') - do while (io_error==0) - read (14,'(A)',iostat=io_error) dummy - if (io_error==0) i = i+1 - enddo - close (14) - num_lines = i - n_header + ! count the lines + io_error = 0 + i = 0 + open(unit=14,file=trim(adjustl(file)),action='read',status='old') + do while (io_error==0) + read (14,'(A)',iostat=io_error) dummy + if (io_error==0) i = i+1 + enddo + close (14) + num_lines = i - n_header end subroutine count_lines_in_ascii_file - subroutine count_cols_in_ascii_file(file, num_cols, n_header) - implicit none - character(len=*), intent(in) :: file - integer, intent(out) :: num_cols - integer, intent(in) :: n_header - integer :: io_error, i - character(len=maxcolumns) :: dummy + subroutine count_cols_in_ascii_file(file, num_cols, n_header, user_separator) + implicit none + character(len=*), intent(in) :: file + integer, intent(out) :: num_cols + integer, intent(in) :: n_header + character(len=1), optional, intent(in) :: user_separator + integer :: io_error, i + character(len=maxcolumns) :: dummy + character(len=1) :: sep - ! check if the specified file exists - call check_file_exists( file ) + ! check if the specified file exists + call check_file_exists( file ) - ! count the lines - io_error = 0 - i = 0 + if (present(user_separator)) then + sep = user_separator + else + sep = " " + endif - open(unit=14,file=trim(adjustl(file)),action='read',status='old') - do while (io_error==0) - read (14,'(A)',iostat=io_error) dummy - if (io_error==0 .and. i>n_header) exit - i=i+1 - enddo - close (14) + ! count the lines + io_error = 0 + i = 1 - num_cols = 1 - do i = 1, len_trim(adjustl(dummy)) - ! count elements in the line by counting the separating spaces - if ( dummy(i:i) == " " ) then - num_cols = num_cols + 1 - end if - enddo + ! just read first line....after the header + open(unit=14,file=trim(adjustl(file)),action='read',status='old') + do while (io_error==0) + read (14,'(A)',iostat=io_error) dummy + if (io_error==0 .and. i>n_header) exit + i = i+1 + enddo + close (14) + + num_cols = count_seperators_in_line(dummy, sep) end subroutine count_cols_in_ascii_file + + integer function count_seperators_in_line( line, sep ) + implicit none + CHARACTER(len=*), intent(in) :: line, sep + character(len=maxcolumns) :: dummy + integer :: num_cols, i + + num_cols = 1 + ! remove leading spaces + dummy = adjustl(line) + + do i = 1, len_trim(dummy) + ! count elements in the dummy by counting the separators + if ( dummy(i:i) == sep(1:1) ) then + num_cols = num_cols + 1 + end if + enddo + + count_seperators_in_line = num_cols + end function + + !------------------------------------------------------------------------------- ! clean a previously read ini file, deallocate its string array, and reset ! verbosity to .true. (as a matter of precaution) diff --git a/src/ini_files_parser_mpi.f90 b/src/ini_files_parser_mpi.f90 index 6ab69be..61e8e99 100644 --- a/src/ini_files_parser_mpi.f90 +++ b/src/ini_files_parser_mpi.f90 @@ -24,11 +24,12 @@ module module_ini_files_parser_mpi ! read an array from an ascii file (SERIAL version, to be executed only on root) ! note: array is assumed-shape and its size defines what we try to read !----------------------------------------------------------------------------- - subroutine read_array_from_ascii_file_mpi(file, array, n_header) + subroutine read_array_from_ascii_file_mpi(file, array, n_header, user_separator) implicit none character(len=*), intent(in) :: file integer, intent(in) :: n_header real(kind=pr), intent(inout) :: array (1:,1:) + character(len=1), optional, intent(in) :: user_separator integer :: nlines, ncols, mpicode, mpirank ! fetch my process id @@ -41,7 +42,12 @@ subroutine read_array_from_ascii_file_mpi(file, array, n_header) ncols = size(array,2) ! only root reads from file... - if (mpirank==0) call read_array_from_ascii_file(file, array, n_header) + if (present(user_separator)) then + if (mpirank==0) call read_array_from_ascii_file(file, array, n_header, user_separator) + else + if (mpirank==0) call read_array_from_ascii_file(file, array, n_header) + endif + ! ... then broadcast call MPI_BCAST(array,nlines*ncols,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,mpicode) end subroutine read_array_from_ascii_file_mpi @@ -50,35 +56,48 @@ end subroutine read_array_from_ascii_file_mpi !----------------------------------------------------------------------------- ! count the number of lines in an ascii file, skip n_header lines !----------------------------------------------------------------------------- - subroutine count_lines_in_ascii_file_mpi(file, num_lines, n_header) + subroutine count_lines_in_ascii_file_mpi(file, num_lines, n_header, user_separator) implicit none character(len=*), intent(in) :: file integer, intent(out) :: num_lines integer, intent(in) :: n_header + character(len=1), optional, intent(in) :: user_separator integer :: mpicode, mpirank ! fetch my process id call MPI_Comm_rank(MPI_COMM_WORLD, mpirank, mpicode) ! only root reads from file... - if (mpirank==0) call count_lines_in_ascii_file(file, num_lines, n_header) + if (present(user_separator)) then + if (mpirank==0) call count_lines_in_ascii_file(file, num_lines, n_header, user_separator) + else + if (mpirank==0) call count_lines_in_ascii_file(file, num_lines, n_header) + endif + ! ... then broadcast call MPI_BCAST(num_lines,1,MPI_INTEGER,0,MPI_COMM_WORLD,mpicode) end subroutine count_lines_in_ascii_file_mpi - subroutine count_cols_in_ascii_file_mpi(file, num_cols, n_header) + subroutine count_cols_in_ascii_file_mpi(file, num_cols, n_header, user_separator) implicit none character(len=*), intent(in) :: file integer, intent(out) :: num_cols integer, intent(in) :: n_header + character(len=1), optional, intent(in) :: user_separator integer :: mpicode, mpirank ! fetch my process id call MPI_Comm_rank(MPI_COMM_WORLD, mpirank, mpicode) ! only root reads from file... - if (mpirank==0) call count_cols_in_ascii_file(file, num_cols, n_header) + if (present(user_separator)) then + if (mpirank==0) call count_cols_in_ascii_file(file, num_cols, n_header, user_separator) + else + if (mpirank==0) call count_cols_in_ascii_file(file, num_cols, n_header) + endif + + ! ... then broadcast call MPI_BCAST(num_cols,1,MPI_INTEGER,0,MPI_COMM_WORLD,mpicode) end subroutine count_cols_in_ascii_file_mpi diff --git a/src/inicond/hyd/init_fields_fsi.f90 b/src/inicond/hyd/init_fields_fsi.f90 index e8172e6..619107c 100644 --- a/src/inicond/hyd/init_fields_fsi.f90 +++ b/src/inicond/hyd/init_fields_fsi.f90 @@ -1,10 +1,11 @@ ! Set initial conditions for fsi code. subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& - press,scalars,scalars_rhs,Insect,beams, work, u) + press,scalars,scalars_rhs,Insect,beams,wings, work, u) use module_ini_files_parser_mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects use basic_operators implicit none @@ -24,6 +25,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& real(kind=pr),intent(inout)::u(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nd) real(kind=pr),dimension(:,:,:),allocatable::tmp + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nBeams), intent(inout) :: beams type(diptera),intent(inout)::Insect integer :: ix,iy,iz, nxs,nys,nzs, nxb,nyb,nzb,k @@ -80,7 +82,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& endif enddo enddo - call fft3 ( uk,vort ) + call fft3(vort, uk) case("random-given-spectrum") if (root) write (*,*) "*** inicond: random field with given spectrum" @@ -104,7 +106,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& ! bring this field to k-space an project it on the incompressible manifold. ! we end up with a velocity field which is random and div-free, but other than ! that has no remarkable property- - call fft3(inx=vort, outk=nlk(:,:,:,:,0) ) + call fft3(vort, nlk(:,:,:,:,0)) call Vorticity2Velocity(nlk(:,:,:,1:3,0), uk(:,:,:,1:3)) ! step 3 @@ -112,7 +114,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& ! to have. call compute_spectrum( time,kvec,uk(:,:,:,1:3),S_Ekinx,S_Ekiny,S_Ekinz,S_Ekin ) - ! read dsired spectrum from file. + ! read desired spectrum from file. call count_lines_in_ascii_file_mpi(inicond_spectrum_file, k, n_header=0) ! read the array from file, two columns, one is k second is E(k) allocate(spec_array(0:k-1,1:2)) @@ -152,7 +154,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& ! check if our initial condition is indeed divergence-free call divergence( ink=uk, outk=workc(:,:,:,1) ) - call ifft( ink=workc(:,:,:,1), outx=vort(:,:,:,1) ) + call ifft( workc(:,:,:,1), vort(:,:,:,1) ) ! vort(:,:,:,1) is now div in phys space maxdiv = fieldmax(vort(:,:,:,1)) @@ -240,8 +242,8 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& enddo ! enforce hermitian symmetry the lazy way - call ifft3(ink=uk,outx=vort) - call fft3(inx=vort,outk=uk) + call ifft3(uk, vort) + call fft3(vort, uk) ! we now renomalize the velocity, such that it has the given energy omega1 ! which is set in the parameter file @@ -260,8 +262,8 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& ! check if our initial condition is indeed divergence-free - call divergence( ink=uk, outk=workc(:,:,:,1) ) - call ifft( ink=workc(:,:,:,1), outx=vort(:,:,:,1) ) + call divergence(ink=uk, outk=workc(:,:,:,1)) + call ifft(workc(:,:,:,1), vort(:,:,:,1)) ! vort(:,:,:,1) is now div in phys space maxdiv = fieldmax(vort(:,:,:,1)) if(mpirank == 0) write(*,*) "Maximum divergence in field=", maxdiv @@ -281,7 +283,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& vort(:,iy,iz,3) =-dcos( y ) * dsin( z ) enddo enddo - call fft3 ( uk,vort ) + call fft3(vort, uk) case("infile") !-------------------------------------------------- @@ -294,11 +296,11 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& call Read_Single_File ( file_ux, vort(:,:,:,1) ) call Read_Single_File ( file_uy, vort(:,:,:,2) ) call Read_Single_File ( file_uz, vort(:,:,:,3) ) - call fft3 ( uk(:,:,:,1:3), vort(:,:,:,1:3) ) + call fft3(vort(:,:,:,1:3), uk(:,:,:,1:3)) if (equation=='artificial-compressibility') then call Read_Single_File ( file_p, vort(:,:,:,1) ) - call fft( inx=vort(:,:,:,1), outk=uk(:,:,:,4) ) + call fft(vort(:,:,:,1), uk(:,:,:,4)) endif if (mpirank==0) write (*,*) "*** done reading infiles" @@ -344,7 +346,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& rb(1)=nx-1 if(mpirank==0) write(*,*) "Back to ", nx, ra, rb - call fft3(inx=vort,outk=uk) + call fft3(vort, uk) case("infile_perturbed") ! read velocity field from file, as is done in inicond="infile", but add a @@ -607,6 +609,53 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& call Vorticity2Velocity_old(uk(:,:,:,1:3), nlk(:,:,:,1:3,0), vort(:,:,:,1:3)) + case("turbulence-meanflow") + !-------------------------------------------------- + ! random vorticity with mean flow + ! This case has two parameters read from ini file: + ! the maximum vorticity in each direction and the + ! smoothing parameter + !-------------------------------------------------- + if (mpirank==0) write (*,*) "*** inicond: turbulence (random vorticity) initial condition" + call random_seed() + if (nx>1) then + do iz=ra(3), rb(3) + do iy=ra(2), rb(2) + do ix=ra(1), rb(1) + vort(ix,iy,iz,1)=omega1*(2.0d0*rand_nbr() - 1.d0) + vort(ix,iy,iz,2)=omega1*(2.0d0*rand_nbr() - 1.d0) + vort(ix,iy,iz,3)=omega1*(2.0d0*rand_nbr() - 1.d0) + end do + end do + end do + else + do iz=ra(3), rb(3) + do iy=ra(2), rb(2) + vort(:,iy,iz,1)=omega1*(2.0d0*rand_nbr() - 1.d0) + vort(:,iy,iz,2)=0.0d0 + vort(:,iy,iz,3)=0.0d0 + end do + end do + end if + + call cal_vis( nu_smoothing/nu, explin(:,:,:,1)) + call fft3( inx=vort, outk=nlk(:,:,:,:,0) ) + nlk(:,:,:,1,0)=nlk(:,:,:,1,0)*explin(:,:,:,1) + nlk(:,:,:,2,0)=nlk(:,:,:,2,0)*explin(:,:,:,1) + nlk(:,:,:,3,0)=nlk(:,:,:,3,0)*explin(:,:,:,1) + call ifft3( ink=nlk(:,:,:,:,0), outx=vort ) + + call Vorticity2Velocity_old(uk(:,:,:,1:3), nlk(:,:,:,1:3,0), vort(:,:,:,1:3)) + + ! append mean FLOW + if (ca(1) == 0 .and. ca(2) == 0 .and. ca(3) == 0) then + ! set mean flow to desired value + uk(0,0,0,1)=Uxmean + uk(0,0,0,2)=Uymean + uk(0,0,0,3)=Uzmean + endif + + case("half_HIT") ! this is a very specialized case. it reads a field from files, but the field ! is only half as long in the x-direction. it is then padded by itself (we @@ -712,7 +761,7 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& if (use_solid_model=="yes") then if(mpirank==0) write(*,*) "Initializing solid solver and testing..." call init_beams( beams ) - call surface_interpolation_testing( time, beams(1), press ) + call surface_interpolation_testing( time, Insect, beams, press ) call init_beams( beams ) endif @@ -721,9 +770,10 @@ subroutine init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,workc,& !----------------------------------------------------------------------------- if ((use_passive_scalar==1).and.(index(inicond,"backup::")==0)) then ! only if not resuming a backup - call init_passive_scalar(scalars,scalars_rhs,Insect,beams) + call init_passive_scalar(scalars,scalars_rhs,Insect,beams,wings) endif + !----------------------------------------------------------------------------- ! when computing running time avg, initialize (note that if we're resuming ! a backup, it is read from that file) diff --git a/src/inicond/init_fields.f90 b/src/inicond/init_fields.f90 index eb030c0..dd9c81b 100644 --- a/src/inicond/init_fields.f90 +++ b/src/inicond/init_fields.f90 @@ -1,10 +1,11 @@ ! Wrapper for init_fields subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& - press,scalars,scalars_rhs,Insect,beams) + press,scalars,scalars_rhs,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects implicit none @@ -20,6 +21,7 @@ subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& real(kind=pr),intent(inout)::press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nBeams), intent(out) :: beams type(diptera),intent(inout)::Insect character(len=strlen) :: infile @@ -32,7 +34,7 @@ subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& select case(method) case("fsi") call init_fields_fsi(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin,& - workc,press,scalars,scalars_rhs,Insect,beams, work, u) + workc,press,scalars,scalars_rhs,Insect,beams,wings, work, u) case("mhd") call init_fields_mhd(time,it,dt0,dt1,n0,n1,uk,nlk,vort,explin) case default @@ -52,11 +54,51 @@ subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& ! we need to do that now otherwise we cannot create the startup mask. it would be ! nicer to initialize that in either in flusi.f90 or params.f90, but then it depends ! on the backup resuming, which we do here. - call insect_init(time, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx) + call insect_init(time, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) + else + + call insect_init(time, infile, Insect, .true., & + inicond(9:23)//".rigidsolver", (/xl,yl,zl/), nu, dx, periodic=periodic) + endif + + ! max color + if (Insect%second_wing_pair) then + endcolor = 5 + else + endcolor = 3 + endif + endif + + !----------------------------------------------------------------------------- + ! If module is in use, initialize also the flexible-wing solver + !----------------------------------------------------------------------------- + if (((iMask=="Flexible_wing").or.(iMask=="Insect_with_Flexible_wings")).and.iPenalization==1) then + ! get filename of PARAMS file from command line + call get_command_argument(1,infile) + + ! since we couple the wing into the insect body, the insect module also needs + ! to be initialised + if(mpirank==0) write(*,*) "Initializing insect modle for FSI flexible wing simulation..." + if (index(inicond,'backup::') == 0) then + ! we need to do that now otherwise we cannot create the startup mask. it would be + ! nicer to initialize that in either in flusi.f90 or params.f90, but then it depends + ! on the backup resuming, which we do here. + call insect_init(time, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) else call insect_init(time, infile, Insect, .true., & - inicond(9:23)//".rigidsolver", (/xl,yl,zl/), nu, dx) + inicond(9:23)//".rigidsolver", (/xl,yl,zl/), nu, dx, periodic=periodic) endif + + if(mpirank==0) write(*,*) "Initializing flexible-wing solver and testing..." + call init_wings( infile,wings,Insect,dx ) + + ! max color + if (Insect%second_wing_pair) then + endcolor = 5 + else + endcolor = 3 + endif + endif !----------------------------------------------------------------------------- @@ -64,13 +106,13 @@ subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& !----------------------------------------------------------------------------- if (iPenalization==1) then if (mpirank==0) write(*,'("Creating startup mask...time=",es12.4)') time - call create_mask(time,Insect,beams) + call create_mask(time,Insect,beams,wings) endif !----------------------------------------------------------------------------- ! for artificial-compressibility we need to initialize the pressure as well. !----------------------------------------------------------------------------- - if (equation=="artificial-compressibility" .and. inicond/="infile") then + if (equation=="artificial-compressibility" .and. inicond/="infile" .and. index(inicond, "backup")==0) then select case (acm_inipressure) case('flusi-spectral') if (ng /= 0) call abort(7726289,"acm no ghost nodes must be used (bounds compatibility!)!") @@ -94,7 +136,7 @@ subroutine init_fields(time,it,dt0,dt1,n0,n1,u,uk,nlk,vort,explin,work,workc,& !----------------------------------------------------------------------------- if (index(inicond,'backup::')==0 .and. (time>=tsave_first)) then if (mpirank==0) write(*,*) "Saving initial conditions to disk..." - call save_fields(time,it,uk,u,vort,nlk(:,:,:,:,n0),work,workc,scalars,scalars_rhs,Insect,beams) + call save_fields(time,it,uk,u,vort,nlk(:,:,:,:,n0),work,workc,press,scalars,scalars_rhs,Insect,beams,wings) endif tstart = time @@ -167,9 +209,9 @@ subroutine perturbation(fk1,fk2,fk3,f1,f2,f3,energy) f2=f2*enorm f3=f3*enorm - call fft(fk1,f1) - call fft(fk2,f2) - call fft(fk3,f3) + call fft(f1, fk1) + call fft(f2, fk2) + call fft(f3, fk3) end subroutine perturbation @@ -259,14 +301,14 @@ subroutine randgen3d(fk1,fk2,fk3,w) enddo ! Enforce Hermitian symmetry the lazy way: - call ifft(w,fk1) - call fft(fk1,w) + call ifft(fk1, w) + call fft(w, fk1) - call ifft(w,fk2) - call fft(fk2,w) + call ifft(fk2, w) + call fft(w, fk2) - call ifft(w,fk3) - call fft(fk3,w) + call ifft(fk3, w) + call fft(w, fk3) end subroutine randgen3d @@ -331,8 +373,6 @@ subroutine init_taylorcouette_u(ubk,ub) us(:,:,:,3)=0.d0 ! Transform velocity field to Fourier space: - do i=1,3 - call fft(ubk(:,:,:,i),ub(:,:,:,i)) - enddo + call fft3(ub, ubk) end subroutine init_taylorcouette_u diff --git a/src/inicond/mhd/init_fields_mhd.f90 b/src/inicond/mhd/init_fields_mhd.f90 index 72cc8cb..0f61f64 100644 --- a/src/inicond/mhd/init_fields_mhd.f90 +++ b/src/inicond/mhd/init_fields_mhd.f90 @@ -50,7 +50,7 @@ subroutine init_fields_mhd(time,it,dt0,dt1,n0,n1,ubk,nlk,wj,explin) ! transform everything to fourier space do i = 1,nd - call fft(ubk(:,:,:,i),wj(:,:,:,i)) + call fft(wj(:,:,:,i), ubk(:,:,:,i)) enddo case default @@ -104,7 +104,7 @@ subroutine init_orszagtang(ubk,ub) enddo do i=1,nd - call fft(ubk(:,:,:,i),ub(:,:,:,i)) + call fft(ub(:,:,:,i), ubk(:,:,:,i)) enddo end subroutine init_orszagtang @@ -130,7 +130,7 @@ subroutine init_const(ubk,wj) wj(:,:,:,6)=6.d0 do i=1,nd - call fft(ubk(:,:,:,i),wj(:,:,:,i)) + call fft(wj(:,:,:,i), ubk(:,:,:,i)) enddo end subroutine init_const @@ -192,7 +192,7 @@ subroutine init_smc(ubk,ub) enddo do i=3,nd - call fft(ubk(:,:,:,i),ub(:,:,:,i)) + call fft(ub(:,:,:,i), ubk(:,:,:,i)) enddo end subroutine init_smc @@ -228,9 +228,9 @@ subroutine init_smcnum(ubk,ub) enddo enddo - call fft(ubk(:,:,:,4),ub(:,:,:,4)) - call fft(ubk(:,:,:,5),ub(:,:,:,5)) - call fft(ubk(:,:,:,6),ub(:,:,:,6)) + call fft(ub(:,:,:,4), ubk(:,:,:,4)) + call fft(ub(:,:,:,5), ubk(:,:,:,5)) + call fft(ub(:,:,:,6), ubk(:,:,:,6)) end subroutine init_smcnum diff --git a/src/inicond/scalar/init_scalar.f90 b/src/inicond/scalar/init_scalar.f90 index 80570aa..dc4eb0b 100644 --- a/src/inicond/scalar/init_scalar.f90 +++ b/src/inicond/scalar/init_scalar.f90 @@ -7,11 +7,12 @@ ! scalars: the actual passive scalar (odor) fields ! scalars_rhs: their right hand sides (set to zero here) !------------------------------------------------------------------------------- -subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams) +subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams,Wings) use mpi use vars use penalization ! mask array etc use solid_model + use flexible_model use module_insects use passive_scalar_module use basic_operators @@ -22,6 +23,7 @@ subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams) integer :: ix,iy,iz,j real (kind=pr) :: x,y,z + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid),dimension(1:nBeams), intent(inout) :: beams type(diptera),intent(inout)::Insect @@ -47,13 +49,24 @@ subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams) enddo enddo + case("Kadoch2012") + !-- set half the domain to one + do iz = ra(3), rb(3) + z = dble(iz)*dz - 1.0_pr - length + do iy = ra(2), rb(2) + y = dble(iy)*dy - 1.0_pr - length + + scalars(:,iy,iz,j) = cos(pi*z)*( cos(4.0_pr*pi*y) + cos(pi*y) ) + enddo + enddo + case("right_left_discontinuous") !--------------------------------------------------------------------------- ! one half of the domain is 1, the other is 0, divided along y-axis ! no scalar inside mask (we build this here since FLUSI first loads inicond, ! then creates the mask!) !--------------------------------------------------------------------------- - call create_mask( 0.d0, Insect,beams ) + call create_mask( 0.d0, Insect,beams,Wings ) !-- set half the domain to one do iz=ra(3), rb(3) @@ -77,7 +90,7 @@ subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams) !--------------------------------------------------------------------------- ! smoothed heaviside function, covering approx. half the domain !--------------------------------------------------------------------------- - call create_mask( 0.d0, Insect,beams ) + call create_mask( 0.d0, Insect,beams,Wings ) !-- set half the domain to one do iz=ra(3), rb(3) @@ -98,7 +111,7 @@ subroutine init_passive_scalar(scalars,scalars_rhs,Insect,beams) !--------------------------------------------------------------------------- ! smoothed heaviside function, covering approx. half the domain !--------------------------------------------------------------------------- - call create_mask( 0.d0, Insect,beams ) + call create_mask( 0.d0, Insect,beams,Wings ) !-- set half the domain to one do iz=ra(3), rb(3) diff --git a/src/insects/active_grid_winglets.f90 b/src/insects/active_grid_winglets.f90 index 9158a22..8d2260f 100644 --- a/src/insects/active_grid_winglets.f90 +++ b/src/insects/active_grid_winglets.f90 @@ -71,9 +71,9 @@ subroutine draw_single_winglet(time, x0, omega, alpha0, orientation, color_val, if (orientation == 'z') then call Rz( MM, alpha) - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + do iy = g, size(mask,2)-1-g + do ix = g, size(mask,1)-1-g ! x_glob is in the global coordinate system ! note origin is shifted to x0 x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x0 @@ -108,9 +108,9 @@ subroutine draw_single_winglet(time, x0, omega, alpha0, orientation, color_val, call Ry( MM, alpha) - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + do iy = g, size(mask,2)-1-g + do ix = g, size(mask,1)-1-g ! x_glob is in the global coordinate system ! note origin is shifted to x0 x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x0 diff --git a/src/insects/body_geometry.f90 b/src/insects/body_geometry.f90 index 2311fda..2bd94ac 100644 --- a/src/insects/body_geometry.f90 +++ b/src/insects/body_geometry.f90 @@ -1,53 +1,133 @@ -subroutine draw_body( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + +! the old routine (<02/2019) created just the body mask but not its solid velocity field +! now the routine does create the full body mask, including the velocity field. It sets us +! only inside the body (hence the wings set u_wing + u_body) +subroutine draw_insect_body( time, xx0, ddx, mask, mask_color, us, Insect, delete) implicit none - type(diptera),intent(inout) :: Insect - real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) - real(kind=rk),intent(inout) :: mask(0:,0:,0:) - real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) + real(kind=rk), intent(in) :: time + type(diptera), intent(inout) :: Insect + real(kind=rk), intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk), intent(inout) :: mask(0:,0:,0:) + real(kind=rk), intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) + logical, intent(in) :: delete + + integer :: ix, iy, iz + real(kind=rk), dimension(1:3) :: x_glob, x_body, v_tmp + + ! 28/01/2019: Thomas. Discovered that this was done block based, i.e. the smoothing layer + ! had different thickness, if some blocks happened to be at different levels (and still carry + ! a part of the smoothing layer.) I don't know if that made sense, because the layer shrinks/expands then + ! and because it might be discontinous. Both options are included now, default is "as before" + ! Insect%smoothing_thickness=="local" : smoothing_layer = c_sm * 2**-J * L/(BS-1) + ! Insect%smoothing_thickness=="global" : smoothing_layer = c_sm * 2**-Jmax * L/(BS-1) + ! NOTE: for FLUSI, this has no impact! Here, the grid is constant and equidistant. + if (Insect%smoothing_thickness=="local" .or. .not. grid_time_dependent) then + Insect%smooth = 1.0d0*maxval(ddx) + Insect%safety = 3.5d0*Insect%smooth + endif + + if (size(mask) /= size(mask_color) .or. size(us,4) /= 3) then + write(*,*) "mask:", shape(mask), "mask_color:", shape(mask_color), "us:", shape(us) + call abort (08021901,"Insects: arrays have wrong size..") + endif + + if ((dabs(Insect%time-time)>1.0d-10).and.root) then + write(*,'("error! time=",es15.8," but Insect%time=",es15.8)') time, Insect%time + write(*,'("Did you call Update_Insect before draw_insect_body?")') + endif + + if (delete) then + where (mask_color==Insect%color_body) + mask = 0.00_rk + us(:,:,:,1) = 0.00_rk + us(:,:,:,2) = 0.00_rk + us(:,:,:,3) = 0.00_rk + mask_color = 0 + end where + endif + + !--------------------------------------------------------------------------- + ! stage I: + !--------------------------------------------------------------------------- + ! create the body mask, not the solid velocity field. select case (Insect%BodyType) case ("nobody") return case ("suzuki_thin_rod") - call draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect) case ("jerry","Jerry") - call draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect) case ("hawkmoth","Hawkmoth") - call draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect) case ("particle") - call draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_particle( xx0, ddx, mask, mask_color, us, Insect) case ("platicle") - call draw_body_platicle( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_platicle( xx0, ddx, mask, mask_color, us, Insect) case ("coin") - call draw_body_coin( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_coin( xx0, ddx, mask, mask_color, us, Insect) case ("sphere","SPHERE","Sphere") - call draw_body_sphere( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_sphere( xx0, ddx, mask, mask_color, us, Insect) case ("drosophila_maeda","drosophila_slim") - call draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect) case ("bumblebee") - call draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect) + case ("paratuposa_simple") + call draw_body_paratuposa_simple( xx0, ddx, mask, mask_color, us, Insect) case ("mosquito_iams") - call draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect) case ("pyramid") - call draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect) case ("cone") - call draw_body_cone( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_body_cone( xx0, ddx, mask, mask_color, us, Insect) case ("birch_seed") - call draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) + call draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect) case default - call abort(10623, "Insect::draw_body::Insect%BodyType unknown..."//trim(adjustl(Insect%BodyType))) + call abort(10623, "Insect::draw_insect_body::Insect%BodyType unknown..."//trim(adjustl(Insect%BodyType))) end select + + !--------------------------------------------------------------------------- + ! stage II: + !--------------------------------------------------------------------------- + ! if the body does not move, we can skip the creation of us + if (Insect%body_moves == "no") return + + ! add the solid velocity field to the body mask (i.e. create us) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + + ! skip all parts that do not belong to the body (ie they have a different color) + if ( mask_color(ix,iy,iz) == Insect%color_body .and. mask(ix,iy,iz) > 0.d0 ) then + + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + x_body = matmul(Insect%M_body, x_glob) + + ! add solid body rotation to the translational velocity field. Note + ! that rot_body_b and x_body are in the body reference frame + v_tmp(1) = Insect%rot_body_b(2)*x_body(3)-Insect%rot_body_b(3)*x_body(2) + v_tmp(2) = Insect%rot_body_b(3)*x_body(1)-Insect%rot_body_b(1)*x_body(3) + v_tmp(3) = Insect%rot_body_b(1)*x_body(2)-Insect%rot_body_b(2)*x_body(1) + + ! the body motion is transformed to the global system, translation is added + us(ix,iy,iz,1:3) = matmul( Insect%M_body_inv, v_tmp ) + Insect%vc_body_g + endif + enddo + enddo + enddo + end subroutine !------------------------------------------------------------------------------- ! Bumblebee body, BB1 in Dudley & Ellington JEB 1990 -subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -55,8 +135,6 @@ subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_bo real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) integer :: ix,iy,iz,j real(kind=rk) :: x,y,z,s,s1,a_body,R,R0,R_tmp,x1 @@ -66,22 +144,27 @@ subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_bo real(kind=rk) :: xl1(5),yl1(5),zl1(5),rl1(4),xl2(5),yl2(5),zl2(5),rl2(4),& xl3(5),yl3(5),zl3(5),rl3(4),xf(2),yf(2),zf(2),rf,xan(2),yan(2),zan(2),ran,& xmin_bbox,xmax_bbox,ymin_bbox,ymax_bbox,zmin_bbox,zmax_bbox + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body !----------------------------------------------------------------------------- ! Body !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) ! x_body is in the body coordinate system x_body = matmul(M_body,x_glob) ! ------------------------------------ - ! approximation to mesh from Maeda - ! similar to Aono et al. + ! approximation to mesh ! ------------------------------------ x = x_body(1) y = x_body(2) @@ -154,12 +237,13 @@ subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_bo dx_head = 0.5d0 * 0.2035d0 dz_head = 0.5d0 * 0.297d0 - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - !-- define the head coordinate systems we are going to use - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) x_body = matmul(M_body,x_glob) x_head = x_body @@ -191,155 +275,172 @@ subroutine draw_body_bumblebee( xx0, ddx, mask, mask_color, us, Insect, color_bo ! Legs, antennae and proboscis !----------------------------------------------------------------------------- if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="legs").or.(Insect%HasDetails=="antennae_proboscis")) then - ! Bounding box - xmin_bbox = -0.74-Insect%safety - xmax_bbox = 0.8+Insect%safety - ymin_bbox = -0.35-Insect%safety - ymax_bbox = 0.35+Insect%safety - zmin_bbox = -0.38-Insect%safety - zmax_bbox = 0.1+Insect%safety - - ! Parameters of legs, antennae and proboscis - xl1 = (/-0.74,-0.63,-0.4,-0.1,0.1/) - yl1 = (/0.32,0.32,0.31,0.3,0.12/) - zl1 = (/-0.35,-0.37,-0.2,-0.1,-0.16/) - rl1 = (/0.015,0.03,0.04,0.03/)*1.3 - xl2 = (/-0.24,-0.15,0.02,0.17,0.19/) - yl2 = (/0.33,0.33,0.32,0.3,0.15/) - zl2 = (/-0.29,-0.28,-0.2,-0.15,-0.19/) - rl2 = (/0.015,0.03,0.04,0.03/)*1.3 - xl3 = (/0.28,0.35,0.45,0.4,0.35/) - yl3 = (/0.31,0.30,0.28,0.2,0.15/) - zl3 = (/-0.3,-0.28,-0.25,-0.18,-0.18/) - rl3 = (/0.015,0.02,0.03,0.02/)*1.3 - xf = (/0.43,0.6/) - yf = (/0.0,0.0/) - zf = (/-0.28,-0.23/) - rf = 0.017*1.3 - xan = (/0.63,0.8/) - yan = (/0.05,0.27/) - zan = (/-0.03,0.1/) - ran = 0.015*1.3 - - ! ---------------------------------------------------------------------------- - ! legs (composed of 3 cylinders) - ! ---------------------------------------------------------------------------- - ! do j = 1, 4 - ! ! transform coordinates to global system. they are defined in the body system - ! xa = matmul( transpose(M_body), (/xl1(j),yl1(j),zl1(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl1(j+1),yl1(j+1),zl1(j+1)/) ) + Insect%xc_body_g - ! ! note input to draw_cylinder_new is in global coordinates - ! call draw_cylinder_new( xa, xb, rl1(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! xa = matmul( transpose(M_body), (/xl2(j),yl2(j),zl2(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl2(j+1),yl2(j+1),zl2(j+1)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rl2(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! xa = matmul( transpose(M_body), (/xl3(j),yl3(j),zl3(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl3(j+1),yl3(j+1),zl3(j+1)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rl3(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! ! right side of body (flip the sign of y) - ! xa = matmul( transpose(M_body), (/xl1(j),-yl1(j),zl1(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl1(j+1),-yl1(j+1),zl1(j+1)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rl1(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! xa = matmul( transpose(M_body), (/xl2(j),-yl2(j),zl2(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl2(j+1),-yl2(j+1),zl2(j+1)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rl2(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! xa = matmul( transpose(M_body), (/xl3(j),-yl3(j),zl3(j)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xl3(j+1),-yl3(j+1),zl3(j+1)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rl3(j), xx0, ddx, mask, mask_color, us, Insect, color_body) - ! enddo - ! - ! ! antenna (left) - ! xa = matmul( transpose(M_body), (/xan(1),yan(1),zan(1)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xan(2),yan(2),zan(2)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, ran, xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! ! antenna (right) - ! xa = matmul( transpose(M_body), (/xan(1),-yan(1),zan(1)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xan(2),-yan(2),zan(2)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, ran, xx0, ddx, mask, mask_color, us, Insect, color_body) - ! - ! - ! ! proscrobis ( to drink ) - ! xa = matmul( transpose(M_body), (/xf(1),yf(1),zf(1)/) ) + Insect%xc_body_g - ! xb = matmul( transpose(M_body), (/xf(2),yf(2),zf(2)/) ) + Insect%xc_body_g - ! call draw_cylinder_new( xa, xb, rf, xx0, ddx, mask, mask_color, us, Insect, color_body) - - - ! Assign values to mask pointwise - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - !-- define the head coordinate systems we are going to use - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) - x_body = matmul(M_body,x_glob) + ! Parameters of legs, antennae and proboscis + xl1 = (/-0.74,-0.63,-0.4,-0.1,0.1/) + yl1 = (/0.32,0.32,0.31,0.3,0.12/) + zl1 = (/-0.35,-0.37,-0.2,-0.1,-0.16/) + rl1 = (/0.015,0.03,0.04,0.03/)*1.3 + xl2 = (/-0.24,-0.15,0.02,0.17,0.19/) + yl2 = (/0.33,0.33,0.32,0.3,0.15/) + zl2 = (/-0.29,-0.28,-0.2,-0.15,-0.19/) + rl2 = (/0.015,0.03,0.04,0.03/)*1.3 + xl3 = (/0.28,0.35,0.45,0.4,0.35/) + yl3 = (/0.31,0.30,0.28,0.2,0.15/) + zl3 = (/-0.3,-0.28,-0.25,-0.18,-0.18/) + rl3 = (/0.015,0.02,0.03,0.02/)*1.3 + xf = (/0.43,0.6/) + yf = (/0.0,0.0/) + zf = (/-0.28,-0.23/) + rf = 0.017*1.3 + xan = (/0.63,0.8/) + yan = (/0.05,0.27/) + zan = (/-0.03,0.1/) + ran = 0.015*1.3 + + ! ---------------------------------------------------------------------------- + ! legs (composed of 3 cylinders) + ! ---------------------------------------------------------------------------- + do j = 1, 4 + ! transform coordinates to global system. they are defined in the body system + xa = matmul( transpose(M_body), (/xl1(j) ,yl1(j) ,zl1(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl1(j+1),yl1(j+1),zl1(j+1)/)) + Insect%xc_body_g + ! note input to draw_cylinder_new is in global coordinates + call draw_cylinder_new( xa, xb, rl1(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + + xa = matmul( transpose(M_body), (/xl2(j) ,yl2(j) ,zl2(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl2(j+1),yl2(j+1),zl2(j+1)/)) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rl2(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + + xa = matmul( transpose(M_body), (/xl3(j) ,yl3(j) ,zl3(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl3(j+1),yl3(j+1),zl3(j+1)/)) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rl3(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + + ! right side of body (flip the sign of y) + xa = matmul( transpose(M_body), (/xl1(j) ,-yl1(j) ,zl1(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl1(j+1),-yl1(j+1),zl1(j+1)/)) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rl1(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + + xa = matmul( transpose(M_body), (/xl2(j) ,-yl2(j) ,zl2(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl2(j+1),-yl2(j+1),zl2(j+1)/)) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rl2(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + + xa = matmul( transpose(M_body), (/xl3(j) ,-yl3(j) ,zl3(j)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xl3(j+1),-yl3(j+1),zl3(j+1)/)) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rl3(j), xx0, ddx, mask, mask_color, us, Insect, color_body) + enddo - !-- check bounds - if ((x_body(1)>=xmin_bbox).and.(x_body(1)<=xmax_bbox)& - .and.(x_body(2)>=ymin_bbox).and.(x_body(2)<=ymax_bbox)& - .and.(x_body(3)>=zmin_bbox).and.(x_body(3)<=zmax_bbox)) then - - !-- left and right legs, antennae and proboscis - if (x_body(2)>0) then - if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="legs")) then - do j=1,4 - call draw_cylinder(x_body,xl1(j),yl1(j),zl1(j),xl1(j+1),yl1(j+1),zl1(j+1),rl1(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - enddo - do j=1,4 - call draw_cylinder(x_body,xl2(j),yl2(j),zl2(j),xl2(j+1),yl2(j+1),zl2(j+1),rl2(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - enddo - do j=1,4 - call draw_cylinder(x_body,xl3(j),yl3(j),zl3(j),xl3(j+1),yl3(j+1),zl3(j+1),rl3(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - enddo - endif - if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="antennae_proboscis")) then - call draw_cylinder(x_body,xan(1),yan(1),zan(1),xan(2),yan(2),zan(2),ran,& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - endif - else - if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="legs")) then - do j=1,4 - call draw_cylinder(x_body,xl1(j),-yl1(j),zl1(j),xl1(j+1),-yl1(j+1),zl1(j+1),rl1(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - enddo - do j=1,4 - call draw_cylinder(x_body,xl2(j),-yl2(j),zl2(j),xl2(j+1),-yl2(j+1),zl2(j+1),rl2(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety , Insect%smooth) - enddo - do j=1,4 - call draw_cylinder(x_body,xl3(j),-yl3(j),zl3(j),xl3(j+1),-yl3(j+1),zl3(j+1),rl3(j),& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety , Insect%smooth) - enddo + ! antenna (left) + xa = matmul( transpose(M_body), (/xan(1),yan(1),zan(1)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xan(2),yan(2),zan(2)/) ) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, ran, xx0, ddx, mask, mask_color, us, Insect, color_body) + + ! antenna (right) + xa = matmul( transpose(M_body), (/xan(1),-yan(1),zan(1)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xan(2),-yan(2),zan(2)/) ) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, ran, xx0, ddx, mask, mask_color, us, Insect, color_body) + + ! proboscis (to drink) + xa = matmul( transpose(M_body), (/xf(1),yf(1),zf(1)/) ) + Insect%xc_body_g + xb = matmul( transpose(M_body), (/xf(2),yf(2),zf(2)/) ) + Insect%xc_body_g + call draw_cylinder_new( xa, xb, rf, xx0, ddx, mask, mask_color, us, Insect, color_body) + endif + +end subroutine draw_body_bumblebee + +!------------------------------------------------------------------------------ +! A very small bug Paratuposa, highly simplified body shape +subroutine draw_body_paratuposa_simple( xx0, ddx, mask, mask_color, us, Insect) + implicit none + + type(diptera),intent(inout) :: Insect + real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk),intent(inout) :: mask(0:,0:,0:) + real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) + integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) + + integer :: ix,iy,iz,j + real(kind=rk) :: x,y,z,s,a_body,bodylen,R,R0,R_tmp + real(kind=rk) :: x_glob(1:3),x_body(1:3),x_head(1:3),xa(1:3),xb(1:3) + real(kind=rk) :: rbc,thbc1,thbc2,x0bc,z0bc,xcs,zcs + real(kind=rk) :: xx_head,zz_head,dx_head,dz_head,a_head + real(kind=rk) :: xl1(5),yl1(5),zl1(5),rl1(4),xl2(5),yl2(5),zl2(5),rl2(4),& + xl3(5),yl3(5),zl3(5),rl3(4),xf(2),yf(2),zf(2),rf,xan(2),yan(2),zan(2),ran,& + xmin_bbox,xmax_bbox,ymin_bbox,ymax_bbox,zmin_bbox,zmax_bbox + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + ! Body length relative to the wing length + bodylen = 0.84d0 + + color_body = Insect%color_body + M_body = Insect%M_body + + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system + x_body = matmul(M_body,x_glob) + + ! ------------------------------------ + ! approximation to mesh + ! ------------------------------------ + x = x_body(1)/bodylen + y = x_body(2)/bodylen + z = x_body(3)/bodylen + + ! symmetry plane is xz + ! +x direction is forward + ! body centerline is an arc with center at x0bc,y0bc + ! radius rbc and angles th measured from negative z + rbc = 1.27d0 + thbc1 = 113.0d0 *pi/180.0d0 + thbc2 = 67.0d0 *pi/180.0d0 + x0bc = 0.0d0 + z0bc = -1.17d0 + + ! chordwise dimensionless coordinate, from head to abdomen + s = (datan2(z-z0bc,-(x-x0bc))-thbc1)/(thbc2-thbc1) + ! body center coordinates at s + xcs = x0bc + (x-x0bc)*rbc/dsqrt((x-x0bc)**2+(z-z0bc)**2) + zcs = z0bc + (z-z0bc)*rbc/dsqrt((x-x0bc)**2+(z-z0bc)**2) + + ! check if inside body bounds (in s-direction) +! if ( (s>=-Insect%safety) .and. (s<=1.0d0+Insect%safety) ) then + if ( (s>=0.0d0) .and. (s<=1.0d0) ) then + + ! compute radius as a function of s (counting from the tail on) + if (z >= zcs) then + R0 = 0.22d0/0.5d0*dsqrt(0.5d0**2-(s-0.5d0)**2) + a_body = 0.18d0/0.22d0 + else + R0 = 0.07d0/0.5d0*dsqrt(0.5d0**2-(s-0.5d0)**2) + a_body = 0.18d0/0.07d0 endif - if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="antennae_proboscis")) then - call draw_cylinder(x_body,xan(1),-yan(1),zan(1), xan(2),-yan(2),zan(2),ran,& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety , Insect%smooth) + + ! distance to the body center at s + R = dsqrt( (x-xcs)**2 + (y/a_body)**2 + (z-zcs)**2 ) + + ! smoothing + if (( R < R0 + Insect%safety ).and.(R0>0.d0)) then + R_tmp = steps(R, R0, Insect%smooth) + mask(ix,iy,iz)= max( R_tmp , mask(ix,iy,iz) ) + mask_color(ix,iy,iz) = color_body endif + endif - if ((Insect%HasDetails=="all").or.(Insect%HasDetails=="antennae_proboscis")) then - call draw_cylinder(x_body,xf(1),yf(1),zf(1), xf(2),yf(2),zf(2),rf,& - mask(ix,iy,iz),mask_color(ix,iy,iz),color_body,Insect%safety, Insect%smooth) - endif - endif + enddo enddo enddo -enddo -endif -end subroutine draw_body_bumblebee +end subroutine draw_body_paratuposa_simple !------------------------------------------------------------------------------ - ! Body adapted from Maeda & Liu. It assumes Insect%x_head=0.0 -subroutine draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -347,25 +448,35 @@ subroutine draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect, c real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) integer :: ix,iy,iz - real(kind=rk) :: x,y,z,s,s1, a_body, R,R0,R_tmp,x1 + real(kind=rk) :: x,y,z,s,s1, a_body, R,R0,R_tmp,x1, a_body0 real(kind=rk) :: x_glob(1:3),x_body(1:3),x_head(1:3) real(kind=rk) :: rbc,thbc1,thbc2,x0bc,z0bc,xcs,zcs real(kind=rk) :: xx_head,zz_head,dx_head,dz_head,a_head + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body !----------------------------------------------------------------------------- ! Body !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + if (Insect%BodyType == 'drosophila_slim') then + a_body0 = 1.09d0 + else + a_body0 = 1.0d0 + endif + + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) ! x_body is in the body coordinate system x_body = matmul(M_body,x_glob) @@ -396,12 +507,7 @@ subroutine draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect, c ! check if inside body bounds (in s-direction) if ( (s>=-Insect%safety) .and. (s<=1.075d0+Insect%safety) ) then R0 = 0.0d0 - ! round section by default - if (Insect%BodyType == 'drosophila_slim') then - a_body = 1.09d0 - else - a_body = 1.0d0 - endif + a_body = a_body0 ! distortion of s s1 = 1.0d0 - ( s + 0.08d0*dtanh(30.0d0*s) ) / (1.0d0+0.08d0*dtanh(30.0d0)) s1 = ( s1 + 0.04d0*dtanh(60.0d0*s1) ) / (1.0d0+0.04d0*dtanh(60.0d0)) @@ -455,12 +561,13 @@ subroutine draw_body_drosophila_maeda( xx0, ddx, mask, mask_color, us, Insect, c dx_head = 0.5d0 * 0.185d0 dz_head = 0.5d0 * 0.27d0 - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - !-- define the head coordinate systems we are going to use - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) ! x_body is in the body coordinate system x_body = matmul(M_body,x_glob) x_head = x_body @@ -492,7 +599,7 @@ end subroutine draw_body_drosophila_maeda !------------------------------------------------------------------------------- -subroutine draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -500,13 +607,16 @@ subroutine draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect, color_body, real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a_body real(kind=rk) :: x_body(1:3), x_glob(1:3), x_head(1:3), x_eye(1:3) + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body integer :: ix,iy,iz + color_body = Insect%color_body + M_body = Insect%M_body + ! the following are coordinates of specific points on the insect's body, for ! example the position of the head, its size etc. In older versions, these ! parameters were set in the *.ini file, which proved to be too much flexibility. @@ -517,6 +627,8 @@ subroutine draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect, color_body, Insect%R_eye = 0.0625d0 Insect%x_pivot_r_b =(/ 0.05d0, -0.2165d0, 0.d0 /) Insect%x_pivot_l_b =(/ 0.05d0, +0.2165d0, 0.d0 /) + Insect%x_pivot_r2_b =(/ 0.d0, -0.d0, 0.d0 /) + Insect%x_pivot_l2_b =(/ 0.d0, +0.d0, 0.d0 /) Insect%b_body = 0.1d0 Insect%L_body = 1.0d0 Insect%x_head = (/0.5d0*Insect%L_body,0.d0,0.d0 /) @@ -529,14 +641,17 @@ subroutine draw_body_jerry( xx0, ddx, mask, mask_color, us, Insect, color_body, !----------------------------------------------------------------------------- ! Jerry's body is an ellipsoid !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) + ! check if inside the surrounding box (save comput. time) if ( dabs(x_body(2)) <= Insect%b_body + Insect%safety ) then if ( dabs(x_body(3)) <= Insect%b_body + Insect%safety ) then @@ -574,7 +689,7 @@ end subroutine draw_body_jerry ! a body that is just a sphere of unit diameter. used for particles. -subroutine draw_body_sphere( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_sphere( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -582,15 +697,18 @@ subroutine draw_body_sphere( xx0, ddx, mask, mask_color, us, Insect, color_body, real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: x,R0,R,R_tmp,x_tmp,a_body real(kind=rk) :: corner real(kind=rk) :: x_body(1:3), x_glob(1:3), x_head(1:3), x_eye(1:3) + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body x_head = Insect%xc_body_g - call drawsphere( x_head, 0.50d0, xx0, ddx, mask, mask_color, us, Insect, color_body ) + call drawsphere( x_head, Insect%L_body/2.d0, xx0, ddx, mask, mask_color, us, Insect, color_body ) end subroutine draw_body_sphere @@ -608,24 +726,32 @@ subroutine draw_cylinder( xp,x1,y1,z1,x2,y2,z2,R0,mask_val,color_val,icolor,safe real(kind=rk)::x(1:3),R,xab,yab,zab,xu,yu,zu,xvp,yvp,zvp,& cbx,cby,cbz,rbx,rby,rbz - ! draw cylinder without endpoint treatment + ! coordinates centered around cylinder mid-point cbx = 0.5*(x1+x2) - xp(1) cby = 0.5*(y1+y2) - xp(2) cbz = 0.5*(z1+z2) - xp(3) + + ! length of cylinder rbx = x1-x2 rby = y1-y2 rbz = z1-z2 - if ( cbx*cbx+cby*cby+cbz*cbz < 0.25*(rbx*rbx+rby*rby+rbz*rbz) ) then - xab = xp(1)-x1 - yab = xp(2)-y1 - zab = xp(3)-z1 - xu = x2-x1 - yu = y2-y1 - zu = z2-z1 - xvp = yab*zu-zab*yu - yvp = zab*xu-xab*zu - zvp = xab*yu-yab*xu - R = sqrt((xvp*xvp+yvp*yvp+zvp*zvp)/(xu*xu+yu*yu+zu*zu)) + + ! draw cylinder without endpoint treatment + if ( cbx*cbx + cby*cby + cbz*cbz < 0.25*(rbx*rbx+rby*rby+rbz*rbz) ) then ! the 0.25 is from the 0.5 squared + xab = xp(1) - x1 + yab = xp(2) - y1 + zab = xp(3) - z1 + + ! e_x vector + xu = x2 - x1 + yu = y2 - y1 + zu = z2 - z1 + + xvp = yab*zu - zab*yu + yvp = zab*xu - xab*zu + zvp = xab*yu - yab*xu + + R = sqrt( (xvp*xvp + yvp*yvp + zvp*zvp) / (xu*xu + yu*yu + zu*zu) ) if ( R <= R0+safety ) then mask_val = max(steps(R,R0,h_smooth),mask_val) color_val = icolor @@ -663,7 +789,7 @@ subroutine draw_cylinder( xp,x1,y1,z1,x2,y2,z2,R0,mask_val,color_val,icolor,safe !------------------------------------------------------------------------------- -subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -671,12 +797,15 @@ subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_bod real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a_body, projected_length real(kind=rk) :: x_body(1:3), x_glob(1:3), x_part(1:3), n_part(1:3) integer :: ix,iy,iz,ip, npoints, mpicode, ijk(1:3), box, start,i,j,k + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body ! NOTE HACK ! this routine is deprecated, its functionality is in the STL and pointcloud ideas. @@ -786,9 +915,9 @@ subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_bod ! enddo ! np ! ! - ! ! do iz = 0, size(mask,3)-1 - ! ! do iy = 0, size(mask,2)-1 - ! ! do ix = 0, size(mask,1)-1 + ! ! do iz = g, size(mask,3)-1-g + ! ! do iy = g, size(mask,2)-1-g + ! ! do ix = g, size(mask,1)-1-g ! ! if (mask(ix,iy,iz) < 0.d0) then ! ! R=0.d0 ! ! do k=iz-1,iz+1 @@ -818,8 +947,8 @@ subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_bod ! ! start = per(nint( (Insect%xc_body_g(1)-0.5*xl)/dx), nx) ! ! if(root) write(*,*) "point is", Insect%xc_body_g(1)-0.5*xl ! start =0 - ! do iz = 0, size(mask,3)-1 - ! do iy = 0, size(mask,2)-1 + ! do iz = g, size(mask,3)-1-g + ! do iy = g, size(mask,2)-1-g ! do ix = start, start+nx ! we run all points, still ! ! is the point not yet touched (i.e. large value)? ! if (mask(per(ix,nx),iy,iz) > 99.99e6) then @@ -839,9 +968,9 @@ subroutine draw_body_particle( xx0, ddx, mask, mask_color, us, Insect, color_bod ! !----------------------------------------------------------------------------- ! ! convert signed distance function to mask function chi ! !----------------------------------------------------------------------------- - ! do iz = 0, size(mask,3)-1 - ! do iy = 0, size(mask,2)-1 - ! do ix = 0, size(mask,1)-1 + ! do iz = g, size(mask,3)-1-g + ! do iy = g, size(mask,2)-1-g + ! do ix = g, size(mask,1)-1-g ! mask(ix,iy,iz) = steps( mask(ix,iy,iz),0.d0 ) ! enddo ! enddo @@ -858,7 +987,7 @@ end subroutine draw_body_particle ! size ! Insect%L_span x Insect%L_body x Insect%WingThickness !------------------------------------------------------------------------------- -subroutine draw_body_platicle( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_platicle( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -866,20 +995,24 @@ subroutine draw_body_platicle( xx0, ddx, mask, mask_color, us, Insect, color_bod real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a_body, projected_length real(kind=rk) :: x_body(1:3), x(1:3), xc(1:3), n_part(1:3) integer :: ix,iy,iz,ip, npoints, mpicode, ijk(1:3), box, start,i,j,k + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body + + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x is in the global coordinate system - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - ! x is now centered in the plate's center point - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) ! x_body is in the body coordinate system x_body = matmul(M_body,x) @@ -911,7 +1044,7 @@ end subroutine draw_body_platicle ! flapping motion in free flight. Therefore, the insect module contains nowadays ! also body shapes that are not related to insects. This one is a flat COIN (D=1) !------------------------------------------------------------------------------- -subroutine draw_body_coin( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_coin( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -919,20 +1052,23 @@ subroutine draw_body_coin( xx0, ddx, mask, mask_color, us, Insect, color_body, M real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a_body, projected_length real(kind=rk) :: x_body(1:3), x(1:3), xc(1:3), n_part(1:3) integer :: ix,iy,iz,ip, npoints, mpicode, ijk(1:3), box, start,i,j,k - - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x is in the global coordinate system - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - ! x is now centered in the sphere's center point - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body + + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) ! x_body is in the body coordinate system x_body = matmul(M_body,x) @@ -961,7 +1097,7 @@ end subroutine draw_body_coin !------------------------------------------------------------------------------- ! Thin rod-like body used in Suzuki et al. JFM 2015 to model a butterfly !------------------------------------------------------------------------------- -subroutine draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -969,22 +1105,27 @@ subroutine draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect, color_b real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a,RR0 real(kind=rk) :: x_body(1:3), x_glob(1:3), x_head(1:3), x_eye(1:3) integer :: ix,iy,iz + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body R0 = ( 0.5d0*Insect%WingThickness + Insect%Safety )**2 RR0 = 0.5d0*Insect%WingThickness - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) @@ -1006,7 +1147,7 @@ subroutine draw_suzuki_thin_rod( xx0, ddx, mask, mask_color, us, Insect, color_b end subroutine draw_suzuki_thin_rod !------------------------------------------------------------------------------- -subroutine draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -1014,14 +1155,18 @@ subroutine draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect, color_bod real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in) :: M_body(1:3,1:3) + real(kind=rk) :: R0,R,a_body real(kind=rk) :: x_body(1:3), x_glob(1:3), x_head(1:3), x_eye(1:3), x_eye_r(1:3), x_eye_l(1:3) real(kind=rk), dimension(1:3) :: x1,x2 + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body integer :: ix,iy,iz + color_body = Insect%color_body + M_body = Insect%M_body + Insect%R_head = 0.125d0 Insect%R_eye = 0.0625d0 ! Insect%x_pivot_r_b =(/ 0.05d0, -0.2165d0, 0.d0 /) @@ -1038,12 +1183,14 @@ subroutine draw_body_hawkmoth( xx0, ddx, mask, mask_color, us, Insect, color_bod !----------------------------------------------------------------------------- ! The body is an ellipsoid !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) ! check if inside the surrounding box (save comput. time) @@ -1100,7 +1247,7 @@ end subroutine draw_body_hawkmoth ! The mosquito is based on the simplified model presented in ! [1] Iams "Flight stability of mosquitos: A reduced model" SIAM J. Appl. Math. 74(5) 1535--1550 (2014) !------------------------------------------------------------------------------- -subroutine draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -1108,15 +1255,18 @@ subroutine draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect, colo real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a_body, a,b,c, alpha, Ralpha(1:3,1:3) real(kind=rk) :: x_body(1:3), x_glob(1:3), x_head(1:3), x_eye(1:3), x_eye_r(1:3), x_eye_l(1:3) real(kind=rk) :: x0_head(1:3), x0_abdomen(1:3), x0_thorax(1:3) real(kind=rk), dimension(1:3) :: x1,x2 + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body integer :: ix,iy,iz + color_body = Insect%color_body + M_body = Insect%M_body + ! The mosquito consists of three parts: head, thorax and abdomen (sphere, ellipsoid, ellipsoid) ! positions are measured from fig. 1 in [1], we computed also the center of gravity ! for this mosquito, Insect%xc_body_g is thus the center of gravity @@ -1140,12 +1290,14 @@ subroutine draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect, colo b = 0.1603d0 c = b ! HACK: for simplicity, assume b=c, otherwise it can be very tough to draw - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) ! translate to origin of thorax @@ -1181,12 +1333,14 @@ subroutine draw_body_mosquito_iams( xx0, ddx, mask, mask_color, us, Insect, colo ! angle by which the abdomen is tilted (measured from figure 1 in [1]) alpha = deg2rad(-30.44d0) - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul(M_body, x_glob) ! translate to origin of abdomen @@ -1229,7 +1383,7 @@ end subroutine draw_body_mosquito_iams ! The SIDELENGTH is INsect%b_body ! This is the conical version (so a pyramid with circular base area) !------------------------------------------------------------------------------- -subroutine draw_body_cone( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_cone( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -1237,13 +1391,16 @@ subroutine draw_body_cone( xx0, ddx, mask, mask_color, us, Insect, color_body, M real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a,H, alpha, thick real(kind=rk) :: x_body(1:3), x_glob(1:3) integer :: ix,iy,iz logical, save :: informed = .false. + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body ! a is the sidelength of the pyramid a = Insect%b_body @@ -1261,12 +1418,14 @@ subroutine draw_body_cone( xx0, ddx, mask, mask_color, us, Insect, color_body, M endif endif - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) ! shift x body to the center of gravity @@ -1296,7 +1455,7 @@ subroutine draw_body_cone( xx0, ddx, mask, mask_color, us, Insect, color_body, M end subroutine draw_body_cone -subroutine draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -1304,13 +1463,16 @@ subroutine draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect, color_body, real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a,H, alpha, thick, a_body real(kind=rk) :: x_body(1:3), x_glob(1:3), Id(1:3,1:3) integer :: ix,iy,iz logical, save :: informed = .false. + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body ! if (root ) then ! if (informed .eqv. .false. ) then @@ -1325,12 +1487,14 @@ subroutine draw_birch_seed( xx0, ddx, mask, mask_color, us, Insect, color_body, !----------------------------------------------------------------------------- ! The seed's core is an ellipsoid !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) ! check if inside the surrounding box (save comput. time) @@ -1368,7 +1532,7 @@ end subroutine draw_birch_seed ! The HEIGHT is Insect%L_body ! The SIDELENGTH is INsect%b_body !------------------------------------------------------------------------------- -subroutine draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect, color_body, M_body) +subroutine draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect) implicit none type(diptera),intent(inout) :: Insect @@ -1376,13 +1540,16 @@ subroutine draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect, color_body real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2),intent(in) :: color_body - real(kind=rk),intent(in)::M_body(1:3,1:3) real(kind=rk) :: R0,R,a,H,b, alpha, thick, di(1:4) real(kind=rk) :: x_body(1:3), x_glob(1:3) integer :: ix,iy,iz logical, save :: informed = .false. + real(kind=rk) :: M_body(1:3,1:3) + integer(kind=2) :: color_body + + color_body = Insect%color_body + M_body = Insect%M_body ! a is the sidelength of the pyramid a = Insect%b_body @@ -1400,12 +1567,14 @@ subroutine draw_body_pyramid( xx0, ddx, mask, mask_color, us, Insect, color_body endif endif - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x_glob = periodize_coordinate(x_glob - Insect%xc_body_g, (/xl,yl,zl/)) + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + ! x_body is in the body coordinate system, which is centered at Insect%xc_body_g x_body = matmul( M_body, x_glob) ! shift x body to the center of gravity @@ -1464,11 +1633,23 @@ subroutine draw_cylinder_new( x1, x2, R0, xx0, ddx, mask, mask_color, us, Insect integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) integer(kind=2),intent(in) :: color_val - real(kind=rk),dimension(1:3)::x_glob, e_x, tmp, e_r, e_3 - real(kind=rk)::ceta1, ceta2, ceta3, R, clength, safety, t + real(kind=rk),dimension(1:3) :: cb, rb, ab, u, vp + real(kind=rk),dimension(1:3) :: x_glob, e_x, tmp, e_r, e_3 + real(kind=rk)::ceta1, ceta2, ceta3, R, RR0, clength, safety, t integer :: ix,iy,iz + integer, dimension(1:3) :: lbounds, ubounds + integer :: xmin,xmax,ymin,ymax,zmin,zmax + integer :: Nsafety + safety = Insect%safety + Nsafety = nint(safety / minval(ddx)) + + ! bounds of the current patch of data + lbounds = g + ubounds = (/size(mask,1), size(mask,2), size(mask,3)/) - 1 - g + + RR0 = R0 + safety ! unit vector in cylinder axis direction and cylinder length e_x = x2 - x1 @@ -1489,51 +1670,73 @@ subroutine draw_cylinder_new( x1, x2, R0, xx0, ddx, mask, mask_color, us, Insect e_3 = cross(e_x,e_r) e_3 = e_3 / norm2(e_3) + ! bounding box of the vicinity of the cylinder. + t = minval( (/x1(1)+RR0*e_r(1), x1(1)-RR0*e_r(1), x1(1)+RR0*e_3(1), x1(1)-RR0*e_3(1), & + x2(1)+RR0*e_r(1), x2(1)-RR0*e_r(1), x2(1)+RR0*e_3(1), x2(1)-RR0*e_3(1) /) ) + xmin = nint( (t-xx0(1)) / ddx(1) ) - Nsafety + + t = maxval( (/x1(1)+RR0*e_r(1), x1(1)-RR0*e_r(1), x1(1)+RR0*e_3(1), x1(1)-RR0*e_3(1), & + x2(1)+RR0*e_r(1), x2(1)-RR0*e_r(1), x2(1)+RR0*e_3(1), x2(1)-RR0*e_3(1) /) ) + xmax = nint( (t-xx0(1)) / ddx(1) ) + Nsafety + + t = minval( (/x1(2)+RR0*e_r(2), x1(2)-RR0*e_r(2), x1(2)+RR0*e_3(2), x1(2)-RR0*e_3(2), & + x2(2)+RR0*e_r(2), x2(2)-RR0*e_r(2), x2(2)+RR0*e_3(2), x2(2)-RR0*e_3(2) /) ) + ymin = nint( (t-xx0(2)) / ddx(2) ) - Nsafety + + t = maxval( (/x1(2)+RR0*e_r(2), x1(2)-RR0*e_r(2), x1(2)+RR0*e_3(2), x1(2)-RR0*e_3(2), & + x2(2)+RR0*e_r(2), x2(2)-RR0*e_r(2), x2(2)+RR0*e_3(2), x2(2)-RR0*e_3(2) /) ) + ymax = nint( (t-xx0(2)) / ddx(2) ) + Nsafety + + t = minval( (/x1(3)+RR0*e_r(3), x1(3)-RR0*e_r(3), x1(3)+RR0*e_3(3), x1(3)-RR0*e_3(3), & + x2(3)+RR0*e_r(3), x2(3)-RR0*e_r(3), x2(3)+RR0*e_3(3), x2(3)-RR0*e_3(3) /) ) + zmin = nint( (t-xx0(3)) / ddx(3) ) - Nsafety + + t = maxval( (/x1(3)+RR0*e_r(3), x1(3)-RR0*e_r(3), x1(3)+RR0*e_3(3), x1(3)-RR0*e_3(3), & + x2(3)+RR0*e_r(3), x2(3)-RR0*e_r(3), x2(3)+RR0*e_3(3), x2(3)-RR0*e_3(3) /) ) + zmax = nint( (t-xx0(3)) / ddx(3) ) + Nsafety + + ! first we draw the cylinder, then the endpoint spheres - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x_glob is in the global coordinate system - ! note origin is shifted to x1 - x_glob = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x1 - x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) - - ! position on cylinder axis (projection of x-x1 on e_x) - ceta1 = dot_product(x_glob, e_x) - ceta2 = dot_product(x_glob, e_r) - ceta3 = dot_product(x_glob, e_3) - - ! bounding box check - if ( ceta1>=-(R0+safety) .and. ceta1<=clength+R0+safety .and. abs(ceta2) 0.d0 .and. ceta1 < clength) then - ! ZONE 2: the actual cylinder. to get its radius, we project x_glob on the - ! 3 unit vectors defined previously: the e_r and e_3 components are in the - ! plane perp. to the axis, and so their norm defines the radius - R = dsqrt( ceta2**2 + ceta3**2) - else - ! ZONE 3: the sphere at the tip. (note we shift x_glob to x2, now) - x_glob = periodize_coordinate(x_glob-(x2-x1), (/xl,yl,zl/)) - R = norm2( x_glob ) - end if - - ! r is now the signed distance to the cylinder mid-line. - ! since there may be other cylinders already, the closest one defines the - ! actual signed distance, saved in mask array. we would thus take min(R-R0, mask(ix,iy,iz)) - ! is the mask contained the distance. BUT the mask contains chi, and chi is a monotonous function - ! of -R, we take the max operator - t = steps(R,R0, Insect%smooth) - if (t >= mask(ix,iy,iz)) then - mask(ix,iy,iz) = t - mask_color(ix,iy,iz) = color_val + do iz = max(zmin,lbounds(3)), min(zmax,ubounds(3)) + x_glob(3) = xx0(3) + dble(iz)*ddx(3) + + do iy = max(ymin,lbounds(2)), min(ymax,ubounds(2)) + x_glob(2) = xx0(2) + dble(iy)*ddx(2) + + do ix = max(xmin,lbounds(1)), min(xmax,ubounds(1)) + x_glob(1) = xx0(1) + dble(ix)*ddx(1) + ! if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + + ! cb is the distance to the cylinder mid-point + cb = 0.5d0*(x1+x2) - x_glob + ! rb is the length of the clinder + rb = x1 - x2 + + ! this is a spherical bounding box, centered around the mid-point + if ( sum(cb**2) < 0.25*sum(rb**2) ) then ! the 0.25 is from the 0.5 squared + ab = x_glob - x1 + u = x2 - x1 + + vp = cross(ab, u) + R = sqrt( sum(vp**2) / sum(u**2) ) + + if (R <= R0+safety) then + t = steps(R, R0, Insect%smooth) + if (t >= mask(ix,iy,iz)) then + mask(ix,iy,iz) = t + mask_color(ix,iy,iz) = color_val + endif endif - end if - + endif enddo enddo enddo + + !--------------------------------------------------------------------------- + ! endpoint spheres + !--------------------------------------------------------------------------- + call drawsphere( x1, R0, xx0, ddx, mask, mask_color, us, Insect, color_val ) + call drawsphere( x2, R0, xx0, ddx, mask, mask_color, us, Insect, color_val ) end subroutine draw_cylinder_new @@ -1544,7 +1747,7 @@ end subroutine draw_cylinder_new ! the head and eyes of Jerry. The velocity field inside the body is added ! later, thus, the field us is untouched in this routines. !------------------------------------------------------------------------------- -subroutine drawsphere( xc,R0,xx0, ddx, mask, mask_color, us,Insect,icolor ) +subroutine drawsphere( xc, R0, xx0, ddx, mask, mask_color, us, Insect, icolor ) implicit none real(kind=rk),intent(inout)::xc(1:3) @@ -1558,6 +1761,9 @@ subroutine drawsphere( xc,R0,xx0, ddx, mask, mask_color, us,Insect,icolor ) integer :: ix,iy,iz real(kind=rk)::x(1:3),R,tmp + integer, dimension(1:3) :: lbounds, ubounds + integer :: xmin,xmax,ymin,ymax,zmin,zmax + integer :: Nsafety ! periodization: if the center point is out of the domain, then correct that if (xc(1)<0.0) xc(1)=xc(1)+xl @@ -1568,35 +1774,42 @@ subroutine drawsphere( xc,R0,xx0, ddx, mask, mask_color, us,Insect,icolor ) if (xc(2)>=yl) xc(2)=xc(2)-yl if (xc(3)>=zl) xc(3)=xc(3)-zl + Nsafety = nint( (R0+Insect%safety) / minval(ddx)) + ! bounds of the current patch of data + lbounds = g + ubounds = (/size(mask,1), size(mask,2), size(mask,3)/) - 1 - g - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - ! x is in the global coordinate system - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - ! x is now centered in the sphere's center point - x = periodize_coordinate(x - xc, (/xl,yl,zl/)) - - ! bounding box check - if (dabs(x(1)) <= R0+Insect%safety) then - if (dabs(x(2)) <= R0+Insect%safety) then - if (dabs(x(3)) <= R0+Insect%safety) then - ! compute radius - R = dsqrt( x(1)*x(1)+x(2)*x(2)+x(3)*x(3) ) - if ( R <= R0+Insect%safety ) then - tmp = steps(R,R0, Insect%smooth) - if (tmp>=mask(ix,iy,iz)) then - ! set new value - mask(ix,iy,iz) = tmp - mask_color(ix,iy,iz) = icolor - endif - endif - endif - endif - endif + ! bounding box of the vicinity of the sphere. + xmin = nint( (xc(1)-xx0(1)) / ddx(1) ) - (Nsafety) + xmax = nint( (xc(1)-xx0(1)) / ddx(1) ) + (Nsafety) + ymin = nint( (xc(2)-xx0(2)) / ddx(2) ) - (Nsafety) + ymax = nint( (xc(2)-xx0(2)) / ddx(2) ) + (Nsafety) + zmin = nint( (xc(3)-xx0(3)) / ddx(3) ) - (Nsafety) + zmax = nint( (xc(3)-xx0(3)) / ddx(3) ) + (Nsafety) + + + do iz = max(zmin,lbounds(3)), min(zmax,ubounds(3)) + x(3) = xx0(3) + dble(iz)*ddx(3) - xc(3) + do iy = max(ymin,lbounds(2)), min(ymax,ubounds(2)) + x(2) = xx0(2) + dble(iy)*ddx(2) - xc(2) + do ix = max(xmin,lbounds(1)), min(xmax,ubounds(1)) + x(1) = xx0(1) + dble(ix)*ddx(1) - xc(1) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + + ! the bounding box check is incorporated in the loop bounds - no if clause! + ! compute radius + R = dsqrt( x(1)*x(1)+x(2)*x(2)+x(3)*x(3) ) + if ( R <= R0+Insect%safety ) then + tmp = steps(R, R0, Insect%smooth) + if (tmp>=mask(ix,iy,iz)) then + ! set new value + mask(ix,iy,iz) = tmp + mask_color(ix,iy,iz) = icolor + endif + endif enddo enddo enddo diff --git a/src/insects/body_motion.f90 b/src/insects/body_motion.f90 index c70cf19..ec5eb07 100644 --- a/src/insects/body_motion.f90 +++ b/src/insects/body_motion.f90 @@ -122,6 +122,18 @@ subroutine BodyMotion(time, Insect) vc = (/0.0, 0.0, 0.0/) ! tethered: no velocity Insect%body_moves = "yes" + case ("pitch_param") + ! Pitch motion for aerodynamic power analysis + psi = Insect%yawpitchroll_0(3) ! roll + beta = Insect%yawpitchroll_0(2) + 15.d0 *pi/180.d0*cos(2.d0*pi*time) ! pitch + gamma = Insect%yawpitchroll_0(1) ! yaw + psi_dt = 0.d0 + beta_dt = - 15.d0 *pi/180.d0*sin(2.d0*pi*time)*2.d0*pi + gamma_dt = 0.d0 + xc = Insect%x0 + vc = (/0.0, 0.0, 0.0/) ! tethered: no velocity + Insect%body_moves = "yes" + case ("pitch") psi = 0.d0 beta = 30.d0*pi/180.d0*sin(2.d0*pi*time) diff --git a/src/insects/fractal_trees.f90 b/src/insects/fractal_trees.f90 index bf9d502..ab22ae2 100644 --- a/src/insects/fractal_trees.f90 +++ b/src/insects/fractal_trees.f90 @@ -2,62 +2,25 @@ subroutine draw_fractal_tree(Insect, xx0, ddx, mask, mask_color, us) implicit none type(diptera),intent(inout) :: Insect - real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer :: io_error, nlines, mpicode,i - real (kind=rk) :: R, safety, x1(1:3),x2(1:3), t1 - character(len=2048) :: dummy - character(len=strlen) :: file - real(kind=rk),allocatable,dimension(:,:) :: treedata + real(kind=rk) :: x1(1:3), x2(1:3), R + integer :: i + ! reset everything mask = 0.d0 mask_color = 0 us = 0.d0 - ! thickness of smoothing layer and safety distance - Insect%smooth = 1.0_rk*maxval(ddx) - Insect%safety = 3.5_rk*Insect%smooth - - file = 'tree_data.in' - call check_file_exists( file ) - - !***************************************************************************** - ! phase one: read the number of lines (which is the number of rigid cylinders in the tree) - !***************************************************************************** - call count_lines_in_ascii_file_mpi(file, nlines, 0) - if (root) then - write(*,'("Building a fractal tree with ",i5," rigid cylinders")') nlines - endif - - !***************************************************************************** - ! phase two: read all cylinders from the file into the array and bcast them - !***************************************************************************** - allocate( treedata(1:nlines, 1:7) ) - - if (root) then - open(unit=14,file=file,action='read',status='old') - do i=1,nlines - read (14,'(A)',iostat=io_error) dummy - if (io_error==0) then - read (dummy,*) treedata(i,:) - write(*,'("read cylinder ",7(es12.4,1x))') treedata(i,:) - endif - enddo - close (14) - endif - - call MPI_BCAST(treedata,nlines*7,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,mpicode) - !***************************************************************************** ! phase 3: all ranks draw the individual cylinders... ! please note we assume the root point to be 0 0 0 in the file !***************************************************************************** - t1 = MPI_Wtime() - do i=1, nlines + do i = 1, size(treedata,1) x1 = treedata(i,1:3) + (/x0,y0,z0/) x2 = treedata(i,4:6) + (/x0,y0,z0/) ! the file containes the radius of the cylinder @@ -65,12 +28,33 @@ subroutine draw_fractal_tree(Insect, xx0, ddx, mask, mask_color, us) call draw_cylinder_new( x1, x2, R, xx0, ddx, mask, mask_color, us, Insect, int(1,kind=2)) end do - if (root) then - write(*,'(80("-"))') - write(*,'("done creating fractal tree mask of ",i4," branches")') nlines - write(*,'("wtime on master process is ",es12.4," secs")') MPI_wtime()-t1 - write(*,'(80("-"))') - end if - - deallocate(treedata) end subroutine draw_fractal_tree + + +subroutine fractal_tree_init() + implicit none + character(len=80) :: file + integer :: nlines + ! note: smoothing is set in insect_init (which must be called also for fractal trees) + + ! initialization + if (.not. allocated(treedata)) then + file = 'tree_data.in' + call check_file_exists( file ) + + !***************************************************************************** + ! phase one: read the number of lines (which is the number of rigid cylinders in the tree) + !***************************************************************************** + call count_lines_in_ascii_file_mpi(file, nlines, 0) + if (root) write(*,'("Building a fractal tree with ",i5," rigid cylinders")') nlines + + !***************************************************************************** + ! phase two: read all cylinders from the file into the array and bcast them + !***************************************************************************** + allocate( treedata(1:nlines, 1:7) ) + call read_array_from_ascii_file_mpi(file, treedata, n_header=0) + + if (root) write(*,'("Done reading ",i5," rigid cylinders")') nlines + endif + +end subroutine diff --git a/src/insects/insect_init_clean.f90 b/src/insects/insect_init_clean.f90 index 3d18e0e..faac2c9 100644 --- a/src/insects/insect_init_clean.f90 +++ b/src/insects/insect_init_clean.f90 @@ -1,4 +1,5 @@ -subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box_domain, viscosity, dx_reference) +subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box_domain, & + viscosity, dx_reference, N_ghost_nodes, periodic) implicit none real(kind=rk), intent(in) :: time character(len=*), intent(in) :: fname_ini @@ -12,6 +13,13 @@ subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box ! as the default wing thickness is 4*dx, pass lattice spacing here. In FLUSI, this is easy ! but in WABBIT it requires some thought, because dx is not a constant. real(kind=rk), intent(in) :: dx_reference + ! ghost nodes. If the insect module is used in a finite-differences code, then + ! the data that we have often has ghost nodes, i.e. points that overlap and exist + ! on several CPUS. On those, you normally would not create the mask (which is expensive) + ! so we skip the first and last "g" points on the arrays used for mask creation + integer, optional, intent(in) :: N_ghost_nodes + ! + logical, optional, intent(in) :: periodic type(inifile) :: PARAMS real(kind=rk),dimension(1:3)::defaultvec @@ -29,23 +37,51 @@ subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box nu = viscosity ! header information - if (root) then - write(*,'(80("<"))') - write(*,*) "Initializing insect module!" - write(*,*) "*.ini file is: "//trim(adjustl(fname_ini)) - write(*,'(80("<"))') - write(*,'("Lx=",g12.4," Ly=",g12.4," Lz=",g12.4," nu=",g12.4)') xl, yl, zl, nu - write(*,'("dx=",g12.4," nx_equidistant=",i6)') dx_reference, nint(xl/dx_reference) - endif + if (root) then + write(*,'(80("<"))') + write(*,*) "Initializing insect module!" + write(*,*) "*.ini file is: "//trim(adjustl(fname_ini)) + write(*,'(80("<"))') + write(*,'("Lx=",g12.4," Ly=",g12.4," Lz=",g12.4," nu=",g12.4)') xl, yl, zl, nu + write(*,'("dx=",g12.4," nx_equidistant=",i6)') dx_reference, nint(xl/dx_reference) + endif + + ! ghost nodes are optional.. + if (present(N_ghost_nodes)) then + ! g is a module global private variable. + g = N_ghost_nodes + else + g = 0 + endif + if (root) write(*,'("n_ghosts=",i2)') g + + ! is the insect periodic? + ! attention: this functionality is not for free, so if you do not need it - disable it. + if (present(periodic)) then + periodic_insect = periodic + else + periodic_insect = .false. + endif + if (root) write(*,'("periodic_insect=",L1)') periodic_insect !----------------------------------------------------------------------------- ! read in parameters form ini file !----------------------------------------------------------------------------- - ! read in the complete ini file, from which we initialize the insect call read_ini_file_mpi(PARAMS, fname_ini, verbose=.true.) - call read_param_mpi(PARAMS,"Insects","WingShape",Insect%WingShape,"none") + ! determine whether the second pair of wings is present + call read_param_mpi(PARAMS,"Insects","LeftWing2",Insect%LeftWing2,"no") + call read_param_mpi(PARAMS,"Insects","RightWing2",Insect%RightWing2,"no") + if ( ( Insect%LeftWing2 == "yes" ) .or. ( Insect%RightWing2 == "yes" ) ) then + Insect%second_wing_pair = .true. + else + Insect%second_wing_pair = .false. + endif + + ! read data for the first pair of wings + call read_param_mpi(PARAMS,"Insects","WingShape",Insect%WingShape(1),"none") + Insect%WingShape(2) = Insect%WingShape(1) call read_param_mpi(PARAMS,"Insects","b_top",Insect%b_top, 0.d0) call read_param_mpi(PARAMS,"Insects","b_bot",Insect%b_bot, 0.d0) call read_param_mpi(PARAMS,"Insects","L_span",Insect%L_span, 0.d0) @@ -105,6 +141,67 @@ subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box Insect%kine_wing_l%initialized = .false. Insect%kine_wing_r%initialized = .false. + ! read data for the second pair of wings + if (Insect%second_wing_pair) then + ! note that only Fourier wing shape can be different from first wings + call read_param_mpi(PARAMS,"Insects","WingShape2",Insect%WingShape(3),"none") + Insect%WingShape(4) = Insect%WingShape(3) + call read_param_mpi(PARAMS,"Insects","FlappingMotion_right2",Insect%FlappingMotion_right2,"none") + call read_param_mpi(PARAMS,"Insects","FlappingMotion_left2",Insect%FlappingMotion_left2,"none") + ! this file is used in old syntax form for both wings: + call read_param_mpi(PARAMS,"Insects","infile2",Insect%infile2,"none.in") + + if ( index(Insect%FlappingMotion_right2,"from_file::") /= 0 ) then + ! new syntax, uses fourier/hermite periodic kinematics read from *.ini file + Insect%kine_wing_r2%infile = Insect%FlappingMotion_right2( 12:strlen ) + Insect%FlappingMotion_right2 = "from_file" + + elseif ( index(Insect%FlappingMotion_right,"kinematics_loader::") /= 0 ) then + ! new syntax, uses the kinematics loader for non-periodic kinematics + Insect%kine_wing_r2%infile = Insect%FlappingMotion_right2( 20:strlen ) + Insect%FlappingMotion_right2 = "kinematics_loader" + + elseif ( Insect%FlappingMotion_right2 == "from_file" ) then + ! old syntax, implies symmetric periodic motion, read from *.ini file + Insect%kine_wing_r2%infile = Insect%infile2 + + elseif ( Insect%FlappingMotion_right2 == "kinematics_loader" ) then + ! old syntax, implies symmetric non-periodic motion, read from *.dat file + Insect%kine_wing_r2%infile = Insect%infile2 + endif + + if ( index(Insect%FlappingMotion_left2,"from_file::") /= 0 ) then + ! new syntax, uses fourier/hermite periodic kinematics read from *.ini file + Insect%kine_wing_l2%infile = Insect%FlappingMotion_left2( 12:strlen ) + Insect%FlappingMotion_left2 = "from_file" + + elseif ( index(Insect%FlappingMotion_left2,"kinematics_loader::") /= 0 ) then + ! new syntax, uses the kinematics loader for non-periodic kinematics + Insect%kine_wing_l2%infile = Insect%FlappingMotion_left2( 20:strlen ) + Insect%FlappingMotion_left2 = "kinematics_loader" + + elseif ( Insect%FlappingMotion_left2 == "from_file" ) then + ! old syntax, implies symmetric periodic motion, read from *.ini file + Insect%kine_wing_l2%infile = Insect%infile2 + + elseif ( Insect%FlappingMotion_left2 == "kinematics_loader" ) then + ! old syntax, implies symmetric non-periodic motion, read from *.dat file + Insect%kine_wing_l2%infile = Insect%infile2 + endif + + if (root) then + write(*,*) "Second left wing: "//trim(adjustl(Insect%FlappingMotion_left2)) + write(*,*) "Second left wing: "//trim(adjustl(Insect%kine_wing_l2%infile)) + write(*,*) "Second right wing: "//trim(adjustl(Insect%FlappingMotion_right2)) + write(*,*) "Second right wing: "//trim(adjustl(Insect%kine_wing_r2%infile)) + endif + endif + + ! these flags trigger reading the kinematics from file when the Flapping + ! motion is first called + Insect%kine_wing_l2%initialized = .false. + Insect%kine_wing_r2%initialized = .false. + call read_param_mpi(PARAMS,"Insects","BodyType",Insect%BodyType,"ellipsoid") call read_param_mpi(PARAMS,"Insects","HasDetails",Insect%HasDetails,"all") call read_param_mpi(PARAMS,"Insects","BodyMotion",Insect%BodyMotion,"yes") @@ -160,6 +257,17 @@ subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box call read_param_mpi(PARAMS,"Insects","startup_conditioner",Insect%startup_conditioner,"no") + ! 28/01/2019: Thomas. Discovered that this was done block based, i.e. the smoothing layer + ! had different thickness, if some blocks happened to be at different levels (and still carry + ! a part of the smoothing layer.) I don't know if that made sense, because the layer shrinks/expands then + ! and because it might be discontinous. Both options are included now, default is "as before" + ! Insect%smoothing_thickness=="local" : smoothing_layer = c_sm * 2**-J * L/(BS-1) + ! Insect%smoothing_thickness=="global" : smoothing_layer = c_sm * 2**-Jmax * L/(BS-1) + ! NOTE: for FLUSI, this has no impact! Here, the grid is constant and equidistant. + call read_param_mpi(PARAMS,"Insects","smoothing_thickness",Insect%smoothing_thickness,"local") + Insect%smooth = 1.0d0*dx_reference + Insect%safety = 3.5d0*Insect%smooth + ! position vector of the head call read_param_mpi(PARAMS,"Insects","x_head",& Insect%x_head, (/0.5d0*Insect%L_body,0.d0,0.d0 /) ) @@ -172,16 +280,28 @@ subroutine insect_init(time, fname_ini, Insect, resume_backup, fname_backup, box call read_param_mpi(PARAMS,"Insects","x_eye_l",Insect%x_eye_l, defaultvec) ! wing hinges (root points) - defaultvec=(/0.d0, +Insect%b_body, 0.d0 /) + defaultvec = (/0.d0, +Insect%b_body, 0.d0 /) call read_param_mpi(PARAMS,"Insects","x_pivot_l",Insect%x_pivot_l_b, defaultvec) - defaultvec=(/0.d0, -Insect%b_body, 0.d0 /) + defaultvec = (/0.d0, -Insect%b_body, 0.d0 /) call read_param_mpi(PARAMS,"Insects","x_pivot_r",Insect%x_pivot_r_b, defaultvec) + ! read data for the second pair of wing hinges + if (Insect%second_wing_pair) then + defaultvec = Insect%x_pivot_l_b + call read_param_mpi(PARAMS,"Insects","x_pivot_l2",Insect%x_pivot_l2_b, defaultvec) + defaultvec = Insect%x_pivot_r_b + call read_param_mpi(PARAMS,"Insects","x_pivot_r2",Insect%x_pivot_r2_b, defaultvec) + endif + ! default colors for body and wings Insect%color_body=1 Insect%color_l=2 Insect%color_r=3 + if (Insect%second_wing_pair) then + Insect%color_l2=4 + Insect%color_r2=5 + endif ! clean ini file call clean_ini_file_mpi(PARAMS) @@ -214,7 +334,6 @@ end subroutine insect_init - subroutine insect_clean(Insect) implicit none type(diptera),intent(inout)::Insect diff --git a/src/insects/module_insects.f90 b/src/insects/module_insects.f90 index 404e0b5..62fec6c 100644 --- a/src/insects/module_insects.f90 +++ b/src/insects/module_insects.f90 @@ -10,16 +10,24 @@ module module_insects PRIVATE ! functions - PUBLIC :: Draw_Insect, Update_Insect, insect_init, insect_clean, draw_fractal_tree, draw_active_grid_winglets, & + PUBLIC :: Draw_Insect, draw_insect_body, draw_insect_wings, Update_Insect, insect_init, fractal_tree_init, & + insect_clean, draw_fractal_tree, draw_active_grid_winglets, & aero_power, inert_power, read_insect_STATE_from_file, rigid_solid_init, rigid_solid_time_step, & - BodyMotion, FlappingMotion_right, FlappingMotion_left, StrokePlane, mask_from_pointcloud, & - body_rotation_matrix, wing_right_rotation_matrix, wing_left_rotation_matrix, write_kinematics_file + BodyMotion, FlappingMotionWrap, StrokePlane, mask_from_pointcloud, & + body_rotation_matrix, wing_right_rotation_matrix, wing_left_rotation_matrix, write_kinematics_file, & + wing_right2_rotation_matrix, wing_left2_rotation_matrix ! type definitions PUBLIC :: wingkinematics, diptera ! we use this so only root prints write statements... logical :: root = .false. + logical :: periodic_insect = .true. + ! ghost nodes. If the insect module is used in a finite-differences code, then + ! the data that we have often has ghost nodes, i.e. points that overlap and exist + ! on several CPUS. On those, you normally would not create the mask (which is expensive) + ! so we skip the first and last "g" points on the arrays used for mask creation + integer, private, save :: g ! size (global) of domain real(kind=rk) :: xl, yl, zl @@ -50,6 +58,10 @@ module module_insects integer, dimension(1:3), save :: mask_wing_nxyz integer, save :: mask_wing_safety=4 + !----------------------------------------------------------------------------- + ! stuff for the fractal tree + real(kind=rk), allocatable, save :: treedata(:,:) + !----------------------------------------------------------------------------- ! TYPE DEFINITIONS ! datatype for wing kinematics, if described by a Fourier series or kineloader @@ -87,29 +99,39 @@ module module_insects real(kind=rk) :: psi=0.d0, beta=0.d0, gamma=0.d0, psi_dt=0.d0, beta_dt=0.d0, gamma_dt=0.d0, eta0=0.d0 ! body pitch angle, if it is constant (used in forward flight and hovering) real(kind=rk) :: body_pitch_const=0.d0 - ! angles of the wings (left and right) + ! angles of the wings (left and right, second left and second right) real(kind=rk) :: phi_r=0.d0, alpha_r=0.d0, theta_r=0.d0, phi_dt_r=0.d0, alpha_dt_r=0.d0, theta_dt_r=0.d0 real(kind=rk) :: phi_l=0.d0, alpha_l=0.d0, theta_l=0.d0, phi_dt_l=0.d0, alpha_dt_l=0.d0, theta_dt_l=0.d0 + real(kind=rk) :: phi_r2=0.d0, alpha_r2=0.d0, theta_r2=0.d0, phi_dt_r2=0.d0, alpha_dt_r2=0.d0, theta_dt_r2=0.d0 + real(kind=rk) :: phi_l2=0.d0, alpha_l2=0.d0, theta_l2=0.d0, phi_dt_l2=0.d0, alpha_dt_l2=0.d0, theta_dt_l2=0.d0 ! stroke plane angle real(kind=rk) :: eta_stroke=0.d0 ! is the body motion state described be the STATE vector? This is the case if the ! free-flight solver is used, and if its results are read in postprocessing or ! if it used used to prescribe the body motion state from a different simulation logical :: quaternion_solver_used = .false. - ! angular velocity vectors (wings L+R, body) + ! angular velocity vectors (body, left and right wings, 2nd left and 2nd right wings) real(kind=rk), dimension(1:3) :: rot_body_b=0.d0, rot_body_g=0.d0 real(kind=rk), dimension(1:3) :: rot_rel_wing_l_w=0.d0, rot_rel_wing_r_w=0.d0 real(kind=rk), dimension(1:3) :: rot_rel_wing_l_b=0.d0, rot_rel_wing_r_b=0.d0 real(kind=rk), dimension(1:3) :: rot_rel_wing_l_g=0.d0, rot_rel_wing_r_g=0.d0 real(kind=rk), dimension(1:3) :: rot_abs_wing_l_g=0.d0, rot_abs_wing_r_g=0.d0 - ! angular acceleration vectors (wings L+R) + real(kind=rk), dimension(1:3) :: rot_rel_wing_l2_w=0.d0, rot_rel_wing_r2_w=0.d0 + real(kind=rk), dimension(1:3) :: rot_rel_wing_l2_b=0.d0, rot_rel_wing_r2_b=0.d0 + real(kind=rk), dimension(1:3) :: rot_rel_wing_l2_g=0.d0, rot_rel_wing_r2_g=0.d0 + real(kind=rk), dimension(1:3) :: rot_abs_wing_l2_g=0.d0, rot_abs_wing_r2_g=0.d0 + ! angular acceleration vectors (left and right wings, 2nd left and 2nd right wings) real(kind=rk), dimension(1:3) :: rot_dt_wing_l_w=0.d0, rot_dt_wing_r_w=0.d0 real(kind=rk), dimension(1:3) :: rot_dt_wing_l_g=0.d0, rot_dt_wing_r_g=0.d0 + real(kind=rk), dimension(1:3) :: rot_dt_wing_l2_w=0.d0, rot_dt_wing_r2_w=0.d0 + real(kind=rk), dimension(1:3) :: rot_dt_wing_l2_g=0.d0, rot_dt_wing_r2_g=0.d0 ! Vector from body centre to pivot points in global reference frame real(kind=rk), dimension(1:3) :: x_pivot_l_g=0.d0, x_pivot_r_g=0.d0 + real(kind=rk), dimension(1:3) :: x_pivot_l2_g=0.d0, x_pivot_r2_g=0.d0 ! vectors desribing the positoions of insect's key elements ! in the body coordinate system real(kind=rk), dimension(1:3) :: x_head=0.d0,x_eye_r=0.d0,x_eye_l=0.d0,x_pivot_l_b=0.d0,x_pivot_r_b=0.d0 + real(kind=rk), dimension(1:3) :: x_pivot_l2_b=0.d0,x_pivot_r2_b=0.d0 ! moments of inertia in the body reference frame real(kind=rk) :: Jroll_body=0.d0, Jyaw_body=0.d0, Jpitch_body=0.d0 ! total mass of insect: @@ -117,6 +139,8 @@ module module_insects ! variables to decide whether to draw the body or not. character(len=strlen) :: body_moves="yes" logical :: body_already_drawn = .false. + ! second wing pair exists or not + logical :: second_wing_pair !------------------------------------------------------------- ! for free flight solver !------------------------------------------------------------- @@ -136,7 +160,7 @@ module module_insects ! STATE(11) : x-angular velocity of body (in body system) ! STATE(12) : y-angular velocity of body (in body system) ! STATE(13) : z-angular velocity of body (in body system) - ! STATE(14) : 1st component of left wing quaternion + ! STATE(14) : 1st component of left wing quaternion (WHY ONLY LEFT?) ! STATE(15) : 2nd component of left wing quaternion ! STATE(16) : 3rd component of left wing quaternion ! STATE(17) : 4th component of left wing quaternion @@ -159,32 +183,32 @@ module module_insects ! R = a0/2 + SUM ( ai cos(2pi*i) + bi sin(2pi*i) ) ! to avoid compatibility issues, the array is of fixed size, although only ! the first nftt_wings entries will be used - real(kind=rk), dimension(1:nfft_max) :: ai_wings=0.d0, bi_wings=0.d0 - real(kind=rk) :: a0_wings=0.d0 + real(kind=rk), dimension(1:nfft_max,1:4) :: ai_wings=0.d0, bi_wings=0.d0 + real(kind=rk), dimension(1:4) :: a0_wings=0.d0 ! fill the R0(theta) array once, then only table-lookup instead of Fseries - real(kind=rk), dimension(1:25000) :: R0_table=0.d0 + real(kind=rk), dimension(1:25000,1:4) :: R0_table=0.d0 ! describes the origin of the wings system - real(kind=rk) :: xc=0.d0,yc=0.d0 + real(kind=rk), dimension(1:4) :: xc=0.d0, yc=0.d0 ! number of fft coefficients for wing geometry - integer :: nfft_wings=0 - logical :: wingsetup_done = .false. - logical :: wings_radius_table_ready = .false. + integer, dimension(1:4) :: nfft_wings=0 + logical, dimension(1:4) :: wingsetup_done = .false. + logical, dimension(1:4) :: wings_radius_table_ready = .false. ! wing bounding box (xmin, xmax, ymin, ymax, zmin, zmax) - real(kind=rk) :: wing_bounding_box(1:6) = 0.d0 - ! wing inertia + real(kind=rk) :: wing_bounding_box(1:6,1:4) = 0.d0 + ! wing inertia (TODO: adapt for 4 wings) real(kind=rk) :: Jxx=0.d0,Jyy=0.d0,Jzz=0.d0,Jxy=0.d0 character(len=strlen) :: wing_thickness_distribution = "constant" character(len=strlen) :: pointcloudfile = "none" + character(len=strlen) :: smoothing_thickness = "local" logical :: corrugated = .false. - real(kind=rk) :: corrugation_array_bbox(1:4) - !-------------------------------------------------------------- ! Wing kinematics !-------------------------------------------------------------- ! wing kinematics Fourier coefficients type(wingkinematics) :: kine_wing_l, kine_wing_r + type(wingkinematics) :: kine_wing_l2, kine_wing_r2 ! the following flag makes the code write the kinematics log to either kinematics.t ! (regular simulation) or kinematics.dry-run.t (for a dry run). The reason for this ! is that during postprocessing of an existing run, the dry run would overwrite the @@ -192,13 +216,17 @@ module module_insects character(len=strlen) :: kinematics_file = "kinematics.t" ! rotation matrices for the various coordinate system for the insect real(kind=rk),dimension(1:3,1:3) :: M_body, M_wing_l, M_wing_r, M_body_inv + real(kind=rk),dimension(1:3,1:3) :: M_wing_l2, M_wing_r2 !------------------------------------------------------------- ! parameters that control shape of wings, body, and motion !------------------------------------------------------------- - character(len=strlen) :: WingShape="", BodyType="", BodyMotion="", HasDetails="" + character(len=strlen) :: WingShape(1:4)=["","","",""] ! left, right, 2nd left, 2nd right + character(len=strlen) :: BodyType="", BodyMotion="", HasDetails="" character(len=strlen) :: FlappingMotion_right="", FlappingMotion_left="" + character(len=strlen) :: FlappingMotion_right2="", FlappingMotion_left2="" character(len=strlen) :: infile="", LeftWing="", RightWing="" + character(len=strlen) :: infile2="", LeftWing2="", RightWing2="" ! parameters for body: real(kind=rk) :: L_body=0.d0, b_body=0.d0, R_head=0.d0, R_eye=0.d0 ! parameters for wing shape: @@ -207,13 +235,14 @@ module module_insects real(kind=rk) :: safety=0.d0, smooth=0.d0 ! parameter for hovering: real(kind=rk) :: distance_from_sponge=0.d0 - ! Wings and body forces (1:body, 2:left wing, 3:right wing) - type(Integrals), dimension(1:3) :: PartIntegrals + ! Wings and body forces (1:body, 2:left wing, 3:right wing, 4:left wing, 5:right wing) + type(Integrals), dimension(1:5) :: PartIntegrals !------------------------------------------------------------- ! parameters for mask coloring !------------------------------------------------------------- - integer(kind=2) :: color_body=1, color_l=2, color_r=3 + ! available color values + integer(kind=2) :: color_body=1, color_l=2, color_r=3, color_l2=4, color_r2=5 end type diptera !----------------------------------------------------------------------------- @@ -260,103 +289,116 @@ subroutine Allocate_Arrays ( Insect, array_name, a, b ) end subroutine Allocate_Arrays - !----------------------------------------------------------------------------- - ! Many parts of the insect mask generation are done only once per time step (i.e. - ! per mask generation). Now, the adaptive code calls Draw_Insect several times, on each - ! block of the grid. Draw_Insect is thus called SEVERAL times per mask generation. - ! Therefore, we outsource the parts that need to be done only once to this routine, - ! and call it BEFORE calling Draw_Insect. For FLUSI, this does not have any effect - ! other than having two routines. - !----------------------------------------------------------------------------- - subroutine Update_Insect( time, Insect ) - implicit none - - real(kind=rk), intent(in) :: time - type(diptera),intent(inout) :: Insect - logical, save :: first_call = .true. - - !----------------------------------------------------------------------------- - ! fetch current motion state - !----------------------------------------------------------------------------- - call BodyMotion (time, Insect) - call FlappingMotion_right (time, Insect) - call FlappingMotion_left (time, Insect) - call StrokePlane (time, Insect) - - !----------------------------------------------------------------------------- - ! define the rotation matrices to change between coordinate systems - !----------------------------------------------------------------------------- - call body_rotation_matrix( Insect, Insect%M_body ) - call wing_right_rotation_matrix( Insect, Insect%M_wing_r ) - call wing_left_rotation_matrix( Insect, Insect%M_wing_l ) - - ! inverse of the body rotation matrices - Insect%M_body_inv = transpose(Insect%M_body) - - ! body angular velocity vector in b/g coordinate system - call body_angular_velocity( Insect, Insect%rot_body_b, Insect%rot_body_g, Insect%M_body ) - ! rel+abs wing angular velocities in the w/b/g coordinate system - call wing_angular_velocities ( time, Insect, Insect%M_body ) - ! angular acceleration for wings (required for inertial power) - call wing_angular_accel( time, Insect ) - - !----------------------------------------------------------------------------- - ! vector from body centre to left/right pivot point in global reference frame, - ! for aerodynamic power - !----------------------------------------------------------------------------- - Insect%x_pivot_l_g = matmul(Insect%M_body_inv, Insect%x_pivot_l_b) - Insect%x_pivot_r_g = matmul(Insect%M_body_inv, Insect%x_pivot_r_b) - - - if (first_call) then - ! print some important numbers, routine exectuted only once during a simulation - call print_insect_reynolds_numbers( Insect ) - first_call = .false. - endif + !----------------------------------------------------------------------------- + ! Many parts of the insect mask generation are done only once per time step (i.e. + ! per mask generation). Now, the adaptive code calls Draw_Insect several times, on each + ! block of the grid. Draw_Insect is thus called SEVERAL times per mask generation. + ! Therefore, we outsource the parts that need to be done only once to this routine, + ! and call it BEFORE calling Draw_Insect. For FLUSI, this does not have any effect + ! other than having two routines. + !----------------------------------------------------------------------------- + subroutine Update_Insect( time, Insect ) + implicit none + + real(kind=rk), intent(in) :: time + type(diptera),intent(inout) :: Insect - ! save time to insect, then we can check if the update routine has been called - ! or not (this is not necessary if Update_Insect is called, but helpful to prevent - ! human errors) - Insect%time = time + logical, save :: first_call = .true. + integer(kind=2) :: wingID - end subroutine Update_Insect + !----------------------------------------------------------------------------- + ! fetch current motion state + !----------------------------------------------------------------------------- + call BodyMotion (time, Insect) + wingID = 1 + call FlappingMotionWrap (time, Insect, wingID) + wingID = 2 + call FlappingMotionWrap (time, Insect, wingID) + if (Insect%second_wing_pair) then + wingID = 3 + call FlappingMotionWrap (time, Insect, wingID) + wingID = 4 + call FlappingMotionWrap (time, Insect, wingID) + endif + call StrokePlane (time, Insect) + + !----------------------------------------------------------------------------- + ! define the rotation matrices to change between coordinate systems + !----------------------------------------------------------------------------- + call body_rotation_matrix( Insect, Insect%M_body ) + call wing_right_rotation_matrix( Insect, Insect%M_wing_r ) + call wing_left_rotation_matrix( Insect, Insect%M_wing_l ) + if (Insect%second_wing_pair) then + call wing_right2_rotation_matrix( Insect, Insect%M_wing_r2 ) + call wing_left2_rotation_matrix( Insect, Insect%M_wing_l2 ) + endif + + ! inverse of the body rotation matrices + Insect%M_body_inv = transpose(Insect%M_body) + + ! body angular velocity vector in b/g coordinate system + call body_angular_velocity( Insect, Insect%rot_body_b, Insect%rot_body_g, Insect%M_body ) + ! rel+abs wing angular velocities in the w/b/g coordinate system + call wing_angular_velocities ( time, Insect, Insect%M_body ) + ! angular acceleration for wings (required for inertial power) + call wing_angular_accel( time, Insect ) + + !----------------------------------------------------------------------------- + ! vector from body centre to left/right pivot point in global reference frame, + ! for aerodynamic power + !----------------------------------------------------------------------------- + Insect%x_pivot_l_g = matmul(Insect%M_body_inv, Insect%x_pivot_l_b) + Insect%x_pivot_r_g = matmul(Insect%M_body_inv, Insect%x_pivot_r_b) + if (Insect%second_wing_pair) then + Insect%x_pivot_l2_g = matmul(Insect%M_body_inv, Insect%x_pivot_l2_b) + Insect%x_pivot_r2_g = matmul(Insect%M_body_inv, Insect%x_pivot_r2_b) + endif + + if (first_call) then + ! print some important numbers, routine exectuted only once during a simulation + ! call print_insect_reynolds_numbers( Insect ) ! ERROR: this can only be called after wing shape initialization + first_call = .false. + endif + + ! save time to insect, then we can check if the update routine has been called + ! or not (this is not necessary if Update_Insect is called, but helpful to prevent + ! human errors) + Insect%time = time + + end subroutine Update_Insect !------------------------------------------------------------------------------- - ! Main routine for drawing insects. Loops over the entire domain, computes - ! coordinates in various systems (global-, body-, stroke-, wing-) and calls - ! subroutines doing the actual job of defining the mask. Note all surfaces are - ! smoothed. + ! Main routine for drawing insects. Draws body and wings, parameters are in "INSECT" !------------------------------------------------------------------------------- - subroutine Draw_Insect( time, Insect, xx0, ddx, mask, mask_color, us) + subroutine Draw_Insect( time, Insect, xx0, ddx, mask, mask_color, us ) implicit none - real(kind=rk), intent(in) :: time - type(diptera),intent(inout) :: Insect - real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) - real(kind=rk),intent(inout) :: mask(0:,0:,0:) - real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) - integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - - real(kind=rk) :: t1 - real(kind=rk),dimension(1:3) :: x, x_body, v_tmp - ! real(kind=rk),dimension(1:3,1:3) :: M_body, M_wing_l, M_wing_r, M_body_inv - integer :: ix, iy, iz - integer(kind=2) :: c + real(kind=rk), intent(in) :: time + type(diptera), intent(inout) :: Insect + real(kind=rk), intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk), intent(inout) :: mask(0:,0:,0:) + real(kind=rk), intent(inout) :: us(0:,0:,0:,1:) + integer(kind=2), intent(inout) :: mask_color(0:,0:,0:) if ((dabs(Insect%time-time)>1.0d-10).and.root) then write(*,'("error! time=",es15.8," but Insect%time=",es15.8)') time, Insect%time write(*,'("Did you call Update_Insect before Draw_Insect?")') endif - Insect%smooth = 1.0d0*maxval(ddx) - Insect%safety = 3.5d0*Insect%smooth + ! 28/01/2019: Thomas. Discovered that this was done block based, i.e. the smoothing layer + ! had different thickness, if some blocks happened to be at different levels (and still carry + ! a part of the smoothing layer.) I don't know if that made sense, because the layer shrinks/expands then + ! and because it might be discontinous. Both options are included now, default is "as before" + ! Insect%smoothing_thickness=="local" : smoothing_layer = c_sm * 2**-J * L/(BS-1) + ! Insect%smoothing_thickness=="global" : smoothing_layer = c_sm * 2**-Jmax * L/(BS-1) + if (Insect%smoothing_thickness=="local") then + Insect%smooth = 1.0d0*maxval(ddx) + Insect%safety = 3.5d0*Insect%smooth + endif ! delete old mask call delete_old_mask( time, mask, mask_color, us, Insect ) - !----------------------------------------------------------------------------- - ! Draw individual parts of the Diptera. Separate loops are faster - ! since the compiler can optimize them better !----------------------------------------------------------------------------- ! BODY. Now the body is special: if the insect does not move (or rotate), the ! body does not change in time. On the other hand, it is quite expensive to @@ -364,76 +406,28 @@ subroutine Draw_Insect( time, Insect, xx0, ddx, mask, mask_color, us) ! load balancing problems, since many cores do not draw the body at all. ! We thus try to draw it only once and then simply not to erase it later. !----------------------------------------------------------------------------- - if (Insect%body_moves=="no" .and. avoid_drawing_static_body) then + if (Insect%body_moves=="no" .and. .not. grid_time_dependent) then if (.not. Insect%body_already_drawn) then - ! the body is at rest, but it is the first call to this routine, so - ! draw it now. - if (root .and. (.not. Insect%body_already_drawn) ) then + ! the body is at rest, but it is the first call to this routine, so draw it now + if (root) then + write(*,'(80("~"))') write(*,*) "Flag Insect%body_moves is no and we did not yet draw" - write(*,*) "the body once: we do that now, and skip draw_body" + write(*,*) "the body once: we do that now, and skip draw_insect_body" write(*,*) "from now on. time=", time + write(*,'(80("~"))') endif - - call draw_body( xx0, ddx, mask, mask_color, us, Insect, Insect%color_body, Insect%M_body) + call draw_insect_body( time, xx0, ddx, mask, mask_color, us, Insect, delete=.false.) Insect%body_already_drawn = .true. endif else ! the body moves, draw it - call draw_body(xx0, ddx, mask, mask_color, us, Insect, Insect%color_body, Insect%M_body) + call draw_insect_body( time, xx0, ddx, mask, mask_color, us, Insect, delete=.false.) endif !----------------------------------------------------------------------------- ! Wings !----------------------------------------------------------------------------- - if (Insect%RightWing == "yes") then - call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_r, Insect%M_body, & - Insect%M_wing_r, Insect%x_pivot_r_b, Insect%rot_rel_wing_r_w ) - endif - - if (Insect%LeftWing == "yes") then - call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_l, Insect%M_body, & - Insect%M_wing_l, Insect%x_pivot_l_b, Insect%rot_rel_wing_l_w ) - endif - - !----------------------------------------------------------------------------- - ! Add solid body rotation (i.e. the velocity field that originates - ! from the body rotation and translation). Until now, the wing velocities - ! were the only ones set plus they are in the body reference frame - !----------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - c = mask_color(ix,iy,iz) - ! skip all parts that do not belong to the insect (ie they have a different color) - if (c==Insect%color_body .or. c==Insect%color_l .or. c==Insect%color_r ) then - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) - x_body = matmul(Insect%M_body, x) - - ! add solid body rotation in the body-reference frame, if color - ! indicates that this part of the mask belongs to the insect - if (mask(ix,iy,iz) > 0.d0) then - - ! translational part. we compute the rotational part in the body - ! reference frame, therefore, we must transform the body translation - ! velocity Insect%vc (which is in global coordinates) to the body frame - v_tmp = matmul(Insect%M_body, Insect%vc_body_g) - - ! add solid body rotation to the translational velocity field. Note - ! that rot_body_b and x_body are in the body reference frame - v_tmp(1) = v_tmp(1)+Insect%rot_body_b(2)*x_body(3)-Insect%rot_body_b(3)*x_body(2) - v_tmp(2) = v_tmp(2)+Insect%rot_body_b(3)*x_body(1)-Insect%rot_body_b(1)*x_body(3) - v_tmp(3) = v_tmp(3)+Insect%rot_body_b(1)*x_body(2)-Insect%rot_body_b(2)*x_body(1) - - ! the body motion is added to the wing motion, which is already in us - ! and they are also in the body refrence frame. However, us has to be - ! in the global reference frame, so M_body_inverse is applied - us(ix,iy,iz,1:3) = matmul( Insect%M_body_inv, us(ix,iy,iz,1:3)+v_tmp ) - endif - endif - enddo - enddo - enddo + call draw_insect_wings( time, xx0, ddx, mask, mask_color, us, Insect, delete=.false.) ! this is a debug test, which suceeded. !call check_if_us_is_derivative_of_position_wingtip(time, Insect) @@ -447,7 +441,6 @@ end subroutine Draw_Insect ! thickness (i.e., in the limit, steps=1 if xt !------------------------------------------------------- real(kind=rk) function steps(x, t, h) - implicit none real(kind=rk) :: x, t, h ! f is 1 if x<=t-h @@ -511,7 +504,7 @@ end subroutine get_dangle subroutine aero_power(Insect,apowtotal) implicit none - integer :: color_body, color_l, color_r + integer :: color_body, color_l, color_r, color_l2, color_r2 real(kind=rk), dimension(1:3) :: omrel, momrel real(kind=rk), intent(out) :: apowtotal type(diptera),intent(inout)::Insect @@ -558,6 +551,43 @@ subroutine aero_power(Insect,apowtotal) apowtotal = Insect%PartIntegrals(color_body)%APow + & Insect%PartIntegrals(color_l)%APow + Insect%PartIntegrals(color_r)%APow + !----------- + ! if second wing pair is present + !----------- + if (Insect%second_wing_pair) then + ! Colors + color_l2 = Insect%color_l2 + color_r2 = Insect%color_r2 + + ! left wing + ! relative angular velocity, in global system + omrel = Insect%rot_rel_wing_l2_g + + ! compute moment with respect to the pivot point + ! initialize it as the moment with respect to insect's centre point + momrel = Insect%PartIntegrals(color_l2)%Torque + & + Insect%PartIntegrals(color_l2)%Torque_unst + + ! aerodynamic power + Insect%PartIntegrals(color_l2)%APow = - sum( momrel * omrel ) + + ! right wing + ! relative angular velocity, in global system + omrel = Insect%rot_rel_wing_r2_g + + ! compute moment with respect to the pivot point + ! initialize it as the moment with respect to insect's centre point + momrel = Insect%PartIntegrals(color_r2)%Torque + & + Insect%PartIntegrals(color_r2)%Torque_unst + + ! aerodynamic power + Insect%PartIntegrals(color_r2)%APow = - sum( momrel * omrel ) + + ! Total aerodynamic power + apowtotal = apowtotal + Insect%PartIntegrals(color_l2)%APow + & + Insect%PartIntegrals(color_r2)%APow + endif + end subroutine aero_power @@ -587,7 +617,7 @@ subroutine inert_power(Insect,ipowtotal) real(kind=rk), intent(out) :: ipowtotal real(kind=rk), dimension(1:3) :: a,b - integer(kind=2) :: color_body, color_l,color_r + integer(kind=2) :: color_body, color_l, color_r, color_l2, color_r2 type(diptera),intent(inout)::Insect ! colors for Diptera (one body, two wings) @@ -625,6 +655,46 @@ subroutine inert_power(Insect,ipowtotal) ipowtotal = Insect%PartIntegrals(color_r)%IPow + Insect%PartIntegrals(color_l)%IPow + !----------- + ! if second wing pair is present + !----------- + if (Insect%second_wing_pair) then + ! colors + color_l2 = Insect%color_l2 + color_r2 = Insect%color_r2 + + ! second left wing + a(1) = Insect%Jxx * Insect%rot_dt_wing_l2_w(1) + Insect%Jxy * Insect%rot_dt_wing_l2_w(2) + a(2) = Insect%Jxy * Insect%rot_dt_wing_l2_w(1) + Insect%Jyy * Insect%rot_dt_wing_l2_w(2) + a(3) = Insect%Jzz * Insect%rot_dt_wing_l2_w(3) + + b(1) = Insect%Jxx * Insect%rot_rel_wing_l2_w(1) + Insect%Jxy * Insect%rot_rel_wing_l2_w(2) + b(2) = Insect%Jxy * Insect%rot_rel_wing_l2_w(1) + Insect%Jyy * Insect%rot_rel_wing_l2_w(2) + b(3) = Insect%Jzz * Insect%rot_rel_wing_l2_w(3) + + Insect%PartIntegrals(color_l2)%IPow = & + Insect%rot_rel_wing_l2_w(1) * (a(1)+Insect%rot_rel_wing_l2_w(2)*b(3)-Insect%rot_rel_wing_l2_w(3)*b(2)) +& + Insect%rot_rel_wing_l2_w(2) * (a(2)+Insect%rot_rel_wing_l2_w(3)*b(1)-Insect%rot_rel_wing_l2_w(1)*b(3)) +& + Insect%rot_rel_wing_l2_w(3) * (a(3)+Insect%rot_rel_wing_l2_w(1)*b(2)-Insect%rot_rel_wing_l2_w(2)*b(1)) + + ! second right wing + a(1) = Insect%Jxx * Insect%rot_dt_wing_r2_w(1) + Insect%Jxy * Insect%rot_dt_wing_r2_w(2) + a(2) = Insect%Jxy * Insect%rot_dt_wing_r2_w(1) + Insect%Jyy * Insect%rot_dt_wing_r2_w(2) + a(3) = Insect%Jzz * Insect%rot_dt_wing_r2_w(3) + + b(1) = Insect%Jxx * Insect%rot_rel_wing_r2_w(1) + Insect%Jxy * Insect%rot_rel_wing_r2_w(2) + b(2) = Insect%Jxy * Insect%rot_rel_wing_r2_w(1) + Insect%Jyy * Insect%rot_rel_wing_r2_w(2) + b(3) = Insect%Jzz * Insect%rot_rel_wing_r2_w(3) + + Insect%PartIntegrals(color_r)%IPow = & + Insect%rot_rel_wing_r2_w(1) * (a(1)+Insect%rot_rel_wing_r2_w(2)*b(3)-Insect%rot_rel_wing_r2_w(3)*b(2)) +& + Insect%rot_rel_wing_r2_w(2) * (a(2)+Insect%rot_rel_wing_r2_w(3)*b(1)-Insect%rot_rel_wing_r2_w(1)*b(3)) +& + Insect%rot_rel_wing_r2_w(3) * (a(3)+Insect%rot_rel_wing_r2_w(1)*b(2)-Insect%rot_rel_wing_r2_w(2)*b(1)) + + ! total + ipowtotal = ipowtotal + Insect%PartIntegrals(color_r2)%IPow + & + Insect%PartIntegrals(color_l2)%IPow + endif end subroutine inert_power !----------------------------------------------------------------------------- @@ -776,7 +846,6 @@ subroutine wing_angular_velocities ( time, Insect, M_body ) Insect%rot_abs_wing_l_g = Insect%rot_body_g + Insect%rot_rel_wing_l_g Insect%rot_abs_wing_r_g = Insect%rot_body_g + Insect%rot_rel_wing_r_g - if (Insect%wing_fsi == "yes") then !********************************** !** Wing fsi model ** @@ -789,6 +858,59 @@ subroutine wing_angular_velocities ( time, Insect, M_body ) Insect%rot_abs_wing_l_g = Insect%rot_body_g + Insect%rot_rel_wing_l_g endif + !----------- + ! if second wing pair is present + !----------- + if (Insect%second_wing_pair) then + ! setup the local wing parameters + phi_r = Insect%phi_r2 + alpha_r = Insect%alpha_r2 + theta_r = Insect%theta_r2 + phi_dt_r = Insect%phi_dt_r2 + alpha_dt_r = Insect%alpha_dt_r2 + theta_dt_r = Insect%theta_dt_r2 + phi_l = Insect%phi_l2 + alpha_l = Insect%alpha_l2 + theta_l = Insect%theta_l2 + phi_dt_l = Insect%phi_dt_l2 + alpha_dt_l = Insect%alpha_dt_l2 + theta_dt_l = Insect%theta_dt_l2 + + ! second wing pair rotation matrices + call Ry(M1_l,alpha_l) + call Rz(M2_l,theta_l) + call Rx(M3_l,phi_l) + M_wing_l = matmul(M1_l,matmul(M2_l,matmul(M3_l,M_stroke_l))) + call Ry(M1_r,-alpha_r) + call Rz(M2_r,theta_r) + call Rx(M3_r,-phi_r) + M_wing_r = matmul(M1_r,matmul(M2_r,matmul(M3_r,M_stroke_r))) + + ! angular velocity vectors (in wing system) + rot_l_alpha = (/ 0.0d0, alpha_dt_l, 0.0d0 /) + rot_l_theta = (/ 0.0d0, 0.0d0, theta_dt_l /) + rot_l_phi = (/ phi_dt_l, 0.0d0, 0.0d0 /) + rot_r_alpha = (/ 0.0d0, -alpha_dt_r, 0.0d0/) + rot_r_theta = (/ 0.0d0, 0.0d0, theta_dt_r /) + rot_r_phi = (/ -phi_dt_r, 0.0d0, 0.0d0 /) + + ! in the wing coordinate system + Insect%rot_rel_wing_l2_w = matmul(M_wing_l,matmul(transpose(M_stroke_l),matmul(transpose(M3_l), & + rot_l_phi+matmul(transpose(M2_l),rot_l_theta+matmul(transpose(M1_l), & + rot_l_alpha))))) + Insect%rot_rel_wing_r2_w = matmul(M_wing_r,matmul(transpose(M_stroke_r),matmul(transpose(M3_r), & + rot_r_phi+matmul(transpose(M2_r),rot_r_theta+matmul(transpose(M1_r), & + rot_r_alpha))))) + + ! wing angular velocities + Insect%rot_rel_wing_l2_b = matmul( transpose(M_wing_l), Insect%rot_rel_wing_l2_w ) + Insect%rot_rel_wing_r2_b = matmul( transpose(M_wing_r), Insect%rot_rel_wing_r2_w ) + Insect%rot_rel_wing_l2_g = matmul( transpose(M_body), Insect%rot_rel_wing_l2_b ) + Insect%rot_rel_wing_r2_g = matmul( transpose(M_body), Insect%rot_rel_wing_r2_b ) + Insect%rot_abs_wing_l2_g = Insect%rot_body_g + Insect%rot_rel_wing_l2_g + Insect%rot_abs_wing_r2_g = Insect%rot_body_g + Insect%rot_rel_wing_r2_g + endif + end subroutine wing_angular_velocities @@ -805,8 +927,10 @@ subroutine wing_angular_accel( time, Insect ) type(diptera), intent(inout) :: Insect real(kind=rk) :: M_body(1:3,1:3), rot_dt_wing_g(1:3), M_wing_r(1:3,1:3), M_wing_l(1:3,1:3) + real(kind=rk) :: M_wing_r2(1:3,1:3), M_wing_l2(1:3,1:3) type(diptera) :: Insect2 real(kind=rk) :: dt,t + integer(kind=2) :: wingID dt = 1.0d-8 Insect2 = Insect @@ -816,8 +940,16 @@ subroutine wing_angular_accel( time, Insect ) ! fetch motion state at time+dt call BodyMotion (time+dt, Insect2) - call FlappingMotion_right(time+dt, Insect2) - call FlappingMotion_left (time+dt, Insect2) + wingID = 1 + call FlappingMotionWrap(time+dt, Insect2, wingID) + wingID = 2 + call FlappingMotionWrap(time+dt, Insect2, wingID) + if (Insect%second_wing_pair) then + wingID = 3 + call FlappingMotionWrap(time+dt, Insect2, wingID) + wingID = 4 + call FlappingMotionWrap(time+dt, Insect2, wingID) + endif call StrokePlane (time+dt, Insect2) call body_rotation_matrix( Insect2, M_body ) call wing_angular_velocities ( time+dt, Insect2, M_body ) @@ -825,9 +957,13 @@ subroutine wing_angular_accel( time, Insect ) call body_rotation_matrix( Insect, M_body ) call wing_right_rotation_matrix( Insect, M_wing_r ) call wing_left_rotation_matrix( Insect, M_wing_l ) + if (Insect%second_wing_pair) then + call wing_right2_rotation_matrix( Insect, M_wing_r2 ) + call wing_left2_rotation_matrix( Insect, M_wing_l2 ) + endif ! use one-sided finite differences to derive the absolute angular velocity with - ! respect to time. NOte in older code versions, this was wrong, as we derived + ! respect to time. Note in older code versions, this was wrong, as we derived ! the ang. vel. in the wing coordinate system, which is a moving reference frame. ! now happily, the old results are still correct, as long as the body does not rotate @@ -840,6 +976,13 @@ subroutine wing_angular_accel( time, Insect ) rot_dt_wing_g = (Insect2%rot_rel_wing_r_g - Insect%rot_rel_wing_r_g) / dt Insect%rot_dt_wing_r_w = matmul(M_wing_r,matmul(M_body, rot_dt_wing_g)) + ! if second wing pair is present + if (Insect%second_wing_pair) then + rot_dt_wing_g = (Insect2%rot_rel_wing_l2_g - Insect%rot_rel_wing_l2_g) / dt + Insect%rot_dt_wing_l2_w = matmul(M_wing_l2,matmul(M_body, rot_dt_wing_g)) + rot_dt_wing_g = (Insect2%rot_rel_wing_r2_g - Insect%rot_rel_wing_r2_g) / dt + Insect%rot_dt_wing_r2_w = matmul(M_wing_r2,matmul(M_body, rot_dt_wing_g)) + endif ! if (root) then ! write(*,*) "L new code", Insect%rot_dt_wing_l_w @@ -891,20 +1034,23 @@ subroutine delete_old_mask( time, mask, mask_color, us, Insect ) real(kind=rk),intent(inout) :: mask(0:,0:,0:) real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) - integer(kind=2) :: color_body, color_l, color_r + integer(kind=2) :: color_body, color_l, color_r, color_l2, color_r2 logical, save :: cleaned_already_once = .false. ! colors for Diptera (one body, two wings) color_body = Insect%color_body color_l = Insect%color_l color_r = Insect%color_r + color_l2 = Insect%color_l2 + color_r2 = Insect%color_r2 !----------------------------------------------------------------------------- ! delete old mask !----------------------------------------------------------------------------- - if (Insect%body_moves=="no" .and. avoid_drawing_static_body .and. cleaned_already_once) then + if (Insect%body_moves=="no" .and. .not. grid_time_dependent .and. cleaned_already_once) then ! the body is at rest, so we will not draw it. Delete the wings, as they move. - where (mask_color==color_l .or. mask_color==color_r) + where (mask_color==color_l .or. mask_color==color_r .or. & + mask_color==color_l2 .or. mask_color==color_r2) mask = 0.d0 mask_color = 0 end where @@ -951,6 +1097,7 @@ subroutine body_rotation_matrix( Insect, M_body ) endif end subroutine body_rotation_matrix + !----------------------------------------------------------------------------- ! return the rotation matrix for the right wing !----------------------------------------------------------------------------- @@ -961,7 +1108,6 @@ subroutine wing_right_rotation_matrix( Insect, M_wing_r ) real(kind=rk),intent(out) :: M_wing_r(1:3,1:3) real(kind=rk), dimension(1:3,1:3) :: M1, M2, M3, M_stroke_r - call Rx(M1,pi) call Ry(M2,Insect%eta_stroke) M_stroke_r = matmul(M1,M2) @@ -1007,17 +1153,64 @@ subroutine wing_left_rotation_matrix( Insect, M_wing_l ) endif end subroutine wing_left_rotation_matrix + + !----------------------------------------------------------------------------- + ! return the rotation matrix for the SECOND right wing + !----------------------------------------------------------------------------- + subroutine wing_right2_rotation_matrix( Insect, M_wing_r2 ) + implicit none + + type(diptera),intent(inout) :: Insect + real(kind=rk),intent(out) :: M_wing_r2(1:3,1:3) + real(kind=rk), dimension(1:3,1:3) :: M1, M2, M3, M_stroke_r2 + + call Rx(M1,pi) + call Ry(M2,Insect%eta_stroke) + M_stroke_r2 = matmul(M1,M2) + + ! note the coordinate system is rotated so we don't need to inverse the sign + ! of theta, and the wings still rotate in opposite direction + call Ry(M1,-Insect%alpha_r2) + call Rz(M2, Insect%theta_r2) + call Rx(M3,-Insect%phi_r2) + M_wing_r2 = matmul(M1,matmul(M2,matmul(M3,M_stroke_r2))) + end subroutine wing_right2_rotation_matrix + + + !----------------------------------------------------------------------------- + ! return the rotation matrix for the SECOND left wing + !----------------------------------------------------------------------------- + subroutine wing_left2_rotation_matrix( Insect, M_wing_l2 ) + implicit none + + type(diptera),intent(inout) :: Insect + real(kind=rk),intent(out) :: M_wing_l2(1:3,1:3) + real(kind=rk),dimension(1:3,1:3) :: M1, M2, M3, M_stroke_l2 + + ! we're not using the wing fsi solver, so the wings follow a prescribed + ! motion and we can compute the rotation matrix from the angles + call Ry(M1,Insect%eta_stroke) + M_stroke_l2 = M1 + + call Ry(M1,Insect%alpha_l2) + call Rz(M2,Insect%theta_l2) + call Rx(M3,Insect%phi_l2) + M_wing_l2 = matmul(M1,matmul(M2,matmul(M3,M_stroke_l2))) + end subroutine wing_left2_rotation_matrix + + !----------------------------------------------------------------------------- ! Compute and print a couple of important numbers for insects !----------------------------------------------------------------------------- subroutine print_insect_reynolds_numbers( Insect ) implicit none type(diptera),intent(inout) :: Insect - type(diptera) :: Insect_copy + !type(diptera) :: Insect_copy ! commented out due to segmentation problems real(kind=rk) :: area, Re_f, Re real(kind=rk) :: time, dt real(kind=rk) :: phil_min, phil_max, phir_min, phir_max logical, save :: first_call = .true. + integer(kind=2) :: wingID ! the second call is just a return statement if ( first_call .eqv. .false.) return @@ -1025,17 +1218,18 @@ subroutine print_insect_reynolds_numbers( Insect ) ! only root does this... if (root) then ! we need the wing area to compute the mean wing chord - call compute_wing_surface(Insect, area) + wingID = 1 ! use the left wing area (wingID=1) + call compute_wing_surface(Insect, wingID, area) write(*,'(50("~"))') write(*,'("Wing area is A=",g15.8)') area write(*,'("Mean chord length is c_m=",g15.8)') area/1.d0 ! note c_m = A/R but R=1 if (Insect%wing_fsi /= 'yes') then - ! first we computethe stroke amplitude of the positional angle phi (for + ! first we compute the stroke amplitude of the positional angle phi (for ! both wings). for safety, we make a copy of the insect, since the routines ! for the flapping motion write to this object, and we want to prevent any ! unwanted side effects - Insect_copy = Insect + !Insect_copy = Insect ! save the insect state time = 0.d0 dt = 1.0d-3 phil_min = 0.d0 @@ -1044,12 +1238,16 @@ subroutine print_insect_reynolds_numbers( Insect ) phir_max = 0.d0 ! we use only one stroke ( the first one ) do while (time < 1.d0) - call FlappingMotion_left ( time, Insect_copy ) - call FlappingMotion_right ( time, Insect_copy ) - phil_min = min( phil_min, Insect_copy%phi_l ) - phil_max = max( phil_max, Insect_copy%phi_l ) - phir_min = min( phir_min, Insect_copy%phi_r ) - phir_max = max( phir_max, Insect_copy%phi_r ) + wingID = 1 + call FlappingMotionWrap ( time, Insect, wingID ) +!! call FlappingMotionWrap ( time, Insect_copy, wingID ) + wingID = 2 + call FlappingMotionWrap ( time, Insect, wingID ) +!! call FlappingMotionWrap ( time, Insect_copy, wingID ) + phil_min = min( phil_min, Insect%phi_l ) + phil_max = max( phil_max, Insect%phi_l ) + phir_min = min( phir_min, Insect%phi_r ) + phir_max = max( phir_max, Insect%phi_r ) time = time + dt end do write(*,'("All following quantities are based on the first stroke 0.0 <= t <= 1.0")') @@ -1185,11 +1383,23 @@ subroutine write_kinematics_file( time, Insect ) if (root) then open (17, file=Insect%kinematics_file, status='unknown', position='append') - write (17,'(26(es15.8,1x))') time, Insect%xc_body_g, Insect%psi, Insect%beta, & - Insect%gamma, Insect%eta_stroke, Insect%alpha_l, Insect%phi_l, & - Insect%theta_l, Insect%alpha_r, Insect%phi_r, Insect%theta_r, & - Insect%rot_rel_wing_l_w, Insect%rot_rel_wing_r_w, & - Insect%rot_dt_wing_l_w, Insect%rot_dt_wing_r_w + if (Insect%second_wing_pair) then + write (17,'(44(es15.8,1x))') time, Insect%xc_body_g, Insect%psi, Insect%beta, & + Insect%gamma, Insect%eta_stroke, Insect%alpha_l, Insect%phi_l, & + Insect%theta_l, Insect%alpha_r, Insect%phi_r, Insect%theta_r, & + Insect%rot_rel_wing_l_w, Insect%rot_rel_wing_r_w, & + Insect%rot_dt_wing_l_w, Insect%rot_dt_wing_r_w, & + Insect%alpha_l2, Insect%phi_l2, Insect%theta_l2, & + Insect%alpha_r2, Insect%phi_r2, Insect%theta_r2, & + Insect%rot_rel_wing_l2_w, Insect%rot_rel_wing_r2_w, & + Insect%rot_dt_wing_l2_w, Insect%rot_dt_wing_r2_w + else + write (17,'(26(es15.8,1x))') time, Insect%xc_body_g, Insect%psi, Insect%beta, & + Insect%gamma, Insect%eta_stroke, Insect%alpha_l, Insect%phi_l, & + Insect%theta_l, Insect%alpha_r, Insect%phi_r, Insect%theta_r, & + Insect%rot_rel_wing_l_w, Insect%rot_rel_wing_r_w, & + Insect%rot_dt_wing_l_w, Insect%rot_dt_wing_r_w + endif close (17) endif diff --git a/src/insects/module_insects_integration_flusi_wabbit.f90 b/src/insects/module_insects_integration_flusi_wabbit.f90 index e96cc6d..50c1784 100644 --- a/src/insects/module_insects_integration_flusi_wabbit.f90 +++ b/src/insects/module_insects_integration_flusi_wabbit.f90 @@ -9,6 +9,6 @@ module module_insects_integration_flusi_wabbit implicit none - logical :: avoid_drawing_static_body = .true. + logical, parameter :: grid_time_dependent = .false. end module module_insects_integration_flusi_wabbit diff --git a/src/insects/wings_geometry.f90 b/src/insects/wings_geometry.f90 index e4e2899..d93ed6a 100644 --- a/src/insects/wings_geometry.f90 +++ b/src/insects/wings_geometry.f90 @@ -1,3 +1,128 @@ + +! the new routine (2/2019) creates the wings (if both wings are used, maybe just one is) +! and their solid body velocity field us. Note that us contains both contributions from +! body and wing motion. +subroutine draw_insect_wings(time, xx0, ddx, mask, mask_color, us, Insect, delete) + implicit none + + real(kind=rk), intent(in) :: time + type(diptera), intent(inout) :: Insect + real(kind=rk), intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk), intent(inout) :: mask(0:,0:,0:) + real(kind=rk), intent(inout) :: us(0:,0:,0:,1:) + integer(kind=2), intent(inout) :: mask_color(0:,0:,0:) + logical, intent(in) :: delete + + integer :: ix, iy, iz + real(kind=rk), dimension(1:3) :: x_glob, x_body, v_tmp + integer(kind=2) :: c + + if (size(mask) /= size(mask_color) .or. size(us,4) /= 3) then + write(*,*) "mask:", shape(mask), "mask_color:", shape(mask_color), "us:", shape(us) + call abort (08021902,"Insects: arrays have wrong size..") + endif + + if (delete) then + where (mask_color==Insect%color_r .or. mask_color==Insect%color_l .or. & + mask_color==Insect%color_r2 .or. mask_color==Insect%color_l2) + mask = 0.00_rk + us(:,:,:,1) = 0.00_rk + us(:,:,:,2) = 0.00_rk + us(:,:,:,3) = 0.00_rk + mask_color = 0 + end where + endif + + if ((dabs(Insect%time-time)>1.0d-10).and.root) then + write(*,'("error! time=",es15.8," but Insect%time=",es15.8)') time, Insect%time + write(*,'("Did you call Update_Insect before draw_insect_wings?")') + endif + + ! 28/01/2019: Thomas. Discovered that this was done block based, i.e. the smoothing layer + ! had different thickness, if some blocks happened to be at different levels (and still carry + ! a part of the smoothing layer.) I don't know if that made sense, because the layer shrinks/expands then + ! and because it might be discontinous. Both options are included now, default is "as before" + ! Insect%smoothing_thickness=="local" : smoothing_layer = c_sm * 2**-J * L/(BS-1) + ! Insect%smoothing_thickness=="global" : smoothing_layer = c_sm * 2**-Jmax * L/(BS-1) + ! NOTE: for FLUSI, this has no impact! Here, the grid is constant and equidistant. + if (Insect%smoothing_thickness=="local" .or. .not. grid_time_dependent) then + Insect%smooth = 1.0d0*maxval(ddx) + Insect%safety = 3.5d0*Insect%smooth + endif + + !----------------------------------------------------------------------------- + ! Stage I: mask + us field in wing system + !----------------------------------------------------------------------------- + if (Insect%RightWing == "yes") then + call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_r, & + Insect%M_body, Insect%M_wing_r, Insect%x_pivot_r_b, Insect%rot_rel_wing_r_w ) + endif + + if (Insect%LeftWing == "yes") then + call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_l, & + Insect%M_body, Insect%M_wing_l, Insect%x_pivot_l_b, Insect%rot_rel_wing_l_w ) + endif + + if (Insect%RightWing2 == "yes") then + call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_r2, & + Insect%M_body, Insect%M_wing_r2, Insect%x_pivot_r2_b, Insect%rot_rel_wing_r2_w ) + endif + + if (Insect%LeftWing2 == "yes") then + call draw_wing(xx0, ddx, mask, mask_color, us, Insect, Insect%color_l2, & + Insect%M_body, Insect%M_wing_l2, Insect%x_pivot_l2_b, Insect%rot_rel_wing_l2_w ) + endif + + !----------------------------------------------------------------------------- + ! stage II: add body motion to wing and bring us to global system + !----------------------------------------------------------------------------- + ! Add solid body rotation (i.e. the velocity field that originates + ! from the body rotation and translation). Until now, the wing velocities + ! were the only ones set plus they are in the body reference frame + do iz = g, size(mask,3)-1-g + x_glob(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x_glob(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x_glob(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + + c = mask_color(ix,iy,iz) + ! skip all parts that do not belong to the wings (ie they have a different color) + if (c==Insect%color_l .or. c==Insect%color_r .or. & + c==Insect%color_l2 .or. c==Insect%color_r2 ) then + + if (periodic_insect) x_glob = periodize_coordinate(x_glob, (/xl,yl,zl/)) + x_body = matmul(Insect%M_body, x_glob) + + ! add solid body rotation in the body-reference frame, if color + ! indicates that this part of the mask belongs to the wings + if (mask(ix,iy,iz) > 0.d0) then + + ! translational part. we compute the rotational part in the body + ! reference frame, therefore, we must transform the body translation + ! velocity Insect%vc (which is in global coordinates) to the body frame + v_tmp = matmul(Insect%M_body, Insect%vc_body_g) + + ! add solid body rotation to the translational velocity field. Note + ! that rot_body_b and x_body are in the body reference frame + v_tmp(1) = v_tmp(1) + Insect%rot_body_b(2)*x_body(3)-Insect%rot_body_b(3)*x_body(2) + v_tmp(2) = v_tmp(2) + Insect%rot_body_b(3)*x_body(1)-Insect%rot_body_b(1)*x_body(3) + v_tmp(3) = v_tmp(3) + Insect%rot_body_b(1)*x_body(2)-Insect%rot_body_b(2)*x_body(1) + + ! the body motion is added to the wing motion, which is already in us + ! and they are also in the body refrence frame. However, us has to be + ! in the global reference frame, so M_body_inverse is applied + us(ix,iy,iz,1:3) = matmul( Insect%M_body_inv, us(ix,iy,iz,1:3)+v_tmp ) + endif + endif + enddo + enddo + enddo + +end subroutine + + + ! Wing wrapper for different wing shapes subroutine draw_wing(xx0, ddx, mask, mask_color, us, Insect, color_wing, M_body,& M_wing, x_pivot_b, rot_rel_wing_w) @@ -9,9 +134,14 @@ subroutine draw_wing(xx0, ddx, mask, mask_color, us, Insect, color_wing, M_body, real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) integer(kind=2),intent(in) :: color_wing - real(kind=rk),intent(in)::M_body(1:3,1:3),M_wing(1:3,1:3),x_pivot_b(1:3),rot_rel_wing_w(1:3) + real(kind=rk), intent(in)::M_body(1:3,1:3),M_wing(1:3,1:3),x_pivot_b(1:3),rot_rel_wing_w(1:3) + character(len=strlen) :: wingshape_str + integer(kind=2) :: wingID + + !-- wing id number: 1 = left, 2 = right, 3 = 2nd left, 4 = 2nd right + wingID = color_wing-1 - select case(Insect%WingShape) + select case(Insect%WingShape(wingID)) case ("pointcloud") call draw_wing_pointcloud(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,& x_pivot_b,rot_rel_wing_w) @@ -29,16 +159,24 @@ subroutine draw_wing(xx0, ddx, mask, mask_color, us, Insect, color_wing, M_body, call draw_wing_twoellipses(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,& M_wing,x_pivot_b,rot_rel_wing_w) case default - ! we assume the default to be defined in fourier coefficients, the subroutine - ! yells if it does not recongnize the wing. - call draw_wing_fourier(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,& + ! if all other options fail, we still might load coefficients from file: + wingshape_str = Insect%WingShape(wingID) + if (index(wingshape_str,"from_file::bristled") /= 0) then + ! wing blade shape is read from ini-file and bristles are hardcoded + call draw_wing_bristled(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,& x_pivot_b,rot_rel_wing_w) + else + ! we assume the default to be defined in fourier coefficients, the subroutine + ! yells if it does not recongnize the wing. + call draw_wing_fourier(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,& + x_pivot_b,rot_rel_wing_w) + end if end select end subroutine draw_wing -!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- ! Draws a wings that is given by a radius(theta), where the radius is given ! by a Fourier series. The Fourier coefficients are stored in the insect ! datastructure, so the function Set_Wing_Fourier_coefficients must be called @@ -56,91 +194,217 @@ subroutine draw_wing_fourier(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_ real(kind=rk),intent(in)::M_body(1:3,1:3),M_wing(1:3,1:3),x_pivot_b(1:3),rot_rel_wing_w(1:3) integer :: ix,iy,iz + integer(kind=2) :: wingID real(kind=rk) :: x_body(1:3),x_wing(1:3),x(1:3) real(kind=rk) :: R, R0, R_tmp, zz0 real(kind=rk) :: y_tmp, x_tmp, z_tmp, s, t real(kind=rk) :: v_tmp(1:3), mask_tmp, theta + !-- wing id number: 1 = left, 2 = right, 3 = 2nd left, 4 = 2nd right + wingID = color_wing-1 + !-- define the wings fourier coeffients, but do that only once - call Setup_Wing_Fourier_coefficients(Insect) + call Setup_Wing_Fourier_coefficients(Insect, wingID) s = Insect%safety - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 - !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) - x_body = matmul(M_body,x) - x_wing = matmul(M_wing,x_body-x_pivot_b) + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2)+dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1)+dble(ix)*ddx(1) - Insect%xc_body_g(1) + + !-- define the various coordinate systems we are going to use + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) + x_wing = matmul(M_wing,x_body-x_pivot_b) + + ! bounding box check: does this point lie within the bounding box? Note Insect%wing_bounding_box + ! is set in SET_WING_BOUNDING_BOX_FOURIER + if ( x_wing(1) >= Insect%wing_bounding_box(1,wingID)-s & + .and. x_wing(1) <= Insect%wing_bounding_box(2,wingID)+s) then + if ( x_wing(2) >= Insect%wing_bounding_box(3,wingID)-s & + .and. x_wing(2) <= Insect%wing_bounding_box(4,wingID)+s) then + if ( x_wing(3) >= Insect%wing_bounding_box(5,wingID)-s & + .and. x_wing(3) <= Insect%wing_bounding_box(6,wingID)+s) then + + !-- get normalized angle (theta) + theta = atan2( x_wing(2)-Insect%yc(wingID), x_wing(1)-Insect%xc(wingID) ) + theta = ( theta + pi ) / (2.d0*pi) + + !-- construct R by evaluating the fourier series + R0 = Radius_Fourier(theta,Insect,wingID) + + !-- get smooth (radial) step function + R = dsqrt ( (x_wing(1)-Insect%xc(wingID))**2 + (x_wing(2)-Insect%yc(wingID))**2 ) + R_tmp = steps(R,R0, Insect%smooth) + + ! wing corrugation (i.e. deviation from a flat plate) + if ( Insect%corrugated ) then + ! if the wing is corrugated, its height profile is read from ini file + ! and interpolated at the position on the wing + zz0 = interp2_nonper( x_wing(1), x_wing(2), corrugation_profile, Insect%corrugation_array_bbox(1:4) ) + else + ! no corrugation - the wing is a flat surface + zz0 = 0.0_pr + endif + + ! wing thickness + if ( Insect%wing_thickness_distribution=="variable") then + ! variable wing thickness is read from an array in the wing.ini file + ! and interpolated linearly at the x_wing position. + t = interp2_nonper( x_wing(1), x_wing(2), wing_thickness_profile, Insect%corrugation_array_bbox(1:4) ) + else + ! constant thickness, read from main params.ini file + t = Insect%WingThickness + endif + + z_tmp = steps( dabs(x_wing(3)-zz0), 0.5d0*t, Insect%smooth ) ! thickness + mask_tmp = z_tmp*R_tmp + + !----------------------------------------- + ! set new value for mask and velocity us + !----------------------------------------- + if ((mask(ix,iy,iz) < mask_tmp).and.(mask_tmp>0.0)) then + mask(ix,iy,iz) = mask_tmp + mask_color(ix,iy,iz) = color_wing + !------------------------------------------------ + ! solid body rotation + ! Attention: the Matrix transpose(M) brings us back to the body + ! coordinate system, not to the inertial frame. this is done in + ! the main routine Draw_Insect + !------------------------------------------------ + v_tmp(1) = rot_rel_wing_w(2)*x_wing(3)-rot_rel_wing_w(3)*x_wing(2) + v_tmp(2) = rot_rel_wing_w(3)*x_wing(1)-rot_rel_wing_w(1)*x_wing(3) + v_tmp(3) = rot_rel_wing_w(1)*x_wing(2)-rot_rel_wing_w(2)*x_wing(1) + ! note we set this only if it is a part of the wing + us(ix,iy,iz,1:3) = matmul(transpose(M_wing), v_tmp) + endif + endif + endif + endif - ! bounding box check: does this point lie within the bounding box? Note Insect%wing_bounding_box - ! is set in SET_WING_BOUNDING_BOX_FOURIER - if ( x_wing(1) >= Insect%wing_bounding_box(1)-s .and. x_wing(1) <= Insect%wing_bounding_box(2)+s) then - if ( x_wing(2) >= Insect%wing_bounding_box(3)-s .and. x_wing(2) <= Insect%wing_bounding_box(4)+s) then - if ( x_wing(3) >= Insect%wing_bounding_box(5)-s .and. x_wing(3) <= Insect%wing_bounding_box(6)+s) then - - !-- get normalized angle (theta) - theta = atan2( x_wing(2)-Insect%yc, x_wing(1)-Insect%xc ) - theta = ( theta + pi ) / (2.d0*pi) - - !-- construct R by evaluating the fourier series - R0 = Radius_Fourier(theta,Insect) - - !-- get smooth (radial) step function - R = dsqrt ( (x_wing(1)-Insect%xc)**2 + (x_wing(2)-Insect%yc)**2 ) - R_tmp = steps(R,R0, Insect%smooth) - - ! wing corrugation (i.e. deviation from a flat plate) - if ( Insect%corrugated ) then - ! if the wing is corrugated, its height profile is read from ini file - ! and interpolated at the position on the wing - zz0 = interp2_nonper( x_wing(1), x_wing(2), corrugation_profile, Insect%corrugation_array_bbox(1:4) ) - else - ! no corrugation - the wing is a flat surface - zz0 = 0.0_pr - endif + enddo + enddo + enddo - ! wing thickness - if ( Insect%wing_thickness_distribution=="variable") then - ! variable wing thickness is read from an array in the wing.ini file - ! and interpolated linearly at the x_wing position. - t = interp2_nonper( x_wing(1), x_wing(2), wing_thickness_profile, Insect%corrugation_array_bbox(1:4) ) - else - ! constant thickness, read from main params.ini file - t = Insect%WingThickness - endif +end subroutine draw_wing_fourier - z_tmp = steps( dabs(x_wing(3)-zz0), 0.5d0*t, Insect%smooth ) ! thickness - mask_tmp = z_tmp*R_tmp - - !----------------------------------------- - ! set new value for mask and velocity us - !----------------------------------------- - if ((mask(ix,iy,iz) < mask_tmp).and.(mask_tmp>0.0)) then - mask(ix,iy,iz) = mask_tmp - mask_color(ix,iy,iz) = color_wing - !------------------------------------------------ - ! solid body rotation - ! Attention: the Matrix transpose(M) brings us back to the body - ! coordinate system, not to the inertial frame. this is done in - ! the main routine Draw_Insect - !------------------------------------------------ - v_tmp(1) = rot_rel_wing_w(2)*x_wing(3)-rot_rel_wing_w(3)*x_wing(2) - v_tmp(2) = rot_rel_wing_w(3)*x_wing(1)-rot_rel_wing_w(1)*x_wing(3) - v_tmp(3) = rot_rel_wing_w(1)*x_wing(2)-rot_rel_wing_w(2)*x_wing(1) - ! note we set this only if it is a part of the wing - us(ix,iy,iz,1:3) = matmul(transpose(M_wing), v_tmp) - endif - endif - endif - endif +!------------------------------------------------------------------------------- +! Draws a membranous central part of a bristled wing, using the same storage spase as +! for a Fourier wing, but the algorithm is different. +subroutine draw_blade_fourier(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,x_pivot_b,rot_rel_wing_w) + implicit none + + type(diptera),intent(inout) :: Insect + real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk),intent(inout) :: mask(0:,0:,0:) + real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) + integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) + integer(kind=2),intent(in) :: color_wing + real(kind=rk),intent(in)::M_body(1:3,1:3),M_wing(1:3,1:3),x_pivot_b(1:3),rot_rel_wing_w(1:3) + + integer :: ix,iy,iz + integer(kind=2) :: wingID + real(kind=rk) :: x_body(1:3),x_wing(1:3),x(1:3) + real(kind=rk) :: R, R0, R_tmp, zz0 + real(kind=rk) :: y_tmp, x_tmp, z_tmp, s, t + real(kind=rk) :: v_tmp(1:3), mask_tmp, theta + real(kind=rk) :: rblade, ylte, xte, xle + + + !-- wing id number: 1 = left, 2 = right, 3 = 2nd left, 4 = 2nd right + wingID = color_wing-1 + + !-- define the wings fourier coeffients, but do that only once + call Setup_Wing_Fourier_coefficients(Insect,wingID) + + !-- reset the bounding box + Insect%wing_bounding_box(1:4,wingID) = (/-1.0d0, 1.0d0, 0.0d0, 1.0d0/) + + !-- blade length + rblade = Insect%yc(wingID) + + s = Insect%safety + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2)+dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1)+dble(ix)*ddx(1) - Insect%xc_body_g(1) + + !-- define the various coordinate systems we are going to use + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) + x_wing = matmul(M_wing,x_body-x_pivot_b) + + ! bounding box check: does this point lie within the bounding box? Note Insect%wing_bounding_box + ! is set in SET_WING_BOUNDING_BOX_FOURIER + if ( x_wing(1) >= Insect%wing_bounding_box(1,wingID)-s & + .and. x_wing(1) <= Insect%wing_bounding_box(2,wingID)+s) then +! if ( x_wing(2) >= Insect%wing_bounding_box(3,wingID)-s .and. x_wing(2) <= Insect%wing_bounding_box(4,wingID)+s) then + if ( x_wing(2) > 0.0d0 .and. x_wing(2) < rblade ) then + if ( x_wing(3) >= Insect%wing_bounding_box(5,wingID)-s & + .and. x_wing(3) <= Insect%wing_bounding_box(6,wingID)+s) then + + !-- calculate the polar parameter (normalized angle) + ylte = x_wing(2) + theta = dacos( 1.0d0 - 2.0d0*ylte/rblade ) + theta = theta / (2.d0*pi) + + !-- construct xle by evaluating the Fourier series + xle = Radius_Fourier(theta,Insect,wingID) + + !-- construct xte by evaluating the Fourier series + xte = Radius_Fourier(1.0d0-theta,Insect,wingID) + + !-- amplitude + R0 = 0.5*(xle-xte) + + !-- get smooth rectangular function + R = dabs ( x_wing(1) - 0.5*(xte+xle) ) + R_tmp = steps(R,R0, Insect%smooth) + + ! wing corrugation (i.e. deviation from a flat plate) + if ( Insect%corrugated ) then + ! if the wing is corrugated, its height profile is read from ini file + ! and interpolated at the position on the wing + zz0 = interp2_nonper( x_wing(1), x_wing(2), corrugation_profile, Insect%corrugation_array_bbox(1:4) ) + else + ! no corrugation - the wing is a flat surface + zz0 = 0.0_pr + endif + + ! wing thickness + if ( Insect%wing_thickness_distribution=="variable") then + ! variable wing thickness is read from an array in the wing.ini file + ! and interpolated linearly at the x_wing position. + t = interp2_nonper( x_wing(1), x_wing(2), wing_thickness_profile, Insect%corrugation_array_bbox(1:4) ) + else + ! constant thickness, read from main params.ini file + t = Insect%WingThickness + endif + + z_tmp = steps( dabs(x_wing(3)-zz0), 0.5d0*t, Insect%smooth ) ! thickness + mask_tmp = z_tmp*R_tmp + + !----------------------------------------- + ! set new value for mask and velocity us + !----------------------------------------- + if ((mask(ix,iy,iz) < mask_tmp).and.(mask_tmp>0.0)) then + mask(ix,iy,iz) = mask_tmp + mask_color(ix,iy,iz) = color_wing + endif + endif + endif + endif + + enddo enddo - enddo enddo -end subroutine draw_wing_fourier +end subroutine draw_blade_fourier !------------------------------------------------------------------------------- @@ -219,12 +483,16 @@ subroutine draw_wing_pointcloud(xx0, ddx, mask, mask_color, us,Insect,color_wing !----------------------------------------------------------------------------- dxinv = 1.0d0 / ddx(1) - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) x_wing = matmul(M_wing,x_body-x_pivot_b) @@ -274,14 +542,17 @@ subroutine draw_wing_pointcloud(xx0, ddx, mask, mask_color, us,Insect,color_wing ! ---------------------------------------------------------------------------- ! add velocity field, inside the wing. ! ---------------------------------------------------------------------------- - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + ! if this point belong to the wing we just created if (mask_color(ix,iy,iz)==color_wing) then !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) x_wing = matmul(M_wing, matmul(M_body,x)-x_pivot_b) !------------------------------------------------ @@ -309,7 +580,6 @@ end subroutine draw_wing_pointcloud ! This wing has finite thickness. !------------------------------------------------------------------------------- subroutine draw_wing_suzuki(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,x_pivot_b,rot_rel_wing_w) - implicit none type(diptera),intent(inout) :: Insect @@ -334,12 +604,16 @@ subroutine draw_wing_suzuki(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_b y_right = 1.0d0 y_left = 0.1667d0 - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) x_wing = matmul(M_wing,x_body-x_pivot_b) @@ -392,7 +666,6 @@ subroutine draw_wing_suzuki(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_b endif enddo enddo - enddo end subroutine draw_wing_suzuki @@ -416,12 +689,16 @@ subroutine draw_wing_rectangular(xx0, ddx, mask, mask_color, us,Insect,color_win real(kind=rk) :: v_tmp(1:3), mask_tmp, theta,x_top,x_bot - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x - Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) x_wing = matmul(M_wing,x_body-x_pivot_b) @@ -508,12 +785,16 @@ subroutine draw_wing_twoellipses(xx0, ddx, mask, mask_color, us,Insect,color_win a_body = 0.5d0 * Insect%L_span - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x-Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) x_wing = matmul(M_wing,x_body-x_pivot_b) @@ -603,12 +884,16 @@ subroutine draw_wing_mosquito(xx0, ddx, mask, mask_color, us,Insect,color_wing,M Insect%b_top = 0.1474d0 Insect%b_bot = 0.1474d0 - do iz = 0, size(mask,3)-1 - do iy = 0, size(mask,2)-1 - do ix = 0, size(mask,1)-1 + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2) + dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1) + dble(ix)*ddx(1) - Insect%xc_body_g(1) + !-- define the various coordinate systems we are going to use - x = (/ xx0(1)+dble(ix)*ddx(1), xx0(2)+dble(iy)*ddx(2), xx0(3)+dble(iz)*ddx(3) /) - x = periodize_coordinate(x-Insect%xc_body_g, (/xl,yl,zl/)) + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) x_wing = matmul(M_wing,x_body-x_pivot_b) @@ -673,63 +958,183 @@ subroutine draw_wing_mosquito(xx0, ddx, mask, mask_color, us,Insect,color_wing,M end subroutine draw_wing_mosquito +!------------------------------------------------------------------------------- +! Bristled wing of Paratuposa, data from Moscow University entomology lab +!------------------------------------------------------------------------------- +subroutine draw_wing_bristled(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,x_pivot_b,rot_rel_wing_w) + implicit none + + type(diptera),intent(inout) :: Insect + real(kind=rk),intent(in) :: xx0(1:3), ddx(1:3) + real(kind=rk),intent(inout) :: mask(0:,0:,0:) + real(kind=rk),intent(inout) :: us(0:,0:,0:,1:) + integer(kind=2),intent(inout) :: mask_color(0:,0:,0:) + integer(kind=2),intent(in) :: color_wing + real(kind=rk),intent(in)::M_body(1:3,1:3),M_wing(1:3,1:3),x_pivot_b(1:3),rot_rel_wing_w(1:3) + + integer :: ix,iy,iz,j,nbr + integer(kind=2) :: wingID + real(kind=rk) :: x_body(1:3),x_wing(1:3),x(1:3),xa(1:3),xb(1:3) + real(kind=rk) :: s + real(kind=rk) :: x_tip(1:48),xbr_root(1:48),ybr_root(1:48),xbr_tip(1:48),ybr_tip(1:48),rbr(1:48) + real(kind=rk) :: v_tmp(1:3) + + !-- wing id number: 1 = left, 2 = right, 3 = 2nd left, 4 = 2nd right + wingID = color_wing-1 + + ! Draw the membranous blade using Fourier series + call draw_blade_fourier(xx0, ddx, mask, mask_color, us,Insect,color_wing,M_body,M_wing,& + x_pivot_b,rot_rel_wing_w) + + ! Draw the bristles + ! Number of bristles + nbr = 48 + ! Bristle tips + ybr_tip = (/0.445714,0.463449,0.49588,0.479234,0.494364,0.556659,0.626631,0.698393,0.760178,0.816677,0.85612, & + 0.892038,0.930911,0.962722,0.982195,0.989307,0.99465,0.999988,0.995924,0.985978,0.972488,0.954898, & + 0.936123,0.914396,0.892084,0.871532,0.850387,0.808662,0.769876,0.732849,0.674625,0.617548,0.662877, & + 0.634677,0.587077,0.504768,0.4436,0.380074,0.311247,0.259466,0.217655,0.197554,0.260187,0.236062, & + 0.212523,0.188398,0.168389,0.148376/) + xbr_tip = (/0.141788,0.06678,0.000581,0.150033,0.288972,0.338283,0.361812,0.363654,0.346142,0.322175,0.295844, & + 0.265406,0.222661,0.183426,0.13128,0.086153,0.044542,0.00762,-0.038106,-0.084424,-0.117852,-0.165938, & + -0.206991,-0.239256,-0.273866,-0.30437,-0.331359,-0.365405,-0.396517,-0.423524,-0.432971,-0.417798, & + -0.447639,-0.47698,-0.516895,-0.554507,-0.561026,-0.564031,-0.560595,-0.546588,-0.506778,-0.421221, & + -0.159718,-0.153299,-0.14512,-0.138701,-0.130518,-0.11999/) + ! Bristle roots + ybr_root = (/0.245961,0.275969,0.307151,0.553556,0.572956,0.59412,0.614697,0.634098,0.651735,0.66937,0.682306, & + 0.694063,0.70250,0.711118,0.711121,0.70701,0.697018,0.687025,0.675857,0.664099,0.651754,0.639998, & + 0.627068,0.617075,0.604732,0.592388,0.582396,0.568287,0.555942,0.541834,0.528309,0.514787,0.439526, & + 0.426,0.414239,0.397773,0.384247,0.369543,0.355426,0.338368,0.318955,0.296013,0.271301,0.247763, & + 0.225406,0.20599,0.190102,0.17539/) + xbr_root = (/-0.067707,-0.07412,-0.078773,-0.02397,-0.014569,-0.003993,0.00541,0.014811,0.023624,0.03361,0.038314, & + 0.04419,0.046000,0.047726,0.045382,0.039515,0.03247,0.026596,0.019549,0.013674,0.007212,0.000164, & + -0.00923,-0.01569,-0.02391,-0.031545,-0.038591,-0.045641,-0.052103,-0.060326,-0.063859,-0.070323, & + -0.097961,-0.100907,-0.103852,-0.107975,-0.110921,-0.112111,-0.1133,-0.113906,-0.112756,-0.111611, & + -0.106364,-0.099358,-0.095867,-0.091787,-0.087116,-0.081858/) + ! Bristle radius + rbr(:) = 0.00194d0 + + ! Loop for all bristles + do j = 1,nbr + ! transform coordinates to global system. they are defined in the wing system + x_wing = (/xbr_root(j),ybr_root(j),0.0d0/) + x_body = matmul( transpose(M_wing), x_wing ) + x_pivot_b + xa = matmul( transpose(M_body), x_body ) + Insect%xc_body_g + + x_wing = (/xbr_tip(j),ybr_tip(j),0.0d0/) + x_body = matmul( transpose(M_wing), x_wing ) + x_pivot_b + xb = matmul( transpose(M_body), x_body ) + Insect%xc_body_g + + ! note input to draw_cylinder_new is in global coordinates + call draw_cylinder_new( xa, xb, rbr(j), xx0, ddx, mask, mask_color, us, Insect, color_wing) + enddo + + ! Set the solid velocity + s = Insect%safety + do iz = g, size(mask,3)-1-g + x(3) = xx0(3) + dble(iz)*ddx(3) - Insect%xc_body_g(3) + do iy = g, size(mask,2)-1-g + x(2) = xx0(2)+dble(iy)*ddx(2) - Insect%xc_body_g(2) + do ix = g, size(mask,1)-1-g + x(1) = xx0(1)+dble(ix)*ddx(1) - Insect%xc_body_g(1) + + !-- define the various coordinate systems we are going to use + if (periodic_insect) x = periodize_coordinate(x, (/xl,yl,zl/)) + x_body = matmul(M_body,x) + x_wing = matmul(M_wing,x_body-x_pivot_b) + + ! bounding box check: does this point lie within the bounding box? Note Insect%wing_bounding_box + ! is set in SET_WING_BOUNDING_BOX_FOURIER + if ( x_wing(1) >= Insect%wing_bounding_box(1,wingID)-s & + .and. x_wing(1) <= Insect%wing_bounding_box(2,wingID)+s) then + if ( x_wing(2) >= Insect%wing_bounding_box(3,wingID)-s & + .and. x_wing(2) <= Insect%wing_bounding_box(4,wingID)+s) then + if ( x_wing(3) >= Insect%wing_bounding_box(5,wingID)-s & + .and. x_wing(3) <= Insect%wing_bounding_box(6,wingID)+s) then + !----------------------------------------- + ! set new value for solid velocity us + !----------------------------------------- + if ( (mask(ix,iy,iz)>0.0).and.(mask_color(ix,iy,iz)==color_wing) ) then + !------------------------------------------------ + ! solid body rotation + ! Attention: the Matrix transpose(M) brings us back to the body + ! coordinate system, not to the inertial frame. this is done in + ! the main routine Draw_Insect + !------------------------------------------------ + v_tmp(1) = rot_rel_wing_w(2)*x_wing(3)-rot_rel_wing_w(3)*x_wing(2) + v_tmp(2) = rot_rel_wing_w(3)*x_wing(1)-rot_rel_wing_w(1)*x_wing(3) + v_tmp(3) = rot_rel_wing_w(1)*x_wing(2)-rot_rel_wing_w(2)*x_wing(1) + ! note we set this only if it is a part of the wing + us(ix,iy,iz,1:3) = matmul(transpose(M_wing), v_tmp) + endif + endif + endif + endif + + enddo + enddo + enddo + +end subroutine draw_wing_bristled + !------------------------------------------------------------------------------- ! evaluates the fourier series given in the ai, bi ! NOTE: angle theta is NORMALIZED! theta = ( theta + pi ) / (2.d0*pi) !------------------------------------------------------------------------------- -real(kind=rk) function Radius_Fourier(theta,Insect) +real(kind=rk) function Radius_Fourier( theta, Insect, wingID ) implicit none integer :: i,j, n_radius real(kind=rk) :: R0, theta2, dphi, area type(diptera),intent(inout)::Insect real(kind=rk), intent(in) :: theta + integer(kind=2), intent(in) :: wingID ! wing id number n_radius = 25000 dphi = (2.d0*pi) / (dble(n_radius-1)) - ! evaluate the entire R(theta) once with very fine resolution, so when ! calling it for the second time we only need linear interpolation. - if (.not.Insect%wings_radius_table_ready) then + if (.not.Insect%wings_radius_table_ready(wingID)) then !--------------------------------------------------------------------------- ! fill radius table !--------------------------------------------------------------------------- - Insect%R0_table = 0.d0 + Insect%R0_table(:,wingID) = 0.d0 ! loop over all thetas and compute the radius for all of them, store it ! in the table Insect%R0_table do j = 1, n_radius - R0 = Insect%a0_wings / 2.d0 + R0 = Insect%a0_wings(wingID) / 2.d0 theta2 = dble(j-1) * dphi ! evaluate Fourier series - do i = 1, Insect%nfft_wings - R0 = R0 + Insect%ai_wings(i)*dcos(2.d0*pi*dble(i)*theta2) & - + Insect%bi_wings(i)*dsin(2.d0*pi*dble(i)*theta2) + do i = 1, Insect%nfft_wings(wingID) + R0 = R0 + Insect%ai_wings(i,wingID)*dcos(2.d0*pi*dble(i)*theta2) & + + Insect%bi_wings(i,wingID)*dsin(2.d0*pi*dble(i)*theta2) enddo - Insect%R0_table(j)=R0 + Insect%R0_table(j,wingID)=R0 enddo ! skip setup on next call - Insect%wings_radius_table_ready = .true. + Insect%wings_radius_table_ready(wingID) = .true. endif ! linear interpolation, if already stored the radius j = floor( theta / dphi ) + 1 - Radius_Fourier = Insect%R0_table(j) + ((theta-dble(j-1)*dphi) / dphi) & - * (Insect%R0_table(j+1)-Insect%R0_table(j)) + Radius_Fourier = Insect%R0_table(j,wingID) + ((theta-dble(j-1)*dphi) / dphi) & + * (Insect%R0_table(j+1,wingID)-Insect%R0_table(j,wingID)) end function !--------------------------------------------------------------------------- -! compute wing surface for Fourier wings +! compute wing surface area for Fourier wings !--------------------------------------------------------------------------- ! from the Fourier series, we can directly compute the wing Area (surface) ! the aera is the double integral A = \int(0,2pi) \int(0,R(theta)) r dr dtheta -subroutine compute_wing_surface(Insect, area) +subroutine compute_wing_surface( Insect, wingID, area ) implicit none type(diptera),intent(inout) :: Insect real(kind=rk),intent(out) :: area + integer(kind=2), intent(in) :: wingID ! wing id number real(kind=rk) :: dr, dtheta, r real(kind=rk) :: R0, theta @@ -744,10 +1149,10 @@ subroutine compute_wing_surface(Insect, area) ! this method currently works only for Fourier wings (i.e. the shape is described ! as Fourier coefficients). We return zero for non-Fourier wings. - if ( Insect%nfft_wings /= 0 ) then + if ( Insect%nfft_wings(wingID) /= 0 ) then ! solve the double integral do while ( theta < 2.d0*pi ) - R0 = Radius_Fourier(theta,Insect) + R0 = Radius_Fourier(theta,Insect,wingID) r = 0.d0 do while (r < R0) area = area + r*dtheta*dr @@ -769,49 +1174,54 @@ subroutine compute_wing_surface(Insect, area) ! stops the code. This prevents errors for wings that are NOT given by Fourier ! series. !------------------------------------------------------------------------------- -subroutine Setup_Wing_Fourier_coefficients(Insect) +subroutine Setup_Wing_Fourier_coefficients(Insect,wingID) implicit none real(kind=rk) :: xroot, yroot type(diptera),intent(inout)::Insect + integer(kind=2), intent(in) :: wingID ! wing id number + character(len=strlen) :: wingshape_str - if (Insect%wingsetup_done) then + if (Insect%wingsetup_done(wingID)) then ! the second call is just a return statement return endif - Insect%ai_wings = 0.d0 - Insect%bi_wings = 0.d0 + Insect%a0_wings(wingID) = 0.d0 + Insect%ai_wings(:,wingID) = 0.d0 + Insect%bi_wings(:,wingID) = 0.d0 !----------------------------------------- ! hard-coded Fourier coefficients for R(theta) !----------------------------------------- - select case (Insect%WingShape) + select case (Insect%WingShape(wingID)) case ('pieris-brassicae1') ! butterfly (p. brassicae) wingshape, extracted from frame #633 of flight ! recording "160909_flight38" ! we have 29 points on the wing - Insect%nfft_wings = 30 - Insect%a0_wings = 0.8262378 - Insect%ai_wings(1:Insect%nfft_wings) = (/0.0333388,0.0088668,0.0910448,0.0051568,-0.0252108,-0.0125628,& + Insect%nfft_wings(wingID) = 30 + Insect%a0_wings(wingID) = 0.8262378 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0333388,0.0088668,0.0910448,0.0051568,-0.0252108,-0.0125628,& -0.0080008,-0.0054058,0.0110598,0.0090758,-0.0076998,-0.0071098,& 0.0018768,0.0003048,0.0033128,0.0049088,-0.0021308,-0.0051658,& -0.0003278,0.0022188,0.0015628,0.0008548,-0.0009428,-0.0027778,& -0.0005728,0.0021988,0.0010718,-0.0007128,-0.0010658,-0.0008818 /) - Insect%bi_wings(1:Insect%nfft_wings) = (/-0.0974478,0.0697448,0.0277868,-0.0461138,-0.0059608,0.0080508,& + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/-0.0974478,0.0697448,0.0277868,-0.0461138,-0.0059608,0.0080508,& -0.0059118,0.0113048,0.0038478,-0.0157198,-0.0070308,0.0034218,& 0.0030868,0.0040238,0.0017568,-0.0027368,-0.0050618,-0.0008578,& 0.0033778,0.0009348,-0.0012898,-0.0011198,-0.0016878,0.0000398,& 0.0029238,0.0009108,-0.0020888,-0.0012848,-0.0003728,0.0004738 /) - Insect%yc = 0.3184928 - Insect%xc = -0.2459908 + Insect%yc(wingID) = 0.3184928 + Insect%xc(wingID) = -0.2459908 case ('drosophila') !******************************************** ! Drosophila wing from Jan Gruber's png file !******************************************** - Insect%nfft_wings = 40 - Insect%a0_wings = 0.5140278 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 40 + Insect%a0_wings(wingID) = 0.5140278 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.1276258,-0.1189758,-0.0389458,0.0525938,0.0151538,-0.0247938,& -0.0039188,0.0104848,-0.0030638,-0.0064578,0.0042208,0.0043248,& -0.0026878,-0.0021458,0.0017688,0.0006398,-0.0013538,-0.0002038,& @@ -819,7 +1229,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 0.0003358,0.0001408,-0.0002208,0.0000028,0.0004348,0.0001218,& -0.0006458,-0.0003498,0.0007168,0.0003288,-0.0007078,-0.0001368,& 0.0007828,0.0001458,-0.0007078,-0.0001358/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.1072518,-0.0449318,0.0296558,0.0265668,-0.0043988,-0.0113218,& -0.0003278,0.0075028,0.0013598,-0.0057338,-0.0021228,0.0036178,& 0.0013328,-0.0024128,-0.0007688,0.0011478,0.0003158,-0.0005528,& @@ -832,15 +1242,15 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) xroot =+0.1122 yroot =-0.0157 ! center of circle - Insect%xc =-0.1206 + xroot - Insect%yc = 0.3619 + yroot + Insect%xc(wingID) =-0.1206 + xroot + Insect%yc(wingID) = 0.3619 + yroot case ('drosophila_mutated') !******************************************** ! mutated Drosophila wing from Jan Gruber's png file !******************************************** - Insect%nfft_wings = 70 - Insect%a0_wings = 0.4812548 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 70 + Insect%a0_wings(wingID) = 0.4812548 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.1593968, -0.1056828, -0.0551518, 0.0508748, 0.0244538, -0.0264738,& -0.0080828, 0.0181228, 0.0023648, -0.0134578, -0.0037068, 0.0064508,& 0.0028748, -0.0014258, -0.0006028, -0.0008898, -0.0020408, 0.0009218,& @@ -854,7 +1264,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 0.0001838, 0.0003768, -0.0001698, -0.0002148, 0.0001318, 0.0001628,& -0.0000878, 0.0000068, 0.0001478, -0.0001128/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.1132588, -0.0556428, 0.0272098, 0.0221478, -0.0063798, -0.0059078,& 0.0043788, 0.0043208, -0.0003308, -0.0026598, -0.0013158, 0.0025178,& 0.0022438, -0.0023798, -0.0037048, 0.0001528, 0.0031218, 0.0022248,& @@ -872,34 +1282,34 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) xroot =+0.1122 yroot =-0.0157 ! center of circle - Insect%xc =-0.1206 + xroot - Insect%yc = 0.3619 + yroot + Insect%xc(wingID) =-0.1206 + xroot + Insect%yc(wingID) = 0.3619 + yroot case ('drosophila_sandberg') !******************************************** ! Drosophila wing from Ramamurti & Sandberg ( JEB 210, 881-896, 2007) !******************************************** - Insect%nfft_wings = 24 - Insect%a0_wings = 0.4995578 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 24 + Insect%a0_wings(wingID) = 0.4995578 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.0164168,-0.1621518,0.0030938,0.0601108,-0.0083988,-0.0199988,& 0.0049048,0.0047878,-0.0005648,-0.0001108,-0.0008638,-0.0006928,& 0.0006608,0.0001978,0.0001558,0.0006878,-0.0007498,-0.0008018,& 0.0003878,0.0007028,0.0000408,-0.0001108,-0.0001068,-0.0003958 & /) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.2083518,-0.0106488,0.0878308,-0.0018168,-0.0338278,0.0045768,& 0.0113778,-0.0020678,-0.0026928,0.0002758,-0.0000838,-0.0001298,& 0.0004118,0.0005638,-0.0001018,-0.0006918,-0.0002268,0.0005238,& 0.0004008,-0.0001818,-0.0003038,-0.0000068,-0.0001218,0.0002008 & /) - Insect%xc =-0.0235498 - Insect%yc = 0.1531398 + Insect%xc(wingID) =-0.0235498 + Insect%yc(wingID) = 0.1531398 case ('drosophila_maeda') !******************************************** ! Drosophila wing from Maeda and Liu, similar to Liu and Aono, BB2009 !******************************************** - Insect%nfft_wings = 25 - !Insect%a0_wings = 0.591294836514357 + Insect%nfft_wings(wingID) = 25 + !Insect%a0_wings(wingID) = 0.591294836514357 !ai = (/0.11389995408864588, -0.08814321795213981, -0.03495210456149335,& !0.024972085605453047, 0.009422293191002384, -0.01680813499169695,& !-0.006006435254421029, 0.012157932943676907, 0.00492283934032996,& @@ -918,8 +1328,8 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) !-8.658653756413232E-4, -0.002153349816945423, 3.317570161883452E-4,& !0.001573518502682025, 2.14583094242007E-4, -0.0011299834277813852,& !-5.172854674801216E-4/) - Insect%a0_wings = 0.585432698694358 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%a0_wings(wingID) = 0.585432698694358 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.113400475583443, -0.0862823485047213, -0.0346234482214816,& 0.0237625254732323,0.00902498439287132,-0.0158926757445186,& -0.00549384372979449,0.0114928668063701,0.00431222381497978,& @@ -929,7 +1339,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) -0.00191680264797099,0.00144768631289857,0.00135580122365068,& -0.000579638217642394,-0.000818378434108882,0.000132570375969864,& 0.000683325977327827/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.0939265226506824,0.0486063180327962,-0.0206591129298861,& -0.0136085709392758,0.0118575265347540,0.00604510770670991,& -0.0110263907282936,-0.00636979352727611,0.00786779216718321,& @@ -940,19 +1350,19 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 0.00114016779684690,-2.63209684213992e-05,-0.000753899380930065,& -0.000294894042986087/) - !Insect%xc = 0.0 ! original mesh - Insect%xc = 0.0473 ! shifted towards t.e. to 1/4 of the root chord ("+" sign here) - !Insect%xc = -0.0728 ! shifted towards l.e., to 0.2cmean from the l.e. (Liu and Aono BB 2009) - !Insect%yc = 0.7 - !Insect%yc = 0.712 ! measured using kinematics snapshots - Insect%yc = 0.702 ! According to Maeda's email, Jun 21, 2014 + !Insect%xc(wingID) = 0.0 ! original mesh + Insect%xc(wingID) = 0.0473 ! shifted towards t.e. to 1/4 of the root chord ("+" sign here) + !Insect%xc(wingID) = -0.0728 ! shifted towards l.e., to 0.2cmean from the l.e. (Liu and Aono BB 2009) + !Insect%yc(wingID) = 0.7 + !Insect%yc(wingID) = 0.712 ! measured using kinematics snapshots + Insect%yc(wingID) = 0.702 ! According to Maeda's email, Jun 21, 2014 case ('drosophila_sun') !******************************************** ! Drosophila virilis wing from Chen and Sun, Acta Mech Sin 2014 !******************************************** - Insect%nfft_wings = 25 - Insect%a0_wings = 0.5427789795180327 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 25 + Insect%a0_wings(wingID) = 0.5427789795180327 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.10879717599747996, -0.11445383382313232, -0.02023898255134523,& 0.04903268079573884, 0.0012813019346402, -0.02397317767942499,& 0.0013575396713610029, 0.0108149787395804, -0.001514114743464855,& @@ -962,7 +1372,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 6.563502263270568E-4, 2.0750829321817808E-4, -4.807960800434886E-4,& -2.9006261005712504E-4, 2.7578746591965946E-4, 2.7519915193569374E-4,& -3.0570604954113513E-4/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.09385487982296374, -0.010821846776797858, 0.030052970821579587,& 0.005312859230387492, -0.006054695188204192, -0.0015421303479118118,& -0.002533264559802815, -0.0014806147599133366, 0.003640199794653037,& @@ -972,16 +1382,16 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) -1.5949800516545527E-5, 5.001276053841919E-4, 8.445613796483002E-5,& -5.510759077970704E-4, -3.3722093938416713E-4, 3.524656540450335E-4,& 2.9924999100355387E-4/) - Insect%xc = 0.0 - Insect%yc = 0.399446382250523 + Insect%xc(wingID) = 0.0 + Insect%yc(wingID) = 0.399446382250523 case ('bumblebee') !******************************************** ! Bumblebee ! http://www.entomology.umn.edu/museum/links/coursefiles/JPEG%20images/Hymenoptera%20web%20jpeg/Bombus-wings.jpg !******************************************** - Insect%nfft_wings = 25 - Insect%a0_wings = 0.594557593733011d0 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 25 + Insect%a0_wings(wingID) = 0.594557593733011d0 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0128037920989526d0,-0.106777418654552d0,0.0380851289321982d0,& 0.0330548081081197d0,-0.0178496286355627d0,-0.00328588543359649d0,& 0.0108246924336137d0,-0.00489302388329943d0,-0.00708808441172961d0,& @@ -991,7 +1401,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 9.01456938813568d-05,0.00150639712261487d0,0.000914624010720407d0,& -0.000737650894315551d0,-0.000843849923321745d0,-0.000354971670482499d0,& -0.000382956472432449d0/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0158061138788171d0,0.0308243584184200d0,-0.00903330410923372d0,& -0.0185758334697500d0,-0.000924452934252486d0,-0.00242101213359519d0,& -0.00204549530064489d0,0.00291468131401423d0,-0.000140755032337495d0,& @@ -1001,17 +1411,17 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) -0.000559835622451578d0,-0.000617498559228280d0,0.00115413452523474d0,& 0.000322564770099778d0,-0.000917375185844477d0,4.44819399488798d-05,& 0.000710028654602170d0/) - Insect%xc = -0.1d0 - Insect%yc = 0.501549263807117d0 + Insect%xc(wingID) = -0.1d0 + Insect%yc(wingID) = 0.501549263807117d0 case ('b_ignitus') !******************************************** ! Bumblebee B. ignitus ! Digitized from images taken at Liu Lab !******************************************** - Insect%nfft_wings = 25 - Insect%a0_wings = 0.536472532931637d0 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 25 + Insect%a0_wings(wingID) = 0.536472532931637d0 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0447167394708177d0,-0.106357727795917d0,0.0504418160417239d0,& 0.0217275689429364d0,-0.0259085955164794d0,0.00272535910748833d0,& 0.00925289824790763d0,-0.00453010629382665d0,-0.000726647749565597d0,& @@ -1021,7 +1431,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) -6.70598716926467d-05,0.000166365788794039d0,0.000332993591840758d0,& -0.000225912231239784d0,-0.000554023819155716d0,0.000352735383706648d0,& 0.000650085631908143d0/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0580660125663764d0,0.0271775529659247d0,0.0178916506228727d0,& -0.0196983386855655d0,-0.00865040473524334d0,0.0112078637630294d0,& 0.00505882127179290d0,-0.00516874871678530d0,-0.000418585234573997d0,& @@ -1031,17 +1441,67 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 0.000310638954298390d0,-0.000523512353114016d0,-0.000773372382092419d0,& 1.97258594500968d-05,0.000261943571939630d0,0.000262003935722642d0,& 0.000278542046262820d0/) - Insect%xc = -0.13d0 - Insect%yc = 0.434820393790595d0 + Insect%xc(wingID) = -0.13d0 + Insect%yc(wingID) = 0.434820393790595d0 + + case ('paratuposa_flatwing') + !******************************************** + ! Paratuposa wing simplified as a flat plate + ! Digitized from 3D model, Moscow University entomology lab + !******************************************** + Insect%nfft_wings(wingID) = 15 + Insect%a0_wings(wingID) = 0.694542662069373d0 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/-0.134736163793655d0,0.00530251847896251d0,-0.0345113221312334d0,& + 0.00564308389276391d0,-0.0151286715792430d0,0.00702004741152472d0,& + 0.00144649560886655d0,-0.00185566405410384d0,-0.00275905041561011d0,& + 0.00217239130911607d0,-0.00106500370428430d0,-0.000750733476326611d0,& + 0.00280149738648434d0,-0.00182306390466332d0,-0.000432849087666278d0/) + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0931417992571149d0,0.0598684008118805d0,-0.0297533040215975d0,& + 0.00720759394160553d0,-0.00591704536021243d0,-0.0103773128578859d0,& + 0.00480389428474622d0,-0.000497969127742664d0,-0.000267837077569406d0,& + -0.00102010912896721d0,0.00218717420988224d0,-0.00290492852428728d0,& + 0.000860757518054172d0,0.00147755983849289d0,-0.000638118479966807d0/) + Insect%xc(wingID) = -0.3d0 + Insect%yc(wingID) = 0.7d0 + + case ('paratuposa_flatelytra') + !******************************************** + ! Paratuposa elytra simplified as a flat plate + ! Digitized from 3D model, Moscow University entomology lab + !******************************************** + Insect%nfft_wings(wingID) = 21 + Insect%a0_wings(wingID) = 0.565146320110115d0 * 0.62d0 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0977588377084158d0,-0.134895186363991d0,-0.0415626398480136d0,& + 0.0462811349514129d0,0.0116178197112501d0,-0.0173654394721538d0,& + -0.00143307308642128d0,0.00463364466230196d0,-0.00245823642621685d0,& + -0.000295909979786882d0,0.00293439703102658d0,-0.000757888513431659d0,& + -0.00232308360478113d0,0.000590866168893430d0,0.00134477744241136d0,& + -0.000179797491049942d0,-0.000579366975013497d0,0.000298632558506859d0,& + 0.000121897474918553d0,-0.000129056828603867d0,6.65231631883479d-5/) & + * 0.62d0 + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0873846736908491d0,0.0261657542571480d0,-0.0361196299337545d0,& + -0.0169805639649468d0,0.0120703518387247d0,0.00786957912240014d0,& + -0.00255959633597845d0,-0.00262639690803298d0,-0.000425744504894171d0,& + -0.000897607832134308d0,0.00110940805947636d0,0.00119153774474213d0,& + -0.00114698647381269d0,-0.000899734725370745d0,0.000630784528183092d0,& + 0.000278761021018954d0,-0.000290963412817785d0,6.98199270677237d-5,& + 0.000195892295619984d0,-0.000190195259814270d0,-4.82888469073568d-5/) & + * 0.62d0 + Insect%xc(wingID) = -0.02d0 * 0.62d0 + Insect%yc(wingID) = 0.65d0 * 0.62d0 case ('flapper_sane') !******************************************** ! Mechanical model from Sane and Dickinson, JEB 205, 2002 ! 'The aerodynamic effects...' !******************************************** - Insect%nfft_wings = 25 - Insect%a0_wings = 0.5379588906565078 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 25 + Insect%a0_wings(wingID) = 0.5379588906565078 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.135338653455782,-0.06793162622123261,-0.0398235167675977,& 0.006442194893963269,0.0012783260416583853,-0.007014398516674715,& 0.0017710765408983137,0.006401601802033519,-2.970619204124993E-4,& @@ -1051,7 +1511,7 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) 2.72834004831554E-4,2.8152492682871664E-5,-1.2802199282558645E-4,& 4.117887216124469E-4,3.364169982438278E-4,-3.33258003686823E-4,& -3.5615733035757616E-4/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/2.686408368800394E-4,0.01649582345310688,0.01288513083639708,& 0.004711436946785864,-0.0035725088809005073,-0.00898640397179334,& -0.003856509905612652,0.004536524572892801,0.004849677692836578,& @@ -1061,27 +1521,27 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) -3.108879176661735E-4,2.2437540206568518E-4,-2.578427217327782E-4,& -2.5120263516966855E-4,4.1693453021778877E-4,3.9290173948150096E-4,& -1.9762601237675826E-4/) - Insect%xc = 0.0 - Insect%yc = 0.6 + Insect%xc(wingID) = 0.0 + Insect%yc(wingID) = 0.6 case ('flapper_dickinsonII') !******************************************** ! Digitized from Dickinson et al 1999 Science, figure 1A, drawing ! of the mechanical robot !******************************************** - Insect%nfft_wings = 20 - Insect%a0_wings = 0.6442788 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 20 + Insect%a0_wings(wingID) = 0.6442788 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/0.0482978,-0.1208378,0.0061008,0.0356718,-0.0148328,-0.0109958,& 0.0110268,0.0018538,-0.0061998,0.0015458,0.0025508,-0.0017538,& -0.0002578,0.0015018,-0.0003158,-0.0006048,0.0007168,-0.0001568,& -0.0005018,0.0004118/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0521708,0.0051828,0.0369428,-0.0002868,-0.0177448,0.0023218,& 0.0081378,-0.0036288,-0.0038168,0.0031348,0.0011858,-0.0023828,& -0.0001638,0.0016098,-0.0004768,-0.0007188,0.0007228,0.0002278,& -0.0005798,0.0001228/) - Insect%yc = 0.5282438 - Insect%xc = -0.1184548 + Insect%yc(wingID) = 0.5282438 + Insect%xc(wingID) = -0.1184548 case ('robofly_dickinson') !******************************************** @@ -1089,65 +1549,70 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) ! contained the exact location of the pivot point. He also sent a CAD drawing ! which looks slightly different, and had no pivot point marked. !******************************************** - Insect%nfft_wings = 28 - Insect%a0_wings = 0.5313628 - Insect%ai_wings(1:Insect%nfft_wings) = & + Insect%nfft_wings(wingID) = 28 + Insect%a0_wings(wingID) = 0.5313628 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0245658,-0.0842918,0.0218028,0.0105418,-0.0095288,0.0012928,& 0.0021928,0.0000328,-0.0007648,-0.0015808,0.0013808,0.0013068,& -0.0010748,0.0002408,-0.0000378,-0.0010888,0.0008248,0.0004708,& -0.0003988,0.0002658,-0.0003178,-0.0004218,0.0002768,0.0000818,& 0.0000318,0.0001228,-0.0001918,-0.0000558/) - Insect%bi_wings(1:Insect%nfft_wings) = & + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & (/-0.0905448,0.0278058,0.0392558,-0.0125248,-0.0159598,0.0048268,& 0.0038898,-0.0028828,0.0012618,0.0012998,-0.0019058,0.0003118,& 0.0003198,-0.0004298,0.0006388,-0.0000648,-0.0002308,0.0002518,& -0.0003948,0.0000928,0.0004478,-0.0003078,-0.0000888,0.0001638,& -0.0002348,0.0001398,0.0001398,-0.0002358/) - Insect%yc = 0.4645238 - Insect%xc = -0.0716018 + Insect%yc(wingID) = 0.4645238 + Insect%xc(wingID) = -0.0716018 case ('hawkmoth1') ! this wingshape is digitized from figure 1 from Kim et al. "Hovering and forward flight of the hawkmoth ! M. sexta: trim search and 6DOF dynamic stability characterization (Bioinspir Biomim. 10 (2015) 056012)" ! its area is about 0.30, which is lower than most references found. in their paper, they state A=0.3788, ! which raises question if fig 1 is to-scale drawing or sketch. - Insect%nfft_wings = 28 - Insect%a0_wings = 0.5860758 - Insect%ai_wings(1:Insect%nfft_wings) = (/0.0219308,-0.1252418,0.0154668,0.0356038,-0.0203008,-0.0061968,& + Insect%nfft_wings(wingID) = 28 + Insect%a0_wings(wingID) = 0.5860758 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0219308,-0.1252418,0.0154668,0.0356038,-0.0203008,-0.0061968,& 0.0178288,0.0002728,-0.0089908,0.0022758,0.0022948,-0.0046148,& -0.0008808,0.0032598,-0.0003708,-0.0019528,0.0006858,0.0008268,& -0.0008358,-0.0000718,0.0008938,0.0000348,-0.0004598,0.0004428,& 0.0003158,-0.0003108,-0.0000658,0.0002798/) - Insect%bi_wings(1:Insect%nfft_wings) = (/0.0062418,0.0452798,0.0303808,-0.0184998,-0.0179088,0.0068018,& + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0062418,0.0452798,0.0303808,-0.0184998,-0.0179088,0.0068018,& 0.0030268,-0.0058108,0.0017748,0.0040588,-0.0033678,-0.0030638,& 0.0021898,0.0007208,-0.0015538,0.0007128,0.0016948,-0.0003828,& -0.0005898,0.0006388,0.0002888,-0.0005258,0.0000808,0.0002248,& -0.0004308,-0.0002758,0.0002298,-0.0000548/) - Insect%yc = 0.4171918 - Insect%xc = -0.0395258 + Insect%yc(wingID) = 0.4171918 + Insect%xc(wingID) = -0.0395258 case ('hawkmoth2') ! this wingshape is digitized from https://en.wikipedia.org/wiki/Manduca_sexta#/media/File:Manduca_sexta_female_sjh.JPG ! it has a greater aerea (A=0.40), but the original image is tricky since it is rotated. we therefore used a bit of modeling ! for this wing shape. - Insect%nfft_wings = 18 - Insect%a0_wings = 0.6617728 - Insect%ai_wings(1:Insect%nfft_wings) = (/-0.0837648,-0.0802108,0.0703808,0.0069808,-0.0183478,0.0156518,& + Insect%nfft_wings(wingID) = 18 + Insect%a0_wings(wingID) = 0.6617728 + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/-0.0837648,-0.0802108,0.0703808,0.0069808,-0.0183478,0.0156518,& -0.0000308,-0.0153718,-0.0011538,0.0032378,-0.0005008,0.0020798,& 0.0019888,-0.0009568,-0.0016378,-0.0010208,0.0005658,0.0009028/) - Insect%bi_wings(1:Insect%nfft_wings) = (/0.0086968,0.0763208,0.0216658,-0.0322558,-0.0125988,0.0042128,& + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = & + (/0.0086968,0.0763208,0.0216658,-0.0322558,-0.0125988,0.0042128,& -0.0066278,-0.0040288,0.0093858,0.0045358,-0.0043238,0.0006298,& 0.0010848,-0.0028958,0.0007268,0.0022578,-0.0013068,-0.0003538/) - Insect%yc = 0.3946798 - Insect%xc = -0.2157968 + Insect%yc(wingID) = 0.3946798 + Insect%xc(wingID) = -0.2157968 case default ! if all other options fail, we still might load coefficients from file: - if (index(Insect%wingShape,"from_file::") /= 0) then + wingshape_str = Insect%WingShape(wingID) + if (index(wingshape_str,"from_file::") /= 0) then !------------------------------------------------------------------------- ! wing shape is read from ini-file !------------------------------------------------------------------------- - call Setup_Wing_from_inifile(Insect, trim(adjustl(Insect%WingShape( 12:len_trim(Insect%WingShape) )))) + call Setup_Wing_from_inifile(Insect, wingID, trim(adjustl(wingshape_str( 12:len_trim(wingshape_str) )))) else ! now we theres an error... @@ -1160,23 +1625,23 @@ subroutine Setup_Wing_Fourier_coefficients(Insect) ! skip this routine in the future and let other routines know that the wing ! shape is ready to be used. - Insect%wingsetup_done = .true. + Insect%wingsetup_done(wingID) = .true. ! for many cases, it is important that Lspan and Lchord are known, but that is ! tedious for Fourier shapes, as the use cannot see it from the cooefficients. ! Therefore, we compute the max / min of x / y here and store the result - call set_wing_bounding_box_fourier( Insect ) + call set_wing_bounding_box_fourier( Insect, wingID ) ! this is the old defaut value: if (maxval(Insect%corrugation_array_bbox) == 0.0_rk) then - Insect%corrugation_array_bbox(1:4) = Insect%wing_bounding_box(1:4) + Insect%corrugation_array_bbox(1:4) = Insect%wing_bounding_box(1:4,wingID) endif if (root) then write(*,'(30("-"))') write(*,'("Insect module: Setup_Wing_Fourier_coefficients")') - write(*,'("Wing shape is ",A)') trim(adjustl(Insect%WingShape)) - write(*,'("nfft_wings=",i3)') Insect%nfft_wings + write(*,'("Wing shape is ",A)') trim(adjustl(Insect%WingShape(wingID))) + write(*,'("nfft_wings=",i3)') Insect%nfft_wings(wingID) write(*,'(30("-"))') endif @@ -1191,15 +1656,16 @@ end subroutine Setup_Wing_Fourier_coefficients ! - Wing thickness profile (constant or variable) ! - Wing corrugation profile (flat or corrugated) !------------------------------------------------------------------------------- -subroutine Setup_Wing_from_inifile(Insect, fname) +subroutine Setup_Wing_from_inifile( Insect, wingID, fname ) implicit none - type(diptera),intent(inout) :: Insect + type(diptera), intent(inout) :: Insect character(len=*), intent(in) :: fname - type(inifile) :: ifile real(kind=rk), allocatable :: tmparray(:,:) character(len=strlen) :: type_str integer :: a,b + integer(kind=2), intent(in) :: wingID ! wing id number + real(kind=rk) :: init_thickness if (root) then write(*,'(80("-"))') @@ -1220,7 +1686,7 @@ subroutine Setup_Wing_from_inifile(Insect, fname) !----------------------------------------------------------------------------- ! Read fourier coeffs for wing radius !----------------------------------------------------------------------------- - call read_param_mpi( ifile, "Wing", "a0_wings", Insect%a0_wings, 0.d0) + call read_param_mpi( ifile, "Wing", "a0_wings", Insect%a0_wings(wingID), 0.d0) ! NOTE: Annoyingly, the fujitsu SXF90 compiler cannot handle allocatable arrays ! as arguments. so we have to split the routine in one part that returns the size ! of the array, then let the caller allocate, then read the matrix. very tedious. @@ -1231,7 +1697,7 @@ subroutine Setup_Wing_from_inifile(Insect, fname) ! read matrix call param_matrix_read_mpi( ifile, "Wing", "ai_wings", tmparray) Insect%nfft_wings = size(tmparray,2) - Insect%ai_wings(1:Insect%nfft_wings) = tmparray(1,:) + Insect%ai_wings(1:Insect%nfft_wings(wingID),wingID) = tmparray(1,:) deallocate(tmparray) @@ -1241,12 +1707,12 @@ subroutine Setup_Wing_from_inifile(Insect, fname) ! read matrix call param_matrix_read_mpi( ifile, "Wing", "bi_wings", tmparray) Insect%nfft_wings = size(tmparray,2) - Insect%bi_wings(1:Insect%nfft_wings) = tmparray(1,:) + Insect%bi_wings(1:Insect%nfft_wings(wingID),wingID) = tmparray(1,:) deallocate(tmparray) ! wing mid-point (of course in wing system..) - call read_param_mpi(ifile,"Wing","x0w",Insect%xc, 0.d0) - call read_param_mpi(ifile,"Wing","y0w",Insect%yc, 0.d0) + call read_param_mpi(ifile,"Wing","x0w",Insect%xc(wingID), 0.d0) + call read_param_mpi(ifile,"Wing","y0w",Insect%yc(wingID), 0.d0) !----------------------------------------------------------------------------- ! wing thickness @@ -1255,7 +1721,12 @@ subroutine Setup_Wing_from_inifile(Insect, fname) if ( Insect%wing_thickness_distribution == "constant") then if (root) write(*,*) "Wing thickness is constant along the wing" ! wing thickness (NOTE: overwrites settings in other params file) - call read_param_mpi(ifile,"Wing","wing_thickness_value",Insect%WingThickness, 0.05d0) + if ( (Insect%WingThickness>0.0d0) .and. (Insect%WingThickness<1.0d0) ) then + init_thickness = Insect%WingThickness ! Use existing value if it is reasonable + else + init_thickness = 0.05d0 ! This is the defauls value otherwise, because we may not know dx here + endif + call read_param_mpi(ifile,"Wing","wing_thickness_value",Insect%WingThickness, init_thickness) elseif ( Insect%wing_thickness_distribution == "variable") then if (root) write(*,*) "Wing thickness is variable, i.e. t = t(x,y)" @@ -1297,10 +1768,11 @@ end subroutine Setup_Wing_from_inifile ! Therefore, we compute the max / min of x / y / z here and store the result ! NOTE: This code is executed only once. !------------------------------------------------------------------------------- -subroutine set_wing_bounding_box_fourier( Insect ) +subroutine set_wing_bounding_box_fourier( Insect, wingID ) implicit none type(diptera),intent(inout) :: Insect real(kind=rk) :: theta, xmin,xmax, ymin, ymax, R, x, y, theta_prime + integer(kind=2), intent(in) :: wingID ! wing id number theta = 0.d0 xmin = 999.d9 @@ -1312,11 +1784,11 @@ subroutine set_wing_bounding_box_fourier( Insect ) ! note flusi uses a normalized angle between [0,1) do while ( theta < 1.d0 ) ! note this is normalized angle - R = Radius_Fourier( theta, Insect ) + R = Radius_Fourier( theta, Insect, wingID ) theta_prime = 2.d0*pi*theta - pi - x = Insect%xc + R * cos( theta_prime ) - y = Insect%yc + R * sin( theta_prime ) + x = Insect%xc(wingID) + R * cos( theta_prime ) + y = Insect%yc(wingID) + R * sin( theta_prime ) ! NOTE: A word on theta_prime: it is the angle described with the positve x-axis ! and indeed rotates in positve z-direction. That means in the plane @@ -1336,29 +1808,29 @@ subroutine set_wing_bounding_box_fourier( Insect ) theta = theta + 1.0d-3 end do - Insect%wing_bounding_box(1:4) = (/xmin, xmax, ymin, ymax/) + Insect%wing_bounding_box(1:4,wingID) = (/xmin, xmax, ymin, ymax/) ! the bounding box in z-direction depends on the wing thicnkess (constant or not) ! and the corrugation if ( Insect%wing_thickness_distribution == "constant" ) then if ( Insect%corrugated ) then - Insect%wing_bounding_box(5) = minval(corrugation_profile) - Insect%WingThickness / 2.0_pr - Insect%wing_bounding_box(6) = maxval(corrugation_profile) + Insect%WingThickness / 2.0_pr + Insect%wing_bounding_box(5,wingID) = minval(corrugation_profile) - Insect%WingThickness / 2.0_pr + Insect%wing_bounding_box(6,wingID) = maxval(corrugation_profile) + Insect%WingThickness / 2.0_pr else ! constant thickness, no corrugation is the classical flat case: - Insect%wing_bounding_box(5) = -Insect%WingThickness / 2.0_pr - Insect%wing_bounding_box(6) = +Insect%WingThickness / 2.0_pr + Insect%wing_bounding_box(5,wingID) = -Insect%WingThickness / 2.0_pr + Insect%wing_bounding_box(6,wingID) = +Insect%WingThickness / 2.0_pr endif else if ( Insect%corrugated ) then ! minimum of lower surface - Insect%wing_bounding_box(5) = minval(corrugation_profile-wing_thickness_profile/2.0_pr) + Insect%wing_bounding_box(5,wingID) = minval(corrugation_profile-wing_thickness_profile/2.0_pr) ! maximum of upper surface - Insect%wing_bounding_box(6) = maxval(corrugation_profile+wing_thickness_profile/2.0_pr) + Insect%wing_bounding_box(6,wingID) = maxval(corrugation_profile+wing_thickness_profile/2.0_pr) else ! bounding box is +- largest thickness simply - Insect%wing_bounding_box(5) = -maxval(wing_thickness_profile / 2.0_pr) - Insect%wing_bounding_box(6) = maxval(wing_thickness_profile / 2.0_pr) + Insect%wing_bounding_box(5,wingID) = -maxval(wing_thickness_profile / 2.0_pr) + Insect%wing_bounding_box(6,wingID) = maxval(wing_thickness_profile / 2.0_pr) endif end if @@ -1366,8 +1838,8 @@ subroutine set_wing_bounding_box_fourier( Insect ) write(*,'("Effective (=the real surface) wing lengths are:")') write(*,'("Lspan=",es15.8,"Lchord=",es15.8)') ymax-ymin, xmax-xmin write(*,'("Bounding box is:")') - write(*,'("xwmin=",es15.8," xwmax=",es15.8)') Insect%wing_bounding_box(1:2) - write(*,'("ywmin=",es15.8," ywmax=",es15.8)') Insect%wing_bounding_box(3:4) - write(*,'("zwmin=",es15.8," zwmax=",es15.8)') Insect%wing_bounding_box(5:6) + write(*,'("xwmin=",es15.8," xwmax=",es15.8)') Insect%wing_bounding_box(1:2,wingID) + write(*,'("ywmin=",es15.8," ywmax=",es15.8)') Insect%wing_bounding_box(3:4,wingID) + write(*,'("zwmin=",es15.8," zwmax=",es15.8)') Insect%wing_bounding_box(5:6,wingID) endif end subroutine set_wing_bounding_box_fourier diff --git a/src/insects/wings_motion.f90 b/src/insects/wings_motion.f90 index df72939..8c0cea1 100644 --- a/src/insects/wings_motion.f90 +++ b/src/insects/wings_motion.f90 @@ -1,54 +1,61 @@ !------------------------------------------------------------------------------- -! WRAPPER Motion protocoll wrapper left wing +! WRAPPER Motion protocol wrapper !------------------------------------------------------------------------------- -subroutine FlappingMotion_left ( time, Insect ) +subroutine FlappingMotionWrap ( time, Insect, wingID ) implicit none real(kind=rk),intent(in) :: time real(kind=rk),dimension(0:3)::ep type(diptera) :: Insect + integer(kind=2), intent(in) :: wingID + + select case ( wingID ) + case (1) !("left") + if (Insect%wing_fsi == "yes") then + !********************************** + !** Wing fsi model ** + !********************************** + ! the angles that we return here as postprocessing quantities for better + ! interpretation of the output. they are NOT used to compute the wing rotation + ! matrix, which is instead computed from the wing quaternion + ep = Insect%STATE(14:17) + Insect%phi_l = atan2( 2.d0*ep(2)*ep(3)+2.d0*ep(0)*ep(1), ep(2)**2-ep(3)**2+ep(0)**2-ep(1)**2) + Insect%alpha_l = atan2(2.d0*ep(1)*ep(3)+2.d0*ep(0)*ep(2) , ep(1)**2+ep(0)**2-ep(3)**2-ep(2)**2 ) + Insect%theta_l = -asin(2.d0*(ep(1)*ep(2)-ep(0)*ep(3))) + ! the time derivatives are not necessary and set to zero (the angular velocity + ! is computed dynamically from the eqns of motion) + Insect%phi_dt_l = 0.d0 + Insect%alpha_dt_l = 0.d0 + Insect%theta_dt_l = 0.d0 + else + ! conventional model: all angles are prescribed (by fourier/hermite or others) + ! and can be evaluated for any time t. here, we return the 3 angles as well + ! as their time derivatives + call FlappingMotion ( time, Insect, Insect%FlappingMotion_left, & + Insect%phi_l, Insect%alpha_l, Insect%theta_l, Insect%phi_dt_l,& + Insect%alpha_dt_l, Insect%theta_dt_l, Insect%kine_wing_l ) + endif - if (Insect%wing_fsi == "yes") then - !********************************** - !** Wing fsi model ** - !********************************** - ! the angles that we return here as postprocessing quantities for better - ! interpretation of the output. they are NOT used to compute the wing rotation - ! matrix, which is instead computed from the wing quaternion - ep = Insect%STATE(14:17) - Insect%phi_l = atan2( 2.d0*ep(2)*ep(3)+2.d0*ep(0)*ep(1), ep(2)**2-ep(3)**2+ep(0)**2-ep(1)**2) - Insect%alpha_l = atan2(2.d0*ep(1)*ep(3)+2.d0*ep(0)*ep(2) , ep(1)**2+ep(0)**2-ep(3)**2-ep(2)**2 ) - Insect%theta_l = -asin(2.d0*(ep(1)*ep(2)-ep(0)*ep(3))) - ! the time derivatives are not necessary and set to zero (the angular velocity - ! is computed dynamically from the eqns of motion) - Insect%phi_dt_l = 0.d0 - Insect%alpha_dt_l = 0.d0 - Insect%theta_dt_l = 0.d0 - else - ! conventional model: all angles are prescribed (by fourier/hermite or others) - ! and can be evaluated for any time t. here, we return the 3 angles as well - ! as their time derivatives - call FlappingMotion ( time, Insect, Insect%FlappingMotion_left, & - Insect%phi_l, Insect%alpha_l, Insect%theta_l, Insect%phi_dt_l,& - Insect%alpha_dt_l, Insect%theta_dt_l, Insect%kine_wing_l ) - endif -end subroutine FlappingMotion_left - + case (2) !("right") + call FlappingMotion ( time, Insect, Insect%FlappingMotion_right, & + Insect%phi_r, Insect%alpha_r, Insect%theta_r, Insect%phi_dt_r, & + Insect%alpha_dt_r, Insect%theta_dt_r, Insect%kine_wing_r ) -!------------------------------------------------------------------------------- -! WARPPER Motion protocoll wrapper right wing -!------------------------------------------------------------------------------- -subroutine FlappingMotion_right ( time, Insect ) - implicit none + case (3) !("left2") + call FlappingMotion ( time, Insect, Insect%FlappingMotion_left2, & + Insect%phi_l2, Insect%alpha_l2, Insect%theta_l2, Insect%phi_dt_l2,& + Insect%alpha_dt_l2, Insect%theta_dt_l2, Insect%kine_wing_l2 ) - real(kind=rk), intent(in) :: time - type(diptera) :: Insect + case (4) !("right2") + call FlappingMotion ( time, Insect, Insect%FlappingMotion_right2, & + Insect%phi_r2, Insect%alpha_r2, Insect%theta_r2, Insect%phi_dt_r2, & + Insect%alpha_dt_r2, Insect%theta_dt_r2, Insect%kine_wing_r2 ) - call FlappingMotion ( time, Insect, Insect%FlappingMotion_right, & - Insect%phi_r, Insect%alpha_r, Insect%theta_r, Insect%phi_dt_r, & - Insect%alpha_dt_r, Insect%theta_dt_r, Insect%kine_wing_r ) -end subroutine FlappingMotion_right + case default + call abort(77744, "not a valid wing identifier") + end select +end subroutine FlappingMotionWrap !------------------------------------------------------------------------------- @@ -196,7 +203,7 @@ subroutine FlappingMotion(time, Insect, protocoll, phi, alpha, theta, phi_dt, & phi_dt = deg2rad(phi_dt) alpha_dt = deg2rad(alpha_dt) theta_dt = deg2rad(theta_dt) - case ("radiant","RADIANT","Radiant") + case ("radian","RADIAN","Radian","radiant","RADIANT","Radiant") ! if the file is already in radiants, do nothing and be happy! case default call abort(1718,"kinematics file does not appear to be valid, set units=degree or units=radiant") @@ -248,9 +255,9 @@ subroutine FlappingMotion(time, Insect, protocoll, phi, alpha, theta, phi_dt, & ! revolving wing kinematics, pre-defined set. We fix alpha to 45deg and increase ! phi linearily with a short startup conditioner as suggested in [1]. The startup ! time is fixed to 0.4, which gives phi=31.35deg at the end of that interval - ! [3] D. Kolomenskiy, Y. Elimelech and K. Schneider. Leading-edge vortex shedding from rotating wings. Fluid Dyn. Res., 46, 031421, 2014. + ! [1] D. Kolomenskiy, Y. Elimelech and K. Schneider. Leading-edge vortex shedding from rotating wings. Fluid Dyn. Res., 46, 031421, 2014. ttau = 0.4 - ! position angle (is directly given in radiant) + ! position angle (is directly given in radian) ! we use PHI_DOT = 1 as normalization as well (since we have no frequency in this case) phi = 1.d0*( ttau*dexp(-time/ttau) + time) phi_dt = 1.d0*(1.d0-dexp(-time/ttau)) @@ -261,6 +268,73 @@ subroutine FlappingMotion(time, Insect, protocoll, phi, alpha, theta, phi_dt, & theta = 0.d0 theta_dt = 0.d0 + case ("revolving-anticlock") + ! revolving wing kinematics. Similar to "revolving-set1", but phi(0)=0 + ttau = 0.4 + ! position angle (is directly given in radian) + ! we use PHI_DOT = 2*pi as normalization + phi = 2.d0*pi*( ttau*dexp(-time/ttau) - ttau + time) + phi_dt = 2.d0*pi*(1.d0-dexp(-time/ttau)) + ! feathering angle is constant + alpha = deg2rad(-45.d0) + alpha_dt = 0.d0 + ! elevation angle is always zero + theta = 0.d0 + theta_dt = 0.d0 + + case ("revolving-clock") + ! revolving wing kinematics. Opposite direction to "revolving-anticlock" + ttau = 0.4 + ! position angle (is directly given in radian) + ! we use PHI_DOT = 2*pi as normalization + phi = -2.d0*pi*( ttau*dexp(-time/ttau) - ttau + time) + phi_dt = -2.d0*pi*(1.d0-dexp(-time/ttau)) + ! feathering angle is constant + alpha = deg2rad(45.d0) + alpha_dt = 0.d0 + ! elevation angle is always zero + theta = 0.d0 + theta_dt = 0.d0 + + case ("revolving-set2") + ! revolving wing kinematics, pre-defined set. We fix alpha and increase + ! phi linearily with a quadratic startup transient until phi=pi/8, + ! which is reached at time equal to pi/4 + ! we use PHI_DOT = 1 as normalization + if (time < pi/4.0d0) then + phi = 2.0d0*time**2/pi + phi_dt = 4.0d0*time/pi + else + phi = time - pi/8.0d0 + phi_dt = 1.0d0 + endif + ! feathering angle is constant + alpha = - Insect%init_alpha_phi_theta(1) ! Mind the "-" sign + alpha_dt = 0.d0 + ! elevation angle is always zero + theta = 0.d0 + theta_dt = 0.d0 + + case ("revolving-set3") + ! revolving wing kinematics, pre-defined set. We fix alpha and increase + ! phi linearily with a quadratic startup transient until phi=pi/16, + ! which is reached at time equal to pi/8 + ! we use PHI_DOT = 1 as normalization + ! Therefore, the acceleration is twice as fast as in "revolving-set2" + if (time < pi/8.0d0) then + phi = 4.0d0*time**2/pi + phi_dt = 8.0d0*time/pi + else + phi = time - pi/16.0d0 + phi_dt = 1.0d0 + endif + ! feathering angle is constant + alpha = - Insect%init_alpha_phi_theta(1) ! Mind the "-" sign + alpha_dt = 0.d0 + ! elevation angle is always zero + theta = 0.d0 + theta_dt = 0.d0 + case ("Drosophila_hovering_fry") !--------------------------------------------------------------------------- ! motion protocoll digitalized from Fry et al JEB 208, 2303-2318 (2005) diff --git a/src/integrals.f90 b/src/integrals.f90 index 4e41141..fea6d21 100644 --- a/src/integrals.f90 +++ b/src/integrals.f90 @@ -8,11 +8,13 @@ ! Output: ! all output is done directly to hard disk in the *.t files !------------------------------------------------------------------------------- -subroutine write_integrals(time,uk,u,vort,nlk,work,scalars,Insect,beams) +subroutine write_integrals(time,uk,u,vort,nlk,work,scalars,Insect,beams,Wings) use mpi use vars use solid_model + use flexible_model use module_insects + implicit none complex(kind=pr),intent(inout)::uk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) @@ -22,32 +24,34 @@ subroutine write_integrals(time,uk,u,vort,nlk,work,scalars,Insect,beams) real(kind=pr),intent(inout):: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nrw) real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(in):: time + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid), dimension(1:nBeams),intent(inout) :: beams type(diptera), intent(inout) :: Insect real(kind=pr) :: t1 - t1=MPI_wtime() + t1 = MPI_wtime() select case(method) case("fsi") - call write_integrals_fsi(time,uk,u,vort,nlk,work(:,:,:,1),scalars,Insect,beams) + call write_integrals_fsi(time,uk,u,vort,nlk,work(:,:,:,1),scalars,Insect,beams,Wings) case("mhd") call write_integrals_mhd(time,uk,u,vort,nlk,work(:,:,:,1)) case default call abort(1, "Error! Unknown method in write_integrals") end select - time_integrals = time_integrals + MPI_wtime()-t1 + call toc("Statistics (wrapper)", MPI_wtime()-t1) end subroutine write_integrals ! fsi version of writing integral quantities to disk -subroutine write_integrals_fsi(time,uk,u,work3r,work3c,work1,scalars,Insect,beams) +subroutine write_integrals_fsi(time,uk,u,work3r,work3c,work1,scalars,Insect,beams,Wings) use mpi use vars use p3dfft_wrapper use basic_operators use solid_model + use flexible_model use module_insects use penalization ! mask array etc implicit none @@ -59,6 +63,7 @@ subroutine write_integrals_fsi(time,uk,u,work3r,work3c,work1,scalars,Insect,beam real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) complex(kind=pr),intent(inout)::uk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) complex(kind=pr),intent(inout)::work3c(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid), dimension(1:nBeams),intent(inout) :: beams type(diptera), intent(inout) :: Insect @@ -91,9 +96,9 @@ subroutine write_integrals_fsi(time,uk,u,work3r,work3c,work1,scalars,Insect,beam ! to compute the forces, we need the mask at time t. not we cannot suppose ! that mask after fluidtimestep is at time t, it is rather at t-dt, thus we ! have to reconstruct the mask now. solids are also at time t - if(iMoving==1) call create_mask(time, Insect, beams) + if(iMoving==1) call create_mask(time, Insect, beams, Wings) call cal_drag (time, u, Insect) - time_drag = time_drag + MPI_wtime() - t3 + call toc("Statistics (cal_drag)", MPI_wtime() - t3) endif !----------------------------------------------------------------------------- @@ -266,7 +271,7 @@ subroutine write_integrals_mhd(time,ubk,ub,wj,nlk,work) ! Compute u and B to physical space do i=1,nd - call ifft(ub(:,:,:,i),ubk(:,:,:,i)) + call ifft(ubk(:,:,:,i), ub(:,:,:,i)) enddo ! Compute the vorticity and store the result in the first three 3D @@ -282,7 +287,7 @@ subroutine write_integrals_mhd(time,ubk,ub,wj,nlk,work) ! Transform vorcitity and current density to physical space, store ! in wj do i=1,nd - call ifft(wj(:,:,:,i),nlk(:,:,:,i)) + call ifft(nlk(:,:,:,i), wj(:,:,:,i)) enddo ! Compute the integral quantities and output to disk: @@ -677,7 +682,7 @@ subroutine compute_max_div(maxdiv,fk1,fk2,fk3,f1,f2,f3,div,divk) enddo enddo - call ifft(div,divk) + call ifft(divk, div) ! Find the local max diff --git a/src/interpolation.f90 b/src/interpolation.f90 index 2455f6f..99be3ef 100644 --- a/src/interpolation.f90 +++ b/src/interpolation.f90 @@ -25,9 +25,9 @@ subroutine delta_interpolation(x,field,value) !-- note border are ra/rb and not ga/gb - if ((((ix0>=ra(1)).and.(ix0<=rb(1))).or.(nx==1)).and.& - (iy0>=ra(2)).and.(iy0<=rb(2)).and.& - (iz0>=ra(3)).and.(iz0<=rb(3))) then + if ( ( ((ix0>=ra(1)).and.(ix0<=rb(1))) .or. (nx==1) ) .and. & + (iy0>=ra(2)).and.(iy0<=rb(2)) .and.& + (iz0>=ra(3)).and.(iz0<=rb(3)) ) then value = 0.d0 diff --git a/src/krylov_time_stepper.f90 b/src/krylov_time_stepper.f90 deleted file mode 100644 index aa5a7e7..0000000 --- a/src/krylov_time_stepper.f90 +++ /dev/null @@ -1,458 +0,0 @@ -module krylov_module - use vars - -contains - subroutine krylov(time,it,dt0,dt,u,uk,nlk,vort,work,workc,expvis,press,& - scalars,scalars_rhs,Insect,beams) - use mpi - use vars - use p3dfft_wrapper - use solid_model - use module_insects - use basic_operators - implicit none - - real(kind=pr),intent(inout) :: time,dt,dt0 - integer,intent(in) :: it - complex(kind=pr),intent(inout) :: uk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) - complex(kind=pr),intent(inout) :: nlk(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq,0:nrhs-1) - complex(kind=pr),intent(inout) :: workc(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:ncw) - real(kind=pr),intent(inout) :: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nrw) - real(kind=pr),intent(inout) :: u(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nd) - real(kind=pr),intent(inout) :: vort(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:nd) - real(kind=pr),intent(inout) :: expvis(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:nf) - ! pressure array. this is with ghost points for interpolation - real(kind=pr),intent(inout) :: press(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3)) - real(kind=pr),intent(inout) :: scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) - real(kind=pr),intent(inout) :: scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) - type(solid),dimension(1:nbeams),intent(inout) :: beams - type(diptera),intent(inout) :: Insect - - real(kind=pr), allocatable, save :: H(:,:), phiMat(:,:), H_tmp(:,:), rhs(:,:,:,:,:), uold(:,:,:,:) - complex(kind=pr), allocatable, save :: uktmp(:,:,:,:) - integer :: M_iter - integer :: i, j, k, l, iter - real(kind=pr) :: normv, eps2, beta - real(kind=pr) :: h_klein, err, t0, dt_original - - - ! allocate matrices with largest admissible - if (.not. allocated(H)) then - allocate( H(M_max+2,M_max+2) ) - allocate( H_tmp(M_max+2,M_max+2) ) - allocate( phiMat(M_max+2,M_max+2) ) - endif - - if (.not.allocated(rhs)) allocate( rhs(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq,1:M_max+3) ) - if (.not.allocated(uold)) allocate( uold(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) ) - if (.not.allocated(uktmp)) allocate( uktmp(ca(1):cb(1),ca(2):cb(2),ca(3):cb(3),1:neq) ) - - phiMat = 0.0_pr - H = 0.0_pr - - - call ifft3( ink=uk, outx=uold ) - call adjust_dt(time, uold, dt) - dt_original = dt - - ! compute norm "normv" of input state vector - call kry_norm( uold, normv ) - if (normv < epsilon(1.0_pr)) normv = 1.0_pr - eps2 = normv * sqrt(epsilon(1.0_pr)) - - - ! the very last slot (M+3) is the "reference right hand side" - call cal_nlk( time, it, nlk(:,:,:,:,0), uk, u, vort, work, workc, press, scalars, scalars_rhs, Insect, beams) - call dealias( nlk(:,:,:,:,0) ) - call ifft3( ink=nlk(:,:,:,:,0), outx=rhs(:,:,:,:,M_max+3) ) - - - - ! compute norm "beta", which is the norm of the reference RHS evaluation - ! NSF: this guy is called normuu - call kry_norm( rhs(:,:,:,:,M_max+3), beta ) - if (beta < epsilon(1.0_pr)) beta = 1.0_pr - - - ! start iteration, fill first slot - rhs(:,:,:,:,1) = rhs(:,:,:,:,M_max+3) / beta - - !**************************************! - !*** begin interations ***! - !**************************************! - ! we loop over the full size of subspace, then exit prematurely - ! if possible. - do M_iter = 1, M_max - - ! perturbed right hand side is first-to-last (M+2) slot - rhs(:,:,:,:,M_max+2) = uold(:,:,:,:) + eps2 * rhs(:,:,:,:,M_iter) - - ! call RHS with perturbed state vector, stored in slot (M_max+1) - call fft3( inx=rhs(:,:,:,:,M_max+2), outk=uktmp ) - call cal_nlk( time, it, nlk(:,:,:,:,0), uktmp, u, vort, work, workc, press, scalars, scalars_rhs, Insect, beams) - call dealias( nlk(:,:,:,:,0) ) - call ifft3( ink=nlk(:,:,:,:,0), outx=rhs(:,:,:,:,M_max+1) ) - - ! linearization of RHS slot (M_max+1) - rhs(:,:,:,:,M_max+1) = ( rhs(:,:,:,:,M_max+1) - rhs(:,:,:,:,M_max+3) ) / eps2 - - ! --- inner loop ---- - ! --- ARNOLDI --- - do iter = 1, M_iter - call scalarproduct( rhs(:,:,:,:,iter), rhs(:,:,:,:,M_max+1), H(iter, M_iter) ) - - rhs(:,:,:,:,M_max+1) = rhs(:,:,:,:,M_max+1) - H(iter,M_iter) * rhs(:,:,:,:,iter) - enddo - ! end of inner i =1:j loop - call kry_norm( rhs(:,:,:,:,M_max+1), H(M_iter+1,M_iter) ) - - rhs(:,:,:,:,M_iter+1) = rhs(:,:,:,:,M_max+1) / H(M_iter+1,M_iter) - - ! if this is the last iteration, we compute the H matrix and the matrix exponential - ! and use it to get an error estimate. If the error seems okay, we are done and can - ! compute the new time step, otherwise we increase M by one and retry. - ! if we use the dynamic method, we evaluate the error after every iteration to see if - ! we're good to go. - h_klein = H(M_iter+1,M_iter) - - ! create a copy of the H matrix with the right dimension - H_tmp = 0.0_pr - H_tmp(1:M_iter, 1:M_iter) = H(1:M_iter, 1:M_iter) - H_tmp(M_iter+1,M_iter) = 0.0_pr - H_tmp(1,M_iter+1) = 1.0_pr - H_tmp(M_iter+1,M_iter+2) = 1.0_pr - - - ! compute matrix exponential - phiMat = 0.0_pr - phiMat(1:M_iter+2, 1:M_iter+2) = expM_pade( dt*H_tmp(1:M_iter+2, 1:M_iter+2) ) - phiMat(M_iter+1, M_iter+1) = h_klein*phiMat(M_iter, M_iter+2) - - ! *** Error estimate ***! - err = abs( beta*phiMat(M_iter+1,M_iter+1) ) - - if ( M_iter == M_max .and. err > krylov_err_threshold) then - ! we are at the last krylov subspace M and cannot increase the number any more. - ! But the error is still too large, hance we decrease the time step now. - - do while (err > krylov_err_threshold) - dt = 0.90_pr * dt - - ! compute matrix exponential - phiMat = 0.0_pr - phiMat(1:M_iter+2, 1:M_iter+2) = expM_pade( dt*H_tmp(1:M_iter+2, 1:M_iter+2) ) - phiMat(M_iter+1, M_iter+1) = h_klein*phiMat(M_iter, M_iter+2) - - ! *** Error estimate ***! - err = abs( beta*phiMat(M_iter+1,M_iter+1) ) - enddo - - ! if(mpirank==0) then - ! write(*,'("Krylov: decreased dt from dt=",es12.4," to dt=",es12.4," to match residual criterion")') & - ! dt_original, dt - ! endif - endif - - if (err <= krylov_err_threshold .or. M_iter == M_max) then - exit - endif - enddo - !**************************************! - !*** end of iterations ****! - !**************************************! - if(mpirank==0) write(*,'("Krylov iter done. err=",es12.4," time=",g12.3," dt="es12.4," M=",i2)') & - err, time, dt, M_iter - - ! compute final value of new state vector at new time level - ! result will be in hvy_block again (inout) - u = uold - do iter = 1, M_iter+1 - ! call checknan_real( rhs(:,:,:,2,iter), "some rhs " ) - u = u + beta * rhs(:,:,:,:,iter) * phiMat(iter,M_iter+1) - enddo - - call fft3(inx=u, outk=uk) - - call checknan_real( u(:,:,:,2), "did krylov " ) - - if (mpirank==0) then - open(14,file='krylov_err.t',status='unknown',position='append') - write (14,'(3(g15.8,1x),2(i3,1x),es12.4)') time, dt, err, M_iter, M_max, dt_original - close(14) - endif - - end subroutine krylov - - - !!!!!!!!!!!!!!!!!!!!!!!!!!!! - function expM_pade(H) result(E) - implicit none - real(kind=pr),dimension(:,:),intent(in) :: H - real(kind=pr),dimension(size(H,1),size(H,2)) :: E - - real(kind=pr),dimension(size(H,1),size(H,2)) :: expH - integer :: m,ideg,lwsp,iexph,ldh,i,j,ii,iflag,ns - real(kind=pr),allocatable,dimension(:) :: wsp - integer,allocatable,dimension(:) :: ipiv - integer::k - - !*** Berechnung des Matrixexponenten **! - m = size(H,1) - ideg = 6 - lwsp = 4*m*m+ideg+1 - iexph = 1 - ldh = m - allocate(ipiv(m)) ! integer - allocate(wsp(lwsp)) ! rk - - ! !1.0_pr!, da dt*H -> H uebergeben wird, sonst steht hier dt - call DGPADM(ideg,m,1.0_pr,H,ldh,wsp,lwsp,ipiv,iexph,ns,iflag ) - if(iflag.lt.0) stop "error in computing exp(t*H)" - - do j=1,m - do i=1,m - ii = (i+iexph-1) + (j-1)*m - E(i,j) = wsp(ii) - end do - end do - !**************************************! - - end function expM_pade - - - ! *----------------------------------------------------------------------| - subroutine DGPADM( ideg,m,t,H,ldh,wsp,lwsp,ipiv,iexph,ns,iflag ) - implicit none - integer ideg, m, ldh, lwsp, iexph, ns, iflag, ipiv(m) - double precision t, H(ldh,m), wsp(lwsp) - - ! *-----Purpose----------------------------------------------------------| - ! * - ! * Computes exp(t*H), the matrix exponential of a general matrix in - ! * full, using the irreducible rational Pade approximation to the - ! * exponential function exp(x) = r(x) = (+/-)( I + 2*(q(x)/p(x)) ), - ! * combined with scaling-and-squaring. - ! * - ! *-----Arguments--------------------------------------------------------| - ! * - ! * ideg : (input) the degre of the diagonal Pade to be used. - ! * a value of 6 is generally satisfactory. - ! * - ! * m : (input) order of H. - ! * - !* H(ldh,m) : (input) argument matrix. - !* - !* t : (input) time-scale (can be < 0). - !* - !* wsp(lwsp) : (workspace/output) lwsp .ge. 4*m*m+ideg+1. - !* - !* ipiv(m) : (workspace) - !* - !*>>>> iexph : (output) number such that wsp(iexph) points to exp(tH) - !* i.e., exp(tH) is located at wsp(iexph ... iexph+m*m-1) - !* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - !* NOTE: if the routine was called with wsp(iptr), - !* then exp(tH) will start at wsp(iptr+iexph-1). - !* - !* ns : (output) number of scaling-squaring used. - !* - !* iflag : (output) exit flag. - !* 0 - no problem - !* <0 - problem - !* - !*----------------------------------------------------------------------| - !* Roger B. Sidje (rbs@maths.uq.edu.au) - !* EXPOKIT: Software Package for Computing Matrix Exponentials. - !* ACM - Transactions On Mathematical Software, 24(1):130-156, 1998 - !*----------------------------------------------------------------------| - !* - integer mm,i,j,k,ih2,ip,iq,iused,ifree,iodd,icoef,iput,iget - double precision hnorm,scale,scale2,cp,cq - - intrinsic INT,ABS,DBLE,LOG,MAX - - !*--- check restrictions on input parameters ... - mm = m*m - iflag = 0 - if ( ldh.lt.m ) iflag = -1 - if ( lwsp.lt.4*mm+ideg+1 ) iflag = -2 - if ( iflag.ne.0 ) stop 'bad sizes (in input of DGPADM)' - !* - !*--- initialise pointers ... - !* - icoef = 1 - ih2 = icoef + (ideg+1) - ip = ih2 + mm - iq = ip + mm - ifree = iq + mm - !* - !*--- scaling: seek ns such that ||t*H/2^ns|| < 1/2; - !* and set scale = t/2^ns ... - !* - do i = 1,m - wsp(i) = 0.0d0 - enddo - do j = 1,m - do i = 1,m - wsp(i) = wsp(i) + ABS( H(i,j) ) - enddo - enddo - hnorm = 0.0d0 - do i = 1,m - hnorm = MAX( hnorm,wsp(i) ) - enddo - hnorm = ABS( t*hnorm ) - - ns = MAX( 0,INT(LOG(hnorm)/LOG(2.0d0))+2 ) - scale = t / DBLE(2**ns) - scale2 = scale*scale - !* - !*--- compute Pade coefficients ... - !* - i = ideg+1 - j = 2*ideg+1 - wsp(icoef) = 1.0d0 - do k = 1,ideg - wsp(icoef+k) = (wsp(icoef+k-1)*DBLE( i-k ))/DBLE( k*(j-k) ) - enddo - !* - !*--- H2 = scale2*H*H ... - !* - call DGEMM( 'n','n',m,m,m,scale2,H,ldh,H,ldh,0.0d0,wsp(ih2),m ) - !* - !*--- initialize p (numerator) and q (denominator) ... - !* - cp = wsp(icoef+ideg-1) - cq = wsp(icoef+ideg) - do j = 1,m - do i = 1,m - wsp(ip + (j-1)*m + i-1) = 0.0d0 - wsp(iq + (j-1)*m + i-1) = 0.0d0 - enddo - wsp(ip + (j-1)*(m+1)) = cp - wsp(iq + (j-1)*(m+1)) = cq - enddo - !* - !*--- Apply Horner rule ... - !* - iodd = 1 - k = ideg - 1 - 100 continue - iused = iodd*iq + (1-iodd)*ip - call DGEMM( 'n','n',m,m,m, 1.0d0,wsp(iused),m, & - wsp(ih2),m, 0.0d0,wsp(ifree),m ) - do j = 1,m - wsp(ifree+(j-1)*(m+1)) = wsp(ifree+(j-1)*(m+1))+wsp(icoef+k-1) - enddo - ip = (1-iodd)*ifree + iodd*ip - iq = iodd*ifree + (1-iodd)*iq - ifree = iused - iodd = 1-iodd - k = k-1 - if ( k.gt.0 ) goto 100 - !* - !*--- Obtain (+/-)(I + 2*(p\q)) ... - !* - if ( iodd .eq. 1 ) then - call DGEMM( 'n','n',m,m,m, scale,wsp(iq),m, & - H,ldh, 0.0d0,wsp(ifree),m ) - iq = ifree - else - call DGEMM( 'n','n',m,m,m, scale,wsp(ip),m, & - H,ldh, 0.0d0,wsp(ifree),m ) - ip = ifree - endif - call DAXPY( mm, -1.0d0,wsp(ip),1, wsp(iq),1 ) - call DGESV( m,m, wsp(iq),m, ipiv, wsp(ip),m, iflag ) - if ( iflag.ne.0 ) stop 'Problem in DGESV (within DGPADM)' - call DSCAL( mm, 2.0d0, wsp(ip), 1 ) - do j = 1,m - wsp(ip+(j-1)*(m+1)) = wsp(ip+(j-1)*(m+1)) + 1.0d0 - enddo - iput = ip - if ( ns.eq.0 .and. iodd.eq.1 ) then - call DSCAL( mm, -1.0d0, wsp(ip), 1 ) - goto 200 - endif - !* - !*-- squaring : exp(t*H) = (exp(t*H))^(2^ns) ... - !* - iodd = 1 - do k = 1,ns - iget = iodd*ip + (1-iodd)*iq - iput = (1-iodd)*ip + iodd*iq - call DGEMM( 'n','n',m,m,m, 1.0d0,wsp(iget),m, wsp(iget),m, & - 0.0d0,wsp(iput),m ) - iodd = 1-iodd - enddo - 200 continue - iexph = iput - END subroutine DGPADM - !*----------------------------------------------------------------------| - - - - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - subroutine get_sum_all(inout) - use vars - implicit none - real(kind=pr),intent(inout) :: inout - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - real(kind=pr) :: tmp - integer :: mpierr - - call MPI_ALLREDUCE(inout,tmp,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,mpierr) - inout = tmp - - end subroutine get_sum_all - - - subroutine kry_norm(field, norm) - use vars - implicit none - !> heavy data array - block data - real(kind=pr), intent(inout) :: field(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) - !> this is the output of the function: - real(kind=pr), intent(out) :: norm - - integer :: ix, iy, iz - - norm = 0.0_pr - - do iz=ra(3),rb(3) - do iy=ra(2),rb(2) - do ix=ra(1),rb(1) - norm = norm + sum( field(ix,iy,iz,:)**2 ) - enddo - enddo - enddo - call get_sum_all(norm) - norm = sqrt(norm) - - end subroutine kry_norm - - subroutine scalarproduct(field1, field2, result) - use vars - implicit none - real(kind=pr), intent(inout) :: field1(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) - real(kind=pr), intent(inout) :: field2(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:neq) - real(kind=pr), intent(out) :: result - - integer :: ix, iy, iz, ieqn - - result = 0.0_pr - - do iz=ra(3),rb(3) - do iy=ra(2),rb(2) - do ix=ra(1),rb(1) - do ieqn = 1, neq - result = result + field1(ix,iy,iz,ieqn)*field2(ix,iy,iz,ieqn) - enddo - enddo - enddo - enddo - - call get_sum_all(result) - end subroutine scalarproduct - -end module krylov_module diff --git a/src/mhd.f90 b/src/mhd.f90 index aa5bda9..03c8c60 100644 --- a/src/mhd.f90 +++ b/src/mhd.f90 @@ -4,6 +4,7 @@ program mhd use vars use module_insects !TODO: MAKE MHD INDEPENDENT OF THIS use solid_model!TODO: MAKE MHD INDEPENDENT OF THIS + use flexible_model!TODO: MAKE MHD INDEPENDENT OF THIS use penalization ! mask array etc implicit none @@ -40,6 +41,7 @@ program mhd ! this is a hack and will be removed later: type(diptera) :: dummy_insect + type(flexible_wing),dimension(1:nWings) :: dummy_wings type(solid), dimension(1:nBeams) :: dummy_beams ! Initialize MPI, get size and rank @@ -156,7 +158,7 @@ program mhd ! Initialize vorticity or read values from a backup file if (mpirank == 0) write(*,*) "Set up initial conditions:" call init_fields(time,it,dt0,dt1,n0,n1,ub,ubk,nlk,wj,explin,work,workc,press,& - scalars,scalars_rhs,dummy_insect,dummy_beams) + scalars,scalars_rhs,dummy_insect,dummy_beams,dummy_wings) if (mpirank == 0) write(*,*) "Create mask variables:" call create_mask_mhd @@ -165,7 +167,7 @@ program mhd if (mpirank == 0) write(*,*) "Start time-stepping:" call time_step(time,dt0,dt1,n0,n1,it,ub,ubk,nlk,wj,work,workc,explin,& - press,scalars,scalars_rhs,infile,dummy_insect,dummy_beams) + press,scalars,scalars_rhs,infile,dummy_insect,dummy_beams,dummy_wings) if (mpirank == 0) write(*,'(A)') 'Finished computation.' deallocate(ubk) diff --git a/src/module_timing.f90 b/src/module_timing.f90 new file mode 100644 index 0000000..038e866 --- /dev/null +++ b/src/module_timing.f90 @@ -0,0 +1,143 @@ +!=========================================================================== +!> Module to perform runtime timings using MPI_WTIME +! ***************************************************************************** +module module_timing + use mpi + + ! variables + implicit none + + ! everything is private unless explicitly marked public + PRIVATE + + !********************************************************************************************** + ! These are the important routines that are visible to other modules: + !********************************************************************************************** + PUBLIC :: toc, summarize_profiling + !********************************************************************************************* + + ! precision of reals in this module. we use this separated precision in order for + ! the timing module to be completely independent of the rest of the code (and hence to be + ! reusable in other projects) + integer, parameter :: dp = selected_real_kind(8) + + ! we provide at most this many slots for timing: + integer, PARAMETER :: MAX_TIMING_SLOTS = 250 + + ! array of time measurements and call counters + real(kind=dp), dimension(:,:), allocatable :: comp_time + + ! each timing slot gets a name so it can be easily identified + character(len=100), dimension(:), allocatable :: name_comp_time + +contains + + + !> For a given NAME, increase the function call counter by one and store the + !> elapsed time in the global arrays. + subroutine toc( name, t_elapsed_this, call_counter ) + implicit none + character(len=*), intent(in) :: name + real(kind=dp), intent(in) :: t_elapsed_this + integer, optional, intent(in) :: call_counter + + integer :: k + + ! check if allocate_init_debbuging was called before + if (.not. allocated( name_comp_time)) then + ! note: fix size of time measurements array + ! allocate array for time measurements - data + allocate( comp_time( MAX_TIMING_SLOTS, 2 ) ) + ! reset times + comp_time = 0.0_dp + ! allocate array for time measurements - names + allocate( name_comp_time( MAX_TIMING_SLOTS ) ) + ! reset names + name_comp_time = "---" + endif + + ! find a free or the corresponding slot in the array: + k = 1 + do while ( name_comp_time(k) /= "---" ) + ! entry for current subroutine exists + if ( name_comp_time(k) == name ) exit + k = k + 1 + end do + + ! write time + name_comp_time(k) = name + if (present(call_counter)) then + ! increase by the number given in argument + comp_time(k, 1) = comp_time(k, 1) + real( call_counter, kind=dp) + else + ! increase by one + comp_time(k, 1) = comp_time(k, 1) + 1.0_dp + endif + comp_time(k, 2) = comp_time(k, 2) + t_elapsed_this + + end subroutine toc + + + !> This function summarizes the profile of the Simulation. + !> It should be called on the end of the program, when the statistics of + !> the profiled functions is large. + !> \details + !> The function displays the total sum of the cpu time spend + !> in the profiled part of your program and its standard deviation in a tabel. + subroutine summarize_profiling( comm ) + implicit none + !--------------------------------------- + !< MPI communicator + integer, intent(in) :: comm + !--------------------------------------- + integer :: rank,k,number_procs,ierr + real(kind=dp), dimension(:), allocatable :: avg, std + + call MPI_Comm_rank(comm, rank, ierr) + call MPI_Comm_size(comm, number_procs, ierr) + + if (.not. allocated(comp_time)) then + if (rank==0) write(*,*) "Timing information not available (no toc used?)" + return + endif + + allocate(avg(1:size(comp_time,1))) + allocate(std(1:size(comp_time,1))) + + ! sum times (over all mpi processes) for all slots + call MPI_Allreduce( comp_time(:,2), avg, size(comp_time,1), MPI_REAL8, MPI_SUM, comm, ierr) + + ! average times (over all mpi processes) for all slots + avg = avg / dble(number_procs) + + ! standard deviation + std = (comp_time(:,2) - avg)**2.0_dp + call MPI_Allreduce( MPI_IN_PLACE, std, size(comp_time,1), MPI_REAL8, MPI_SUM, comm, ierr) + + if (number_procs == 1) then + std = 0.0_dp + else + std = sqrt( std / dble(number_procs - 1 )) + end if + + ! output + if (rank==0) then + write(*,'(80("_"))') + write(*, '("time (average value +- standard deviation) :")') + k = 1 + do while ( name_comp_time(k) /= "---" ) + write(*,'(A100, 2(2x, f12.3))') name_comp_time(k), avg(k), std(k) + k = k + 1 + end do + write(*,'(80("_"))') + end if + + ! MPI Barrier to be sure to see the above write statements + call MPI_Barrier(comm, ierr) + + deallocate(avg) + deallocate(std) + + end subroutine summarize_profiling + +end module module_timing diff --git a/src/params.f90 b/src/params.f90 index a69ef2f..90f9299 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -247,6 +247,7 @@ end subroutine get_params_common subroutine get_params_fsi(PARAMS,Insect) use module_ini_files_parser_mpi use vars + use flexible_model use module_insects implicit none @@ -315,6 +316,7 @@ subroutine get_params_fsi(PARAMS,Insect) call read_param_mpi(PARAMS,"MeanFlow","ux",uxmean, 1.d0) call read_param_mpi(PARAMS,"MeanFlow","uy",uymean, 1.d0) call read_param_mpi(PARAMS,"MeanFlow","uz",uzmean, 1.d0) + call read_param_mpi(PARAMS,"MeanFlow","umean_freq",umean_freq, 0.d0) call read_param_mpi(PARAMS,"MeanFlow","iMeanFlowStartupConditioner",& iMeanFlowStartupConditioner,"no") call read_param_mpi(PARAMS,"MeanFlow","tau_meanflow",tau_meanflow, 0.d0) @@ -337,6 +339,15 @@ subroutine get_params_fsi(PARAMS,Insect) call get_params_solid( PARAMS ) call get_params_scalars( PARAMS ) + ! --------------------------------------------------- + ! Activate the solver for flexible wings + ! --------------------------------------------------- + call read_param_mpi(PARAMS,"Flexible_wing","use_flexible_wing_model",use_flexible_wing_model,"no") + call read_param_mpi(PARAMS,"Flexible_wing","wing_interp",wing_interp,"delta") + call read_param_mpi(PARAMS,"Flexible_wing","activate_press_force",activate_press_force,"no") + call read_param_mpi(PARAMS,"Flexible_wing","activate_noninertial_force",activate_noninertial_force,"no") + call read_param_mpi(PARAMS,"Flexible_wing","load_mass_from_file",load_mass_from_file,.false.) + ! ---------------------------------------------------- ! slice extraction ! ---------------------------------------------------- diff --git a/src/passive_scalar.f90 b/src/passive_scalar.f90 index 081f2d1..da3cd88 100644 --- a/src/passive_scalar.f90 +++ b/src/passive_scalar.f90 @@ -119,7 +119,7 @@ subroutine cal_nlk_scalar( time, it, u, scalars, scalars_rhs ) usy = us(ix,iy,iz,2) usz = us(ix,iy,iz,3) - chi = mask2(ix,iy,iz) + chi = mask2(ix,iy,iz) ! penalized diffusion coefficient D = scalar_props(j)%kappa*(1.d0-chi) + scalar_props(j)%eps*chi @@ -206,7 +206,9 @@ subroutine cal_nlk_scalar( time, it, u, scalars, scalars_rhs ) call add_scalar_source( time, scalars, scalars_rhs ) deallocate(mask2) - time_nlk_scalar = time_scalar + MPI_wtime() - t1 + + ! save timing + call toc( "Pasisve scalar (rhs)", MPI_wtime() - t1) end subroutine cal_nlk_scalar diff --git a/src/postprocessing/POD.f90 b/src/postprocessing/POD.f90 new file mode 100644 index 0000000..9f8ccb1 --- /dev/null +++ b/src/postprocessing/POD.f90 @@ -0,0 +1,484 @@ +subroutine POD(help) + use vars + use p3dfft_wrapper + use basic_operators + use module_helpers + use module_ini_files_parser_mpi + implicit none + logical, intent(in) :: help + character(len=strlen) :: fnamex_list, fname_this, fnamey_list, fnamez_list, dummy + character(len=strlen) :: fnamex, fnamey, fnamez, timesteps_list, fname_reconst_base + character(len=strlen) :: fname_list(1:3), fname_acoefs + real(kind=pr), dimension(:,:,:), allocatable :: field_avg, field + real(kind=pr), dimension(:,:), allocatable :: X_data, POD_modes, a_coefs + real(kind=pr), dimension(:), allocatable :: X_mean, times + DOUBLE PRECISION, dimension(:,:), allocatable :: C, V, D + DOUBLE PRECISION, dimension(:), allocatable :: eigenvalues, work + integer :: ix, iy ,iz, io_error, i,j, N_modes, N_snapshots, info, it, dim, npoints, k + integer :: ncomponents, nmodes_to_read, nmodes_file + real(kind=pr) :: time, a, norm + LOGICAL :: vector, reconstruct_all_time_steps, reconstruct_list, only_recon, total_not_fluctuations, only_modes + logical :: save_original + + if (help.and.root) then + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "./flusi -p --POD --components 3 --list file_list.txt [list_uy.txt] [list_uz.txt] " + write(*,*) "--modes 10 --reconstruct-all-time-steps --total-not-fluctuations" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) " Snapshot POD of flow data (vorticity, velocity, etc.) " + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) " --list: a TXT file which simply contains the list of snapshots to read, one file per line" + write(*,*) " --reconstruct-all-time-steps" + write(*,*) " --reconstruct-list timesteps.txt" + write(*,*) " --only-modes" + write(*,*) " --only-reconstruction a_coefs.txt (reconstruction from 34 modes, read from HDD)" + write(*,*) " --modes 10" + write(*,*) " --save-original" + write(*,*) " if specified, code also stores original fluctuations (e.g. input data) at reconstruction" + write(*,*) " time steps. In the case of --total-not-fluctuations, this would be useless" + write(*,*) " --total-not-fluctuations" + write(*,*) " do not remove mean from data if this flag is set. in the literature, POD always removes the" + write(*,*) " ensemble average." + write(*,*) " --reconstruction-name vel-fluct" + write(*,*) " If the code is reconstructing the field from POD modes (i.e. not running --only-modes)" + write(*,*) " then you can choose the filename for reconstructions here. Naming scheme is" + write(*,*) " [NAME]-[MODES]-[COMPONENT]_[TIMESTEP].h5" + write(*,*) " so e.g. vel-fluct-30-1_000.h5 if name='vel-fluct' " + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "Parallel: Yes" + return + endif + + ! defaults: + ncomponents = 1 + reconstruct_all_time_steps = .false. + reconstruct_list = .false. + only_recon = .false. + total_not_fluctuations = .false. + only_modes = .false. + save_original = .false. + fname_reconst_base = "reconstruction" + + ! fetch parameters from command line call + do i = 1, COMMAND_ARGUMENT_COUNT() + call get_command_argument(i,dummy) + select case (dummy) + case ("--save-original") + save_original = .true. + if (root) write(*,*) "We do save original data." + + case ("--total-not-fluctuations") + total_not_fluctuations = .true. + if (root) write(*,*) "We do NOT remove the mean and work on TOTAL field" + + case ("--reconstruction-name") + call get_command_argument(i+1,fname_reconst_base) + if (root) write(*,*) "Basename for reconstruction is", fname_reconst_base + + case ("--only-modes") + only_modes = .true. + if (root) write(*,*) "We compute only modes and do NOT reconstruct" + + case ("--only-reconstruction") + only_recon = .true. + + call get_command_argument(i+1, fname_acoefs) + if (root) write(*,*) "reconstruction from acoefs=", fname_acoefs + + case ("--list") + do j = 1, ncomponents + call get_command_argument(i+j, fname_list(j)) + enddo + + case ("--reconstruct-all-time-steps") + reconstruct_all_time_steps = .true. + + case ("--modes") + call get_command_argument(i+1,dummy) + read(dummy,*) N_modes + if (root) write(*,*) "Will save N_modes=", N_modes + + case ("--reconstruct-list") + call get_command_argument(i+1,timesteps_list) + reconstruct_list = .true. + reconstruct_all_time_steps = .false. + if (root) write(*,*) "Will reconstruct at time steps given by ", timesteps_list + call check_file_exists(timesteps_list) + + case ("--components") + call get_command_argument(i+1,dummy) + read(dummy,*) ncomponents + if (root) write(*,*) "Expect ncomponents=", ncomponents + + end select + enddo + + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! VARIANT A: read data, compute POD + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if (.not. only_recon) then + !----------------------------------------------------------------------------- + ! check if input file exists, the file contains the list of h5 files to be avg + !----------------------------------------------------------------------------- + do j = 1, ncomponents + call check_file_exists ( fname_list(j) ) + if (root) write(*,*) "Reading list of files from "//fname_list(j) + enddo + + + !----------------------------------------------------------------------------- + ! read in the file, loop over lines + !----------------------------------------------------------------------------- + call count_lines_in_ascii_file_mpi(fname_list(1), N_snapshots, n_header=0) + + if (root) write(*,*) "Reading N_snapshots=", N_snapshots + + allocate( C(1:N_snapshots,1:N_snapshots) ) + allocate( D(1:N_snapshots,1:N_snapshots) ) + allocate( V(1:N_snapshots,1:N_snapshots) ) + allocate( eigenvalues(1:N_snapshots) ) + allocate( a_coefs(1:N_snapshots,1:N_snapshots) ) + allocate( work(1:5*N_snapshots) ) + allocate( times(1:N_snapshots) ) + + do j = 1, ncomponents + open( unit=10+j, file=fname_list(j), action='read', status='old' ) + enddo + + io_error = 0 + i = 1 + do while (i <= N_snapshots) + do j = 1, ncomponents + read (10+j, '(A)', iostat=io_error) fnamex + call check_file_exists ( fnamex ) + + ! initialization is done after first read. + if ( i == 1 .and. j == 1 ) then + ! get file size etc + call fetch_attributes( fnamex, nx, ny, nz, xl, yl, zl, time, nu, origin ) + ! initialization parallel module (no FFTS) + call decomposition_initialize() + + ! size of a flattened snapshot + npoints = (rb(1)-ra(1)+1) * (rb(2)-ra(2)+1) * (rb(3)-ra(3)+1) + + if (decomposition /= "1D") then + call abort(28122018,"I think this module works only for 1D MPI decomp (scalar products)") + endif + + ! memory for one field + allocate( field( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3) ) ) + + allocate( X_data( 1:npoints * ncomponents, 1:N_snapshots) ) + allocate( POD_modes( 1:npoints * ncomponents, 1:N_snapshots) ) + allocate( X_mean( 1:npoints * ncomponents ) ) + endif + + ! read the field from file + call read_single_file( fnamex, field ) + + ! add it to the data array + X_data( 1+(j-1)*npoints:(j)*npoints, i) = reshape(field, (/npoints/) ) + enddo + if (root) write(*,*) "filled snapshot slot", i + i = i+1 + enddo + + do j = 1, ncomponents + close(10+j) + enddo + + !--------------------------------------------------------------------------- + ! compute fluctuations (remove mean) + !--------------------------------------------------------------------------- + if ( .not. total_not_fluctuations ) then + ! compute mean of data + X_mean = 0.0_pr + do i = 1, N_snapshots + X_mean = X_mean + X_data(:,i) + enddo + X_mean = X_mean / dble(N_snapshots) + + ! POD acts on fluctuations, so remove the mean. + do i = 1, N_snapshots + X_data(:,i) = X_data(:,i) - X_mean + enddo + endif + + !--------------------------------------------------------------------------- + ! construction of covariance matrix from snapshot data + !--------------------------------------------------------------------------- + ! compute matrix C + C = matmul( transpose(X_data), X_data ) + + ! divide by number of snapshots (eqn. 3.29 on p. 11 of Luchtenberg, Noak.) + C = C / dble(N_snapshots) + + call MPI_ALLREDUCE(MPI_IN_PLACE, C, N_snapshots**2, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, info) + + ! normalization of C Matrix + C = C / dble( nx*ny*nz ) + + + ! if (root) then + ! open(14, file='C_matrix_fortran.txt', status='replace') + ! do i = 1, N_snapshots + ! write(14,'(400(es15.8,1x))') C(i,:) + ! enddo + ! close(14) + ! end if + + !--------------------------------------------------------------------------- + ! eigenvalues of covariance matrix + !--------------------------------------------------------------------------- + call DSYEV('V', 'U', N_snapshots, C, N_snapshots, eigenvalues, work, 5*N_snapshots, info) + ! as in matlab the eigenvalues are sorted in ascending order... + ! on output, C now contains the eigenvectors: + V = C + + if (root) write(*,*) "info=", info + if (info /= 0) call abort(333,"The eigenvalue solver failed...") + + + if (root) then + write(*,*) "----v eigenvalues v-----" + do i = 1, N_snapshots + write(*,'(1(es12.4,1x))') eigenvalues(i) + enddo + write(*,*) "----^ eigenvalues ^-----" + endif + + !--------------------------------------------------------------------------- + ! construct POD basis functions (modes) + !--------------------------------------------------------------------------- + ! eqn. 31 from AIAA review + + if (root) write(*,*) "Constructing POD modes (X*V)" + POD_modes = matmul(X_data, V) + + + if (root) write(*,*) "Constructing POD modes (sqrt(lambda))" + do i = 1, N_snapshots + ! note the division by sqrt(lambda) might cause numerical instabilities + ! if the eigenvalue is close to zero + if ( eigenvalues(i) > 1.0e-9_pr ) then + POD_modes(:,i) = POD_modes(:,i) / sqrt( dble(N_snapshots)*eigenvalues(i)) + ! POD_modes(:,i) = POD_modes(:,i) / sqrt(eigenvalues(i)) + endif + + ! ! for some reason the modes are not normalized here, so we take care of that + ! ! I think the reason is the scalar product, which needs to be scaled by nx*ny*nz (and NOT npoints) + ! norm = sqrt( sum(POD_modes(:,i)**2) / dble(nx*ny*nz) ) + ! + ! call MPI_ALLREDUCE(MPI_IN_PLACE, norm, 1, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, info) + ! + ! if (root) write(*,*) i, norm + ! + ! if (norm > 1.0e-8_pr) then + ! POD_modes(:,i) = POD_modes(:,i) / norm + ! endif + enddo + + !--------------------------------------------------------------------------- + ! save modes to disk + !--------------------------------------------------------------------------- + if (root) write(*,*) "Saving POD modes to disk" + + do i = 1, N_modes + do j = 1, ncomponents + field = reshape( POD_modes(1+(j-1)*npoints:(j)*npoints, N_snapshots-i+1), & + (/(rb(1)-ra(1)+1), (rb(2)-ra(2)+1), (rb(3)-ra(3)+1)/) ) + + ! create filename + write(fname_this, '("mode",i1,"_",i3.3,".h5")') j, i + + call save_field_hdf5 ( dble(i), fname_this, field ) + enddo + enddo + + !--------------------------------------------------------------------------- + ! temporal coefficients + !--------------------------------------------------------------------------- + if (root) write(*,*) "Computing temporal coefficients a" + + a_coefs = 0.0_pr + do it = 1, N_snapshots + do i = 1, N_modes + ! scalar product (inner product) + a_coefs(it,i) = sum( X_data(:, it) * POD_modes(:, N_snapshots-i+1) ) + enddo + enddo + call MPI_ALLREDUCE(MPI_IN_PLACE, a_coefs, N_snapshots**2, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, info) + a_coefs = a_coefs / dble(nx*ny*nz) + + if (root) then + write(*,*) 'writing temporal coefficients a_coefs.txt' + open(14, file='a_coefs.txt', status='replace') + do i = 1, N_snapshots + write(14,'(400(es15.8,1x))') a_coefs(i, 1:N_modes) + enddo + close(14) + end if + + + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! VARIANT B: read previously computed POD from files + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + else + + !**************** read-from-file-mode **************** + + call count_lines_in_ascii_file_mpi(fname_acoefs, N_snapshots, n_header=0) + call count_cols_in_ascii_file_mpi(fname_acoefs, nmodes_file, n_header=0) + + if (root) write(*,*) "a_coefs.txt:", N_snapshots, nmodes_file + + allocate( a_coefs(1:N_snapshots, 1:nmodes_file)) + call read_array_from_ascii_file_mpi(fname_acoefs, a_coefs, n_header=0) + + if (root) then + write(*,*) "~~~~v ", fname_acoefs + do k = 1, N_snapshots + write(*,'(400(es15.8,1x))') a_coefs(k, :) + enddo + write(*,*) "~~~~^ ", fname_acoefs + endif + + if (N_snapshots < N_modes) then + call abort(7771,"You want to reconstruct using more modes than the POD originally used.") + endif + + ! read modes, but only as many as we require for reconstruction + do i = 1, N_modes + do j = 1, ncomponents + ! create filename + write(fname_this, '("mode",i1,"_",i3.3,".h5")') j, i + + if (root) write(*,*) "reading mode: ", fname_this + + if (i==1 .and. j==1) then + ! get file size etc + call fetch_attributes( fname_this, nx, ny, nz, xl, yl, zl, time, nu, origin ) + ! initialization parallel module (no FFTS) + call decomposition_initialize() + + ! size of a flattened snapshot + npoints = (rb(1)-ra(1)+1) * (rb(2)-ra(2)+1) * (rb(3)-ra(3)+1) + + if (decomposition /= "1D") then + call abort(28122018,"I think this module works only for 1D MPI decomp (scalar products)") + endif + + ! memory for one field + allocate( field( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3) ) ) + allocate( POD_modes( 1:npoints * ncomponents, 1:N_snapshots) ) + endif + + ! read the mode + call read_single_file( fname_this, field ) + + ! sort it in the array (note this step is not necessary but simplifies coding) + POD_modes( 1+(j-1)*npoints:(j)*npoints, N_snapshots-i+1) = reshape(field, (/npoints/) ) + + enddo + enddo + + endif + + + ! at this point, we have the POD_modes and their temporal coefficients ready + + ! if not reconstructing, we're done now + if (only_modes) return + + + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ! RECONSTRUCTION + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + !--------------------------------------------------------------------------- + ! reconstruction using N_modes + !--------------------------------------------------------------------------- + ! which time step to reconstruct at + if (reconstruct_all_time_steps .and. .not. reconstruct_list) then + do it = 1, N_snapshots + do j = 1, ncomponents + field = 0.0_pr + + do i = 1, N_modes + field = field + a_coefs(it,i) * reshape( POD_modes(1+(j-1)*npoints:(j)*npoints, N_snapshots-i+1), & + (/(rb(1)-ra(1)+1), (rb(2)-ra(2)+1), (rb(3)-ra(3)+1)/) ) + enddo + + ! create filename + write(fname_this,'(A,"-",i2.2,"-",i1,"_",i3.3,".h5")') trim(adjustl(fname_reconst_base)), N_modes, j, it + call save_field_hdf5 ( dble(it), fname_this, field ) + + if (.not. only_recon .and. save_original) then + ! for comparison, also save original data (which is of course only the fluctuating + ! part of the solution). can only be done when computing POD, not on reconstruction + field = reshape( X_data(1+(j-1)*npoints:(j)*npoints, it), & + (/(rb(1)-ra(1)+1), (rb(2)-ra(2)+1), (rb(3)-ra(3)+1)/) ) + + write(fname_this,'("original",i2.2,"-",i1,"_",i3.3,".h5")') N_modes, j, it + call save_field_hdf5 ( dble(it), fname_this, field ) + endif + + enddo + enddo + + !--------------------------------------------------------------------------- + ! reconstruction of a list of time steps + !--------------------------------------------------------------------------- + elseif ( .not. reconstruct_all_time_steps .and. reconstruct_list ) then + + io_error = 0 + open(17, file=timesteps_list, action='read', status='old' ) + + do while (io_error == 0) + read(17, *, iostat=io_error) it + + if (io_error == 0) then + + if (root) write(*,*) "reconstruction it=", it, "using", N_modes, ncomponents + + if (it<1 .or. it>size(a_coefs,1)) then + write(*,*) "it=", it, size(a_coefs,1) + call abort(8881,"You request reconstruction at an invalid time step.") + endif + + do j = 1, ncomponents + field = 0.0_pr + + do i = 1, N_modes + field = field + a_coefs(it,i) * reshape( POD_modes(1+(j-1)*npoints:(j)*npoints, N_snapshots-i+1), & + (/(rb(1)-ra(1)+1), (rb(2)-ra(2)+1), (rb(3)-ra(3)+1)/) ) + enddo + + ! create filename + write(fname_this,'(A,"-",i2.2,"-",i1,"_",i3.3,".h5")') trim(adjustl(fname_reconst_base)), N_modes, j, it + call save_field_hdf5 ( dble(it), fname_this, field ) + + if (.not. only_recon .and. save_original) then + ! for comparison, also save original data (which is of course only the fluctuating + ! part of the solution). can only be done when computing POD, not on reconstruction + field = reshape( X_data(1+(j-1)*npoints:(j)*npoints, it), & + (/(rb(1)-ra(1)+1), (rb(2)-ra(2)+1), (rb(3)-ra(3)+1)/) ) + + write(fname_this,'("original",i2.2,"-",i1,"_",i3.3,".h5")') N_modes, j, it + call save_field_hdf5 ( dble(it), fname_this, field ) + endif + enddo + endif + enddo + + close(17) + endif +end subroutine POD diff --git a/src/postprocessing/convert_pressure.f90 b/src/postprocessing/convert_pressure.f90 index 994f26a..3724aaa 100644 --- a/src/postprocessing/convert_pressure.f90 +++ b/src/postprocessing/convert_pressure.f90 @@ -104,9 +104,20 @@ subroutine convert_pressure(help) endif if (fname_ini /= "") then - call get_params(fname_ini, Insect, .true.) + call get_params(fname_ini, Insect, .true.) + if (iMask == "Insect") then + call insect_init(time, fname_ini, Insect, .false., "", (/xl,yl,zl/), nu, & + dx, periodic=periodic) + ! max color + if (Insect%second_wing_pair) then + endcolor = 5 + else + endcolor = 3 + endif + endif endif + ! if the simulation was done using free-flight, we'd need to read rigidsolidsolver.t ! and interpolate the state vector etc (as done in --dry-run). TODO. if (Insect%BodyMotion=="free_flight") then diff --git a/src/postprocessing/convert_to_wing_system.f90 b/src/postprocessing/convert_to_wing_system.f90 index b63ba9a..2ff8ff3 100644 --- a/src/postprocessing/convert_to_wing_system.f90 +++ b/src/postprocessing/convert_to_wing_system.f90 @@ -12,8 +12,8 @@ subroutine convert_to_wing_system(help) real(kind=pr) :: t1,t2 real(kind=pr) :: time - integer :: ix,iy,iz,mpicode, i - character (len=strlen) :: infile, outfile + integer :: ix, iy, iz, mpicode, i, nargs, nx1, nx2, ny1, ny2, nz1, nz2 + character (len=strlen) :: infile, outfile, whichwing ! arrays needed for interpolation real(kind=pr),dimension(:,:,:,:),allocatable :: u_org,u_interp real(kind=pr),dimension(:,:),allocatable :: u_buffer, u_buffer2 @@ -22,8 +22,10 @@ subroutine convert_to_wing_system(help) ! this is the solid model beams: type(solid), dimension(1:nBeams) :: beams real(kind=pr) :: x_wing(1:3),x_glob(1:3),M_wing_r(1:3,1:3),M_wing_l(1:3,1:3),M_body(1:3,1:3) - real(kind=pr) :: u1,u2, x_body(1:3), u(1:3) - logical :: wing_system, vector + real(kind=pr) :: M_wing_r2(1:3,1:3),M_wing_l2(1:3,1:3) + real(kind=pr) :: u1,u2, x_body(1:3), u(1:3), rot_rel_wing_w(1:3) + logical :: wing_system=.false., vector=.false., relative_velocity = .false. + integer(kind=2) :: idw ! Set method information in vars module. method="fsi" ! We are doing fluid-structure interactions @@ -34,12 +36,17 @@ subroutine convert_to_wing_system(help) ncw=1 ! number of complex values work arrays (decide that later) nrhs=2 ! number of right-hand side registers + nargs = command_argument_count() + if (help.and.root) then write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - write(*,*) "./flusi -p --convert-to-wing-system --scalar PARAMS.ini input_0000.h5 output_0000.h5" + write(*,*) "./flusi -p [--convert-to-wing-system|--convert-to-body-system] [--scalar|--vector] & + &PARAMS.ini input_0000.h5 output_0000.h5 [--left|--right] [-x=100:200 -y=256:512 -z30:990] [--relative-velocity]" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "./flusi -p --convert-to-wing-system --scalar PARAMS.ini input_0000.h5 output_0000.h5 [--left|--right]" write(*,*) "./flusi -p --convert-to-body-system --scalar PARAMS.ini input_0000.h5 output_0000.h5" write(*,*) "./flusi -p --convert-to-wing-system --vector PARAMS.ini inx_0000.h5 iny_0000.h5 & - &inz_0000.h5 outx_0000.h5 outy_0000.h5 outz_0000.h5" + &inz_0000.h5 outx_0000.h5 outy_0000.h5 outz_0000.h5 [--left|--right]" write(*,*) "./flusi -p --convert-to-body-system --vector PARAMS.ini inx_0000.h5 iny_0000.h5 & &inz_0000.h5 outx_0000.h5 outy_0000.h5 outz_0000.h5" write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" @@ -50,15 +57,21 @@ subroutine convert_to_wing_system(help) write(*,*) "! We now want q(xw,yw,zw) in the wing coordinate system. The output field has the same" write(*,*) "! spacing dx,dx,dz as the input field, and the coordinates are " write(*,*) "! -xl/2 <= xw <= xl/2" - write(*,*) "! -yl/2 <= yw <= yl/2" + write(*,*) "! -yl/4 <= yw <= 3*yl/4" write(*,*) "! -zl/2 <= zw <= zl/2" write(*,*) "! " + write(*,*) "! --right --left chooses left or right wing, if --convert-to-wing-system. default is left wing" + write(*,*) "! " + write(*,*) "! if you pass one of -x100:200, only a subset with the bounds you specify will be computed." + write(*,*) "! This can speed up the computation significantly, provided you're interested only in narrow region" + write(*,*) "! around the wing. " + write(*,*) "! " write(*,*) "! For each of these points in the wing system, we compute the corresponding global coordinate" write(*,*) "! and interpolate the input field at this point. Note we require the PARAMS file to know what" write(*,*) "! motion protocoll to use for wings AND body. In the free-flight case, we require rigidsolidsolver.t to be present." write(*,*) "! The time is read from the input file." write(*,*) "! " - write(*,*) "! Note the wing span axis is y, while the chord ix x. z is wing normal." + write(*,*) "! Note the wing span axis is y, while the chord is x. z is wing normal." write(*,*) "! " write(*,*) "! Note: this routine can be used for vectors and scalars. The vectors are rotated to the new system as" write(*,*) "! well" @@ -75,18 +88,22 @@ subroutine convert_to_wing_system(help) ! do we deal with a vector or a scalar? call get_command_argument(3,infile) + if (infile == "--vector") then - vector = .true. - ! we allocate (and read) three components: - nd = 3 - if (root) write(*,'(A)') 'we run in vector mode (3 components)' + vector = .true. + ! we allocate (and read) three components: + nd = 3 + if (root) write(*,'(A)') 'we run in vector mode (3 components)' + elseif (infile == "--scalar") then - vector = .false. - ! routine applied to scalar, one field only - nd = 1 - if (root) write(*,'(A)') 'we run in scalar mode' + vector = .false. + ! routine applied to scalar, one field only + nd = 1 + if (root) write(*,'(A)') 'we run in scalar mode' + else - call abort(4556, "flag is unkown. --scalar or --vector") + call abort(4556, "flag is unkown. --scalar or --vector") + endif ! get filename of PARAMS file from command line @@ -118,7 +135,13 @@ subroutine convert_to_wing_system(help) endif ! initialize insect - call insect_init(time, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx) + call insect_init(time, infile, Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) + ! max color + if (Insect%second_wing_pair) then + endcolor = 5 + else + endcolor = 3 + endif !***************************************************************************** ! main (active) part of this postprocessing tool @@ -130,109 +153,211 @@ subroutine convert_to_wing_system(help) enddo ! call fetch attributes (even though we knew the resolution in advance) since we ! want to know what time the data is at - call fetch_attributes(infile,nx,ny,nz,xl,yl,zl,time,nu,origin) + call fetch_attributes(infile, nx, ny, nz, xl, yl, zl, time, nu, origin) ! synchronize ghosts (required for interpolation) u_interp(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),:) = u_org call synchronize_ghosts( u_interp, nd ) - ! check if user wants to go to body or wing coordinate system - call get_command_argument(2,infile) - if (infile == "--convert-to-wing-system") then - wing_system = .true. - if (root) write(*,*) "we convert to wing system" - else - wing_system = .false. - if (root) write(*,*) "we convert to body system" - endif - if (root) write(*,'("OPERATING AT TIME=",es15.8)') time - !----------------------------------------------------------------------------- ! fetch current motion state of the insect !----------------------------------------------------------------------------- + ! fetch insect state + call Update_Insect( time, Insect ) + if (Insect%BodyMotion == "free_flight") then - if (root) write(*,*) "The insects body motion is free_flight, therefore we try to read the" - if (root) write(*,*) "insect state vector from the file rigidsolidsolver.t" - if (root) write(*,*) "from the state vector we can construct the body rotation matrix" - call read_insect_STATE_from_file(time, Insect, 'rigidsolidsolver.t', .true.) + if (root) write(*,*) "The insects body motion is free_flight, therefore we try to read the" + if (root) write(*,*) "insect state vector from the file rigidsolidsolver.t" + if (root) write(*,*) "from the state vector we can construct the body rotation matrix" + call read_insect_STATE_from_file(time, Insect, 'rigidsolidsolver.t', .true.) endif + call BodyMotion (time, Insect) - call FlappingMotion_right (time, Insect) - call FlappingMotion_left (time, Insect) + idw = 1 + call FlappingMotionWrap (time, Insect, idw) + idw = 2 + call FlappingMotionWrap (time, Insect, idw) + if (Insect%second_wing_pair) then + idw = 3 + call FlappingMotionWrap (time, Insect, idw) + idw = 4 + call FlappingMotionWrap (time, Insect, idw) + endif call StrokePlane (time, Insect) call body_rotation_matrix( Insect, M_body ) call wing_right_rotation_matrix( Insect, M_wing_r ) call wing_left_rotation_matrix( Insect, M_wing_l ) + if (Insect%second_wing_pair) then + call wing_right2_rotation_matrix( Insect, M_wing_r2 ) + call wing_left2_rotation_matrix( Insect, M_wing_l2 ) + endif + + u_org = -9.9d10 + + nz1 = 0 + nz2 = nz-1 + ny1 = 0 + ny2 = ny-1 + nx1 = 0 + nx2 = nx-1 + + ! look for -x=A:B -y=A:B -z=A:B arguments (they can be all there or none) + do i = 1, nargs + call get_command_argument(i, infile) + if (index(infile,'-x=') /= 0) then + infile = infile( index(infile,'=')+1:len_trim(infile) ) + read (infile(1:index(infile,':')-1) ,*) nx1 + read (infile(index(infile,':',.true.)+1:len_trim(infile)),*) nx2 + endif + if (index(infile,'-y=') /= 0) then + infile = infile( index(infile,'=')+1:len_trim(infile) ) + read (infile(1:index(infile,':')-1) ,*) ny1 + read (infile(index(infile,':',.true.)+1:len_trim(infile)),*) ny2 + endif - do iz = 0,nz-1!ra(3), rb(3) - do iy = 0,ny-1!ra(2), rb(2) - do ix = 0,nx-1!ra(1), rb(1) - if (wing_system) then - ! define the position in the wing coordinate system (we seek for u in this - ! coordinate system, so our output matrix is to be understood in this) - x_wing = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl,yl,zl/)/2.d0 - ! compute global coordinate - x_glob = Insect%xc_body_g+ matmul(transpose(M_body), (matmul(transpose(M_wing_l),x_wing)+Insect%x_pivot_l_b) ) - else - ! transform to body system - x_body = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl,yl,zl/)/2.d0 - x_glob = Insect%xc_body_g + matmul(transpose(M_body), x_body) - endif - - ! periodization (note we cannot use periodize_coordinate as it is centeres around the midpoint) - if (x_glob(1)<0.d0) x_glob(1)=x_glob(1)+xl - if (x_glob(2)<0.d0) x_glob(2)=x_glob(2)+yl - if (x_glob(3)<0.d0) x_glob(3)=x_glob(3)+zl - - if (x_glob(1)>=xl-dx) x_glob(1)=x_glob(1)-xl - if (x_glob(2)>=yl-dy) x_glob(2)=x_glob(2)-yl - if (x_glob(3)>=zl-dz) x_glob(3)=x_glob(3)-zl - - ! interpolate the value - do i = 1,nd - u_buffer(ix,i) = trilinear_interp( (/dble(ga(1))*dx, dble(ga(2))*dy, dble(ga(3))*dz/), & - (/dx,dy,dz/),u_interp(:,:,:,i), x_glob, periodic=.false. ) - enddo + if (index(infile,'-z=') /= 0) then + infile = infile( index(infile,'=')+1:len_trim(infile) ) + read (infile(1:index(infile,':')-1) ,*) nz1 + read (infile(index(infile,':',.true.)+1:len_trim(infile)),*) nz2 + endif + + if (index(infile,"--relative-velocity") /= 0) relative_velocity = .true. + + if (index(infile,"--convert-to-wing-system") /= 0) wing_system = .true. + + if (index(infile,"--convert-to-body-system") /= 0) wing_system = .false. + + if (index(infile,"--left") /= 0 .or. index(infile,"--right") /= 0 .or. & + index(infile,"--left2") /= 0 .or. index(infile,"--right2") /= 0) then + whichwing = infile + endif + enddo + + if (root) then + write(*,'(40("~+"))') + write(*,'("OPERATING AT TIME=",es15.8)') time + write(*,*) "Computing on x=", nx1, nx2 + write(*,*) "Computing on y=", ny1, ny2 + write(*,*) "Computing on z=", nz1, nz2 + write(*,*) "Relative velocity: ", relative_velocity + if (wing_system) then + write(*,*) "we convert to wing system" + write(*,*) "Chosen wing is: "//trim(adjustl(whichwing)) + else + write(*,*) "we convert to body system" + endif + write(*,'(40("~+"))') + endif + + do iz = nz1, nz2 + do iy = ny1, ny2 + do ix = nx1, nx2 + if (wing_system) then + ! define the position in the wing coordinate system (we look for u in this + ! coordinate system, so our output matrix is to be understood in this) + x_wing = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl/2.0d0,yl/4.0d0,zl/2.0d0/) + ! x_wing = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl/2.0d0,yl/2.0d0,zl/2.0d0/) + + ! compute global coordinate + if (whichwing == "--right2") then + x_glob = Insect%xc_body_g+ matmul(transpose(M_body), & + (matmul(transpose(M_wing_r2),x_wing)+Insect%x_pivot_r2_b) ) + elseif (whichwing == "--left2") then + x_glob = Insect%xc_body_g+ matmul(transpose(M_body), & + (matmul(transpose(M_wing_l2),x_wing)+Insect%x_pivot_l2_b) ) + elseif (whichwing == "--right") then + x_glob = Insect%xc_body_g+ matmul(transpose(M_body), & + (matmul(transpose(M_wing_r),x_wing)+Insect%x_pivot_r_b) ) + else + x_glob = Insect%xc_body_g+ matmul(transpose(M_body), & + (matmul(transpose(M_wing_l),x_wing)+Insect%x_pivot_l_b) ) + endif + else + ! transform to body system + x_body = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl,yl,zl/)/2.d0 + x_glob = Insect%xc_body_g + matmul(transpose(M_body), x_body) + endif + + ! periodization (note we cannot use periodize_coordinate as it is centeres around the midpoint) + if (x_glob(1)<0.d0) x_glob(1)=x_glob(1)+xl + if (x_glob(2)<0.d0) x_glob(2)=x_glob(2)+yl + if (x_glob(3)<0.d0) x_glob(3)=x_glob(3)+zl + + if (x_glob(1)>=xl-dx) x_glob(1)=x_glob(1)-xl + if (x_glob(2)>=yl-dy) x_glob(2)=x_glob(2)-yl + if (x_glob(3)>=zl-dz) x_glob(3)=x_glob(3)-zl + + ! interpolate the value + do i = 1,nd + u_buffer(ix,i) = trilinear_interp( (/dble(ga(1))*dx, dble(ga(2))*dy, dble(ga(3))*dz/), & + (/dx,dy,dz/),u_interp(:,:,:,i), x_glob, periodic=.false. ) + enddo + enddo + + ! at this point, all procs have interpolated a value in u_buffer. most of them + ! are -9.9E10, which means the CPU does not have the data required for interpolation + call MPI_ALLREDUCE(u_buffer,u_buffer2,nx*nd,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,mpicode) + + ! now, all CPU have the line in x-direction with the properly interpolated values. however, + ! only one of them actually holds this data. NOw we note that in FLUSI, we never split + ! the x-coordinate, so this direction is ALWAYS contiguous + if ( on_proc( (/0,iy,iz/) ) ) then + ! only the responsible rank does this + u_org(:,iy,iz,1:nd) = u_buffer2 + end if enddo - ! at this point, all procs have interpolated a value in u_buffer. most of them - ! are -9.9E10, which means the CPU does not have the data required for interpolation - call MPI_ALLREDUCE(u_buffer,u_buffer2,nx*nd,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,mpicode) - ! now, all CPU have the line in x-direction with the properly interpolated values. however, - ! only one of them actually holds this data. NOw we note that in FLUSI, we never split - ! the x-coordinate, so this direction is ALWAYS contiguous - if ( on_proc( (/0,iy,iz/) ) ) then - ! only the responsible rank does this - u_org(:,iy,iz,1:nd) = u_buffer2 - end if - enddo enddo ! for some points, no value can be interpolated, since they do not exist ( happens for example at the corners) ! set 0 at these points: where (u_org < -9.0d10) - u_org = 0.d0 + u_org = 0.d0 end where ! for now, interpolation has been done, i.e. we rotated the camera. now, if we are dealing with a ! vector, this is not enough, since we do not only shift, but also rotate the individual vectors. ! this is done now: + if (vector) then - do iz = ra(3), rb(3) - do iy = ra(2), rb(2) - do ix = ra(1), rb(1) - u = (/u_org(ix,iy,iz,1), u_org(ix,iy,iz,2), u_org(ix,iy,iz,3)/) - if (wing_system) then - ! from global to wing system - u = matmul(M_wing_l, matmul(M_body,u)) - else - ! from global to body system - u = matmul(M_body, u) - endif - u_org(ix,iy,iz,1:3) = u - enddo + do iz = ra(3), rb(3) + do iy = ra(2), rb(2) + do ix = ra(1), rb(1) + ! velocity in global coordinate system + u = (/u_org(ix,iy,iz,1), u_org(ix,iy,iz,2), u_org(ix,iy,iz,3)/) + x_wing = (/ dble(ix)*dx, dble(iy)*dy, dble(iz)*dz /) - (/xl/2.0d0,yl/4.0d0,zl/2.0d0/) + + if (wing_system) then + ! go to wing system + if (whichwing == "--right2") then + u = matmul(M_wing_r2, matmul(M_body,u)) + rot_rel_wing_w = Insect%rot_rel_wing_r2_w + elseif (whichwing == "--left2") then + u = matmul(M_wing_l2, matmul(M_body,u)) + rot_rel_wing_w = Insect%rot_rel_wing_l2_w + elseif (whichwing == "--right") then + u = matmul(M_wing_r, matmul(M_body,u)) + rot_rel_wing_w = Insect%rot_rel_wing_r_w + else + u = matmul(M_wing_l, matmul(M_body,u)) + rot_rel_wing_w = Insect%rot_rel_wing_l_w + endif + + if (relative_velocity) then + ! if applied to us, i.e. the input vector is the solid body velociy, + ! then this line kills all velocity (plausibility test) + u_org(ix,iy,iz,1:3) = u - cross(rot_rel_wing_w, x_wing) + else + u_org(ix,iy,iz,1:3) = u + endif + else + ! go to body system + u_org(ix,iy,iz,1:3) = matmul(M_body, u) + endif + + enddo + enddo enddo - enddo endif diff --git a/src/postprocessing/pointcloud2mask.f90 b/src/postprocessing/pointcloud2mask.f90 index e64495d..7dd5d5c 100644 --- a/src/postprocessing/pointcloud2mask.f90 +++ b/src/postprocessing/pointcloud2mask.f90 @@ -13,7 +13,7 @@ subroutine pointcloud2mask(help) real(kind=pr) :: time, d0, smoothing type(inifile) :: PARAMS integer :: ntri, matrixlines, matrixcols, safety - + type(diptera) :: Insect if (help.and.root) then write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" @@ -38,6 +38,8 @@ subroutine pointcloud2mask(help) write(*,*) "! i.e. compute d = d-d0 and then compute the mask function mask(d). This was used in uCT data handling" write(*,*) "! in order to use an existing segmentation as a mask for the original data." write(*,*) "! " + write(*,*) "! " + write(*,*) "! " write(*,*) "! NOTE: we compute the mask ONLY near the surface, NOT in the interior of the body." write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" write(*,*) "Parallel: yes" @@ -111,6 +113,12 @@ subroutine pointcloud2mask(help) origin = 0.0d0 if (mode == "--minimal-domain") then + + ! There is several solutions now: + ! - keep the resolution specified in the call and adjust nx,ny,nz + ! - keep the number of points in the call and end up with dx /= dy /= dz + ! - keep the number of points the same in the best sampled direction, then adjust the other two resolutions accordingly. + ! right now, we're doing (c) if (root) write(*,*) "As you set --minimal-domain, I will ignore xl,yl,zl and create" if (root) write(*,*) "the smallest possible cube that contains your pointcloud. I will use" if (root) write(*,*) "the same resolution you specified in the call." @@ -122,6 +130,8 @@ subroutine pointcloud2mask(help) yl = maxval(points(:,2))-origin(2) + dble(safety)*dx zl = maxval(points(:,3))-origin(3) + dble(safety)*dx + dx = minval( (/xl/dble(nx), yl/dble(ny), zl/dble(nz)/) ) + nx = nint(xl/dx) ny = nint(yl/dx) nz = nint(zl/dx) @@ -162,6 +172,9 @@ subroutine pointcloud2mask(help) ! initialize code and domain decomposition, but do not use FFTs call decomposition_initialize() + call insect_init( 0.d0, "params_template_fsi.ini", Insect, .false., "", (/xl,yl,zl/), nu, dx, periodic=periodic) + + ! smoothing for mask function: if (nx/=1) then diff --git a/src/postprocessing/post_force.f90 b/src/postprocessing/post_force.f90 new file mode 100644 index 0000000..e0aaf09 --- /dev/null +++ b/src/postprocessing/post_force.f90 @@ -0,0 +1,112 @@ + +subroutine post_force(help) + use vars + use p3dfft_wrapper + use basic_operators + use module_helpers + use module_ini_files_parser_mpi + use penalization ! mask, and us array + use hdf5_wrapper + + implicit none + logical, intent(in) :: help + character(len=strlen) :: fname_mask, outfile, dummy + character(len=strlen), allocatable :: fname_us(:), fname_u(:) + real(kind=pr), dimension(:,:,:,:), allocatable :: u + real(kind=pr) :: time, tmp(1) + real(kind=pr), allocatable, DIMENSION(:) :: force + integer :: ncomponents, j, i + + if (help.and.root) then + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "./flusi -p --force --components 3 --mask mask_0000.h5 --us usx_000.h5 & + &[usy_00.h5] --u ux_00.h5 [uy_00.h5] -o forces.txt" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "Parallel: Yes" + return + endif + + + ! fetch parameters from command line call + do i = 1, COMMAND_ARGUMENT_COUNT() + call get_command_argument(i,dummy) + + select case (dummy) + case ("--mask") + call get_command_argument(i+1, fname_mask) + if (root) write(*,*) "mask function read from=", fname_mask + call check_file_exists(fname_mask) + + case ("--us") + do j = 1, ncomponents + call get_command_argument(i+j, fname_us(j)) + call check_file_exists(fname_us(j)) + enddo + if (root) write(*,*) "solid velocity fields=", fname_us + + case ("--u") + do j = 1, ncomponents + call get_command_argument(i+j, fname_u(j)) + call check_file_exists(fname_u(j)) + enddo + if (root) write(*,*) "velocity fields=", fname_u + + case ("-o") + call get_command_argument(i+1,outfile) + if (root) write(*,*) "will write output to=", outfile + + case ("--components") + call get_command_argument(i+1,dummy) + read(dummy,*) ncomponents + + if (root) write(*,*) "Expect ncomponents=", ncomponents + + allocate(fname_us(1:ncomponents)) + allocate(fname_u(1:ncomponents)) + allocate(force(1:ncomponents)) + + end select + enddo + + ! get file size etc + call fetch_attributes( fname_mask, nx, ny, nz, xl, yl, zl, time, nu, origin ) + ! fetch value of penalization parameter from mask file. It should be stored + ! there for every version of flusi. Note we do not need to divide by eps here, since + ! this is done in RHS. It is the first time we need + ! the epsi parameter since 2014 (now is 2018), so it was not included in + ! fetch_attributes + call read_attribute( fname_mask, "mask", "epsi", tmp) + eps = tmp(1) + if (root) write(*,*) "penalization parameter is eps=", eps + ! initialization parallel module (no FFTS) + call decomposition_initialize() + + allocate( u( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:3 ) ) + allocate( us( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3),1:3 ) ) + allocate( mask( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3) ) ) + ! allocate( mask_color( ra(1):rb(1),ra(2):rb(2),ra(3):rb(3) ) ) + + call read_single_file( fname_mask, mask ) + do j = 1, ncomponents + call read_single_file( fname_u(j), u(:,:,:,j) ) + call read_single_file( fname_us(j), us(:,:,:,j) ) + enddo + + mask = mask / eps + + do j = 1, ncomponents + force(j) = sum( mask*(u(:,:,:,j)-us(:,:,:,j)) ) + enddo + + call MPI_ALLREDUCE(MPI_IN_PLACE, force, ncomponents, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, i) + + force = force * dx*dy*dz + + if (root) then + write(*,*) 'writing temporal coefficients ', outfile + open(14, file=outfile, status='replace') + write(14,'(10(es15.8,1x))') time, force + close(14) + end if +end subroutine diff --git a/src/postprocessing/postprocessing.f90 b/src/postprocessing/postprocessing.f90 index f5a8f12..da104ad 100644 --- a/src/postprocessing/postprocessing.f90 +++ b/src/postprocessing/postprocessing.f90 @@ -37,6 +37,10 @@ subroutine postprocessing() ! check what to do !----------------- select case (postprocessing_mode) + case ("--force") + call post_force(help) + case ("--POD") + call POD(help) case ("--divergence") call post_div(help) case ("--flexible-wing-mask") @@ -146,6 +150,7 @@ subroutine postprocessing() write(*,*) "--extract-subset" write(*,*) "--field-analysis" write(*,*) "--force-decomp" + write(*,*) "--force" write(*,*) "--flexible-wing-mask" write(*,*) "--gradient" write(*,*) "--hdf2bin" @@ -156,6 +161,7 @@ subroutine postprocessing() write(*,*) "--mean-2D" write(*,*) "--mean-over-x-subdomain" write(*,*) "--p2Q" + write(*,*) "--POD" write(*,*) "--pointcloud2mask" write(*,*) "--pressure-force" write(*,*) "--pressure" @@ -497,8 +503,8 @@ subroutine ux_from_uyuz(help) call read_single_file ( fname_uy, u(:,:,:,2) ) call read_single_file ( fname_uz, u(:,:,:,3) ) - call fft (uk(:,:,:,2),u(:,:,:,2)) - call fft (uk(:,:,:,3),u(:,:,:,3)) + call fft(u(:,:,:,2), uk(:,:,:,2)) + call fft(u(:,:,:,3), uk(:,:,:,3)) call dealias(uk(:,:,:,2)) call dealias(uk(:,:,:,3)) @@ -521,7 +527,7 @@ subroutine ux_from_uyuz(help) enddo enddo call dealias(uk(:,:,:,1)) - call ifft (u(:,:,:,1),uk(:,:,:,1)) + call ifft(uk(:,:,:,1), u(:,:,:,1)) ! call fft (inx=u(:,:,:,1),outk=uk(:,:,:,1)) ! call ifft (u(:,:,:,1),uk(:,:,:,1)) diff --git a/src/postprocessing/stl2dist.f90 b/src/postprocessing/stl2dist.f90 index 692f67a..5734fa4 100644 --- a/src/postprocessing/stl2dist.f90 +++ b/src/postprocessing/stl2dist.f90 @@ -1,150 +1,155 @@ subroutine stl2dist(help) - use vars - use module_helpers - use stl_file_reader - use p3dfft_wrapper - implicit none - logical, intent(in) :: help - character(len=strlen) :: stlfile, outfile, mode, dummy, flag - real(kind=pr),dimension(:,:),allocatable :: triangles,normals - real(kind=pr),dimension(:,:,:),allocatable :: work - real(kind=pr) :: time, scale - integer :: ntri - - - if (help.and.root) then - write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - write(*,*) "./flusi -p --stl2dist infile.stl outfile_000.h5 NORMALIZATION x0 y0 z0 xl yl zl nx ny nz FLAG safety" - write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - write(*,*) "! read an *.stl file and compute the signed distance function for it" - write(*,*) "! the NORMALIZATION flag can be either --lx, --ly, --lz or --scale=123.0" - write(*,*) "! in the latter case, you give the normalization scale directly" - write(*,*) "! " - write(*,*) "! origin is specified as coordinates" - write(*,*) "! output hdf5 field has box size xl,yl,zl and resolution nx,ny,nz" - write(*,*) "! " - write(*,*) "! Note *.stl files do not contain dimensions" - write(*,*) "! " - write(*,*) "! FLAG can be --everywhere or --surface. in the latter last flag safety is nearness to interface" - write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - write(*,*) "Parallel: yes" - return - endif - - call get_command_argument(3,stlfile) - call get_command_argument(4,outfile) - call get_command_argument(5,mode) - call get_command_argument(6,dummy) - read(dummy,*) x0 - call get_command_argument(7,dummy) - read(dummy,*) y0 - call get_command_argument(8,dummy) - read(dummy,*) z0 - call get_command_argument(9,dummy) - read(dummy,*) xl - call get_command_argument(10,dummy) - read(dummy,*) yl - call get_command_argument(11,dummy) - read(dummy,*) zl - call get_command_argument(12,dummy) - read(dummy,*) nx - call get_command_argument(13,dummy) - read(dummy,*) ny - call get_command_argument(14,dummy) - read(dummy,*) nz - call get_command_argument(15,flag) - - if (mode(1:8)=="--scale=") then - read(mode(9:80),*) scale - mode = "--scale" - endif - - if (root) then - write(*,'(80("~"))') - write(*,*) "Reading stl file="//trim(adjustl(stlfile)) - write(*,*) "Writing signe distance to file="//trim(adjustl(outfile)) - write(*,'("nx=",i5," ny=",i5," nz=",i5)') nx,ny,nz - write(*,'("xl=",g12.4," yl=",g12.4," zl=",g12.4)') xl,yl,zl - write(*,'("x0=",g12.4," y0=",g12.4," z0=",g12.4)') x0,y0,z0 - write(*,'(80("~"))') - endif - - ! read stl file and normalize it according to the criteria specified in the - ! command line call - call check_file_exists(stlfile) - call read_stl_file(stlfile, ntri, triangles, normals) - call normalize_stl_file(ntri, triangles, mode, scale) - - time=0.d0 - ! initialize code and domain decomposition, but do not use FFTs - call decomposition_initialize() - - allocate(work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3))) - - if (trim(adjustl(flag))=="--surface") then - if (root) write(*,*) "...computing distance only near fluid-solid interface" - ! compute signed distance function on all grid points - call signed_distance_from_triangles_surface(ntri, triangles, normals, work) - - elseif (trim(adjustl(flag))=="--everywhere") then - if (root) write(*,*) "...computing distance everywhere in eulerian grid" - ! compute signed distance function on all grid points - call signed_distance_from_triangles_everywhere(ntri, triangles, normals, work) - - endif - - ! save result to file - call save_field_hdf5 ( time, outfile, work ) - - ! finalize - deallocate (work) - call fft_free() + use vars + use module_helpers + use stl_file_reader + use p3dfft_wrapper + implicit none + logical, intent(in) :: help + character(len=strlen) :: stlfile, outfile, mode, dummy, flag + real(kind=pr),dimension(:,:),allocatable :: triangles,normals + real(kind=pr),dimension(:,:,:),allocatable :: work + real(kind=pr) :: time, scale + integer :: ntri + integer :: mpierror + + + if (help.and.root) then + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "./flusi -p --stl2dist infile.stl outfile_000.h5 NORMALIZATION x0 y0 z0 xl yl zl nx ny nz FLAG safety" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "! read an *.stl file and compute the signed distance function for it" + write(*,*) "! the NORMALIZATION flag can be either --lx, --ly, --lz or --scale=123.0" + write(*,*) "! in the latter case, you give the normalization scale directly" + write(*,*) "! " + write(*,*) "! origin is specified as coordinates" + write(*,*) "! output hdf5 field has box size xl,yl,zl and resolution nx,ny,nz" + write(*,*) "! " + write(*,*) "! Note *.stl files do not contain dimensions" + write(*,*) "! " + write(*,*) "! FLAG can be --everywhere or --surface. in the latter last flag safety is nearness to interface" + write(*,*) "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + write(*,*) "Parallel: yes" + return + endif + + call get_command_argument(3,stlfile) + call get_command_argument(4,outfile) + call get_command_argument(5,mode) + call get_command_argument(6,dummy) + read(dummy,*) x0 + call get_command_argument(7,dummy) + read(dummy,*) y0 + call get_command_argument(8,dummy) + read(dummy,*) z0 + call get_command_argument(9,dummy) + read(dummy,*) xl + call get_command_argument(10,dummy) + read(dummy,*) yl + call get_command_argument(11,dummy) + read(dummy,*) zl + call get_command_argument(12,dummy) + read(dummy,*) nx + call get_command_argument(13,dummy) + read(dummy,*) ny + call get_command_argument(14,dummy) + read(dummy,*) nz + call get_command_argument(15,flag) + + if (mode(1:8)=="--scale=") then + read(mode(9:80),*) scale + mode = "--scale" + endif + + if (root) then + write(*,'(80("~"))') + write(*,*) "Reading stl file="//trim(adjustl(stlfile)) + write(*,*) "Writing signe distance to file="//trim(adjustl(outfile)) + write(*,'("nx=",i5," ny=",i5," nz=",i5)') nx,ny,nz + write(*,'("xl=",g12.4," yl=",g12.4," zl=",g12.4)') xl,yl,zl + write(*,'("x0=",g12.4," y0=",g12.4," z0=",g12.4)') x0,y0,z0 + write(*,'(80("~"))') + endif + + ! read stl file and normalize it according to the criteria specified in the + ! command line call + call check_file_exists(stlfile) + call read_stl_file(stlfile, ntri, triangles, normals) + call normalize_stl_file(ntri, triangles, mode, scale) + + time = 0.d0 + ! initialize code and domain decomposition, but do not use FFTs + call decomposition_initialize(.true.) + + allocate(work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3))) + + if (trim(adjustl(flag))=="--surface") then + if (root) write(*,*) "...computing distance only near fluid-solid interface" + + ! compute signed distance function on all grid points + call signed_distance_from_triangles_surface(ntri, triangles, normals, work) + + elseif (trim(adjustl(flag))=="--everywhere") then + if (root) write(*,*) "...computing distance everywhere in eulerian grid" + + ! compute signed distance function on all grid points + call signed_distance_from_triangles_everywhere(ntri, triangles, normals, work) + + endif + + call MPI_barrier(MPI_COMM_WORLD, mpierror) + + ! save result to file + call save_field_hdf5 ( time, outfile, work ) + + ! finalize + deallocate (work) + call fft_free() end subroutine ! this the routine that does the actual job of computing the signed distance ! for the eulerian grid. it does so everywhere without any consideration subroutine signed_distance_from_triangles_everywhere(ntri, triangles, normals, work) - use vars - use stl_file_reader ! for the function distance to triangle - implicit none - integer, intent(in) :: ntri - real(kind=pr),dimension(1:3,3*ntri),intent(in):: triangles - real(kind=pr),dimension(1:3,ntri),intent(in):: normals - real(kind=pr),intent(inout):: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) - - integer :: ix,iy,iz,i,ivertex - real(kind=pr) :: x,y,z,dists,tmp - - ! initialize - work = 10.0d10 - - do iz=ra(3),rb(3) - do iy=ra(2),rb(2) - do ix=ra(1),rb(1) - x = dx*dble(ix) - y = dy*dble(iy) - z = dz*dble(iz) - dists = 9.0d9 - - ! for each eulerian grid point, check all triangles. this is horribly - ! inefficient, but any more clever method requires a lot of thinking - ! to be generally applicable - do i = 1,ntri - ivertex = 3*i - 2 - ! the distance to the current triangle: - tmp = pointTriangleDistance(triangles(:,ivertex),triangles(:,ivertex+1),& - triangles(:,ivertex+2),(/x,y,z/),normals(:,i) ) - ! if closer (in abs value!) then use this now - if ( dabs(tmp) < dabs(dists)) then - dists = tmp - endif + use vars + use stl_file_reader ! for the function distance to triangle + implicit none + integer, intent(in) :: ntri + real(kind=pr),dimension(1:3,3*ntri),intent(in):: triangles + real(kind=pr),dimension(1:3,ntri),intent(in):: normals + real(kind=pr),intent(inout):: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) + + integer :: ix,iy,iz,i,ivertex + real(kind=pr) :: x,y,z,dists,tmp + + ! initialize + work = 10.0d10 + + do iz=ra(3),rb(3) + do iy=ra(2),rb(2) + do ix=ra(1),rb(1) + x = dx*dble(ix) + y = dy*dble(iy) + z = dz*dble(iz) + dists = 9.0d9 + + ! for each eulerian grid point, check all triangles. this is horribly + ! inefficient, but any more clever method requires a lot of thinking + ! to be generally applicable + do i = 1,ntri + ivertex = 3*i - 2 + ! the distance to the current triangle: + tmp = pointTriangleDistance(triangles(:,ivertex),triangles(:,ivertex+1),& + triangles(:,ivertex+2),(/x,y,z/),normals(:,i) ) + ! if closer (in abs value!) then use this now + if ( dabs(tmp) < dabs(dists)) then + dists = tmp + endif + enddo + ! store value in array + work(ix,iy,iz) = dists + enddo enddo - ! store value in array - work(ix,iy,iz) = dists - enddo enddo - enddo end subroutine signed_distance_from_triangles_everywhere @@ -154,98 +159,68 @@ end subroutine signed_distance_from_triangles_everywhere ! this the routine that does the actual job of computing the signed distance ! for the eulerian grid. it does so everywhere without any consideration subroutine signed_distance_from_triangles_surface(ntri, triangles, normals, work) - use vars - use module_helpers - use stl_file_reader ! for the function distance to triangle - implicit none - integer, intent(in) :: ntri - real(kind=pr),dimension(1:3,3*ntri),intent(in):: triangles - real(kind=pr),dimension(1:3,ntri),intent(in):: normals - real(kind=pr),intent(inout):: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) - - integer :: ix,iy,iz,i,ivertex,xmin,xmax,ymin,ymax,zmin,zmax,safety,mpicode - real(kind=pr) :: x,y,z,dists,tmp - character(len=80) :: flag - - call get_command_argument(16,flag) - ! initialize - work = 0.d0 - read(flag,*) safety - - if (root) write(*,*) "safety distance is ",safety - - ivertex = 1 - - ! stage I: mark "interesting" points. we mark the volume (cube) spanned - ! by each triangle with a negative number - do i = 1,ntri - xmin = floor( minval( triangles(1,ivertex:ivertex+2) ) /dx) -safety - ymin = floor( minval( triangles(2,ivertex:ivertex+2) ) /dy) -safety - zmin = floor( minval( triangles(3,ivertex:ivertex+2) ) /dz) -safety - - xmax = ceiling( maxval( triangles(1,ivertex:ivertex+2) ) /dx)+safety - ymax = ceiling( maxval( triangles(2,ivertex:ivertex+2) ) /dy)+safety - zmax = ceiling( maxval( triangles(3,ivertex:ivertex+2) ) /dz)+safety - - xmin = max(xmin,ra(1)) - ymin = max(ymin,ra(2)) - zmin = max(zmin,ra(3)) - - xmax = min(xmax,rb(1)) - ymax = min(ymax,rb(2)) - zmax = min(zmax,rb(3)) - ivertex = ivertex + 3 - work ( xmin:xmax,ymin:ymax,zmin:zmax ) = 1.d0 - end do - - ! inform about load balancing. it is a big pity that, since only a subvolume - ! will be concerned, load balancing can be very poor. the indication is that - ! many cpu do not have any points to treat, while few of them have the entire - ! load to carry. overloading (more proc than CPU) might help - if (root) write(*,*) "note load balancing problems might occur!" - call MPI_barrier (MPI_COMM_world, mpicode) - ! show how many points this rank will have to treat - write(*,'("rank=",i4," npoints=", i8," (",i3,"%)")') mpirank, nint(sum(work)),& - 100*nint(sum(work))/( (rb(1)-ra(1)+1)*(rb(2)-ra(2)+1)*(rb(3)-ra(3)+1) ) - call MPI_barrier (MPI_COMM_world, mpicode) - - - ! inform how many points are globally concerned with computing the signed distance - tmp = mpisum( sum(work) ) - if (root) then - write(*,'("dist will be generated only near interface, concerning ",i3"% of & - &total points")') nint(100.d0*tmp/dble(nx*ny*nz)) - endif - - ! compute signed distance for marked points - do iz=ra(3),rb(3) - do iy=ra(2),rb(2) - do ix=ra(1),rb(1) - x = dx*dble(ix) - y = dy*dble(iy) - z = dz*dble(iz) - dists = 9.0d9 - - ! is the point previously marked as interesting? - if (work(ix,iy,iz) > 0.d0) then - ! for each eulerian grid point, check all triangles. this is horribly - ! inefficient, but any more clever method requires a lot of thinking - ! to be generally applicable - do i = 1,ntri - ivertex = 3*i - 2 - ! the distance to the current triangle: - tmp = pointTriangleDistance(triangles(:,ivertex),triangles(:,ivertex+1),& - triangles(:,ivertex+2),(/x,y,z/),normals(:,i) ) - ! if closer (in abs value!) then use this now - if ( dabs(tmp) < dabs(dists)) then - dists = tmp - endif - enddo - ! store value in array - work(ix,iy,iz) = dists - endif - enddo - enddo - enddo + use vars + use module_helpers + use stl_file_reader ! for the function distance to triangle + implicit none + integer, intent(in) :: ntri + real(kind=pr),dimension(1:3,3*ntri),intent(in):: triangles + real(kind=pr),dimension(1:3,ntri),intent(in):: normals + real(kind=pr),intent(inout):: work(ra(1):rb(1),ra(2):rb(2),ra(3):rb(3)) + + integer :: ix,iy,iz,i,ivertex,xmin,xmax,ymin,ymax,zmin,zmax,safety,mpicode + real(kind=pr) :: x,y,z,dists,tmp + character(len=80) :: flag + + call get_command_argument(16,flag) + read(flag,*) safety + write(*,*) "safety distance is ", safety + write(*,*) "number of triangles is ", ntri + + ! initialize + work = 7.0d9 + + do i = 1, ntri + ivertex = 3*i - 2 + + xmin = floor( minval( triangles(1,ivertex:ivertex+2) ) /dx) -safety + ymin = floor( minval( triangles(2,ivertex:ivertex+2) ) /dy) -safety + zmin = floor( minval( triangles(3,ivertex:ivertex+2) ) /dz) -safety + + xmax = ceiling( maxval( triangles(1,ivertex:ivertex+2) ) /dx)+safety + ymax = ceiling( maxval( triangles(2,ivertex:ivertex+2) ) /dy)+safety + zmax = ceiling( maxval( triangles(3,ivertex:ivertex+2) ) /dz)+safety + + xmin = max(xmin,ra(1)) + ymin = max(ymin,ra(2)) + zmin = max(zmin,ra(3)) + + xmax = min(xmax,rb(1)) + ymax = min(ymax,rb(2)) + zmax = min(zmax,rb(3)) + + do iz = zmin, zmax + z = dz*dble(iz) + do iy = ymin, ymax + y = dy*dble(iy) + do ix = xmin, xmax + x = dx*dble(ix) + + ! the distance to the current triangle: + tmp = pointTriangleDistance( triangles(:,ivertex),triangles(:,ivertex+1),& + triangles(:,ivertex+2), (/x,y,z/), normals(:,i) ) + + ! write(*,*) tmp + + if (abs(tmp)= 0.d0) then + if (t >= 0.d0) then pointTriangleDistance = dsqrt(sqrDistance) - ! else - ! pointTriangleDistance = -dsqrt(sqrDistance) - ! endif + else + pointTriangleDistance = -dsqrt(sqrDistance) + endif end function diff --git a/src/time_step.f90 b/src/time_step.f90 index 51189c6..b21e8a7 100644 --- a/src/time_step.f90 +++ b/src/time_step.f90 @@ -1,11 +1,13 @@ subroutine time_step(time,dt0,dt1,n0,n1,it,u,uk,nlk,vort,work,workc,explin,& - press,scalars,scalars_rhs,params_file,Insect,beams) + press,scalars,scalars_rhs,params_file,Insect,beams,wings) use mpi use vars use p3dfft_wrapper use solid_model + use flexible_model use module_insects use slicing + implicit none integer :: inter @@ -29,10 +31,11 @@ subroutine time_step(time,dt0,dt1,n0,n1,it,u,uk,nlk,vort,work,workc,explin,& real(kind=pr),intent(inout)::scalars(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars) real(kind=pr),intent(inout)::scalars_rhs(ga(1):gb(1),ga(2):gb(2),ga(3):gb(3),1:n_scalars,0:nrhs-1) + type(flexible_wing),dimension(1:nWings), intent(inout) :: Wings type(solid), dimension(1:nBeams),intent(inout) :: beams type(diptera), intent(inout) :: Insect logical :: continue_timestepping - t1=MPI_wtime() + t1 = MPI_wtime() ! first backup is in "truntime" hours truntimenext = truntime @@ -43,7 +46,7 @@ subroutine time_step(time,dt0,dt1,n0,n1,it,u,uk,nlk,vort,work,workc,explin,& ! nlk(:,:,:,:,n0) when retaking a backup) (if not resuming a backup) if (index(inicond,'backup::')==0) then if (root) write(*,*) "Initial output of integral quantities...." - call write_integrals(time,uk,u,vort,nlk(:,:,:,:,n0),work,scalars,Insect,beams) + call write_integrals(time,uk,u,vort,nlk(:,:,:,:,n0),work,scalars,Insect,beams,Wings) endif @@ -52,8 +55,8 @@ subroutine time_step(time,dt0,dt1,n0,n1,it,u,uk,nlk,vort,work,workc,explin,& !----------------------------------------------------------------------------- if (root) write(*,*) "Start time-stepping...." do while ((time=a .and. (1-i<=b)) then + h(i) = (-1.0d0)**(1.0d0-dble(i)) * g(1-i) + endif + enddo + + end subroutine ! one-dimensional, periodized filter diff --git a/tests/job_unittest_da.sh b/tests/job_unittest_da.sh new file mode 100755 index 0000000..860bfad --- /dev/null +++ b/tests/job_unittest_da.sh @@ -0,0 +1,17 @@ +#!/bin/bash +#PBS -N unittest +#PBS -q l +#PBS -b 1 +#PBS -l elapstim_req=2:00:00 +#PBS -l cpunum_job=1 +#PBS -l memsz_job=10gb + +cd $PBS_O_WORKDIR + +export mpi_command="mpirun -f ${NQSII_MPINODES} -ppn 40 -np 4" +export mpi_serial="mpirun -f ${NQSII_MPINODES} -ppn 40 -np 1" + +./unittest.sh + +# Run as +# qsub job_test.sh diff --git a/tests/tests_data.tar.gz b/tests/tests_data.tar.gz index 903feb4..a709ceb 100644 Binary files a/tests/tests_data.tar.gz and b/tests/tests_data.tar.gz differ