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