[
  {
    "path": ".gitignore",
    "content": "*.o\n*.dep\nlog_*\nlog.*\n*~\n\n"
  },
  {
    "path": "COPYING",
    "content": "-------------------------------------------------------------------------\n\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n-------------------------------------------------------------------------\n"
  },
  {
    "path": "DISCLAIMER",
    "content": "Parts of the code uses OpenFOAM® technology. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.\n\nDetailed information on the OpenFOAM trademark can be found at\n\n - http://www.openfoam.com/legal/trademark-policy.php\n - http://www.openfoam.com/legal/trademark-guidelines.php\n \nFor further information on OpenCFD and OpenFOAM, please refer to \n\n - http://www.openfoam.com\n"
  },
  {
    "path": "README.md",
    "content": "<div align =\"center\">\n\n<p float=\"left\">\n  <img src=\"doc/cfdem_logo.jpg\" width=\"300\" />\n  <img src=\"doc/cfdem_logo2.png\" width=\"300\" /> \n</p>\n  \n</div>\n\n## The extended version of CFDEM®coupling is constantly developed and maintained by DCS Computing GmbH - you can find more information [here](https://www.aspherix-dem.com/software/cfdemcoupling-functionalities/)\n\nThis repository contains older, publicly available versions of CFDEM®coupling (referred to as \"CFDEM®coupling-PUBLIC\").\nThis repository has last been updated for CFDEMcoupling-PUBLIC to be compatible with OpenFOAM-6 ensuring\nfunctionality on Ubuntu 22.04 and 24.04.\nWhile this update contains some bugfixes and improvements, the main intention of this\nupdate is keeping CFDEMcoupling usable also on newer systems where the compilation of\nolder OpenFOAM versions may prove difficult.\nThis repository will not be updated in the foreseeable future.\n\nCFDEM®coupling-PUBLIC is compatible with [LIGGGHTS-PUBLIC](https://github.com/CFDEMproject/LIGGGHTS-PUBLIC).\n\nThe extended version of CFDEM®coupling is compatible with the DEM software [Aspherix®](https://www.aspherix-dem.com/), the \"successor\" of LIGGGHTS® developed and distributed by DCS Computing GmbH, Linz, Austria.\n\n</div>\n\n## CFDEM®coupling-PUBLIC\n\nCFDEM®coupling-PUBLIC is an Open Source coupled CFD-DEM framework combining the strengths of LIGGGHTS® DEM code and the Open Source CFD package OpenFOAM® [^1]. CFDEM®coupling stands for Computational Fluid Dynamics (CFD) - Discrete Element Method (DEM) coupling.\n\nLIGGGHTS® and CFDEM® are registered trade marks of DCS Computing GmbH, the producer of the LIGGGHTS® software and the CFDEM®coupling software; see http://www.cfdem.com/terms-trademark-policy for details.\n\nCFDEM®coupling-PUBLIC  is open-source, distributed under the terms of the GNU Public License, version 3 or later. CFDEM®coupling-PUBLIC is part of CFDEM®project: www.liggghts.com | www.cfdem.com. Core developer and main author: Christoph Goniva, christoph.goniva@dcs-computing.com\n\n[^1]: This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM® and OpenCFD® trade marks.\n\n</div>\n\n## Features\n\n* Modular approach that allows users to easily implement new models\n* MPI parallelization that enables to use it for large scale problems\n* The \"forum\" (www.cfdem.com) on CFD-DEM gives the possibility to exchange with other users / developers\n* The use of GIT allows to easily update to the latest version\n* Basic documentation is provided\n\nIn this toolbox the particle representation within the CFD solver is organized by \"cloud\" classes. Key functionalities are organised in sub-models (e.g. force models, data exchange models, etc.), which can easily be selected and combined by dictionary settings.\n\n</div>\n\n## Structure\nThe CFDEM®coupling-PUBLIC distribution includes the following files and directories:\n\n* `README`: this file\n* `COPYING`: the GNU General Public License (GPL) file\n* `DISCLAIMER`\n* `src`: directory including the source files of the coupling toolbox and models\n* `applications`: directory including the solver files for coupled CFD-DEM simulations\n* `doc`: directory including the documentation of CFDEM®coupling\n* `tutorials`: directory including basic tutorial cases showing the functionality\n\nDetails on installation are given on the www.cfdem.com website.\n\n</div>\n\n## License\n\nCFDEM®coupling-PUBLIC 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.\n\nCFDEM®coupling is distributed in the hope that it will be useful, but **without any warranty**; without even the implied warranty of **merchantabiity** or **fitness for a particular purpouse**; see the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with CFDEM®coupling-PUBLIC; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n\n</div>\n\n## Copyrights\n* Copyright 2012-now: DCS Computing GmbH, Linz\n* Copyright 2009-2015: JKU Linz\n\nSome parts of CFDEM®coupling are based on OpenFOAM® and Copyright on these parts is held by the OpenFOAM® Foundation (www.openFoam.org) and potentially other parties. Some parts of CFDEMcoupling are contributied by other parties, which are holding the Copyright. This is listed in each file of the distribution.\n\n## How to cite CFDEM®coupling-PUBLIC\nIf you are using PhasicFlow in your research or industrial work, cite the following [article](https://doi.org/10.1016/j.partic.2012.05.002):\n```\n@article{goniva2012influence,\n  title={Influence of rolling friction on single spout fluidized bed simulation},\n  author={Goniva, Christoph and Kloss, Christoph and Deen, Niels G and Kuipers, Johannes AM and Pirker, Stefan},\n  journal={Particuology},\n  volume={10},\n  number={5},\n  pages={582--591},\n  year={2012},\n  publisher={Elsevier}\n}\n```\n"
  },
  {
    "path": "applications/solvers/cfdemSolverIB/Make/files",
    "content": "cfdemSolverIB.C\n\nEXE=$(CFDEM_APP_DIR)/cfdemSolverIB\n"
  },
  {
    "path": "applications/solvers/cfdemSolverIB/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_solver\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/sampling/lnInclude \\\n    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\nEXE_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -ldynamicFvMesh \\\n    -ldynamicMesh \\\n    -l$(CFDEM_LIB_NAME) \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_LIBS)\n\n"
  },
  {
    "path": "applications/solvers/cfdemSolverIB/cfdemSolverIB.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    cfdemSolverIB\n\nDescription\n    Transient solver for incompressible flow.\n    The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6, \n    where additional functionality for CFD-DEM coupling using immersed body\n    (fictitious domain) method is added.\nContributions\n    Alice Hager\n\\*---------------------------------------------------------------------------*/\n\n\n#include \"fvCFD.H\"\n#include \"singlePhaseTransportModel.H\"\n#include \"OFversion.H\"\n\n#if defined(version30)\n    #include \"turbulentTransportModel.H\"\n    #include \"pisoControl.H\"\n#else\n    #include \"turbulenceModel.H\"\n#endif\n#include \"cfdemCloudIB.H\"\n#if defined(superquadrics_IB_flag)\n#include \"cfdemCloudIBSuperquadric.H\"\n#endif\n#include \"implicitCouple.H\"\n\n#include \"averagingModel.H\"\n#include \"voidFractionModel.H\"\n\n#include \"dynamicFvMesh.H\"\n\n#include \"cellSet.H\"\n\n#if defined(version22)\n    #include \"meshToMeshNew.H\"\n    #include \"fvIOoptionList.H\"\n#endif\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    #include \"setRootCase.H\"\n\n    #include \"createTime.H\"\n\n    #include \"createDynamicFvMesh.H\"\n\n    #if defined(version30)\n        pisoControl piso(mesh);\n        #include \"createTimeControls.H\"\n    #endif\n\n    #include \"createFields.H\"\n\n    #include \"initContinuityErrs.H\"\n\n    #if defined(version22)\n        #include \"createFvOptions.H\"\n    #endif\n\n    // create cfdemCloud\n    #include \"readGravitationalAcceleration.H\"\n    #if defined(superquadrics_IB_flag)\n        cfdemCloudIBSuperquadric particleCloud(mesh);\n    #else\n        cfdemCloudIB particleCloud(mesh);\n    #endif\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n    Info<< \"\\nStarting time loop\\n\" << endl;\n\n    while (runTime.loop())\n    {\n        Info<< \"Time = \" << runTime.timeName() << nl << endl;\n\n        //=== dyM ===================\n        interFace = mag(mesh.lookupObject<volScalarField>(\"voidfractionNext\"));\n        particleCloud.setMeshHasUpdatedFlag(mesh.update()); //dyM\n\n        #if defined(version30)\n            #include \"readTimeControls.H\"\n            #include \"CourantNo.H\"\n            #include \"setDeltaT.H\"\n        #else\n            #include \"readPISOControls.H\"\n            #include \"CourantNo.H\"\n        #endif\n\n        // do particle stuff\n        Info << \"- evolve()\" << endl;\n        particleCloud.evolve(voidfraction, interFace);\n\n        // Pressure-velocity PISO corrector\n        if(particleCloud.solveFlow())\n        {\n            // Momentum predictor\n\n            fvVectorMatrix UEqn\n            (\n                fvm::ddt(U) //fvm::ddt(voidfraction,U)\n              + fvm::div(phi, U)\n              + turbulence->divDevReff(U)\n                #if defined(version22)\n                ==\n                fvOptions(U)\n                #endif\n            );\n\n            UEqn.relax();\n\n            #if defined(version22)\n            fvOptions.constrain(UEqn);\n            #endif\n\n            #if defined(version30)\n                if (piso.momentumPredictor())\n            #else\n                if (momentumPredictor)\n            #endif\n            {\n                solve(UEqn == -fvc::grad(p));\n            }\n\n            // --- PISO loop\n            #if defined(version30)\n                while (piso.correct())\n            #else\n                for (int corr=0; corr<nCorr; corr++)\n            #endif\n            {\n                volScalarField rUA = 1.0/UEqn.A();\n                surfaceScalarField rUAf(fvc::interpolate(rUA));\n\n                U = rUA*UEqn.H();\n                #ifdef version23\n                phi = (fvc::interpolate(U) & mesh.Sf())\n                    + rUAf*fvc::ddtCorr(U, phi);\n                #else\n                phi = (fvc::interpolate(U) & mesh.Sf())\n                    + fvc::ddtPhiCorr(rUA, U, phi);\n                #endif\n                adjustPhi(phi, U, p);\n\n                #if defined(version22)\n                fvOptions.relativeFlux(phi);\n                #endif\n\n                // Non-orthogonal pressure corrector loop\n                #if defined(version30)\n                    while (piso.correctNonOrthogonal())\n                #else\n                    for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)\n                #endif\n                {\n                    // Pressure corrector\n\n                    fvScalarMatrix pEqn\n                    (\n                        fvm::laplacian(rUA, p) == fvc::div(phi) + particleCloud.ddtVoidfraction()\n                    );\n\n                    pEqn.setReference(pRefCell, pRefValue);\n\n                    #if defined(version30)\n                        pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));\n                        if (piso.finalNonOrthogonalIter())\n                            phi -= pEqn.flux();\n                    #else\n                        if( corr == nCorr-1 && nonOrth == nNonOrthCorr )\n                            #if defined(versionExt32)\n                                pEqn.solve(mesh.solutionDict().solver(\"pFinal\"));\n                            #else\n                                pEqn.solve(mesh.solver(\"pFinal\"));\n                            #endif\n                        else\n                            pEqn.solve();\n\n                        if (nonOrth == nNonOrthCorr)\n                            phi -= pEqn.flux();\n                    #endif\n                }\n\n                #include \"continuityErrs.H\"\n\n                U -= rUA*fvc::grad(p);\n                U.correctBoundaryConditions();\n            } \n        } //end solveFlow\n\n        laminarTransport.correct();\n        turbulence->correct();\n\n        Info << \"particleCloud.calcVelocityCorrection() \" << endl;\n        volScalarField voidfractionNext=mesh.lookupObject<volScalarField>(\"voidfractionNext\");\n        particleCloud.calcVelocityCorrection(p,U,phiIB,voidfractionNext);\n\n        #if defined(version22)\n        fvOptions.correct(U);\n        #endif\n\n        runTime.write();\n\n        Info<< \"ExecutionTime = \" << runTime.elapsedCpuTime() << \" s\"\n            << \"  ClockTime = \" << runTime.elapsedClockTime() << \" s\"\n            << nl << endl;\n    }\n\n    Info<< \"End\\n\" << endl;\n\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/solvers/cfdemSolverIB/createFields.H",
    "content": "    Info<< \"Reading field p\\n\" << endl;\n    volScalarField p\n    (\n        IOobject\n        (\n            \"p\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField U\n    (\n        IOobject\n        (\n            \"U\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n    //mod by alice\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField Us\n    (\n        IOobject\n        (\n            \"Us\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    /*Info<< \"\\nCreating outside field\\n\" << endl;\n    volScalarField outside\n    (\n        IOobject\n        (\n            \"outside\",\n            runTime.timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        scalar(0)\n    );*/\n\n//========================\n// drag law modelling\n//========================\n\n    Info<< \"\\nCreating dummy density field rho = 1\\n\" << endl;\n    volScalarField rho\n    (\n        IOobject\n        (\n            \"rho\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"0\", dimensionSet(1, -3, 0, 0, 0), 1.0)\n    );\n\n\n    Info<< \"Reading field phiIB\\n\" << endl;\n    volScalarField phiIB\n    (\n        IOobject\n        (\n            \"phiIB\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n\n    //mod by alice\n    Info<< \"Reading field phiIB\\n\" << endl;\n    volScalarField voidfraction\n    (\n        IOobject\n        (\n            \"voidfraction\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n//========================\n\n#   include \"createPhi.H\"\n\n    label pRefCell = 0;\n    scalar pRefValue = 0.0;\n    setRefCell(p, mesh.solutionDict().subDict(\"PISO\"), pRefCell, pRefValue);\n\n\n    singlePhaseTransportModel laminarTransport(U, phi);\n\n    autoPtr<incompressible::turbulenceModel> turbulence\n    (\n        incompressible::turbulenceModel::New(U, phi, laminarTransport)\n    );\n\n//=== dyM ===================\n\n    Info<< \"Reading field interFace\\n\" << endl;\n    volScalarField interFace\n    (\n        IOobject\n        (\n            \"interFace\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        //dimensionedScalar(\"0\", dimensionSet(0, -1, 0, 0, 0), 0.0)\n        dimensionedScalar(\"0\", dimensionSet(0, 0, 0, 0, 0), 0.0)\n    );\n\n//===========================\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPiso/Make/files",
    "content": "cfdemSolverPiso.C\n\nEXE=$(CFDEM_APP_DIR)/cfdemSolverPiso\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPiso/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_solver\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/fvOptions/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/cfdTools \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\nEXE_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -lmeshTools \\\n    -lfvOptions \\\n    -l$(CFDEM_LIB_NAME) \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_LIBS)\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPiso/cfdemSolverPiso.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    cfdemSolverPiso\n\nDescription\n    Transient solver for incompressible flow.\n    Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.\n    The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n#include \"fvCFD.H\"\n#include \"singlePhaseTransportModel.H\"\n\n#include \"OFversion.H\"\n#if defined(version30)\n    #include \"turbulentTransportModel.H\"\n    #include \"pisoControl.H\"\n#else\n    #include \"turbulenceModel.H\"\n#endif\n#if defined(versionv1606plus) || defined(version40)\n    #include \"fvOptions.H\"\n#else\n    #include \"fvIOoptionList.H\"\n#endif\n#include \"fixedFluxPressureFvPatchScalarField.H\"\n\n#include \"declareCFDEMcloud.H\"\n#include \"implicitCouple.H\"\n#include \"clockModel.H\"\n#include \"smoothingModel.H\"\n#include \"forceModel.H\"\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    #include \"setRootCase.H\"\n    #include \"createTime.H\"\n    #include \"createMesh.H\"\n    #if defined(version30)\n        pisoControl piso(mesh);\n        #include \"createTimeControls.H\"\n    #endif\n    #include \"createFields.H\"\n    #include \"createFvOptions.H\"\n    #include \"initContinuityErrs.H\"\n\n    // create cfdemCloud\n    #include \"readGravitationalAcceleration.H\"\n    #include \"checkImCoupleM.H\"\n    #include \"constructCFDEMcloud.H\"\n    #include \"checkModelType.H\"\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n    Info<< \"\\nStarting time loop\\n\" << endl;\n    while (runTime.loop())\n    {\n        Info<< \"Time = \" << runTime.timeName() << nl << endl;\n\n        #if defined(version30)\n            #include \"readTimeControls.H\"\n            #include \"CourantNo.H\"\n            #include \"setDeltaT.H\"\n        #else\n            #include \"readPISOControls.H\"\n            #include \"CourantNo.H\"\n        #endif\n\n        // do particle stuff\n        particleCloud.clockM().start(1,\"Global\");\n        particleCloud.clockM().start(2,\"Coupling\");\n        bool hasEvolved = particleCloud.evolve(voidfraction,Us,U);\n\n        if(hasEvolved && particleCloud.solveFlow())\n        {\n            particleCloud.smoothingM().smoothenAbsolutField(particleCloud.forceM(0).impParticleForces());\n        }\n\n        Ksl = particleCloud.momCoupleM(particleCloud.registryM().getProperty(\"implicitCouple_index\")).impMomSource();\n        Ksl.correctBoundaryConditions();\n\n        //Force Checks\n        #include \"forceCheckIm.H\"\n\n        surfaceScalarField voidfractionf = fvc::interpolate(voidfraction);\n        phi = voidfractionf*phiByVoidfraction;\n\n        particleCloud.clockM().stop(\"Coupling\");\n\n        particleCloud.clockM().start(26,\"Flow\");\n\n        if(particleCloud.solveFlow())\n        {\n            // Pressure-velocity PISO corrector\n            {\n                // Momentum predictor\n                fvVectorMatrix UEqn\n                (\n                    fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U)\n                  + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U)\n//                + turbulence->divDevReff(U)\n                  + particleCloud.divVoidfractionTau(U, voidfraction)\n                  ==\n                  - fvm::Sp(Ksl/rho,U)\n                  + fvOptions(U)\n                );\n\n                UEqn.relax();\n                fvOptions.constrain(UEqn);\n\n                #if defined(version30)\n                    if (piso.momentumPredictor())\n                #else\n                    if (momentumPredictor)\n                #endif\n                {\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        solve(UEqn == - fvc::grad(p) + Ksl/rho*Us);\n                    else\n                        solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us);\n\n                    fvOptions.correct(U);\n                }\n\n                // --- PISO loop\n                #if defined(version30)\n                    while (piso.correct())\n                #else\n                    for (int corr=0; corr<nCorr; corr++)\n                #endif\n                {\n                    volScalarField rUA = 1.0/UEqn.A();\n\n                    surfaceScalarField rUAf(\"(1|A(U))\", fvc::interpolate(rUA));\n                    volScalarField rUAvoidfraction(\"(voidfraction2|A(U))\",rUA*voidfraction);\n                    surfaceScalarField rUAfvoidfraction(\"(voidfraction2|A(U)F)\", fvc::interpolate(rUAvoidfraction));\n\n                    U = rUA*UEqn.H();\n\n                    #ifdef version23\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #else\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #endif\n                    surfaceScalarField phiS(fvc::interpolate(Us) & mesh.Sf());\n                    phi += rUAf*(fvc::interpolate(Ksl/rho) * phiS);\n\n                    if (modelType==\"A\")\n                        rUAvoidfraction = volScalarField(\"(voidfraction2|A(U))\",rUA*voidfraction*voidfraction);\n\n                    // Update the fixedFluxPressure BCs to ensure flux consistency\n                    #include \"fixedFluxPressureHandling.H\"\n\n\n                    // Non-orthogonal pressure corrector loop\n                    #if defined(version30)\n                        while (piso.correctNonOrthogonal())\n                    #else\n                        for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)\n                    #endif\n                    {\n                        // Pressure corrector\n                        fvScalarMatrix pEqn\n                        (\n                            fvm::laplacian(rUAvoidfraction, p) == fvc::div(voidfractionf*phi) + particleCloud.ddtVoidfraction()\n                        );\n                        pEqn.setReference(pRefCell, pRefValue);\n\n                        #if defined(version30)\n                            pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));\n                            if (piso.finalNonOrthogonalIter())\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #else\n                            if( corr == nCorr-1 && nonOrth == nNonOrthCorr )\n                                #if defined(versionExt32)\n                                    pEqn.solve(mesh.solutionDict().solver(\"pFinal\"));\n                                #else\n                                    pEqn.solve(mesh.solver(\"pFinal\"));\n                                #endif\n                            else\n                                pEqn.solve();\n\n                            if (nonOrth == nNonOrthCorr)\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #endif\n\n                    } // end non-orthogonal corrector loop\n\n                    phi = voidfractionf*phiByVoidfraction;\n                    #include \"continuityErrorPhiPU.H\"\n\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n                    else\n                        U -= voidfraction*rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n\n                    U.correctBoundaryConditions();\n                    fvOptions.correct(U);\n\n                } // end piso loop\n            }\n\n            laminarTransport.correct();\n            turbulence->correct();\n        }// end solveFlow\n        else\n        {\n            Info << \"skipping flow solution.\" << endl;\n        }\n\n        runTime.write();\n\n        Info<< \"ExecutionTime = \" << runTime.elapsedCpuTime() << \" s\"\n            << \"  ClockTime = \" << runTime.elapsedClockTime() << \" s\"\n            << nl << endl;\n\n        particleCloud.clockM().stop(\"Flow\");\n        particleCloud.clockM().stop(\"Global\");\n    }\n\n    Info<< \"End\\n\" << endl;\n\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPiso/createFields.H",
    "content": "    Info<< \"Reading field p\\n\" << endl;\n    volScalarField p\n    (\n        IOobject\n        (\n            \"p\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField U\n    (\n        IOobject\n        (\n            \"U\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    #include \"createCFDEMFields.H\"\n\n//#   include \"createPhi.H\"\n#ifndef createPhi_H\n#define createPhi_H\nInfo<< \"Reading/calculating face flux field phi\\n\" << endl;\nsurfaceScalarField phi\n (\n     IOobject\n     (\n        \"phi\",\n        runTime.timeName(),\n         mesh,\n        IOobject::READ_IF_PRESENT,\n        IOobject::AUTO_WRITE\n     ),\n     linearInterpolate(U*voidfraction) & mesh.Sf()\n );\n#endif\n\nInfo<< \"Generating interstitial face flux field phiByVoidfraction\\n\" << endl;\nsurfaceScalarField phiByVoidfraction\n(\n IOobject\n (\n    \"phiByVoidfraction\",\n    runTime.timeName(),\n    mesh,\n    IOobject::NO_READ,\n    IOobject::NO_WRITE\n ),\n linearInterpolate(U) & mesh.Sf()\n);\n\n    label pRefCell = 0;\n    scalar pRefValue = 0.0;\n    setRefCell(p, mesh.solutionDict().subDict(\"PISO\"), pRefCell, pRefValue);\n\n\n    singlePhaseTransportModel laminarTransport(U, phi);\n\n    autoPtr<incompressible::turbulenceModel> turbulence\n    (\n        incompressible::turbulenceModel::New(U, phi, laminarTransport)\n    );\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoSTM/Make/files",
    "content": "cfdemSolverPisoSTM.C\n\nEXE=$(CFDEM_APP_DIR)/cfdemSolverPisoSTM\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoSTM/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_solver\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/cfdTools \\\n    -I$(CFDEM_SRC_DIR)/eulerian/scalarTransportModelsCFDEM/lnInclude \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\nEXE_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -lmeshTools \\\n    -l$(CFDEM_LIB_NAME) \\\n    -lscalarTransportModelsCFDEM \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_LIBS)\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoSTM/cfdemSolverPisoSTM.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    cfdemSolverPisoSTM\n\nDescription\n    Transient solver for incompressible flow.\n    Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.\n    The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n#include \"fvCFD.H\"\n#include \"singlePhaseTransportModel.H\"\n\n#include \"OFversion.H\"\n#if defined(version30)\n    #include \"turbulentTransportModel.H\"\n    #include \"pisoControl.H\"\n#else\n    #include \"turbulenceModel.H\"\n#endif\n#if defined(versionv1606plus) || defined(version40)\n    #include \"fvOptions.H\"\n#else\n    #include \"fvIOoptionList.H\"\n#endif\n#include \"fixedFluxPressureFvPatchScalarField.H\"\n#ifdef MS\n    #include \"cfdemCloudMS.H\"\n#else\n    #include \"cfdemCloud.H\"\n#endif\n#include \"implicitCouple.H\"\n#include \"clockModel.H\"\n#include \"smoothingModel.H\"\n#include \"forceModel.H\"\n\n#include \"scalarTransportModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    #include \"setRootCase.H\"\n    #include \"createTime.H\"\n    #include \"createMesh.H\"\n    #if defined(version30)\n        pisoControl piso(mesh);\n        #include \"createTimeControls.H\"\n    #endif\n    #include \"createFields.H\"\n    #include \"createFvOptions.H\"\n    #include \"initContinuityErrs.H\"\n\n    // create cfdemCloud\n    #include \"readGravitationalAcceleration.H\"\n    #include \"checkImCoupleM.H\"\n    #ifdef MS\n        cfdemCloudMS particleCloud(mesh);\n    #else\n        cfdemCloud particleCloud(mesh);\n    #endif\n    #include \"checkModelType.H\"\n\n    // create a scalarTransportModel\n    autoPtr<scalarTransportModel> stm\n    (\n        scalarTransportModel::New(particleCloud.couplingProperties(),particleCloud)\n    );\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n    Info<< \"\\nStarting time loop\\n\" << endl;\n    while (runTime.loop())\n    {\n        Info<< \"Time = \" << runTime.timeName() << nl << endl;\n\n        #if defined(version30)\n            #include \"readTimeControls.H\"\n            #include \"CourantNo.H\"\n            #include \"setDeltaT.H\"\n        #else\n            #include \"readPISOControls.H\"\n            #include \"CourantNo.H\"\n        #endif\n\n        // do particle stuff\n        particleCloud.clockM().start(1,\"Global\");\n        particleCloud.clockM().start(2,\"Coupling\");\n        bool hasEvolved = particleCloud.evolve(voidfraction,Us,U);\n\n        if(hasEvolved && particleCloud.solveFlow())\n        {\n            particleCloud.smoothingM().smoothenAbsolutField(particleCloud.forceM(0).impParticleForces());\n        }\n\n        Ksl = particleCloud.momCoupleM(particleCloud.registryM().getProperty(\"implicitCouple_index\")).impMomSource();\n        Ksl.correctBoundaryConditions();\n\n        surfaceScalarField voidfractionf = fvc::interpolate(voidfraction);\n        phi = voidfractionf*phiByVoidfraction;\n\n        //Force Checks\n        #include \"forceCheckIm.H\"\n\n        particleCloud.clockM().stop(\"Coupling\");\n\n        particleCloud.clockM().start(26,\"Flow\");\n\n        //Scalar transport if desired. Use \"none\" (noTransport) if no scalar transport is desired\n        stm().update();\n\n        if(particleCloud.solveFlow())\n        {\n            // Pressure-velocity PISO corrector\n            {\n                // Momentum predictor\n                fvVectorMatrix UEqn\n                (\n                    fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U)\n                  + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U)\n//                + turbulence->divDevReff(U)\n                  + particleCloud.divVoidfractionTau(U, voidfraction)\n                  ==\n                  - fvm::Sp(Ksl/rho,U)\n                  + fvOptions(U)\n                );\n\n                UEqn.relax();\n                fvOptions.constrain(UEqn);\n\n                #if defined(version30)\n                    if (piso.momentumPredictor())\n                #else\n                    if (momentumPredictor)\n                #endif\n                {\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        solve(UEqn == - fvc::grad(p) + Ksl/rho*Us);\n                    else\n                        solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us);\n\n                    fvOptions.correct(U);\n                }\n\n                // --- PISO loop\n                #if defined(version30)\n                    while (piso.correct())\n                #else\n                    for (int corr=0; corr<nCorr; corr++)\n                #endif\n                {\n                    volScalarField rUA = 1.0/UEqn.A();\n\n                    surfaceScalarField rUAf(\"(1|A(U))\", fvc::interpolate(rUA));\n                    volScalarField rUAvoidfraction(\"(voidfraction2|A(U))\",rUA*voidfraction);\n                    surfaceScalarField rUAfvoidfraction(\"(voidfraction2|A(U)F)\", fvc::interpolate(rUAvoidfraction));\n\n                    U = rUA*UEqn.H();\n\n                    #ifdef version23\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #else\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #endif\n                    surfaceScalarField phiS(fvc::interpolate(Us) & mesh.Sf());\n                    phi += rUAf*(fvc::interpolate(Ksl/rho) * phiS);\n\n                    if (modelType==\"A\")\n                        rUAvoidfraction = volScalarField(\"(voidfraction2|A(U))\",rUA*voidfraction*voidfraction);\n\n                    // Update the fixedFluxPressure BCs to ensure flux consistency\n                    #include \"fixedFluxPressureHandling.H\"\n\n                    // Non-orthogonal pressure corrector loop\n                    #if defined(version30)\n                        while (piso.correctNonOrthogonal())\n                    #else\n                        for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)\n                    #endif\n                    {\n                        // Pressure corrector\n                        fvScalarMatrix pEqn\n                        (\n                            fvm::laplacian(rUAvoidfraction, p) == fvc::div(voidfractionf*phi) + particleCloud.ddtVoidfraction()\n                        );\n                        pEqn.setReference(pRefCell, pRefValue);\n\n                        #if defined(version30)\n                            pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));\n                            if (piso.finalNonOrthogonalIter())\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #else\n                            if( corr == nCorr-1 && nonOrth == nNonOrthCorr )\n                                #if defined(versionExt32)\n                                    pEqn.solve(mesh.solutionDict().solver(\"pFinal\"));\n                                #else\n                                    pEqn.solve(mesh.solver(\"pFinal\"));\n                                #endif\n                            else\n                                pEqn.solve();\n\n                            if (nonOrth == nNonOrthCorr)\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #endif\n\n                    } // end non-orthogonal corrector loop\n\n                    phi = voidfractionf*phiByVoidfraction;\n                    #include \"continuityErrorPhiPU.H\"\n\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n                    else\n                        U -= voidfraction*rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n\n                    U.correctBoundaryConditions();\n                    fvOptions.correct(U);\n\n                } // end piso loop\n            }\n\n            laminarTransport.correct();\n            turbulence->correct();\n        }// end solveFlow\n        else\n        {\n            Info << \"skipping flow solution.\" << endl;\n        }\n\n        runTime.write();\n\n        Info<< \"ExecutionTime = \" << runTime.elapsedCpuTime() << \" s\"\n            << \"  ClockTime = \" << runTime.elapsedClockTime() << \" s\"\n            << nl << endl;\n\n        particleCloud.clockM().stop(\"Flow\");\n        particleCloud.clockM().stop(\"Global\");\n    }\n\n    Info<< \"End\\n\" << endl;\n\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoSTM/createFields.H",
    "content": "    Info<< \"Reading field p\\n\" << endl;\n    volScalarField p\n    (\n        IOobject\n        (\n            \"p\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField U\n    (\n        IOobject\n        (\n            \"U\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    #include \"createCFDEMFields.H\"\n\n//========================\n// scalar field modelling\n//========================\n   /* Info<< \"\\nCreating dummy density field rho = 1\\n\" << endl;\n    volScalarField T\n    (\n        IOobject\n        (\n            \"T\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh//,\n        //dimensionedScalar(\"0\", dimensionSet(0, 0, -1, 1, 0), 273.15)\n    );*/\n\n    Info<< \"\\nCreating fluid-particle heat flux field\\n\" << endl;\n    volScalarField Tsource\n    (\n        IOobject\n        (\n            \"Tsource\",\n            runTime.timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"0\", dimensionSet(0, 0, -1, 1, 0), 0.0)\n    );\n\n    /*IOdictionary transportProperties\n    (\n        IOobject\n        (\n            \"transportProperties\",\n            runTime.constant(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    );\n\n    dimensionedScalar DT\n    (\n        transportProperties.lookup(\"DT\")\n    );*/\n\n//========================\n\n//#   include \"createPhi.H\"\n#ifndef createPhi_H\n#define createPhi_H\nInfo<< \"Reading/calculating face flux field phi\\n\" << endl;\nsurfaceScalarField phi\n (\n     IOobject\n     (\n        \"phi\",\n        runTime.timeName(),\n         mesh,\n        IOobject::READ_IF_PRESENT,\n        IOobject::AUTO_WRITE\n     ),\n     linearInterpolate(U*voidfraction) & mesh.Sf()\n );\n#endif\n\nInfo<< \"Generating interstitial face flux field phiByVoidfraction\\n\" << endl;\nsurfaceScalarField phiByVoidfraction\n(\n IOobject\n (\n    \"phiByVoidfraction\",\n    runTime.timeName(),\n    mesh,\n    IOobject::NO_READ,\n    IOobject::NO_WRITE\n ),\n linearInterpolate(U) & mesh.Sf()\n);\n\n    label pRefCell = 0;\n    scalar pRefValue = 0.0;\n    setRefCell(p, mesh.solutionDict().subDict(\"PISO\"), pRefCell, pRefValue);\n\n\n    singlePhaseTransportModel laminarTransport(U, phi);\n\n    autoPtr<incompressible::turbulenceModel> turbulence\n    (\n        incompressible::turbulenceModel::New(U, phi, laminarTransport)\n    );\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoScalar/Make/files",
    "content": "cfdemSolverPisoScalar.C\n\nEXE = $(CFDEM_APP_DIR)/cfdemSolverPisoScalar\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoScalar/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_solver\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/cfdTools \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\nEXE_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -lradiationModels \\\n    -lmeshTools \\\n    -l$(CFDEM_LIB_NAME) \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_LIBS)\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    cfdemSolverPisoScalar\n\nDescription\n    Transient solver for incompressible flow.\n    Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected.\n    The code is an evolution of the solver pisoFoam in OpenFOAM(R) 1.6,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n#include \"fvCFD.H\"\n#include \"singlePhaseTransportModel.H\"\n\n#include \"OFversion.H\"\n#if defined(version30)\n    #include \"turbulentTransportModel.H\"\n    #include \"pisoControl.H\"\n#else\n    #include \"turbulenceModel.H\"\n#endif\n#if defined(version60)\n#include \"noRadiation.H\"\n#else\n#include \"radiationModel.H\"\n#endif\n#include \"fixedFluxPressureFvPatchScalarField.H\"\n#include \"cfdemCloud.H\"\n#include \"implicitCouple.H\"\n#include \"clockModel.H\"\n#include \"smoothingModel.H\"\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    #include \"setRootCase.H\"\n    #include \"createTime.H\"\n    #include \"createMesh.H\"\n    #if defined(version30)\n        pisoControl piso(mesh);\n        #include \"createTimeControls.H\"\n    #endif\n    #include \"createFields.H\"\n    #include \"createIncompressibleRadiationModel.H\"\n    #include \"initContinuityErrs.H\"\n\n    // create cfdemCloud\n    #include \"readGravitationalAcceleration.H\"\n    #include \"checkImCoupleM.H\"\n    cfdemCloud particleCloud(mesh);\n    #include \"checkModelType.H\"\n\n    // get ref to tempExchange models\n    labelList tempExchangeModels(0);\n    label id(particleCloud.registryM().getProperty(\"LaEuScalarTemp_index\"));\n    if(id>=0) tempExchangeModels.append(id);\n    id = particleCloud.registryM().getProperty(\"LaEuScalarRadiation_index\");\n    if(id>=0) tempExchangeModels.append(id);\n    // check ordering tempExchange models\n    if(tempExchangeModels.size() > 1 && tempExchangeModels[0]>tempExchangeModels[1]) FatalError <<\"Please use correct order of forceModels: LaEuScalarTemp before LaEuScalarRadiation.\"<< abort(FatalError);\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n    Info<< \"\\nStarting time loop\\n\" << endl;\n    while (runTime.loop())\n    {\n        particleCloud.clockM().start(1,\"Global\");\n\n        Info<< \"Time = \" << runTime.timeName() << nl << endl;\n\n        #if defined(version30)\n            #include \"readTimeControls.H\"\n            #include \"CourantNo.H\"\n            #include \"setDeltaT.H\"\n        #else\n            #include \"readPISOControls.H\"\n            #include \"CourantNo.H\"\n        #endif\n\n        // do particle stuff\n        particleCloud.clockM().start(2,\"Coupling\");\n        bool hasEvolved = particleCloud.evolve(voidfraction,Us,U);\n\n        if(hasEvolved && particleCloud.solveFlow())\n        {\n            particleCloud.smoothingM().smoothenAbsolutField(particleCloud.forceM(0).impParticleForces());\n        }\n\n        Info << \"update Ksl.internalField()\" << endl;\n        Ksl = particleCloud.momCoupleM(particleCloud.registryM().getProperty(\"implicitCouple_index\")).impMomSource();\n        Ksl.correctBoundaryConditions();\n\n        surfaceScalarField voidfractionf = fvc::interpolate(voidfraction);\n        phi = voidfractionf*phiByVoidfraction;\n\n        //Force Checks\n        #include \"forceCheckIm.H\"\n\n        particleCloud.clockM().stop(\"Coupling\");\n\n        particleCloud.clockM().start(26,\"Flow\");\n\n        // solve scalar transport equation\n        {\n        alphat = turbulence->nut()/Prt;\n        alphat.correctBoundaryConditions();\n        volScalarField alphaEff(\"alphaEff\", turbulence->nu()/Pr + alphat);\n        fvScalarMatrix TEqn\n        (\n           fvm::ddt(voidfraction,T) - fvm::Sp(fvc::ddt(voidfraction),T)\n         + fvm::div(phi, T) - fvm::Sp(fvc::div(phi),T)\n         - fvm::laplacian(alphaEff*voidfraction, T)\n         ==\n           Tsource\n         + radiation->ST(rhoCpRef, T)\n        );\n        TEqn.relax();\n        TEqn.solve();\n        radiation->correct();\n        }\n\n        if(particleCloud.solveFlow())\n        {\n            // Pressure-velocity PISO corrector\n            {\n                // Momentum predictor\n                fvVectorMatrix UEqn\n                (\n                    fvm::ddt(voidfraction,U) - fvm::Sp(fvc::ddt(voidfraction),U)\n                  + fvm::div(phi,U) - fvm::Sp(fvc::div(phi),U)\n//                + turbulence->divDevReff(U)\n                  + particleCloud.divVoidfractionTau(U, voidfraction)\n                  ==\n                  - fvm::Sp(Ksl/rho,U)\n                );\n\n                UEqn.relax();\n\n                #if defined(version30)\n                    if (piso.momentumPredictor())\n                #else\n                    if (momentumPredictor)\n                #endif\n                {\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        solve(UEqn == - fvc::grad(p) + Ksl/rho*Us);\n                    else\n                        solve(UEqn == - voidfraction*fvc::grad(p) + Ksl/rho*Us);\n                }\n\n                // --- PISO loop\n                #if defined(version30)\n                    while (piso.correct())\n                #else\n                    for (int corr=0; corr<nCorr; corr++)\n                #endif\n                {\n                    volScalarField rUA = 1.0/UEqn.A();\n\n                    surfaceScalarField rUAf(\"(1|A(U))\", fvc::interpolate(rUA));\n                    volScalarField rUAvoidfraction(\"(voidfraction2|A(U))\",rUA*voidfraction);\n                    surfaceScalarField rUAfvoidfraction(\"(voidfraction2|A(U)F)\", fvc::interpolate(rUAvoidfraction));\n\n                    U = rUA*UEqn.H();\n\n                    #ifdef version23\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #else\n                        phi = ( fvc::interpolate(U) & mesh.Sf() )\n                            + rUAfvoidfraction*fvc::ddtCorr(U, phiByVoidfraction);\n                    #endif\n                    surfaceScalarField phiS(fvc::interpolate(Us) & mesh.Sf());\n                    phi += rUAf*(fvc::interpolate(Ksl/rho) * phiS);\n\n                    if (modelType==\"A\")\n                        rUAvoidfraction = volScalarField(\"(voidfraction2|A(U))\",rUA*voidfraction*voidfraction);\n\n                    // Update the fixedFluxPressure BCs to ensure flux consistency\n                    #include \"fixedFluxPressureHandling.H\"\n\n                    // Non-orthogonal pressure corrector loop\n                    #if defined(version30)\n                        while (piso.correctNonOrthogonal())\n                    #else\n                        for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)\n                    #endif\n                    {\n                        // Pressure corrector\n                        fvScalarMatrix pEqn\n                        (\n                            fvm::laplacian(rUAvoidfraction, p) == fvc::div(voidfractionf*phi) + particleCloud.ddtVoidfraction()\n                        );\n                        pEqn.setReference(pRefCell, pRefValue);\n\n                        #if defined(version30)\n                            pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));\n                            if (piso.finalNonOrthogonalIter())\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #else\n                            if( corr == nCorr-1 && nonOrth == nNonOrthCorr )\n                                #if defined(versionExt32)\n                                    pEqn.solve(mesh.solutionDict().solver(\"pFinal\"));\n                                #else\n                                    pEqn.solve(mesh.solver(\"pFinal\"));\n                                #endif\n                            else\n                                pEqn.solve();\n\n                            if (nonOrth == nNonOrthCorr)\n                            {\n                                phiByVoidfraction = phi - pEqn.flux()/voidfractionf;\n                            }\n                        #endif\n\n                    } // end non-orthogonal corrector loop\n\n                    phi = voidfractionf*phiByVoidfraction;\n                    #include \"continuityErrorPhiPU.H\"\n\n                    if (modelType==\"B\" || modelType==\"Bfull\")\n                        U -= rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n                    else\n                        U -= voidfraction*rUA*fvc::grad(p) - Ksl/rho*Us*rUA;\n\n                    U.correctBoundaryConditions();\n\n                } // end piso loop\n            }\n\n            laminarTransport.correct();\n            turbulence->correct();\n        }// end solveFlow\n        else\n        {\n            Info << \"skipping flow solution.\" << endl;\n        }\n\n        runTime.write();\n\n        Info<< \"ExecutionTime = \" << runTime.elapsedCpuTime() << \" s\"\n            << \"  ClockTime = \" << runTime.elapsedClockTime() << \" s\"\n            << nl << endl;\n\n        particleCloud.clockM().stop(\"Flow\");\n        particleCloud.clockM().stop(\"Global\");\n    }\n\n    Info<< \"End\\n\" << endl;\n\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/solvers/cfdemSolverPisoScalar/createFields.H",
    "content": "    Info<< \"Reading field p\\n\" << endl;\n    volScalarField p\n    (\n        IOobject\n        (\n            \"p\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField U\n    (\n        IOobject\n        (\n            \"U\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    #include \"createCFDEMFields.H\"\n\n//========================\n// scalar field modelling\n//========================\n    Info<< \"\\nCreating T field\\n\" << endl;\n    volScalarField T\n    (\n        IOobject\n        (\n            \"T\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh//,\n        //dimensionedScalar(\"0\", dimensionSet(0, 0, -1, 1, 0), 273.15)\n    );\n\n    Info<< \"\\nCreating fluid-particle heat flux field\\n\" << endl;\n    volScalarField Tsource\n    (\n        IOobject\n        (\n            \"Tsource\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh//,\n        //dimensionedScalar(\"0\", dimensionSet(0, 0, -1, 1, 0), 0.0)\n    );\n\n    IOdictionary transportProperties\n    (\n        IOobject\n        (\n            \"transportProperties\",\n            runTime.constant(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    );\n\n    // kinematic turbulent thermal thermal conductivity m2/s\n    Info<< \"Reading field alphat\\n\" << endl;\n    volScalarField alphat\n    (\n        IOobject\n        (\n            \"alphat\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    // Laminar Prandtl number\n    dimensionedScalar Pr(\"Pr\", dimless, transportProperties);\n\n    // Turbulent Prandtl number\n    dimensionedScalar Prt(\"Prt\", dimless, transportProperties);\n\n//========================\n\n//#   include \"createPhi.H\"\n#ifndef createPhi_H\n#define createPhi_H\nInfo<< \"Reading/calculating face flux field phi\\n\" << endl;\nsurfaceScalarField phi\n (\n     IOobject\n     (\n        \"phi\",\n        runTime.timeName(),\n         mesh,\n        IOobject::READ_IF_PRESENT,\n        IOobject::AUTO_WRITE\n     ),\n     linearInterpolate(U*voidfraction) & mesh.Sf()\n );\n#endif\n\nInfo<< \"Generating interstitial face flux field phiByVoidfraction\\n\" << endl;\nsurfaceScalarField phiByVoidfraction\n(\n IOobject\n (\n    \"phiByVoidfraction\",\n    runTime.timeName(),\n    mesh,\n    IOobject::NO_READ,\n    IOobject::NO_WRITE\n ),\n linearInterpolate(U) & mesh.Sf()\n);\n\n    label pRefCell = 0;\n    scalar pRefValue = 0.0;\n    setRefCell(p, mesh.solutionDict().subDict(\"PISO\"), pRefCell, pRefValue);\n\n\n    singlePhaseTransportModel laminarTransport(U, phi);\n\n    autoPtr<incompressible::turbulenceModel> turbulence\n    (\n        incompressible::turbulenceModel::New(U, phi, laminarTransport)\n    );\n"
  },
  {
    "path": "applications/utilities/cfdemPostproc/Make/files",
    "content": "cfdemPostproc.C\n\nEXE=$(CFDEM_APP_DIR)/cfdemPostproc\n"
  },
  {
    "path": "applications/utilities/cfdemPostproc/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\n\nEXE_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -l$(CFDEM_LIB_NAME) \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_LIBS)\n\n"
  },
  {
    "path": "applications/utilities/cfdemPostproc/cfdemPostproc.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    cfdemPostproc\n\nDescription\n    Tool for DEM->CFD (Lagrange->Euler) mapping to calculate local voidfraction\n\\*---------------------------------------------------------------------------*/\n\n#include \"fvCFD.H\"\n#include \"singlePhaseTransportModel.H\"\n\n#include \"OFversion.H\"\n#if defined(version30)\n    #include \"turbulentTransportModel.H\"\n#else\n    #include \"turbulenceModel.H\"\n#endif\n\n#include \"cfdemCloud.H\"\n#include \"dataExchangeModel.H\"\n#include \"voidFractionModel.H\"\n#include \"locateModel.H\"\n#include \"averagingModel.H\"\n#include \"momCoupleModel.H\"\n#include \"forceModel.H\"\n#include \"IOModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    #include \"setRootCase.H\"\n\n    #include \"createTime.H\"\n    #include \"createMesh.H\"\n    #include \"createFields.H\"\n\n    // create cfdemCloud\n    cfdemCloud particleCloud(mesh);\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n    Info<< \"\\nStarting time loop\\n\" << endl;\n\n    int count=0;\n    int DEM_dump_Interval=1000;\n    particleCloud.reAllocArrays();\n\n    double **positions_(NULL);\n    double **velocities_(NULL);\n    double **radii_(NULL);\n    double **voidfractions_(NULL);\n    double **particleWeights_(NULL);\n    double **particleVolumes_(NULL);\n    double **particleV_(NULL);\n    double **cellIDs_(NULL);\n    \n    particleCloud.dataExchangeM().allocateArray(positions_,0.,3);\n    particleCloud.dataExchangeM().allocateArray(velocities_,0.,3);\n    particleCloud.get_radii(radii_);  // get ref to radii\n    //particleCloud.dataExchangeM().allocateArray(radii_,0.,1);\n    particleCloud.dataExchangeM().allocateArray(voidfractions_,0.,1);\n    particleCloud.dataExchangeM().allocateArray(particleWeights_,0.,1);\n    particleCloud.dataExchangeM().allocateArray(particleVolumes_,0.,1);\n    particleCloud.dataExchangeM().allocateArray(particleV_,0.,1);\n    particleCloud.get_cellIDs(cellIDs_);  // get ref to cellIDs\n    //particleCloud.dataExchangeM().allocateArray(cellIDs_,0.,1);\n    \n\n    while (runTime.loop())\n    {\n        Info<< \"Time = \" << runTime.timeName() << nl << endl;\n        count+=DEM_dump_Interval;// proceed loading new data\n\n        particleCloud.averagingM().resetVectorAverage(particleCloud.averagingM().UsPrev(),particleCloud.averagingM().UsNext());\n        particleCloud.voidFractionM().resetVoidFractions();\n        particleCloud.averagingM().resetVectorAverage(particleCloud.forceM(0).impParticleForces(),particleCloud.forceM(0).impParticleForces(),true);\n        particleCloud.averagingM().resetVectorAverage(particleCloud.forceM(0).expParticleForces(),particleCloud.forceM(0).expParticleForces(),true);\n        particleCloud.averagingM().resetWeightFields();\n        particleCloud.momCoupleM(0).resetMomSourceField();\n\n        particleCloud.dataExchangeM().couple(0);\n\n        particleCloud.dataExchangeM().getData(\"x\",\"vector-atom\",positions_,count);\n        particleCloud.dataExchangeM().getData(\"v\",\"vector-atom\",velocities_,count);\n        particleCloud.dataExchangeM().getData(\"radius\",\"scalar-atom\",radii_,count);\n\n        particleCloud.locateM().findCell(NULL,positions_,cellIDs_,particleCloud.numberOfParticles());\n        particleCloud.setPos(positions_);\n\n        particleCloud.voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_,particleV_);\n        #if defined(versionv1612plus) || defined(version40) \n            voidfraction = particleCloud.voidFractionM().voidFractionInterp();\n        #else\n            voidfraction.internalField() = particleCloud.voidFractionM().voidFractionInterp();\n        #endif\n        voidfraction.correctBoundaryConditions();\n\n        particleCloud.averagingM().setVectorAverage\n        (\n            particleCloud.averagingM().UsNext(),\n            velocities_,\n            particleWeights_,\n            particleCloud.averagingM().UsWeightField(),\n            NULL, //mask\n            NULL,\n            false\n        );\n\n        //write Us field\n        Us = particleCloud.averagingM().UsInterp();\n        Us.correctBoundaryConditions();\n\n        for (int i=0;i<particleCloud.nrForceModels();i++) particleCloud.forceM(i).setForce();\n\n        runTime.write();\n\n        particleCloud.IOM().dumpDEMdata();\n\n        Info<< \"ExecutionTime = \" << runTime.elapsedCpuTime() << \" s\"\n            << \"  ClockTime = \" << runTime.elapsedClockTime() << \" s\"\n            << nl << endl;\n\n    }\n\n    particleCloud.dataExchangeM().destroy(positions_,3);\n    particleCloud.dataExchangeM().destroy(velocities_,3);\n    //particleCloud.dataExchangeM().destroy(radii_); // destroyed in cloud\n    particleCloud.dataExchangeM().destroy(voidfractions_,1);\n    particleCloud.dataExchangeM().destroy(particleWeights_,1);\n    particleCloud.dataExchangeM().destroy(particleVolumes_,1);\n    particleCloud.dataExchangeM().destroy(particleV_,1);\n    //particleCloud.dataExchangeM().destroy(cellIDs_); // destroyed in cloud\n\n    Info<< \"End\\n\" << endl;\n\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/utilities/cfdemPostproc/createFields.H",
    "content": "    Info<< \"Reading field p\\n\" << endl;\n    volScalarField p\n    (\n        IOobject\n        (\n            \"p\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::NO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"0\", dimensionSet(0, 2, -2, 0, 0), 1.0)\n    );\n\n    Info<< \"Reading physical velocity field U\" << endl;\n    Info<< \"Note: only if voidfraction at boundary is 1, U is superficial velocity!!!\\n\" << endl;\n    volVectorField U\n    (\n        IOobject\n        (\n            \"U\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::NO_WRITE\n        ),\n        mesh,\n        dimensionedVector(\"0\", dimensionSet(0, 1, -1, 0, 0), Foam::vector::zero)\n    );\n\n//========================\n// drag law modelling\n//========================\n\n    Info<< \"\\nCreating dummy density field rho\\n\" << endl;\n    volScalarField rho\n    (\n        IOobject\n        (\n            \"rho\",\n            runTime.timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"0\", dimensionSet(1, -3, 0, 0, 0), 1.0)\n    );\n\n    Info<< \"\\nReading voidfraction field voidfraction = (Vgas/Vparticle)\\n\" << endl;\n    volScalarField voidfraction\n    (\n        IOobject\n        (\n            \"voidfraction\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"0\", dimensionSet(0, 0, 0, 0, 0), 1.)\n    );\n\n\n    Info<< \"Reading particle velocity field Us\\n\" << endl;\n    volVectorField Us\n    (\n        IOobject\n        (\n            \"Us\",\n            runTime.timeName(),\n            mesh,\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedVector(\"0\", dimensionSet(0, 1, -1, 0, 0), Foam::vector::zero)\n    );\n\n//========================\n#   include \"createPhi.H\"\n\n    label pRefCell = 0;\n    scalar pRefValue = 0.0;\n    setRefCell(p, mesh.solutionDict().subDict(\"PISO\"), pRefCell, pRefValue);\n\n\n    singlePhaseTransportModel laminarTransport(U, phi);\n\n    autoPtr<incompressible::turbulenceModel> turbulence\n    (\n        incompressible::turbulenceModel::New(U, phi, laminarTransport)\n    );\n\n"
  },
  {
    "path": "applications/utilities/vizClock/matPlot.py",
    "content": "#!/usr/bin/env python\r\nimport csv, sys\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\n\r\n# Open the data\r\ndatafile = \"timeEvalFull.txt\"\r\nf = open(datafile, 'r')\r\nreader = csv.reader(f, dialect='excel-tab')\r\nreader.next()\r\n\r\nheader = []\r\nidentifier = []\r\ndeltaT = []\r\nmaxdeltaT = []\r\nnOfRuns = []\r\nlevel = []\r\nparentNr = []\r\nparentName = []\r\n\r\n\r\ni = 0\r\nfor row in reader:\r\n\tif i == 0:\r\n\t\tfor column in row:\r\n\t\t\theader.append(column)\r\n\t\tprint header\r\n\telse:\r\n\t\tidentifier.append(row[0])\r\n\t\tdeltaT.append(float(row[1]))\r\n\t\tmaxdeltaT.append(float(row[2]))\r\n\t\tnOfRuns.append(int(row[3]))\r\n\t\tlevel.append(int(row[4]))\r\n\t\tparentNr.append(int(row[5]))\r\n\t\tparentName.append(row[6])\r\n\ti+=1\r\n\r\nbottom = []\r\nchildheight = []\r\n\r\nfor i in range(len(identifier)):\r\n\tbottom.append(0)\r\n\tchildheight.append(0)\r\n\r\nlevelZero = 0.0\r\n\r\n#loop levels\r\nfor j in range(len(identifier)):\r\n\t#loop indices\r\n\tfor i in range(len(identifier)):\r\n\t\tif level[i] == j:\r\n\t\t\tif parentNr[i] != -1:\r\n\t\t\t\tbottom[i] = bottom[parentNr[i]] + childheight[parentNr[i]]\r\n\t\t\t\tchildheight[parentNr[i]] += deltaT[i]\r\n\t\t\telse:\r\n\t\t\t\tbottom[i] = levelZero\r\n\t\t\t\tlevelZero += deltaT[i]\r\n\r\n#Output\r\nfor i in range(len(identifier)):\r\n\tplt.bar(level[i],deltaT[i],width = 0.2, bottom=bottom[i])\r\n\tplt.text(level[i]+0.22,bottom[i]+deltaT[i]/2,identifier[i]+\" \"+str(nOfRuns[i])+\"x\",verticalalignment='center')\r\nplt.xlabel('run level')\r\nplt.ylabel('CPU time in s')\r\nplt.title('time measurement')\r\nplt.show()\r\n\r\n\r\n"
  },
  {
    "path": "applications/utilities/vizClock/timeEvalFull.txt",
    "content": "Parallel Measurements in CPU-seconds of all Processors:\r\nName \t avgdeltaT \t maxdeltaT \t nOfRuns \t level \t parentNr \t parentName \r\nX\t5.000000e-06\t5.000000e-06\t1\t0\t-1\tnone\r\nA\t3.240000e-04\t3.240000e-04\t1\t0\t-1\tnone\r\nB\t1.680000e-04\t1.680000e-04\t1\t1\t1\tA\r\nC\t9.000000e-06\t9.000000e-06\t3\t2\t2\tB\r\nD\t6.000000e-06\t6.000000e-06\t3\t3\t3\tC\r\nE\t1.500000e-04\t1.500000e-04\t3\t2\t2\tB\r\nF\t2.400000e-05\t2.400000e-05\t3\t1\t1\tA\r\nG\t6.000000e-06\t6.000000e-06\t3\t1\t1\tA\r\nX\t6.000000e-06\t6.000000e-06\t3\t2\t7\tG\r\nH\t4.000000e-05\t4.000000e-05\t5\t1\t1\tA\r\nI\t2.000000e-05\t2.000000e-05\t1\t1\t1\tA\r\n"
  },
  {
    "path": "applications/utilities/writeUfluid/Make/files",
    "content": "writeUfluid.C\n\nEXE = $(CFDEM_APP_DIR)/writeUfluid\n"
  },
  {
    "path": "applications/utilities/writeUfluid/Make/options",
    "content": "EXE_INC = \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/lagrangian/basic/lnInclude\n\nEXE_LIBS = \\\n    -lfiniteVolume \\\n    -lmeshTools \\\n    -lgenericPatchFields \\\n    -llagrangian\n"
  },
  {
    "path": "applications/utilities/writeUfluid/createFields.H",
    "content": "\nIOdictionary propsDict\n(\n    IOobject\n    (\n        \"particleTrackProperties\",\n        runTime.constant(),\n        mesh,\n        IOobject::MUST_READ_IF_MODIFIED\n    )\n);\n\nconst word cloudName(propsDict.lookup(\"cloudName\"));\n\n//label sampleFrequency(readLabel(propsDict.lookup(\"sampleFrequency\")));\n\n// outputMode: compositeFile, filePerTrack\n//word outputmode(propsDict.lookup(\"outputMode\"))\n\n//label maxPositions(readLabel(propsDict.lookup(\"maxPositions\")));\n\n// outputFormat: raw, vtk\n//word outputFormat(propsDict.lookup(\"outputFormat\"));\n\n\n"
  },
  {
    "path": "applications/utilities/writeUfluid/particleTrackProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.1.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      particleTrackProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ncloudName       cfdemCloud1;\n\nsampleFrequency 1;\n\nmaxPositions    1000000;\n\nmaxPositions      20000;\n// ************************************************************************* //\n"
  },
  {
    "path": "applications/utilities/writeUfluid/writeUfluid.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nApplication\n    writeUfluidwriteUfluid\n\nDescription\n    Writes the the cell center fluid velocity to particles in the lagrangian \n    time directory.\n\\*---------------------------------------------------------------------------*/\n\n#include \"argList.H\"\n#include \"Cloud.H\"\n#include \"IOdictionary.H\"\n#include \"fvCFD.H\"\n#include \"fvMesh.H\"\n#include \"Time.H\"\n#include \"timeSelector.H\"\n#include \"OFstream.H\"\n#include \"passiveParticleCloud.H\"\n\nusing namespace Foam;\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint main(int argc, char *argv[])\n{\n    timeSelector::addOptions();\n    #include \"addRegionOption.H\"\n\n    #include \"setRootCase.H\"\n\n    #include \"createTime.H\"\n    instantList timeDirs = timeSelector::select0(runTime, args);\n    #include \"createMesh.H\"\n    #include \"createFields.H\"\n\n    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nint nParticle=0;\n forAll(timeDirs, timeI)\n {\n    runTime.setTime(timeDirs[timeI], timeI);\n    Info<< \"Time = \" << runTime.timeName() << endl;\n    IOobject UHeader\n    (\n        \"U\",\n        runTime.timeName(),\n        mesh,\n        IOobject::MUST_READ\n    );\n    if (UHeader.headerOk())\n    {\n        volVectorField U(UHeader,mesh);\n        passiveParticleCloud myCloud(mesh, cloudName);\n\t\tmyCloud.write();\n        nParticle = myCloud.size();\n\t    IOField<vector> Ufluid(myCloud.fieldIOobject(\"Ufluid\",IOobject::NO_READ),nParticle);\n        label i = 0;\n        forAllConstIter(passiveParticleCloud, myCloud, iter)\n        {\n\t\t    Ufluid[i]=U[iter().cell()];\n            i++;\n        }\n        Ufluid.write();\n    }\n    else\n    {\n        Info << \"velocity field not found\" << endl;\n    }\n }\n    return 0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "doc/_build/html/.buildinfo",
    "content": "# Sphinx build info version 1\n# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.\nconfig: f1656ab2e65996c8f99500bd8a76741e\ntags: 645f666f9bcd5a90fca523b33c5a78b7\n"
  },
  {
    "path": "doc/_build/html/CFDEMcoupling_Manual.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>CFDEM®coupling Documentation &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"#\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">CFDEM®coupling Documentation</a><ul>\n<li><a class=\"reference internal\" href=\"#contents\">Contents</a><ul>\n<li><a class=\"reference internal\" href=\"#about-cfdemcoupling\">About CFDEM®coupling</a></li>\n<li><a class=\"reference internal\" href=\"#installation\">Installation</a></li>\n<li><a class=\"reference internal\" href=\"#tutorials\">Tutorials</a></li>\n<li><a class=\"reference internal\" href=\"#couplingproperties-dictionary\">“couplingProperties” dictionary</a></li>\n<li><a class=\"reference internal\" href=\"#liggghtscommands-dictionary\">“liggghtsCommands” dictionary</a></li>\n<li><a class=\"reference internal\" href=\"#chemistryproperties-dictionary\">“chemistryProperties” dictionary</a></li>\n<li><a class=\"reference internal\" href=\"#models-solvers\">Models/Solvers</a></li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"#\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"#\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>CFDEM®coupling Documentation</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"cfdemcoupling-documentation\">\n<h1>CFDEM®coupling Documentation<a class=\"headerlink\" href=\"#cfdemcoupling-documentation\" title=\"Permalink to this headline\"></a></h1>\n<hr class=\"docutils\" />\n<img alt=\"_images/Portfolio_CFDEMcoupling.png\" class=\"align-center\" src=\"_images/Portfolio_CFDEMcoupling.png\" />\n<hr class=\"docutils\" />\n<section id=\"contents\">\n<h2>Contents<a class=\"headerlink\" href=\"#contents\" title=\"Permalink to this headline\"></a></h2>\n<p>The CFDEM®coupling documentation is organized into the following sections. If you find any errors or omissions in this manual or have suggestions for useful information to add, please send an email to the developers so the CFDEM®coupling documentation can be improved.</p>\n<div class=\"line-block\">\n<div class=\"line\">1.1 <a class=\"reference internal\" href=\"#id1\"><span class=\"std std-ref\">About CFDEM®coupling</span></a></div>\n<div class=\"line\">1.2 <a class=\"reference internal\" href=\"#id2\"><span class=\"std std-ref\">Installation</span></a></div>\n<div class=\"line\">1.3 <a class=\"reference internal\" href=\"#id3\"><span class=\"std std-ref\">Tutorials</span></a></div>\n<div class=\"line\">1.4 <a class=\"reference internal\" href=\"#id4\"><span class=\"std std-ref\">couplingProperties dictionary</span></a></div>\n<div class=\"line\">1.5 <a class=\"reference internal\" href=\"#id5\"><span class=\"std std-ref\">liggghtsCommands dictionary</span></a></div>\n<div class=\"line\">1.6 <a class=\"reference internal\" href=\"#id6\"><span class=\"std std-ref\">chemistryProperties dictionary</span></a></div>\n<div class=\"line\">1.7 <a class=\"reference internal\" href=\"#cmd-5\"><span class=\"std std-ref\">Models and solvers</span></a></div>\n<div class=\"line\"><br /></div>\n</div>\n<hr class=\"docutils\" />\n<section id=\"about-cfdemcoupling\">\n<span id=\"id1\"></span><h3>About CFDEM®coupling<a class=\"headerlink\" href=\"#about-cfdemcoupling\" title=\"Permalink to this headline\"></a></h3>\n<p>CFDEM®coupling provides an open source parallel coupled CFD-DEM framework combining the strengths of <a class=\"reference external\" href=\"https://www.cfdem.com/liggghtsr-open-source-discrete-element-method-particle-simulation-code\">LIGGGHTS®</a> DEM code and the Open Source CFD package <a class=\"reference external\" href=\"http://www.openfoam.com\">OpenFOAM®(*)</a>. The CFDEM®coupling toolbox allows to expand standard CFD solvers of <a class=\"reference external\" href=\"http://www.openfoam.com\">OpenFOAM®(*)</a> to include a coupling to the DEM code <a class=\"reference external\" href=\"https://www.cfdem.com/liggghtsr-open-source-discrete-element-method-particle-simulation-code\">LIGGGHTS®</a>. In this toolbox the particle representation within the CFD solver is organized by “cloud” classes. Key functionalities are organised in sub-models (e.g. force models, data exchange models, etc.) which can easily be selected and combined by dictionary settings.</p>\n<p>The coupled solvers run fully parallel on distributed-memory clusters. Features are:</p>\n<ul class=\"simple\">\n<li><p>its modular approach allows users to easily implement new models</p></li>\n<li><p>its MPI parallelization enables to use it for large scale problems</p></li>\n<li><p>the <a href=\"#id11\"><span class=\"problematic\" id=\"id12\">`forum &lt;lws_&gt;`_</span></a> on CFD-DEM gives the possibility to exchange with other users / developers</p></li>\n<li><p>the use of GIT allows to easily update to the latest version</p></li>\n<li><p>basic documentation is provided</p></li>\n</ul>\n<p>The file structure:</p>\n<ul class=\"simple\">\n<li><p><em>src</em> directory contains the source-code files of the CFDEM®coupling toolbox library and models</p></li>\n<li><p><em>applications</em> directory contains the solver source files for coupled CFD-DEM simulations</p></li>\n<li><p><em>doc</em> directory including the documentation of CFDEM®coupling</p></li>\n<li><p><em>tutorials</em> directory including basic tutorial cases showing the functionality</p></li>\n</ul>\n<p>The functionality of this CFD-DEM framework is described via <a class=\"reference internal\" href=\"#id3\"><span class=\"std std-ref\">tutorial cases</span></a> showing how to use different solvers and models.</p>\n<p>CFDEM®coupling stands for Computational Fluid Dynamics (CFD) -Discrete Element Method (DEM) coupling.</p>\n<p>CFDEM®coupling is an open-source code, distributed freely under the terms of the GNU Public License (GPL).</p>\n<p>Core development of CFDEM®coupling is done by Christoph Goniva and Christoph Kloss, both at DCS Computing GmbH, 2012</p>\n<p>This documentation was written by DCS Computing GmbH, 2017</p>\n<hr class=\"docutils\" />\n<p>How CFDEM®coupling works, a short description:</p>\n<p>The launched applications are CFDEM®coupling solvers, e.g. cfdemSolverPiso. Its job is to solve the Navier-Stokes equations with a solid phase present.\nA general formulation with a solid phase:</p>\n<img alt=\"_images/NavierStokesLiquSoli.png\" class=\"align-center\" src=\"_images/NavierStokesLiquSoli.png\" />\n<p>In general “l” denotes liquid and “s” solid properties. AlphaL is the fluid (liquid) content of a calculation-cell, the voidfraction. “rhoL” is the fluid (liquid) density, uL the fluid (liquid) velocity, p the pressure, Ksl the implicit momentum exchange term between solid and liquid phase, us the solid velocity, tau the liquid-stress-tensor, g the gravity vector and t the time. “f” is a general explicit term which can be used to explicitely exchange momentum from the solid to the liquid phase.</p>\n<p>All cfdemSolvers use a “cfdemCloud” object, which takes care of many things. The most important are:</p>\n<ul class=\"simple\">\n<li><p>Control and communicate with the LIGGGHTS® library object. (liggghtsCommandModel and dataExchangeModel)</p></li>\n<li><p>Find the cell ID of a certain position, e.g. the particle center. (locateModel)</p></li>\n<li><p>Calculate the voidfraction field from particle positions, particle volumes and cell volumes. (voidFractionModel)</p></li>\n<li><p>Calculate the forces on the CFD field and the particle forces. These may be assembled by various forceModels, e.g. buyoancy and a drag-law. (forceModel and forceSubModel)</p></li>\n<li><p>Calculate the implicit and if necessary explicit source terms from the force fields for the Navier-Stokes-Equations, the solver needs to solve. (momCoupleModel)</p></li>\n<li><p>Calculate the “Us” field from particle data, map the particle data to the CFD field. (averagingModel)</p></li>\n</ul>\n<p>In the standard setting the momentum coupling model takes the calculated forces of forceModels and produces the implicit momentum source term Ksl with</p>\n<img alt=\"_images/Ksl.png\" class=\"align-center\" src=\"_images/Ksl.png\" />\n<p>More advanced solvers have also an explicit source term field f which is assembled from those forces which have the treatForceExplicit=true flag (see forceSubModels).</p>\n<hr class=\"docutils\" />\n<p>(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.</p>\n<hr class=\"docutils\" />\n</section>\n<section id=\"installation\">\n<span id=\"id2\"></span><h3>Installation<a class=\"headerlink\" href=\"#installation\" title=\"Permalink to this headline\"></a></h3>\n<hr class=\"docutils\" />\n<p>This section describes how to download repositories of the CFDEM®project from <a class=\"reference external\" href=\"http://github.com/\">github.com</a> .\nAfter setting some environment variables, LIGGGHTS® and CFDEM®coupling can be compiled.</p>\n<p><strong>Procedure:</strong></p>\n<p>Short summary:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#install-1\"><span class=\"std std-ref\">Install git</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-2\"><span class=\"std std-ref\">Download CFDEM®project software</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-3\"><span class=\"std std-ref\">Download the correct OpenFOAM® version</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-4\"><span class=\"std std-ref\">Setup prerequisites</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-5\"><span class=\"std std-ref\">Setup and compile OpenFOAM®</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-6\"><span class=\"std std-ref\">Set environment variables and paths</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-7\"><span class=\"std std-ref\">Compile LIGGGHTS® and CFDEM®coupling</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#additionalinstall\"><span class=\"std std-ref\">Additional information</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#install-8\"><span class=\"std std-ref\">Run your own cases</span></a></p></li>\n</ul>\n<hr class=\"docutils\" />\n<p id=\"install-1\"><strong>Install git:</strong></p>\n<p>This step is optional, but recommended. Git allows you to update the source code very easily with the git pull command.\nOn debian based systems you can run</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">sudo</span> <span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span> <span class=\"n\">install</span> <span class=\"n\">git</span><span class=\"o\">-</span><span class=\"n\">core</span>\n</pre></div>\n</div>\n<p>Similar packages are available on other systems too:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">sudo</span> <span class=\"n\">zypper</span> <span class=\"n\">install</span> <span class=\"n\">git</span><span class=\"o\">-</span><span class=\"n\">core</span>\n<span class=\"n\">sudo</span> <span class=\"n\">yum</span> <span class=\"n\">install</span> <span class=\"n\">git</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>In this tutorial the git protocol is used to transfer files. If port 9418 is closed for internet connections, please switch to “<a class=\"reference external\" href=\"https://\">https://</a>” instead of “git://” for git clone commands.</p>\n</div>\n<hr class=\"docutils\" />\n<p id=\"install-2\"><strong>Download CFDEMproject software:</strong></p>\n<p>With git you can clone git repositories from <a class=\"reference external\" href=\"http://github.com/\">github</a> . The following terminal commands will download the CFDEM®project software to your machine in the typical folder structure. The download of the post-processing tool LPP is optional and requires python-numpy.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>cd $HOME\nmkdir CFDEM\ncd CFDEM\ngit clone git://github.com/CFDEMproject/CFDEMcoupling-PUBLIC.git\ncd $HOME\nmkdir LIGGGHTS\ncd LIGGGHTS\ngit clone git://github.com/CFDEMproject/LIGGGHTS-PUBLIC.git\ngit clone git://github.com/CFDEMproject/LPP.git lpp\n</pre></div>\n</div>\n<p>If you do not have git, you can use the download buttons after visiting a repository in the <a class=\"reference external\" href=\"http://github.com/CFDEMproject\">CFDEMproject project page</a> and unzip the archives to the proper locations. Typically github tags the folders with “-master”, please rename them with</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>cd $HOME/CFDEM\nmv CFDEMcoupling-PUBLIC-master CFDEMcoupling-PUBLIC\ncd $HOME/LIGGGHTS\nmv LIGGGHTS-PUBLIC-master LIGGGHTS-PUBLIC\nmv LPP-master lpp\n</pre></div>\n</div>\n<hr class=\"docutils\" />\n<p id=\"install-3\"><strong>Download the correct OpenFOAM® version:</strong></p>\n<p>All mentions of OpenFOAM® refer to <a class=\"reference internal\" href=\"#footnotes\"><span class=\"std std-ref\">this</span></a> . It is strongly recommended to compile OpenFOAM® yourself with the latest compatible version.\nThe latest compatible OpenFOAM®-version can be found in  the in your local copy of CFDEM®coupling in src/lagrangian/cfdemParticle/cfdTools/versionInfo.H, or directly at <a class=\"reference external\" href=\"https://github.com/CFDEMproject/CFDEMcoupling-PUBLIC/blob/master/src/lagrangian/cfdemParticle/cfdTools/versionInfo.H\">github</a> .\nLook for the git commit hashtag in the following line:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">word</span> <span class=\"n\">OFversion</span><span class=\"o\">=</span><span class=\"s2\">&quot;&lt;OF-Release&gt;-commit-&lt;commitHashtag&gt;&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">g</span><span class=\"o\">.</span> <span class=\"n\">word</span> <span class=\"n\">OFversion</span><span class=\"o\">=</span><span class=\"s2\">&quot;6-commit-af7d7f427be78e9b9beb6aceca8fe7d5d4636876&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<p>With git you can use the following recipe to get the correct version:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>cd $HOME\nmkdir OpenFOAM\ncd OpenFOAM\ngit clone git://github.com/OpenFOAM/OpenFOAM-&lt;OF-Release&gt;.git\ngit clone git://github.com/OpenFOAM/ThirdParty-&lt;OF-Release&gt;.git\ncd OpenFOAM-&lt;OF-Release&gt;\ngit checkout &lt;commitHashtag&gt;\n</pre></div>\n</div>\n<p>Without git you can visit git://github.com/OpenFOAM/OpenFOAM-&lt;OF-Release&gt;/tree/&lt;commitHashtag&gt; and use the download button.</p>\n<p>Other OpenFOAM® versions can be used for compilation, but aren’t officially supported. The list includes 6, 5.x, 4.x, 3.x, 2.4.x, 1706, 1612+, 1606+ and extend-3.2</p>\n<hr class=\"docutils\" />\n<p id=\"install-4\"><strong>Setup prerequisites for CFDEM®project:</strong></p>\n<p>Prerequisites for OpenFOAM® can be found <a class=\"reference external\" href=\"https://openfoam.org/download/source/\">here</a> .\nOn an Ubuntu system (16.04+), you can use the following</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">sudo</span> <span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span> <span class=\"n\">install</span> <span class=\"n\">build</span><span class=\"o\">-</span><span class=\"n\">essential</span> <span class=\"n\">flex</span> <span class=\"n\">bison</span> <span class=\"n\">cmake</span> <span class=\"n\">zlib1g</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libboost</span><span class=\"o\">-</span><span class=\"n\">system</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libboost</span><span class=\"o\">-</span><span class=\"n\">thread</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libopenmpi</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">openmpi</span><span class=\"o\">-</span><span class=\"nb\">bin</span> <span class=\"n\">gnuplot</span> <span class=\"n\">libreadline</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libncurses</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libxt</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libscotch</span><span class=\"o\">-</span><span class=\"n\">dev</span> <span class=\"n\">libptscotch</span><span class=\"o\">-</span><span class=\"n\">dev</span>\n</pre></div>\n</div>\n<p>CFDEM®project requires OpenFOAM® with a working MPI version.\nOptional, but strongly recommended is the use of <a class=\"reference external\" href=\"http://www.vtk.org/\">VTK</a> . VTK is used to directly write data in vtk format, which is readable by <a class=\"reference external\" href=\"https://www.paraview.org/\">ParaView</a> . The minimum version is VTK 6.3, recommended is 8.0.1. On debian-based systems it is sufficient to run</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">sudo</span> <span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span> <span class=\"n\">install</span> <span class=\"n\">libvtk7</span><span class=\"o\">-</span><span class=\"n\">dev</span>\n</pre></div>\n</div>\n<p>For manual VTK compilation, please read the <a class=\"reference internal\" href=\"#additionalinstall\"><span class=\"std std-ref\">additional installation hints</span></a> .</p>\n<p>The post-processing tool lpp requires the python numpy package.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">sudo</span> <span class=\"n\">apt</span><span class=\"o\">-</span><span class=\"n\">get</span> <span class=\"n\">install</span> <span class=\"n\">python</span><span class=\"o\">-</span><span class=\"n\">numpy</span>\n</pre></div>\n</div>\n<hr class=\"docutils\" />\n<p id=\"install-5\"><strong>Setup and compile OpenFOAM®</strong></p>\n<p>You can follow the OpenFOAM® git compilation <a class=\"reference external\" href=\"https://openfoam.org/download/source/\">instructions</a> , with a small number of exceptions:\nCFDEM®coupling requires the WM_LABEL_SIZE=32 , which is the standard setting.</p>\n<p>On an Ubuntu system (16.04+), you can use the following steps to install OpenFOAM®:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>gedit ~/.bashrc\nadd the following two lines in the end, where &lt;NofProcs&gt; is the integer number of the processors you want to compile with. Save and exit gedit.\n&quot;export WM_NCOMPPROCS=&lt;NofProcs&gt;&quot;\n&quot;source $HOME/OpenFOAM/OpenFOAM-&lt;OF-Release&gt;/etc/bashrc&quot;\nnow again in the terminal:\nsource ~/.bashrc\ncd $WM_PROJECT_DIR\nfoamSystemCheck\n./Allwmake\n</pre></div>\n</div>\n<p>Additional OpenFOAM® installation hints can be found <a class=\"reference internal\" href=\"#additionalinstall\"><span class=\"std std-ref\">here</span></a> .</p>\n<hr class=\"docutils\" />\n<p id=\"install-6\"><strong>Set environment variables and paths</strong></p>\n<p>Typically the CFDEM®coupling folder is tagged with the OpenFOAM® version number. To do this, perform the following steps:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>cd $HOME/CFDEM\nmv CFDEMcoupling-PUBLIC CFDEMcoupling-PUBLIC-$WM_PROJECT_VERSION\n</pre></div>\n</div>\n<p>You need to set some environment variables in ~/.bashrc (if you use c-shell, manipulate ~/.cshrc accordingly). Open your .bashrc and the CFDEM®coupling bashrc file.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>gedit ~/.bashrc $HOME/CFDEM/CFDEMcoupling-PUBLIC-$WM_PROJECT_VERSION/src/lagrangian/cfdemParticle/etc/bashrc\n</pre></div>\n</div>\n<p>Add the STANDARD block to the end of your bashrc and modify entries if necessary. Make sure the statements are not comments; remove the “#”. Similar to:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>#================================================#\n#- source cfdem env vars\nexport CFDEM_VERSION=PUBLIC\nexport CFDEM_PROJECT_DIR=$HOME/CFDEM/CFDEMcoupling-$CFDEM_VERSION-$WM_PROJECT_VERSION\nexport CFDEM_PROJECT_USER_DIR=$HOME/CFDEM/$LOGNAME-$CFDEM_VERSION-$WM_PROJECT_VERSION\nexport CFDEM_bashrc=$CFDEM_PROJECT_DIR/src/lagrangian/cfdemParticle/etc/bashrc\nexport CFDEM_LIGGGHTS_SRC_DIR=$HOME/LIGGGHTS/LIGGGHTS-PUBLIC/src\nexport CFDEM_LIGGGHTS_MAKEFILE_NAME=auto\nexport CFDEM_LPP_DIR=$HOME/LIGGGHTS/lpp/src\n. $CFDEM_bashrc\n#================================================#\n</pre></div>\n</div>\n<p>You may insert the EXTENDED block above “. $CFDEM_bashrc” for further customization.\nThe detailed description for allowed entries can be found <a class=\"reference internal\" href=\"#additionalinstall\"><span class=\"std std-ref\">here</span></a> .</p>\n<p>To load and check the environment you can run now</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">source</span> <span class=\"o\">~/.</span><span class=\"n\">bashrc</span>\n<span class=\"n\">cfdemSysTest</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>Many useful aliases are set with sourcing of the CFDEMcoupling bashrc, e.g. cfdemEtc . Make use of them!</p>\n</div>\n<hr class=\"docutils\" />\n<p id=\"install-7\"><strong>Compile LIGGGHTS® and CFDEM®coupling</strong></p>\n<p>To compile CFDEM®project open a new terminal and run</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">cfdemCompCFDEMall</span>\n</pre></div>\n</div>\n<p>It compiles the LIGGGHTS® executable, LIGGGHTS® as a shared library, the CFDEM®coupling libraries, CFDEM®coupling solvers and CFDEM®coupling utilities. The compilation will stop, if build errors occur. Having a previous manually compiled LIGGGHTS® is not enough, it needs to be compiled as shared library with the cfdemCompLIG command.</p>\n<p>As step by step compilation of only specific parts, the following commands are available:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">cfdemCompLIG</span>\n<span class=\"n\">cfdemCompCFDEMsrc</span>\n<span class=\"n\">cfdemCompCFDEMsol</span>\n<span class=\"n\">cfdemCompCFDEMuti</span>\n</pre></div>\n</div>\n<p>The compilation is automatically logged and the logs can be found in:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/log\n</pre></div>\n</div>\n<p>In case questions concerning the installation arise, please feel free to contact our forum at <a href=\"#id13\"><span class=\"problematic\" id=\"id14\">`www.cfdem.com &lt;lws_&gt;`_</span></a> .</p>\n<hr class=\"docutils\" />\n<p id=\"install-8\"><strong>Run your own cases</strong></p>\n<p>If you want to run your own cases, please do so in <em>$CFDEM_PROJECT_USER_DIR/run</em> which is automatically being generated. E.g. copy one of the tutorial cases there, adapt it to your needs.\nChanges in $CFDEM_TUT_DIR might be lost after every <em>git stash</em>.</p>\n<p>You can run all the tutorial cases by executing the alias cfdemTestTUT.\nAlternatively you can run each tutorial using the <em>Allrun.sh</em> scripts in the tutorial directories.</p>\n<p>To run pure LIGGGHTS® cases, you can use the aliases</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">cfdemLiggghts</span> <span class=\"n\">inputScriptName</span>\n<span class=\"n\">cfdemLiggghtsPar</span> <span class=\"n\">inputScriptName</span> <span class=\"n\">nOfProcs</span>\n</pre></div>\n</div>\n<p>or you can set a link in /usr/local/bin to the LIGGGHTS® executable as described in the <a class=\"reference external\" href=\"https://www.cfdem.com/media/DEM/docu/Section_start.html#steps-to-build-a-liggghts-r-public-executable\">LIGGGHTS®documentation</a> .</p>\n<hr class=\"docutils\" />\n<p><strong>Backwards Compatibility:</strong></p>\n<p>Basically CFDEM®coupling supports one OpenFOAM® version therefore all settings are prepared for that. Nevertheless we try to maintain backwards compatibility as long as it works with reasonable effort.</p>\n<p>The supported OpenFOAM® and LIGGGHTS® versions are stated in:\nsrc/lagrangian/cfdemParticle/cfdTools/versionInfo.H</p>\n<p>For using other versions you can manipulate:\nsrc/lagrangian/cfdemParticle/etc/OFversion/OFversion.H\n(still not all functionality might work then!)</p>\n<hr class=\"docutils\" />\n<p id=\"additionalinstall\"><strong>Installation, additional information</strong></p>\n<hr class=\"docutils\" />\n<p><strong>Procedure:</strong></p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#ainstall-4\"><span class=\"std std-ref\">Setup prerequisites</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#ainstall-5\"><span class=\"std std-ref\">Setup and compile OpenFOAM®</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#ainstall-6\"><span class=\"std std-ref\">Set environment variables and paths</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#ainstall-7\"><span class=\"std std-ref\">Compile LIGGGHTS® and CFDEM®coupling</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#ainstall-8\"><span class=\"std std-ref\">Compiling OpenFOAM®, LIGGGHTS® and CFDEM®coupling in debug mode</span></a></p></li>\n</ul>\n<hr class=\"docutils\" />\n<p id=\"ainstall-4\"><strong>Setup prerequisites for CFDEM®project:</strong></p>\n<p>If you need to compile VTK on your machine yourself, we recommend version 8.0.1, which is available <a class=\"reference external\" href=\"http://www.vtk.org/files/release/8.0/VTK-8.0.1.zip\">here</a> . The installation guide is available <a class=\"reference external\" href=\"http://www.vtk.org/Wiki/VTK/Configure_and_Build#On_Unix-like_systems\">here</a> .\nHowever, if you use the Makefile auto in LIGGGHTS you may set AUTOINSTALL_VTK to “ON” to automatically download and compile VTK.</p>\n<p>Please note the VTK components necessary need cmake, MPI and some X11 libraries on your machine. Compilation using ccmake is recommended. In the standard configuration MPI related packages are disabled. Enable Parallel / MPI packages during configuration. For VTK-6.3 set VTK_Group_MPI:BOOL=ON .</p>\n<hr class=\"docutils\" />\n<p id=\"ainstall-5\"><strong>Setup and compile OpenFOAM®</strong></p>\n<p>All mentions of OpenFOAM® refer to <a class=\"reference external\" href=\"afootnotes\">this</a> .</p>\n<p>Often problems arise configuring OpenFOAM® to work with a specific MPI installation on a cluster. However it has built-in capability to work with nearly any MPI implementation.\nSet the following variable in the OpenFOAM® bashrc:</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">export</span> <span class=\"n\">WM_MPLIB</span><span class=\"o\">=</span><span class=\"n\">SYSTEMMPI</span>\n</pre></div>\n</div>\n<p>Defining the following variables in your ~/.bashrc BEFORE the sourcing of OpenFOAM® will take care of the rest. This is an example for older MVAPICH installations where there is no libmpi.so, only libmpich.so</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>export MPI_ROOT=&lt;path/to/mpi/installation&gt;\nexport MPI_ARCH_PATH=$MPI_ROOT\nexport MPI_ARCH_FLAGS=&quot;-DMPICH_SKIP_MPICXX&quot;\nexport MPI_ARCH_INC=&quot;-I$MPI_ARCH_PATH/include&quot;\nexport MPI_ARCH_LIBS=&#39;-L$(MPI_ARCH_PATH)/lib -lmpich -lmpichcxx -lmpl -lopa -lrt&#39;\n</pre></div>\n</div>\n<hr class=\"docutils\" />\n<p id=\"ainstall-6\"><strong>Set environment variables and paths</strong></p>\n<p>Detailed description of the environment variables:</p>\n<p>standard block:</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 14%\" />\n<col style=\"width: 73%\" />\n<col style=\"width: 13%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p>CFDEM_VERSION</p></td>\n<td><p>CFDEMcoupling branch name; e.g. PUBLIC</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_PROJECT_DIR</p></td>\n<td><p>path to the installation directory of CFDEM®coupling</p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_PROJECT_USER_DIR</p></td>\n<td><p>path to the user directory; used to store users simulation cases and source-code</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_bashrc</p></td>\n<td><p>location of the CFDEM®coupling bashrc (or cshrc)</p></td>\n<td><p>which sets up the environment</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_LIGGGHTS_SRC_DIR</p></td>\n<td><p>path to the LIGGGHTS src directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_LIGGGHTS_MAKEFILE_NAME</p></td>\n<td><p>Name of the LIGGGHTS® Makefile which defines how to compile LIGGGHTS®; more information on which Makefile to select is within the LIGGGHTS® documentation; standard is auto</p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_LPP_DIR path</p></td>\n<td><p>to the src directory of the local lpp installation</p></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n<p>extended block may be inserted above “. $CFDEM_bashrc”:</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 15%\" />\n<col style=\"width: 63%\" />\n<col style=\"width: 23%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p>CFDEM_SRC_DIR</p></td>\n<td><p>can be used to use alternative src directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_SOLVER_DIR</p></td>\n<td><p>can be used to use alternative solver directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_DOC_DIR</p></td>\n<td><p>can be used to use alternative doc directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_UT_DIR</p></td>\n<td><p>can be used to use alternative utilities directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_TUT_DIR</p></td>\n<td><p>can be used to use alternative tutorials directory</p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_LIGGGHTS_MAKEFILE_POSTIFX</p></td>\n<td><p>if you wish to compile LIGGGHTS® to CFDEM®coupling with a postfix auto Makefile; for more information on postfixes please read the LIGGGHTS® documentation</p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_VERBOSE</p></td>\n<td><p>if set to false</p></td>\n<td><p>standard output of environment variables is suppressed</p></td>\n</tr>\n</tbody>\n</table>\n<hr class=\"docutils\" />\n<p>additionalLibs:</p>\n<p>The additionalLibs are used as a centralized system for adding libraries and paths to CFDEM®coupling compilations. There is and automated detection of your OpenFOAM® version, which should select the proper additionalLibs file.\nIf the automated selection of the additionalLibs fails or if you wish to set it manually to a specific file, you may set the following environment variables above “. $CFDEM_bashrc”:</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 31%\" />\n<col style=\"width: 69%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p>CFDEM_ADD_LIBS_DIR</p></td>\n<td><p>path containing the user-defined additionalLibs file</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_ADD_LIBS_NAME</p></td>\n<td><p>filename of the user-defined additionalLibs file</p></td>\n</tr>\n</tbody>\n</table>\n<p>even further customization with variables:</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 15%\" />\n<col style=\"width: 85%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p>CFDEM_LAMMPS_LIB_DIR</p></td>\n<td><p>alternative path to LIGGGHTS® lib folder containing additional LIGGGHTS® packages; e.g. ASPHERE</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_LIGGGHTS_LIB_PATH</p></td>\n<td><p>path to compiled LIGGGHTS® library; useful if the compiled LIGGGHTS® library has manually been moved from the LIGGGHTS® src path to an alternative location</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_LIB_DIR</p></td>\n<td><p>alternative target directory for CFDEM®coupling libraries</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_USER_LIB_DIR</p></td>\n<td><p>alternative target directory for CFDEM®coupling user-libraries</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>CFDEM_APP_DIR</p></td>\n<td><p>alternative target directory for CFDEMcoupling executables</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>CFDEM_USER_APP_DIR</p></td>\n<td><p>alternative target directory for CFDEM®coupling user-executables</p></td>\n</tr>\n</tbody>\n</table>\n<hr class=\"docutils\" />\n<p id=\"ainstall-7\"><strong>Compile LIGGGHTS® and CFDEM®coupling</strong></p>\n<p>LIGGGHTS® needs to be compiled as library with the cfdemCompLIG command. You can compile LIGGGHTS® manually as a shared library with</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">make</span> <span class=\"o\">-</span><span class=\"n\">f</span> <span class=\"n\">Makefile</span><span class=\"o\">.</span><span class=\"n\">shlib</span> <span class=\"o\">&lt;</span><span class=\"n\">Makefilename</span><span class=\"o\">&gt;</span>\n</pre></div>\n</div>\n<p>within your LIGGGHTS® src directory.\nLIGGGHTS® is included into CFDEM®coupling by the creation of a symbolic link in $CFDEM_LIB_DIR to the LIGGGHTS shared library. This link is automatically created during the compilation of the CFDEM®coupling lagrangian library at the beginning of the make phase. This means even if you compile the lagrangian library manually with “wmake libso”, the link is created.</p>\n<hr class=\"docutils\" />\n<p id=\"ainstall-8\"><strong>Compiling OpenFOAM®, LIGGGHTS® and CFDEM®coupling in debug mode</strong></p>\n<p>Set the WM_COMPILE_OPTION parameter in the OF bashrc to “Debug” and compile OF with the Allwmake script.\nIf you are using the LIGGGHTS® auto Makefile, simply compile LIGGGHTS® and CFDEM®coupling with “cfdemCompCFDEMall”. CFDEM®coupling detects the OpenFOAM® variable compiles LIGGGHTS® in debug mode. The coupling itself is compiled with OpenFOAM®s wmake, so this is automatically taken care of.\nIf you aren’t using the auto Makefile, you need to make sure the “-O0 -g” or “-O2 -g” compilation parameters are set properly within the LIGGGHTS®-Makefile.</p>\n<hr class=\"docutils\" />\n<p id=\"footnotes\"><strong>Footnotes:</strong></p>\n<p>OPENFOAM®  is a registered trade mark of OpenCFD Limited, producer and distributor of the OpenFOAM software via wwww.openfoam.org.</p>\n<hr class=\"docutils\" />\n</section>\n<section id=\"tutorials\">\n<span id=\"id3\"></span><h3>Tutorials<a class=\"headerlink\" href=\"#tutorials\" title=\"Permalink to this headline\"></a></h3>\n<p><strong>General:</strong></p>\n<p>Each solver of the CFDEM®coupling comes with at least one tutorial example, showing its functionality and correct usage. Provided that the installation is correct, the tutorials can be run via “Allrun.sh” shell scripts. These scripts perform all necessary steps (preprocessing, run, postprocessing, visualization).</p>\n<p><strong>Location:</strong></p>\n<p>The tutorials can be found in the directory $CFDEM_PROJECT_DIR/tutorials, which can be reached by typing “cfdemTut”</p>\n<p><strong>Structure:</strong></p>\n<p>Each case is structured in a directory called “CFD” covering the CFD relevant settings and data, and a dirctory called “DEM” covering the DEM relevant settings and data. This allows to easily expand a pure CFD or DEM simulation case to a coupled case.</p>\n<p><strong>Usage:</strong></p>\n<p>Provided that the installation is correct, the tutorials can be run via “Allrun.sh” shell script, executed by typing “./Allrun.sh”. The successful run of the script might need some third party software (e.g. octave, evince, etc.).</p>\n<p>A typical Allrun.sh script executes the following steps:</p>\n<ul class=\"simple\">\n<li><p>DEM: LIGGGHTS init run</p></li>\n<li><p>CFD: mesh generation (blockMesh)</p></li>\n<li><p>CFD: mesh decomposition (decomposePar)</p></li>\n<li><p>CFDEM: parallel CFDEM run; mpirun -np X cfdemSolverXXX -parallel</p></li>\n<li><p>post-processing</p></li>\n</ul>\n<p><strong>Settings:</strong></p>\n<p>The main settings of a simulation are done via dictionaries:</p>\n<p>The DEM setup of each case is defined by a <a class=\"reference external\" href=\"https://www.cfdem.com/liggghtsr-open-source-discrete-element-method-particle-simulation-code\">LIGGGHTS®</a> input file located in $caseDir/DEM (e.g. in.liggghts_init). For details on the <a class=\"reference external\" href=\"https://www.cfdem.com/liggghtsr-open-source-discrete-element-method-particle-simulation-code\">LIGGGHTS®</a> setup, please have a look at the <a class=\"reference external\" href=\"https://www.cfdem.com/liggghtsr-open-source-discrete-element-method-particle-simulation-code\">LIGGGHTS®</a> manual.</p>\n<p>Standard CFD settings are defined in $caseDir/CFD/constant (e.g. transportProperties, RASproperties, etc.) and $caseDir/CFD/system (e.g. fvSchemes, controlDict). For settings related to the solver such as discretization schemes, solution settings for the equations and solver control (e.g. corrector or non-orthogonal corrector steps for non-orthogonal meshes) you can find more information in <a class=\"reference external\" href=\"http://www.openfoam.com\">OpenFOAM®(*)</a> documentations (www.openFoam.com)(*).</p>\n<p>Settings of the coupling routines are defined in $caseDir/CFD/constant/<a class=\"reference internal\" href=\"#id4\"><span class=\"std std-ref\">couplingProperies</span></a> (e.g. force models, data exchange model, etc.) and $caseDir/CFD/constant/<a class=\"reference internal\" href=\"#id5\"><span class=\"std std-ref\">liggghtsCommands</span></a> (allows to execute a LIGGGHTS® command during a coupled simulation).</p>\n<hr class=\"docutils\" />\n</section>\n<section id=\"couplingproperties-dictionary\">\n<span id=\"id4\"></span><h3>“couplingProperties” dictionary<a class=\"headerlink\" href=\"#couplingproperties-dictionary\" title=\"Permalink to this headline\"></a></h3>\n<p><strong>General:</strong></p>\n<p>In the “couplingProperties” dictionary the setup of the coupling routines of the CFD-DEM simulation are defined.</p>\n<p><strong>Location:</strong> $caseDir/CFD/constant</p>\n<p><strong>Structure:</strong></p>\n<p>The dictionary is divided into two parts, “sub-models &amp; settings” and “sub-model properties”.</p>\n<p>In “sub-models &amp; settings” the following routines must be specified:</p>\n<ul class=\"simple\">\n<li><p>modelType</p></li>\n<li><p>couplingInterval</p></li>\n<li><p>voidFractionModel</p></li>\n<li><p>locateModel</p></li>\n<li><p>meshMotionModel</p></li>\n<li><p>IOModel</p></li>\n<li><p>probeModel</p></li>\n<li><p>dataExchangeModel</p></li>\n<li><p>averagingModel</p></li>\n<li><p>clockModel</p></li>\n<li><p>smoothingModel</p></li>\n<li><p>forceModels</p></li>\n<li><p>momCoupleModels</p></li>\n<li><p>turbulenceModelType</p></li>\n</ul>\n<p>The following keywords may be specified:</p>\n<ul class=\"simple\">\n<li><p>particleShapeType</p></li>\n<li><p>solveFlow</p></li>\n<li><p>expCorrDeltaUError</p></li>\n</ul>\n<p>In “sub-model properties” sub-dictionaries might be defined to specify model specific parameters.</p>\n<p><strong>Settings:</strong></p>\n<p>Reasonable example settings for the “couplingProperties” dictionary are given in the tutorial cases.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">particleShapeType</span>\n</pre></div>\n</div>\n<p>The <em>particleShapeType</em> keyword defines which particle shape is used. The default value for the particleShapeType\nis “sphere”. Further valid values are “multisphere”, “superquadric”, and “convex”. For the PUBLIC version of\nCFDEM®coupling only the particleShapeType sphere is available.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">solveFlow</span>\n</pre></div>\n</div>\n<p>The <em>solveFlow</em> switch determines, whether the fluid equations are solved or not. By setting solveFlow to false, the fluid solver becomes inactive.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">expCorrDeltaUError</span>\n</pre></div>\n</div>\n<p>The switch <em>expCorrDeltaUError</em> can be used with solvers capable of handling explicit volumetric forces on the fluid.\nImplicit force coupling will result in a typically small difference in the coupling force exerted on the particles and the fluid, i.e., Newton’s Third Law will be conflicted. This error can be calculated by TotalError(dU) = Ksl*(Uf_preStep-Uf_postStep), since CFD experiences new Uf values, while particles only experience drag with Uf_postStep. <em>expCorrDeltaUError</em> set to on will correct for this error in an explicit fashion. Typically, correcting for this error results in a less stable solution. The sum of this error normalized by the total implicit drag is displayed during the simulation.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">modelType</span>\n</pre></div>\n</div>\n<p>“modelType” refers to the formulation of the equations to be solved. Choose “A”, “B” or “Bfull”, according to Zhou et al. (2010): “Discrete particle simulation of particle-fluid flow: model formulations and their applicability”, JFM. “A” requires the use of the force models gradPForce and viscForce, whereas “B” requires the force model “Archimedes”. “Bfull” refers to model type I, “A” refers to model type II and “B” refers to type III in the nomenclature used by Zhou et al.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">couplingInterval</span>\n</pre></div>\n</div>\n<p>The coupling interval determines the time passing between two CFD-DEM data exchanges.</p>\n<p>A useful procedure would be:</p>\n<ol class=\"arabic simple\">\n<li><p>Set the DEM timestep in the in.xxx file according to the needs of the pure DEM problem.</p></li>\n<li><p>Set the “couplingInterval”, which refers to the DEM timesteps. Depending on the problem you will need to have a close (small couplingInterval) or loose coupling.</p></li>\n<li><p>Choose the CFD timestep in the controlDict. It must be equal to or smaller than the coupling time, otherwise you will get the error: “Error - TS bigger than coupling interval!”.</p></li>\n<li><p>To ensure a synchronous run, the coupling time should be a multiple of the CFD timestep, or you’ll get a warning “Warning - Coupling time (= DEM time step * coupling interval) is not a multiple of  CFD time-step!”</p></li>\n</ol>\n<p>Example: DEMts=1.0e-5s, couplingInterval=10 exchange data (=couple) will happen every 1.0e-4s.</p>\n<hr class=\"docutils\" />\n</section>\n<section id=\"liggghtscommands-dictionary\">\n<span id=\"id5\"></span><h3>“liggghtsCommands” dictionary<a class=\"headerlink\" href=\"#liggghtscommands-dictionary\" title=\"Permalink to this headline\"></a></h3>\n<p><strong>General:</strong></p>\n<p>In the “liggghtsCommands” dictionary LIGGGHTS® commands being executed during a coupled CFD-DEM simulation are specified.\nThe most important command is the “run” command. After the start-up read of the LIGGGHTS®-input-script it is fed by CFDEM®coupling\nwith commands. User-defined commands may be added.</p>\n<p><strong>Location:</strong> $caseDir/CFD/constant</p>\n<p><strong>Structure:</strong></p>\n<p>The dictionary is divided into two parts, first a list of “liggghtsCommandModels” is defined, then the settings for each model must be specified.</p>\n<p><strong>Settings:</strong></p>\n<p>Reasonable example settings for the “liggghtsCommands” dictionary are given in the tutorial cases.</p>\n<hr class=\"docutils\" />\n</section>\n<section id=\"chemistryproperties-dictionary\">\n<span id=\"id6\"></span><h3>“chemistryProperties” dictionary<a class=\"headerlink\" href=\"#chemistryproperties-dictionary\" title=\"Permalink to this headline\"></a></h3>\n<p><strong>Remark:</strong></p>\n<p>This functionality is not available in the PUBLIC version of CFDEM®coupling!</p>\n<p><strong>General:</strong></p>\n<p>In the “chemistryProperties” dictionary different properties required for the numerical intragration of the chemical reactions, like chemistry solver and parameters for void fraction dependend reaction speed, are defined. Equations for corresponding chemical reactions must be defined in “reactions” file. For documentation of chemistry solver parameters and “reactions” file please refer to OpenFOAM® documentation. Parameters ffor void fraction dependend reactions are listed in VoidChemistryModelProps section. Available chemistry solvers in CFDEM®coupling are “EulerImplicitVoid” and “odeVoid” that have the same functionality as “EulerImplicit” and “ode” solvers in OpenFOAM®.</p>\n<p>Location: $caseDir/CFD/constant</p>\n<p><strong>Structure:</strong></p>\n<pre class=\"literal-block\">VoidChemistryModelProps\n{\n    solidSpecies\n    {\n         <em>solidSpecie1</em>;\n         <em>solidSpecie2</em>;\n         ...\n    }\n    gasReactionCoeffs\n    {\n        useVoidFractionCorrection &quot;switch1&quot;;\n        gasSpecie1 &quot;scalar01&quot;;\n        gasSpecie2 &quot;scalar02&quot;;\n        gasSpecie3 &quot;scalar03&quot;;\n        ...\n        e1 &quot;scalar11&quot;;\n        e2 &quot;scalar12&quot;;\n        e3 &quot;scalar13&quot;;\n        e4 &quot;scalar14&quot;;\n        e5 &quot;scalar15&quot;;\n        e6 &quot;scalar16&quot;;\n    }\n    solidProps\n     {\n        particles <em>scalar20</em>;\n        <em>solidSpecie1</em> <em>scalar21</em>;\n        <em>solidSpecie2</em> <em>scalar22</em>;\n        ...\n     }\n}</pre>\n<ul class=\"simple\">\n<li><p>Entry <em>solidSpecies</em> contains the list of the ids of the species that are treated as solid</p></li>\n<li><p>Entry <em>gasReactionCoeffs</em> contains parameters for void fraction corrected reaction rate for reaction with id <em>gasReaction</em>. Note that this entry must be defined for every reaction separately. Note that reaction id in chemistryProperties must be identical to that in <em>reactions</em> file</p></li>\n<li><p><em>switch1</em> = (optional, normally false) flag to use void fraction corrected reaction rate model</p></li>\n<li><p>If none of the solid species are present in the reaction with id <em>gasReaction</em> than the following equation is used for calculating the speed of chemical reaction:</p></li>\n</ul>\n<img alt=\"Eqs/ReactionRate1.png\" class=\"align-center\" src=\"Eqs/ReactionRate1.png\" />\n<p>otherwise</p>\n<img alt=\"Eqs/ReactionRate2.png\" class=\"align-center\" src=\"Eqs/ReactionRate2.png\" />\n<ul class=\"simple\">\n<li><p>where <em>epsilon</em> is the void fraction, <em>c_1</em> , <em>c_2</em>, <em>c_3</em> ,.. are the molar concetrations of reactants (species on the left hand side the equation for <em>gasReaction</em>), <em>Asolids</em> is the cumulative particle surface area, <em>Nparticles</em> is the number of particles located in the volume <em>V</em>. <em>dp</em> , <em>mp</em> and <em>Ap</em> are the average diameter, mass and surface area of particles in volume <em>V</em>.\n<em>r_0</em> is the reaction rate normally calculated by Arrhenius reaction rate model (defined in <em>reactions</em> file for each reaction separately). <em>scalar01</em>, <em>scalar02</em>, <em>scalar03</em>, .. are the stoichiometric coefficients for <em>gasSpecie1</em> , <em>gasSpecie2</em> , <em>gasSpecie3</em> ,.. for the reactants required for calculating <em>r</em> (= <em>alpha</em> , <em>beta</em> , <em>gamma</em> ,.. ). These parameters are optional and taken from the equation of <em>gasReaction</em> defined in <em>reactions</em> file.</p></li>\n<li><p><em>scalar11</em>, <em>scalar12</em>, <em>scalar13</em>, <em>scalar14</em>, <em>scalar15</em>, <em>scalar16</em> (optional, default are 0) are the exponents <em>e1</em> , <em>e2</em> , <em>e3</em> , <em>e4</em> , <em>e5</em> , <em>e6</em> in the above listed equations for the reaction speed.</p></li>\n</ul>\n<p><em>w_1</em> , <em>w_2</em> , .. are the mass concentrations of the solid species on the particle, including particle material. Parameters <em>scalar21</em>, <em>scalar22</em>, .. (optional, default values are 0) are the coefficients <em>epsilon</em>, <em>delta</em> , etc. in equation (2)</p>\n<p>For calculation of <em>Asolids</em> <span class=\"xref std std-doc\">particleCellSurface</span> force model must be used. For calculation of <em>dp</em> , <em>mp</em> , <em>Ap</em> and <em>Nparticles</em> <span class=\"xref std std-doc\">LaEuFilmFormation</span> force model must be used. Note that these force models cannot be used together in one simulation.</p>\n<p><strong>Example:</strong></p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">VoidChemistryModelProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">solidSpecies</span>\n    <span class=\"p\">{</span>\n        <span class=\"n\">C</span><span class=\"p\">;</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">gasReactionCoeffs</span>\n    <span class=\"p\">{</span>\n        <span class=\"n\">useVoidFractionCorrection</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n        <span class=\"n\">CH4</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n        <span class=\"n\">e1</span> <span class=\"mf\">0.0</span><span class=\"p\">;</span>\n        <span class=\"n\">e2</span> <span class=\"mf\">0.1</span><span class=\"p\">;</span>\n        <span class=\"n\">e3</span> <span class=\"mf\">0.0</span><span class=\"p\">;</span>\n        <span class=\"n\">e4</span> <span class=\"mf\">0.0</span><span class=\"p\">;</span>\n        <span class=\"n\">e5</span> <span class=\"mf\">0.0</span><span class=\"p\">;</span>\n        <span class=\"n\">e6</span> <span class=\"mf\">0.0</span><span class=\"p\">;</span>\n    <span class=\"p\">}</span>\n     <span class=\"n\">solidProps</span>\n     <span class=\"p\">{</span>\n        <span class=\"n\">particles</span> <span class=\"mf\">0.5</span><span class=\"p\">;</span>\n        <span class=\"n\">C</span> <span class=\"mf\">0.5</span><span class=\"p\">;</span>\n     <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<hr class=\"docutils\" />\n</section>\n<section id=\"models-solvers\">\n<span id=\"comm\"></span><span id=\"cmd-5\"></span><h3>Models/Solvers<a class=\"headerlink\" href=\"#models-solvers\" title=\"Permalink to this headline\"></a></h3>\n<p>This section lists all CFDEMcoupling sub-models and solvers alphabetically, with a separate\nlisting below of styles within certain commands.</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 100%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"IOModel.html\"><span class=\"doc\">IOModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"IOModel_basicIO.html\"><span class=\"doc\">IOModel_basicIO</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"IOModel_noIO.html\"><span class=\"doc\">IOModel_noIO</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"IOModel_sophIO.html\"><span class=\"doc\">IOModel_sophIO</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"IOModel_trackIO.html\"><span class=\"doc\">IOModel_trackIO</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"averagingModel.html\"><span class=\"doc\">averagingModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"averagingModel_dense.html\"><span class=\"doc\">averagingModel_dense</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"averagingModel_dilute.html\"><span class=\"doc\">averagingModel_dilute</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"cfdemSolverIB.html\"><span class=\"doc\">cfdemSolverIB</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"cfdemSolverPiso.html\"><span class=\"doc\">cfdemSolverPiso</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"cfdemSolverPisoSTM.html\"><span class=\"doc\">cfdemSolverPisoSTM</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"cfdemSolverPisoScalar.html\"><span class=\"doc\">cfdemSolverPisoScalar</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"clockModel.html\"><span class=\"doc\">clockModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"clockModel_noClock.html\"><span class=\"doc\">clockModel_noClock</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"clockModel_standardClock.html\"><span class=\"doc\">clockModel_standardClock</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"fix_couple_cfd.html\"><span class=\"doc\">couple/cfd</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"fix_couple_cfd_force.html\"><span class=\"doc\">couple/cfd/force</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"dataExchangeModel.html\"><span class=\"doc\">dataExchangeModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"dataExchangeModel_noDataExchange.html\"><span class=\"doc\">dataExchangeModel_noDataExchange</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"dataExchangeModel_oneWayVTK.html\"><span class=\"doc\">dataExchangeModel_oneWayVTK</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"dataExchangeModel_twoWayFiles.html\"><span class=\"doc\">dataExchangeModel_twoWayFiles</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"dataExchangeModel_twoWayMPI.html\"><span class=\"doc\">dataExchangeModel_twoWayMPI</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_Archimedes.html\"><span class=\"doc\">forceModel_Archimedes</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_ArchimedesIB.html\"><span class=\"doc\">forceModel_ArchimedesIB</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_DiFeliceDrag.html\"><span class=\"doc\">forceModel_DiFeliceDrag</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_GidaspowDrag.html\"><span class=\"doc\">forceModel_GidaspowDrag</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_KochHillDrag.html\"><span class=\"doc\">forceModel_KochHillDrag</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_LaEuScalarTemp.html\"><span class=\"doc\">forceModel_LaEuScalarTemp</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_MeiLift.html\"><span class=\"doc\">forceModel_MeiLift</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_SchillerNaumannDrag.html\"><span class=\"doc\">forceModel_SchillerNaumannDrag</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_ShirgaonkarIB.html\"><span class=\"doc\">forceModel_ShirgaonkarIB</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_checkCouplingInterval.html\"><span class=\"doc\">forceModel_checkCouplingInterval</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_fieldStore.html\"><span class=\"doc\">forceModel_fieldStore</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_fieldTimeAverage.html\"><span class=\"doc\">forceModel_fieldTimeAverage</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_gradPForce.html\"><span class=\"doc\">forceModel_gradPForce</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_noDrag.html\"><span class=\"doc\">forceModel_noDrag</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_particleCellVolume.html\"><span class=\"doc\">forceModel_particleCellVolume</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_particleVolume.html\"><span class=\"doc\">forceModel_particleVolume</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_periodicPressure.html\"><span class=\"doc\">forceModel_periodicPressure</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_scalarGeneralExchange.html\"><span class=\"doc\">forceModel_scalarGeneralExchange</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_virtualMassForce.html\"><span class=\"doc\">forceModel_virtualMassForce</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceModel_viscForce.html\"><span class=\"doc\">forceModel_viscForce</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceModel_volWeightedAverage.html\"><span class=\"doc\">forceModel_volWeightedAverage</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"forceSubModel_ImEx.html\"><span class=\"doc\">forceSubModel_ImEx</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"fvOptions_meanSupVelocityForce.html\"><span class=\"doc\">fvOptions_meanSupVelocityForce</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel_execute.html\"><span class=\"doc\">liggghtsCommandModel_execute</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel_readLiggghtsData.html\"><span class=\"doc\">liggghtsCommandModel_readLiggghtsData</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel_runLiggghts.html\"><span class=\"doc\">liggghtsCommandModel_runLiggghts</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel_setDEMGravity.html\"><span class=\"doc\">liggghtsCommandModel_setDEMGravity</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"liggghtsCommandModel_writeLiggghts.html\"><span class=\"doc\">liggghtsCommandModel_writeLiggghts</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"locateModel.html\"><span class=\"doc\">locateModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"locateModel_engineSearch.html\"><span class=\"doc\">locateModel_engineSearch</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"locateModel_engineSearchIB.html\"><span class=\"doc\">locateModel_engineSearchIB</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"locateModel_standardSearch.html\"><span class=\"doc\">locateModel_standardSearch</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"meshMotionModel.html\"><span class=\"doc\">meshMotionModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"meshMotionModel_noMeshMotion.html\"><span class=\"doc\">meshMotionModel_noMeshMotion</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"momCoupleModel.html\"><span class=\"doc\">momCoupleModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"momCoupleModel_explicitCouple.html\"><span class=\"doc\">momCoupleModel_explicitCouple</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"momCoupleModel_implicitCouple.html\"><span class=\"doc\">momCoupleModel_implicitCouple</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"momCoupleModel_noCouple.html\"><span class=\"doc\">momCoupleModel_noCouple</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"probeModel.html\"><span class=\"doc\">probeModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"probeModel_noProbe.html\"><span class=\"doc\">probeModel_noProbe</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"probeModel_particleProbe.html\"><span class=\"doc\">probeModel_particleProbe</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"scalarTransportModel.html\"><span class=\"doc\">scalarTransportModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"scalarTransportModel_generalManual.html\"><span class=\"doc\">scalarTransportModel_generalManual</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"smoothingModel.html\"><span class=\"doc\">smoothingModel</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"smoothingModel_constDiffSmoothing.html\"><span class=\"doc\">smoothingModel_constDiffSmoothing</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"smoothingModel_noSmoothing.html\"><span class=\"doc\">smoothingModel_noSmoothing</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_GaussVoidFraction.html\"><span class=\"doc\">voidfractionModel_GaussVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_IBVoidFraction.html\"><span class=\"doc\">voidfractionModel_IBVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_bigParticleVoidFraction.html\"><span class=\"doc\">voidfractionModel_bigParticleVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_centreVoidFraction.html\"><span class=\"doc\">voidfractionModel_centreVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_dividedVoidFraction.html\"><span class=\"doc\">voidfractionModel_dividedVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_noVoidFraction.html\"><span class=\"doc\">voidfractionModel_noVoidFractionVoidFraction</span></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><a class=\"reference internal\" href=\"voidFractionModel_trilinearVoidFraction.html\"><span class=\"doc\">voidfractionModel_trilinearVoidFraction</span></a></p></td>\n</tr>\n</tbody>\n</table>\n</section>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/IOModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>IOModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">IOModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>IOModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"iomodel-command\">\n<span id=\"index-0\"></span><h1>IOModel command<a class=\"headerlink\" href=\"#iomodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of IO-model to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>IOModel “off”;</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (IOModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The IO-model is the base class to write data (e.g. particle properties) to files within the CFD file-structure.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"IOModel_basicIO.html\"><span class=\"doc\">basicIO</span></a>, <a class=\"reference internal\" href=\"IOModel_noIO.html\"><span class=\"doc\">noIO</span></a>, <a class=\"reference internal\" href=\"IOModel_sophIO.html\"><span class=\"doc\">sophIO</span></a>, <a class=\"reference internal\" href=\"IOModel_trackIO.html\"><span class=\"doc\">trackIO</span></a></p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/IOModel_basicIO.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>IOModel_basicIO command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">IOModel_basicIO command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>IOModel_basicIO command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"iomodel-basicio-command\">\n<span id=\"index-0\"></span><h1>IOModel_basicIO command<a class=\"headerlink\" href=\"#iomodel-basicio-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;basicIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;basicIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The basic IO-model writes particle positions velocities and radii to files. The default output directory ($casePath/CFD/proc*/time/lagrangian). Using the keyword “serialOutput;” in couplingProperties the IO is serial to the directory ($casePath/CFD/lagrangian). In the latter case only the data on processor 0 is written! Data is written every write time of the CFD simulation.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"IOModel.html\"><span class=\"doc\">IOModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/IOModel_noIO.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>IOModel_noIO command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">IOModel_noIO command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>IOModel_noIO command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"iomodel-noio-command\">\n<span id=\"index-0\"></span><h1>IOModel_noIO command<a class=\"headerlink\" href=\"#iomodel-noio-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;off&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;off&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The noIO-model is a dummy IO model.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"IOModel.html\"><span class=\"doc\">IOModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/IOModel_sophIO.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>IOModel_sophIO command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">IOModel_sophIO command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>IOModel_sophIO command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"iomodel-sophio-command\">\n<span id=\"index-0\"></span><h1>IOModel_sophIO command<a class=\"headerlink\" href=\"#iomodel-sophio-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;sophIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;sophIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The sophIO-model is based on basicIO model and additionally writes voidfraction, implicit forces, explicit forces. Data is written every write time of the CFD simulation.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"IOModel.html\"><span class=\"doc\">IOModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/IOModel_trackIO.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>IOModel_trackIO command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">IOModel_trackIO command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>IOModel_trackIO command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"iomodel-trackio-command\">\n<span id=\"index-0\"></span><h1>IOModel_trackIO command<a class=\"headerlink\" href=\"#iomodel-trackio-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;trackIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">IOModel</span> <span class=\"s2\">&quot;trackIO&quot;</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The trackIO-model writes in addition to basicIO fields the particleID from LIGGGHTS. This id can be used with Paraviews TemporalParticlesToPathlines filter to generate particle path-lines in post-processing.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"IOModel.html\"><span class=\"doc\">IOModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/_static/basic.css",
    "content": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/* -- main layout ----------------------------------------------------------- */\n\ndiv.clearer {\n    clear: both;\n}\n\ndiv.section::after {\n    display: block;\n    content: '';\n    clear: left;\n}\n\n/* -- relbar ---------------------------------------------------------------- */\n\ndiv.related {\n    width: 100%;\n    font-size: 90%;\n}\n\ndiv.related h3 {\n    display: none;\n}\n\ndiv.related ul {\n    margin: 0;\n    padding: 0 0 0 10px;\n    list-style: none;\n}\n\ndiv.related li {\n    display: inline;\n}\n\ndiv.related li.right {\n    float: right;\n    margin-right: 5px;\n}\n\n/* -- sidebar --------------------------------------------------------------- */\n\ndiv.sphinxsidebarwrapper {\n    padding: 10px 5px 0 10px;\n}\n\ndiv.sphinxsidebar {\n    float: left;\n    width: 230px;\n    margin-left: -100%;\n    font-size: 90%;\n    word-wrap: break-word;\n    overflow-wrap : break-word;\n}\n\ndiv.sphinxsidebar ul {\n    list-style: none;\n}\n\ndiv.sphinxsidebar ul ul,\ndiv.sphinxsidebar ul.want-points {\n    margin-left: 20px;\n    list-style: square;\n}\n\ndiv.sphinxsidebar ul ul {\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\ndiv.sphinxsidebar form {\n    margin-top: 10px;\n}\n\ndiv.sphinxsidebar input {\n    border: 1px solid #98dbcc;\n    font-family: sans-serif;\n    font-size: 1em;\n}\n\ndiv.sphinxsidebar #searchbox form.search {\n    overflow: hidden;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"text\"] {\n    float: left;\n    width: 80%;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\ndiv.sphinxsidebar #searchbox input[type=\"submit\"] {\n    float: left;\n    width: 20%;\n    border-left: none;\n    padding: 0.25em;\n    box-sizing: border-box;\n}\n\n\nimg {\n    border: 0;\n    max-width: 100%;\n}\n\n/* -- search page ----------------------------------------------------------- */\n\nul.search {\n    margin: 10px 0 0 20px;\n    padding: 0;\n}\n\nul.search li {\n    padding: 5px 0 5px 20px;\n    background-image: url(file.png);\n    background-repeat: no-repeat;\n    background-position: 0 7px;\n}\n\nul.search li a {\n    font-weight: bold;\n}\n\nul.search li p.context {\n    color: #888;\n    margin: 2px 0 0 30px;\n    text-align: left;\n}\n\nul.keywordmatches li.goodmatch a {\n    font-weight: bold;\n}\n\n/* -- index page ------------------------------------------------------------ */\n\ntable.contentstable {\n    width: 90%;\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.contentstable p.biglink {\n    line-height: 150%;\n}\n\na.biglink {\n    font-size: 1.3em;\n}\n\nspan.linkdescr {\n    font-style: italic;\n    padding-top: 5px;\n    font-size: 90%;\n}\n\n/* -- general index --------------------------------------------------------- */\n\ntable.indextable {\n    width: 100%;\n}\n\ntable.indextable td {\n    text-align: left;\n    vertical-align: top;\n}\n\ntable.indextable ul {\n    margin-top: 0;\n    margin-bottom: 0;\n    list-style-type: none;\n}\n\ntable.indextable > tbody > tr > td > ul {\n    padding-left: 0em;\n}\n\ntable.indextable tr.pcap {\n    height: 10px;\n}\n\ntable.indextable tr.cap {\n    margin-top: 10px;\n    background-color: #f2f2f2;\n}\n\nimg.toggler {\n    margin-right: 3px;\n    margin-top: 3px;\n    cursor: pointer;\n}\n\ndiv.modindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\ndiv.genindex-jumpbox {\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 1em 0 1em 0;\n    padding: 0.4em;\n}\n\n/* -- domain module index --------------------------------------------------- */\n\ntable.modindextable td {\n    padding: 2px;\n    border-collapse: collapse;\n}\n\n/* -- general body styles --------------------------------------------------- */\n\ndiv.body {\n    min-width: 450px;\n    max-width: 800px;\n}\n\ndiv.body p, div.body dd, div.body li, div.body blockquote {\n    -moz-hyphens: auto;\n    -ms-hyphens: auto;\n    -webkit-hyphens: auto;\n    hyphens: auto;\n}\n\na.headerlink {\n    visibility: hidden;\n}\n\na.brackets:before,\nspan.brackets > a:before{\n    content: \"[\";\n}\n\na.brackets:after,\nspan.brackets > a:after {\n    content: \"]\";\n}\n\nh1:hover > a.headerlink,\nh2:hover > a.headerlink,\nh3:hover > a.headerlink,\nh4:hover > a.headerlink,\nh5:hover > a.headerlink,\nh6:hover > a.headerlink,\ndt:hover > a.headerlink,\ncaption:hover > a.headerlink,\np.caption:hover > a.headerlink,\ndiv.code-block-caption:hover > a.headerlink {\n    visibility: visible;\n}\n\ndiv.body p.caption {\n    text-align: inherit;\n}\n\ndiv.body td {\n    text-align: left;\n}\n\n.first {\n    margin-top: 0 !important;\n}\n\np.rubric {\n    margin-top: 30px;\n    font-weight: bold;\n}\n\nimg.align-left, figure.align-left, .figure.align-left, object.align-left {\n    clear: left;\n    float: left;\n    margin-right: 1em;\n}\n\nimg.align-right, figure.align-right, .figure.align-right, object.align-right {\n    clear: right;\n    float: right;\n    margin-left: 1em;\n}\n\nimg.align-center, figure.align-center, .figure.align-center, object.align-center {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\nimg.align-default, figure.align-default, .figure.align-default {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.align-left {\n    text-align: left;\n}\n\n.align-center {\n    text-align: center;\n}\n\n.align-default {\n    text-align: center;\n}\n\n.align-right {\n    text-align: right;\n}\n\n/* -- sidebars -------------------------------------------------------------- */\n\ndiv.sidebar,\naside.sidebar {\n    margin: 0 0 0.5em 1em;\n    border: 1px solid #ddb;\n    padding: 7px;\n    background-color: #ffe;\n    width: 40%;\n    float: right;\n    clear: right;\n    overflow-x: auto;\n}\n\np.sidebar-title {\n    font-weight: bold;\n}\n\ndiv.admonition, div.topic, blockquote {\n    clear: left;\n}\n\n/* -- topics ---------------------------------------------------------------- */\n\ndiv.topic {\n    border: 1px solid #ccc;\n    padding: 7px;\n    margin: 10px 0 10px 0;\n}\n\np.topic-title {\n    font-size: 1.1em;\n    font-weight: bold;\n    margin-top: 10px;\n}\n\n/* -- admonitions ----------------------------------------------------------- */\n\ndiv.admonition {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    padding: 7px;\n}\n\ndiv.admonition dt {\n    font-weight: bold;\n}\n\np.admonition-title {\n    margin: 0px 10px 5px 0px;\n    font-weight: bold;\n}\n\ndiv.body p.centered {\n    text-align: center;\n    margin-top: 25px;\n}\n\n/* -- content of sidebars/topics/admonitions -------------------------------- */\n\ndiv.sidebar > :last-child,\naside.sidebar > :last-child,\ndiv.topic > :last-child,\ndiv.admonition > :last-child {\n    margin-bottom: 0;\n}\n\ndiv.sidebar::after,\naside.sidebar::after,\ndiv.topic::after,\ndiv.admonition::after,\nblockquote::after {\n    display: block;\n    content: '';\n    clear: both;\n}\n\n/* -- tables ---------------------------------------------------------------- */\n\ntable.docutils {\n    margin-top: 10px;\n    margin-bottom: 10px;\n    border: 0;\n    border-collapse: collapse;\n}\n\ntable.align-center {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable.align-default {\n    margin-left: auto;\n    margin-right: auto;\n}\n\ntable caption span.caption-number {\n    font-style: italic;\n}\n\ntable caption span.caption-text {\n}\n\ntable.docutils td, table.docutils th {\n    padding: 1px 8px 1px 5px;\n    border-top: 0;\n    border-left: 0;\n    border-right: 0;\n    border-bottom: 1px solid #aaa;\n}\n\ntable.footnote td, table.footnote th {\n    border: 0 !important;\n}\n\nth {\n    text-align: left;\n    padding-right: 5px;\n}\n\ntable.citation {\n    border-left: solid 1px gray;\n    margin-left: 1px;\n}\n\ntable.citation td {\n    border-bottom: none;\n}\n\nth > :first-child,\ntd > :first-child {\n    margin-top: 0px;\n}\n\nth > :last-child,\ntd > :last-child {\n    margin-bottom: 0px;\n}\n\n/* -- figures --------------------------------------------------------------- */\n\ndiv.figure, figure {\n    margin: 0.5em;\n    padding: 0.5em;\n}\n\ndiv.figure p.caption, figcaption {\n    padding: 0.3em;\n}\n\ndiv.figure p.caption span.caption-number,\nfigcaption span.caption-number {\n    font-style: italic;\n}\n\ndiv.figure p.caption span.caption-text,\nfigcaption span.caption-text {\n}\n\n/* -- field list styles ----------------------------------------------------- */\n\ntable.field-list td, table.field-list th {\n    border: 0 !important;\n}\n\n.field-list ul {\n    margin: 0;\n    padding-left: 1em;\n}\n\n.field-list p {\n    margin: 0;\n}\n\n.field-name {\n    -moz-hyphens: manual;\n    -ms-hyphens: manual;\n    -webkit-hyphens: manual;\n    hyphens: manual;\n}\n\n/* -- hlist styles ---------------------------------------------------------- */\n\ntable.hlist {\n    margin: 1em 0;\n}\n\ntable.hlist td {\n    vertical-align: top;\n}\n\n/* -- object description styles --------------------------------------------- */\n\n.sig {\n\tfont-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;\n}\n\n.sig-name, code.descname {\n    background-color: transparent;\n    font-weight: bold;\n}\n\n.sig-name {\n\tfont-size: 1.1em;\n}\n\ncode.descname {\n    font-size: 1.2em;\n}\n\n.sig-prename, code.descclassname {\n    background-color: transparent;\n}\n\n.optional {\n    font-size: 1.3em;\n}\n\n.sig-paren {\n    font-size: larger;\n}\n\n.sig-param.n {\n\tfont-style: italic;\n}\n\n/* C++ specific styling */\n\n.sig-inline.c-texpr,\n.sig-inline.cpp-texpr {\n\tfont-family: unset;\n}\n\n.sig.c   .k, .sig.c   .kt,\n.sig.cpp .k, .sig.cpp .kt {\n\tcolor: #0033B3;\n}\n\n.sig.c   .m,\n.sig.cpp .m {\n\tcolor: #1750EB;\n}\n\n.sig.c   .s, .sig.c   .sc,\n.sig.cpp .s, .sig.cpp .sc {\n\tcolor: #067D17;\n}\n\n\n/* -- other body styles ----------------------------------------------------- */\n\nol.arabic {\n    list-style: decimal;\n}\n\nol.loweralpha {\n    list-style: lower-alpha;\n}\n\nol.upperalpha {\n    list-style: upper-alpha;\n}\n\nol.lowerroman {\n    list-style: lower-roman;\n}\n\nol.upperroman {\n    list-style: upper-roman;\n}\n\n:not(li) > ol > li:first-child > :first-child,\n:not(li) > ul > li:first-child > :first-child {\n    margin-top: 0px;\n}\n\n:not(li) > ol > li:last-child > :last-child,\n:not(li) > ul > li:last-child > :last-child {\n    margin-bottom: 0px;\n}\n\nol.simple ol p,\nol.simple ul p,\nul.simple ol p,\nul.simple ul p {\n    margin-top: 0;\n}\n\nol.simple > li:not(:first-child) > p,\nul.simple > li:not(:first-child) > p {\n    margin-top: 0;\n}\n\nol.simple p,\nul.simple p {\n    margin-bottom: 0;\n}\n\ndl.footnote > dt,\ndl.citation > dt {\n    float: left;\n    margin-right: 0.5em;\n}\n\ndl.footnote > dd,\ndl.citation > dd {\n    margin-bottom: 0em;\n}\n\ndl.footnote > dd:after,\ndl.citation > dd:after {\n    content: \"\";\n    clear: both;\n}\n\ndl.field-list {\n    display: grid;\n    grid-template-columns: fit-content(30%) auto;\n}\n\ndl.field-list > dt {\n    font-weight: bold;\n    word-break: break-word;\n    padding-left: 0.5em;\n    padding-right: 5px;\n}\n\ndl.field-list > dt:after {\n    content: \":\";\n}\n\ndl.field-list > dd {\n    padding-left: 0.5em;\n    margin-top: 0em;\n    margin-left: 0em;\n    margin-bottom: 0em;\n}\n\ndl {\n    margin-bottom: 15px;\n}\n\ndd > :first-child {\n    margin-top: 0px;\n}\n\ndd ul, dd table {\n    margin-bottom: 10px;\n}\n\ndd {\n    margin-top: 3px;\n    margin-bottom: 10px;\n    margin-left: 30px;\n}\n\ndl > dd:last-child,\ndl > dd:last-child > :last-child {\n    margin-bottom: 0;\n}\n\ndt:target, span.highlighted {\n    background-color: #fbe54e;\n}\n\nrect.highlighted {\n    fill: #fbe54e;\n}\n\ndl.glossary dt {\n    font-weight: bold;\n    font-size: 1.1em;\n}\n\n.versionmodified {\n    font-style: italic;\n}\n\n.system-message {\n    background-color: #fda;\n    padding: 5px;\n    border: 3px solid red;\n}\n\n.footnote:target  {\n    background-color: #ffa;\n}\n\n.line-block {\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n}\n\n.line-block .line-block {\n    margin-top: 0;\n    margin-bottom: 0;\n    margin-left: 1.5em;\n}\n\n.guilabel, .menuselection {\n    font-family: sans-serif;\n}\n\n.accelerator {\n    text-decoration: underline;\n}\n\n.classifier {\n    font-style: oblique;\n}\n\n.classifier:before {\n    font-style: normal;\n    margin: 0 0.5em;\n    content: \":\";\n    display: inline-block;\n}\n\nabbr, acronym {\n    border-bottom: dotted 1px;\n    cursor: help;\n}\n\n/* -- code displays --------------------------------------------------------- */\n\npre {\n    overflow: auto;\n    overflow-y: hidden;  /* fixes display issues on Chrome browsers */\n}\n\npre, div[class*=\"highlight-\"] {\n    clear: both;\n}\n\nspan.pre {\n    -moz-hyphens: none;\n    -ms-hyphens: none;\n    -webkit-hyphens: none;\n    hyphens: none;\n}\n\ndiv[class*=\"highlight-\"] {\n    margin: 1em 0;\n}\n\ntd.linenos pre {\n    border: 0;\n    background-color: transparent;\n    color: #aaa;\n}\n\ntable.highlighttable {\n    display: block;\n}\n\ntable.highlighttable tbody {\n    display: block;\n}\n\ntable.highlighttable tr {\n    display: flex;\n}\n\ntable.highlighttable td {\n    margin: 0;\n    padding: 0;\n}\n\ntable.highlighttable td.linenos {\n    padding-right: 0.5em;\n}\n\ntable.highlighttable td.code {\n    flex: 1;\n    overflow: hidden;\n}\n\n.highlight .hll {\n    display: block;\n}\n\ndiv.highlight pre,\ntable.highlighttable pre {\n    margin: 0;\n}\n\ndiv.code-block-caption + div {\n    margin-top: 0;\n}\n\ndiv.code-block-caption {\n    margin-top: 1em;\n    padding: 2px 5px;\n    font-size: small;\n}\n\ndiv.code-block-caption code {\n    background-color: transparent;\n}\n\ntable.highlighttable td.linenos,\nspan.linenos,\ndiv.highlight span.gp {  /* gp: Generic.Prompt */\n  user-select: none;\n  -webkit-user-select: text; /* Safari fallback only */\n  -webkit-user-select: none; /* Chrome/Safari */\n  -moz-user-select: none; /* Firefox */\n  -ms-user-select: none; /* IE10+ */\n}\n\ndiv.code-block-caption span.caption-number {\n    padding: 0.1em 0.3em;\n    font-style: italic;\n}\n\ndiv.code-block-caption span.caption-text {\n}\n\ndiv.literal-block-wrapper {\n    margin: 1em 0;\n}\n\ncode.xref, a code {\n    background-color: transparent;\n    font-weight: bold;\n}\n\nh1 code, h2 code, h3 code, h4 code, h5 code, h6 code {\n    background-color: transparent;\n}\n\n.viewcode-link {\n    float: right;\n}\n\n.viewcode-back {\n    float: right;\n    font-family: sans-serif;\n}\n\ndiv.viewcode-block:target {\n    margin: -1px -10px;\n    padding: 0 10px;\n}\n\n/* -- math display ---------------------------------------------------------- */\n\nimg.math {\n    vertical-align: middle;\n}\n\ndiv.body div.math p {\n    text-align: center;\n}\n\nspan.eqno {\n    float: right;\n}\n\nspan.eqno a.headerlink {\n    position: absolute;\n    z-index: 1;\n}\n\ndiv.math:hover a.headerlink {\n    visibility: visible;\n}\n\n/* -- printout stylesheet --------------------------------------------------- */\n\n@media print {\n    div.document,\n    div.documentwrapper,\n    div.bodywrapper {\n        margin: 0 !important;\n        width: 100%;\n    }\n\n    div.sphinxsidebar,\n    div.related,\n    div.footer,\n    #top-link {\n        display: none;\n    }\n}"
  },
  {
    "path": "doc/_build/html/_static/css/badge_only.css",
    "content": "﻿.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:\"\"}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:normal;src:url(\"../fonts/fontawesome-webfont.eot?#iefix\") format(\"embedded-opentype\"),url(\"../fonts/fontawesome-webfont.woff2\") format(\"woff2\"),url(\"../fonts/fontawesome-webfont.woff\") format(\"woff\"),url(\"../fonts/fontawesome-webfont.ttf\") format(\"truetype\"),url(\"../fonts/fontawesome-webfont.svg#FontAwesome\") format(\"svg\")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:\"\"}.icon-book:before{content:\"\"}.fa-caret-down:before{content:\"\"}.icon-caret-down:before{content:\"\"}.fa-caret-up:before{content:\"\"}.icon-caret-up:before{content:\"\"}.fa-caret-left:before{content:\"\"}.icon-caret-left:before{content:\"\"}.fa-caret-right:before{content:\"\"}.icon-caret-right:before{content:\"\"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60}.rst-versions .rst-current-version::after{clear:both;content:\"\";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge .fa-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}\n"
  },
  {
    "path": "doc/_build/html/_static/css/theme.css",
    "content": "﻿html{box-sizing:border-box}*,*::after,*::before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:\"courier new\",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:\"\";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-decoration,input[type=\"search\"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^=\"javascript:\"]:after,a[href^=\"#\"]:after{content:\"\"}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper>p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper>p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type=\"text\"],input[type=\"password\"],input[type=\"email\"],input[type=\"url\"],input[type=\"date\"],input[type=\"month\"],input[type=\"time\"],input[type=\"datetime\"],input[type=\"datetime-local\"],input[type=\"week\"],input[type=\"number\"],input[type=\"search\"],input[type=\"tel\"],input[type=\"color\"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:\"\"}.clearfix:after{clear:both}/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@font-face{font-family:'FontAwesome';src:url(\"../fonts/fontawesome-webfont.eot?v=4.7.0\");src:url(\"../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0\") format(\"embedded-opentype\"),url(\"../fonts/fontawesome-webfont.woff2?v=4.7.0\") format(\"woff2\"),url(\"../fonts/fontawesome-webfont.woff?v=4.7.0\") format(\"woff\"),url(\"../fonts/fontawesome-webfont.ttf?v=4.7.0\") format(\"truetype\"),url(\"../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular\") format(\"svg\");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.current>a button.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\"}.fa-music:before{content:\"\"}.fa-search:before,.icon-search:before{content:\"\"}.fa-envelope-o:before{content:\"\"}.fa-heart:before{content:\"\"}.fa-star:before{content:\"\"}.fa-star-o:before{content:\"\"}.fa-user:before{content:\"\"}.fa-film:before{content:\"\"}.fa-th-large:before{content:\"\"}.fa-th:before{content:\"\"}.fa-th-list:before{content:\"\"}.fa-check:before{content:\"\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\"\"}.fa-search-plus:before{content:\"\"}.fa-search-minus:before{content:\"\"}.fa-power-off:before{content:\"\"}.fa-signal:before{content:\"\"}.fa-gear:before,.fa-cog:before{content:\"\"}.fa-trash-o:before{content:\"\"}.fa-home:before,.icon-home:before{content:\"\"}.fa-file-o:before{content:\"\"}.fa-clock-o:before{content:\"\"}.fa-road:before{content:\"\"}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:\"\"}.fa-arrow-circle-o-down:before{content:\"\"}.fa-arrow-circle-o-up:before{content:\"\"}.fa-inbox:before{content:\"\"}.fa-play-circle-o:before{content:\"\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\"}.fa-refresh:before{content:\"\"}.fa-list-alt:before{content:\"\"}.fa-lock:before{content:\"\"}.fa-flag:before{content:\"\"}.fa-headphones:before{content:\"\"}.fa-volume-off:before{content:\"\"}.fa-volume-down:before{content:\"\"}.fa-volume-up:before{content:\"\"}.fa-qrcode:before{content:\"\"}.fa-barcode:before{content:\"\"}.fa-tag:before{content:\"\"}.fa-tags:before{content:\"\"}.fa-book:before,.icon-book:before{content:\"\"}.fa-bookmark:before{content:\"\"}.fa-print:before{content:\"\"}.fa-camera:before{content:\"\"}.fa-font:before{content:\"\"}.fa-bold:before{content:\"\"}.fa-italic:before{content:\"\"}.fa-text-height:before{content:\"\"}.fa-text-width:before{content:\"\"}.fa-align-left:before{content:\"\"}.fa-align-center:before{content:\"\"}.fa-align-right:before{content:\"\"}.fa-align-justify:before{content:\"\"}.fa-list:before{content:\"\"}.fa-dedent:before,.fa-outdent:before{content:\"\"}.fa-indent:before{content:\"\"}.fa-video-camera:before{content:\"\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\"\"}.fa-pencil:before{content:\"\"}.fa-map-marker:before{content:\"\"}.fa-adjust:before{content:\"\"}.fa-tint:before{content:\"\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\"}.fa-share-square-o:before{content:\"\"}.fa-check-square-o:before{content:\"\"}.fa-arrows:before{content:\"\"}.fa-step-backward:before{content:\"\"}.fa-fast-backward:before{content:\"\"}.fa-backward:before{content:\"\"}.fa-play:before{content:\"\"}.fa-pause:before{content:\"\"}.fa-stop:before{content:\"\"}.fa-forward:before{content:\"\"}.fa-fast-forward:before{content:\"\"}.fa-step-forward:before{content:\"\"}.fa-eject:before{content:\"\"}.fa-chevron-left:before{content:\"\"}.fa-chevron-right:before{content:\"\"}.fa-plus-circle:before{content:\"\"}.fa-minus-circle:before{content:\"\"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:\"\"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:\"\"}.fa-question-circle:before{content:\"\"}.fa-info-circle:before{content:\"\"}.fa-crosshairs:before{content:\"\"}.fa-times-circle-o:before{content:\"\"}.fa-check-circle-o:before{content:\"\"}.fa-ban:before{content:\"\"}.fa-arrow-left:before{content:\"\"}.fa-arrow-right:before{content:\"\"}.fa-arrow-up:before{content:\"\"}.fa-arrow-down:before{content:\"\"}.fa-mail-forward:before,.fa-share:before{content:\"\"}.fa-expand:before{content:\"\"}.fa-compress:before{content:\"\"}.fa-plus:before{content:\"\"}.fa-minus:before{content:\"\"}.fa-asterisk:before{content:\"\"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:\"\"}.fa-gift:before{content:\"\"}.fa-leaf:before{content:\"\"}.fa-fire:before,.icon-fire:before{content:\"\"}.fa-eye:before{content:\"\"}.fa-eye-slash:before{content:\"\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\"}.fa-plane:before{content:\"\"}.fa-calendar:before{content:\"\"}.fa-random:before{content:\"\"}.fa-comment:before{content:\"\"}.fa-magnet:before{content:\"\"}.fa-chevron-up:before{content:\"\"}.fa-chevron-down:before{content:\"\"}.fa-retweet:before{content:\"\"}.fa-shopping-cart:before{content:\"\"}.fa-folder:before{content:\"\"}.fa-folder-open:before{content:\"\"}.fa-arrows-v:before{content:\"\"}.fa-arrows-h:before{content:\"\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\"}.fa-twitter-square:before{content:\"\"}.fa-facebook-square:before{content:\"\"}.fa-camera-retro:before{content:\"\"}.fa-key:before{content:\"\"}.fa-gears:before,.fa-cogs:before{content:\"\"}.fa-comments:before{content:\"\"}.fa-thumbs-o-up:before{content:\"\"}.fa-thumbs-o-down:before{content:\"\"}.fa-star-half:before{content:\"\"}.fa-heart-o:before{content:\"\"}.fa-sign-out:before{content:\"\"}.fa-linkedin-square:before{content:\"\"}.fa-thumb-tack:before{content:\"\"}.fa-external-link:before{content:\"\"}.fa-sign-in:before{content:\"\"}.fa-trophy:before{content:\"\"}.fa-github-square:before{content:\"\"}.fa-upload:before{content:\"\"}.fa-lemon-o:before{content:\"\"}.fa-phone:before{content:\"\"}.fa-square-o:before{content:\"\"}.fa-bookmark-o:before{content:\"\"}.fa-phone-square:before{content:\"\"}.fa-twitter:before{content:\"\"}.fa-facebook-f:before,.fa-facebook:before{content:\"\"}.fa-github:before,.icon-github:before{content:\"\"}.fa-unlock:before{content:\"\"}.fa-credit-card:before{content:\"\"}.fa-feed:before,.fa-rss:before{content:\"\"}.fa-hdd-o:before{content:\"\"}.fa-bullhorn:before{content:\"\"}.fa-bell:before{content:\"\"}.fa-certificate:before{content:\"\"}.fa-hand-o-right:before{content:\"\"}.fa-hand-o-left:before{content:\"\"}.fa-hand-o-up:before{content:\"\"}.fa-hand-o-down:before{content:\"\"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:\"\"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:\"\"}.fa-arrow-circle-up:before{content:\"\"}.fa-arrow-circle-down:before{content:\"\"}.fa-globe:before{content:\"\"}.fa-wrench:before{content:\"\"}.fa-tasks:before{content:\"\"}.fa-filter:before{content:\"\"}.fa-briefcase:before{content:\"\"}.fa-arrows-alt:before{content:\"\"}.fa-group:before,.fa-users:before{content:\"\"}.fa-chain:before,.fa-link:before,.icon-link:before{content:\"\"}.fa-cloud:before{content:\"\"}.fa-flask:before{content:\"\"}.fa-cut:before,.fa-scissors:before{content:\"\"}.fa-copy:before,.fa-files-o:before{content:\"\"}.fa-paperclip:before{content:\"\"}.fa-save:before,.fa-floppy-o:before{content:\"\"}.fa-square:before{content:\"\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\"\"}.fa-list-ul:before{content:\"\"}.fa-list-ol:before{content:\"\"}.fa-strikethrough:before{content:\"\"}.fa-underline:before{content:\"\"}.fa-table:before{content:\"\"}.fa-magic:before{content:\"\"}.fa-truck:before{content:\"\"}.fa-pinterest:before{content:\"\"}.fa-pinterest-square:before{content:\"\"}.fa-google-plus-square:before{content:\"\"}.fa-google-plus:before{content:\"\"}.fa-money:before{content:\"\"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:\"\"}.fa-caret-up:before{content:\"\"}.fa-caret-left:before{content:\"\"}.fa-caret-right:before{content:\"\"}.fa-columns:before{content:\"\"}.fa-unsorted:before,.fa-sort:before{content:\"\"}.fa-sort-down:before,.fa-sort-desc:before{content:\"\"}.fa-sort-up:before,.fa-sort-asc:before{content:\"\"}.fa-envelope:before{content:\"\"}.fa-linkedin:before{content:\"\"}.fa-rotate-left:before,.fa-undo:before{content:\"\"}.fa-legal:before,.fa-gavel:before{content:\"\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\"}.fa-comment-o:before{content:\"\"}.fa-comments-o:before{content:\"\"}.fa-flash:before,.fa-bolt:before{content:\"\"}.fa-sitemap:before{content:\"\"}.fa-umbrella:before{content:\"\"}.fa-paste:before,.fa-clipboard:before{content:\"\"}.fa-lightbulb-o:before{content:\"\"}.fa-exchange:before{content:\"\"}.fa-cloud-download:before{content:\"\"}.fa-cloud-upload:before{content:\"\"}.fa-user-md:before{content:\"\"}.fa-stethoscope:before{content:\"\"}.fa-suitcase:before{content:\"\"}.fa-bell-o:before{content:\"\"}.fa-coffee:before{content:\"\"}.fa-cutlery:before{content:\"\"}.fa-file-text-o:before{content:\"\"}.fa-building-o:before{content:\"\"}.fa-hospital-o:before{content:\"\"}.fa-ambulance:before{content:\"\"}.fa-medkit:before{content:\"\"}.fa-fighter-jet:before{content:\"\"}.fa-beer:before{content:\"\"}.fa-h-square:before{content:\"\"}.fa-plus-square:before{content:\"\"}.fa-angle-double-left:before{content:\"\"}.fa-angle-double-right:before{content:\"\"}.fa-angle-double-up:before{content:\"\"}.fa-angle-double-down:before{content:\"\"}.fa-angle-left:before{content:\"\"}.fa-angle-right:before{content:\"\"}.fa-angle-up:before{content:\"\"}.fa-angle-down:before{content:\"\"}.fa-desktop:before{content:\"\"}.fa-laptop:before{content:\"\"}.fa-tablet:before{content:\"\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\"}.fa-circle-o:before{content:\"\"}.fa-quote-left:before{content:\"\"}.fa-quote-right:before{content:\"\"}.fa-spinner:before{content:\"\"}.fa-circle:before{content:\"\"}.fa-mail-reply:before,.fa-reply:before{content:\"\"}.fa-github-alt:before{content:\"\"}.fa-folder-o:before{content:\"\"}.fa-folder-open-o:before{content:\"\"}.fa-smile-o:before{content:\"\"}.fa-frown-o:before{content:\"\"}.fa-meh-o:before{content:\"\"}.fa-gamepad:before{content:\"\"}.fa-keyboard-o:before{content:\"\"}.fa-flag-o:before{content:\"\"}.fa-flag-checkered:before{content:\"\"}.fa-terminal:before{content:\"\"}.fa-code:before{content:\"\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\"}.fa-location-arrow:before{content:\"\"}.fa-crop:before{content:\"\"}.fa-code-fork:before{content:\"\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\"}.fa-question:before{content:\"\"}.fa-info:before{content:\"\"}.fa-exclamation:before{content:\"\"}.fa-superscript:before{content:\"\"}.fa-subscript:before{content:\"\"}.fa-eraser:before{content:\"\"}.fa-puzzle-piece:before{content:\"\"}.fa-microphone:before{content:\"\"}.fa-microphone-slash:before{content:\"\"}.fa-shield:before{content:\"\"}.fa-calendar-o:before{content:\"\"}.fa-fire-extinguisher:before{content:\"\"}.fa-rocket:before{content:\"\"}.fa-maxcdn:before{content:\"\"}.fa-chevron-circle-left:before{content:\"\"}.fa-chevron-circle-right:before{content:\"\"}.fa-chevron-circle-up:before{content:\"\"}.fa-chevron-circle-down:before{content:\"\"}.fa-html5:before{content:\"\"}.fa-css3:before{content:\"\"}.fa-anchor:before{content:\"\"}.fa-unlock-alt:before{content:\"\"}.fa-bullseye:before{content:\"\"}.fa-ellipsis-h:before{content:\"\"}.fa-ellipsis-v:before{content:\"\"}.fa-rss-square:before{content:\"\"}.fa-play-circle:before{content:\"\"}.fa-ticket:before{content:\"\"}.fa-minus-square:before{content:\"\"}.fa-minus-square-o:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li.current>a button.toctree-expand:before{content:\"\"}.fa-level-up:before{content:\"\"}.fa-level-down:before{content:\"\"}.fa-check-square:before{content:\"\"}.fa-pencil-square:before{content:\"\"}.fa-external-link-square:before{content:\"\"}.fa-share-square:before{content:\"\"}.fa-compass:before{content:\"\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\"}.fa-euro:before,.fa-eur:before{content:\"\"}.fa-gbp:before{content:\"\"}.fa-dollar:before,.fa-usd:before{content:\"\"}.fa-rupee:before,.fa-inr:before{content:\"\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\"}.fa-won:before,.fa-krw:before{content:\"\"}.fa-bitcoin:before,.fa-btc:before{content:\"\"}.fa-file:before{content:\"\"}.fa-file-text:before{content:\"\"}.fa-sort-alpha-asc:before{content:\"\"}.fa-sort-alpha-desc:before{content:\"\"}.fa-sort-amount-asc:before{content:\"\"}.fa-sort-amount-desc:before{content:\"\"}.fa-sort-numeric-asc:before{content:\"\"}.fa-sort-numeric-desc:before{content:\"\"}.fa-thumbs-up:before{content:\"\"}.fa-thumbs-down:before{content:\"\"}.fa-youtube-square:before{content:\"\"}.fa-youtube:before{content:\"\"}.fa-xing:before{content:\"\"}.fa-xing-square:before{content:\"\"}.fa-youtube-play:before{content:\"\"}.fa-dropbox:before{content:\"\"}.fa-stack-overflow:before{content:\"\"}.fa-instagram:before{content:\"\"}.fa-flickr:before{content:\"\"}.fa-adn:before{content:\"\"}.fa-bitbucket:before,.icon-bitbucket:before{content:\"\"}.fa-bitbucket-square:before{content:\"\"}.fa-tumblr:before{content:\"\"}.fa-tumblr-square:before{content:\"\"}.fa-long-arrow-down:before{content:\"\"}.fa-long-arrow-up:before{content:\"\"}.fa-long-arrow-left:before{content:\"\"}.fa-long-arrow-right:before{content:\"\"}.fa-apple:before{content:\"\"}.fa-windows:before{content:\"\"}.fa-android:before{content:\"\"}.fa-linux:before{content:\"\"}.fa-dribbble:before{content:\"\"}.fa-skype:before{content:\"\"}.fa-foursquare:before{content:\"\"}.fa-trello:before{content:\"\"}.fa-female:before{content:\"\"}.fa-male:before{content:\"\"}.fa-gittip:before,.fa-gratipay:before{content:\"\"}.fa-sun-o:before{content:\"\"}.fa-moon-o:before{content:\"\"}.fa-archive:before{content:\"\"}.fa-bug:before{content:\"\"}.fa-vk:before{content:\"\"}.fa-weibo:before{content:\"\"}.fa-renren:before{content:\"\"}.fa-pagelines:before{content:\"\"}.fa-stack-exchange:before{content:\"\"}.fa-arrow-circle-o-right:before{content:\"\"}.fa-arrow-circle-o-left:before{content:\"\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\"}.fa-dot-circle-o:before{content:\"\"}.fa-wheelchair:before{content:\"\"}.fa-vimeo-square:before{content:\"\"}.fa-turkish-lira:before,.fa-try:before{content:\"\"}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:\"\"}.fa-space-shuttle:before{content:\"\"}.fa-slack:before{content:\"\"}.fa-envelope-square:before{content:\"\"}.fa-wordpress:before{content:\"\"}.fa-openid:before{content:\"\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\"\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\"\"}.fa-yahoo:before{content:\"\"}.fa-google:before{content:\"\"}.fa-reddit:before{content:\"\"}.fa-reddit-square:before{content:\"\"}.fa-stumbleupon-circle:before{content:\"\"}.fa-stumbleupon:before{content:\"\"}.fa-delicious:before{content:\"\"}.fa-digg:before{content:\"\"}.fa-pied-piper-pp:before{content:\"\"}.fa-pied-piper-alt:before{content:\"\"}.fa-drupal:before{content:\"\"}.fa-joomla:before{content:\"\"}.fa-language:before{content:\"\"}.fa-fax:before{content:\"\"}.fa-building:before{content:\"\"}.fa-child:before{content:\"\"}.fa-paw:before{content:\"\"}.fa-spoon:before{content:\"\"}.fa-cube:before{content:\"\"}.fa-cubes:before{content:\"\"}.fa-behance:before{content:\"\"}.fa-behance-square:before{content:\"\"}.fa-steam:before{content:\"\"}.fa-steam-square:before{content:\"\"}.fa-recycle:before{content:\"\"}.fa-automobile:before,.fa-car:before{content:\"\"}.fa-cab:before,.fa-taxi:before{content:\"\"}.fa-tree:before{content:\"\"}.fa-spotify:before{content:\"\"}.fa-deviantart:before{content:\"\"}.fa-soundcloud:before{content:\"\"}.fa-database:before{content:\"\"}.fa-file-pdf-o:before{content:\"\"}.fa-file-word-o:before{content:\"\"}.fa-file-excel-o:before{content:\"\"}.fa-file-powerpoint-o:before{content:\"\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\"\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\"\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\"\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\"}.fa-file-code-o:before{content:\"\"}.fa-vine:before{content:\"\"}.fa-codepen:before{content:\"\"}.fa-jsfiddle:before{content:\"\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\"\"}.fa-circle-o-notch:before{content:\"\"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:\"\"}.fa-ge:before,.fa-empire:before{content:\"\"}.fa-git-square:before{content:\"\"}.fa-git:before{content:\"\"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:\"\"}.fa-tencent-weibo:before{content:\"\"}.fa-qq:before{content:\"\"}.fa-wechat:before,.fa-weixin:before{content:\"\"}.fa-send:before,.fa-paper-plane:before{content:\"\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\"\"}.fa-history:before{content:\"\"}.fa-circle-thin:before{content:\"\"}.fa-header:before{content:\"\"}.fa-paragraph:before{content:\"\"}.fa-sliders:before{content:\"\"}.fa-share-alt:before{content:\"\"}.fa-share-alt-square:before{content:\"\"}.fa-bomb:before{content:\"\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\"\"}.fa-tty:before{content:\"\"}.fa-binoculars:before{content:\"\"}.fa-plug:before{content:\"\"}.fa-slideshare:before{content:\"\"}.fa-twitch:before{content:\"\"}.fa-yelp:before{content:\"\"}.fa-newspaper-o:before{content:\"\"}.fa-wifi:before{content:\"\"}.fa-calculator:before{content:\"\"}.fa-paypal:before{content:\"\"}.fa-google-wallet:before{content:\"\"}.fa-cc-visa:before{content:\"\"}.fa-cc-mastercard:before{content:\"\"}.fa-cc-discover:before{content:\"\"}.fa-cc-amex:before{content:\"\"}.fa-cc-paypal:before{content:\"\"}.fa-cc-stripe:before{content:\"\"}.fa-bell-slash:before{content:\"\"}.fa-bell-slash-o:before{content:\"\"}.fa-trash:before{content:\"\"}.fa-copyright:before{content:\"\"}.fa-at:before{content:\"\"}.fa-eyedropper:before{content:\"\"}.fa-paint-brush:before{content:\"\"}.fa-birthday-cake:before{content:\"\"}.fa-area-chart:before{content:\"\"}.fa-pie-chart:before{content:\"\"}.fa-line-chart:before{content:\"\"}.fa-lastfm:before{content:\"\"}.fa-lastfm-square:before{content:\"\"}.fa-toggle-off:before{content:\"\"}.fa-toggle-on:before{content:\"\"}.fa-bicycle:before{content:\"\"}.fa-bus:before{content:\"\"}.fa-ioxhost:before{content:\"\"}.fa-angellist:before{content:\"\"}.fa-cc:before{content:\"\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\"\"}.fa-meanpath:before{content:\"\"}.fa-buysellads:before{content:\"\"}.fa-connectdevelop:before{content:\"\"}.fa-dashcube:before{content:\"\"}.fa-forumbee:before{content:\"\"}.fa-leanpub:before{content:\"\"}.fa-sellsy:before{content:\"\"}.fa-shirtsinbulk:before{content:\"\"}.fa-simplybuilt:before{content:\"\"}.fa-skyatlas:before{content:\"\"}.fa-cart-plus:before{content:\"\"}.fa-cart-arrow-down:before{content:\"\"}.fa-diamond:before{content:\"\"}.fa-ship:before{content:\"\"}.fa-user-secret:before{content:\"\"}.fa-motorcycle:before{content:\"\"}.fa-street-view:before{content:\"\"}.fa-heartbeat:before{content:\"\"}.fa-venus:before{content:\"\"}.fa-mars:before{content:\"\"}.fa-mercury:before{content:\"\"}.fa-intersex:before,.fa-transgender:before{content:\"\"}.fa-transgender-alt:before{content:\"\"}.fa-venus-double:before{content:\"\"}.fa-mars-double:before{content:\"\"}.fa-venus-mars:before{content:\"\"}.fa-mars-stroke:before{content:\"\"}.fa-mars-stroke-v:before{content:\"\"}.fa-mars-stroke-h:before{content:\"\"}.fa-neuter:before{content:\"\"}.fa-genderless:before{content:\"\"}.fa-facebook-official:before{content:\"\"}.fa-pinterest-p:before{content:\"\"}.fa-whatsapp:before{content:\"\"}.fa-server:before{content:\"\"}.fa-user-plus:before{content:\"\"}.fa-user-times:before{content:\"\"}.fa-hotel:before,.fa-bed:before{content:\"\"}.fa-viacoin:before{content:\"\"}.fa-train:before{content:\"\"}.fa-subway:before{content:\"\"}.fa-medium:before{content:\"\"}.fa-yc:before,.fa-y-combinator:before{content:\"\"}.fa-optin-monster:before{content:\"\"}.fa-opencart:before{content:\"\"}.fa-expeditedssl:before{content:\"\"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:\"\"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:\"\"}.fa-battery-2:before,.fa-battery-half:before{content:\"\"}.fa-battery-1:before,.fa-battery-quarter:before{content:\"\"}.fa-battery-0:before,.fa-battery-empty:before{content:\"\"}.fa-mouse-pointer:before{content:\"\"}.fa-i-cursor:before{content:\"\"}.fa-object-group:before{content:\"\"}.fa-object-ungroup:before{content:\"\"}.fa-sticky-note:before{content:\"\"}.fa-sticky-note-o:before{content:\"\"}.fa-cc-jcb:before{content:\"\"}.fa-cc-diners-club:before{content:\"\"}.fa-clone:before{content:\"\"}.fa-balance-scale:before{content:\"\"}.fa-hourglass-o:before{content:\"\"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:\"\"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:\"\"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:\"\"}.fa-hourglass:before{content:\"\"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:\"\"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:\"\"}.fa-hand-scissors-o:before{content:\"\"}.fa-hand-lizard-o:before{content:\"\"}.fa-hand-spock-o:before{content:\"\"}.fa-hand-pointer-o:before{content:\"\"}.fa-hand-peace-o:before{content:\"\"}.fa-trademark:before{content:\"\"}.fa-registered:before{content:\"\"}.fa-creative-commons:before{content:\"\"}.fa-gg:before{content:\"\"}.fa-gg-circle:before{content:\"\"}.fa-tripadvisor:before{content:\"\"}.fa-odnoklassniki:before{content:\"\"}.fa-odnoklassniki-square:before{content:\"\"}.fa-get-pocket:before{content:\"\"}.fa-wikipedia-w:before{content:\"\"}.fa-safari:before{content:\"\"}.fa-chrome:before{content:\"\"}.fa-firefox:before{content:\"\"}.fa-opera:before{content:\"\"}.fa-internet-explorer:before{content:\"\"}.fa-tv:before,.fa-television:before{content:\"\"}.fa-contao:before{content:\"\"}.fa-500px:before{content:\"\"}.fa-amazon:before{content:\"\"}.fa-calendar-plus-o:before{content:\"\"}.fa-calendar-minus-o:before{content:\"\"}.fa-calendar-times-o:before{content:\"\"}.fa-calendar-check-o:before{content:\"\"}.fa-industry:before{content:\"\"}.fa-map-pin:before{content:\"\"}.fa-map-signs:before{content:\"\"}.fa-map-o:before{content:\"\"}.fa-map:before{content:\"\"}.fa-commenting:before{content:\"\"}.fa-commenting-o:before{content:\"\"}.fa-houzz:before{content:\"\"}.fa-vimeo:before{content:\"\"}.fa-black-tie:before{content:\"\"}.fa-fonticons:before{content:\"\"}.fa-reddit-alien:before{content:\"\"}.fa-edge:before{content:\"\"}.fa-credit-card-alt:before{content:\"\"}.fa-codiepie:before{content:\"\"}.fa-modx:before{content:\"\"}.fa-fort-awesome:before{content:\"\"}.fa-usb:before{content:\"\"}.fa-product-hunt:before{content:\"\"}.fa-mixcloud:before{content:\"\"}.fa-scribd:before{content:\"\"}.fa-pause-circle:before{content:\"\"}.fa-pause-circle-o:before{content:\"\"}.fa-stop-circle:before{content:\"\"}.fa-stop-circle-o:before{content:\"\"}.fa-shopping-bag:before{content:\"\"}.fa-shopping-basket:before{content:\"\"}.fa-hashtag:before{content:\"\"}.fa-bluetooth:before{content:\"\"}.fa-bluetooth-b:before{content:\"\"}.fa-percent:before{content:\"\"}.fa-gitlab:before,.icon-gitlab:before{content:\"\"}.fa-wpbeginner:before{content:\"\"}.fa-wpforms:before{content:\"\"}.fa-envira:before{content:\"\"}.fa-universal-access:before{content:\"\"}.fa-wheelchair-alt:before{content:\"\"}.fa-question-circle-o:before{content:\"\"}.fa-blind:before{content:\"\"}.fa-audio-description:before{content:\"\"}.fa-volume-control-phone:before{content:\"\"}.fa-braille:before{content:\"\"}.fa-assistive-listening-systems:before{content:\"\"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:\"\"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:\"\"}.fa-glide:before{content:\"\"}.fa-glide-g:before{content:\"\"}.fa-signing:before,.fa-sign-language:before{content:\"\"}.fa-low-vision:before{content:\"\"}.fa-viadeo:before{content:\"\"}.fa-viadeo-square:before{content:\"\"}.fa-snapchat:before{content:\"\"}.fa-snapchat-ghost:before{content:\"\"}.fa-snapchat-square:before{content:\"\"}.fa-pied-piper:before{content:\"\"}.fa-first-order:before{content:\"\"}.fa-yoast:before{content:\"\"}.fa-themeisle:before{content:\"\"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:\"\"}.fa-fa:before,.fa-font-awesome:before{content:\"\"}.fa-handshake-o:before{content:\"\"}.fa-envelope-open:before{content:\"\"}.fa-envelope-open-o:before{content:\"\"}.fa-linode:before{content:\"\"}.fa-address-book:before{content:\"\"}.fa-address-book-o:before{content:\"\"}.fa-vcard:before,.fa-address-card:before{content:\"\"}.fa-vcard-o:before,.fa-address-card-o:before{content:\"\"}.fa-user-circle:before{content:\"\"}.fa-user-circle-o:before{content:\"\"}.fa-user-o:before{content:\"\"}.fa-id-badge:before{content:\"\"}.fa-drivers-license:before,.fa-id-card:before{content:\"\"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:\"\"}.fa-quora:before{content:\"\"}.fa-free-code-camp:before{content:\"\"}.fa-telegram:before{content:\"\"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:\"\"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:\"\"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:\"\"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:\"\"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:\"\"}.fa-shower:before{content:\"\"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:\"\"}.fa-podcast:before{content:\"\"}.fa-window-maximize:before{content:\"\"}.fa-window-minimize:before{content:\"\"}.fa-window-restore:before{content:\"\"}.fa-times-rectangle:before,.fa-window-close:before{content:\"\"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:\"\"}.fa-bandcamp:before{content:\"\"}.fa-grav:before{content:\"\"}.fa-etsy:before{content:\"\"}.fa-imdb:before{content:\"\"}.fa-ravelry:before{content:\"\"}.fa-eercast:before{content:\"\"}.fa-microchip:before{content:\"\"}.fa-snowflake-o:before{content:\"\"}.fa-superpowers:before{content:\"\"}.fa-wpexplorer:before{content:\"\"}.fa-meetup:before{content:\"\"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.current>a button.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:\"FontAwesome\";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.current>a button.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p .headerlink,.rst-content p a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content .eqno .headerlink,.rst-content .eqno a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .btn button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.btn .wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p .headerlink,.rst-content p .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content .eqno .headerlink,.rst-content .eqno .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand,.nav .wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p .headerlink,.rst-content p .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content .eqno .headerlink,.rst-content .eqno .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li button.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p .headerlink:before,.rst-content p .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:\"\"}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=\"search\"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:\" \";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:\"\"}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:\"\"}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:\" *\";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type=\"text\"],.wy-control-group .wy-form-full input[type=\"password\"],.wy-control-group .wy-form-full input[type=\"email\"],.wy-control-group .wy-form-full input[type=\"url\"],.wy-control-group .wy-form-full input[type=\"date\"],.wy-control-group .wy-form-full input[type=\"month\"],.wy-control-group .wy-form-full input[type=\"time\"],.wy-control-group .wy-form-full input[type=\"datetime\"],.wy-control-group .wy-form-full input[type=\"datetime-local\"],.wy-control-group .wy-form-full input[type=\"week\"],.wy-control-group .wy-form-full input[type=\"number\"],.wy-control-group .wy-form-full input[type=\"search\"],.wy-control-group .wy-form-full input[type=\"tel\"],.wy-control-group .wy-form-full input[type=\"color\"],.wy-control-group .wy-form-halves input[type=\"text\"],.wy-control-group .wy-form-halves input[type=\"password\"],.wy-control-group .wy-form-halves input[type=\"email\"],.wy-control-group .wy-form-halves input[type=\"url\"],.wy-control-group .wy-form-halves input[type=\"date\"],.wy-control-group .wy-form-halves input[type=\"month\"],.wy-control-group .wy-form-halves input[type=\"time\"],.wy-control-group .wy-form-halves input[type=\"datetime\"],.wy-control-group .wy-form-halves input[type=\"datetime-local\"],.wy-control-group .wy-form-halves input[type=\"week\"],.wy-control-group .wy-form-halves input[type=\"number\"],.wy-control-group .wy-form-halves input[type=\"search\"],.wy-control-group .wy-form-halves input[type=\"tel\"],.wy-control-group .wy-form-halves input[type=\"color\"],.wy-control-group .wy-form-thirds input[type=\"text\"],.wy-control-group .wy-form-thirds input[type=\"password\"],.wy-control-group .wy-form-thirds input[type=\"email\"],.wy-control-group .wy-form-thirds input[type=\"url\"],.wy-control-group .wy-form-thirds input[type=\"date\"],.wy-control-group .wy-form-thirds input[type=\"month\"],.wy-control-group .wy-form-thirds input[type=\"time\"],.wy-control-group .wy-form-thirds input[type=\"datetime\"],.wy-control-group .wy-form-thirds input[type=\"datetime-local\"],.wy-control-group .wy-form-thirds input[type=\"week\"],.wy-control-group .wy-form-thirds input[type=\"number\"],.wy-control-group .wy-form-thirds input[type=\"search\"],.wy-control-group .wy-form-thirds input[type=\"tel\"],.wy-control-group .wy-form-thirds input[type=\"color\"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576520234%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576520234%;width:48.8211739883%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576520234%;width:31.7615653177%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type=\"text\"],.wy-control-group.fluid-input input[type=\"password\"],.wy-control-group.fluid-input input[type=\"email\"],.wy-control-group.fluid-input input[type=\"url\"],.wy-control-group.fluid-input input[type=\"date\"],.wy-control-group.fluid-input input[type=\"month\"],.wy-control-group.fluid-input input[type=\"time\"],.wy-control-group.fluid-input input[type=\"datetime\"],.wy-control-group.fluid-input input[type=\"datetime-local\"],.wy-control-group.fluid-input input[type=\"week\"],.wy-control-group.fluid-input input[type=\"number\"],.wy-control-group.fluid-input input[type=\"search\"],.wy-control-group.fluid-input input[type=\"tel\"],.wy-control-group.fluid-input input[type=\"color\"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;*overflow:visible}input[type=\"text\"],input[type=\"password\"],input[type=\"email\"],input[type=\"url\"],input[type=\"date\"],input[type=\"month\"],input[type=\"time\"],input[type=\"datetime\"],input[type=\"datetime-local\"],input[type=\"week\"],input[type=\"number\"],input[type=\"search\"],input[type=\"tel\"],input[type=\"color\"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=\"datetime-local\"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=\"checkbox\"],input[type=\"radio\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=\"search\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}input[type=\"text\"]:focus,input[type=\"password\"]:focus,input[type=\"email\"]:focus,input[type=\"url\"]:focus,input[type=\"date\"]:focus,input[type=\"month\"]:focus,input[type=\"time\"]:focus,input[type=\"datetime\"]:focus,input[type=\"datetime-local\"]:focus,input[type=\"week\"]:focus,input[type=\"number\"]:focus,input[type=\"search\"]:focus,input[type=\"tel\"]:focus,input[type=\"color\"]:focus{outline:0;outline:thin dotted \\9 ;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type=\"file\"]:focus,input[type=\"radio\"]:focus,input[type=\"checkbox\"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type=\"text\"][disabled],input[type=\"password\"][disabled],input[type=\"email\"][disabled],input[type=\"url\"][disabled],input[type=\"date\"][disabled],input[type=\"month\"][disabled],input[type=\"time\"][disabled],input[type=\"datetime\"][disabled],input[type=\"datetime-local\"][disabled],input[type=\"week\"][disabled],input[type=\"number\"][disabled],input[type=\"search\"][disabled],input[type=\"tel\"][disabled],input[type=\"color\"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type=\"file\"]:focus:invalid:focus,input[type=\"radio\"]:focus:invalid:focus,input[type=\"checkbox\"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=\"radio\"][disabled],input[type=\"checkbox\"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:\"\";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:\"\";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type=\"text\"],.wy-control-group.wy-control-group-error input[type=\"password\"],.wy-control-group.wy-control-group-error input[type=\"email\"],.wy-control-group.wy-control-group-error input[type=\"url\"],.wy-control-group.wy-control-group-error input[type=\"date\"],.wy-control-group.wy-control-group-error input[type=\"month\"],.wy-control-group.wy-control-group-error input[type=\"time\"],.wy-control-group.wy-control-group-error input[type=\"datetime\"],.wy-control-group.wy-control-group-error input[type=\"datetime-local\"],.wy-control-group.wy-control-group-error input[type=\"week\"],.wy-control-group.wy-control-group-error input[type=\"number\"],.wy-control-group.wy-control-group-error input[type=\"search\"],.wy-control-group.wy-control-group-error input[type=\"tel\"],.wy-control-group.wy-control-group-error input[type=\"color\"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type=\"submit\"]{margin:.7em 0 0}.wy-form input[type=\"text\"],.wy-form input[type=\"password\"],.wy-form input[type=\"email\"],.wy-form input[type=\"url\"],.wy-form input[type=\"date\"],.wy-form input[type=\"month\"],.wy-form input[type=\"time\"],.wy-form input[type=\"datetime\"],.wy-form input[type=\"datetime-local\"],.wy-form input[type=\"week\"],.wy-form input[type=\"number\"],.wy-form input[type=\"search\"],.wy-form input[type=\"tel\"],.wy-form input[type=\"color\"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=\"password\"],.wy-form input[type=\"email\"],.wy-form input[type=\"url\"],.wy-form input[type=\"date\"],.wy-form input[type=\"month\"],.wy-form input[type=\"time\"],.wy-form input[type=\"datetime\"],.wy-form input[type=\"datetime-local\"],.wy-form input[type=\"week\"],.wy-form input[type=\"number\"],.wy-form input[type=\"search\"],.wy-form input[type=\"tel\"],.wy-form input[type=\"color\"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper>p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:\"Roboto Slab\",\"ff-tisa-web-pro\",\"Georgia\",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper>p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content .section ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content .section ol.arabic li,.rst-content section ol li,.rst-content section ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content .toctree-wrapper ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content section ol li p:last-child,.rst-content .toctree-wrapper ol li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content .section ol.arabic li ul,.rst-content section ol li ul,.rst-content section ol.arabic li ul,.rst-content .toctree-wrapper ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content .section ol.arabic li ul li,.rst-content section ol li ul li,.rst-content section ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:\"\"}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:\"\"}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover button.toctree-expand,.wy-menu-vertical li.current>a:hover button.toctree-expand{color:gray}.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li.current>a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 4.045em;padding-right:1.618em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 5.663em;padding-right:1.618em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 7.281em;padding-right:1.618em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 8.899em;padding-right:1.618em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 10.517em;padding-right:1.618em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 12.135em;padding-right:1.618em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 13.753em;padding-right:1.618em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 15.371em;padding-right:1.618em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 16.989em;padding-right:1.618em}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:\"\"}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:\"\"}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:\"\"}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:\"Lato\",\"proxima-nova\",\"Helvetica Neue\",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:\"\"}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content h1,.rst-content h2,.rst-content .toctree-wrapper>p.caption,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img,.rst-content section>img,.rst-content section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:\"\";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight span.linenos,.rst-content div.highlight .gp{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0px;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{clear:both}.rst-content .note .last,.rst-content .note>*:last-child,.rst-content .attention .last,.rst-content .attention>*:last-child,.rst-content .caution .last,.rst-content .caution>*:last-child,.rst-content .danger .last,.rst-content .danger>*:last-child,.rst-content .error .last,.rst-content .error>*:last-child,.rst-content .hint .last,.rst-content .hint>*:last-child,.rst-content .important .last,.rst-content .important>*:last-child,.rst-content .tip .last,.rst-content .tip>*:last-child,.rst-content .warning .last,.rst-content .warning>*:last-child,.rst-content .seealso .last,.rst-content .seealso>*:last-child,.rst-content .admonition-todo .last,.rst-content .admonition-todo>*:last-child,.rst-content .admonition .last,.rst-content .admonition>*:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content section ol li>*,.rst-content section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>*:first-child,.rst-content .section ul li>*:first-child,.rst-content section ol li>*:first-child,.rst-content section ul li>*:first-child,.rst-content .toctree-wrapper ol li>*:first-child,.rst-content .toctree-wrapper ul li>*:first-child{margin-top:0rem}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child{margin-bottom:0rem}.rst-content .section ol li>ul,.rst-content .section ol li>ol,.rst-content .section ul li>ul,.rst-content .section ul li>ol,.rst-content section ol li>ul,.rst-content section ol li>ol,.rst-content section ul li>ul,.rst-content section ul li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content .toctree-wrapper ul li>ol{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ul.simple li>*,.rst-content section ol.simple li>*,.rst-content section ul.simple li>*,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ul.simple li>*{margin-top:0rem;margin-bottom:0rem}.rst-content .section ol.simple li ul,.rst-content .section ol.simple li ol,.rst-content .section ul.simple li ul,.rst-content .section ul.simple li ol,.rst-content section ol.simple li ul,.rst-content section ol.simple li ol,.rst-content section ul.simple li ul,.rst-content section ul.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content .toctree-wrapper ul.simple li ol{margin-top:0rem;margin-bottom:0rem}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content h1 .headerlink:focus,.rst-content h2 .headerlink:focus,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content h3 .headerlink:focus,.rst-content h4 .headerlink:focus,.rst-content h5 .headerlink:focus,.rst-content h6 .headerlink:focus,.rst-content dl dt .headerlink:focus,.rst-content p .headerlink:focus,.rst-content p.caption .headerlink:focus,.rst-content table>caption .headerlink:focus,.rst-content .code-block-caption .headerlink:focus,.rst-content .eqno .headerlink:focus{opacity:1}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink,.rst-content p:hover .headerlink,.rst-content p.caption:hover .headerlink,.rst-content table>caption:hover .headerlink,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>*:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:\"Roboto Slab\",\"ff-tisa-web-pro\",\"Georgia\",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;box-shadow:0 0 0 2px #F1C40F;display:inline;font-weight:bold}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:\" : \"}.rst-content dl dt span.classifier-delimiter{display:none !important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.footnote,html.writer-html5 .rst-content dl.field-list{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.footnote>dt,html.writer-html5 .rst-content dl.field-list>dt{padding-left:1rem}html.writer-html5 .rst-content dl.footnote>dt:after,html.writer-html5 .rst-content dl.field-list>dt:after{content:\":\"}html.writer-html5 .rst-content dl.footnote>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.field-list>dd{margin-bottom:0rem}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0rem .5rem .5rem 0rem;line-height:1.2rem;word-break:break-all;font-weight:normal}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:\"[\"}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:\"]\"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0rem 0rem .5rem 0rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}html.writer-html4 .rst-content table.docutils.citation,.rst-content table.docutils.footnote,html.writer-html5 .rst-content dl.footnote{color:gray}html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html4 .rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code,html.writer-html5 .rst-content dl.footnote tt,html.writer-html5 .rst-content dl.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils th>p,html.writer-html5 .rst-content table.docutils td>p{line-height:1rem;margin-bottom:0rem;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>*:last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C;white-space:normal}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100% !important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100% !important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname{font-weight:bold}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",Courier,monospace;color:#000}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:\"Lato\";src:url(\"../fonts/Lato-Regular.woff2\") format(\"woff2\"),url(\"../fonts/Lato-Regular.ttf\") format(\"truetype\");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:\"Lato\";src:url(\"../fonts/Lato-Bold.woff2\") format(\"woff2\"),url(\"../fonts/Lato-Bold.ttf\") format(\"truetype\");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:\"Lato\";src:url(\"../fonts/Lato-BoldItalic.woff2\") format(\"woff2\"),url(\"../fonts/Lato-BoldItalic.ttf\") format(\"truetype\");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:\"Lato\";src:url(\"../fonts/Lato-Italic.woff2\") format(\"woff2\"),url(\"../fonts/Lato-Italic.ttf\") format(\"truetype\");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:\"Roboto Slab\";font-style:normal;font-weight:400;src:url(\"../fonts/RobotoSlab-Regular.woff2\") format(\"woff2\");font-display:block}@font-face{font-family:\"Roboto Slab\";font-style:normal;font-weight:700;src:url(\"../fonts/RobotoSlab-Bold.woff2\") format(\"woff2\");font-display:block}\n"
  },
  {
    "path": "doc/_build/html/_static/css/theme_CFDEMcoupling.css",
    "content": "/** rtd_theme improved for CFDEMcoupling **/\n\n@import 'theme.css';\n\n/* add upper roman enumerations */\n.wy-plain-list-upperroman,.rst-content .section ol,.rst-content ol.upperroman,article ol{\nlist-style:upper-roman;\nline-height:24px;\nmargin-bottom:24px}\n.wy-plain-list-upperroman li,.rst-content .section ol li,.rst-content ol.upperroman li,article ol li{\nlist-style:upper-roman;\nmargin-left:24px}\n.wy-plain-list-upperroman li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.upperroman li p:last-child,article ol li p:last-child{\nmargin-bottom:0}\n.wy-plain-list-upperroman li ul,.rst-content .section ol li ul,.rst-content ol.upperroman li ul,article ol li ul{\nmargin-bottom:0}\n.wy-plain-list-upperroman li ul li,.rst-content .section ol li ul li,.rst-content ol.upperroman li ul li,article ol li ul li{\nlist-style:disc}\n"
  },
  {
    "path": "doc/_build/html/_static/doctools.js",
    "content": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for all documentation.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\n/**\n * select a different prefix for underscore\n */\n$u = _.noConflict();\n\n/**\n * make the code below compatible with browsers without\n * an installed firebug like debugger\nif (!window.console || !console.firebug) {\n  var names = [\"log\", \"debug\", \"info\", \"warn\", \"error\", \"assert\", \"dir\",\n    \"dirxml\", \"group\", \"groupEnd\", \"time\", \"timeEnd\", \"count\", \"trace\",\n    \"profile\", \"profileEnd\"];\n  window.console = {};\n  for (var i = 0; i < names.length; ++i)\n    window.console[names[i]] = function() {};\n}\n */\n\n/**\n * small helper function to urldecode strings\n *\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL\n */\njQuery.urldecode = function(x) {\n  if (!x) {\n    return x\n  }\n  return decodeURIComponent(x.replace(/\\+/g, ' '));\n};\n\n/**\n * small helper function to urlencode strings\n */\njQuery.urlencode = encodeURIComponent;\n\n/**\n * This function returns the parsed url parameters of the\n * current request. Multiple values per key are supported,\n * it will always return arrays of strings for the value parts.\n */\njQuery.getQueryParameters = function(s) {\n  if (typeof s === 'undefined')\n    s = document.location.search;\n  var parts = s.substr(s.indexOf('?') + 1).split('&');\n  var result = {};\n  for (var i = 0; i < parts.length; i++) {\n    var tmp = parts[i].split('=', 2);\n    var key = jQuery.urldecode(tmp[0]);\n    var value = jQuery.urldecode(tmp[1]);\n    if (key in result)\n      result[key].push(value);\n    else\n      result[key] = [value];\n  }\n  return result;\n};\n\n/**\n * highlight a given string on a jquery object by wrapping it in\n * span elements with the given class name.\n */\njQuery.fn.highlightText = function(text, className) {\n  function highlight(node, addItems) {\n    if (node.nodeType === 3) {\n      var val = node.nodeValue;\n      var pos = val.toLowerCase().indexOf(text);\n      if (pos >= 0 &&\n          !jQuery(node.parentNode).hasClass(className) &&\n          !jQuery(node.parentNode).hasClass(\"nohighlight\")) {\n        var span;\n        var isInSVG = jQuery(node).closest(\"body, svg, foreignObject\").is(\"svg\");\n        if (isInSVG) {\n          span = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n        } else {\n          span = document.createElement(\"span\");\n          span.className = className;\n        }\n        span.appendChild(document.createTextNode(val.substr(pos, text.length)));\n        node.parentNode.insertBefore(span, node.parentNode.insertBefore(\n          document.createTextNode(val.substr(pos + text.length)),\n          node.nextSibling));\n        node.nodeValue = val.substr(0, pos);\n        if (isInSVG) {\n          var rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n          var bbox = node.parentElement.getBBox();\n          rect.x.baseVal.value = bbox.x;\n          rect.y.baseVal.value = bbox.y;\n          rect.width.baseVal.value = bbox.width;\n          rect.height.baseVal.value = bbox.height;\n          rect.setAttribute('class', className);\n          addItems.push({\n              \"parent\": node.parentNode,\n              \"target\": rect});\n        }\n      }\n    }\n    else if (!jQuery(node).is(\"button, select, textarea\")) {\n      jQuery.each(node.childNodes, function() {\n        highlight(this, addItems);\n      });\n    }\n  }\n  var addItems = [];\n  var result = this.each(function() {\n    highlight(this, addItems);\n  });\n  for (var i = 0; i < addItems.length; ++i) {\n    jQuery(addItems[i].parent).before(addItems[i].target);\n  }\n  return result;\n};\n\n/*\n * backward compatibility for jQuery.browser\n * This will be supported until firefox bug is fixed.\n */\nif (!jQuery.browser) {\n  jQuery.uaMatch = function(ua) {\n    ua = ua.toLowerCase();\n\n    var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n      /(msie) ([\\w.]+)/.exec(ua) ||\n      ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) ||\n      [];\n\n    return {\n      browser: match[ 1 ] || \"\",\n      version: match[ 2 ] || \"0\"\n    };\n  };\n  jQuery.browser = {};\n  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;\n}\n\n/**\n * Small JavaScript module for the documentation.\n */\nvar Documentation = {\n\n  init : function() {\n    this.fixFirefoxAnchorBug();\n    this.highlightSearchWords();\n    this.initIndexTable();\n    if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {\n      this.initOnKeyListeners();\n    }\n  },\n\n  /**\n   * i18n support\n   */\n  TRANSLATIONS : {},\n  PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },\n  LOCALE : 'unknown',\n\n  // gettext and ngettext don't access this so that the functions\n  // can safely bound to a different name (_ = Documentation.gettext)\n  gettext : function(string) {\n    var translated = Documentation.TRANSLATIONS[string];\n    if (typeof translated === 'undefined')\n      return string;\n    return (typeof translated === 'string') ? translated : translated[0];\n  },\n\n  ngettext : function(singular, plural, n) {\n    var translated = Documentation.TRANSLATIONS[singular];\n    if (typeof translated === 'undefined')\n      return (n == 1) ? singular : plural;\n    return translated[Documentation.PLURALEXPR(n)];\n  },\n\n  addTranslations : function(catalog) {\n    for (var key in catalog.messages)\n      this.TRANSLATIONS[key] = catalog.messages[key];\n    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');\n    this.LOCALE = catalog.locale;\n  },\n\n  /**\n   * add context elements like header anchor links\n   */\n  addContextElements : function() {\n    $('div[id] > :header:first').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this headline')).\n      appendTo(this);\n    });\n    $('dt[id]').each(function() {\n      $('<a class=\"headerlink\">\\u00B6</a>').\n      attr('href', '#' + this.id).\n      attr('title', _('Permalink to this definition')).\n      appendTo(this);\n    });\n  },\n\n  /**\n   * workaround a firefox stupidity\n   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075\n   */\n  fixFirefoxAnchorBug : function() {\n    if (document.location.hash && $.browser.mozilla)\n      window.setTimeout(function() {\n        document.location.href += '';\n      }, 10);\n  },\n\n  /**\n   * highlight the search words provided in the url in the text\n   */\n  highlightSearchWords : function() {\n    var params = $.getQueryParameters();\n    var terms = (params.highlight) ? params.highlight[0].split(/\\s+/) : [];\n    if (terms.length) {\n      var body = $('div.body');\n      if (!body.length) {\n        body = $('body');\n      }\n      window.setTimeout(function() {\n        $.each(terms, function() {\n          body.highlightText(this.toLowerCase(), 'highlighted');\n        });\n      }, 10);\n      $('<p class=\"highlight-link\"><a href=\"javascript:Documentation.' +\n        'hideSearchWords()\">' + _('Hide Search Matches') + '</a></p>')\n          .appendTo($('#searchbox'));\n    }\n  },\n\n  /**\n   * init the domain index toggle buttons\n   */\n  initIndexTable : function() {\n    var togglers = $('img.toggler').click(function() {\n      var src = $(this).attr('src');\n      var idnum = $(this).attr('id').substr(7);\n      $('tr.cg-' + idnum).toggle();\n      if (src.substr(-9) === 'minus.png')\n        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');\n      else\n        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');\n    }).css('display', '');\n    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {\n        togglers.click();\n    }\n  },\n\n  /**\n   * helper function to hide the search marks again\n   */\n  hideSearchWords : function() {\n    $('#searchbox .highlight-link').fadeOut(300);\n    $('span.highlighted').removeClass('highlighted');\n  },\n\n  /**\n   * make the url absolute\n   */\n  makeURL : function(relativeURL) {\n    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;\n  },\n\n  /**\n   * get the current relative url\n   */\n  getCurrentURL : function() {\n    var path = document.location.pathname;\n    var parts = path.split(/\\//);\n    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\\//), function() {\n      if (this === '..')\n        parts.pop();\n    });\n    var url = parts.join('/');\n    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);\n  },\n\n  initOnKeyListeners: function() {\n    $(document).keydown(function(event) {\n      var activeElementType = document.activeElement.tagName;\n      // don't navigate when in search box, textarea, dropdown or button\n      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'\n          && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey\n          && !event.shiftKey) {\n        switch (event.keyCode) {\n          case 37: // left\n            var prevHref = $('link[rel=\"prev\"]').prop('href');\n            if (prevHref) {\n              window.location.href = prevHref;\n              return false;\n            }\n            break;\n          case 39: // right\n            var nextHref = $('link[rel=\"next\"]').prop('href');\n            if (nextHref) {\n              window.location.href = nextHref;\n              return false;\n            }\n            break;\n        }\n      }\n    });\n  }\n};\n\n// quick alias for translations\n_ = Documentation.gettext;\n\n$(document).ready(function() {\n  Documentation.init();\n});\n"
  },
  {
    "path": "doc/_build/html/_static/documentation_options.js",
    "content": "var DOCUMENTATION_OPTIONS = {\n    URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root'),\n    VERSION: '3.8.1',\n    LANGUAGE: 'None',\n    COLLAPSE_INDEX: false,\n    BUILDER: 'html',\n    FILE_SUFFIX: '.html',\n    LINK_SUFFIX: '.html',\n    HAS_SOURCE: false,\n    SOURCELINK_SUFFIX: '.txt',\n    NAVIGATION_WITH_KEYS: false\n};\n"
  },
  {
    "path": "doc/_build/html/_static/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "doc/_build/html/_static/js/theme.js",
    "content": "var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');\n\n// Sphinx theme nav state\nfunction ThemeNav () {\n\n    var nav = {\n        navBar: null,\n        win: null,\n        winScroll: false,\n        winResize: false,\n        linkScroll: false,\n        winPosition: 0,\n        winHeight: null,\n        docHeight: null,\n        isRunning: false\n    };\n\n    nav.enable = function (withStickyNav) {\n        var self = this;\n\n        // TODO this can likely be removed once the theme javascript is broken\n        // out from the RTD assets. This just ensures old projects that are\n        // calling `enable()` get the sticky menu on by default. All other cals\n        // to `enable` should include an argument for enabling the sticky menu.\n        if (typeof(withStickyNav) == 'undefined') {\n            withStickyNav = true;\n        }\n\n        if (self.isRunning) {\n            // Only allow enabling nav logic once\n            return;\n        }\n\n        self.isRunning = true;\n        jQuery(function ($) {\n            self.init($);\n\n            self.reset();\n            self.win.on('hashchange', self.reset);\n\n            if (withStickyNav) {\n                // Set scroll monitor\n                self.win.on('scroll', function () {\n                    if (!self.linkScroll) {\n                        if (!self.winScroll) {\n                            self.winScroll = true;\n                            requestAnimationFrame(function() { self.onScroll(); });\n                        }\n                    }\n                });\n            }\n\n            // Set resize monitor\n            self.win.on('resize', function () {\n                if (!self.winResize) {\n                    self.winResize = true;\n                    requestAnimationFrame(function() { self.onResize(); });\n                }\n            });\n\n            self.onResize();\n        });\n\n    };\n\n    // TODO remove this with a split in theme and Read the Docs JS logic as\n    // well, it's only here to support 0.3.0 installs of our theme.\n    nav.enableSticky = function() {\n        this.enable(true);\n    };\n\n    nav.init = function ($) {\n        var doc = $(document),\n            self = this;\n\n        this.navBar = $('div.wy-side-scroll:first');\n        this.win = $(window);\n\n        // Set up javascript UX bits\n        $(document)\n            // Shift nav in mobile when clicking the menu.\n            .on('click', \"[data-toggle='wy-nav-top']\", function() {\n                $(\"[data-toggle='wy-nav-shift']\").toggleClass(\"shift\");\n                $(\"[data-toggle='rst-versions']\").toggleClass(\"shift\");\n            })\n\n            // Nav menu link click operations\n            .on('click', \".wy-menu-vertical .current ul li a\", function() {\n                var target = $(this);\n                // Close menu when you click a link.\n                $(\"[data-toggle='wy-nav-shift']\").removeClass(\"shift\");\n                $(\"[data-toggle='rst-versions']\").toggleClass(\"shift\");\n                // Handle dynamic display of l3 and l4 nav lists\n                self.toggleCurrent(target);\n                self.hashChange();\n            })\n            .on('click', \"[data-toggle='rst-current-version']\", function() {\n                $(\"[data-toggle='rst-versions']\").toggleClass(\"shift-up\");\n            })\n\n        // Make tables responsive\n        $(\"table.docutils:not(.field-list,.footnote,.citation)\")\n            .wrap(\"<div class='wy-table-responsive'></div>\");\n\n        // Add extra class to responsive tables that contain\n        // footnotes or citations so that we can target them for styling\n        $(\"table.docutils.footnote\")\n            .wrap(\"<div class='wy-table-responsive footnote'></div>\");\n        $(\"table.docutils.citation\")\n            .wrap(\"<div class='wy-table-responsive citation'></div>\");\n\n        // Add expand links to all parents of nested ul\n        $('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {\n            var link = $(this);\n                expand =\n                    $('<button class=\"toctree-expand\" title=\"Open/close menu\"></button>');\n            expand.on('click', function (ev) {\n                self.toggleCurrent(link);\n                ev.stopPropagation();\n                return false;\n            });\n            link.prepend(expand);\n        });\n    };\n\n    nav.reset = function () {\n        // Get anchor from URL and open up nested nav\n        var anchor = encodeURI(window.location.hash) || '#';\n\n        try {\n            var vmenu = $('.wy-menu-vertical');\n            var link = vmenu.find('[href=\"' + anchor + '\"]');\n            if (link.length === 0) {\n                // this link was not found in the sidebar.\n                // Find associated id element, then its closest section\n                // in the document and try with that one.\n                var id_elt = $('.document [id=\"' + anchor.substring(1) + '\"]');\n                var closest_section = id_elt.closest('div.section');\n                link = vmenu.find('[href=\"#' + closest_section.attr(\"id\") + '\"]');\n                if (link.length === 0) {\n                    // still not found in the sidebar. fall back to main section\n                    link = vmenu.find('[href=\"#\"]');\n                }\n            }\n            // If we found a matching link then reset current and re-apply\n            // otherwise retain the existing match\n            if (link.length > 0) {\n                $('.wy-menu-vertical .current')\n                    .removeClass('current')\n                    .attr('aria-expanded','false');\n                link.addClass('current')\n                    .attr('aria-expanded','true');\n                link.closest('li.toctree-l1')\n                    .parent()\n                    .addClass('current')\n                    .attr('aria-expanded','true');\n                for (let i = 1; i <= 10; i++) {\n                    link.closest('li.toctree-l' + i)\n                        .addClass('current')\n                        .attr('aria-expanded','true');\n                }\n                link[0].scrollIntoView();\n            }\n        }\n        catch (err) {\n            console.log(\"Error expanding nav for anchor\", err);\n        }\n\n    };\n\n    nav.onScroll = function () {\n        this.winScroll = false;\n        var newWinPosition = this.win.scrollTop(),\n            winBottom = newWinPosition + this.winHeight,\n            navPosition = this.navBar.scrollTop(),\n            newNavPosition = navPosition + (newWinPosition - this.winPosition);\n        if (newWinPosition < 0 || winBottom > this.docHeight) {\n            return;\n        }\n        this.navBar.scrollTop(newNavPosition);\n        this.winPosition = newWinPosition;\n    };\n\n    nav.onResize = function () {\n        this.winResize = false;\n        this.winHeight = this.win.height();\n        this.docHeight = $(document).height();\n    };\n\n    nav.hashChange = function () {\n        this.linkScroll = true;\n        this.win.one('hashchange', function () {\n            this.linkScroll = false;\n        });\n    };\n\n    nav.toggleCurrent = function (elem) {\n        var parent_li = elem.closest('li');\n        parent_li\n            .siblings('li.current')\n            .removeClass('current')\n            .attr('aria-expanded','false');\n        parent_li\n            .siblings()\n            .find('li.current')\n            .removeClass('current')\n            .attr('aria-expanded','false');\n        var children = parent_li.find('> ul li');\n        // Don't toggle terminal elements.\n        if (children.length) {\n            children\n                .removeClass('current')\n                .attr('aria-expanded','false');\n            parent_li\n                .toggleClass('current')\n                .attr('aria-expanded', function(i, old) {\n                    return old == 'true' ? 'false' : 'true';\n                });\n        }\n    }\n\n    return nav;\n};\n\n_ThemeNav = ThemeNav();\n\nif (typeof(window) != 'undefined') {\n    window.SphinxRtdTheme = {\n        Navigation: _ThemeNav,\n        // TODO remove this once static assets are split up between the theme\n        // and Read the Docs. For now, this patches 0.3.0 to be backwards\n        // compatible with a pre-0.3.0 layout.html\n        StickyNav: _ThemeNav,\n    };\n}\n\n\n// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel\n// https://gist.github.com/paulirish/1579671\n// MIT license\n\n(function() {\n    var lastTime = 0;\n    var vendors = ['ms', 'moz', 'webkit', 'o'];\n    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']\n                                   || window[vendors[x]+'CancelRequestAnimationFrame'];\n    }\n\n    if (!window.requestAnimationFrame)\n        window.requestAnimationFrame = function(callback, element) {\n            var currTime = new Date().getTime();\n            var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n            var id = window.setTimeout(function() { callback(currTime + timeToCall); },\n              timeToCall);\n            lastTime = currTime + timeToCall;\n            return id;\n        };\n\n    if (!window.cancelAnimationFrame)\n        window.cancelAnimationFrame = function(id) {\n            clearTimeout(id);\n        };\n}());\n"
  },
  {
    "path": "doc/_build/html/_static/language_data.js",
    "content": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,\n * namely the list of stopwords, stemmer, scorer and splitter.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nvar stopwords = [\"a\",\"and\",\"are\",\"as\",\"at\",\"be\",\"but\",\"by\",\"for\",\"if\",\"in\",\"into\",\"is\",\"it\",\"near\",\"no\",\"not\",\"of\",\"on\",\"or\",\"such\",\"that\",\"the\",\"their\",\"then\",\"there\",\"these\",\"they\",\"this\",\"to\",\"was\",\"will\",\"with\"];\n\n\n/* Non-minified version is copied as a separate JS file, is available */\n\n/**\n * Porter Stemmer\n */\nvar Stemmer = function() {\n\n  var step2list = {\n    ational: 'ate',\n    tional: 'tion',\n    enci: 'ence',\n    anci: 'ance',\n    izer: 'ize',\n    bli: 'ble',\n    alli: 'al',\n    entli: 'ent',\n    eli: 'e',\n    ousli: 'ous',\n    ization: 'ize',\n    ation: 'ate',\n    ator: 'ate',\n    alism: 'al',\n    iveness: 'ive',\n    fulness: 'ful',\n    ousness: 'ous',\n    aliti: 'al',\n    iviti: 'ive',\n    biliti: 'ble',\n    logi: 'log'\n  };\n\n  var step3list = {\n    icate: 'ic',\n    ative: '',\n    alize: 'al',\n    iciti: 'ic',\n    ical: 'ic',\n    ful: '',\n    ness: ''\n  };\n\n  var c = \"[^aeiou]\";          // consonant\n  var v = \"[aeiouy]\";          // vowel\n  var C = c + \"[^aeiouy]*\";    // consonant sequence\n  var V = v + \"[aeiou]*\";      // vowel sequence\n\n  var mgr0 = \"^(\" + C + \")?\" + V + C;                      // [C]VC... is m>0\n  var meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\";    // [C]VC[V] is m=1\n  var mgr1 = \"^(\" + C + \")?\" + V + C + V + C;              // [C]VCVC... is m>1\n  var s_v   = \"^(\" + C + \")?\" + v;                         // vowel in stem\n\n  this.stemWord = function (w) {\n    var stem;\n    var suffix;\n    var firstch;\n    var origword = w;\n\n    if (w.length < 3)\n      return w;\n\n    var re;\n    var re2;\n    var re3;\n    var re4;\n\n    firstch = w.substr(0,1);\n    if (firstch == \"y\")\n      w = firstch.toUpperCase() + w.substr(1);\n\n    // Step 1a\n    re = /^(.+?)(ss|i)es$/;\n    re2 = /^(.+?)([^s])s$/;\n\n    if (re.test(w))\n      w = w.replace(re,\"$1$2\");\n    else if (re2.test(w))\n      w = w.replace(re2,\"$1$2\");\n\n    // Step 1b\n    re = /^(.+?)eed$/;\n    re2 = /^(.+?)(ed|ing)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      re = new RegExp(mgr0);\n      if (re.test(fp[1])) {\n        re = /.$/;\n        w = w.replace(re,\"\");\n      }\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1];\n      re2 = new RegExp(s_v);\n      if (re2.test(stem)) {\n        w = stem;\n        re2 = /(at|bl|iz)$/;\n        re3 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n        re4 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n        if (re2.test(w))\n          w = w + \"e\";\n        else if (re3.test(w)) {\n          re = /.$/;\n          w = w.replace(re,\"\");\n        }\n        else if (re4.test(w))\n          w = w + \"e\";\n      }\n    }\n\n    // Step 1c\n    re = /^(.+?)y$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(s_v);\n      if (re.test(stem))\n        w = stem + \"i\";\n    }\n\n    // Step 2\n    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step2list[suffix];\n    }\n\n    // Step 3\n    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      suffix = fp[2];\n      re = new RegExp(mgr0);\n      if (re.test(stem))\n        w = stem + step3list[suffix];\n    }\n\n    // Step 4\n    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n    re2 = /^(.+?)(s|t)(ion)$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      if (re.test(stem))\n        w = stem;\n    }\n    else if (re2.test(w)) {\n      var fp = re2.exec(w);\n      stem = fp[1] + fp[2];\n      re2 = new RegExp(mgr1);\n      if (re2.test(stem))\n        w = stem;\n    }\n\n    // Step 5\n    re = /^(.+?)e$/;\n    if (re.test(w)) {\n      var fp = re.exec(w);\n      stem = fp[1];\n      re = new RegExp(mgr1);\n      re2 = new RegExp(meq1);\n      re3 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))\n        w = stem;\n    }\n    re = /ll$/;\n    re2 = new RegExp(mgr1);\n    if (re.test(w) && re2.test(w)) {\n      re = /.$/;\n      w = w.replace(re,\"\");\n    }\n\n    // and turn initial Y back to y\n    if (firstch == \"y\")\n      w = firstch.toLowerCase() + w.substr(1);\n    return w;\n  }\n}\n\n\n\n\nvar splitChars = (function() {\n    var result = {};\n    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,\n         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,\n         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,\n         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,\n         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,\n         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,\n         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,\n         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,\n         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,\n         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];\n    var i, j, start, end;\n    for (i = 0; i < singles.length; i++) {\n        result[singles[i]] = true;\n    }\n    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],\n         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],\n         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],\n         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],\n         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],\n         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],\n         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],\n         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],\n         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],\n         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],\n         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],\n         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],\n         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],\n         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],\n         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],\n         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],\n         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],\n         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],\n         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],\n         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],\n         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],\n         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],\n         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],\n         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],\n         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],\n         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],\n         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],\n         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],\n         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],\n         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],\n         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],\n         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],\n         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],\n         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],\n         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],\n         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],\n         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],\n         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],\n         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],\n         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],\n         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],\n         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],\n         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],\n         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],\n         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],\n         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],\n         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],\n         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],\n         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];\n    for (i = 0; i < ranges.length; i++) {\n        start = ranges[i][0];\n        end = ranges[i][1];\n        for (j = start; j <= end; j++) {\n            result[j] = true;\n        }\n    }\n    return result;\n})();\n\nfunction splitQuery(query) {\n    var result = [];\n    var start = -1;\n    for (var i = 0; i < query.length; i++) {\n        if (splitChars[query.charCodeAt(i)]) {\n            if (start !== -1) {\n                result.push(query.slice(start, i));\n                start = -1;\n            }\n        } else if (start === -1) {\n            start = i;\n        }\n    }\n    if (start !== -1) {\n        result.push(query.slice(start));\n    }\n    return result;\n}\n\n\n"
  },
  {
    "path": "doc/_build/html/_static/pygments.css",
    "content": "pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.highlight .hll { background-color: #ffffcc }\n.highlight { background: #eeffcc; }\n.highlight .c { color: #408090; font-style: italic } /* Comment */\n.highlight .err { border: 1px solid #FF0000 } /* Error */\n.highlight .k { color: #007020; font-weight: bold } /* Keyword */\n.highlight .o { color: #666666 } /* Operator */\n.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #007020 } /* Comment.Preproc */\n.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */\n.highlight .gd { color: #A00000 } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #FF0000 } /* Generic.Error */\n.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #00A000 } /* Generic.Inserted */\n.highlight .go { color: #333333 } /* Generic.Output */\n.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.highlight .gt { color: #0044DD } /* Generic.Traceback */\n.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */\n.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */\n.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */\n.highlight .kp { color: #007020 } /* Keyword.Pseudo */\n.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */\n.highlight .kt { color: #902000 } /* Keyword.Type */\n.highlight .m { color: #208050 } /* Literal.Number */\n.highlight .s { color: #4070a0 } /* Literal.String */\n.highlight .na { color: #4070a0 } /* Name.Attribute */\n.highlight .nb { color: #007020 } /* Name.Builtin */\n.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */\n.highlight .no { color: #60add5 } /* Name.Constant */\n.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */\n.highlight .ne { color: #007020 } /* Name.Exception */\n.highlight .nf { color: #06287e } /* Name.Function */\n.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */\n.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */\n.highlight .nv { color: #bb60d5 } /* Name.Variable */\n.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */\n.highlight .w { color: #bbbbbb } /* Text.Whitespace */\n.highlight .mb { color: #208050 } /* Literal.Number.Bin */\n.highlight .mf { color: #208050 } /* Literal.Number.Float */\n.highlight .mh { color: #208050 } /* Literal.Number.Hex */\n.highlight .mi { color: #208050 } /* Literal.Number.Integer */\n.highlight .mo { color: #208050 } /* Literal.Number.Oct */\n.highlight .sa { color: #4070a0 } /* Literal.String.Affix */\n.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */\n.highlight .sc { color: #4070a0 } /* Literal.String.Char */\n.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */\n.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */\n.highlight .s2 { color: #4070a0 } /* Literal.String.Double */\n.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */\n.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */\n.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */\n.highlight .sx { color: #c65d09 } /* Literal.String.Other */\n.highlight .sr { color: #235388 } /* Literal.String.Regex */\n.highlight .s1 { color: #4070a0 } /* Literal.String.Single */\n.highlight .ss { color: #517918 } /* Literal.String.Symbol */\n.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #06287e } /* Name.Function.Magic */\n.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */\n.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */\n.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */\n.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */\n.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */"
  },
  {
    "path": "doc/_build/html/_static/searchtools.js",
    "content": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.\n * :license: BSD, see LICENSE for details.\n *\n */\n\nif (!Scorer) {\n  /**\n   * Simple result scoring code.\n   */\n  var Scorer = {\n    // Implement the following function to further tweak the score for each result\n    // The function takes a result array [filename, title, anchor, descr, score]\n    // and returns the new score.\n    /*\n    score: function(result) {\n      return result[4];\n    },\n    */\n\n    // query matches the full name of an object\n    objNameMatch: 11,\n    // or matches in the last dotted part of the object name\n    objPartialMatch: 6,\n    // Additive scores depending on the priority of the object\n    objPrio: {0:  15,   // used to be importantResults\n              1:  5,   // used to be objectResults\n              2: -5},  // used to be unimportantResults\n    //  Used when the priority is not in the mapping.\n    objPrioDefault: 0,\n\n    // query found in title\n    title: 15,\n    partialTitle: 7,\n    // query found in terms\n    term: 5,\n    partialTerm: 2\n  };\n}\n\nif (!splitQuery) {\n  function splitQuery(query) {\n    return query.split(/\\s+/);\n  }\n}\n\n/**\n * Search Module\n */\nvar Search = {\n\n  _index : null,\n  _queued_query : null,\n  _pulse_status : -1,\n\n  htmlToText : function(htmlString) {\n      var virtualDocument = document.implementation.createHTMLDocument('virtual');\n      var htmlElement = $(htmlString, virtualDocument);\n      htmlElement.find('.headerlink').remove();\n      docContent = htmlElement.find('[role=main]')[0];\n      if(docContent === undefined) {\n          console.warn(\"Content block not found. Sphinx search tries to obtain it \" +\n                       \"via '[role=main]'. Could you check your theme or template.\");\n          return \"\";\n      }\n      return docContent.textContent || docContent.innerText;\n  },\n\n  init : function() {\n      var params = $.getQueryParameters();\n      if (params.q) {\n          var query = params.q[0];\n          $('input[name=\"q\"]')[0].value = query;\n          this.performSearch(query);\n      }\n  },\n\n  loadIndex : function(url) {\n    $.ajax({type: \"GET\", url: url, data: null,\n            dataType: \"script\", cache: true,\n            complete: function(jqxhr, textstatus) {\n              if (textstatus != \"success\") {\n                document.getElementById(\"searchindexloader\").src = url;\n              }\n            }});\n  },\n\n  setIndex : function(index) {\n    var q;\n    this._index = index;\n    if ((q = this._queued_query) !== null) {\n      this._queued_query = null;\n      Search.query(q);\n    }\n  },\n\n  hasIndex : function() {\n      return this._index !== null;\n  },\n\n  deferQuery : function(query) {\n      this._queued_query = query;\n  },\n\n  stopPulse : function() {\n      this._pulse_status = 0;\n  },\n\n  startPulse : function() {\n    if (this._pulse_status >= 0)\n        return;\n    function pulse() {\n      var i;\n      Search._pulse_status = (Search._pulse_status + 1) % 4;\n      var dotString = '';\n      for (i = 0; i < Search._pulse_status; i++)\n        dotString += '.';\n      Search.dots.text(dotString);\n      if (Search._pulse_status > -1)\n        window.setTimeout(pulse, 500);\n    }\n    pulse();\n  },\n\n  /**\n   * perform a search for something (or wait until index is loaded)\n   */\n  performSearch : function(query) {\n    // create the required interface elements\n    this.out = $('#search-results');\n    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);\n    this.dots = $('<span></span>').appendTo(this.title);\n    this.status = $('<p class=\"search-summary\">&nbsp;</p>').appendTo(this.out);\n    this.output = $('<ul class=\"search\"/>').appendTo(this.out);\n\n    $('#search-progress').text(_('Preparing search...'));\n    this.startPulse();\n\n    // index already loaded, the browser was quick!\n    if (this.hasIndex())\n      this.query(query);\n    else\n      this.deferQuery(query);\n  },\n\n  /**\n   * execute search (requires search index to be loaded)\n   */\n  query : function(query) {\n    var i;\n\n    // stem the searchterms and add them to the correct list\n    var stemmer = new Stemmer();\n    var searchterms = [];\n    var excluded = [];\n    var hlterms = [];\n    var tmp = splitQuery(query);\n    var objectterms = [];\n    for (i = 0; i < tmp.length; i++) {\n      if (tmp[i] !== \"\") {\n          objectterms.push(tmp[i].toLowerCase());\n      }\n\n      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === \"\") {\n        // skip this \"word\"\n        continue;\n      }\n      // stem the word\n      var word = stemmer.stemWord(tmp[i].toLowerCase());\n      // prevent stemmer from cutting word smaller than two chars\n      if(word.length < 3 && tmp[i].length >= 3) {\n        word = tmp[i];\n      }\n      var toAppend;\n      // select the correct list\n      if (word[0] == '-') {\n        toAppend = excluded;\n        word = word.substr(1);\n      }\n      else {\n        toAppend = searchterms;\n        hlterms.push(tmp[i].toLowerCase());\n      }\n      // only add if not already in the list\n      if (!$u.contains(toAppend, word))\n        toAppend.push(word);\n    }\n    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(\" \"));\n\n    // console.debug('SEARCH: searching for:');\n    // console.info('required: ', searchterms);\n    // console.info('excluded: ', excluded);\n\n    // prepare search\n    var terms = this._index.terms;\n    var titleterms = this._index.titleterms;\n\n    // array of [filename, title, anchor, descr, score]\n    var results = [];\n    $('#search-progress').empty();\n\n    // lookup as object\n    for (i = 0; i < objectterms.length; i++) {\n      var others = [].concat(objectterms.slice(0, i),\n                             objectterms.slice(i+1, objectterms.length));\n      results = results.concat(this.performObjectSearch(objectterms[i], others));\n    }\n\n    // lookup as search terms in fulltext\n    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));\n\n    // let the scorer override scores with a custom scoring function\n    if (Scorer.score) {\n      for (i = 0; i < results.length; i++)\n        results[i][4] = Scorer.score(results[i]);\n    }\n\n    // now sort the results by score (in opposite order of appearance, since the\n    // display function below uses pop() to retrieve items) and then\n    // alphabetically\n    results.sort(function(a, b) {\n      var left = a[4];\n      var right = b[4];\n      if (left > right) {\n        return 1;\n      } else if (left < right) {\n        return -1;\n      } else {\n        // same score: sort alphabetically\n        left = a[1].toLowerCase();\n        right = b[1].toLowerCase();\n        return (left > right) ? -1 : ((left < right) ? 1 : 0);\n      }\n    });\n\n    // for debugging\n    //Search.lastresults = results.slice();  // a copy\n    //console.info('search results:', Search.lastresults);\n\n    // print the results\n    var resultCount = results.length;\n    function displayNextItem() {\n      // results left, load the summary and display it\n      if (results.length) {\n        var item = results.pop();\n        var listItem = $('<li></li>');\n        var requestUrl = \"\";\n        var linkUrl = \"\";\n        if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {\n          // dirhtml builder\n          var dirname = item[0] + '/';\n          if (dirname.match(/\\/index\\/$/)) {\n            dirname = dirname.substring(0, dirname.length-6);\n          } else if (dirname == 'index/') {\n            dirname = '';\n          }\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;\n          linkUrl = requestUrl;\n\n        } else {\n          // normal html builders\n          requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;\n          linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;\n        }\n        listItem.append($('<a/>').attr('href',\n            linkUrl +\n            highlightstring + item[2]).html(item[1]));\n        if (item[3]) {\n          listItem.append($('<span> (' + item[3] + ')</span>'));\n          Search.output.append(listItem);\n          setTimeout(function() {\n            displayNextItem();\n          }, 5);\n        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {\n          $.ajax({url: requestUrl,\n                  dataType: \"text\",\n                  complete: function(jqxhr, textstatus) {\n                    var data = jqxhr.responseText;\n                    if (data !== '' && data !== undefined) {\n                      var summary = Search.makeSearchSummary(data, searchterms, hlterms);\n                      if (summary) {\n                        listItem.append(summary);\n                      }\n                    }\n                    Search.output.append(listItem);\n                    setTimeout(function() {\n                      displayNextItem();\n                    }, 5);\n                  }});\n        } else {\n          // no source available, just display title\n          Search.output.append(listItem);\n          setTimeout(function() {\n            displayNextItem();\n          }, 5);\n        }\n      }\n      // search finished, update title and status message\n      else {\n        Search.stopPulse();\n        Search.title.text(_('Search Results'));\n        if (!resultCount)\n          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\\'ve selected enough categories.'));\n        else\n            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));\n        Search.status.fadeIn(500);\n      }\n    }\n    displayNextItem();\n  },\n\n  /**\n   * search for object names\n   */\n  performObjectSearch : function(object, otherterms) {\n    var filenames = this._index.filenames;\n    var docnames = this._index.docnames;\n    var objects = this._index.objects;\n    var objnames = this._index.objnames;\n    var titles = this._index.titles;\n\n    var i;\n    var results = [];\n\n    for (var prefix in objects) {\n      if (!(objects[prefix] instanceof Array)) {\n        objects[prefix] = Object.entries(objects[prefix]).map(([name, match]) => [...match, name]);\n      }\n      for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) {\n        var match = objects[prefix][iMatch];\n        var name = match[4];\n        var fullname = (prefix ? prefix + '.' : '') + name;\n        var fullnameLower = fullname.toLowerCase()\n        if (fullnameLower.indexOf(object) > -1) {\n          var score = 0;\n          var parts = fullnameLower.split('.');\n          // check for different match types: exact matches of full name or\n          // \"last name\" (i.e. last dotted part)\n          if (fullnameLower == object || parts[parts.length - 1] == object) {\n            score += Scorer.objNameMatch;\n          // matches in last name\n          } else if (parts[parts.length - 1].indexOf(object) > -1) {\n            score += Scorer.objPartialMatch;\n          }\n          var objname = objnames[match[1]][2];\n          var title = titles[match[0]];\n          // If more than one term searched for, we require other words to be\n          // found in the name/title/description\n          if (otherterms.length > 0) {\n            var haystack = (prefix + ' ' + name + ' ' +\n                            objname + ' ' + title).toLowerCase();\n            var allfound = true;\n            for (i = 0; i < otherterms.length; i++) {\n              if (haystack.indexOf(otherterms[i]) == -1) {\n                allfound = false;\n                break;\n              }\n            }\n            if (!allfound) {\n              continue;\n            }\n          }\n          var descr = objname + _(', in ') + title;\n\n          var anchor = match[3];\n          if (anchor === '')\n            anchor = fullname;\n          else if (anchor == '-')\n            anchor = objnames[match[1]][1] + '-' + fullname;\n          // add custom score for some objects according to scorer\n          if (Scorer.objPrio.hasOwnProperty(match[2])) {\n            score += Scorer.objPrio[match[2]];\n          } else {\n            score += Scorer.objPrioDefault;\n          }\n          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);\n        }\n      }\n    }\n\n    return results;\n  },\n\n  /**\n   * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n   */\n  escapeRegExp : function(string) {\n    return string.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n  },\n\n  /**\n   * search for full-text terms in the index\n   */\n  performTermsSearch : function(searchterms, excluded, terms, titleterms) {\n    var docnames = this._index.docnames;\n    var filenames = this._index.filenames;\n    var titles = this._index.titles;\n\n    var i, j, file;\n    var fileMap = {};\n    var scoreMap = {};\n    var results = [];\n\n    // perform the search on the required terms\n    for (i = 0; i < searchterms.length; i++) {\n      var word = searchterms[i];\n      var files = [];\n      var _o = [\n        {files: terms[word], score: Scorer.term},\n        {files: titleterms[word], score: Scorer.title}\n      ];\n      // add support for partial matches\n      if (word.length > 2) {\n        var word_regex = this.escapeRegExp(word);\n        for (var w in terms) {\n          if (w.match(word_regex) && !terms[word]) {\n            _o.push({files: terms[w], score: Scorer.partialTerm})\n          }\n        }\n        for (var w in titleterms) {\n          if (w.match(word_regex) && !titleterms[word]) {\n              _o.push({files: titleterms[w], score: Scorer.partialTitle})\n          }\n        }\n      }\n\n      // no match but word was a required one\n      if ($u.every(_o, function(o){return o.files === undefined;})) {\n        break;\n      }\n      // found search word in contents\n      $u.each(_o, function(o) {\n        var _files = o.files;\n        if (_files === undefined)\n          return\n\n        if (_files.length === undefined)\n          _files = [_files];\n        files = files.concat(_files);\n\n        // set score for the word in each file to Scorer.term\n        for (j = 0; j < _files.length; j++) {\n          file = _files[j];\n          if (!(file in scoreMap))\n            scoreMap[file] = {};\n          scoreMap[file][word] = o.score;\n        }\n      });\n\n      // create the mapping\n      for (j = 0; j < files.length; j++) {\n        file = files[j];\n        if (file in fileMap && fileMap[file].indexOf(word) === -1)\n          fileMap[file].push(word);\n        else\n          fileMap[file] = [word];\n      }\n    }\n\n    // now check if the files don't contain excluded terms\n    for (file in fileMap) {\n      var valid = true;\n\n      // check if all requirements are matched\n      var filteredTermCount = // as search terms with length < 3 are discarded: ignore\n        searchterms.filter(function(term){return term.length > 2}).length\n      if (\n        fileMap[file].length != searchterms.length &&\n        fileMap[file].length != filteredTermCount\n      ) continue;\n\n      // ensure that none of the excluded terms is in the search result\n      for (i = 0; i < excluded.length; i++) {\n        if (terms[excluded[i]] == file ||\n            titleterms[excluded[i]] == file ||\n            $u.contains(terms[excluded[i]] || [], file) ||\n            $u.contains(titleterms[excluded[i]] || [], file)) {\n          valid = false;\n          break;\n        }\n      }\n\n      // if we have still a valid result we can add it to the result list\n      if (valid) {\n        // select one (max) score for the file.\n        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...\n        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));\n        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);\n      }\n    }\n    return results;\n  },\n\n  /**\n   * helper function to return a node containing the\n   * search summary for a given text. keywords is a list\n   * of stemmed words, hlwords is the list of normal, unstemmed\n   * words. the first one is used to find the occurrence, the\n   * latter for highlighting it.\n   */\n  makeSearchSummary : function(htmlText, keywords, hlwords) {\n    var text = Search.htmlToText(htmlText);\n    if (text == \"\") {\n      return null;\n    }\n    var textLower = text.toLowerCase();\n    var start = 0;\n    $.each(keywords, function() {\n      var i = textLower.indexOf(this.toLowerCase());\n      if (i > -1)\n        start = i;\n    });\n    start = Math.max(start - 120, 0);\n    var excerpt = ((start > 0) ? '...' : '') +\n      $.trim(text.substr(start, 240)) +\n      ((start + 240 - text.length) ? '...' : '');\n    var rv = $('<p class=\"context\"></p>').text(excerpt);\n    $.each(hlwords, function() {\n      rv = rv.highlightText(this, 'highlighted');\n    });\n    return rv;\n  }\n};\n\n$(document).ready(function() {\n  Search.init();\n});\n"
  },
  {
    "path": "doc/_build/html/_static/underscore.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define('underscore', factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {\n    var current = global._;\n    var exports = global._ = factory();\n    exports.noConflict = function () { global._ = current; return exports; };\n  }()));\n}(this, (function () {\n  //     Underscore.js 1.13.2\n  //     https://underscorejs.org\n  //     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n  //     Underscore may be freely distributed under the MIT license.\n\n  // Current version.\n  var VERSION = '1.13.2';\n\n  // Establish the root object, `window` (`self`) in the browser, `global`\n  // on the server, or `this` in some virtual machines. We use `self`\n  // instead of `window` for `WebWorker` support.\n  var root = typeof self == 'object' && self.self === self && self ||\n            typeof global == 'object' && global.global === global && global ||\n            Function('return this')() ||\n            {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype;\n  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push = ArrayProto.push,\n      slice = ArrayProto.slice,\n      toString = ObjProto.toString,\n      hasOwnProperty = ObjProto.hasOwnProperty;\n\n  // Modern feature detection.\n  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n      supportsDataView = typeof DataView !== 'undefined';\n\n  // All **ECMAScript 5+** native function implementations that we hope to use\n  // are declared here.\n  var nativeIsArray = Array.isArray,\n      nativeKeys = Object.keys,\n      nativeCreate = Object.create,\n      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n  // Create references to these builtin functions because we override them.\n  var _isNaN = isNaN,\n      _isFinite = isFinite;\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  // The largest integer that can be represented exactly.\n  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n\n  // Some functions take a variable number of arguments, or a few expected\n  // arguments at the beginning and then a variable number of values to operate\n  // on. This helper accumulates all remaining arguments past the function’s\n  // argument length (or an explicit `startIndex`), into an array that becomes\n  // the last argument. Similar to ES6’s \"rest parameter\".\n  function restArguments(func, startIndex) {\n    startIndex = startIndex == null ? func.length - 1 : +startIndex;\n    return function() {\n      var length = Math.max(arguments.length - startIndex, 0),\n          rest = Array(length),\n          index = 0;\n      for (; index < length; index++) {\n        rest[index] = arguments[index + startIndex];\n      }\n      switch (startIndex) {\n        case 0: return func.call(this, rest);\n        case 1: return func.call(this, arguments[0], rest);\n        case 2: return func.call(this, arguments[0], arguments[1], rest);\n      }\n      var args = Array(startIndex + 1);\n      for (index = 0; index < startIndex; index++) {\n        args[index] = arguments[index];\n      }\n      args[startIndex] = rest;\n      return func.apply(this, args);\n    };\n  }\n\n  // Is a given variable an object?\n  function isObject(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  }\n\n  // Is a given value equal to null?\n  function isNull(obj) {\n    return obj === null;\n  }\n\n  // Is a given variable undefined?\n  function isUndefined(obj) {\n    return obj === void 0;\n  }\n\n  // Is a given value a boolean?\n  function isBoolean(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  }\n\n  // Is a given value a DOM element?\n  function isElement(obj) {\n    return !!(obj && obj.nodeType === 1);\n  }\n\n  // Internal function for creating a `toString`-based type tester.\n  function tagTester(name) {\n    var tag = '[object ' + name + ']';\n    return function(obj) {\n      return toString.call(obj) === tag;\n    };\n  }\n\n  var isString = tagTester('String');\n\n  var isNumber = tagTester('Number');\n\n  var isDate = tagTester('Date');\n\n  var isRegExp = tagTester('RegExp');\n\n  var isError = tagTester('Error');\n\n  var isSymbol = tagTester('Symbol');\n\n  var isArrayBuffer = tagTester('ArrayBuffer');\n\n  var isFunction = tagTester('Function');\n\n  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\n  var nodelist = root.document && root.document.childNodes;\n  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n    isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  var isFunction$1 = isFunction;\n\n  var hasObjectTag = tagTester('Object');\n\n  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n  // In IE 11, the most common among them, this problem also applies to\n  // `Map`, `WeakMap` and `Set`.\n  var hasStringTagBug = (\n        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))\n      ),\n      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n\n  var isDataView = tagTester('DataView');\n\n  // In IE 10 - Edge 13, we need a different heuristic\n  // to determine whether an object is a `DataView`.\n  function ie10IsDataView(obj) {\n    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);\n  }\n\n  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native `Array.isArray`.\n  var isArray = nativeIsArray || tagTester('Array');\n\n  // Internal function to check whether `key` is an own property name of `obj`.\n  function has$1(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  }\n\n  var isArguments = tagTester('Arguments');\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  (function() {\n    if (!isArguments(arguments)) {\n      isArguments = function(obj) {\n        return has$1(obj, 'callee');\n      };\n    }\n  }());\n\n  var isArguments$1 = isArguments;\n\n  // Is a given object a finite number?\n  function isFinite$1(obj) {\n    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n  }\n\n  // Is the given value `NaN`?\n  function isNaN$1(obj) {\n    return isNumber(obj) && _isNaN(obj);\n  }\n\n  // Predicate-generating function. Often useful outside of Underscore.\n  function constant(value) {\n    return function() {\n      return value;\n    };\n  }\n\n  // Common internal logic for `isArrayLike` and `isBufferLike`.\n  function createSizePropertyCheck(getSizeProperty) {\n    return function(collection) {\n      var sizeProperty = getSizeProperty(collection);\n      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n    }\n  }\n\n  // Internal helper to generate a function to obtain property `key` from `obj`.\n  function shallowProperty(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  }\n\n  // Internal helper to obtain the `byteLength` property of an object.\n  var getByteLength = shallowProperty('byteLength');\n\n  // Internal helper to determine whether we should spend extensive checks against\n  // `ArrayBuffer` et al.\n  var isBufferLike = createSizePropertyCheck(getByteLength);\n\n  // Is a given value a typed array?\n  var typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\n  function isTypedArray(obj) {\n    // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n    // Otherwise, fall back on the above regular expression.\n    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :\n                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n  }\n\n  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);\n\n  // Internal helper to obtain the `length` property of an object.\n  var getLength = shallowProperty('length');\n\n  // Internal helper to create a simple lookup structure.\n  // `collectNonEnumProps` used to depend on `_.contains`, but this led to\n  // circular imports. `emulatedSet` is a one-off solution that only works for\n  // arrays of strings.\n  function emulatedSet(keys) {\n    var hash = {};\n    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n    return {\n      contains: function(key) { return hash[key] === true; },\n      push: function(key) {\n        hash[key] = true;\n        return keys.push(key);\n      }\n    };\n  }\n\n  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n  // needed.\n  function collectNonEnumProps(obj, keys) {\n    keys = emulatedSet(keys);\n    var nonEnumIdx = nonEnumerableProps.length;\n    var constructor = obj.constructor;\n    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;\n\n    // Constructor is a special case.\n    var prop = 'constructor';\n    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n    while (nonEnumIdx--) {\n      prop = nonEnumerableProps[nonEnumIdx];\n      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n        keys.push(prop);\n      }\n    }\n  }\n\n  // Retrieve the names of an object's own properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`.\n  function keys(obj) {\n    if (!isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (has$1(obj, key)) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  }\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  function isEmpty(obj) {\n    if (obj == null) return true;\n    // Skip the more expensive `toString`-based type checks if `obj` has no\n    // `.length`.\n    var length = getLength(obj);\n    if (typeof length == 'number' && (\n      isArray(obj) || isString(obj) || isArguments$1(obj)\n    )) return length === 0;\n    return getLength(keys(obj)) === 0;\n  }\n\n  // Returns whether an object has a given set of `key:value` pairs.\n  function isMatch(object, attrs) {\n    var _keys = keys(attrs), length = _keys.length;\n    if (object == null) return !length;\n    var obj = Object(object);\n    for (var i = 0; i < length; i++) {\n      var key = _keys[i];\n      if (attrs[key] !== obj[key] || !(key in obj)) return false;\n    }\n    return true;\n  }\n\n  // If Underscore is called as a function, it returns a wrapped object that can\n  // be used OO-style. This wrapper holds altered versions of all functions added\n  // through `_.mixin`. Wrapped objects may be chained.\n  function _$1(obj) {\n    if (obj instanceof _$1) return obj;\n    if (!(this instanceof _$1)) return new _$1(obj);\n    this._wrapped = obj;\n  }\n\n  _$1.VERSION = VERSION;\n\n  // Extracts the result from a wrapped and chained object.\n  _$1.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // Provide unwrapping proxies for some methods used in engine operations\n  // such as arithmetic and JSON stringification.\n  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;\n\n  _$1.prototype.toString = function() {\n    return String(this._wrapped);\n  };\n\n  // Internal function to wrap or shallow-copy an ArrayBuffer,\n  // typed array or DataView to a new view, reusing the buffer.\n  function toBufferView(bufferSource) {\n    return new Uint8Array(\n      bufferSource.buffer || bufferSource,\n      bufferSource.byteOffset || 0,\n      getByteLength(bufferSource)\n    );\n  }\n\n  // We use this string twice, so give it a name for minification.\n  var tagDataView = '[object DataView]';\n\n  // Internal recursive comparison function for `_.isEqual`.\n  function eq(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // `null` or `undefined` only equal to itself (strict comparison).\n    if (a == null || b == null) return false;\n    // `NaN`s are equivalent, but non-reflexive.\n    if (a !== a) return b !== b;\n    // Exhaust primitive checks\n    var type = typeof a;\n    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n    return deepEq(a, b, aStack, bStack);\n  }\n\n  // Internal recursive comparison function for `_.isEqual`.\n  function deepEq(a, b, aStack, bStack) {\n    // Unwrap any wrapped objects.\n    if (a instanceof _$1) a = a._wrapped;\n    if (b instanceof _$1) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    // Work around a bug in IE 10 - Edge 13.\n    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {\n      if (!isDataView$1(b)) return false;\n      className = tagDataView;\n    }\n    switch (className) {\n      // These types are compared by value.\n      case '[object RegExp]':\n        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN.\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n      case '[object Symbol]':\n        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n      case '[object ArrayBuffer]':\n      case tagDataView:\n        // Coerce to typed array so we can fall through.\n        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays && isTypedArray$1(a)) {\n        var byteLength = getByteLength(a);\n        if (byteLength !== getByteLength(b)) return false;\n        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n        areArrays = true;\n    }\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&\n                               isFunction$1(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    // Initializing stack of traversed objects.\n    // It's done here since we only need them for objects and arrays comparison.\n    aStack = aStack || [];\n    bStack = bStack || [];\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        if (!eq(a[length], b[length], aStack, bStack)) return false;\n      }\n    } else {\n      // Deep compare objects.\n      var _keys = keys(a), key;\n      length = _keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = _keys[length];\n        if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return true;\n  }\n\n  // Perform a deep comparison to check if two objects are equal.\n  function isEqual(a, b) {\n    return eq(a, b);\n  }\n\n  // Retrieve all the enumerable property names of an object.\n  function allKeys(obj) {\n    if (!isObject(obj)) return [];\n    var keys = [];\n    for (var key in obj) keys.push(key);\n    // Ahem, IE < 9.\n    if (hasEnumBug) collectNonEnumProps(obj, keys);\n    return keys;\n  }\n\n  // Since the regular `Object.prototype.toString` type tests don't work for\n  // some types in IE 11, we use a fingerprinting heuristic instead, based\n  // on the methods. It's not great, but it's the best we got.\n  // The fingerprint method lists are defined below.\n  function ie11fingerprint(methods) {\n    var length = getLength(methods);\n    return function(obj) {\n      if (obj == null) return false;\n      // `Map`, `WeakMap` and `Set` have no enumerable keys.\n      var keys = allKeys(obj);\n      if (getLength(keys)) return false;\n      for (var i = 0; i < length; i++) {\n        if (!isFunction$1(obj[methods[i]])) return false;\n      }\n      // If we are testing against `WeakMap`, we need to ensure that\n      // `obj` doesn't have a `forEach` method in order to distinguish\n      // it from a regular `Map`.\n      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);\n    };\n  }\n\n  // In the interest of compact minification, we write\n  // each string in the fingerprints only once.\n  var forEachName = 'forEach',\n      hasName = 'has',\n      commonInit = ['clear', 'delete'],\n      mapTail = ['get', hasName, 'set'];\n\n  // `Map`, `WeakMap` and `Set` each have slightly different\n  // combinations of the above sublists.\n  var mapMethods = commonInit.concat(forEachName, mapTail),\n      weakMapMethods = commonInit.concat(mapTail),\n      setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\n  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n\n  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n\n  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n\n  var isWeakSet = tagTester('WeakSet');\n\n  // Retrieve the values of an object's properties.\n  function values(obj) {\n    var _keys = keys(obj);\n    var length = _keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[_keys[i]];\n    }\n    return values;\n  }\n\n  // Convert an object into a list of `[key, value]` pairs.\n  // The opposite of `_.object` with one argument.\n  function pairs(obj) {\n    var _keys = keys(obj);\n    var length = _keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [_keys[i], obj[_keys[i]]];\n    }\n    return pairs;\n  }\n\n  // Invert the keys and values of an object. The values must be serializable.\n  function invert(obj) {\n    var result = {};\n    var _keys = keys(obj);\n    for (var i = 0, length = _keys.length; i < length; i++) {\n      result[obj[_keys[i]]] = _keys[i];\n    }\n    return result;\n  }\n\n  // Return a sorted list of the function names available on the object.\n  function functions(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (isFunction$1(obj[key])) names.push(key);\n    }\n    return names.sort();\n  }\n\n  // An internal function for creating assigner functions.\n  function createAssigner(keysFunc, defaults) {\n    return function(obj) {\n      var length = arguments.length;\n      if (defaults) obj = Object(obj);\n      if (length < 2 || obj == null) return obj;\n      for (var index = 1; index < length; index++) {\n        var source = arguments[index],\n            keys = keysFunc(source),\n            l = keys.length;\n        for (var i = 0; i < l; i++) {\n          var key = keys[i];\n          if (!defaults || obj[key] === void 0) obj[key] = source[key];\n        }\n      }\n      return obj;\n    };\n  }\n\n  // Extend a given object with all the properties in passed-in object(s).\n  var extend = createAssigner(allKeys);\n\n  // Assigns a given object with all the own properties in the passed-in\n  // object(s).\n  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n  var extendOwn = createAssigner(keys);\n\n  // Fill in a given object with default properties.\n  var defaults = createAssigner(allKeys, true);\n\n  // Create a naked function reference for surrogate-prototype-swapping.\n  function ctor() {\n    return function(){};\n  }\n\n  // An internal function for creating a new object that inherits from another.\n  function baseCreate(prototype) {\n    if (!isObject(prototype)) return {};\n    if (nativeCreate) return nativeCreate(prototype);\n    var Ctor = ctor();\n    Ctor.prototype = prototype;\n    var result = new Ctor;\n    Ctor.prototype = null;\n    return result;\n  }\n\n  // Creates an object that inherits from the given prototype object.\n  // If additional properties are provided then they will be added to the\n  // created object.\n  function create(prototype, props) {\n    var result = baseCreate(prototype);\n    if (props) extendOwn(result, props);\n    return result;\n  }\n\n  // Create a (shallow-cloned) duplicate of an object.\n  function clone(obj) {\n    if (!isObject(obj)) return obj;\n    return isArray(obj) ? obj.slice() : extend({}, obj);\n  }\n\n  // Invokes `interceptor` with the `obj` and then returns `obj`.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  function tap(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  }\n\n  // Normalize a (deep) property `path` to array.\n  // Like `_.iteratee`, this function can be customized.\n  function toPath$1(path) {\n    return isArray(path) ? path : [path];\n  }\n  _$1.toPath = toPath$1;\n\n  // Internal wrapper for `_.toPath` to enable minification.\n  // Similar to `cb` for `_.iteratee`.\n  function toPath(path) {\n    return _$1.toPath(path);\n  }\n\n  // Internal function to obtain a nested property in `obj` along `path`.\n  function deepGet(obj, path) {\n    var length = path.length;\n    for (var i = 0; i < length; i++) {\n      if (obj == null) return void 0;\n      obj = obj[path[i]];\n    }\n    return length ? obj : void 0;\n  }\n\n  // Get the value of the (deep) property on `path` from `object`.\n  // If any property in `path` does not exist or if the value is\n  // `undefined`, return `defaultValue` instead.\n  // The `path` is normalized through `_.toPath`.\n  function get(object, path, defaultValue) {\n    var value = deepGet(object, toPath(path));\n    return isUndefined(value) ? defaultValue : value;\n  }\n\n  // Shortcut function for checking if an object has a given property directly on\n  // itself (in other words, not on a prototype). Unlike the internal `has`\n  // function, this public version can also traverse nested properties.\n  function has(obj, path) {\n    path = toPath(path);\n    var length = path.length;\n    for (var i = 0; i < length; i++) {\n      var key = path[i];\n      if (!has$1(obj, key)) return false;\n      obj = obj[key];\n    }\n    return !!length;\n  }\n\n  // Keep the identity function around for default iteratees.\n  function identity(value) {\n    return value;\n  }\n\n  // Returns a predicate for checking whether an object has a given set of\n  // `key:value` pairs.\n  function matcher(attrs) {\n    attrs = extendOwn({}, attrs);\n    return function(obj) {\n      return isMatch(obj, attrs);\n    };\n  }\n\n  // Creates a function that, when passed an object, will traverse that object’s\n  // properties down the given `path`, specified as an array of keys or indices.\n  function property(path) {\n    path = toPath(path);\n    return function(obj) {\n      return deepGet(obj, path);\n    };\n  }\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  function optimizeCb(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      // The 2-argument case is omitted because we’re not using it.\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  }\n\n  // An internal function to generate callbacks that can be applied to each\n  // element in a collection, returning the desired result — either `_.identity`,\n  // an arbitrary callback, a property matcher, or a property accessor.\n  function baseIteratee(value, context, argCount) {\n    if (value == null) return identity;\n    if (isFunction$1(value)) return optimizeCb(value, context, argCount);\n    if (isObject(value) && !isArray(value)) return matcher(value);\n    return property(value);\n  }\n\n  // External wrapper for our callback generator. Users may customize\n  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n  // This abstraction hides the internal-only `argCount` argument.\n  function iteratee(value, context) {\n    return baseIteratee(value, context, Infinity);\n  }\n  _$1.iteratee = iteratee;\n\n  // The function we call internally to generate a callback. It invokes\n  // `_.iteratee` if overridden, otherwise `baseIteratee`.\n  function cb(value, context, argCount) {\n    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);\n    return baseIteratee(value, context, argCount);\n  }\n\n  // Returns the results of applying the `iteratee` to each element of `obj`.\n  // In contrast to `_.map` it returns an object.\n  function mapObject(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var _keys = keys(obj),\n        length = _keys.length,\n        results = {};\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys[index];\n      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  }\n\n  // Predicate-generating function. Often useful outside of Underscore.\n  function noop(){}\n\n  // Generates a function for a given object that returns a given property.\n  function propertyOf(obj) {\n    if (obj == null) return noop;\n    return function(path) {\n      return get(obj, path);\n    };\n  }\n\n  // Run a function **n** times.\n  function times(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  }\n\n  // Return a random integer between `min` and `max` (inclusive).\n  function random(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  }\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  var now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n  // Internal helper to generate functions for escaping and unescaping strings\n  // to/from HTML interpolation.\n  function createEscaper(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped.\n    var source = '(?:' + keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  }\n\n  // Internal list of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n\n  // Function for escaping strings to HTML interpolation.\n  var _escape = createEscaper(escapeMap);\n\n  // Internal list of HTML entities for unescaping.\n  var unescapeMap = invert(escapeMap);\n\n  // Function for unescaping strings from HTML interpolation.\n  var _unescape = createEscaper(unescapeMap);\n\n  // By default, Underscore uses ERB-style template delimiters. Change the\n  // following template settings to use alternative delimiters.\n  var templateSettings = _$1.templateSettings = {\n    evaluate: /<%([\\s\\S]+?)%>/g,\n    interpolate: /<%=([\\s\\S]+?)%>/g,\n    escape: /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `_.templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\": \"'\",\n    '\\\\': '\\\\',\n    '\\r': 'r',\n    '\\n': 'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  function escapeChar(match) {\n    return '\\\\' + escapes[match];\n  }\n\n  // In order to prevent third-party code injection through\n  // `_.templateSettings.variable`, we test it against the following regular\n  // expression. It is intentionally a bit more liberal than just matching valid\n  // identifiers, but still prevents possible loopholes through defaults or\n  // destructuring assignment.\n  var bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  function template(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = defaults({}, settings, _$1.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offset.\n      return match;\n    });\n    source += \"';\\n\";\n\n    var argument = settings.variable;\n    if (argument) {\n      // Insure against third-party code injection. (CVE-2021-23358)\n      if (!bareIdentifier.test(argument)) throw new Error(\n        'variable is not a bare identifier: ' + argument\n      );\n    } else {\n      // If a variable is not specified, place data values in local scope.\n      source = 'with(obj||{}){\\n' + source + '}\\n';\n      argument = 'obj';\n    }\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    var render;\n    try {\n      render = new Function(argument, '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _$1);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  }\n\n  // Traverses the children of `obj` along `path`. If a child is a function, it\n  // is invoked with its parent as context. Returns the value of the final\n  // child, or `fallback` if any child is undefined.\n  function result(obj, path, fallback) {\n    path = toPath(path);\n    var length = path.length;\n    if (!length) {\n      return isFunction$1(fallback) ? fallback.call(obj) : fallback;\n    }\n    for (var i = 0; i < length; i++) {\n      var prop = obj == null ? void 0 : obj[path[i]];\n      if (prop === void 0) {\n        prop = fallback;\n        i = length; // Ensure we don't continue iterating.\n      }\n      obj = isFunction$1(prop) ? prop.call(obj) : prop;\n    }\n    return obj;\n  }\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  function uniqueId(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  }\n\n  // Start chaining a wrapped Underscore object.\n  function chain(obj) {\n    var instance = _$1(obj);\n    instance._chain = true;\n    return instance;\n  }\n\n  // Internal function to execute `sourceFunc` bound to `context` with optional\n  // `args`. Determines whether to execute a function as a constructor or as a\n  // normal function.\n  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n    var self = baseCreate(sourceFunc.prototype);\n    var result = sourceFunc.apply(self, args);\n    if (isObject(result)) return result;\n    return self;\n  }\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. `_` acts\n  // as a placeholder by default, allowing any combination of arguments to be\n  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\n  var partial = restArguments(function(func, boundArgs) {\n    var placeholder = partial.placeholder;\n    var bound = function() {\n      var position = 0, length = boundArgs.length;\n      var args = Array(length);\n      for (var i = 0; i < length; i++) {\n        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return executeBound(func, bound, this, this, args);\n    };\n    return bound;\n  });\n\n  partial.placeholder = _$1;\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally).\n  var bind = restArguments(function(func, context, args) {\n    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');\n    var bound = restArguments(function(callArgs) {\n      return executeBound(func, bound, context, this, args.concat(callArgs));\n    });\n    return bound;\n  });\n\n  // Internal helper for collection methods to determine whether a collection\n  // should be iterated as an array or as an object.\n  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n  var isArrayLike = createSizePropertyCheck(getLength);\n\n  // Internal implementation of a recursive `flatten` function.\n  function flatten$1(input, depth, strict, output) {\n    output = output || [];\n    if (!depth && depth !== 0) {\n      depth = Infinity;\n    } else if (depth <= 0) {\n      return output.concat(input);\n    }\n    var idx = output.length;\n    for (var i = 0, length = getLength(input); i < length; i++) {\n      var value = input[i];\n      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {\n        // Flatten current level of array or arguments object.\n        if (depth > 1) {\n          flatten$1(value, depth - 1, strict, output);\n          idx = output.length;\n        } else {\n          var j = 0, len = value.length;\n          while (j < len) output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  }\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  var bindAll = restArguments(function(obj, keys) {\n    keys = flatten$1(keys, false, false);\n    var index = keys.length;\n    if (index < 1) throw new Error('bindAll must be passed function names');\n    while (index--) {\n      var key = keys[index];\n      obj[key] = bind(obj[key], obj);\n    }\n    return obj;\n  });\n\n  // Memoize an expensive function by storing its results.\n  function memoize(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  }\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  var delay = restArguments(function(func, wait, args) {\n    return setTimeout(function() {\n      return func.apply(null, args);\n    }, wait);\n  });\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  var defer = partial(delay, _$1, 1);\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  function throttle(func, wait, options) {\n    var timeout, context, args, result;\n    var previous = 0;\n    if (!options) options = {};\n\n    var later = function() {\n      previous = options.leading === false ? 0 : now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n\n    var throttled = function() {\n      var _now = now();\n      if (!previous && options.leading === false) previous = _now;\n      var remaining = wait - (_now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = _now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n\n    throttled.cancel = function() {\n      clearTimeout(timeout);\n      previous = 0;\n      timeout = context = args = null;\n    };\n\n    return throttled;\n  }\n\n  // When a sequence of calls of the returned function ends, the argument\n  // function is triggered. The end of a sequence is defined by the `wait`\n  // parameter. If `immediate` is passed, the argument function will be\n  // triggered at the beginning of the sequence instead of at the end.\n  function debounce(func, wait, immediate) {\n    var timeout, previous, args, result, context;\n\n    var later = function() {\n      var passed = now() - previous;\n      if (wait > passed) {\n        timeout = setTimeout(later, wait - passed);\n      } else {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n        // This check is needed because `func` can recursively invoke `debounced`.\n        if (!timeout) args = context = null;\n      }\n    };\n\n    var debounced = restArguments(function(_args) {\n      context = this;\n      args = _args;\n      previous = now();\n      if (!timeout) {\n        timeout = setTimeout(later, wait);\n        if (immediate) result = func.apply(context, args);\n      }\n      return result;\n    });\n\n    debounced.cancel = function() {\n      clearTimeout(timeout);\n      timeout = args = context = null;\n    };\n\n    return debounced;\n  }\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  function wrap(func, wrapper) {\n    return partial(wrapper, func);\n  }\n\n  // Returns a negated version of the passed-in predicate.\n  function negate(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  }\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  function compose() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  }\n\n  // Returns a function that will only be executed on and after the Nth call.\n  function after(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  }\n\n  // Returns a function that will only be executed up to (but not including) the\n  // Nth call.\n  function before(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      }\n      if (times <= 1) func = null;\n      return memo;\n    };\n  }\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  var once = partial(before, 2);\n\n  // Returns the first key on an object that passes a truth test.\n  function findKey(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = keys(obj), key;\n    for (var i = 0, length = _keys.length; i < length; i++) {\n      key = _keys[i];\n      if (predicate(obj[key], key, obj)) return key;\n    }\n  }\n\n  // Internal function to generate `_.findIndex` and `_.findLastIndex`.\n  function createPredicateIndexFinder(dir) {\n    return function(array, predicate, context) {\n      predicate = cb(predicate, context);\n      var length = getLength(array);\n      var index = dir > 0 ? 0 : length - 1;\n      for (; index >= 0 && index < length; index += dir) {\n        if (predicate(array[index], index, array)) return index;\n      }\n      return -1;\n    };\n  }\n\n  // Returns the first index on an array-like that passes a truth test.\n  var findIndex = createPredicateIndexFinder(1);\n\n  // Returns the last index on an array-like that passes a truth test.\n  var findLastIndex = createPredicateIndexFinder(-1);\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  function sortedIndex(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = getLength(array);\n    while (low < high) {\n      var mid = Math.floor((low + high) / 2);\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  }\n\n  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\n  function createIndexFinder(dir, predicateFind, sortedIndex) {\n    return function(array, item, idx) {\n      var i = 0, length = getLength(array);\n      if (typeof idx == 'number') {\n        if (dir > 0) {\n          i = idx >= 0 ? idx : Math.max(idx + length, i);\n        } else {\n          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n        }\n      } else if (sortedIndex && idx && length) {\n        idx = sortedIndex(array, item);\n        return array[idx] === item ? idx : -1;\n      }\n      if (item !== item) {\n        idx = predicateFind(slice.call(array, i, length), isNaN$1);\n        return idx >= 0 ? idx + i : -1;\n      }\n      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n        if (array[idx] === item) return idx;\n      }\n      return -1;\n    };\n  }\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  var indexOf = createIndexFinder(1, findIndex, sortedIndex);\n\n  // Return the position of the last occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n  // Return the first value which passes a truth test.\n  function find(obj, predicate, context) {\n    var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n    var key = keyFinder(obj, predicate, context);\n    if (key !== void 0 && key !== -1) return obj[key];\n  }\n\n  // Convenience version of a common use case of `_.find`: getting the first\n  // object containing specific `key:value` pairs.\n  function findWhere(obj, attrs) {\n    return find(obj, matcher(attrs));\n  }\n\n  // The cornerstone for collection functions, an `each`\n  // implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  function each(obj, iteratee, context) {\n    iteratee = optimizeCb(iteratee, context);\n    var i, length;\n    if (isArrayLike(obj)) {\n      for (i = 0, length = obj.length; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var _keys = keys(obj);\n      for (i = 0, length = _keys.length; i < length; i++) {\n        iteratee(obj[_keys[i]], _keys[i], obj);\n      }\n    }\n    return obj;\n  }\n\n  // Return the results of applying the iteratee to each element.\n  function map(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        results = Array(length);\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  }\n\n  // Internal helper to create a reducing function, iterating left or right.\n  function createReduce(dir) {\n    // Wrap code that reassigns argument variables in a separate function than\n    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n    var reducer = function(obj, iteratee, memo, initial) {\n      var _keys = !isArrayLike(obj) && keys(obj),\n          length = (_keys || obj).length,\n          index = dir > 0 ? 0 : length - 1;\n      if (!initial) {\n        memo = obj[_keys ? _keys[index] : index];\n        index += dir;\n      }\n      for (; index >= 0 && index < length; index += dir) {\n        var currentKey = _keys ? _keys[index] : index;\n        memo = iteratee(memo, obj[currentKey], currentKey, obj);\n      }\n      return memo;\n    };\n\n    return function(obj, iteratee, memo, context) {\n      var initial = arguments.length >= 3;\n      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n    };\n  }\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  var reduce = createReduce(1);\n\n  // The right-associative version of reduce, also known as `foldr`.\n  var reduceRight = createReduce(-1);\n\n  // Return all the elements that pass a truth test.\n  function filter(obj, predicate, context) {\n    var results = [];\n    predicate = cb(predicate, context);\n    each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  }\n\n  // Return all the elements for which a truth test fails.\n  function reject(obj, predicate, context) {\n    return filter(obj, negate(cb(predicate)), context);\n  }\n\n  // Determine whether all of the elements pass a truth test.\n  function every(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  }\n\n  // Determine if at least one element in the object passes a truth test.\n  function some(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length;\n    for (var index = 0; index < length; index++) {\n      var currentKey = _keys ? _keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  }\n\n  // Determine if the array or object contains a given item (using `===`).\n  function contains(obj, item, fromIndex, guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n    return indexOf(obj, item, fromIndex) >= 0;\n  }\n\n  // Invoke a method (with arguments) on every item in a collection.\n  var invoke = restArguments(function(obj, path, args) {\n    var contextPath, func;\n    if (isFunction$1(path)) {\n      func = path;\n    } else {\n      path = toPath(path);\n      contextPath = path.slice(0, -1);\n      path = path[path.length - 1];\n    }\n    return map(obj, function(context) {\n      var method = func;\n      if (!method) {\n        if (contextPath && contextPath.length) {\n          context = deepGet(context, contextPath);\n        }\n        if (context == null) return void 0;\n        method = context[path];\n      }\n      return method == null ? method : method.apply(context, args);\n    });\n  });\n\n  // Convenience version of a common use case of `_.map`: fetching a property.\n  function pluck(obj, key) {\n    return map(obj, property(key));\n  }\n\n  // Convenience version of a common use case of `_.filter`: selecting only\n  // objects containing specific `key:value` pairs.\n  function where(obj, attrs) {\n    return filter(obj, matcher(attrs));\n  }\n\n  // Return the maximum element (or element-based computation).\n  function max(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n      obj = isArrayLike(obj) ? obj : values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value != null && value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      each(obj, function(v, index, list) {\n        computed = iteratee(v, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = v;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  }\n\n  // Return the minimum element (or element-based computation).\n  function min(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {\n      obj = isArrayLike(obj) ? obj : values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value != null && value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      each(obj, function(v, index, list) {\n        computed = iteratee(v, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = v;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  }\n\n  // Safely create a real, live array from anything iterable.\n  var reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n  function toArray(obj) {\n    if (!obj) return [];\n    if (isArray(obj)) return slice.call(obj);\n    if (isString(obj)) {\n      // Keep surrogate pair characters together.\n      return obj.match(reStrSymbol);\n    }\n    if (isArrayLike(obj)) return map(obj, identity);\n    return values(obj);\n  }\n\n  // Sample **n** random values from a collection using the modern version of the\n  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `_.map`.\n  function sample(obj, n, guard) {\n    if (n == null || guard) {\n      if (!isArrayLike(obj)) obj = values(obj);\n      return obj[random(obj.length - 1)];\n    }\n    var sample = toArray(obj);\n    var length = getLength(sample);\n    n = Math.max(Math.min(n, length), 0);\n    var last = length - 1;\n    for (var index = 0; index < n; index++) {\n      var rand = random(index, last);\n      var temp = sample[index];\n      sample[index] = sample[rand];\n      sample[rand] = temp;\n    }\n    return sample.slice(0, n);\n  }\n\n  // Shuffle a collection.\n  function shuffle(obj) {\n    return sample(obj, Infinity);\n  }\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  function sortBy(obj, iteratee, context) {\n    var index = 0;\n    iteratee = cb(iteratee, context);\n    return pluck(map(obj, function(value, key, list) {\n      return {\n        value: value,\n        index: index++,\n        criteria: iteratee(value, key, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  }\n\n  // An internal function used for aggregate \"group by\" operations.\n  function group(behavior, partition) {\n    return function(obj, iteratee, context) {\n      var result = partition ? [[], []] : {};\n      iteratee = cb(iteratee, context);\n      each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  }\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  var groupBy = group(function(result, value, key) {\n    if (has$1(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n  // when you know that your index values will be unique.\n  var indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  var countBy = group(function(result, value, key) {\n    if (has$1(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Split a collection into two arrays: one whose elements all pass the given\n  // truth test, and one whose elements all do not pass the truth test.\n  var partition = group(function(result, value, pass) {\n    result[pass ? 0 : 1].push(value);\n  }, true);\n\n  // Return the number of elements in a collection.\n  function size(obj) {\n    if (obj == null) return 0;\n    return isArrayLike(obj) ? obj.length : keys(obj).length;\n  }\n\n  // Internal `_.pick` helper function to determine whether `key` is an enumerable\n  // property name of `obj`.\n  function keyInObj(value, key, obj) {\n    return key in obj;\n  }\n\n  // Return a copy of the object only containing the allowed properties.\n  var pick = restArguments(function(obj, keys) {\n    var result = {}, iteratee = keys[0];\n    if (obj == null) return result;\n    if (isFunction$1(iteratee)) {\n      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n      keys = allKeys(obj);\n    } else {\n      iteratee = keyInObj;\n      keys = flatten$1(keys, false, false);\n      obj = Object(obj);\n    }\n    for (var i = 0, length = keys.length; i < length; i++) {\n      var key = keys[i];\n      var value = obj[key];\n      if (iteratee(value, key, obj)) result[key] = value;\n    }\n    return result;\n  });\n\n  // Return a copy of the object without the disallowed properties.\n  var omit = restArguments(function(obj, keys) {\n    var iteratee = keys[0], context;\n    if (isFunction$1(iteratee)) {\n      iteratee = negate(iteratee);\n      if (keys.length > 1) context = keys[1];\n    } else {\n      keys = map(flatten$1(keys, false, false), String);\n      iteratee = function(value, key) {\n        return !contains(keys, key);\n      };\n    }\n    return pick(obj, iteratee, context);\n  });\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N.\n  function initial(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  }\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  function first(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n    if (n == null || guard) return array[0];\n    return initial(array, array.length - n);\n  }\n\n  // Returns everything but the first entry of the `array`. Especially useful on\n  // the `arguments` object. Passing an **n** will return the rest N values in the\n  // `array`.\n  function rest(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  }\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array.\n  function last(array, n, guard) {\n    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n    if (n == null || guard) return array[array.length - 1];\n    return rest(array, Math.max(0, array.length - n));\n  }\n\n  // Trim out all falsy values from an array.\n  function compact(array) {\n    return filter(array, Boolean);\n  }\n\n  // Flatten out an array, either recursively (by default), or up to `depth`.\n  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\n  function flatten(array, depth) {\n    return flatten$1(array, depth, false);\n  }\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  var difference = restArguments(function(array, rest) {\n    rest = flatten$1(rest, true, true);\n    return filter(array, function(value){\n      return !contains(rest, value);\n    });\n  });\n\n  // Return a version of the array that does not contain the specified value(s).\n  var without = restArguments(function(array, otherArrays) {\n    return difference(array, otherArrays);\n  });\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // The faster algorithm will not work with an iteratee if the iteratee\n  // is not a one-to-one function, so providing an iteratee will disable\n  // the faster algorithm.\n  function uniq(array, isSorted, iteratee, context) {\n    if (!isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted && !iteratee) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  }\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  var union = restArguments(function(arrays) {\n    return uniq(flatten$1(arrays, true, true));\n  });\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  function intersection(array) {\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = getLength(array); i < length; i++) {\n      var item = array[i];\n      if (contains(result, item)) continue;\n      var j;\n      for (j = 1; j < argsLength; j++) {\n        if (!contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  }\n\n  // Complement of zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices.\n  function unzip(array) {\n    var length = array && max(array, getLength).length || 0;\n    var result = Array(length);\n\n    for (var index = 0; index < length; index++) {\n      result[index] = pluck(array, index);\n    }\n    return result;\n  }\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  var zip = restArguments(unzip);\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.\n  function object(list, values) {\n    var result = {};\n    for (var i = 0, length = getLength(list); i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  }\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](https://docs.python.org/library/functions.html#range).\n  function range(start, stop, step) {\n    if (stop == null) {\n      stop = start || 0;\n      start = 0;\n    }\n    if (!step) {\n      step = stop < start ? -1 : 1;\n    }\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  }\n\n  // Chunk a single array into multiple arrays, each containing `count` or fewer\n  // items.\n  function chunk(array, count) {\n    if (count == null || count < 1) return [];\n    var result = [];\n    var i = 0, length = array.length;\n    while (i < length) {\n      result.push(slice.call(array, i, i += count));\n    }\n    return result;\n  }\n\n  // Helper function to continue chaining intermediate results.\n  function chainResult(instance, obj) {\n    return instance._chain ? _$1(obj).chain() : obj;\n  }\n\n  // Add your own custom functions to the Underscore object.\n  function mixin(obj) {\n    each(functions(obj), function(name) {\n      var func = _$1[name] = obj[name];\n      _$1.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return chainResult(this, func.apply(_$1, args));\n      };\n    });\n    return _$1;\n  }\n\n  // Add all mutator `Array` functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) {\n        method.apply(obj, arguments);\n        if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n          delete obj[0];\n        }\n      }\n      return chainResult(this, obj);\n    };\n  });\n\n  // Add all accessor `Array` functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _$1.prototype[name] = function() {\n      var obj = this._wrapped;\n      if (obj != null) obj = method.apply(obj, arguments);\n      return chainResult(this, obj);\n    };\n  });\n\n  // Named Exports\n\n  var allExports = {\n    __proto__: null,\n    VERSION: VERSION,\n    restArguments: restArguments,\n    isObject: isObject,\n    isNull: isNull,\n    isUndefined: isUndefined,\n    isBoolean: isBoolean,\n    isElement: isElement,\n    isString: isString,\n    isNumber: isNumber,\n    isDate: isDate,\n    isRegExp: isRegExp,\n    isError: isError,\n    isSymbol: isSymbol,\n    isArrayBuffer: isArrayBuffer,\n    isDataView: isDataView$1,\n    isArray: isArray,\n    isFunction: isFunction$1,\n    isArguments: isArguments$1,\n    isFinite: isFinite$1,\n    isNaN: isNaN$1,\n    isTypedArray: isTypedArray$1,\n    isEmpty: isEmpty,\n    isMatch: isMatch,\n    isEqual: isEqual,\n    isMap: isMap,\n    isWeakMap: isWeakMap,\n    isSet: isSet,\n    isWeakSet: isWeakSet,\n    keys: keys,\n    allKeys: allKeys,\n    values: values,\n    pairs: pairs,\n    invert: invert,\n    functions: functions,\n    methods: functions,\n    extend: extend,\n    extendOwn: extendOwn,\n    assign: extendOwn,\n    defaults: defaults,\n    create: create,\n    clone: clone,\n    tap: tap,\n    get: get,\n    has: has,\n    mapObject: mapObject,\n    identity: identity,\n    constant: constant,\n    noop: noop,\n    toPath: toPath$1,\n    property: property,\n    propertyOf: propertyOf,\n    matcher: matcher,\n    matches: matcher,\n    times: times,\n    random: random,\n    now: now,\n    escape: _escape,\n    unescape: _unescape,\n    templateSettings: templateSettings,\n    template: template,\n    result: result,\n    uniqueId: uniqueId,\n    chain: chain,\n    iteratee: iteratee,\n    partial: partial,\n    bind: bind,\n    bindAll: bindAll,\n    memoize: memoize,\n    delay: delay,\n    defer: defer,\n    throttle: throttle,\n    debounce: debounce,\n    wrap: wrap,\n    negate: negate,\n    compose: compose,\n    after: after,\n    before: before,\n    once: once,\n    findKey: findKey,\n    findIndex: findIndex,\n    findLastIndex: findLastIndex,\n    sortedIndex: sortedIndex,\n    indexOf: indexOf,\n    lastIndexOf: lastIndexOf,\n    find: find,\n    detect: find,\n    findWhere: findWhere,\n    each: each,\n    forEach: each,\n    map: map,\n    collect: map,\n    reduce: reduce,\n    foldl: reduce,\n    inject: reduce,\n    reduceRight: reduceRight,\n    foldr: reduceRight,\n    filter: filter,\n    select: filter,\n    reject: reject,\n    every: every,\n    all: every,\n    some: some,\n    any: some,\n    contains: contains,\n    includes: contains,\n    include: contains,\n    invoke: invoke,\n    pluck: pluck,\n    where: where,\n    max: max,\n    min: min,\n    shuffle: shuffle,\n    sample: sample,\n    sortBy: sortBy,\n    groupBy: groupBy,\n    indexBy: indexBy,\n    countBy: countBy,\n    partition: partition,\n    toArray: toArray,\n    size: size,\n    pick: pick,\n    omit: omit,\n    first: first,\n    head: first,\n    take: first,\n    initial: initial,\n    last: last,\n    rest: rest,\n    tail: rest,\n    drop: rest,\n    compact: compact,\n    flatten: flatten,\n    without: without,\n    uniq: uniq,\n    unique: uniq,\n    union: union,\n    intersection: intersection,\n    difference: difference,\n    unzip: unzip,\n    transpose: unzip,\n    zip: zip,\n    object: object,\n    range: range,\n    chunk: chunk,\n    mixin: mixin,\n    'default': _$1\n  };\n\n  // Default Export\n\n  // Add all of the Underscore functions to the wrapper object.\n  var _ = mixin(allExports);\n  // Legacy Node.js API.\n  _._ = _;\n\n  return _;\n\n})));\n//# sourceMappingURL=underscore-umd.js.map\n"
  },
  {
    "path": "doc/_build/html/averagingModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>averagingModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">averagingModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>averagingModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"averagingmodel-command\">\n<span id=\"index-0\"></span><h1>averagingModel command<a class=\"headerlink\" href=\"#averagingmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of averaging model to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">dense</span><span class=\"p\">;</span>\n<span class=\"n\">averagingModel</span> <span class=\"n\">dilute</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please have a look for other averaging models (averagingModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The averaging model performs the Lagrangian-&gt;Eulerian mapping of data (e.g. particle velocities).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"averagingModel_dense.html\"><span class=\"doc\">dense</span></a>, <a class=\"reference internal\" href=\"averagingModel_dilute.html\"><span class=\"doc\">dilute</span></a></p>\n<p><strong>Default:</strong> none</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/averagingModel_dense.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>averagingModel_dense command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">averagingModel_dense command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>averagingModel_dense command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"averagingmodel-dense-command\">\n<span id=\"index-0\"></span><h1>averagingModel_dense command<a class=\"headerlink\" href=\"#averagingmodel-dense-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">dense</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">dense</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The averaging model performs the Lagrangian-&gt;Eulerian mapping of data (e.g. particle velocities). In the “cfdemParticle cloud” this averaging model is used to calculate the average particle velocity inside a CFD cell. The “dense” model is supposed to be applied to cases where the granular regime is rather dense.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>No known restrictions.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"averagingModel.html\"><span class=\"doc\">averagingModel</span></a>, <a class=\"reference internal\" href=\"averagingModel_dilute.html\"><span class=\"doc\">dilute</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/averagingModel_dilute.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>averagingModel_dilute command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">averagingModel_dilute command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>averagingModel_dilute command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"averagingmodel-dilute-command\">\n<span id=\"index-0\"></span><h1>averagingModel_dilute command<a class=\"headerlink\" href=\"#averagingmodel-dilute-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">dilute</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">averagingModel</span> <span class=\"n\">dilute</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The averaging model performs the Lagrangian-&gt;Eulerian mapping of data (e.g. particle velocities).\nIn the “cfdemParticle cloud” this averaging model is used to calculate the average particle velocity inside a CFD cell. The “dilute” model is supposed to be applied to cases where the granular regime is rather dilute. The particle velocity inside a CFD cell is evaluated from a single particle in a cell (no averaging).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>This model is computationally efficient, but should only be used when only one particle is inside one CFD cell.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"averagingModel.html\"><span class=\"doc\">averagingModel</span></a>, <a class=\"reference internal\" href=\"averagingModel_dense.html\"><span class=\"doc\">dense</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/cfdemSolverIB.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>cfdemSolverIB command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">cfdemSolverIB command</a><ul>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>cfdemSolverIB command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"cfdemsolverib-command\">\n<span id=\"index-0\"></span><h1>cfdemSolverIB command<a class=\"headerlink\" href=\"#cfdemsolverib-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>“cfdemSolverIB” is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework, for calculating\nthe dynamics between immersed bodies and the surrounding fluid. Being an implementation of an immersed boundary method it allows tackling problems where the body diameter exceeds the maximal size of a fluid cell. Using the toolbox of OpenFOAM®(*) the governing equations of the fluid are computed and the corrections of velocity and pressure field with respect to the body-movement information, gained from LIGGGHTS, are incorporated.</p>\n<p>Code of this solver contributions by Alice Hager, JKU.</p>\n<p><strong>Algorithm:</strong></p>\n<p>For each time step …</p>\n<ul class=\"simple\">\n<li><p>the motion of the spheres is calculated (position, velocity, angular velocity, force…) with LIGGGHTS using the velocity and pressure-field from the previous time step (initial condition for t=0).</p></li>\n<li><p>the Navier-Stokes equations are solved on the whole computational domain, disregarding the solid phase.</p></li>\n<li><p>the spheres are located within the mesh: each sphere is represented by a cluster of cells, which are either totally or partially covered by the body, depending on its exact position.</p></li>\n<li><p>the correction of the velocity and pressure field of the fluid phase takes place, using the information about the location of the spheres and their (angular) velocity.</p></li>\n</ul>\n<p><strong>Use:</strong></p>\n<p>The solver is realized within the Open Source framework CFDEMcoupling. Just as for the unresolved CFD-DEM solver cfdemSolverPiso the file CFD/constant/couplingProperties contains information about the settings for the different models. While IOmodel, DataExchangeModel etc. are applicable for all CFDEMcoupling-solvers, special locate-, force- and void fraction models were designed for the present case:</p>\n<p><a class=\"reference internal\" href=\"locateModel_engineSearchIB.html\"><span class=\"doc\">engineSearchIB</span></a>, <a class=\"reference internal\" href=\"forceModel_ArchimedesIB.html\"><span class=\"doc\">ArchimedesIB</span></a>, <a class=\"reference internal\" href=\"forceModel_ShirgaonkarIB.html\"><span class=\"doc\">ShirgaonkarIB</span></a>, <a class=\"reference internal\" href=\"voidFractionModel_IBVoidFraction.html\"><span class=\"doc\">IBVoidfraction</span></a></p>\n<p><strong>References:</strong></p>\n<p>GONIVA, C., KLOSS, C., HAGER,A., WIERINK, G. and PIRKER, S. (2011): “A MULTI-PURPOSE OPEN SOURCE CFD-DEM APPROACH”, Proc. of the 8th Int. Conf. on CFD in Oil and Gas, Metallurgical and Process Industries, Trondheim, Norway</p>\n<p>and</p>\n<p>HAGER, A., KLOSS, C. and GONIVA, C. (2011): “TOWARDS AN EFFICIENT IMMERSED BOUNDARY METHOD WITHIN AN OPEN SOURCE FRAMEWORK”, Proc. of the 8th Int. Conf. on CFD in Oil and Gas, Metallurgical and Process Industries, Trondheim, Norway</p>\n<hr class=\"docutils\" />\n<p>(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.</p>\n<hr class=\"docutils\" />\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/cfdemSolverPiso.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>cfdemSolverPiso command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">cfdemSolverPiso command</a><ul>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>cfdemSolverPiso command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"cfdemsolverpiso-command\">\n<span id=\"index-0\"></span><h1>cfdemSolverPiso command<a class=\"headerlink\" href=\"#cfdemsolverpiso-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>“cfdemSolverPiso” is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam®(*), a finite volume based solver for turbulent Navier-Stokes equations applying the PISO algorithm, “cfdemSolverPiso” has additional functionality for a coupling to the DEM code “LIGGGHTS”. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles whose trajectories are calculated in the DEM code LIGGGHTS.</p>\n<p>see:</p>\n<p>GONIVA, C., KLOSS, C., HAGER,A. and PIRKER, S. (2010): “An Open Source CFD-DEM Perspective”, Proc. of OpenFOAM Workshop, Göteborg, June 22.-24.</p>\n<hr class=\"docutils\" />\n<p>(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.</p>\n<hr class=\"docutils\" />\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/cfdemSolverPisoSTM.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>cfdemSolverPisoSTM command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">cfdemSolverPisoSTM command</a><ul>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>cfdemSolverPisoSTM command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"cfdemsolverpisostm-command\">\n<span id=\"index-0\"></span><h1>cfdemSolverPisoSTM command<a class=\"headerlink\" href=\"#cfdemsolverpisostm-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>“cfdemSolverPisoSTM” is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam®(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, “cfdemSolverPisoSTM” has additional functionality for a coupling to the DEM code “LIGGGHTS” as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles, whose trajectories are calculated in the DEM code LIGGGHTS. Scalar transport equations coupled to scalar properties of the particle phase, (e.g. convective heat transfer) in a fluid granular system can be modeled with “cfdemSolverPisoSTM”.</p>\n<p>see:</p>\n<p>GONIVA, C., KLOSS, C., HAGER,A. and PIRKER, S. (2010): “An Open Source CFD-DEM Perspective”, Proc. of OpenFOAM Workshop, Göteborg, June 22.-24.</p>\n<hr class=\"docutils\" />\n<p>(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.</p>\n<hr class=\"docutils\" />\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/cfdemSolverPisoScalar.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>cfdemSolverPisoScalar command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">cfdemSolverPisoScalar command</a><ul>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>cfdemSolverPisoScalar command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"cfdemsolverpisoscalar-command\">\n<span id=\"index-0\"></span><h1>cfdemSolverPisoScalar command<a class=\"headerlink\" href=\"#cfdemsolverpisoscalar-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>“cfdemSolverPisoScalar” is a coupled CFD-DEM solver using CFDEMcoupling, an open source parallel coupled CFD-DEM framework. Based on pisoFoam®(*), a finite volume based solver for turbulent Navier-Stokes equations applying PISO algorithm, “cfdemSolverPisoScalar” has additional functionality for a coupling to the DEM code “LIGGGHTS” as well as a scalar transport equation. The volume averaged Navier-Stokes Equations are solved accounting for momentum exchange and volume displacement of discrete particles, whose trajectories are calculated in the DEM code LIGGGHTS. The scalar transport equation is coupled to scalar properties of the particle phase, thus convective heat transfer in a fluid granular system can be modeled with “cfdemSolverPisoScalar”.</p>\n<p>The transport equation uses a field “alphat” to calculate local kinematic turbulent thermal conductivities based on the laminar and turbulent Prandtl numbers. There can be source terms with the field Tsource and radiation.</p>\n<p>Necessary additional input is:</p>\n<table class=\"docutils align-default\">\n<colgroup>\n<col style=\"width: 18%\" />\n<col style=\"width: 42%\" />\n<col style=\"width: 28%\" />\n<col style=\"width: 12%\" />\n</colgroup>\n<tbody>\n<tr class=\"row-odd\"><td><p>name</p></td>\n<td><p>location</p></td>\n<td><p>type</p></td>\n<td><p>unit</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>T</p></td>\n<td><p>0</p></td>\n<td><p>scalar field</p></td>\n<td><p>K</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>Tsource</p></td>\n<td><p>0</p></td>\n<td><p>scalar field</p></td>\n<td><p>K/s</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>alphat</p></td>\n<td><p>0</p></td>\n<td><p>scalar field</p></td>\n<td><p>m²/s</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>Pr</p></td>\n<td><p>transportProperties</p></td>\n<td><p>scalar</p></td>\n<td><p>1</p></td>\n</tr>\n<tr class=\"row-even\"><td><p>Prt</p></td>\n<td><p>transportProperties</p></td>\n<td><p>scalar</p></td>\n<td><p>1</p></td>\n</tr>\n</tbody>\n</table>\n<p>The transport equation is:</p>\n<p>alphat = nut/Prt</p>\n<p>alphaEff = nu/Pr + alphat</p>\n<p>d(voidfraction*T)/dt + div(phi*T) - div(alphaEff*voidfraction grad(T)) = Tsource + SourceRadiation</p>\n<p>see:</p>\n<p>GONIVA, C., KLOSS, C., HAGER,A. and PIRKER, S. (2010): “An Open Source CFD-DEM Perspective”, Proc. of OpenFOAM Workshop, Göteborg, June 22.-24.</p>\n<p>The heat transfer equation is implemented according to Nield &amp; Bejan (2013), Convection in Porous Media, DOI 10.1007/978-1-3.8.14-5541-7_2, Springer</p>\n<hr class=\"docutils\" />\n<p>(*) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM®  and OpenCFD®  trade marks.</p>\n<hr class=\"docutils\" />\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/clockModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>clockModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">clockModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>clockModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"clockmodel-command\">\n<span id=\"index-0\"></span><h1>clockModel command<a class=\"headerlink\" href=\"#clockmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the clockModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">standardClock</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (clockModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The clockModel is the base class for models to examine the code/algorithm with respect to run time.</p>\n<p>Main parts of the clockModel classes are written by Josef Kerbl, JKU.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/clockModel_noClock.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>clockModel_noClock command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">clockModel_noClock command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>clockModel_noClock command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"clockmodel-noclock-command\">\n<span id=\"index-0\"></span><h1>clockModel_noClock command<a class=\"headerlink\" href=\"#clockmodel-noclock-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The “noClock” model is a dummy clockModel model which does not measure/evaluate the run time.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"clockModel.html\"><span class=\"doc\">clockModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/clockModel_standardClock.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>clockModel_standardClock command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">clockModel_standardClock command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>clockModel_standardClock command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"clockmodel-standardclock-command\">\n<span id=\"index-0\"></span><h1>clockModel_standardClock command<a class=\"headerlink\" href=\"#clockmodel-standardclock-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">standardClock</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">clockModel</span> <span class=\"n\">standardClock</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The “standardClock” model is a basic clockModel model which measures the run time between every “.start(int arrayPos,string name)” and “.stop(string name)” statement placed in the code. If a “.start(name)” is called more than once (e.g. in a loop) the accumulated times are calculated.  After the simulation has finished, the data is stored in $caseDir/CFD/clockData/$startTime/*.txt .\nSince the measurements are stored in an array, it is necessary to put a variable <em>arrayPos</em> (type integer) at the start command. Those do not need to be in ascending order and positions may be omitted. The standard size of this array is 30 and can be changed at the initialization of the standardClock class. If <em>arrayPos</em> is out of bounds, the array size will be doubled. The stop command does not need <em>arrayPos</em>, since the class remembers the positions. The string name is intended for easier evaluation afterwards an may be omitted like “.start(int arrayPos)” and “.stop()”. The command “.stop(string name)” is a safety feature, because if the name is not equal to the started name, output will be produced for information.\nAfter the case ran you may use the matPlot.py script located in $CFDEM_UT_DIR/vizClock/ to produce a graphical output of your measurements. The usage is like ‘python &lt; matPlot.py’ and you have to be in the directory of the desired time step, where there is a file called “timeEvalFull.txt”, which contains averaged and maximum data with respect to the number of processes. There is an alias called “vizClock” to run this python routine for visualizing the data.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"clockModel.html\"><span class=\"doc\">clockModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/dataExchangeModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>dataExchangeModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">dataExchangeModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>dataExchangeModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"dataexchangemodel-command\">\n<span id=\"index-0\"></span><h1>dataExchangeModel command<a class=\"headerlink\" href=\"#dataexchangemodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of data exchange model to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayFiles</span><span class=\"p\">;</span>\n<span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayMPI</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (dataExchangeModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The data exchange model performs the data exchange between LIGGGHTS® and the cfdemCloud within CFDEM®coupling toolbox. The exchanged data at least consits of positions, radii, velocities and forces.</p>\n<p>The twoWayMPI model is considered as the standard model, whereas the file-exchange is much slower and its purpose is debugging.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"dataExchangeModel_noDataExchange.html\"><span class=\"doc\">noDataExchange</span></a>, <a class=\"reference internal\" href=\"dataExchangeModel_oneWayVTK.html\"><span class=\"doc\">oneWayVTK</span></a>, <a class=\"reference internal\" href=\"dataExchangeModel_twoWayFiles.html\"><span class=\"doc\">twoWayFiles</span></a>, <a class=\"reference internal\" href=\"dataExchangeModel_twoWayMPI.html\"><span class=\"doc\">twoWayMPI</span></a></p>\n<p><strong>Default:</strong> none</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/dataExchangeModel_noDataExchange.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>dataExchangeModel_noDataExchange command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">dataExchangeModel_noDataExchange command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>dataExchangeModel_noDataExchange command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"dataexchangemodel-nodataexchange-command\">\n<span id=\"index-0\"></span><h1>dataExchangeModel_noDataExchange command<a class=\"headerlink\" href=\"#dataexchangemodel-nodataexchange-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">noDataExchange</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">noDataExchange</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The data exchange model performs the data exchange between the DEM code and the CFD code. The noDataExchange model is a dummy model where no data is exchanged.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"dataExchangeModel.html\"><span class=\"doc\">dataExchangeModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/dataExchangeModel_oneWayVTK.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>dataExchangeModel_oneWayVTK command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">dataExchangeModel_oneWayVTK command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>dataExchangeModel_oneWayVTK command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"dataexchangemodel-onewayvtk-command\">\n<span id=\"index-0\"></span><h1>dataExchangeModel_oneWayVTK command<a class=\"headerlink\" href=\"#dataexchangemodel-onewayvtk-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">oneWayVTK</span><span class=\"p\">;</span>\n<span class=\"n\">oneWayVTKProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">DEMts</span> <span class=\"n\">timeStep</span><span class=\"p\">;</span>\n    <span class=\"n\">relativePath</span> <span class=\"s2\">&quot;path&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">couplingFilename</span> <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">maxNumberOfParticles</span> <span class=\"n\">number</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>timeStep</em> = time step size of stored DEM data</p></li>\n<li><p><em>path</em> = path to the VTK data files relative do simulation directory</p></li>\n<li><p><em>filename</em> = filename of the VTK file series</p></li>\n<li><p><em>number</em> = maximum number of particles in DEM simulation</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">oneWayVTK</span><span class=\"p\">;</span>\n<span class=\"n\">oneWayVTKProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">DEMts</span> <span class=\"mf\">0.0001</span><span class=\"p\">;</span>\n    <span class=\"n\">relativePath</span> <span class=\"s2\">&quot;../DEM/post&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">couplingFilename</span> <span class=\"s2\">&quot;vtk_out</span><span class=\"si\">%4.4d</span><span class=\"s2\">.vtk&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">maxNumberOfParticles</span> <span class=\"mi\">30000</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The data exchange model performs the data exchange between the DEM code and the CFD code. The oneWayVTK model is a model that can exchange particle properties from DEM to CFD based on previously stored VTK data.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"dataExchangeModel.html\"><span class=\"doc\">dataExchangeModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/dataExchangeModel_twoWayFiles.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>dataExchangeModel_twoWayFiles command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">dataExchangeModel_twoWayFiles command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>dataExchangeModel_twoWayFiles command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"dataexchangemodel-twowayfiles-command\">\n<span id=\"index-0\"></span><h1>dataExchangeModel_twoWayFiles command<a class=\"headerlink\" href=\"#dataexchangemodel-twowayfiles-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayFiles</span><span class=\"p\">;</span>\n<span class=\"n\">twoWayFilesProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">couplingFilename</span> <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">maxNumberOfParticles</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">DEMts</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>filename</em> = filename of the VTK file series</p></li>\n<li><p><em>scalar1</em> = maximum number of particles in DEM simulation</p></li>\n<li><p><em>scalar2</em> = DEM time step width</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayFiles</span><span class=\"p\">;</span>\n<span class=\"n\">twoWayFilesProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">couplingFilename</span> <span class=\"s2\">&quot;vtk_out</span><span class=\"si\">%4.4d</span><span class=\"s2\">.vtk&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">maxNumberOfParticles</span> <span class=\"mi\">30000</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The data exchange model performs the data exchange between the DEM code and the CFD code. The twoWayFiles model is a model that can exchange particle properties from DEM to CFD and from CFD to DEM. Data is exchanged via files that are sequentially written/read by the codes.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Developed only for two processors, one for DEM and one for CFD run.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"dataExchangeModel.html\"><span class=\"doc\">dataExchangeModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/dataExchangeModel_twoWayMPI.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>dataExchangeModel_twoWayMPI command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">dataExchangeModel_twoWayMPI command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>dataExchangeModel_twoWayMPI command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"dataexchangemodel-twowaympi-command\">\n<span id=\"index-0\"></span><h1>dataExchangeModel_twoWayMPI command<a class=\"headerlink\" href=\"#dataexchangemodel-twowaympi-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayMPI</span><span class=\"p\">;</span>\n<span class=\"n\">twoWayMPIProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">liggghtsPath</span> <span class=\"s2\">&quot;path&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>path</em> = path to the DEM simulation input file</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">dataExchangeModel</span> <span class=\"n\">twoWayMPI</span><span class=\"p\">;</span>\n<span class=\"n\">twoWayMPIProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">liggghtsPath</span> <span class=\"s2\">&quot;../DEM/in.liggghts_init&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The data exchange model performs the data exchange between the DEM code and the CFD code. The twoWayMPI model is a model that can exchange particle properties from DEM to CFD and from CFD to DEM. Data is exchanged via MPI technique. The DEM run is executed by the coupling model, via a liggghtsCommandModel object.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"dataExchangeModel.html\"><span class=\"doc\">dataExchangeModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/fix_couple_cfd.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>couple/cfd command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">couple/cfd command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#default\">Default</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>couple/cfd command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"couple-cfd-command\">\n<span id=\"index-0\"></span><h1>couple/cfd command<a class=\"headerlink\" href=\"#couple-cfd-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">fix</span> <span class=\"n\">ID</span> <span class=\"n\">group</span><span class=\"o\">-</span><span class=\"n\">ID</span> <span class=\"n\">couple</span><span class=\"o\">/</span><span class=\"n\">cfd</span> <span class=\"n\">couple_every</span> <span class=\"n\">N</span> <span class=\"n\">mpi</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>ID, group-ID are documented in <span class=\"xref std std-doc\">fix</span> command</p></li>\n<li><p>couple/cfd = style name of this fix command</p></li>\n<li><p>couple_every = obligatory keyword</p></li>\n<li><p>N = number of DEM time steps between two coupling steps</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>fix cfd all couple/cfd couple_every 1000 mpi</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This fix is responsible for the coupling between CFD and DEM calculation, i.e. for pushing and pulling of properties.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n<p><strong>Related Commands:</strong>\n<a class=\"reference internal\" href=\"fix_couple_cfd_force.html\"><span class=\"doc\">fix couple/cfd/force</span></a></p>\n</section>\n<section id=\"default\">\n<h2>Default<a class=\"headerlink\" href=\"#default\" title=\"Permalink to this headline\"></a></h2>\n<p>None</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/fix_couple_cfd_force.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>couple/cfd/force command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">couple/cfd/force command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#default\">Default</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>couple/cfd/force command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"couple-cfd-force-command\">\n<span id=\"index-0\"></span><h1>couple/cfd/force command<a class=\"headerlink\" href=\"#couple-cfd-force-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">fix</span> <span class=\"n\">ID</span> <span class=\"n\">group</span><span class=\"o\">-</span><span class=\"n\">ID</span> <span class=\"n\">couple</span><span class=\"o\">/</span><span class=\"n\">cfd</span><span class=\"o\">/</span><span class=\"n\">force</span>\n</pre></div>\n</div>\n<ul>\n<li><p>ID, group-ID are documented in <span class=\"xref std std-doc\">fix</span> command</p></li>\n<li><p>couple/cfd = style name of this fix command</p></li>\n<li><p>zero or more keyword/value pairs may be appended</p></li>\n<li><p>keyword = <em>force</em> or <em>torque</em> or <em>transfer_superquadric</em> or <em>transfer_ellipsoid</em> or <em>transfer_stochastic</em> or <em>transfer_property</em> or <em>CAddRhoFluid</em></p>\n<pre class=\"literal-block\"><em>force</em> values = <em>implicit</em> or <em>excplicit</em>\n  for allocating memory required for implicit/explicit drag force handling</pre>\n<pre class=\"literal-block\"><em>torque</em> values = <em>implicit</em> or <em>excplicit</em>\n  for allocating memory required for implicit/explicit hydrodynamic torque handling</pre>\n<pre class=\"literal-block\"><em>CAddRhoFluid</em> value = CAdd RhoFluid\n  CAdd = Coefficient for additional mass term. (Usually 0.5)\n  RhoFluid = Fluid density</pre>\n<pre class=\"literal-block\"><em>transfer_superquadric</em> values = <em>yes</em> or <em>no</em>\n  for allocating memory required for handling superquadrics</pre>\n<pre class=\"literal-block\"><em>transfer_stochastic</em> values = <em>yes</em> or <em>no</em>\n  for allocating memory required for handling stochastic dispersion</pre>\n</li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>fix     cfd  all couple/cfd couple_every 100 mpi\nfix cfd2 all couple/cfd/force</p>\n<p>fix cfd  all couple/cfd couple_every 100 mpi\nfix cfd2 all couple/cfd/force force implicit transfer_type yes</p>\n<p>fix cfd  all couple/cfd couple_every 100 mpi\nfix cfd2 all couple/cfd/force force implicit transfer_property name color type scalar-atom</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The command couple/cfd/force can only be used in combination with <a class=\"reference internal\" href=\"fix_couple_cfd.html\"><span class=\"doc\">fix_couple_cfd</span></a>. This model transfers the force that the fluid exceeds on each particle to the DEM calculation. At every coupling time step the force term, which contains contributions from all force models active in the CFD calculation, is passed on to LIGGGHTS®. This (constant) term is then used in the particle calculations at every DEM time step until the next coupling takes place.\nAdditionally Ksl and Uf terms are transferred to LIGGGHTS® unless the force is set to explicit.</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>It is strongly recommended to use the fix nve/cfd_cn/* integrator style with implicit force terms, otherwise these will be ignored.</p>\n</div>\n<p>Additional information, as the LIGGGHTS® atom_type can be transferred to the CFDEMcoupling environment with the keywork transfer_type yes. Similar keywords are transfer_density, transfer_torque and the more general transfer_property. The syntax is transfer_property name “name” type “data-type”. The data-type can be scalar-atom or vector-atom and this needs to be a per atom property previously defined.</p>\n<p>The option <em>CAddRhoFluid</em> enables additional mass terms for the integration of particles. These model the influence of displaced fluid on the particle motion.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p><em>transfer_superquadric = yes</em> requires <span class=\"xref std std-doc\">atom_style</span> superquadric</p>\n<p><strong>Related Commands:</strong>\n<a class=\"reference internal\" href=\"fix_couple_cfd.html\"><span class=\"doc\">fix couple/cfd</span></a></p>\n</section>\n<section id=\"default\">\n<h2>Default<a class=\"headerlink\" href=\"#default\" title=\"Permalink to this headline\"></a></h2>\n<p>force implicit:all(b)</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-command\">\n<span id=\"index-0\"></span><h1>forceModel command<a class=\"headerlink\" href=\"#forcemodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">model_x</span>\n    <span class=\"n\">model_y</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of force model to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">Archimedes</span>\n    <span class=\"n\">DiFeliceDrag</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (forceModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle and on each CFD cell. All force models selected are executed sequentially and the forces on the particles are superposed. If the fluid density field is needed, by default a field named “rho” will be used. Via the forceSubModel an alternative field can be chosen.</p>\n<p>Some force models aren’t actual force calculations, but might be used to create additional output fields.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Most force models are ready to be used with coarse graining. If any force model used in the simulation is not ready for coarse graining, but is used with coarse graining, the simulation is stopped. Setting a flag “cgWarnOnly true;” in coupling properties, the simulation will print a warning to the terminal (log file).</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel_Archimedes.html\"><span class=\"doc\">Archimedes</span></a>, <a class=\"reference internal\" href=\"forceModel_DiFeliceDrag.html\"><span class=\"doc\">DiFeliceDrag</span></a>, <a class=\"reference internal\" href=\"forceModel_gradPForce.html\"><span class=\"doc\">gradPForce</span></a>, <a class=\"reference internal\" href=\"forceModel_viscForce.html\"><span class=\"doc\">viscForce</span></a></p>\n<p>Note: This examples list may be incomplete - please look for other models (forceModel_XY) in this documentation.</p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_Archimedes.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_Archimedes command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_Archimedes command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_Archimedes command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-archimedes-command\">\n<span id=\"index-0\"></span><h1>forceModel_Archimedes command<a class=\"headerlink\" href=\"#forcemodel-archimedes-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">Archimedes</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ArchimedesProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;gravity&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">densityFieldName</span> <span class=\"s2\">&quot;density&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">twoDimensional</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span>   <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceDEM</span>   <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span>         <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span>   <span class=\"n\">switch4</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>gravity</em> = (optional, default “g”) name of the finite volume gravity field</p></li>\n<li><p><em>density</em> = (optional, default “rho”) name of the finite volume density field</p></li>\n<li><p><em>twoDimensional</em> = optional keyword for conducting a two dimensional calculation</p></li>\n<li><p><em>switch1</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>switch2</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch3</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">Archimedes</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ArchimedesProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;g&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The Archimedes model is a model that calculates the Archimedes’ volumetric lift force stemming from density difference of fluid and particle.</p>\n<p>If the particleShapeType multisphere is selected, caluclations are performed for multisphere particles. In this operation mode additional input for DHc or area per particle type may be required. Without this input the multisphere variant may fail.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_ArchimedesIB.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_ArchimedesIB command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_ArchimedesIB command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_ArchimedesIB command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-archimedesib-command\">\n<span id=\"index-0\"></span><h1>forceModel_ArchimedesIB command<a class=\"headerlink\" href=\"#forcemodel-archimedesib-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">ArchimedesIB</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ArchimedesIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;gravity&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">twoDimensional</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span>  <span class=\"n\">switch1</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>gravity</em> = (optional, default “g”) name of the finite volume gravity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>twoDimensional</em> = optional keyword for conducting a two dimensional calculation</p></li>\n<li><p><em>switch1</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">ArchimedesIB</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ArchimedesIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;g&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfractionNext&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The ArchimedesIB model is a model that calculates the ArchimedesIB’ volumetric lift force stemming from density difference of fluid and particle. This model is especially suited for resolved CFD-DEM simulations where the particle is represented by immersed boundary method.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for immersed boundary solvers.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_DiFeliceDrag.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_DiFeliceDrag command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_DiFeliceDrag command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_DiFeliceDrag command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-difelicedrag-command\">\n<span id=\"index-0\"></span><h1>forceModel_DiFeliceDrag command<a class=\"headerlink\" href=\"#forcemodel-difelicedrag-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">DiFeliceDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">DiFeliceDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">UInterpolationType</span> <span class=\"s2\">&quot;type2&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span>       <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">scale</span>               <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDrag</span>           <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDH</span>             <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span>  <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">implForceDEM</span>        <span class=\"n\">switch4</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span>             <span class=\"n\">switch5</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span>     <span class=\"n\">switch6</span><span class=\"p\">;</span>\n    <span class=\"n\">voidageFunctionDiFelice</span> <span class=\"n\">switch7</span><span class=\"p\">;</span>\n    <span class=\"n\">voidageFunctionRong</span> <span class=\"n\">switch8</span><span class=\"p\">;</span>\n    <span class=\"n\">voidageFunctionTang</span> <span class=\"n\">switch9</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span>                  <span class=\"n\">scalar4</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>Us</em> = (optional, default “Us”) name of the finite volume granular velocity field</p></li>\n<li><p><em>switch1</em> = (optional, normally off) flag to use interpolated voidfraction and velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for voidfraction field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n<li><p><em>switch2</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>scalar1</em> = (optional) scaling of particle diameter: d_sim=scale*d_real. d_sim=(potentially coarse grained) particle diameter. scale=coarse graining factor. d_real= particle diameter as it is measured.</p></li>\n<li><p><em>scalar2</em> = (optional) scaling factor which directly scales the drag force.</p></li>\n<li><p><em>scalar3</em> = (optional) scaling factor between particle diameter and hydraulic diameter of clump</p></li>\n<li><p><em>switch3</em> = sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch5</em> = sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch6</em> = sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch7</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch8</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch9</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar4</em> = optional, only if switch6 is true</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">DiFeliceDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">DiFeliceDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The DiFeliceDrag model is a model that calculates the particle based drag force following the correlation of Di Felice (see Zhou et al. (2010), JFM).</p>\n<p>If the particleShapeType multisphere is selected, caluclations are performed for multisphere particles. In this operation mode additional input for DHc or area per particle type may be required. Without this input the multisphere variant may fail.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_GidaspowDrag.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_GidaspowDrag command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_GidaspowDrag command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_GidaspowDrag command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-gidaspowdrag-command\">\n<span id=\"index-0\"></span><h1>forceModel_GidaspowDrag command<a class=\"headerlink\" href=\"#forcemodel-gidaspowdrag-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">GidaspowDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">GidaspowDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">phi</span>                 <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">UInterpolationType</span> <span class=\"s2\">&quot;type2&quot;</span>\n    <span class=\"n\">implForceDEM</span>        <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span>       <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">scale</span>               <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDrag</span>           <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDH</span>             <span class=\"n\">scalar4</span><span class=\"p\">;</span>\n    <span class=\"n\">switchingVoidfraction</span> <span class=\"n\">scalar5</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span>  <span class=\"n\">switch4</span><span class=\"p\">;</span>\n    <span class=\"n\">implForceDEM</span>        <span class=\"n\">switch5</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span>             <span class=\"n\">switch6</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span>     <span class=\"n\">switch7</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span>                  <span class=\"n\">scalar6</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>Us</em> = (optional, default “Us”) name of the finite volume cell averaged particle velocity field</p></li>\n<li><p><em>scalar1</em> = (optional, default 1) drag correction factor</p></li>\n<li><p><em>switch1</em> = (optional, default off) flag to use interpolated voidfraction and fluid velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for voidfraction field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n<li><p><em>switch2</em> = (optional, default false) flag to use implicit formulation of drag on DEM side\n<em>switch3</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>scalar2</em> = (optional) scaling of particle diameter: d_sim=scale*d_real. d_sim=(potentially coarse grained) particle diameter. scale=coarse graining factor. d_real= particle diameter as it is measured.</p></li>\n<li><p><em>scalar3</em> = (optional) scaling of drag law</p></li>\n<li><p><em>scalar4</em> = (optional) scaling factor between particle diameter and hydraulic diameter of clump</p></li>\n<li><p><em>scalar5</em> = (optional) voidfraction above which dilute formulation will be used</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch5</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch6</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch7</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar6</em> = (optional, default false) optional, only if switch6 is true</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">GidaspowDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">GidaspowDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The GidaspowDrag model is a model that calculates the particle based drag force following the correlation of Gidaspow which is a combination of Ergun (1952) and Wen &amp; Yu (1966)  (see Zhu et al. (2007): “Discrete particle simulation of particulate systems: Theoretical developments”, ChemEngScience).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_KochHillDrag.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_KochHillDrag command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_KochHillDrag command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_KochHillDrag command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-kochhilldrag-command\">\n<span id=\"index-0\"></span><h1>forceModel_KochHillDrag command<a class=\"headerlink\" href=\"#forcemodel-kochhilldrag-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">KochHillDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">KochHillDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span>\n    <span class=\"n\">interpolation</span>       <span class=\"s2\">&quot;switch1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">UInterpolationType</span>  <span class=\"s2\">&quot;type2&quot;</span>\n    <span class=\"n\">implForceDEM</span>        <span class=\"s2\">&quot;switch2&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span>       <span class=\"s2\">&quot;switch3&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">scale</span>               <span class=\"s2\">&quot;scalar1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDrag</span>           <span class=\"s2\">&quot;scalar2&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleDH</span>             <span class=\"s2\">&quot;scalar3&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span>  <span class=\"s2\">&quot;switch4&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span>             <span class=\"s2\">&quot;switch5&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">implForceDEMaccumulated</span> <span class=\"s2\">&quot;switch6&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span>     <span class=\"s2\">&quot;switch7&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span>                  <span class=\"s2\">&quot;scalar4&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>Us</em> = (optional, default “Us”) name of finite volume granular velocity field</p></li>\n<li><p><em>switch1</em> = (optional, normally off) flag to use interpolated voidfraction and fluid velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for voidfraction field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n<li><p><em>switch2</em> = (optional, normally off) flag to use implicit formulation of drag on DEM side\n<em>switch3</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>scalar1</em> = (optional) scaling of particle diameter: d_sim=scale*d_real. d_sim=(potentially coarse grained) particle diameter. scale=coarse graining factor. d_real= particle diameter as it is measured.</p></li>\n<li><p><em>scalar2</em> = (optional) scaling of drag law</p></li>\n<li><p><em>scalar3</em> = (optional) scaling factor between particle diameter and hydraulic diameter of clump</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch5</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch6</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch7</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar4</em> = optional, only if switch7 is true</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">KochHillDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">KochHillDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The KochHillDrag model is a model that calculates the particle based drag force following the correlation of Koch &amp; Hill (2001)  (see van Buijtenen et al. (2011): “Numerical and experimental study on multiple-spout fluidized beds”, ChemEngScience).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_LaEuScalarTemp.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_LaEuScalarTemp command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_LaEuScalarTemp command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_LaEuScalarTemp command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-laeuscalartemp-command\">\n<span id=\"index-0\"></span><h1>forceModel_LaEuScalarTemp command<a class=\"headerlink\" href=\"#forcemodel-laeuscalartemp-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">LaEuScalarTemp</span>\n<span class=\"p\">);</span>\n<span class=\"n\">LaEuScalarTempProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">tempFieldName</span> <span class=\"s2\">&quot;T&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partTempName</span> <span class=\"s2\">&quot;Temp&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partHeatFluxName</span> <span class=\"s2\">&quot;convectiveHeatFlux&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partHeatTransCoeffName</span> <span class=\"s2\">&quot;heatTransCoeff&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partHeatFluidName</span> <span class=\"s2\">&quot;heatFluid&quot;</span><span class=\"p\">;</span>\n    <span class=\"k\">lambda</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">Cp</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">TInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">maxSource</span> <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n    <span class=\"n\">scale</span> <span class=\"n\">scalar4</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span> <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span> <span class=\"n\">scalar5</span><span class=\"p\">;</span>\n    <span class=\"n\">NuCorrelation</span> <span class=\"s2\">&quot;NuCorrelation&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>T</em> = name of the finite volume scalar temperature field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>Temp</em> = name of the DEM data representing the particles temperature</p></li>\n<li><p><em>convectiveHeatFlux</em> = name of the DEM data representing the particle-fluid convective heat flux</p></li>\n<li><p><em>heatTransCoeff</em> = name of heat transfer coefficient</p></li>\n<li><p><em>heatFluid</em> =\n<em>scalar1</em> = fluid thermal conductivity [W/(m*K)]. Must be chosen &gt;= 0! If 0, then heat transfer is ignored.</p></li>\n<li><p><em>scalar2</em> = fluid specific heat capacity [W*s/(kg*K)]</p></li>\n<li><p><em>switch1</em> = (optional, normally off) flag to use interpolated voidfraction and fluid velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for T field</p></li>\n<li><p><em>switch2</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar3</em> = (optional) limit maximal turbulence</p></li>\n<li><p><em>scalar4</em> = scaling of particle diameter: d_sim=scale*d_real. d_sim=(potentially coarse grained) particle diameter. scale=coarse graining factor. d_real= particle diameter as it is measured.</p></li>\n<li><p><em>switch3</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar5</em> = optional, only if switch3 is true</p></li>\n</ul>\n<p><em>NuCorrelation</em> = (optional, default=”LiMason”) chooses the heat correlation to be used for Nusselt\nnumber correlation. Valid options: ‘LiMason’, ‘Deen’.:l</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">LaEuScalarTemp</span>\n<span class=\"p\">);</span>\n<span class=\"n\">LaEuScalarTempProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">tempFieldName</span> <span class=\"s2\">&quot;T&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partTempName</span> <span class=\"s2\">&quot;Temp&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">partHeatFluxName</span> <span class=\"s2\">&quot;convectiveHeatFlux&quot;</span><span class=\"p\">;</span>\n    <span class=\"k\">lambda</span> <span class=\"mf\">0.0256</span><span class=\"p\">;</span>\n    <span class=\"n\">Cp</span> <span class=\"mi\">1007</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the fluid flow! Using the particles’ temperature a scalar field representing “particle-fluid heatflux” is calculated. The solver then uses this source field in the scalar transport equation for the temperature. The model for convective heat transfer is based on Li and Mason (2000), A computational investigation of transient heat transfer in  pneumatic transport of granular particles, Pow.Tech 112</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Goes only with cfdemSolverScalar and cfdemSolverReacting.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_MeiLift.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_MeiLift command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_MeiLift command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_MeiLift command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-meilift-command\">\n<span id=\"index-0\"></span><h1>forceModel_MeiLift command<a class=\"headerlink\" href=\"#forcemodel-meilift-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">MeiLift</span>\n<span class=\"p\">);</span>\n<span class=\"n\">MeiLiftProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">useSecondOrderTerms</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">vorticityInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">UInterpolationType</span> <span class=\"s2\">&quot;type2&quot;</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span> <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span> <span class=\"n\">switch4</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>useSecondOrderTerms</em> = switch to activate second order terms in the lift force model</p></li>\n<li><p><em>switch1</em> = switch to activate tri-linear interpolation of the flow quantities at the particle position</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for vorticity field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n<li><p><em>switch2</em> = switch to activate the report of per-particle quantities to the screen</p></li>\n<li><p><em>switch3</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar1</em> = optional, only if switch4 is true</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">MeiLift</span>\n<span class=\"p\">);</span>\n<span class=\"n\">MeiLiftProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">useSecondOrderTerms</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The MeiLift model calculates the lift force for each particle based on Loth and Dorgan (2009). In case the keyword “useSecondOrderTerms” is not specified, this lift force model uses the expression of McLaughlin (1991, Journal of Fluid Mechanics 224:261-274).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_SchillerNaumannDrag.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_SchillerNaumannDrag command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_SchillerNaumannDrag command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_SchillerNaumannDrag command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-schillernaumanndrag-command\">\n<span id=\"index-0\"></span><h1>forceModel_SchillerNaumannDrag command<a class=\"headerlink\" href=\"#forcemodel-schillernaumanndrag-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">SchillerNaumannDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">SchillerNaumannDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"s2\">&quot;bool1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">UInterpolationType</span> <span class=\"s2\">&quot;type2&quot;</span>\n    <span class=\"n\">implForceDEM</span> <span class=\"s2\">&quot;bool2&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>bool1</em> = (optional, normally off) flag to use interpolated voidfraction and fluid velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for voidfraction field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n</ul>\n<p><em>bool2</em> = (optional, normally off) flag to use implicit formulation of drag on DEM side:l</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">SchillerNaumannDrag</span>\n<span class=\"p\">);</span>\n<span class=\"n\">SchillerNaumannDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The SchillerNaumannDrag model is a model that calculates the particle based drag force following the correlation of Schiller and Naumann.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_ShirgaonkarIB.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_ShirgaonkarIB command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_ShirgaonkarIB command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_ShirgaonkarIB command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-shirgaonkarib-command\">\n<span id=\"index-0\"></span><h1>forceModel_ShirgaonkarIB command<a class=\"headerlink\" href=\"#forcemodel-shirgaonkarib-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">ShirgaonkarIB</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ShirgaonkarIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">pressureFieldName</span> <span class=\"s2\">&quot;p&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">twoDimensional</span><span class=\"p\">;</span>\n    <span class=\"n\">depth</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>p</em> = name of the finite volume pressure field</p></li>\n<li><p><em>twoDimensional</em> = optional keyword for conducting a two dimensional calculation</p></li>\n<li><p><em>scalar1</em> = optional, only necessary if twoDimensional is active</p></li>\n<li><p><em>switch1</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch2</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">ShirgaonkarIB</span>\n<span class=\"p\">);</span>\n<span class=\"n\">ShirgaonkarIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">pressureFieldName</span> <span class=\"s2\">&quot;p&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The ShirgaonkarIB model calculates the drag force (viscous and pressure force) acting on each particle in a resolved manner (see Shirgaonkar et al. (2009): “A new mathematical formulation and fast algorithm for fully resolved simulation of self-propulsion”, Journal of Comp. Physics). This model is only suited for resolved CFD-DEM simulations where the particle is represented by immersed boundary method.</p>\n<p><strong>References:</strong></p>\n<p>SHIRGAONKAR, A.A., MACIVER, M.A. and PATANKAR, N.A., (2009), “A new mathematical formulation and fast algorithm for fully resolved simulation of self-propulsion”, J. Comput. Phys., 228, 2366-2390.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for immersed boundary solvers.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_checkCouplingInterval.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_checkCouplingInterval command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_checkCouplingInterval command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_checkCouplingInterval command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-checkcouplinginterval-command\">\n<span id=\"index-0\"></span><h1>forceModel_checkCouplingInterval command<a class=\"headerlink\" href=\"#forcemodel-checkcouplinginterval-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">checkCouplingInterval</span>\n<span class=\"p\">);</span>\n<span class=\"n\">checkCouplingIntervalProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">warnOnly</span>                    <span class=\"n\">bool1</span><span class=\"p\">;</span>\n    <span class=\"n\">velocityFieldName</span>           <span class=\"n\">word1</span><span class=\"p\">;</span>\n    <span class=\"n\">rhoP</span>                        <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">maxCFL</span>                      <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">maxPCFL</span>                     <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n    <span class=\"n\">maxAccNr</span>                    <span class=\"n\">scalar4</span><span class=\"p\">;</span>\n    <span class=\"n\">UmaxExpected</span>                <span class=\"n\">scalar5</span><span class=\"p\">;</span>\n    <span class=\"n\">minAllowedVcellByVparcel</span>    <span class=\"n\">scalar6</span><span class=\"p\">;</span>\n    <span class=\"n\">largeVcellByVparcel</span>         <span class=\"n\">scalar7</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span>                <span class=\"n\">scalar8</span><span class=\"p\">;</span>\n    <span class=\"n\">maxRelVelChange</span>             <span class=\"n\">scalar9</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>bool1</em> = (optional, default true) switch to warn or stop simulation if criterion is broken.</p></li>\n<li><p><em>word1</em> = (optional, default U) name of velocity field.</p></li>\n<li><p><em>scalar1</em> = particle density assumed for calculation of the particle relaxation time</p></li>\n<li><p><em>scalar2</em> = (optional, default=1) maximum allowed CFL number.</p></li>\n<li><p><em>scalar3</em> = (optional, default=1) maximum allowed particle coupling CFL number.</p></li>\n<li><p><em>scalar4</em> = (optional, default=0.005) maximum allowed ratio of coupling time to particle relaxation time.</p></li>\n<li><p><em>scalar5</em> = maximum expected velocity fluid velocity (e.g. due to BCs) - used for CFL estimation.</p></li>\n<li><p><em>scalar6</em> = (optional, default=3) min allowed volume ratio of cell / particle.</p></li>\n<li><p><em>scalar7</em> = (optional, default=10000) maximal min volume ratio of cell / particle for which divided void fraction model is recommended.</p></li>\n<li><p><em>scalar8</em> = (optional, default=coupling time) interval of execution.</p></li>\n<li><p><em>scalar9</em> = (optional, default=0.1) max allowed ratio of fluid velocity gradient and coupling interval.</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">checkCouplingInterval</span>\n<span class=\"p\">);</span>\n<span class=\"n\">checkCouplingIntervalProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">rhoP</span> <span class=\"mi\">2500</span><span class=\"p\">;</span>\n    <span class=\"n\">UmaxExpected</span> <span class=\"mi\">10</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span> <span class=\"mf\">0.002</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the simulation - it is a postprocessing tool! At the first coupling step and at every time interval several criteria are checked:</p>\n<ol class=\"arabic simple\">\n<li><p>The acceleration number is defined as the ratio of DEMtime/particleRelaxationTime, where DEMtime is DEM time step size * coupling interval. The acceleration nr should be smaller than ~0.005.</p></li>\n<li><p>The Courant Number (CFL). If the CFL number exceeds a reasonable value the quality of the result becomes bad - therefore the simulation settings should be changed.</p></li>\n<li><p>The particle coupling Courant number (pCFL). Similar to the fluid CFL, the pCFL should not exceed a reasonable value. It is defined as max(vparticle)*couplingTime/min(cellLength) .</p></li>\n<li><p>The ratio of smallest cell biggest particle volume. Typically this should be larger than 3.</p></li>\n<li><p>If the ratio of the smallest cell to the largest particle exceeds a certain limit (current default value 10000) it is recommended to use the more efficient centre voidfraction model.</p></li>\n<li><p>The minimum and maximum Stokes Number. The Stokes number is a measure for in how far the particles follow the flow. It is calculated as the product of the particle relaxation time and the relative velocity between fluid and particle over the particle diameter: relaxation time * relative velocity / particle diameter. Note that the highest appearing value of scaleDrag will be used to scale the relaxation time reciprocally.</p></li>\n<li><p>The product of max fluid velocity gradient and coupling time is checked as a benchmark for particle acceleration due to changes the particles experience in the velocity field.</p></li>\n</ol>\n<p>For the criteria (1)-(4) the user can define its own allowed bounds and with the flag “warnOnly” the user can choose if the simulation should be stopped or if just a warning is given if a criterion is broken.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>needs MPI based dataExchange model - e.g. oneWayVTK will not work.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_fieldStore.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_fieldStore command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_fieldStore command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_fieldStore command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-fieldstore-command\">\n<span id=\"index-0\"></span><h1>forceModel_fieldStore command<a class=\"headerlink\" href=\"#forcemodel-fieldstore-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">fieldStore</span>\n<span class=\"p\">);</span>\n<span class=\"n\">fieldStoreProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;scalarField&quot;</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;vectorField&quot;</span>\n    <span class=\"p\">);</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>scalarField</em> = names of the finite volume scalar fields to be stored</p></li>\n<li><p><em>vectorField</em> = names of the finite volume vector fields to be stored</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">fieldStore</span>\n<span class=\"p\">);</span>\n<span class=\"n\">fieldStoreProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;voidfraction&quot;</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;U&quot;</span>\n    <span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the flow - it is a tool to store a scalar/vector field! This is especially useful if you use a boundary condition which cannot interpreted correctly in your postporcessor (e.g. paraview).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_fieldTimeAverage.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_fieldTimeAverage command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_fieldTimeAverage command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_fieldTimeAverage command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-fieldtimeaverage-command\">\n<span id=\"index-0\"></span><h1>forceModel_fieldTimeAverage command<a class=\"headerlink\" href=\"#forcemodel-fieldtimeaverage-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">fieldTimeAverage</span>\n<span class=\"p\">);</span>\n<span class=\"n\">fieldTimeAverageProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startTime</span> <span class=\"n\">time</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;scalarField&quot;</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;vectorField&quot;</span>\n    <span class=\"p\">);</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>time</em> = (optional) time to start temporal averaging</p></li>\n<li><p><em>scalarField</em> = names of the finite volume scalar fields to be temporally averaged</p></li>\n<li><p><em>vectorField</em> = names of the finite volume vector fields to be temporally averaged</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">fieldTimeAverage</span>\n<span class=\"p\">);</span>\n<span class=\"n\">fieldTimeAverageProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startTime</span> <span class=\"mf\">1.0</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;voidfraction&quot;</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;Us&quot;</span>\n    <span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the simulation - it is a postprocessing tool! Starting at start time the specified fields are temporally averaged and written at “writeTime”. They can then be probed using standard function object probes. The output name is timeAverage_scalarField, where scalarField is the name of the original field.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_gradPForce.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_gradPForce command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_gradPForce command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_gradPForce command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-gradpforce-command\">\n<span id=\"index-0\"></span><h1>forceModel_gradPForce command<a class=\"headerlink\" href=\"#forcemodel-gradpforce-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">gradPForce</span><span class=\"p\">;</span>\n<span class=\"p\">);</span>\n<span class=\"n\">gradPForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">pFieldName</span> <span class=\"s2\">&quot;pressure&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">velocityFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span>       <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">gradPInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">useAddedMass</span>        <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span>       <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span>  <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceDEM</span>       <span class=\"n\">switch4</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>pressure</em> = name of the finite volume fluid pressure field</p></li>\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>switch1</em> = flag to use interpolated pressure values (normally off)</p></li>\n<li><p><em>type1</em> = (optional, default cellPointFace) interpolation type for grad(p) field</p></li>\n<li><p><em>useAddedMass</em> = (optional) coefficient of added mass accounted for</p></li>\n<li><p><em>switch2</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>switch3</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">gradPForce</span><span class=\"p\">;</span>\n<span class=\"p\">);</span>\n<span class=\"n\">gradPForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">pFieldName</span> <span class=\"s2\">&quot;p&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">velocityFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The gradPForce model is a model that calculates the particle based pressure gradient force -(grad(p)) * Vparticle (see Zhou et al. (2010): “Discrete particle simulation of particle-fluid flow: model formulations and their applicability” ,JFM).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_noDrag.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_noDrag command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_noDrag command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_noDrag command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-nodrag-command\">\n<span id=\"index-0\"></span><h1>forceModel_noDrag command<a class=\"headerlink\" href=\"#forcemodel-nodrag-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">noDrag</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<p>noDragProps\n{</p>\n<blockquote>\n<div><p>noDEMForce “switch1”;\nkeepCFDForce “switch2”;</p>\n</div></blockquote>\n<p>}</p>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional, default false) do not apply the previously calculated forces (implicitly and explicitly treated) in DEM integration</p></li>\n<li><p><em>switch2</em> = (optional, default false) do not delete the previously calculated forces (implicitly and explicitly treated) and use them in CFD source terms</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">noDrag</span>\n<span class=\"p\">);</span>\n\n<span class=\"n\">noDragProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">noDEMForce</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n    <span class=\"n\">keepCFDForce</span> <span class=\"n\">false</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The noDrag model sets the forces acting on the particle (which were previously caclulated) to zero. If several force models are selected and noDrag is the last model being executed, the fluid particle force will be set to zero. If the variable noDEMForce is set, then the forces communicated to the DEM solver are also set to zero.</p>\n<p>If the particleShapeType multisphere is selected, caluclations are performed for multisphere particles. In this operation mode additional input for DHc or area per particle type may be required. Without this input the multisphere variant may fail.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_particleCellVolume.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_particleCellVolume command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_particleCellVolume command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_particleCellVolume command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-particlecellvolume-command\">\n<span id=\"index-0\"></span><h1>forceModel_particleCellVolume command<a class=\"headerlink\" href=\"#forcemodel-particlecellvolume-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">particleCellVolume</span>\n<span class=\"p\">);</span>\n<span class=\"n\">particleCellVolumeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">writeToFile</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">upperThreshold</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">lowerThreshold</span> <span class=\"n\">number3</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional, default true) switch for output to screen</p></li>\n<li><p><em>switch2</em> = (optional, default false) switch for output to file</p></li>\n<li><p><em>number1</em> = (optional, default 0) start time of volume calculation and output</p></li>\n<li><p><em>number2</em> = (optional, default 1.01) only cells with a field value (magnitude) lower than this upper threshold are considered</p></li>\n<li><p><em>number3</em> = (optional, default -0.01) only cells with a field value (magnitude) greater than this lower threshold are considered</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">particleCellVolume</span>\n<span class=\"p\">);</span>\n<span class=\"n\">particleCellVolumeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">upperThreshold</span> <span class=\"mf\">0.999</span><span class=\"p\">;</span>\n    <span class=\"n\">lowerThreshold</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the simulation - it is a postprocessing tool! The total volume of the particles as they are represented on the CFD mesh is calculated. Further the total volume of the cells particles are in is calculated.\nAt “writeTime” a field named particleCellVolume , where scalarField is the name of the original field, is written. This can then be probed using standard function object probes. Analogously a field named cellVolume is written. Using the verbose option a screen output is given.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_particleVolume.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_particleVolume command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_particleVolume command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_particleVolume command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-particlevolume-command\">\n<span id=\"index-0\"></span><h1>forceModel_particleVolume command<a class=\"headerlink\" href=\"#forcemodel-particlevolume-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">particleVolume</span>\n<span class=\"p\">);</span>\n<span class=\"n\">particleVolumeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">verbose</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">writeToFile</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">scale</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional, default false) switch for output to screen</p></li>\n<li><p><em>switch2</em> = (optional, default true) switch for output to file</p></li>\n<li><p><em>scalar1</em> = (optional, default 1) scaling of the particle volume d=dSphere/scale</p></li>\n<li><p><em>scalar2</em> = (optional, default 0) start time of volume calculation and output</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">particleVolume</span>\n<span class=\"p\">);</span>\n<span class=\"n\">particleVolumeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">writeToFile</span> <span class=\"n\">false</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the simulation - it is a postprocessing tool! The total volume of the particles located in the CFD domain is calculated.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_periodicPressure.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_periodicPressure command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_periodicPressure command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_periodicPressure command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-periodicpressure-command\">\n<span id=\"index-0\"></span><h1>forceModel_periodicPressure command<a class=\"headerlink\" href=\"#forcemodel-periodicpressure-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">periodicPressure</span>\n<span class=\"p\">);</span>\n<span class=\"n\">periodicPressureProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;g&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">mode</span> <span class=\"s2\">&quot;word&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">targetVelocity</span> <span class=\"n\">vector1</span><span class=\"p\">;</span>\n    <span class=\"n\">p</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">i</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">avMixtureDensity</span> <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>g</em> = name of gravity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of voidfraction field</p></li>\n<li><p><em>word</em> = keyword for operation mode, choose “controlled” or “mixtureDensity”</p></li>\n<li><p><em>vector1</em> = target ensemble average particle velocity (for monodisperse systems) - only for mode “controlled”</p></li>\n<li><p><em>scalar1</em> = proportional constant for controller - only for mode “controlled”</p></li>\n<li><p><em>scalar2</em> = integral constant for controller - only for mode “controlled”</p></li>\n<li><p><em>scalar3</em> = average density of the mixture in the domain - only for mode “mixtureDensity”</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">periodicPressure</span>\n<span class=\"p\">);</span>\n<span class=\"n\">periodicPressureProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">gravityFieldName</span> <span class=\"s2\">&quot;g&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">mode</span> <span class=\"s2\">&quot;controlled&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">targetVelocity</span> <span class=\"p\">(</span><span class=\"mf\">0.</span> <span class=\"mf\">0.</span> <span class=\"mf\">0.</span><span class=\"p\">);</span>\n    <span class=\"n\">p</span> <span class=\"mi\">2500</span><span class=\"p\">;</span>\n    <span class=\"n\">i</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model calculates a force field following two different modi: a) “controlled” and b) “mixtureDensity”, which can be used to transform fluid pressure gradient to dynamic pressure gradient which is necessary for periodic boundaries. With modus “controlled” the force field is set in a way, that the ensemble average particle velocity reaches a target velocity. With modus “mixtureDensity”, a force field rhoMix*g*voidfraction is calculated. The force is passed to the explicitCoupleSource model via the setSourceField(..) function. For theoretical background see Radl, Girardi and Sundaresan (2012): “Effective drag law for parcel-based approaches - what can we learn from CFD-DEM?”, ECCOMAS 2012, Vienna.)</p>\n<p>The following images show a brief summary of the equations and an overview of how the force on the CFD and DEM side is calculated:</p>\n<img alt=\"img/forceModel_periodicPressure_1.PNG\" class=\"align-center\" src=\"img/forceModel_periodicPressure_1.PNG\" />\n<img alt=\"img/forceModel_periodicPressure_2.PNG\" class=\"align-center\" src=\"img/forceModel_periodicPressure_2.PNG\" />\n<img alt=\"img/forceModel_periodicPressure_3.PNG\" class=\"align-center\" src=\"img/forceModel_periodicPressure_3.PNG\" />\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_scalarGeneralExchange.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_scalarGeneralExchange command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_scalarGeneralExchange command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_scalarGeneralExchange command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-scalargeneralexchange-command\">\n<span id=\"index-0\"></span><h1>forceModel_scalarGeneralExchange command<a class=\"headerlink\" href=\"#forcemodel-scalargeneralexchange-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<pre class=\"literal-block\">forceModels\n(\n    scalarGeneralExchange  // must be 2nd position!\n);\nscalarGeneralExchangeProps\n{\n    useLiMason &quot;switch1&quot;; //default: DeenEtAl\n    useGeneralCorrelation &quot;switch3&quot;; //default: DeenEtAl\n    generalCorrelationParameters (1 2 3 4 5 6 7 8);\n    verbose &quot;switch2&quot;;\n    velFieldName &quot;U&quot;;\n    voidfractionFieldName &quot;voidfraction&quot;;\n    tempFieldName &quot;T&quot;;\n    partTempName &quot;Temp&quot;;\n    /* partHeatFluxName &quot;convectiveHeatFlux&quot;; //switch off for implicit coupling, e.g., to ParScale */\n    partHeatTransCoeffName &quot;heatTransCoeff&quot;;\n    partHeatFluidName &quot;heatFluid&quot;;\n    lambda value;\n    Cp value1;\n    //Lists with information for each species FOR THE PARTICLES\n    //MUST be in the same order as eulerian species in 'scalarTransportProperties'\n    //MUST correspond to property/atom in ligghts (use 'couple/cfd/speciesConvection' to auto-generate individual fields)\n    partSpeciesNames\n    (\n    speciesC\n    );\n    partSpeciesFluxNames\n    (\n    speciesCFlux\n    );\n    partSpeciesTransCoeffNames\n    (\n    speciesCTransCoeff\n    );\n    partSpeciesFluidNames\n    (\n    speciesCFluid\n    );\n    DMolecular\n    (\n    value2\n    );\n    interpolation &quot;bool1&quot;;\n    voidfractionInterpolationType &quot;type1&quot;\n    UInterpolationType &quot;type2&quot;\n    fluidScalarFieldInterpolationType &quot;type2&quot;\n    scalarViscosity switch5;\n    nu scalar5;\n    suppressProbe switch6;\n    scale scalar6;\n    maxSource scalar7;\n}</pre>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional) flag to use Nusselt correlations of Li and Mason (2000)</p></li>\n<li><p><em>switch2</em> = (normally off) for verbose run</p></li>\n<li><p><em>switch3</em> = (optional) flag to use a general Nusselt number correlation (must specify parameters of this correlation in a list called ‘generalCorrelationParameters’ )</p></li>\n<li><p>generalCorrelationParameters =  list with a predefined number of parameters (for length see src code, only read if useGeneralCorrelation is set to true)</p></li>\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n<li><p><em>T</em> = name of the finite volume scalar temperature field</p></li>\n<li><p><em>Temp</em> = name of the DEM data representing the particles temperature</p></li>\n<li><p><em>convectiveHeatFlux</em> = name of the DEM data representing the particle-fluid convective heat flux</p></li>\n<li><p><em>heatTransCoeff</em> = name of the DEM data representing the particle-fluid heat transfer coefficient</p></li>\n<li><p><em>heatFluid</em> = name of the DEM data representing the fluid heat</p></li>\n<li><p><em>value</em> = fluid thermal conductivity [W/(m*K)]</p></li>\n<li><p><em>value1</em> = fluid specific heat capacity [W*s/(kg*K)]</p></li>\n<li><p><em>speciesC</em> = name of the DEM data representing the transport species of the particles</p></li>\n<li><p><em>speciesCFlux</em> = name of the DEM data representing the particle-fluid species flux</p></li>\n<li><p><em>speciesCTransCoeff</em> = name of the DEM data representing the particle-fluid species transfer coefficient</p></li>\n<li><p><em>speciesCFluid</em> = name of the DEM data representing the transport species of the fluid</p></li>\n<li><p><em>value2</em> = molecular diffusion coefficient [m^2/s]</p></li>\n<li><p><em>bool1</em> = (optional, normally off) flag to use interpolated voidfraction and fluid velocity values</p></li>\n<li><p><em>type1</em> = (optional, default cellPoint) interpolation type for voidfraction field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for velocity field</p></li>\n<li><p><em>type3</em> = (optional, default cellPoint) interpolation type for fluidScalarField field</p></li>\n<li><p><em>switch5</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar5</em> = (optional) optional, only if switch5 is true</p></li>\n<li><p><em>switch6</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>scalar7</em> = (optional) scaling of particle diameter: d_sim=scale*d_real. d_sim=(potentially coarse grained) particle diameter. scale=coarse graining factor. d_real= particle diameter as it is measured.</p></li>\n<li><p><em>scalar7</em> = limit maximal turbulence</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<pre class=\"literal-block\">forceModels\n(\n    scalarGeneralExchange  // must be 2nd position!\n);\nscalarGeneralExchangeProps\n{\n    useLiMason false; //default: DeenEtAl\n    useGeneralCorrelation true; //default: DeenEtAl\n    generalCorrelationParameters\n    (\n     7.0 -10 5\n     1.0 0.17\n     1.33 -2.31 1.16\n    );\n    verbose false;\n    velFieldName &quot;U&quot;;\n    voidfractionFieldName &quot;voidfraction&quot;;\n    tempFieldName &quot;T&quot;;\n    partTempName &quot;Temp&quot;;\n    /* partHeatFluxName &quot;convectiveHeatFlux&quot;; //switch off for implicit coupling, e.g., to ParScale */\n    partHeatTransCoeffName &quot;heatTransCoeff&quot;;\n    partHeatFluidName &quot;heatFluid&quot;;\n    lambda 0.0271;\n    Cp 1007;\n    //Lists with information for each species FOR THE PARTICLES\n    //MUST be in the same order as eulerian species in 'scalarTransportProperties'\n    //MUST correspond to property/atom in ligghts (use 'couple/cfd/speciesConvection' to auto-generate individual fields)\n    partSpeciesNames\n    (\n    speciesC\n    );\n    partSpeciesFluxNames\n    (\n    speciesCFlux\n    );\n    partSpeciesTransCoeffNames\n    (\n    speciesCTransCoeff\n    );\n    partSpeciesFluidNames\n    (\n    speciesCFluid\n    );\n    DMolecular\n    (\n    1e-5\n    );\n}</pre>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the fluid flow!\nUsing the particles’ temperature and/or species a scalar field\nrepresenting “particle-fluid heatflux” and/or “particle-fluid speciesflux” is calculated.</p>\n<p>This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\nand OpenFOAM®. Note: this code is not part of OpenFOAM® (see DISCLAIMER).</p>\n<p>Two way general scalar exchange between DEM and CFD\nconvective heat and species transfer model. The standard model is that of\nDeen, N.G. et al., Review of direct numerical simulation of\nfluid-particle mass, momentum and heat transfer in dense gas-solid flows.\nChemical Engineering Science 116 (2014) 710-724.\nThis correlation is based on that of Gunn (1978).</p>\n<p>The switch ‘useGeneralCorrelation’ allows one to specify the parameters\nof the Gunn correlation as a list called ‘generalCorrelationParameters’.</p>\n<p>Alternatively, the correclation of\nLi and Mason (2000), A computational investigation of transient heat\ntransfer in pneumatic transport of granular particles, Pow.Tech 112\ncan be activated. However, this correlation is not suitable for\ndense granular flows.</p>\n<p>If the particleShapeType multisphere is selected, caluclations are performed for multisphere particles. In this operation mode additional input for DHc or area per particle type may be required. Without this input the multisphere variant may fail.</p>\n<p>WARNING:\nThis model REQUIRES the ‘generalManual’ speciesTransportModel</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Goes only with cfdemSolverPimpleImEx and cfdemSolverPisoSTM. The force model has to be the second (!!!) model in the forces list.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a> <a class=\"reference internal\" href=\"forceModel_LaEuScalarTemp.html\"><span class=\"doc\">forceModel_LaEuScalarTemp</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_virtualMassForce.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_virtualMassForce command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_virtualMassForce command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_virtualMassForce command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-virtualmassforce-command\">\n<span id=\"index-0\"></span><h1>forceModel_virtualMassForce command<a class=\"headerlink\" href=\"#forcemodel-virtualmassforce-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">virtualMassForce</span>\n<span class=\"p\">);</span>\n<span class=\"n\">virtualMassForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">phiFieldName</span> <span class=\"s2\">&quot;phi&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">splitUrelCalculation</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">Cadd</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceDEM</span> <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch4</span><span class=\"p\">;</span>\n    <span class=\"n\">UInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span>\n    <span class=\"n\">DDtUInterpolationType</span> <span class=\"s2\">&quot;type2&quot;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>phi</em> = name of the finite volume flux field</p></li>\n<li><p><em>switch1</em> = indicator to split calculation of Urel between CFDEM and LIGGGHTS</p></li>\n<li><p><em>scalar1</em> = scalar value</p></li>\n<li><p><em>switch2</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch3</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>type1</em> = (optional, default cellPointFace) interpolation type for U field</p></li>\n<li><p><em>type2</em> = (optional, default cellPointFace) interpolation type for ddt(U) field</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">virtualMassForce</span>\n<span class=\"p\">);</span>\n<span class=\"n\">virtualMassForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The virtualMassForce model calculates the virtual mass force for each particle.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Model not validated!</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_viscForce.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_viscForce command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_viscForce command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_viscForce command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-viscforce-command\">\n<span id=\"index-0\"></span><h1>forceModel_viscForce command<a class=\"headerlink\" href=\"#forcemodel-viscforce-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">viscForce</span><span class=\"p\">;</span>\n<span class=\"p\">);</span>\n<span class=\"n\">viscForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velocityFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">useAddedMass</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">suppressProbe</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceExplicit</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">treatForceDEM</span> <span class=\"n\">switch3</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span> <span class=\"n\">switch4</span><span class=\"p\">;</span>\n    <span class=\"n\">divTauInterpolationType</span> <span class=\"s2\">&quot;type1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarViscosity</span> <span class=\"n\">switch5</span><span class=\"p\">;</span>\n    <span class=\"n\">nu</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>scalar1</em> = (optional) coefficient of added mass accounted for</p></li>\n<li><p><em>switch1</em> = (optional, default false) can be used to suppress the output of the probe model</p></li>\n<li><p><em>switch2</em> = (optional, default true) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch3</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>switch4</em> = (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>type1</em> = (optional, default cellPointFace) interpolation type for div(Tau) field</p></li>\n<li><p><em>switch5</em> =  (optional, default false) sub model switch, see <a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a> for details</p></li>\n<li><p><em>scalar2</em> = optional, only if switch5 is true</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">viscForce</span><span class=\"p\">;</span>\n<span class=\"p\">);</span>\n<span class=\"n\">viscForceProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velocityFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force model performs the calculation of forces (e.g. fluid-particle interaction forces) acting on each DEM particle. The viscForce model calculates the particle based viscous force, -(grad(tau)) * Vparticle (see Zhou et al. (2010): “Discrete particle simulation of particle-fluid flow: model formulations and their applicability”, JFM).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceModel_volWeightedAverage.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceModel_volWeightedAverage command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceModel_volWeightedAverage command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceModel_volWeightedAverage command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcemodel-volweightedaverage-command\">\n<span id=\"index-0\"></span><h1>forceModel_volWeightedAverage command<a class=\"headerlink\" href=\"#forcemodel-volweightedaverage-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">volWeightedAverage</span>\n<span class=\"p\">);</span>\n<span class=\"n\">volWeightedAverageProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startTime</span> <span class=\"n\">time</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"n\">scalarField</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"n\">vectorField</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">upperThreshold</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">lowerThreshold</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">useVolumeFraction</span> <span class=\"n\">switch0</span><span class=\"p\">;</span>\n    <span class=\"n\">volumeFractionName</span> <span class=\"n\">word1</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span> <span class=\"p\">;</span>\n    <span class=\"n\">writeToFile</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>time</em> = (optional, default 0.) time to start the averaging</p></li>\n<li><p><em>scalarField</em> = names of the finite volume scalar fields to be temporally averaged</p></li>\n<li><p><em>vectorField</em> = names of the finite volume vector fields to be temporally averaged</p></li>\n<li><p><em>scalar1</em> = only cells with a field value (magnitude) lower than this upper threshold are considered</p></li>\n<li><p><em>scalar2</em> = only cells with a field value (magnitude) greater than this lower threshold are considered</p></li>\n<li><p><em>switch0</em> = (optional, default false) consider a volume fraction for the calculation</p></li>\n<li><p><em>word1</em> = (optional, default “voidfraction”) name of the volume fraction, only used if useVolumeFraction is true</p></li>\n<li><p><em>verbose</em> = (optional, default false) keyword only (mostly used for debugging)</p></li>\n<li><p><em>switch1</em> = (optional, default false) switch for the output.</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">volWeightedAverage</span>\n<span class=\"p\">);</span>\n<span class=\"n\">volWeightedAverageProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startTime</span> <span class=\"mf\">0.1</span><span class=\"p\">;</span>\n    <span class=\"n\">scalarFieldNames</span>\n    <span class=\"p\">(</span>\n        <span class=\"n\">voidfraction</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">vectorFieldNames</span>\n    <span class=\"p\">(</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">upperThreshold</span> <span class=\"mf\">0.999</span><span class=\"p\">;</span>\n    <span class=\"n\">lowerThreshold</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>This “forceModel” does not influence the particles or the simulation - it is a postprocessing tool! Starting at start time\nthe volume weighted averages of those cells of the fields within the threshold are calculated.\nAt “writeTime” a field named volAverage_field , where scalarField is the name of the original field, is written. This can then be probed using standard function object probes.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Currently all fields have the same threshold value!</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceModel.html\"><span class=\"doc\">forceModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceSubModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceSubModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceSubModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceSubModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcesubmodel-command\">\n<span id=\"index-0\"></span><h1>forceSubModel command<a class=\"headerlink\" href=\"#forcesubmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties sub-dictionary of the force model in use. If no force sub-model is applied ImEx is used as default. If the keyword “forceSubModels” is provided, a choice of sub model is demanded.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceSubModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">model_x</span>\n    <span class=\"n\">model_y</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of force sub-model to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceSubModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">ImEx</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (forceSubModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The force sub model is designed to hold the settings a force model can have. For now it handles the treatExplicit, treatDEM and implDEM option.</p>\n<p><strong>Switches:</strong></p>\n<p>Depending on the availability within the respective force model, a number of switches can be activated:</p>\n<p>treatForceExplicit: switch for the purely explicit consideration of the force term in the equation of motion on the CFD side (off -&gt; the force is considered semi-implicitly; default off)\ntreatForceDEM: switch for the consideration of the forces on the DEM side only (off -&gt; calculate forces for DEM and CFD; default off)\nimplForceDEM: If true, the fluid velocity and drag coefficient are communicated to the DEM calculation at each coupling time step and the drag force is calculated at each DEM time step, using the current particle velocity. If false, a force term is communiated to the DEM calculation at each coupling time step, the term is constant for one coupling interval. (on -&gt; DEM forces are updated every DEM step; default off)\nimplForceDEM: If true, all fields for implicit torque handling on DEM side are communicated to DEM. (default off)\nverbose: switch for debug output to screen (on -&gt; enable debug output; default off)\ninterpolation: switch for the usage of interpolation models when getting data for the Lagrangian calculation from Eulerian fields; If false, the cell centre values are used. (default off)\nuseFilteredDragModel: switch for using a coarse-grid version of the Beetstra drag model (takes grid-size effects into account; default = off)\nuseParcelSizeDependentFilteredDrag: switch for using a coarse-grid version of the Beetstra drag model (takes parcel-size effects into account, will force the switch useFilteredDragModel to “on”; default = off)\nimplForceDEMaccumulated: Can only be used in combination with implForceDEM switch, drag force values of each DEM time step are accumulated and passed on to the CFD-calculation. (default off)\nscalarViscosity: switch for the usage of a user-defined viscosity nu for the calculation of the drag force; The CFD calculation always uses the value of the transport model. (off -&gt; use tranportProperties nu; default off)\nvoidageFunctionDiFelice: switch for the usage of the DiFelice voidage correction function during the drag force calculation. The correction is given by the relation\nXi = 3.7 - 0.65 * exp(-sqr(1.5-log10(Rep))/2),\nwhere Rep is the particle Reynolds number.\nIf switch is set to true, the voidageFunctionRong switch (or others) must be set to false if false is not the default value for the selected model.\nvoidageFunctionRong: switch for the usage of the Rong voidage correction function during the drag force calculation. The correction is given by the relation\nXi = 2.65 * (voidfraction + 1) - (5.3-3.5*voidfraction)*sqr(voidfraction)*exp(-sqr(1.5-log10(Rep))/2),\nwhere Rep is the particle Reynolds number.\nvoidageFunctionTang: switch for the usage of the Tang voidage correction function during the drag force calculation. The correction is given by the relation\nXi = 2 - log10(((1.5*sqrt(1-voidfraction)+1)*voidfraction^2 - (10*(voidfraction-1))/(voidfraction^2) + (0.0644*voidfraction^-4+0.169*voidfraction)*Rep^0.657 - (0.00456*Rep)*voidfraction^-4 + 0.11*(voidfraction-2)*(voidfraction-1)*Rep) / (0.2334*Rep^0.657 - 0.00456*Rep + 1)) / log10(voidfraction); (see: 2018,ChemEngSci, Mahajan et al., Non-spherical particles in a pseudo-2d fluidized bed: Modelling Study)\n,\nwhere Rep is the particle Reynolds number.:ul</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceSubModel_ImEx.html\"><span class=\"doc\">ImEx</span></a></p>\n<p><strong>Default:</strong> ImEx.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/forceSubModel_ImEx.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>forceSubModel_ImEx command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">forceSubModel_ImEx command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>forceSubModel_ImEx command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"forcesubmodel-imex-command\">\n<span id=\"index-0\"></span><h1>forceSubModel_ImEx command<a class=\"headerlink\" href=\"#forcesubmodel-imex-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties sub-dictionary of the force model in use.</p>\n<p>forceSubModels\n(</p>\n<blockquote>\n<div><p>ImEx;</p>\n</div></blockquote>\n<p>);</p>\n<p>treatExplicit true;  // optional for some force models.\ntreatDEM true;       // optional for some force models.\nimplDEM true;        // optional for some force models.</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>forceSubModels\n(</p>\n<blockquote>\n<div><p>ImEx;</p>\n</div></blockquote>\n<p>);\ntreatExplicit true;  // optional for some force models.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>If no force sub-model is applied ImEx is used as default. If the keyword “forceSubModels” is provided, a choice of sub model is demanded. Depending on the force model different keywords are read and can therefrore be set (see the log file). If the keyword is provided, its value is used.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"forceSubModel.html\"><span class=\"doc\">forceSubModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/fvOptions.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>fvOptions dictionary &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">fvOptions dictionary</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>fvOptions dictionary</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"fvoptions-dictionary\">\n<h1>fvOptions dictionary<a class=\"headerlink\" href=\"#fvoptions-dictionary\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>An fvOptions dictionary ca be used to impose physics that can be represented as forces or constraints on the governing equations, such as for example porous media or imposed flow velocities.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>No known restrictions.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/fvOptions_meanSupVelocityForce.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>fvOptions_meanSupVelocityForce command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">fvOptions_meanSupVelocityForce command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>fvOptions_meanSupVelocityForce command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"fvoptions-meansupvelocityforce-command\">\n<span id=\"index-0\"></span><h1>fvOptions_meanSupVelocityForce command<a class=\"headerlink\" href=\"#fvoptions-meansupvelocityforce-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in an fvOptions dictionary in the system folder of the CFD case. Can only be applied if solver is able to handle fvOptions.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">fvOptions</span> <span class=\"n\">uniformFixedValueVoidfraction</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momentumSource</span>\n<span class=\"p\">{</span>\n    <span class=\"nb\">type</span>            <span class=\"n\">meanSupVelocityForce</span><span class=\"p\">;</span>\n    <span class=\"n\">active</span>          <span class=\"n\">yes</span><span class=\"p\">;</span>\n    <span class=\"n\">meanSupVelocityForceCoeffs</span>\n    <span class=\"p\">{</span>\n        <span class=\"n\">seletionMode</span>    <span class=\"nb\">all</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"nb\">all</span> <span class=\"ow\">and</span> <span class=\"n\">cellZoneSet</span> <span class=\"ow\">is</span> <span class=\"n\">permitted</span>\n        <span class=\"n\">fieldNames</span>      <span class=\"p\">(</span><span class=\"n\">U</span><span class=\"p\">);</span> <span class=\"o\">//</span> <span class=\"n\">velocity</span> <span class=\"n\">field</span>\n        <span class=\"n\">twoPhase</span>        <span class=\"n\">true</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">refers</span> <span class=\"n\">to</span> <span class=\"n\">the</span> <span class=\"n\">number</span> <span class=\"n\">of</span> <span class=\"n\">fluid</span><span class=\"o\">/</span><span class=\"n\">liquid</span> <span class=\"n\">phases</span>\n        <span class=\"n\">alphaField</span>      <span class=\"n\">alpha</span><span class=\"o\">.</span><span class=\"n\">water</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">mandatory</span> <span class=\"k\">if</span> <span class=\"n\">twoPhase</span> <span class=\"ow\">is</span> <span class=\"nb\">set</span> <span class=\"n\">to</span> <span class=\"n\">true</span>\n        <span class=\"n\">coupled</span>         <span class=\"n\">true</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">refers</span> <span class=\"n\">to</span> <span class=\"n\">the</span> <span class=\"n\">presence</span> <span class=\"n\">of</span> <span class=\"n\">a</span> <span class=\"n\">particle</span> <span class=\"n\">phase</span>\n        <span class=\"n\">voidfractionField</span> <span class=\"n\">voidfraction</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">mandatory</span> <span class=\"k\">if</span> <span class=\"n\">coupled</span> <span class=\"ow\">is</span> <span class=\"nb\">set</span> <span class=\"n\">to</span> <span class=\"n\">true</span>\n        <span class=\"n\">Ubar</span>            <span class=\"p\">(</span><span class=\"mi\">1</span> <span class=\"mi\">0</span> <span class=\"mi\">0</span><span class=\"p\">);</span> <span class=\"o\">//</span> <span class=\"n\">desired</span> <span class=\"n\">mean</span> <span class=\"n\">superficial</span> <span class=\"n\">velocity</span>\n        <span class=\"n\">relaxation</span>      <span class=\"mf\">0.9</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">optional</span> <span class=\"n\">relaxation</span> <span class=\"n\">factor</span><span class=\"p\">;</span>\n        <span class=\"n\">alphaMin</span>        <span class=\"mf\">0.9999</span><span class=\"p\">;</span> <span class=\"o\">//</span> <span class=\"n\">settings</span> <span class=\"n\">will</span> <span class=\"n\">only</span> <span class=\"n\">take</span> <span class=\"n\">place</span> <span class=\"ow\">in</span> <span class=\"n\">cells</span> <span class=\"k\">with</span> <span class=\"n\">alpha</span> <span class=\"o\">&gt;=</span> <span class=\"n\">alphaMin</span> <span class=\"p\">(</span><span class=\"n\">smoothening</span><span class=\"p\">)</span>\n\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The fvOption meanSupVelocityForce can be used to impose an average superficial velocity within a specific area (either defined by all when the whole domain is affected or the name of the according cellZoneSet), while at the same time accounting for the resulting pressure drop. The fvOption can be used for fluid/fluid, fluid/particle and fluid/fluid/particle cases, whereas Ubar can only be imposed to one of the fluid phases. Application examples are periodic channel flow situations or pumps within the computational domain. Please note that particularly for periodic channel flows instabilities might occur at the air-water interface due to the big differences in the densities. For such cases a cutoff-vlaue alphaMin has been introduced, which allows the user to restrict the affected area by means of a minimal phase fraction.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>No known restrictions.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"fvOptions.html\"><span class=\"doc\">fvOptions</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/genindex.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>Index &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"#\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"></div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>Index</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n\n<h1 id=\"index\">Index</h1>\n\n<div class=\"genindex-jumpbox\">\n <a href=\"#A\"><strong>A</strong></a>\n | <a href=\"#C\"><strong>C</strong></a>\n | <a href=\"#D\"><strong>D</strong></a>\n | <a href=\"#F\"><strong>F</strong></a>\n | <a href=\"#I\"><strong>I</strong></a>\n | <a href=\"#L\"><strong>L</strong></a>\n | <a href=\"#M\"><strong>M</strong></a>\n | <a href=\"#P\"><strong>P</strong></a>\n | <a href=\"#S\"><strong>S</strong></a>\n | <a href=\"#V\"><strong>V</strong></a>\n \n</div>\n<h2 id=\"A\">A</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"averagingModel.html#index-0\">averagingModel</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"averagingModel_dense.html#index-0\">averagingModel\\_dense</a>\n</li>\n      <li><a href=\"averagingModel_dilute.html#index-0\">averagingModel\\_dilute</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"C\">C</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"cfdemSolverIB.html#index-0\">cfdemSolverIB</a>\n</li>\n      <li><a href=\"cfdemSolverPiso.html#index-0\">cfdemSolverPiso</a>\n</li>\n      <li><a href=\"cfdemSolverPisoScalar.html#index-0\">cfdemSolverPisoScalar</a>\n</li>\n      <li><a href=\"cfdemSolverPisoSTM.html#index-0\">cfdemSolverPisoSTM</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"clockModel.html#index-0\">clockModel</a>\n</li>\n      <li><a href=\"clockModel_noClock.html#index-0\">clockModel\\_noClock</a>\n</li>\n      <li><a href=\"clockModel_standardClock.html#index-0\">clockModel\\_standardClock</a>\n</li>\n      <li><a href=\"fix_couple_cfd.html#index-0\">couple/cfd</a>\n</li>\n      <li><a href=\"fix_couple_cfd_force.html#index-0\">couple/cfd/force</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"D\">D</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"dataExchangeModel.html#index-0\">dataExchangeModel</a>\n</li>\n      <li><a href=\"dataExchangeModel_noDataExchange.html#index-0\">dataExchangeModel\\_noDataExchange</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"dataExchangeModel_oneWayVTK.html#index-0\">dataExchangeModel\\_oneWayVTK</a>\n</li>\n      <li><a href=\"dataExchangeModel_twoWayFiles.html#index-0\">dataExchangeModel\\_twoWayFiles</a>\n</li>\n      <li><a href=\"dataExchangeModel_twoWayMPI.html#index-0\">dataExchangeModel\\_twoWayMPI</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"F\">F</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"forceModel.html#index-0\">forceModel</a>\n</li>\n      <li><a href=\"forceModel_Archimedes.html#index-0\">forceModel\\_Archimedes</a>\n</li>\n      <li><a href=\"forceModel_ArchimedesIB.html#index-0\">forceModel\\_ArchimedesIB</a>\n</li>\n      <li><a href=\"forceModel_checkCouplingInterval.html#index-0\">forceModel\\_checkCouplingInterval</a>\n</li>\n      <li><a href=\"forceModel_DiFeliceDrag.html#index-0\">forceModel\\_DiFeliceDrag</a>\n</li>\n      <li><a href=\"forceModel_fieldStore.html#index-0\">forceModel\\_fieldStore</a>\n</li>\n      <li><a href=\"forceModel_fieldTimeAverage.html#index-0\">forceModel\\_fieldTimeAverage</a>\n</li>\n      <li><a href=\"forceModel_GidaspowDrag.html#index-0\">forceModel\\_GidaspowDrag</a>\n</li>\n      <li><a href=\"forceModel_gradPForce.html#index-0\">forceModel\\_gradPForce</a>\n</li>\n      <li><a href=\"forceModel_KochHillDrag.html#index-0\">forceModel\\_KochHillDrag</a>\n</li>\n      <li><a href=\"forceModel_LaEuScalarTemp.html#index-0\">forceModel\\_LaEuScalarTemp</a>\n</li>\n      <li><a href=\"forceModel_MeiLift.html#index-0\">forceModel\\_MeiLift</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"forceModel_noDrag.html#index-0\">forceModel\\_noDrag</a>\n</li>\n      <li><a href=\"forceModel_particleCellVolume.html#index-0\">forceModel\\_particleCellVolume</a>\n</li>\n      <li><a href=\"forceModel_particleVolume.html#index-0\">forceModel\\_particleVolume</a>\n</li>\n      <li><a href=\"forceModel_periodicPressure.html#index-0\">forceModel\\_periodicPressure</a>\n</li>\n      <li><a href=\"forceModel_scalarGeneralExchange.html#index-0\">forceModel\\_scalarGeneralExchange</a>\n</li>\n      <li><a href=\"forceModel_SchillerNaumannDrag.html#index-0\">forceModel\\_SchillerNaumannDrag</a>\n</li>\n      <li><a href=\"forceModel_ShirgaonkarIB.html#index-0\">forceModel\\_ShirgaonkarIB</a>\n</li>\n      <li><a href=\"forceModel_virtualMassForce.html#index-0\">forceModel\\_virtualMassForce</a>\n</li>\n      <li><a href=\"forceModel_viscForce.html#index-0\">forceModel\\_viscForce</a>\n</li>\n      <li><a href=\"forceModel_volWeightedAverage.html#index-0\">forceModel\\_volWeightedAverage</a>\n</li>\n      <li><a href=\"forceSubModel.html#index-0\">forceSubModel</a>\n</li>\n      <li><a href=\"forceSubModel_ImEx.html#index-0\">forceSubModel\\_ImEx</a>\n</li>\n      <li><a href=\"fvOptions_meanSupVelocityForce.html#index-0\">fvOptions\\_meanSupVelocityForce</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"I\">I</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"IOModel.html#index-0\">IOModel</a>\n</li>\n      <li><a href=\"IOModel_basicIO.html#index-0\">IOModel\\_basicIO</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"IOModel_noIO.html#index-0\">IOModel\\_noIO</a>\n</li>\n      <li><a href=\"IOModel_sophIO.html#index-0\">IOModel\\_sophIO</a>\n</li>\n      <li><a href=\"IOModel_trackIO.html#index-0\">IOModel\\_trackIO</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"L\">L</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"liggghtsCommandModel.html#index-0\">liggghtsCommandModel</a>\n</li>\n      <li><a href=\"liggghtsCommandModel_execute.html#index-0\">liggghtsCommandModel\\_execute</a>\n</li>\n      <li><a href=\"liggghtsCommandModel_readLiggghtsData.html#index-0\">liggghtsCommandModel\\_readLiggghtsData</a>\n</li>\n      <li><a href=\"liggghtsCommandModel_runLiggghts.html#index-0\">liggghtsCommandModel\\_runLiggghts</a>\n</li>\n      <li><a href=\"liggghtsCommandModel_setDEMGravity.html#index-0\">liggghtsCommandModel\\_setDEMGravity</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"liggghtsCommandModel_writeLiggghts.html#index-0\">liggghtsCommandModel\\_writeLiggghts</a>\n</li>\n      <li><a href=\"locateModel.html#index-0\">locateModel</a>\n</li>\n      <li><a href=\"locateModel_engineSearch.html#index-0\">locateModel\\_engineSearch</a>\n</li>\n      <li><a href=\"locateModel_engineSearchIB.html#index-0\">locateModel\\_engineSearchIB</a>\n</li>\n      <li><a href=\"locateModel_standardSearch.html#index-0\">locateModel\\_standardSearch</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"M\">M</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"meshMotionModel.html#index-0\">meshMotionModel</a>\n</li>\n      <li><a href=\"meshMotionModel_noMeshMotion.html#index-0\">meshMotionModel\\_noMeshMotion</a>\n</li>\n      <li><a href=\"momCoupleModel.html#index-0\">momCoupleModel</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"momCoupleModel_explicitCouple.html#index-0\">momCoupleModel\\_explicitCouple</a>\n</li>\n      <li><a href=\"momCoupleModel_implicitCouple.html#index-0\">momCoupleModel\\_implicitCouple</a>\n</li>\n      <li><a href=\"momCoupleModel_noCouple.html#index-0\">momCoupleModel\\_noCouple</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"P\">P</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"probeModel.html#index-0\">probeModel</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"probeModel_noProbe.html#index-0\">probeModel\\_noProbe</a>\n</li>\n      <li><a href=\"probeModel_particleProbe.html#index-0\">probeModel\\_particleProbe</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"S\">S</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"scalarTransportModel.html#index-0\">scalarTransportModel</a>\n</li>\n      <li><a href=\"scalarTransportModel_generalManual.html#index-0\">scalarTransportModel\\_generalManual</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"smoothingModel.html#index-0\">smoothingModel</a>\n</li>\n      <li><a href=\"smoothingModel_constDiffSmoothing.html#index-0\">smoothingModel\\_constDiffSmoothing</a>\n</li>\n      <li><a href=\"smoothingModel_noSmoothing.html#index-0\">smoothingModel\\_noSmoothing</a>\n</li>\n  </ul></td>\n</tr></table>\n\n<h2 id=\"V\">V</h2>\n<table style=\"width: 100%\" class=\"indextable genindextable\"><tr>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"voidFractionModel.html#index-0\">voidfractionModel</a>\n</li>\n      <li><a href=\"voidFractionModel_bigParticleVoidFraction.html#index-0\">voidfractionModel\\_bigParticleVoidFraction</a>\n</li>\n      <li><a href=\"voidFractionModel_centreVoidFraction.html#index-0\">voidfractionModel\\_centreVoidFraction</a>\n</li>\n      <li><a href=\"voidFractionModel_dividedVoidFraction.html#index-0\">voidfractionModel\\_dividedVoidFraction</a>\n</li>\n  </ul></td>\n  <td style=\"width: 33%; vertical-align: top;\"><ul>\n      <li><a href=\"voidFractionModel_GaussVoidFraction.html#index-0\">voidfractionModel\\_GaussVoidFraction</a>\n</li>\n      <li><a href=\"voidFractionModel_IBVoidFraction.html#index-0\">voidfractionModel\\_IBVoidFraction</a>\n</li>\n      <li><a href=\"voidFractionModel_noVoidFraction.html#index-0\">voidfractionModel\\_noVoidFractionVoidFraction</a>\n</li>\n      <li><a href=\"voidFractionModel_trilinearVoidFraction.html#index-0\">voidfractionModel\\_trilinearVoidFraction</a>\n</li>\n  </ul></td>\n</tr></table>\n\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel command<a class=\"headerlink\" href=\"#liggghtscommandmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">model_x</span>\n    <span class=\"n\">model_y</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the liggghtsCommandModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">runLiggghts</span>\n   <span class=\"n\">writeLiggghts</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (liggghtsCommandModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The liggghtsCommandModel is the base class to execute DEM commands within a CFDEM® run.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Works only with MPI coupling.</p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel_execute.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel_execute command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel_execute command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a><ul>\n<li><a class=\"reference internal\" href=\"#these-rather-complex-execute-commands-can-be-replaced-by-the-readliggghts-and-writeliggghts-commands\">These rather complex execute commands can be replaced by the “readLiggghts” and “writeLiggghts” commands!</a></li>\n</ul>\n</li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel_execute command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-execute-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel_execute command<a class=\"headerlink\" href=\"#liggghtscommandmodel-execute-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>liggghtsCommandModels\n(\n   execute\n);\nexecuteProps0\n{\n    command\n    (\n        run\n        $couplingInterval\n    );\n    runFirst switch1;\n    runLast switch2;\n    runEveryCouplingStep switch3;\n    runEveryWriteStep switch4;\n    verbose;\n}\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>command</em> = LIGGGHTS command to be executed. Each word in a new line, numbers and symbols need special treatment (e.g. $couplingInterval will be replaced by correct coupling interval in the simulation). For using arbitrary labels and number use the placeholders label and number in the command and define them in a labels and scalars section below the command (see example below). For using pathes within commands, particular keywords are provided (details see description)</p></li>\n<li><p><em>switch1</em> = switch (choose on/off) if the command is executed only at first time step</p></li>\n<li><p><em>switch2</em> = switch (choose on/off) if the command is executed only at last time step</p></li>\n<li><p><em>switch3</em> = switch (choose on/off) if the command is executed at every coupling step</p></li>\n<li><p><em>switch4</em> = switch (choose on/off) if the command is executed at every writing step</p></li>\n<li><p><em>verbose</em> = (normally off) for verbose run</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span>liggghtsCommandModels\n(\n   execute\n   execute\n   execute\n);\nexecuteProps0\n{\n    command\n    (\n        run\n        $couplingInterval\n    );\n    runFirst off;\n    runLast off;\n    runEveryCouplingStep on;\n}\nexecuteProps1\n{\n    command\n    (\n        write_restart\n        noBlanks\n        dotdot\n        slash\n        DEM\n        slash\n        liggghts.restart_\n        timeStamp\n    );\n    runFirst off;\n    runLast off;\n    runEveryCouplingStep off;\n    runEveryWriteStep on;\n}\nexecuteProps3\n{\n    command\n    (\n        create_atoms\n        label\n        single\n        number\n        number\n        number\n        units\n        box\n    );\n    labels\n    (\n        1\n    );\n    scalars\n    (\n        0.\n        0.\n        0.001\n    );\n    runFirst off;\n    runLast off;\n    runEveryCouplingStep off;\n    runEveryWriteStep off;\n    startTime 0.09;\n    endTime 0.09;\n    timeInterval 0.001;\n}\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The execute liggghtsCommand Model can be used to execute a LIGGGHTS command during a CFD run. In above example execute_0 for instance executes “run $couplingInterval” every coupling step. $couplingInterval is automatically replaced by the correct number of DEM steps. Additionally execute_1 executes “write_restart ../DEM/liggghts.restart_$timeStamp” every writing step, where $timeStamp is automatically set. The keywords used in the command (dot, dotdot, slash) are replaced by the according signs internally, noBlanks inidicates the the following words are not separated by blanks. Using the keyword blanks would re-enable the usage of blanks again.</p>\n<section id=\"these-rather-complex-execute-commands-can-be-replaced-by-the-readliggghts-and-writeliggghts-commands\">\n<h3>These rather complex execute commands can be replaced by the “readLiggghts” and “writeLiggghts” commands!<a class=\"headerlink\" href=\"#these-rather-complex-execute-commands-can-be-replaced-by-the-readliggghts-and-writeliggghts-commands\" title=\"Permalink to this headline\"></a></h3>\n</section>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel_readLiggghtsData.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel_readLiggghtsData command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel_readLiggghtsData command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel_readLiggghtsData command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-readliggghtsdata-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel_readLiggghtsData command<a class=\"headerlink\" href=\"#liggghtscommandmodel-readliggghtsdata-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">readLiggghtsData</span>\n<span class=\"p\">);</span>\n<span class=\"n\">readLiggghtsDataProps0</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startIndex</span> <span class=\"s2\">&quot;scalar1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span> <span class=\"p\">;</span>\n    <span class=\"n\">exactTiming</span> <span class=\"p\">;</span>\n    <span class=\"n\">filePath</span>\n    <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;word&quot;</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">runFirst</span> <span class=\"s2\">&quot;bool1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">runEveryCouplingStep</span> <span class=\"s2\">&quot;bool2&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"s2\">&quot;scalar2&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">endTime</span> <span class=\"s2\">&quot;scalar3&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span> <span class=\"s2\">&quot;scalar4&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>scalar1</em> = start index of data file to be read</p></li>\n<li><p><em>verbose</em> = (default off) flag for verbose run</p></li>\n<li><p><em>exactTiming</em> = flag indicating that start time should be kept even during a coupling interval</p></li>\n<li><p><em>filePath</em> = path to LIGGGHTS data file. Each word in a new line, numbers and symbols need special treatment (e.g. $couplingInterval will be replaced by correct coupling interval in the simulation)</p></li>\n<li><p><em>bool1</em> = true if to be run at first timestep only (prio 1)</p></li>\n<li><p><em>bool2</em> = true if to be run at every coupling step (prio 2)</p></li>\n<li><p><em>scalar2</em> = if bool2 and bool3 false then starts at scalar2 (prio 3) run</p></li>\n<li><p><em>scalar3</em> = if bool2 and bool3 false then it ends at scalar3 (prio 3) run</p></li>\n<li><p><em>scalar4</em> = if bool2 and bool3 false then it repeats at scalar3 increasing the data file index (prio 3) run</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">readLiggghtsData</span>\n<span class=\"p\">);</span>\n<span class=\"n\">readLiggghtsDataProps0</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">startIndex</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n    <span class=\"n\">exactTiming</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n    <span class=\"n\">filePath</span>\n    <span class=\"p\">(</span>\n        <span class=\"n\">dotdot</span>\n        <span class=\"n\">slash</span>\n        <span class=\"n\">DEM</span>\n        <span class=\"n\">slash</span>\n        <span class=\"n\">packing</span><span class=\"o\">.</span><span class=\"n\">data</span>\n    <span class=\"p\">);</span>\n    <span class=\"n\">runFirst</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n    <span class=\"n\">runEveryCouplingStep</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"mf\">0.002</span><span class=\"p\">;</span>\n    <span class=\"n\">endTime</span> <span class=\"mf\">0.012</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span> <span class=\"mf\">0.001</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The readLiggghtsData liggghtsCommand Model can be used to read liggghts data files into liggghts during runtime of a coupled simulation.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Note: Model is not up to date.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel_runLiggghts.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel_runLiggghts command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel_runLiggghts command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel_runLiggghts command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-runliggghts-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel_runLiggghts command<a class=\"headerlink\" href=\"#liggghtscommandmodel-runliggghts-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">runLiggghts</span>\n<span class=\"p\">);</span>\n<span class=\"o\">//-</span> <span class=\"n\">optional</span>\n<span class=\"n\">runLiggghtsProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">preNo</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span> <span class=\"p\">(</span><span class=\"n\">optional</span><span class=\"p\">)</span>\n    <span class=\"n\">runFirst</span> <span class=\"n\">true</span><span class=\"p\">;</span> <span class=\"p\">(</span><span class=\"n\">optional</span><span class=\"p\">,</span> <span class=\"n\">default</span> <span class=\"n\">false</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">runLiggghts</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The liggghtsCommand models can be used to execute a LIGGGHTS command during a CFD run. The “runLiggghts” command executes the command “run $nrDEMsteps”, where $nrDEMsteps is automatically set according to the coupling intervals, every coupling step. Optionally a dictionary called runLiggghtsProps can be specified where the “preNo” switch can be set, which uses the command “run $nrDEMsteps pre no” for every time step except the first. If the runFirst option is chosen the run command is executed only at the first coupling step.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>Warning: the “pre no” option can cause troubles (dump data of particles changing the domain might be erroneous)!</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel_setDEMGravity.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel_setDEMGravity command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel_setDEMGravity command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel_setDEMGravity command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-setdemgravity-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel_setDEMGravity command<a class=\"headerlink\" href=\"#liggghtscommandmodel-setdemgravity-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<p>liggghtsCommandModels\n(</p>\n<blockquote>\n<div><p>setDEMGravity</p>\n</div></blockquote>\n<p>);</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">setDEMGravityProps0</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">runFirst</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"n\">scalar1</span><span class=\"p\">;</span>\n    <span class=\"n\">endTime</span> <span class=\"n\">scalar2</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span> <span class=\"n\">scalar3</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>\n    <span class=\"n\">unfix</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = switch (must be on!!!) to select if executed only first step.</p></li>\n<li><p><em>scalar1</em> = start time of command (use simulation start time)</p></li>\n<li><p><em>scalar2</em> = end time of command (use simulation start time)</p></li>\n<li><p><em>scalar3</em> = time interval of command (use 1.)\n<em>verbose</em> = (normally off) for verbose run</p></li>\n<li><p><em>switch2</em> = (false by default) switch to select if the command is used as fix (default) or unfix</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">runLiggghts</span>\n   <span class=\"n\">setDEMGravity</span>\n<span class=\"p\">);</span>\n<span class=\"n\">setDEMGravityProps1</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">runFirst</span> <span class=\"n\">on</span><span class=\"p\">;</span>\n    <span class=\"n\">startTime</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n    <span class=\"n\">endTime</span> <span class=\"mi\">0</span><span class=\"p\">;</span>\n    <span class=\"n\">timeInterval</span> <span class=\"mi\">1</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>\n    <span class=\"n\">unfix</span> <span class=\"n\">false</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The liggghtsCommand models can be used to set LIGGGHTS gravity during a CFD run.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/liggghtsCommandModel_writeLiggghts.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>liggghtsCommandModel_writeLiggghts command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">liggghtsCommandModel_writeLiggghts command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>liggghtsCommandModel_writeLiggghts command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"liggghtscommandmodel-writeliggghts-command\">\n<span id=\"index-0\"></span><h1>liggghtsCommandModel_writeLiggghts command<a class=\"headerlink\" href=\"#liggghtscommandmodel-writeliggghts-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in liggghtsCommmands dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">writeLiggghts</span>\n<span class=\"p\">);</span>\n<span class=\"o\">//-</span> <span class=\"n\">optional</span>\n<span class=\"n\">writeLiggghtsProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">writeLastOnly</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">path</span> <span class=\"s2\">&quot;path&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">writeName</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">overwrite</span> <span class=\"n\">switch2</span><span class=\"p\">;</span>\n    <span class=\"n\">writeEvery</span> <span class=\"s2\">&quot;label1&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional, default off) switch to select if only(!) last step is stored or every write step.</p></li>\n<li><p><em>path</em> = (optional, default “../DEM”) alternative write path relative to execution directory for saving the restart file. Path must exist!</p></li>\n<li><p><em>name</em> = (optional, default “liggghts.restartCFDEM”) name of the restart file to be written in path. Note: You can define a path and filename, where the path will be created if it does not exist.</p></li>\n<li><p><em>switch2</em> = (optional, default off) switch to select if only one restart file $name or many files $name_$timeStamp are written</p></li>\n<li><p><em>label1</em> = (optional, default 1) restart file is written every label1 number of write intervals\n<em>verbose</em> = (optional, default off) flag for verbose output</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">liggghtsCommandModels</span>\n<span class=\"p\">(</span>\n   <span class=\"n\">runLiggghts</span>\n   <span class=\"n\">writeLiggghts</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The liggghtsCommand models can be used to execute a LIGGGHTS command during a CFD write. The “writeLiggghts” command executes the command “write_restart $name”, where $name is the name of the restart file, every write step or every X time steps if the writeEvery keyword is used.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"liggghtsCommandModel.html\"><span class=\"doc\">liggghtsCommandModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/locateModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>locateModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">locateModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>locateModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"locatemodel-command\">\n<span id=\"index-0\"></span><h1>locateModel command<a class=\"headerlink\" href=\"#locatemodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the locateModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">engine</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (locateModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The locateModel is the base class for models which search for the CFD cell and cellID corresponding to a position. In general it is used to find the cell a particle is located in.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/locateModel_engineSearch.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>locateModel_engineSearch command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">locateModel_engineSearch command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>locateModel_engineSearch command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"locatemodel-enginesearch-command\">\n<span id=\"index-0\"></span><h1>locateModel_engineSearch command<a class=\"headerlink\" href=\"#locatemodel-enginesearch-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">engine</span><span class=\"p\">;</span>\n<span class=\"n\">engineProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">treeSearch</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = (optional, default true) switch to use tree search algorithm</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">engine</span><span class=\"p\">;</span>\n<span class=\"n\">engineProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">treeSearch</span> <span class=\"n\">true</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The locateModel “engine” locates the CFD cell and cellID corresponding to a given position.\nA geometric search using the last known cellID is implemented.\nThe engineSearch locate model can be used with different settings to use different fallback algorithms,\nif there is no previously found cellID:</p>\n<p>The model will use the walk algorithmus using the provided seed cell, if this is not successful, it will if:</p>\n<ul class=\"simple\">\n<li><p>treeSearch false;     fall back to geometric (linear) search</p></li>\n<li><p>treeSearch true;      fall back to a recursive tree search to find the cell (recommended).</p></li>\n</ul>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"locateModel.html\"><span class=\"doc\">locateModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/locateModel_engineSearchIB.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>locateModel_engineSearchIB command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">locateModel_engineSearchIB command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>locateModel_engineSearchIB command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"locatemodel-enginesearchib-command\">\n<span id=\"index-0\"></span><h1>locateModel_engineSearchIB command<a class=\"headerlink\" href=\"#locatemodel-enginesearchib-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">engineIB</span><span class=\"p\">;</span>\n<span class=\"n\">engineIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">treeSearch</span> <span class=\"n\">switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">zSplit</span> <span class=\"n\">value1</span><span class=\"p\">;</span>\n    <span class=\"n\">xySplit</span> <span class=\"n\">value2</span><span class=\"p\">;</span>\n    <span class=\"n\">checkPeriodicCells</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>switch1</em> = names of the finite volume scalar fields to be temporally averaged</p></li>\n<li><p><em>value1</em> = number of z-normal layers for satellite points (optional, default 8)</p></li>\n<li><p><em>value2</em> = number of satellite points in each layer (optional, default 16)</p></li>\n<li><p><em>checkPeriodicCells</em> = (optional, default false) flag for considering the minimal distance to all periodic images of this particle</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">engineIB</span><span class=\"p\">;</span>\n<span class=\"n\">engineIBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">treeSearch</span> <span class=\"n\">false</span><span class=\"p\">;</span>\n    <span class=\"n\">zSplit</span> <span class=\"mi\">8</span><span class=\"p\">;</span>\n    <span class=\"n\">xySplit</span> <span class=\"mi\">16</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The locateModel “engine” locates the CFD cell and cellID corresponding to a given position. This locate model is especially designed for parallel immersed boundary method. Each particle is represented by “satellite points” if it is distributed over several processors.</p>\n<p>The engineSearchIB locate Model can be used with different settings to use different algorithms:</p>\n<ul class=\"simple\">\n<li><p>treeSearch false;     will execute some geometric (linear) search using the last known cellID (recommended)</p></li>\n<li><p>treeSearch true;      will use a recursive tree structure to find the cell.</p></li>\n</ul>\n<p>This model is a modification of the engine search model. Instead of using the centre-cell as starting point for the engine search, further satellite points located on the surface of the sphere are checked. This ensures that (parts of) spheres can be located even when their centre is on another processor. This is especially important for parallel computations, when a sphere is about to move from one processor to another.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for immersed boundary solvers!</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"locateModel.html\"><span class=\"doc\">locateModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/locateModel_standardSearch.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>locateModel_standardSearch command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">locateModel_standardSearch command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>locateModel_standardSearch command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"locatemodel-standardsearch-command\">\n<span id=\"index-0\"></span><h1>locateModel_standardSearch command<a class=\"headerlink\" href=\"#locatemodel-standardsearch-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">standard</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">locateModel</span> <span class=\"n\">standard</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The locateModel “standard” locates the CFD cell and cellID corresponding to a given position. A very straight-forward (robust!) locate algorithm is used.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"locateModel.html\"><span class=\"doc\">locateModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/meshMotionModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>meshMotionModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">meshMotionModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>meshMotionModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"meshmotionmodel-command\">\n<span id=\"index-0\"></span><h1>meshMotionModel command<a class=\"headerlink\" href=\"#meshmotionmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">meshMotionModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the meshMotionModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">meshMotionModel</span> <span class=\"n\">noMeshMotion</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (meshMotionModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The meshMotionModel is the base class for models which manipulate the CFD mesh according to the DEM mesh motion.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/meshMotionModel_noMeshMotion.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>meshMotionModel_noMeshMotion command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">meshMotionModel_noMeshMotion command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>meshMotionModel_noMeshMotion command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"meshmotionmodel-nomeshmotion-command\">\n<span id=\"index-0\"></span><h1>meshMotionModel_noMeshMotion command<a class=\"headerlink\" href=\"#meshmotionmodel-nomeshmotion-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">meshMotionModel</span> <span class=\"n\">noMeshMotion</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">meshMotionModel</span> <span class=\"n\">noMeshMotion</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The noMeshMotion-model is a dummy meshMotion model.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>None.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"meshMotionModel.html\"><span class=\"doc\">meshMotionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/momCoupleModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>momCoupleModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">momCoupleModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>momCoupleModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"momcouplemodel-command\">\n<span id=\"index-0\"></span><h1>momCoupleModel command<a class=\"headerlink\" href=\"#momcouplemodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">model</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the momCoupleModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">implicitCouple</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (momCoupleModel_XY) in this documentation.</p>\n</div>\n<p>Forces can be coupled in an implicit way to the fluid solver (i.e., when solving the Navier-Stokes equations, the fluid velocity at the new time will be considered for the coupling force). This implicit coupling is typically done for the drag forces (look for “impForces()” in the implementation of the drag model). Implicit coupling is more stable (especially important for dense flows), but conflicts Newton’s third law. Explicit forces are imposed on the flow solver in an explicit fashion (look for “expForces()” in the implementation of the drag model), which is less stable, but does not conflict Newton’s third law.</p>\n<p>Note that the switch “treatVoidCellsAsExplicitForce true;” can be set in the couplingProperties in order to change the treatment of cells which are void of particles. This is only relevant if (i) smoothing is used, and (ii) implicit force coupling is performed. By default, the particle veloctiy field (Us) will be smoothed to obtain a meaningful reference quantity for the implicit force coupling. In case “treatVoidCellsAsExplicitForce true;” is set, however, Us will not be smoothed and implicit forces (after the smoothing has been performed) in cells void of particles be treated as explicit ones. This avoids the problem of defining Us in cells that are void of particles, but for which an implicit coupling force is obtained in the smoothing process.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The momCoupleModel is the base class for momentum exchange between DEM and CFD simulation.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/momCoupleModel_explicitCouple.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>momCoupleModel_explicitCouple command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">momCoupleModel_explicitCouple command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>momCoupleModel_explicitCouple command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"momcouplemodel-explicitcouple-command\">\n<span id=\"index-0\"></span><h1>momCoupleModel_explicitCouple command<a class=\"headerlink\" href=\"#momcouplemodel-explicitcouple-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">explicitCouple</span>\n<span class=\"p\">);</span>\n<span class=\"n\">explicitCoupleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">fLimit</span> <span class=\"n\">vector</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>vector</em> = limiter vector for explicit force term (default (1e10,1e10,1e10) )</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">explicitCouple</span>\n<span class=\"p\">);</span>\n<span class=\"n\">explicitCoupleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">fLimit</span> <span class=\"p\">(</span><span class=\"mf\">1e3</span> <span class=\"mf\">1e2</span> <span class=\"mf\">1e4</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The explicitCouple-model is a momCoupleModel model providing an explicit momentum source term for the CFD solver and additionally it superposes an additional source field which can be set via the function setSourceField.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for solvers that include explicit momentum exchange.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"momCoupleModel.html\"><span class=\"doc\">momCoupleModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/momCoupleModel_implicitCouple.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>momCoupleModel_implicitCouple command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">momCoupleModel_implicitCouple command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>momCoupleModel_implicitCouple command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"momcouplemodel-implicitcouple-command\">\n<span id=\"index-0\"></span><h1>momCoupleModel_implicitCouple command<a class=\"headerlink\" href=\"#momcouplemodel-implicitcouple-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">implicitCouple</span>\n<span class=\"p\">);</span>\n<span class=\"n\">implicitCoupleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">minAlphaP</span> <span class=\"n\">number</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>U</em> = (optional, default “U”) name of the finite volume fluid velocity field</p></li>\n<li><p><em>Us</em> = (optional, default “Us”) name of the finite volume granular velocity field</p></li>\n<li><p><em>voidfraction</em> = (optional, default “voidfraction”) name of the finite volume voidfraction field</p></li>\n</ul>\n<p><em>number</em> = minimum value for local particle volume fraction to calculate the exchange filed (default SMALL):l</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">implicitCouple</span>\n<span class=\"p\">);</span>\n<span class=\"n\">implicitCoupleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">velFieldName</span> <span class=\"s2\">&quot;U&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">granVelFieldName</span> <span class=\"s2\">&quot;Us&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">voidfractionFieldName</span> <span class=\"s2\">&quot;voidfraction&quot;</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The implicitCouple-model is a momCoupleModel model providing an implicit momentum source term for the CFD solver.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for solvers that include implicit momentum exchange.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"momCoupleModel.html\"><span class=\"doc\">momCoupleModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/momCoupleModel_noCouple.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>momCoupleModel_noCouple command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">momCoupleModel_noCouple command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>momCoupleModel_noCouple command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"momcouplemodel-nocouple-command\">\n<span id=\"index-0\"></span><h1>momCoupleModel_noCouple command<a class=\"headerlink\" href=\"#momcouplemodel-nocouple-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">off</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">momCoupleModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">off</span>\n<span class=\"p\">);</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The noCouple-model is a dummy momCoupleModel model providing a no momentum source term for the CFD solver.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>Only for solvers that include no momentum exchange, e.g. immersed boundary.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"momCoupleModel.html\"><span class=\"doc\">momCoupleModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/probeModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>probeModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">probeModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>probeModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"probemodel-command\">\n<span id=\"index-0\"></span><h1>probeModel command<a class=\"headerlink\" href=\"#probemodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>To be activated via couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">probeModel</span> <span class=\"n\">myProbeModel</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<p>Use probe model “off” to disable this feature.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">myProbeModelProps</span>\n<span class=\"p\">{</span>\n<span class=\"n\">probeModelSetting</span> <span class=\"n\">mySetting</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>See <a class=\"reference internal\" href=\"probeModel_particleProbe.html\"><span class=\"doc\">particleProbe</span></a></p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please check below for the list of force models that can perform particle probing.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The probeModel feature allows to implement various probing features in CFDEM®. Currently, only the <a class=\"reference internal\" href=\"probeModel_particleProbe.html\"><span class=\"doc\">particleProbe</span></a> model is implemented, that performs probing of particle forces.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/probeModel_noProbe.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>probeModel_noProbe command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">probeModel_noProbe command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>probeModel_noProbe command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"probemodel-noprobe-command\">\n<span id=\"index-0\"></span><h1>probeModel_noProbe command<a class=\"headerlink\" href=\"#probemodel-noprobe-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>To be activated via couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">forceModels</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">myForceModel1</span>\n    <span class=\"n\">myForceModel2</span>\n    <span class=\"n\">myForceModel3</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<p>probeModel off;</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">probeModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<p>Note: This examples list might not be complete - please check below for the list of force models that can perform particle probing.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>Does not perform any probing.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>None.</p>\n<p><strong>Related commands which are currently enabled for particle probing:</strong></p>\n<p><a class=\"reference internal\" href=\"probeModel_particleProbe.html\"><span class=\"doc\">particleProbe</span></a></p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/probeModel_particleProbe.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>probeModel_particleProbe command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">probeModel_particleProbe command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>probeModel_particleProbe command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"probemodel-particleprobe-command\">\n<span id=\"index-0\"></span><h1>probeModel_particleProbe command<a class=\"headerlink\" href=\"#probemodel-particleprobe-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>To be activated via couplingProperties dictionary.</p>\n<p>forceModels\n(</p>\n<blockquote>\n<div><p>myForceModel1\nmyForceModel2\nmyForceModel3</p>\n</div></blockquote>\n<p>);</p>\n<p>probeModel particleProbe;</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">particleProbeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">particleIDsToSample</span> <span class=\"p\">(</span><span class=\"n\">ID1</span> <span class=\"n\">ID2</span> <span class=\"n\">ID3</span> <span class=\"o\">...</span><span class=\"p\">);</span>  <span class=\"o\">//</span><span class=\"nb\">list</span> <span class=\"n\">of</span> <span class=\"n\">particleIDs</span> <span class=\"n\">to</span> <span class=\"n\">sample</span>\n    <span class=\"n\">verboseToFile</span><span class=\"p\">;</span>                          <span class=\"o\">//</span><span class=\"n\">main</span> <span class=\"n\">switch</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>                                <span class=\"o\">//</span><span class=\"n\">currently</span> <span class=\"ow\">not</span> <span class=\"n\">used</span>\n    <span class=\"n\">printEvery</span>       <span class=\"n\">xEvery</span><span class=\"p\">;</span>                <span class=\"o\">//</span><span class=\"nb\">print</span> <span class=\"n\">every</span> <span class=\"n\">this</span> <span class=\"n\">many</span> <span class=\"n\">CFD</span> <span class=\"n\">time</span> <span class=\"n\">steps</span>\n    <span class=\"n\">printOnlyAtStep</span>  <span class=\"n\">xStep</span><span class=\"p\">;</span>                 <span class=\"o\">//</span><span class=\"nb\">print</span> <span class=\"n\">only</span> <span class=\"n\">at</span> <span class=\"n\">this</span> <span class=\"n\">CFD</span> <span class=\"n\">time</span> <span class=\"n\">step</span> <span class=\"p\">(</span><span class=\"n\">overrides</span> <span class=\"s2\">&quot;printEvery&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">sampleAll</span><span class=\"p\">;</span>                              <span class=\"o\">//</span><span class=\"n\">Activate</span> <span class=\"n\">sampling</span> <span class=\"k\">for</span> <span class=\"nb\">all</span> <span class=\"n\">particles</span>\n    <span class=\"n\">probeDebug</span><span class=\"p\">;</span>                             <span class=\"o\">//</span><span class=\"n\">probes</span> <span class=\"n\">additional</span> <span class=\"n\">fields</span>\n    <span class=\"n\">includePosition</span><span class=\"p\">;</span>                        <span class=\"o\">//</span><span class=\"n\">will</span> <span class=\"n\">include</span> <span class=\"n\">particle</span> <span class=\"n\">position</span> <span class=\"ow\">in</span> <span class=\"n\">the</span> <span class=\"n\">output</span> <span class=\"n\">file</span>\n    <span class=\"n\">writePrecision</span> <span class=\"n\">xPrecision</span><span class=\"p\">;</span>              <span class=\"o\">//</span><span class=\"n\">number</span> <span class=\"n\">of</span> <span class=\"n\">significant</span> <span class=\"n\">digits</span> <span class=\"n\">to</span> <span class=\"nb\">print</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>particleIDsToSample</em> = list of particle IDs to be sampled.</p></li>\n<li><p><em>myForceModeli</em> = list of force models in the simulation, the particleProbe will be applied to all of these models!</p></li>\n<li><p><em>verboseToFile</em> = main switch to activate the particle probe (default = off).</p></li>\n<li><p><em>verbose</em> = main switch to activate output to Info (currently not implemented).</p></li>\n<li><p><em>xEvery</em> = integer to specify the interval for sampling (default = 1, i.e., probing occurs every CFD time step).</p></li>\n<li><p><em>xStep</em>  = integer to specify the step for sampling (default = deactivated, i.e., it will print accordingly to “printEvery”).</p></li>\n<li><p><em>sampleAll</em> = switch to activate sampling of all particles. Otherwise (default) only particles specified via “particleIDsToSample” in the couplingProperties dictionary will be sampled.</p></li>\n<li><p><em>probeDebug</em> = switch to activate probing of debug properties of secondary importance (specific for each force model).</p></li>\n<li><p><em>includePosition</em> = switch to add the particle position in the log file (default = off).</p></li>\n<li><p><em>xPrecision</em>= number of significant digits of the text output (default = 3).</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">particleIDsToSample</span> <span class=\"p\">(</span><span class=\"mi\">0</span> <span class=\"mi\">1</span> <span class=\"mi\">2</span> <span class=\"mi\">3</span><span class=\"p\">);</span>\n<span class=\"n\">forceModels</span>\n<span class=\"p\">(</span>\n    <span class=\"n\">gradPForce</span>\n<span class=\"p\">);</span>\n<span class=\"n\">particleProbeProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">verboseToFile</span><span class=\"p\">;</span>       <span class=\"o\">//</span><span class=\"n\">main</span> <span class=\"n\">switch</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>                <span class=\"o\">//</span><span class=\"n\">currently</span> <span class=\"ow\">not</span> <span class=\"n\">used</span>\n    <span class=\"n\">printEvery</span>  <span class=\"mi\">100</span><span class=\"p\">;</span>      <span class=\"o\">//</span><span class=\"nb\">print</span> <span class=\"n\">every</span> <span class=\"n\">this</span> <span class=\"n\">many</span> <span class=\"n\">CFD</span> <span class=\"n\">time</span> <span class=\"n\">steps</span>\n    <span class=\"n\">sampleAll</span><span class=\"p\">;</span>            <span class=\"o\">//</span><span class=\"n\">Activate</span> <span class=\"n\">sampling</span> <span class=\"k\">for</span> <span class=\"nb\">all</span> <span class=\"n\">particles</span>\n    <span class=\"n\">probeDebug</span><span class=\"p\">;</span>  <span class=\"o\">//</span><span class=\"n\">probes</span> <span class=\"n\">additional</span> <span class=\"n\">fields</span>\n    <span class=\"n\">includePosition</span><span class=\"p\">;</span>  <span class=\"o\">//</span><span class=\"n\">will</span> <span class=\"n\">include</span> <span class=\"n\">particle</span> <span class=\"n\">position</span> <span class=\"ow\">in</span> <span class=\"n\">the</span> <span class=\"n\">output</span> <span class=\"n\">file</span>\n    <span class=\"n\">writePrecision</span> <span class=\"mi\">4</span><span class=\"p\">;</span>           <span class=\"o\">//</span><span class=\"n\">number</span> <span class=\"n\">of</span> <span class=\"n\">significant</span> <span class=\"n\">digits</span> <span class=\"n\">to</span> <span class=\"nb\">print</span>\n<span class=\"p\">};</span>\n</pre></div>\n</div>\n<p>Note: This examples list might not be complete - please check below for the list of force models that can perform particle probing.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The particleProbe feature keeps track of per-particle quantities (e.g., the fluid-particle interaction forces) acting on each DEM particle, and handles its storage during the simulation. Data is saved in the CFD/particleProbes/startTime directory, where startTime is the time at which the simulation is started (this avoids unwanted deletion of particleProbe data).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>You can manually switch off the probe model for each force model by specifying the Switch “suppressProbe” in the corresponding force properties dictionary.</p>\n<p><strong>Related commands which are currently enabled for particle probing:</strong></p>\n<p><a class=\"reference internal\" href=\"forceModel_gradPForce.html\"><span class=\"doc\">gradPForce</span></a>, <a class=\"reference internal\" href=\"forceModel_viscForce.html\"><span class=\"doc\">viscForce</span></a>, <span class=\"xref std std-doc\">BeetstraDrag</span>, <span class=\"xref std std-doc\">HollowayDrag</span>, <a class=\"reference internal\" href=\"forceModel_MeiLift.html\"><span class=\"doc\">MeiLift</span></a>, as well as most other forceModels (see src directory for details, i.e., use “grep -r ‘probeM(’ ./” in the terminal).</p>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/scalarTransportModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>scalarTransportModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">scalarTransportModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>scalarTransportModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"scalartransportmodel-command\">\n<span id=\"index-0\"></span><h1>scalarTransportModel command<a class=\"headerlink\" href=\"#scalartransportmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in scalarTransportProperties dictionary. A variety of derived classes exist that implement different physics of the scalarTransportModel. If no scalar transport shall be used, use the model ‘none’.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">scalarTransportModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the scalarTransportModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">scalarTransportModel</span> <span class=\"n\">generalManual</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<p>Note: This examples list might not be complete - please look for other models (scalarTransportModel_XY) in this documentation.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>Solves the advection-dispersion transport equation for a dilute scalar quantity in the fluid phase. fvOptions can be specified to model sources, etc. in the fluid phase. Exchange models with a particle phase can be included by including appropriate forceModels in couplingProperties.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/scalarTransportModel_generalManual.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>scalarTransportModel_generalManual command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">scalarTransportModel_generalManual command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>scalarTransportModel_generalManual command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"scalartransportmodel-generalmanual-command\">\n<span id=\"index-0\"></span><h1>scalarTransportModel_generalManual command<a class=\"headerlink\" href=\"#scalartransportmodel-generalmanual-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in scalarTransportProperties dictionary.</p>\n<p>scalarTransportModel generalManual;</p>\n<pre class=\"literal-block\">generalManualProps\n{\n    phiFieldName <em>phiName</em>;\n    voidfractionFieldName <em>voidfractionName</em>;\n    ScT <em>scalar1</em>;\n    PrT <em>scalar2</em>;\n    cpVolumetric <em>scalar3</em>;\n    cpVolumetricFieldName <em>word1</em>;\n    rhoMixFieldName <em>word2</em>;\n    eulerianFields\n    (\n        <em>C</em>\n        <em>T</em>\n    );\n\n}</pre>\n<ul class=\"simple\">\n<li><p><em>phiName</em> = (optional) name of the surface field for the SUPERFICIAL flux, default “phi”.</p></li>\n<li><p><em>voidfractionName</em> = (optional) name of the finite volume voidfraction field, default “voidfraction”.</p></li>\n<li><p><em>scalar1</em> = (optional, default 0.7) turbulent Schmidt Nr, set to large value to suppress turbulent species transport</p></li>\n<li><p><em>scalar2</em> = (optional, default 0.7) turbulent Prandtl Nr, set to large value to suppress turbulent heat transport</p></li>\n<li><p><em>scalar3</em> = (optional, alternatively define word1) volumetric heat capacity as a global constant (in contrast to cpVolumetricFieldName for a field). This is the mixture density times the heat capacity <strong>J/K/(m_voidspace)^3</strong>, will only be used if cpVolumetricFieldName, or updateMixtureProperties = false</p></li>\n<li><p><em>word1</em> = (optional, alternatively define scalar3) volumetric heat capacity as a field</p></li>\n<li><p><em>word3</em> = mixture density field</p></li>\n<li><p><em>C</em> = concentration field name</p></li>\n<li><p><em>T</em> = temperature field name</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">generalManualProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">phiFieldName</span> <span class=\"s2\">&quot;phi&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">ScT</span> <span class=\"mf\">0.7</span><span class=\"p\">;</span>\n    <span class=\"n\">PrT</span> <span class=\"mf\">0.7</span><span class=\"p\">;</span>\n    <span class=\"n\">cpVolumetric</span> <span class=\"mi\">1196</span><span class=\"p\">;</span>\n    <span class=\"n\">rhoMixFieldName</span> <span class=\"s2\">&quot;rhoMix&quot;</span><span class=\"p\">;</span>\n    <span class=\"n\">eulerianFields</span>\n    <span class=\"p\">(</span>\n        <span class=\"n\">C</span>\n        <span class=\"n\">T</span>\n    <span class=\"p\">);</span>\n\n    <span class=\"n\">fvOptionsC</span>\n    <span class=\"p\">{</span>\n    <span class=\"p\">};</span>\n\n    <span class=\"n\">fvOptionsT</span>\n    <span class=\"p\">{</span>\n    <span class=\"p\">};</span>\n\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>Solves the advection-dispersion transport equation for a dilute scalar quantity in the fluid phase. fvOptions can be specified to model sources, etc. in the fluid phase. Exchange models with a particle phase can be included by including appropriate forceModels in couplingProperties.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<p>The user MUST ensure the “phi” field is SUPERFICIAL (i.e., the fluid-phase velocity times voidfraction interpolatedat the cells’ faces). The code cannot know or check whether this is the case, so the user of a certain solver has to ensure this.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p>none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/search.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>Search &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n    \n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <script src=\"_static/searchtools.js\"></script>\n    <script src=\"_static/language_data.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"#\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"#\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"></div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>Search</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <noscript>\n  <div id=\"fallback\" class=\"admonition warning\">\n    <p class=\"last\">\n      Please activate JavaScript to enable the search functionality.\n    </p>\n  </div>\n  </noscript>\n\n  \n  <div id=\"search-results\">\n  \n  </div>\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script>\n  <script>\n    jQuery(function() { Search.loadIndex(\"searchindex.js\"); });\n  </script>\n  \n  <script id=\"searchindexloader\"></script>\n   \n\n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/searchindex.js",
    "content": "Search.setIndex({docnames:[\"CFDEMcoupling_Manual\",\"IOModel\",\"IOModel_basicIO\",\"IOModel_noIO\",\"IOModel_sophIO\",\"IOModel_trackIO\",\"averagingModel\",\"averagingModel_dense\",\"averagingModel_dilute\",\"cfdemSolverIB\",\"cfdemSolverPiso\",\"cfdemSolverPisoSTM\",\"cfdemSolverPisoScalar\",\"clockModel\",\"clockModel_noClock\",\"clockModel_standardClock\",\"dataExchangeModel\",\"dataExchangeModel_noDataExchange\",\"dataExchangeModel_oneWayVTK\",\"dataExchangeModel_twoWayFiles\",\"dataExchangeModel_twoWayMPI\",\"fix_couple_cfd\",\"fix_couple_cfd_force\",\"forceModel\",\"forceModel_Archimedes\",\"forceModel_ArchimedesIB\",\"forceModel_DiFeliceDrag\",\"forceModel_GidaspowDrag\",\"forceModel_KochHillDrag\",\"forceModel_LaEuScalarTemp\",\"forceModel_MeiLift\",\"forceModel_SchillerNaumannDrag\",\"forceModel_ShirgaonkarIB\",\"forceModel_checkCouplingInterval\",\"forceModel_fieldStore\",\"forceModel_fieldTimeAverage\",\"forceModel_gradPForce\",\"forceModel_noDrag\",\"forceModel_particleCellVolume\",\"forceModel_particleVolume\",\"forceModel_periodicPressure\",\"forceModel_scalarGeneralExchange\",\"forceModel_virtualMassForce\",\"forceModel_viscForce\",\"forceModel_volWeightedAverage\",\"forceSubModel\",\"forceSubModel_ImEx\",\"fvOptions\",\"fvOptions_meanSupVelocityForce\",\"liggghtsCommandModel\",\"liggghtsCommandModel_execute\",\"liggghtsCommandModel_readLiggghtsData\",\"liggghtsCommandModel_runLiggghts\",\"liggghtsCommandModel_setDEMGravity\",\"liggghtsCommandModel_writeLiggghts\",\"locateModel\",\"locateModel_engineSearch\",\"locateModel_engineSearchIB\",\"locateModel_standardSearch\",\"meshMotionModel\",\"meshMotionModel_noMeshMotion\",\"momCoupleModel\",\"momCoupleModel_explicitCouple\",\"momCoupleModel_implicitCouple\",\"momCoupleModel_noCouple\",\"probeModel\",\"probeModel_noProbe\",\"probeModel_particleProbe\",\"scalarTransportModel\",\"scalarTransportModel_generalManual\",\"smoothingModel\",\"smoothingModel_constDiffSmoothing\",\"smoothingModel_noSmoothing\",\"voidFractionModel\",\"voidFractionModel_GaussVoidFraction\",\"voidFractionModel_IBVoidFraction\",\"voidFractionModel_bigParticleVoidFraction\",\"voidFractionModel_centreVoidFraction\",\"voidFractionModel_dividedVoidFraction\",\"voidFractionModel_noVoidFraction\",\"voidFractionModel_trilinearVoidFraction\"],envversion:{\"sphinx.domains.c\":2,\"sphinx.domains.changeset\":1,\"sphinx.domains.citation\":1,\"sphinx.domains.cpp\":4,\"sphinx.domains.index\":1,\"sphinx.domains.javascript\":2,\"sphinx.domains.math\":2,\"sphinx.domains.python\":3,\"sphinx.domains.rst\":2,\"sphinx.domains.std\":2,\"sphinx.ext.intersphinx\":1,\"sphinx.ext.todo\":2,sphinx:56},filenames:[\"CFDEMcoupling_Manual.rst\",\"IOModel.rst\",\"IOModel_basicIO.rst\",\"IOModel_noIO.rst\",\"IOModel_sophIO.rst\",\"IOModel_trackIO.rst\",\"averagingModel.rst\",\"averagingModel_dense.rst\",\"averagingModel_dilute.rst\",\"cfdemSolverIB.rst\",\"cfdemSolverPiso.rst\",\"cfdemSolverPisoSTM.rst\",\"cfdemSolverPisoScalar.rst\",\"clockModel.rst\",\"clockModel_noClock.rst\",\"clockModel_standardClock.rst\",\"dataExchangeModel.rst\",\"dataExchangeModel_noDataExchange.rst\",\"dataExchangeModel_oneWayVTK.rst\",\"dataExchangeModel_twoWayFiles.rst\",\"dataExchangeModel_twoWayMPI.rst\",\"fix_couple_cfd.rst\",\"fix_couple_cfd_force.rst\",\"forceModel.rst\",\"forceModel_Archimedes.rst\",\"forceModel_ArchimedesIB.rst\",\"forceModel_DiFeliceDrag.rst\",\"forceModel_GidaspowDrag.rst\",\"forceModel_KochHillDrag.rst\",\"forceModel_LaEuScalarTemp.rst\",\"forceModel_MeiLift.rst\",\"forceModel_SchillerNaumannDrag.rst\",\"forceModel_ShirgaonkarIB.rst\",\"forceModel_checkCouplingInterval.rst\",\"forceModel_fieldStore.rst\",\"forceModel_fieldTimeAverage.rst\",\"forceModel_gradPForce.rst\",\"forceModel_noDrag.rst\",\"forceModel_particleCellVolume.rst\",\"forceModel_particleVolume.rst\",\"forceModel_periodicPressure.rst\",\"forceModel_scalarGeneralExchange.rst\",\"forceModel_virtualMassForce.rst\",\"forceModel_viscForce.rst\",\"forceModel_volWeightedAverage.rst\",\"forceSubModel.rst\",\"forceSubModel_ImEx.rst\",\"fvOptions.rst\",\"fvOptions_meanSupVelocityForce.rst\",\"liggghtsCommandModel.rst\",\"liggghtsCommandModel_execute.rst\",\"liggghtsCommandModel_readLiggghtsData.rst\",\"liggghtsCommandModel_runLiggghts.rst\",\"liggghtsCommandModel_setDEMGravity.rst\",\"liggghtsCommandModel_writeLiggghts.rst\",\"locateModel.rst\",\"locateModel_engineSearch.rst\",\"locateModel_engineSearchIB.rst\",\"locateModel_standardSearch.rst\",\"meshMotionModel.rst\",\"meshMotionModel_noMeshMotion.rst\",\"momCoupleModel.rst\",\"momCoupleModel_explicitCouple.rst\",\"momCoupleModel_implicitCouple.rst\",\"momCoupleModel_noCouple.rst\",\"probeModel.rst\",\"probeModel_noProbe.rst\",\"probeModel_particleProbe.rst\",\"scalarTransportModel.rst\",\"scalarTransportModel_generalManual.rst\",\"smoothingModel.rst\",\"smoothingModel_constDiffSmoothing.rst\",\"smoothingModel_noSmoothing.rst\",\"voidFractionModel.rst\",\"voidFractionModel_GaussVoidFraction.rst\",\"voidFractionModel_IBVoidFraction.rst\",\"voidFractionModel_bigParticleVoidFraction.rst\",\"voidFractionModel_centreVoidFraction.rst\",\"voidFractionModel_dividedVoidFraction.rst\",\"voidFractionModel_noVoidFraction.rst\",\"voidFractionModel_trilinearVoidFraction.rst\"],objects:{},objnames:{},objtypes:{},terms:{\"\":[0,9,10,11,12,29,41,61,73,74,75,76,78,80],\"0\":[0,2,9,12,18,22,29,33,35,38,39,40,41,44,45,48,50,51,53,67,69,71,74,75,76,77,78,80],\"0001\":18,\"001\":[50,51],\"002\":[33,51],\"00456\":45,\"005\":33,\"01\":38,\"012\":51,\"0256\":29,\"0271\":41,\"04\":0,\"0644\":45,\"09\":50,\"0e\":0,\"1\":[0,12,27,33,35,38,39,40,41,44,45,48,50,51,53,54,67,71,74,75,76,77,78,80],\"10\":[0,12,33,41,45,74,75,76],\"100\":[22,67],\"1000\":[21,74,75,76],\"10000\":33,\"1007\":[12,29,41],\"11\":45,\"112\":[29,41],\"116\":41,\"1196\":69,\"14\":78,\"1500e\":71,\"16\":[0,41,57],\"1606\":0,\"1612\":0,\"169\":45,\"17\":41,\"1706\":0,\"1952\":27,\"1966\":27,\"1978\":41,\"1991\":30,\"1e\":41,\"1e10\":[62,71],\"1e2\":62,\"1e3\":62,\"1e4\":62,\"2\":[0,41,45,51,67,78],\"2000\":[29,41],\"2001\":28,\"2007\":27,\"2009\":[30,32],\"2010\":[0,10,11,12,26,36,43],\"2011\":[9,28],\"2012\":[0,40],\"2013\":12,\"2014\":41,\"2017\":0,\"2018\":45,\"22\":[10,11,12],\"224\":30,\"228\":32,\"2334\":45,\"2366\":32,\"2390\":32,\"24\":[10,11,12],\"2500\":[33,40],\"261\":30,\"274\":30,\"29\":78,\"2d\":45,\"2nd\":41,\"3\":[0,33,41,45,51,67,69,74,76,77,80],\"30\":15,\"30000\":[18,19],\"31\":41,\"32\":0,\"33\":41,\"4\":[0,18,19,33,41,45,67],\"4614\":12,\"4d\":[18,19],\"5\":[0,22,41,45,75,76],\"5541\":12,\"6\":[0,41,71,74,76,77],\"65\":45,\"657\":45,\"7\":[0,41,45,69],\"710\":41,\"724\":41,\"7_2\":12,\"8\":[0,41,57,76,80],\"8th\":9,\"9\":48,\"9000e\":71,\"9418\":0,\"978\":12,\"999\":[38,44],\"9999\":48,\"case\":[0,2,7,8,9,15,30,48,61,69,70,71],\"class\":[0,1,13,15,49,55,59,61,68,70,73],\"default\":[0,1,2,6,13,16,23,24,25,26,27,28,29,30,31,32,33,36,37,38,39,40,41,42,43,44,45,46,49,51,52,53,54,55,56,57,59,61,62,63,65,66,67,68,69,70,71,73,74,75,76,77,78,80],\"do\":[0,15,18,37],\"export\":0,\"function\":[0,10,11,12,35,38,40,44,45,62],\"g\\u00f6teborg\":[10,11,12],\"import\":[0,57,61,67],\"int\":[9,15],\"long\":0,\"m\\u00b2\":12,\"new\":[0,32,50,51,61],\"public\":0,\"short\":0,\"switch\":[0,24,25,26,27,28,29,30,32,33,36,38,39,41,42,43,44,45,50,52,53,54,56,61,67],\"transient\":[29,41],\"true\":[0,23,24,25,26,27,28,29,30,33,36,37,38,39,41,42,43,44,45,46,48,51,52,56,57,61],\"try\":0,\"var\":0,\"void\":[0,9,33,61,78],\"while\":[0,9,48],A:[0,9,10,11,12,29,32,41,56,58,68],As:0,At:[22,33,38,44],Being:9,By:[0,61],FOR:41,For:[0,9,33,40,45,48,50,76],If:[0,15,23,24,26,29,33,37,41,45,46,52,68,71,78],In:[0,2,7,8,24,26,30,37,41,50,55,61,70,71,78],It:[0,22,33],Its:0,NOT:71,No:[7,47,48],OF:0,ON:0,On:0,THE:41,The:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,35,36,37,38,39,40,41,42,43,45,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,69,70,71,72,73,74,75,76,77,78,79,80],There:[0,12,15],These:[0,22,70,71],To:[0,65,66,67,71],With:[0,40],_:0,abl:48,about:[9,57],abov:[0,27,50],acceler:33,accord:[0,12,48,50,52,59,74,75,76,78],accordingli:[0,67],account:[10,11,12,36,43,45,48,74,76,77,78],accumul:[15,45],accur:76,act:[23,24,25,26,27,28,30,31,32,36,37,42,43,67],activ:[22,30,32,41,45,48,65,66,67],actual:23,ad:[0,36,43],adapt:0,add:[0,67],addit:[0,5,10,11,12,22,23,24,26,37,41,62,67,78],addition:[4,22,50,62],additionallib:0,adjust:[74,76,77,78],advanc:0,advect:[68,69],af7d7f427be78e9b9beb6aceca8fe7d5d4636876:0,affect:48,after:[0,15,61],afterward:15,again:[0,50],agglomer:[74,76,77,78],air:48,al:[0,26,27,28,32,36,41,43,45],algorithm:[9,10,11,12,13,32,56,57,58,71],algorithmu:56,alia:[0,15],alias:0,alic:[9,75,76],all:[0,9,21,22,23,44,45,48,57,67,71,75,78],alloc:22,allow:[0,9,33,41,48,65,78,80],allrun:0,allwmak:0,alpha:[0,48],alphabet:0,alphaeff:12,alphafield:48,alphal:0,alphamin:[48,74,75,76,77,78,80],alphat:12,also:[0,37,78],altern:[0,23,41,54,69],alwai:[45,71],an:[0,9,10,11,12,15,23,40,47,48,61,62,63,70,71],analog:38,angular:9,ani:[0,23,66],anoth:[57,80],ap:0,appear:33,append:22,appli:[1,6,7,8,10,11,12,13,16,23,37,45,46,48,49,55,59,61,67,68,70,73],applic:[0,9,36,43,48],approach:[0,9,40,70,78],appropri:[68,69,78],approv:[0,9,10,11,12],approx:76,apt:0,ar:[0,9,10,11,12,13,15,19,21,22,23,24,26,33,35,37,38,41,44,45,46,48,50,54,57,61,66,67,70,71,74,75,76,77,78],arbitrari:50,archimed:[0,23,24],archimedesib:[9,25],archimedesibprop:25,archimedesprop:24,archiv:[0,76],area:[0,24,26,37,41,48,78],aren:[0,23],aris:0,arrai:15,arraypo:15,arrheniu:0,artifici:[74,75,76,78],ascend:15,asolid:0,aspher:0,assembl:0,assum:33,atom:[22,41],atom_styl:22,atom_typ:22,attent:[70,71],auto:[0,41],autoinstall_vtk:0,autom:0,automat:[0,50,52],avail:[0,45],averag:[0,6,7,8,10,11,12,15,27,35,40,44,48,57,71],averagingmodel:[0,7,8],averagingmodel_dens:0,averagingmodel_dilut:0,averagingmodel_xi:6,avmixturedens:40,avoid:[61,67],b:[0,22,40],back:56,background:40,backward:0,bad:33,base:[0,1,4,10,11,12,13,18,26,27,28,29,30,31,33,36,40,41,43,49,55,59,61,70,73,78],bashrc:0,basic:[0,2,15,71,78],basicio:[1,2,4,5],bc:33,becaus:[15,70,71],becom:[0,33],bed:[28,45],been:[0,48,61],beetstra:45,beetstradrag:67,befor:0,begin:0,being:[0,37,71],bejan:12,below:[0,50,65,66,67],benchmark:33,beta:[0,70],between:[0,9,15,16,17,18,19,20,21,26,27,28,33,41,42,61,75,78],bfull:0,big:48,bigger:[0,74,75,76],biggest:33,bigparticl:[74,76],bigparticleprop:76,bin:0,bison:0,blank:50,block:0,blockmesh:0,blow:[74,75,76,78],bodi:[9,76],bool1:[31,33,41,51,78],bool2:[31,51],bool3:51,bool:0,border:78,both:0,bound:[15,33,71],boundari:[9,25,32,34,40,57,64,70,71,78],box:50,branch:0,brief:40,broken:33,buijtenen:28,build:0,built:0,button:0,buyoanc:0,c:[0,9,10,11,12,69],c_1:0,c_2:0,c_3:0,ca:47,caclul:37,cadd:[22,42],caddrhofluid:22,calcul:[0,7,8,9,10,11,12,15,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,38,39,40,41,42,43,44,45,63,71,74,75,76,77,78],call:[0,15,41,52],calucl:[24,26,37,41,78],can:[0,5,11,12,15,18,19,20,22,23,24,26,27,28,33,35,36,38,40,41,43,44,45,46,47,48,51,52,53,54,56,57,61,62,65,66,67,68,69,71,74,75,76,77,78],cannot:[0,34,69],capabl:0,capac:[29,41,69],care:0,casedir:[0,15],casepath:2,caus:52,ccmake:0,cd:0,cell:[0,7,8,9,23,27,33,38,44,45,48,55,56,57,58,61,69,71,74,75,76,77,78,80],cellid:[55,56,57,58],celllength:33,cellpoint:[26,27,28,29,30,31,41],cellpointfac:[26,27,28,30,31,36,41,42,43],cellvolum:38,cellzoneset:48,center:[0,78],centr:[33,45,57,73,74,75,76,77,80],central:0,centreprop:77,centroid:78,certain:[0,33,69,78],cfd2:22,cfd:[0,1,2,4,7,8,9,10,11,12,15,17,18,19,20,23,25,32,37,38,39,40,41,45,48,50,52,53,54,55,56,57,58,59,61,62,63,64,67,73,74,75,76,77,78,80],cfd_cn:22,cfdem:[16,42,49,65],cfdem_add_libs_dir:0,cfdem_add_libs_nam:0,cfdem_app_dir:0,cfdem_bashrc:0,cfdem_doc_dir:0,cfdem_lammps_lib_dir:0,cfdem_lib_dir:0,cfdem_liggghts_lib_path:0,cfdem_liggghts_makefile_nam:0,cfdem_liggghts_makefile_postifx:0,cfdem_liggghts_src_dir:0,cfdem_lpp_dir:0,cfdem_project_dir:0,cfdem_project_user_dir:0,cfdem_solver_dir:0,cfdem_src_dir:0,cfdem_tut_dir:0,cfdem_user_app_dir:0,cfdem_user_lib_dir:0,cfdem_ut_dir:[0,15],cfdem_verbos:0,cfdem_vers:0,cfdemcloud:[0,16],cfdemcompcfdemal:0,cfdemcompcfdemsol:0,cfdemcompcfdemsrc:0,cfdemcompcfdemuti:0,cfdemcomplig:0,cfdemcoupl:[0,9,10,11,12,22],cfdemetc:0,cfdemliggght:0,cfdemliggghtspar:0,cfdemparticl:[0,7,8],cfdemproject:0,cfdemsolv:0,cfdemsolverib:[0,75],cfdemsolverpimpleimex:41,cfdemsolverpiso:[0,9],cfdemsolverpisoscalar:0,cfdemsolverpisostm:[0,41],cfdemsolverreact:29,cfdemsolverscalar:29,cfdemsolverxxx:0,cfdemsystest:0,cfdemtesttut:0,cfdemtut:0,cfdemuseonli:78,cfdtool:0,cfl:33,cgwarnonli:23,ch4:0,chang:[0,15,33,52,61,71],channel:48,check:[0,33,57,65,66,67,69],checkcouplinginterv:33,checkcouplingintervalprop:33,checkout:0,checkperiodiccel:[57,75],chemengsci:[27,28,45],chemic:[0,41],chemistri:0,choic:[45,46],choos:[0,29,33,40,50],chosen:[23,29,52],christoph:0,clean:80,clockdata:15,clockmodel:[0,14,15],clockmodel_noclock:0,clockmodel_standardclock:0,clockmodel_xi:13,clone:0,close:0,cloud:[0,7,8],clump:[26,27,28],cluster:[0,9],cmake:0,coars:[23,26,27,28,29,41,45],code:[0,9,10,11,12,13,15,17,18,19,20,41,69,75],coeffici:[0,22,29,36,41,43,45],coincid:78,color:22,com:0,combin:[0,22,27,45],come:0,command:0,comment:0,commit:0,commithashtag:0,commun:[0,37,45],communi:45,comp:32,compar:70,compat:0,compil:0,complet:[1,6,13,16,23,45,49,55,59,61,65,66,67,68,70,73],compon:0,comput:[0,9,29,32,41,48,57],computation:8,concentr:[0,69],concern:0,concetr:0,condit:[9,34,70,71],conduct:[12,24,25,29,32,41],conf:9,configur:0,conflict:[0,61],conjunct:[70,71],connect:0,consid:[16,38,44,45,57,61,75,80],consider:45,consit:16,constant:[0,9,22,40,45,69,74,75,76,78],constdiffsmooth:[70,71],constdiffsmoothingprop:71,constraint:47,contact:0,contain:[0,9,15,22],contrast:69,contribut:[9,22,75,76],control:[0,40],controldict:0,convect:[11,12,29,41],convectiveheatflux:[29,41],convex:0,copi:0,core:0,correcl:41,correct:[0,9,27,45,50,51,78],correctli:34,corrector:0,correl:[26,27,28,29,31,41],correspond:[0,41,55,56,57,58,67],coupl:[9,10,11,12,16,20,23,33,41,45,48,49,50,51,52,61,70,71],couple_everi:[21,22],couplingfilenam:[18,19],couplinginterv:[0,50,51],couplingproperi:0,couplingproperti:[1,2,3,4,5,6,7,8,9,13,14,15,16,17,18,19,20,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],couplingtim:33,courant:33,cover:[0,9,74,75,76],cp:[29,41],cpvolumetr:69,cpvolumetricfieldnam:69,creat:[0,23,54,75],create_atom:50,creation:0,criteria:33,criterion:33,cshrc:0,cubic:80,cumul:0,current:[33,44,45,65,66,67],custom:0,cutoff:48,d:[12,39],d_real:[26,27,28,29,41],d_sim:[26,27,28,29,41],data:[0,1,2,4,6,7,8,15,16,17,18,19,20,22,29,41,45,51,52,67],dataexchang:33,dataexchangemodel:[0,9,17,18,19,20],dataexchangemodel_nodataexchang:0,dataexchangemodel_onewayvtk:0,dataexchangemodel_twowayfil:0,dataexchangemodel_twowaympi:0,dataexchangemodel_xi:16,date:51,dc:0,ddt:42,ddtuinterpolationtyp:42,deactiv:67,debian:0,debug:[0,16,44,45,67,71,78],decomposepar:0,decomposit:0,deen:[29,41],deenet:41,defin:[0,1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,68,69,70,71,72,73,74,75,76,77,78,79,80],delet:[37,67],delta:0,dem:[0,9,10,11,12,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43,45,49,50,51,54,59,61,67,73],demand:[45,46],demt:[0,18,19],demtim:33,denot:0,dens:[6,7,8,41,61],densiti:[0,22,23,24,25,33,40,48,69],densityfieldnam:24,depend:[0,9,45,46,78],dependend:0,depth:32,deriv:68,describ:0,descript:0,design:[9,41,45,57,75],desir:[15,48],detail:[0,24,25,26,27,28,29,30,32,36,41,42,43,50,67],detect:0,determin:0,dev:0,develop:[0,19,27],dhc:[24,26,37,41,78],di:26,diamet:[0,9,26,27,28,29,33,41,70,74,75,76,78],dictionari:[1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],difelic:45,difelicedrag:[23,26],difelicedragprop:26,differ:[0,9,24,25,40,46,48,56,57,68],diffus:41,digit:67,dilut:[6,7,8,27,68,69,71],dimension:[24,25,32],dirctori:0,direct:[41,78],directli:[0,26],directori:[0,2,15,18,54,67,70,71],disabl:[0,65],disclaim:41,discret:[0,10,11,12,27,36,43],dispers:[22,68,69],displac:[10,11,12,22],displai:0,disregard:9,distanc:[57,75],distribut:[0,57,74,80],distributor:0,div:[12,43],divid:[0,33,78],dividedprop:78,divtauinterpolationtyp:43,dmolecular:41,dmpich_skip_mpicxx:0,doc:0,document:[1,6,13,16,21,22,23,45,49,55,59,61,68,70,73],doe:[14,15,29,33,34,35,38,39,41,44,54,61,66,72],doi:12,domain:[9,39,40,48,52,73,74,76,77,78],done:[0,61],dorgan:30,dot:50,dotdot:[50,51],doubl:15,download:0,dp:0,drag:[0,22,26,27,28,31,32,40,45,61],drop:48,dsphere:[39,74,76,77],dt:12,du:0,due:[33,48],dummi:[3,14,17,60,64,72,79],dump:52,dure:[0,45,50,51,52,53,54,67],dynam:[0,9,40],e1:0,e2:0,e3:0,e4:0,e5:0,e6:0,e:[0,1,6,7,8,11,15,21,23,24,25,26,27,28,30,31,32,33,34,36,37,41,42,43,50,51,61,64,67,69,70,71,76,78],each:[0,9,22,23,24,25,26,27,28,30,31,32,36,37,41,42,43,45,50,51,57,67,78],easier:15,easili:[0,78],eccoma:40,effect:[40,45],effici:[8,9,33],effort:0,either:[9,48,76],element:[0,78],email:0,enabl:[0,22,45,50,66,67],end:[0,51,53],endors:[0,9,10,11,12],endtim:[50,51,53],engin:[41,55,56,57],engineib:[57,78],engineibprop:57,engineprop:56,enginesearch:56,enginesearchib:[9,57],enough:0,ensembl:40,ensur:[0,57,69],entri:0,env:0,environ:[0,22],epsilon:0,equal:[0,15,71,78,80],equat:[0,9,10,11,12,29,40,45,47,61,68,69],ergun:27,erron:52,error:[0,70,71],especi:[25,34,57,61],essenti:0,estim:33,et:[0,26,27,28,32,36,41,43,45],etc:[0,9,68,69],euler:71,eulerian:[6,7,8,41,45],eulerianfield:69,eulerimplicit:0,eulerimplicitvoid:0,evalu:[8,14,15],even:[0,51,57],everi:[0,2,4,15,22,33,45,50,51,52,54,67],evinc:0,exact:9,exacttim:51,examin:13,exampl:[0,47],exce:[9,22,33],except:[0,52],exchang:[0,10,11,12,16,17,18,19,20,41,61,62,63,64,68,69,70,71],excplicit:22,execut:[0,20,23,33,37,49,52,53,54,57],execute_0:50,execute_1:50,executeprops0:50,executeprops1:50,executeprops3:50,exert:0,exist:[54,68],exit:0,exp:45,expand:0,expcorrdeltauerror:0,expect:33,experi:[0,33],experiment:28,expforc:61,explicit:[0,4,22,45,61,62,71],explicitcoupl:62,explicitcoupleprop:62,explicitcouplesourc:40,explicitli:37,expon:0,express:30,extend:0,extern:78,f:[0,71],face:69,factor:[26,27,28,29,41,48],fail:[0,24,26,37,41,74,75,76,78],fall:56,fallback:56,fals:[0,24,26,27,28,29,30,32,36,37,38,39,41,42,43,44,45,51,52,53,56,57,69,71,75,78],far:33,fashion:[0,61],fast:32,featur:[0,15,65,67],fed:0,feel:0,felic:26,ffor:0,field:[0,5,9,12,23,24,25,26,27,28,29,30,31,32,33,34,35,36,38,40,41,42,43,44,45,48,57,61,62,63,67,69,70,71,73,74,75,76,78],fieldnam:48,fieldstor:34,fieldstoreprop:34,fieldtimeaverag:35,fieldtimeaverageprop:35,file:[0,1,2,9,15,16,18,19,20,23,38,39,46,51,54,63,67],filenam:[0,18,19,54],filepath:51,fill:71,filter:5,find:[0,55,56,57],finish:15,finit:[10,11,12,24,25,26,27,28,29,30,31,32,34,35,36,41,42,43,44,57,63,69],first:[0,33,50,51,52,53,78],fix:[21,22,53],fix_couple_cfd:22,flag:[0,23,26,27,28,29,31,33,36,41,51,54,57,71,75,78],flex:0,flimit:62,flow:[0,29,30,33,34,36,41,43,47,48,61,71],fluid:[0,9,11,12,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43,45,48,61,63,67,68,69,76],fluidiz:[28,45],fluidscalarfield:41,fluidscalarfieldinterpolationtyp:41,flux:[29,41,42,69],foamsystemcheck:0,folder:[0,48],follow:[0,26,27,28,31,33,40,50,78],footnot:0,forc:[0,4,9,16,21,23,24,25,26,27,28,30,31,32,36,37,40,41,42,43,45,46,47,61,62,65,66,67,70,71],forcemodel:[0,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,66,67,68,69],forcemodel_archimed:0,forcemodel_archimedesib:0,forcemodel_checkcouplinginterv:0,forcemodel_difelicedrag:0,forcemodel_fieldstor:0,forcemodel_fieldtimeaverag:0,forcemodel_gidaspowdrag:0,forcemodel_gradpforc:0,forcemodel_kochhilldrag:0,forcemodel_laeuscalartemp:[0,41],forcemodel_meilift:0,forcemodel_nodrag:0,forcemodel_particlecellvolum:0,forcemodel_particlevolum:0,forcemodel_periodicpressur:0,forcemodel_scalargeneralexchang:0,forcemodel_schillernaumanndrag:0,forcemodel_shirgaonkarib:0,forcemodel_virtualmassforc:0,forcemodel_viscforc:0,forcemodel_volweightedaverag:0,forcemodel_xi:23,forcesubmodel:[0,23,24,25,26,27,28,29,30,32,36,41,42,43,46],forcesubmodel_imex:0,forcesubmodel_xi:45,format:0,formul:[0,27,28,31,32,36,43],forum:0,forward:58,found:[0,56,78],fraction:[0,9,33,44,48,63,78],framework:[0,9,10,11,12],free:0,freeli:0,from:[0,5,8,9,18,19,20,22,24,25,40,45,57,78,80],fsmooth:71,fulli:[0,32],further:[0,38,57],fvoption:[48,68,69],fvoptions_meansupvelocityforc:0,fvoptionsc:69,fvoptionst:69,fvscheme:0,g:[0,1,6,7,8,9,11,15,23,24,25,26,27,28,30,31,32,33,34,36,37,40,41,42,43,50,51,64,67,71],ga:[9,41],gain:9,gamma:0,gasreact:0,gasreactioncoeff:0,gasspecie1:0,gasspecie2:0,gasspecie3:0,gauss:74,gaussian:74,gaussprop:74,gedit:0,gener:[0,5,22,41,55],generalcorrelationparamet:41,generalmanu:[41,68,69],generalmanualprop:69,geometr:[56,57],get:[0,45],gidaspow:27,gidaspowdrag:27,gidaspowdragprop:27,girardi:40,git:0,github:0,give:[0,70,71],given:[0,33,38,45,56,57,58],global:69,gmbh:0,gnu:0,gnuplot:0,goe:[29,41],goniva:[0,9,10,11,12],govern:[9,47],gpl:0,grad:[12,36,43],gradient:[33,36,40],gradpforc:[0,23,36,67],gradpforceprop:36,gradpinterpolationtyp:36,grain:[23,26,27,28,29,41],granular:[7,8,11,12,26,28,29,41,63],granvelfieldnam:[26,27,28,63],graphic:15,graviti:[0,24,25,40,53],gravityfieldnam:[24,25,40],greater:[38,44],grep:67,grid:[45,70],group:[21,22],guid:0,gunn:41,h:0,ha:[0,10,11,12,15,41,48,61,69,78,79],hager:[9,10,11,12,75,76],hand:0,handl:[0,22,45,48,67],happen:0,hashtag:0,have:[0,6,15,44,45,78],heat:[11,12,29,41,69],heatfluid:[29,41],heatflux:[29,41],heattranscoeff:[29,41],here:[0,74],highest:33,hill:28,hint:0,hold:45,hollowaydrag:67,home:0,how:[0,33,40],howev:[0,41,61],http:0,hydraul:[26,27,28],hydrodynam:22,i:[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,69,70,71,72,73,74,75,76,78,79,80],ib:75,ibprop:75,ibvoidfract:9,id1:67,id2:67,id3:67,id:[0,5,21,22,67],ident:0,ignor:[22,29],ii:[0,61],iii:0,imag:[40,57,75],imex:[45,46],immers:[9,25,32,57,64],impforc:61,impldem:[45,46],implement:[0,9,12,56,61,65,67,68,78],implforcedem:[26,27,28,31,45],implforcedemaccumul:[28,45],implicit:[0,4,22,27,28,31,41,45,61,63,70,71],implicitcoupl:[61,63],implicitcoupleprop:63,implicitli:[37,45],impos:[47,48,61],improv:0,inact:0,includ:[0,62,63,64,67,68,69],includeposit:67,incomplet:23,incorpor:9,increas:[51,74,75,76,78],index:51,indic:[42,51],individu:41,industri:9,influenc:[22,29,33,34,35,38,39,41,44,74,75,76,78],info:67,inform:[0,9,15,22,41],inid:50,init:0,initi:[9,15,70,71],input:[0,12,20,24,26,37,41,78],inputscriptnam:0,insert:0,insid:[7,8,74,75,76,77],instabl:48,instanc:50,instead:[0,57],instruct:0,integ:[0,15,67],integr:[22,37,40],intend:15,interact:[23,24,25,26,27,28,30,31,32,36,37,42,43,67],interfac:48,intern:50,internet:0,interpol:[24,26,27,28,29,30,31,36,41,42,43,45,78,80],interpolatedat:69,interpret:34,interv:[0,33,45,50,51,52,53,54,67],intragr:0,introduc:48,investig:[29,41],io:[1,2,3],iomodel:[0,2,3,4,5,9],iomodel_basicio:0,iomodel_noio:0,iomodel_sophio:0,iomodel_trackio:0,iomodel_xi:1,its:[0,9,16,33,46,67,74,75,76,78,80],itself:0,j:[32,69],jfm:[0,26,36,43],jku:[9,13,75,76],job:0,josef:13,journal:[30,32],june:[10,11,12],just:[9,33],k:[12,29,41,69],keep:[67,74,75,76,78],keepcfdforc:37,kei:0,kept:51,kerbl:13,keyword:[0,2,21,22,24,25,30,32,40,44,45,46,50,54],keywork:22,kg:[29,41],kinemat:12,kloss:[0,9,10,11,12],know:69,known:[7,47,48,56,57],koch:28,kochhilldrag:28,kochhilldragprop:28,ksl:[0,22,70,71],l:[0,29,31,63],label1:54,label:50,laeufilmform:0,laeuscalartemp:29,laeuscalartempprop:29,lagrangian:[0,2,6,7,8,45,71],lambda:[29,41],laminar:12,larg:[0,69],larger:[33,71],largest:33,largevcellbyvparcel:33,last:[37,50,54,56,57],later:78,latest:0,latter:2,launch:0,law:[0,27,28,40,61],layer:[57,78],learn:40,least:[0,16],left:0,length:[41,71],lengthscal:71,lengthscalereffield:71,less:[0,61],li:[29,41],lib:0,libboost:0,libmpi:0,libmpich:0,libncurs:0,libopenmpi:0,libptscotch:0,librari:0,libreadlin:0,libscotch:0,libso:0,libvtk7:0,libxt:0,licens:0,lift:[24,25,30],liggght:[0,5,9,10,11,12,16,22,41,42,50,51,52,53,54],liggghts_init:[0,20],liggghtscommand:[50,51,52,53,54],liggghtscommandmodel:[0,20,50,51,52,53,54],liggghtscommandmodel_execut:0,liggghtscommandmodel_readliggghtsdata:0,liggghtscommandmodel_runliggght:0,liggghtscommandmodel_setdemgrav:0,liggghtscommandmodel_writeliggght:0,liggghtscommandmodel_xi:49,liggghtscommmand:[49,50,51,52,53,54],liggghtspath:20,ligght:41,like:[0,15],limason:29,limit:[0,9,10,11,12,29,33,41,62,71,74,75,76,77,78,80],line:[0,5,50,51],linear:[30,56,57],link:0,liquid:[0,48],list:[0,1,6,13,16,23,41,45,49,55,59,61,65,66,67,68,70,73],ll:0,lmpich:0,lmpichcxx:0,lmpl:0,load:0,local:[0,12,63,70],localpsizediffsmooth:70,locat:[0,9,12,15,39,55,56,57,58],locatemodel:[0,56,57,58],locatemodel_enginesearch:0,locatemodel_enginesearchib:0,locatemodel_standardsearch:0,locatemodel_xi:55,log10:45,log:[0,23,46,67],lognam:0,look:[0,1,6,13,16,23,45,49,55,59,61,68,70,73],loop:15,loos:0,lopa:0,lost:0,loth:30,lower:[38,44,71],lowerlimit:71,lowerthreshold:[38,44],lpp:0,lrt:0,lws_:0,m:[29,32,41],m_voidspac:69,machin:0,maciv:32,magnitud:[38,44],mahajan:45,mai:[0,15,22,23,24,26,37,41,78],main:[0,13,67],maintain:0,make:0,makefil:0,makefilenam:0,mandatori:48,mani:[0,54,67],manipul:[0,59],manner:32,manual:[0,67],map:[0,6,7,8,71],mark:[0,9,10,11,12,75],mason:[29,41],mass:[0,22,36,41,42,43],master:0,materi:0,mathemat:32,matplot:15,max:33,maxaccnr:33,maxcellsperparticl:[74,75,76],maxcfl:33,maxim:[9,29,33,41],maximum:[15,18,19,33,74,75,76],maxnumberofparticl:[18,19],maxpcfl:33,maxrelvelchang:33,maxsourc:[29,41],mclaughlin:30,mean:[0,48,79],meaning:61,meansupvelocityforc:48,meansupvelocityforcecoeff:48,measur:[14,15,26,27,28,29,33,41],mechan:30,media:[12,47],meilift:[30,67],meiliftprop:30,memori:[0,22],mention:0,mesh:[0,9,38,59,76,80],meshmot:60,meshmotionmodel:[0,60],meshmotionmodel_nomeshmot:0,meshmotionmodel_xi:59,metallurg:9,method:[0,9,25,32,57],might:[0,1,6,13,16,23,45,48,49,52,55,59,61,65,66,67,68,70,73],min:33,minallowedvcellbyvparcel:33,minalphap:63,minim:[48,57,75],minimum:[0,33,63,74,75,76,77,78,80],mixtur:[40,69],mixturedens:40,mkdir:0,mode:[0,24,26,37,40,41,78],model:[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43,45,46,49,50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],model_i:[23,45,49],model_x:[23,45,49],modeltyp:0,modi:40,modif:57,modifi:0,modu:40,modular:0,molar:0,molecular:41,momcouplemodel:[0,62,63,64],momcouplemodel_explicitcoupl:0,momcouplemodel_implicitcoupl:0,momcouplemodel_nocoupl:0,momcouplemodel_xi:61,momentum:[0,10,11,12,41,61,62,63,64],momentumsourc:48,monodispers:40,more:[0,15,22,33,61,74,75,76],most:[0,23,67],mostli:44,motion:[9,22,45,59],move:[0,57],movement:9,mp:0,mpi:[0,20,21,22,33,49],mpi_arch_flag:0,mpi_arch_inc:0,mpi_arch_lib:0,mpi_arch_path:0,mpi_root:0,mpirun:0,much:16,multi:9,multipl:[0,28],multispher:[0,24,26,37,41,78],must:[0,29,41,45,53,54,69,70,71,78],mv:0,mvapich:0,myforcemod:67,myforcemodel1:[66,67],myforcemodel2:[66,67],myforcemodel3:[66,67],myprobemodel:65,myprobemodelprop:65,myset:65,n:[21,32,41],name:[0,1,6,12,13,15,16,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,38,40,41,42,43,44,45,48,49,54,55,57,59,61,63,68,69,70,73,78],name_:54,naumann:31,navier:[0,9,10,11,12,61],nearli:0,necessari:[0,12,15,32,40,76],need:[0,15,22,23,33,50,51],neighbour:80,nevertheless:0,newton:[0,61],next:[22,78],nield:12,noblank:50,noclock:14,nocoupl:64,nodataexchang:[16,17],nodemforc:37,nodrag:37,nodragprop:37,nofproc:0,noio:[1,3],nomenclatur:0,nomeshmot:[59,60],non:[0,45,78],none:[0,1,2,3,4,5,6,13,14,15,16,17,18,20,21,23,24,26,27,28,30,31,34,35,36,37,38,39,40,43,45,46,49,50,53,54,55,56,58,59,60,61,65,66,67,68,69,70,72,73,74,75,76,77,78,79],normal:[0,26,28,29,31,36,41,50,53,57],norwai:9,nosmooth:72,note:[0,23,33,41,48,51,54,61,66,67,68],novoidfract:79,now:[0,45],np:0,nparticl:0,nr:[33,69],nrdemstep:52,nu:[12,26,27,28,29,30,41,43,45],nucorrel:29,number1:[38,71,74,75,76,77,78,80],number2:[38,71,74,75,76,77,78],number3:[38,74,75,76,78],number4:[74,76],number:[0,12,15,18,19,21,29,33,41,45,48,50,51,54,57,63,67,71,74,75,76],numer:[0,28,41],numpi:0,nusselt:[29,41],nut:12,nve:22,o0:0,o2:0,object:[0,20,35,38,44],obligatori:21,obtain:[61,78],occupi:[74,76,77,78],occur:[0,48,67],octav:0,od:0,odevoid:0,off:[1,3,14,26,27,28,29,31,36,41,45,50,51,53,54,64,65,66,67,70,72],offer:[0,9,10,11,12],offici:0,often:0,ofvers:0,oil:9,older:0,omiss:0,omit:15,onc:15,one:[0,8,19,41,45,48,54,57,70,80],ones:61,onewayvtk:[16,18,33],onewayvtkprop:18,onli:[0,2,8,19,22,25,26,27,28,29,30,32,38,40,41,43,44,45,48,49,50,51,52,53,54,57,61,62,63,64,65,67,69,75,80],open:[0,9,10,11,12],opencfd:[0,9,10,11,12],openfoam:[0,9,10,11,12,41],openmpi:0,oper:[24,26,37,40,41,70,71,78],option:[0,22,24,25,26,27,28,29,30,31,32,33,35,36,37,38,39,40,41,42,43,44,45,46,48,52,54,56,57,63,69,71,74,75,76,77,78,80],order:[15,30,41,61],org:0,organ:0,organis:0,origin:[35,38,44],orthogon:0,other:[0,1,6,13,16,23,45,49,55,59,61,67,68,70,73],otherwis:[0,22,67,70,71],our:0,out:[15,71],output:[0,2,15,23,24,26,27,28,35,36,38,39,41,43,44,45,54,67,71,78],over:[33,57,71,80],overlap:78,overrid:67,overview:40,overwrit:54,own:[0,33],owner:[0,9,10,11,12],p:[0,32,36,40],pack:51,packag:0,page:0,pair:22,parallel:[0,9,10,11,12,57,80],paramet:[0,41,74,76,77,78,80],paraview:[0,5,34],parcel:[40,45,70],parscal:41,part:[0,13,41,57,76],partheatfluidnam:[29,41],partheatfluxnam:[29,41],partheattranscoeffnam:[29,41],parti:0,partial:[9,75],particl:[0,1,2,5,6,7,8,10,11,12,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,48,52,55,57,61,63,65,66,67,68,69,70,71,73,74,75,76,77,78,80],particlecellsurfac:0,particlecellvolum:38,particlecellvolumeprop:38,particleid:[5,67],particleidstosampl:67,particleprob:[65,66,67],particleprobeprop:67,particlerelaxationtim:33,particleshapetyp:[0,24,26,37,41,78],particlevolum:39,particlevolumeprop:39,particul:27,particular:50,particularli:48,partspeciesfluidnam:41,partspeciesfluxnam:41,partspeciesnam:41,partspeciestranscoeffnam:41,parttempnam:[29,41],pass:[0,22,40,45],patankar:32,path:[0,5,18,20,50,51,54],pcfl:33,per:[22,24,26,30,37,41,67,76,77,78],perform:[0,6,7,8,16,17,18,19,20,23,24,25,26,27,28,30,31,32,36,37,41,42,43,61,65,66,67,71,78],period:[40,48,57,75],periodicpressur:40,periodicpressureprop:40,permit:48,perspect:[10,11,12],pfieldnam:36,phase:[0,9,11,12,48,68,69],phi:[12,27,42,69],phifieldnam:[42,69],phinam:69,phy:32,physic:[32,47,68,79],pi:[74,76,77],pimpleimex:[70,71],pirker:[9,10,11,12],piso:[10,11,12],pisofoam:[10,11,12],place:[9,15,22,48,70,71],placehold:50,pleas:[0,1,6,13,16,23,45,48,49,55,59,61,65,66,67,68,70,73],pneumat:[29,41],point:[57,78],poros:[74,76,77,78],porou:[12,47],port:0,posit:[0,2,9,15,16,30,41,55,56,57,58,67,78],possibl:0,post:[0,5,18],postfix:0,postporcessor:34,postprocess:[0,33,35,38,39,44],potenti:[26,27,28,29,41],pow:[29,41],pr:12,prandtl:[12,69],pre:52,predefin:41,preno:52,prepar:0,preprocess:0,prerequisit:0,presenc:48,present:[0,9,71],pressur:[0,9,32,36,40,48],pressurefieldnam:32,previou:[0,9,78],previous:[18,22,37,56],print:[23,67],printeveri:67,printonlyatstep:67,prio:51,probe:[24,26,27,28,35,36,38,41,43,44,65,66,67],probedebug:67,probem:67,probemodel:[0,66,67],probemodel_noprob:0,probemodel_particleprob:0,probemodelset:65,problem:[0,9,61],proc:[2,9,10,11,12],procboundarycorrect:78,procedur:0,process:[0,5,9,15,61],processor:[0,2,19,57,78],produc:[0,9,10,11,12,15],product:33,project:0,proper:0,properli:0,properti:[0,1,11,12,18,19,20,21,22,23,41,67],proport:40,propuls:32,protocol:0,provid:[0,45,46,50,56,62,63,64],prt:[12,69],pseudo:45,pull:[0,21],pump:48,pure:[0,45],purpos:[9,16],push:21,put:15,py:15,python:[0,15],qualiti:33,quantiti:[30,61,67,68,69],question:0,r:[0,67,78],r_0:0,radial:78,radiat:12,radii:[2,16],radiu:78,radl:40,ran:15,rang:[78,80],rasproperti:0,rate:0,rather:[7,8,71],ratio:33,re:50,reach:[0,40],reactant:0,reaction:0,read:[0,19,41,46,51,71],readabl:0,readi:23,readliggghtsdata:51,readliggghtsdataprops0:51,realiz:[9,41],reason:[0,33],recip:0,reciproc:33,recommend:[0,22,33,56,57],recurs:[56,57],refer:[0,9,32,48,61,71],regim:[7,8],region:[74,75,76,78],regist:0,rel:[18,33,54],relat:[0,21,22,66,67],relativepath:18,relax:[33,48],releas:0,relev:[0,61,70],remain:[74,75,76,78],remark:0,rememb:[15,78],remov:0,renam:0,rep:45,repeat:51,replac:51,report:30,repositori:0,repres:[9,25,29,32,38,41,47,57,73],represent:[0,74,75,76,78,80],reproduc:78,requir:[0,22,24,26,37,41,78],reset:78,resolut:70,resolv:[25,32],respect:[9,13,15,45,75],respons:21,rest:[0,78],restart:54,restart_:50,restartcfdem:54,result:[0,33,48,76],review:41,reynold:45,rho:[23,24],rhofluid:22,rhol:0,rhomix:[40,69],rhomixfieldnam:69,rhop:33,robust:58,rong:45,routin:[0,15],run:[0,13,14,15,19,20,41,49,50,51,52,53],runeverycouplingstep:[50,51],runeverywritestep:50,runfirst:[50,51,52,53],runlast:50,runliggght:[49,52,53,54],runliggghtsprop:52,runtim:51,safeti:15,same:[0,41,44,48],sampl:67,sampleal:67,satellit:57,save:[0,54,67],scalar01:0,scalar02:0,scalar03:0,scalar11:0,scalar12:0,scalar13:0,scalar14:0,scalar15:0,scalar16:0,scalar1:[19,26,27,28,29,30,32,33,36,39,40,42,43,44,51,53,69],scalar20:0,scalar21:0,scalar22:0,scalar2:[19,26,27,28,29,33,39,40,43,44,51,53,69],scalar3:[26,27,28,29,33,40,51,53,69],scalar4:[26,27,28,29,33,51],scalar5:[27,29,33,41],scalar6:[27,33,41],scalar7:[33,41],scalar8:33,scalar9:33,scalar:[11,12,22,29,34,35,41,42,44,50,57,68,69,71],scalarfield:[34,35,38,44],scalarfieldnam:[34,35,44],scalargeneralexchang:41,scalargeneralexchangeprop:41,scalartransportmodel:[0,69],scalartransportmodel_generalmanu:0,scalartransportmodel_xi:68,scalartransportproperti:[41,68,69],scalarviscos:[26,27,28,29,30,41,43,45],scale:[0,26,27,28,29,33,39,41,71,74,76,77,78],scaledh:[26,27,28],scaledrag:[26,27,28,33],scaleupvol:75,scheme:0,schiller:31,schillernaumanndrag:31,schillernaumanndragprop:31,schmidt:69,scienc:41,screen:[30,38,39,45],script:[0,15],sct:69,search:[55,56,57,74,75,76],second:[30,41,78],secondari:67,section:[0,50],see:[0,10,11,12,24,25,26,27,28,29,30,32,36,40,41,42,43,45,46,50,65,67],seed:56,select:[0,23,24,26,37,41,45,53,54,78],seletionmod:48,self:32,semi:45,send:0,separ:[0,50],sequenti:[19,23],seri:[18,19],serial:2,serialoutput:2,set:[0,9,22,23,33,37,40,41,45,46,48,50,52,53,56,57,61,62,69,74,75,76,78],setdemgrav:53,setdemgravityprops0:53,setdemgravityprops1:53,setsourcefield:[40,62],setup:0,sever:[33,37,57],sh:0,shall:68,shape:0,share:0,shell:0,shirgaonkar:32,shirgaonkarib:[9,32],shirgaonkaribprop:32,shlib:0,should:[0,8,33,51,71],show:[0,40],side:[0,27,28,31,40,45],sign:50,signific:67,similar:[0,22,33],similarli:78,simpli:0,simul:[0,2,4,15,18,19,20,23,25,27,32,33,35,36,38,39,41,43,44,50,51,53,61,67],sinc:[0,15],singl:[8,50],situat:[48,71],size:[9,15,18,33,45,78,80],slash:[50,51],slower:16,small:[0,63,70],smaller:[0,33],smallest:33,smooth:[61,70,71,72,75,80],smoothen:[48,70],smoothinglength:71,smoothinglengthreferencefield:71,smoothingmodel:[0,71,72],smoothingmodel_constdiffsmooth:0,smoothingmodel_nosmooth:0,smoothingmodel_xi:70,so:[0,69],softwar:[0,9,10,11,12],solid:[0,9,41,75,76],solidprop:0,solidspeci:0,solidspecie1:0,solidspecie2:0,solut:0,solv:[0,9,10,11,12,61,68,69],solveflow:0,solver:[9,10,11,12,25,29,32,37,48,57,61,62,63,64,69,70,71,78],some:[0,23,46,57],sophio:[1,4],sourc:[0,9,10,11,12,29,37,62,63,64,68,69],sourceradi:12,speci:[0,41,69],special:[9,50,51,75],speciesc:41,speciescfluid:41,speciescflux:41,speciesconvect:41,speciesctranscoeff:41,speciesflux:41,speciestransportmodel:41,specif:[0,29,41,48,67],specifi:[0,30,35,41,52,67,68,69,70,71,78],speed:0,sphere:[0,9,57,78],spheric:[45,78],split:42,spliturelcalcul:42,spout:28,springer:12,sqr:45,sqrt:45,src:[0,41,67],ssmoothfield:70,stabl:[0,61],stairstep:76,stand:0,standard:[0,15,16,35,38,41,44,58],standardclock:[13,15],start:[0,15,35,38,39,44,51,53,57,67],startindex:51,starttim:[15,35,38,39,44,50,51,53,67],stash:0,state:0,statement:[0,15],stem:[24,25],step:[0,9,15,18,19,21,22,33,45,50,51,52,53,54,67,78],still:0,stochast:22,stoichiometr:0,stoke:[0,9,10,11,12,33,61],stop:[0,15,23,33],storag:67,store:[0,15,18,34,54],straight:58,strength:0,stress:0,string:15,strongli:[0,22],structur:[0,1,57,80],studi:[28,45],style:[0,21,22],sub:[0,24,25,26,27,28,29,30,32,36,41,42,43,45,46,75,76,78],subspher:78,success:[0,56],sudo:0,suffici:0,suggest:0,suit:[25,32],suitabl:41,sum:0,summari:[0,40],sundaresan:40,superfici:[48,69],superpos:[23,62],superquadr:[0,22],support:0,suppos:[7,8,74,75,76,78,80],suppress:[0,24,26,27,28,36,41,43,69],suppressprob:[24,26,27,28,36,41,43,67],sure:0,surfac:[0,57,69,75],surround:9,switch0:44,switch1:[0,24,25,26,27,28,29,30,32,36,37,38,39,41,42,43,44,50,53,54,56,57,78],switch2:[24,26,27,28,29,30,32,36,37,38,39,41,42,43,50,53,54],switch3:[24,26,27,28,29,30,36,41,42,43,50],switch4:[24,26,27,28,30,36,42,43,50],switch5:[26,27,28,41,43],switch6:[26,27,28,41],switch7:[26,27,28],switch8:26,switch9:26,switchingvoidfract:27,symbol:[0,50,51],synchron:0,system:[0,11,12,27,40,48],systemmpi:0,t:[0,9,12,23,29,41,69],tackl:9,tag:0,take:[0,9,22,45,48],taken:0,tang:45,target:[0,40],targetveloc:40,tau:[0,43],tech:[29,41],techniqu:20,temp:[29,41],temperatur:[29,41,69],tempfieldnam:[29,41],tempor:[35,44,57],temporalparticlestopathlin:5,tensor:0,term:[0,12,22,30,37,45,62,63,64],termin:[0,23,67],test:[70,71],text:67,than:[0,15,33,38,44,71,74,75,76],thei:[35,38],them:[0,37,50],theoret:[27,40],therefor:[0,33],therefror:46,thermal:[12,29,41],thi:[0,1,5,6,7,8,9,10,11,12,13,15,16,21,22,23,24,25,26,29,30,32,33,34,35,37,38,39,41,44,45,49,55,56,57,59,61,65,66,67,68,69,70,71,73,75,76,78,80],thing:0,third:[0,61],thirdparti:0,those:[0,15,44,74,75,76],thread:0,three:78,threshold:[38,44],thu:12,time:[0,2,4,9,13,14,15,18,19,21,22,33,35,38,39,44,45,48,50,51,52,53,54,61,67,69,70,71,78],timeaverage_scalarfield:35,timeevalful:15,timeinterv:[33,50,51,53],timestamp:[50,54],timestep:[0,18,51],tinterpolationtyp:29,togeth:0,too:0,tool:[0,33,34,35,38,39,44],toolbox:[0,9,16],torqu:[22,45],total:[0,9,38,39],totalerror:0,toward:9,track:67,trackio:[1,5],trade:[0,9,10,11,12],trajectori:[10,11,12],tranportproperti:45,transfer:[0,11,12,22,29,41],transfer_dens:22,transfer_ellipsoid:22,transfer_properti:22,transfer_stochast:22,transfer_superquadr:22,transfer_torqu:22,transfer_typ:22,transform:40,transit:[75,80],transport:[11,12,29,41,45,68,69],transportproperti:[0,12],travel:80,treat:[0,37,61],treatdem:[45,46],treatexplicit:[45,46],treatforcedem:[24,36,42,43,45],treatforceexplicit:[0,25,26,27,28,30,32,36,42,43,45],treatment:[50,51,61],treatvoidcellsasexplicitforc:61,tree:[0,56,57],treesearch:[56,57],tri:30,trilinear:80,trilinearprop:80,trondheim:9,troubl:52,tsourc:12,turbul:[10,11,12,29,41,69],turbulencemodeltyp:0,two:[0,19,21,24,25,32,40,41,78],twodimension:[24,25,32],twophas:48,twowayfil:[16,19],twowayfilesprop:19,twowaympi:[16,20],twowaympiprop:20,txt:15,type1:[26,27,28,29,30,31,36,41,42,43],type2:[26,27,28,30,31,41,42],type3:41,type:[0,12,15,22,24,26,27,28,29,30,31,36,37,41,42,43,48,77,78],typic:[0,33,61],u:[0,26,27,28,29,30,31,32,33,34,35,36,41,42,43,48,61,63],ubar:48,ubuntu:0,uf:[0,22],uf_poststep:0,uf_prestep:0,uinterpolationtyp:[26,27,28,30,31,41,42],ul:[0,45],umaxexpect:33,unalt:[74,75,76,78],under:0,unfix:53,uniformfixedvaluevoidfract:48,unit:[12,50],unless:22,unresolv:9,until:22,unwant:67,unzip:0,up:[0,51,74,75,76,78],updat:[0,45],updatemixtureproperti:69,upper:[38,44,71],upperlimit:71,upperthreshold:[38,44],urel:42,us:[0,2,5,7,8,9,10,11,12,15,22,23,24,26,27,28,29,30,31,33,34,35,36,37,38,40,41,43,44,45,46,47,48,50,51,52,53,54,55,56,57,58,61,65,67,68,69,70,71,74,75,76,77,78,80],usag:[0,15,45,50],useaddedmass:[36,43],usefiltereddragmodel:45,usegeneralcorrel:41,uselimason:41,useparcelsizedependentfiltereddrag:45,user:[0,33,45,48,69],usesecondorderterm:30,usevoidfractioncorrect:0,usevolumefract:44,usind:80,usr:0,usual:22,util:0,v:0,valid:[0,29,42],valu:[0,22,26,27,28,29,31,33,36,38,41,42,44,45,46,63,69,71,75],value1:[41,57],value2:[41,57],van:28,variabl:[0,15,37],variant:[24,26,37,41,78],varieti:68,variou:[0,65],vector1:40,vector:[0,22,34,35,44,62],vectorfield:[34,35,44],vectorfieldnam:[34,35,44],velfieldnam:[26,27,28,29,30,31,32,41,42,63],veloc:[0,2,6,7,8,9,16,26,27,28,29,30,31,32,33,36,40,41,42,43,45,47,48,61,63,69,71],velocityfieldnam:[33,36,43],veloctii:61,verbos:[24,26,27,28,29,30,32,38,39,41,44,45,50,51,52,53,54,67,71,78],verbosetofil:67,veri:[0,58,80],versa:78,version:[0,45],versioninfo:0,via:[0,19,20,23,40,62,65,66,67,71,73],vice:78,vienna:40,virtual:42,virtualmassforc:42,virtualmassforceprop:42,viscforc:[0,23,43,67],viscforceprop:43,viscos:45,viscou:[32,43],visit:0,visual:[0,15],vizclock:15,vlaue:48,voidag:45,voidagefunctiondifelic:[26,45],voidagefunctionrong:[26,45],voidagefunctiontang:[26,45],voidchemistrymodelprop:0,voidfracfieldnamesnext:78,voidfracfieldnamesprev:78,voidfract:[0,4,12,25,26,27,28,29,31,33,34,35,40,41,44,45,48,63,69,70,71,73,74,75,76,77,78,79,80],voidfractionfield:48,voidfractionfieldnam:[25,26,27,28,29,31,40,41,63,69],voidfractioninterpolationtyp:[26,27,28,31,41],voidfractionmodel:[0,74,75,76,77,78,79,80],voidfractionmodel_bigparticlevoidfract:0,voidfractionmodel_centrevoidfract:0,voidfractionmodel_dividedvoidfract:0,voidfractionmodel_gaussvoidfract:0,voidfractionmodel_ibvoidfract:0,voidfractionmodel_novoidfractionvoidfract:0,voidfractionmodel_trilinearvoidfract:0,voidfractionmodel_xi:73,voidfractionnam:69,voidfractionnext:25,volaverage_field:44,volscal:[77,78],volum:[0,10,11,12,24,25,26,27,28,29,30,31,32,33,34,35,36,38,39,41,42,43,44,57,63,69,73,74,75,76,77,78,80],volumefractionnam:44,volumetr:[0,24,25,69],volweightedaverag:44,volweightedaverageprop:44,vortic:30,vorticityinterpolationtyp:30,vparticl:[33,36,43,74,75,76,77,78],vsmoothfield:70,vtk:[0,18,19],vtk_group_mpi:0,vtk_out:[18,19],w:[29,41],w_1:0,w_2:0,wa:0,wai:[40,41,61],walk:56,want:0,warn:[0,23,33,41,52,80],warnonli:33,water:48,we:[0,40],weight:[44,74,76],well:[11,12,67,71],wen:27,were:[9,37],what:40,when:[8,45,48,57,61,74,75,76,78,80],where:[0,7,8,9,15,17,25,32,33,35,38,44,45,50,52,54,67],wherea:[0,16,48],whether:[0,69],which:[0,9,14,15,22,26,27,33,34,37,40,48,52,55,59,61,62,66,67,71,72,74,75,76,78],whole:[9,48],whose:[10,11,12,74,75,76,77],width:19,wierink:9,wish:0,within:[0,1,9,16,44,45,48,49,50,76],without:[0,24,26,37,41,78],wm_compile_opt:0,wm_label_s:0,wm_mplib:0,wm_ncompproc:0,wm_project_dir:0,wm_project_vers:0,wmake:0,word1:[33,44,69],word2:69,word3:69,word:[0,40,50,51],work:[0,33,49,80],workshop:[10,11,12],would:[0,50],write:[0,1,2,4,5,50,54],write_restart:[50,54],writeeveri:54,writelastonli:54,writeliggght:[49,54],writeliggghtsprop:54,writenam:54,writeprecis:67,writetim:[35,38,44],writetofil:[38,39,44],written:[0,2,4,13,19,35,38,44,54],www:0,wwww:0,x11:0,x:[0,54,80],xeveri:67,xi:45,xprecis:67,xstep:67,xxx:0,xysplit:57,y:80,ye:[22,48],yet:80,you:[0,15,34,54,67],your:[0,15,34],yourself:0,yu:27,yum:0,z:[57,80],zero:[22,37,76],zerogradi:[70,71],zhou:[0,26,36,43],zhu:27,zlib1g:0,zsplit:57,zypper:0},titles:[\"CFDEM\\u00aecoupling Documentation\",\"IOModel command\",\"IOModel_basicIO command\",\"IOModel_noIO command\",\"IOModel_sophIO command\",\"IOModel_trackIO command\",\"averagingModel command\",\"averagingModel_dense command\",\"averagingModel_dilute command\",\"cfdemSolverIB command\",\"cfdemSolverPiso command\",\"cfdemSolverPisoSTM command\",\"cfdemSolverPisoScalar command\",\"clockModel command\",\"clockModel_noClock command\",\"clockModel_standardClock command\",\"dataExchangeModel command\",\"dataExchangeModel_noDataExchange command\",\"dataExchangeModel_oneWayVTK command\",\"dataExchangeModel_twoWayFiles command\",\"dataExchangeModel_twoWayMPI command\",\"couple/cfd command\",\"couple/cfd/force command\",\"forceModel command\",\"forceModel_Archimedes command\",\"forceModel_ArchimedesIB command\",\"forceModel_DiFeliceDrag command\",\"forceModel_GidaspowDrag command\",\"forceModel_KochHillDrag command\",\"forceModel_LaEuScalarTemp command\",\"forceModel_MeiLift command\",\"forceModel_SchillerNaumannDrag command\",\"forceModel_ShirgaonkarIB command\",\"forceModel_checkCouplingInterval command\",\"forceModel_fieldStore command\",\"forceModel_fieldTimeAverage command\",\"forceModel_gradPForce command\",\"forceModel_noDrag command\",\"forceModel_particleCellVolume command\",\"forceModel_particleVolume command\",\"forceModel_periodicPressure command\",\"forceModel_scalarGeneralExchange command\",\"forceModel_virtualMassForce command\",\"forceModel_viscForce command\",\"forceModel_volWeightedAverage command\",\"forceSubModel command\",\"forceSubModel_ImEx command\",\"fvOptions dictionary\",\"fvOptions_meanSupVelocityForce command\",\"liggghtsCommandModel command\",\"liggghtsCommandModel_execute command\",\"liggghtsCommandModel_readLiggghtsData command\",\"liggghtsCommandModel_runLiggghts command\",\"liggghtsCommandModel_setDEMGravity command\",\"liggghtsCommandModel_writeLiggghts command\",\"locateModel command\",\"locateModel_engineSearch command\",\"locateModel_engineSearchIB command\",\"locateModel_standardSearch command\",\"meshMotionModel command\",\"meshMotionModel_noMeshMotion command\",\"momCoupleModel command\",\"momCoupleModel_explicitCouple command\",\"momCoupleModel_implicitCouple command\",\"momCoupleModel_noCouple command\",\"probeModel command\",\"probeModel_noProbe command\",\"probeModel_particleProbe command\",\"scalarTransportModel command\",\"scalarTransportModel_generalManual command\",\"smoothingModel command\",\"smoothingModel_constDiffSmoothing command\",\"smoothingModel_noSmoothing command\",\"voidfractionModel command\",\"voidfractionModel_GaussVoidFraction command\",\"voidfractionModel_IBVoidFraction command\",\"voidfractionModel_bigParticleVoidFraction command\",\"voidfractionModel_centreVoidFraction command\",\"voidfractionModel_dividedVoidFraction command\",\"voidfractionModel_noVoidFractionVoidFraction command\",\"voidfractionModel_trilinearVoidFraction command\"],titleterms:{\"default\":[21,22],These:50,about:0,averagingmodel:6,averagingmodel_dens:7,averagingmodel_dilut:8,can:50,cfd:[21,22],cfdem:0,cfdemsolverib:9,cfdemsolverpiso:10,cfdemsolverpisoscalar:12,cfdemsolverpisostm:11,chemistryproperti:0,clockmodel:13,clockmodel_noclock:14,clockmodel_standardclock:15,command:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],complex:50,content:0,coupl:[0,21,22],couplingproperti:0,dataexchangemodel:16,dataexchangemodel_nodataexchang:17,dataexchangemodel_onewayvtk:18,dataexchangemodel_twowayfil:19,dataexchangemodel_twowaympi:20,descript:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],dictionari:[0,47],document:0,exampl:[1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],execut:50,forc:22,forcemodel:23,forcemodel_archimed:24,forcemodel_archimedesib:25,forcemodel_checkcouplinginterv:33,forcemodel_difelicedrag:26,forcemodel_fieldstor:34,forcemodel_fieldtimeaverag:35,forcemodel_gidaspowdrag:27,forcemodel_gradpforc:36,forcemodel_kochhilldrag:28,forcemodel_laeuscalartemp:29,forcemodel_meilift:30,forcemodel_nodrag:37,forcemodel_particlecellvolum:38,forcemodel_particlevolum:39,forcemodel_periodicpressur:40,forcemodel_scalargeneralexchang:41,forcemodel_schillernaumanndrag:31,forcemodel_shirgaonkarib:32,forcemodel_virtualmassforc:42,forcemodel_viscforc:43,forcemodel_volweightedaverag:44,forcesubmodel:45,forcesubmodel_imex:46,fvoption:47,fvoptions_meansupvelocityforc:48,instal:0,iomodel:1,iomodel_basicio:2,iomodel_noio:3,iomodel_sophio:4,iomodel_trackio:5,liggghtscommand:0,liggghtscommandmodel:49,liggghtscommandmodel_execut:50,liggghtscommandmodel_readliggghtsdata:51,liggghtscommandmodel_runliggght:52,liggghtscommandmodel_setdemgrav:53,liggghtscommandmodel_writeliggght:54,locatemodel:55,locatemodel_enginesearch:56,locatemodel_enginesearchib:57,locatemodel_standardsearch:58,meshmotionmodel:59,meshmotionmodel_nomeshmot:60,model:0,momcouplemodel:61,momcouplemodel_explicitcoupl:62,momcouplemodel_implicitcoupl:63,momcouplemodel_nocoupl:64,probemodel:65,probemodel_noprob:66,probemodel_particleprob:67,rather:50,readliggght:50,relat:[1,2,3,4,5,6,7,8,14,15,16,17,18,19,20,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,50,51,52,53,54,56,57,58,60,62,63,64,69,71,72,74,75,76,77,78,79,80],replac:50,restrict:[1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],scalartransportmodel:68,scalartransportmodel_generalmanu:69,smoothingmodel:70,smoothingmodel_constdiffsmooth:71,smoothingmodel_nosmooth:72,solver:0,syntax:[1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],tutori:0,voidfractionmodel:73,voidfractionmodel_bigparticlevoidfract:76,voidfractionmodel_centrevoidfract:77,voidfractionmodel_dividedvoidfract:78,voidfractionmodel_gaussvoidfract:74,voidfractionmodel_ibvoidfract:75,voidfractionmodel_novoidfractionvoidfract:79,voidfractionmodel_trilinearvoidfract:80,writeliggght:50}})"
  },
  {
    "path": "doc/_build/html/smoothingModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>smoothingModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">smoothingModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>smoothingModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"smoothingmodel-command\">\n<span id=\"index-0\"></span><h1>smoothingModel command<a class=\"headerlink\" href=\"#smoothingmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">smoothingModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the smoothingModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">smoothingModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n<span class=\"n\">smoothingModel</span>  <span class=\"n\">constDiffSmoothing</span><span class=\"p\">;</span>\n<span class=\"n\">smoothingModel</span>  <span class=\"n\">localPSizeDiffSmoothing</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (smoothingModel_XY) in this documentation.</p>\n</div>\n<p>ATTENTION: In case a smoothing model is used in conjunction with “PimpleImEx” solvers, the fields “sSmoothField” and “vSmoothField” must be placed in the initial time directory! This is because zeroGradient boundary conditions for these fields must be specified, otherwise the smoothing operation will give an Error.</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The smoothingModel is the base class for models that smoothen the exchange fields (i.e., voidfraction and the Ksl field in case of implicit force coupling). This is relevant in case one uses a small grid resolution compared to the local particle diameter (or parcel diameter in case one uses a parcel approach).</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>These models are in beta testing.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/smoothingModel_constDiffSmoothing.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>smoothingModel_constDiffSmoothing command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">smoothingModel_constDiffSmoothing command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>smoothingModel_constDiffSmoothing command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"smoothingmodel-constdiffsmoothing-command\">\n<span id=\"index-0\"></span><h1>smoothingModel_constDiffSmoothing command<a class=\"headerlink\" href=\"#smoothingmodel-constdiffsmoothing-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">smoothingModel</span> <span class=\"n\">constDiffSmoothing</span><span class=\"p\">;</span>\n<span class=\"n\">constDiffSmoothingProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">lowerLimit</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">upperLimit</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">smoothingLength</span> <span class=\"n\">lengthScale</span><span class=\"p\">;</span>\n    <span class=\"n\">smoothingLengthReferenceField</span> <span class=\"n\">lengthScaleRefField</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = scalar fields will be bound to this lower value</p></li>\n<li><p><em>number2</em> = scalar fields will be bound to this upper value</p></li>\n<li><p><em>lengthScale</em> = length scale over which the exchange fields will be smoothed out</p></li>\n<li><p><em>lengthScaleRefField</em> = length scale over which reference fields (e.g., the average particle velocity) will be smoothed out. Should be always larger than lengthScale. If not specified, will be equal to lengthScale.</p></li>\n<li><p><em>verbose</em> = (optional, default false) flag for debugging output</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">constDiffSmoothingProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">lowerLimit</span> <span class=\"mf\">0.1</span><span class=\"p\">;</span>\n    <span class=\"n\">upperLimit</span> <span class=\"mf\">1e10</span><span class=\"p\">;</span>\n    <span class=\"n\">smoothingLength</span> <span class=\"mf\">1500e-6</span><span class=\"p\">;</span>\n    <span class=\"n\">smoothingLengthReferenceField</span> <span class=\"mf\">9000e-6</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The “constDiffSmoothing” model is a basic smoothingModel model which reads a smoothing length scale being used for smoothing the exchange fields (voidfraction, Ksl, f if present). This model can be used for smoothing explicit force coupling fields, as well as implicit force coupling algorithms.\nSmoothing for reference fields is performed to “fill in” values in cells in which these reference fields are not specified. Values calculated in the cells (via Lagrangian-To-Euler mapping) are NOT changed! These reference fields are, e.g., the average particle velocity, which are not specified in all cells in case the flow is rather dilute.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>This model is tested in a limited number of flow situations.</p>\n</div></blockquote>\n<p>ATTENTION: In case a smoothing model is used in conjunction with “PimpleImEx” solvers, the fields “f” and “fSmooth” must be placed in the initial time directory! This is because zeroGradient boundary conditions for the fields “f” and “fSmooth” must be specified, otherwise the smoothing operation will give an Error.</p>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"smoothingModel.html\"><span class=\"doc\">smoothingModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/smoothingModel_noSmoothing.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>smoothingModel_noSmoothing command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">smoothingModel_noSmoothing command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>smoothingModel_noSmoothing command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"smoothingmodel-nosmoothing-command\">\n<span id=\"index-0\"></span><h1>smoothingModel_noSmoothing command<a class=\"headerlink\" href=\"#smoothingmodel-nosmoothing-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">smoothingModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">smoothingModel</span> <span class=\"n\">off</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The “noSmoothing” model is a dummy smoothingModel model which does no smoothing.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"smoothingModel.html\"><span class=\"doc\">smoothingModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel command<a class=\"headerlink\" href=\"#voidfractionmodel-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">model</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p>model = name of the voidfractionModel to be applied</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">centre</span><span class=\"p\">;</span>\n</pre></div>\n</div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Note</p>\n<p>This examples list might not be complete - please look for other models (voidfractionModel_XY) in this documentation.</p>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The voidfractionModel is the base class for models to represent the DEM particle’s volume in the CFD domain via a voidfraction field.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n<p><strong>Default:</strong> none.</p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_GaussVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_GaussVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_GaussVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_GaussVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-gaussvoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_GaussVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-gaussvoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">Gauss</span><span class=\"p\">;</span>\n<span class=\"n\">GaussProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">weight</span> <span class=\"n\">number3</span><span class=\"p\">;</span>\n    <span class=\"n\">porosity</span> <span class=\"n\">number4</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = maximum number of cells covered by a particle (search will fail when more than <em>number1</em> cells are covered by the particle)</p></li>\n<li><p><em>number2</em> = (optional, default 0.1) minimum limit for voidfraction</p></li>\n<li><p><em>number3</em> = (optional) scaling of the particle volume to account for porosity or agglomerations.</p></li>\n<li><p><em>number4</em> = (optional) diameter of the particle’s representation is artificially increased according to <em>number2</em> * Vparticle, volume remains unaltered!</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">Gauss</span><span class=\"p\">;</span>\n<span class=\"n\">GaussProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"mi\">1000</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.10</span><span class=\"p\">;</span>\n    <span class=\"n\">weight</span> <span class=\"mf\">1.</span><span class=\"p\">;</span>\n    <span class=\"n\">porosity</span> <span class=\"mf\">1.</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The Gauss voidFraction model is supposed to be used when a particle (or its representation) is bigger than a CFD cell. The voidfraction field is set in those cell whose centres are inside the particle. The volume is here distributed according to a Gaussian distribution.</p>\n<p>The region of influence of a particle can be increased artificially by “porosity”, which  blows up the particles, but keeps their volume (for voidfraction calculation) constant.</p>\n<p>The particle volume occupied in the CFD domain can be adjusted by the parameter “weight”, using Vparticle=dsphere^3*pi/6*weight.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a> , <a class=\"reference internal\" href=\"voidFractionModel_bigParticleVoidFraction.html\"><span class=\"doc\">bigParticle</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_IBVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_IBVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_IBVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_IBVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-ibvoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_IBVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-ibvoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">IB</span><span class=\"p\">;</span>\n<span class=\"n\">IBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleUpVol</span> <span class=\"n\">number3</span><span class=\"p\">;</span>\n    <span class=\"n\">checkPeriodicCells</span> <span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = maximum number of cells covered by a particle (search will fail when more than <em>number1</em> cells are covered by the particle)</p></li>\n<li><p><em>number2</em> = (optional, default 0.1) minimum limit for voidfraction</p></li>\n<li><p><em>number3</em> = diameter of the particle’s representation is artificially increased according to <em>number3</em> * Vparticle, volume remains unaltered!</p></li>\n<li><p><em>checkPeriodicCells</em> = (optional, default false) flag for considering the minimal distance to all periodic images of this particle</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">IB</span><span class=\"p\">;</span>\n<span class=\"n\">IBProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"mi\">1000</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.10</span><span class=\"p\">;</span>\n    <span class=\"n\">scaleUpVol</span> <span class=\"mf\">5.0</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The IB voidFraction model is supposed to be used when a particle (or its representation) is bigger than a CFD cell. The voidfraction field is set in those cell whose centres are inside the particle. The model is specially designed for cfdemSolverIB and creates a smooth transition of the voidfraction at the particle surface. Cells which are only partially covered by solid are marked by voidfraction values between 0 and 1 respectively.</p>\n<p>The region of influence of a particle can be increased artificially by “scaleUpVol”, which blows up the particles, but keeps their volume (for voidfraction calculation) constant.</p>\n<p>Code of this sub-model contributed by Alice Hager, JKU.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_bigParticleVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_bigParticleVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_bigParticleVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_bigParticleVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-bigparticlevoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_bigParticleVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-bigparticlevoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">bigParticle</span><span class=\"p\">;</span>\n<span class=\"n\">bigParticleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">weight</span> <span class=\"n\">number3</span><span class=\"p\">;</span>\n    <span class=\"n\">porosity</span> <span class=\"n\">number4</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = maximum number of cells covered by a particle (search will fail when more than <em>number1</em> cells are covered by the particle)</p></li>\n<li><p><em>number2</em> = (optional, default 0.1)  minimum limit for voidfraction</p></li>\n<li><p><em>number3</em> = (optional) scaling of the particle volume to account for porosity or agglomerations.</p></li>\n<li><p><em>number4</em> = (optional) diameter of the particle’s representation is artificially increased according to <em>number2</em> * Vparticle, volume remains unaltered!</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">bigParticle</span><span class=\"p\">;</span>\n<span class=\"n\">bigParticleProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">maxCellsPerParticle</span> <span class=\"mi\">1000</span><span class=\"p\">;</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.10</span><span class=\"p\">;</span>\n    <span class=\"n\">weight</span> <span class=\"mf\">1.</span><span class=\"p\">;</span>\n    <span class=\"n\">porosity</span> <span class=\"mf\">5.0</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The bigParticle voidFraction model is supposed to be used when a particle (or its representation) is bigger than a CFD cell. The voidfraction field is set in those cell whose centres are inside the particle which results in a stairstep representation of the bodies within the mesh (i.e. voidfraction is either 1 (fluid) of zero (solid)). For archiving accurate results, approx. 8 cells per particle diameter are necessary.</p>\n<p>The region of influence of a particle can be increased artificially by “porosity”, which  blows up the particles, but keeps their volume (for voidfraction calculation) constant.</p>\n<p>The particle volume occupied in the CFD domain can be adjusted by the parameter “weight”, using Vparticle=dsphere^3*pi/6*weight.</p>\n<p>Parts of this sub-model contributed by Alice Hager, JKU.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_centreVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_centreVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_centreVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_centreVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-centrevoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_centreVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-centrevoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">centre</span><span class=\"p\">;</span>\n<span class=\"n\">centreProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">volScale</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = (optional, default 0.1) minimum limit for voidfraction</p></li>\n<li><p><em>number2</em> = (optional, default 1) scaling (per type) of the particle volume to account for porosity or agglomerations.</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">centre</span><span class=\"p\">;</span>\n<span class=\"n\">centreProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.1</span><span class=\"p\">;</span>\n    <span class=\"n\">volScale</span> <span class=\"p\">(</span> <span class=\"mf\">1.</span> <span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The centre voidFraction model calculates the voidfraction in a CFD cell accounting for the volume of the particles whose centres are inside the cell.</p>\n<p>The particle volume occupied in the CFD domain can be adjusted by the parameter “volScale”, using Vparticle=dsphere^3*pi/6*volScale.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_dividedVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_dividedVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_dividedVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_dividedVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-dividedvoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_dividedVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-dividedvoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">divided</span><span class=\"p\">;</span>\n<span class=\"n\">dividedProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n    <span class=\"n\">interpolation</span><span class=\"p\">;</span>\n    <span class=\"n\">volScale</span> <span class=\"n\">number2</span><span class=\"p\">;</span>\n    <span class=\"n\">porosity</span> <span class=\"n\">number3</span><span class=\"p\">;</span>\n    <span class=\"n\">procBoundaryCorrection</span> <span class=\"n\">Switch1</span><span class=\"p\">;</span>\n    <span class=\"n\">verbose</span>  <span class=\"n\">bool1</span><span class=\"p\">;</span>\n    <span class=\"n\">cfdemUseOnly</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = (optional, default 0.1) minimum limit for voidfraction</p></li>\n<li><p><em>interpolation</em> = (optional, default false) flag to interpolate voidfraction to particle positions</p></li>\n<li><p><em>number2</em> = (optional, default 1) scaling (per type) of the particle volume to account for porosity or agglomerations.</p></li>\n<li><p><em>number3</em> = (optional) diameter of the particle’s representation is artificially increased according to <em>number2</em> * Vparticle, volume remains unaltered!</p></li>\n<li><p><em>Switch1</em> = (optional, default false) allow for correction at processor boundaries. This requires the use of engineIB and vice versa.</p></li>\n<li><p><em>bool1</em> = (optional, default false) flag for debugging output</p></li>\n<li><p><em>cfdemUseOnly</em> = optional flag, default false</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">divided</span><span class=\"p\">;</span>\n<span class=\"n\">dividedProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.2</span><span class=\"p\">;</span>\n    <span class=\"n\">volScale</span> <span class=\"p\">(</span> <span class=\"mf\">1.</span> <span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The divided voidFraction model is supposed to be used when a particle (or its representation) is in the size range of a CFD cell. The particle has radius R and it’s volume is divided in 29 non-overlapping regions of equal volume. The centroids of these volumes are then used to reproduce each volume. The first volume is a sphere with the center coinciding with the particle center. Radius of this subsphere can be found as follows:</p>\n<img alt=\"_images/voidfractionModel_divided_pic2.png\" class=\"align-center\" src=\"_images/voidfractionModel_divided_pic2.png\" />\n<p>The rest volume is a spherical layer that must is divided in 2 layers of equal volume. Position of the border between these two spherical layers in radial direction can be easily obtained:</p>\n<img alt=\"_images/voidfractionModel_divided_pic3.png\" class=\"align-center\" src=\"_images/voidfractionModel_divided_pic3.png\" />\n<p>Each of these spherical layers is later divided in 14 elements of equal volume. Position of the centroid point in radial direction of each volume in the first spherical layer is as follows</p>\n<img alt=\"_images/voidfractionModel_divided_pic4.png\" class=\"align-center\" src=\"_images/voidfractionModel_divided_pic4.png\" />\n<p>Similarly, for the second spherical layer remembering that the external radius is the particle radius:</p>\n<img alt=\"_images/voidfractionModel_divided_pic5.png\" class=\"align-center\" src=\"_images/voidfractionModel_divided_pic5.png\" />\n<p>The region of influence of a particle can be increased artificially by “porosity”, which  blows up the particles, but keeps their volume (for voidfraction calculation) constant.</p>\n<p>The particle volume occupied in the CFD domain can be adjusted by the parameter “volScale”, using</p>\n<img alt=\"_images/voidfractionModel_divided_pic6.png\" class=\"align-center\" src=\"_images/voidfractionModel_divided_pic6.png\" />\n<p>In the basic implementation of solvers, the void fraction is calculated based on all particles. Depending on the solver used, the void fraction calculation is also performed for a certain type of particles.\nThe void fraction calculation is based on a three-step approach (reset, set and interpolate), i.e., the void fraction is time interpolated from a previous and a next void fraction field. Appropriate names for these fields have to be specified in the sub-dictionaries voidFracFieldNamesPrev and voidFracFieldNamesNext in the couplingProperties dictionary.</p>\n<p>If the particleShapeType multisphere is selected, caluclations are performed for multisphere particles. In this operation mode additional input for DHc or area per particle type may be required. Without this input the multisphere variant may fail.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_noVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_noVoidFractionVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_noVoidFractionVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_noVoidFractionVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-novoidfractionvoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_noVoidFractionVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-novoidfractionvoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<p>voidfractionModel noVoidFraction;</p>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<p>voidfractionModel noVoidFraction;</p>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The noVoidFraction voidFraction model is a dummy model and has no physical meaning.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>none.</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_build/html/voidFractionModel_trilinearVoidFraction.html",
    "content": "<!DOCTYPE html>\n<html class=\"writer-html5\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" /><meta name=\"generator\" content=\"Docutils 0.17.1: http://docutils.sourceforge.net/\" />\n\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>voidfractionModel_trilinearVoidFraction command &mdash; CFDEMcoupling 3.8.1 documentation</title>\n      <link rel=\"stylesheet\" href=\"_static/pygments.css\" type=\"text/css\" />\n      <link rel=\"stylesheet\" href=\"_static/css/theme.css\" type=\"text/css\" />\n  \n        <script data-url_root=\"./\" id=\"documentation_options\" src=\"_static/documentation_options.js\"></script>\n        <script src=\"_static/jquery.js\"></script>\n        <script src=\"_static/underscore.js\"></script>\n        <script src=\"_static/doctools.js\"></script>\n    <script src=\"_static/js/theme.js\"></script>\n    <link rel=\"index\" title=\"Index\" href=\"genindex.html\" />\n    <link rel=\"search\" title=\"Search\" href=\"search.html\" /> \n</head>\n\n<body class=\"wy-body-for-nav\"> \n  <div class=\"wy-grid-for-nav\">\n    <nav data-toggle=\"wy-nav-shift\" class=\"wy-nav-side\">\n      <div class=\"wy-side-scroll\">\n        <div class=\"wy-side-nav-search\" >\n            <a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"> CFDEMcoupling\n          </a>\n              <div class=\"version\">\n                3.8.1\n              </div>\n<div role=\"search\">\n  <form id=\"rtd-search-form\" class=\"wy-form\" action=\"search.html\" method=\"get\">\n    <input type=\"text\" name=\"q\" placeholder=\"Search docs\" />\n    <input type=\"hidden\" name=\"check_keywords\" value=\"yes\" />\n    <input type=\"hidden\" name=\"area\" value=\"default\" />\n  </form>\n</div>\n        </div><div class=\"wy-menu wy-menu-vertical\" data-spy=\"affix\" role=\"navigation\" aria-label=\"Navigation menu\">\n              <!-- Local TOC -->\n              <div class=\"local-toc\"><ul>\n<li><a class=\"reference internal\" href=\"#\">voidfractionModel_trilinearVoidFraction command</a><ul>\n<li><a class=\"reference internal\" href=\"#syntax\">Syntax</a></li>\n<li><a class=\"reference internal\" href=\"#examples\">Examples</a></li>\n<li><a class=\"reference internal\" href=\"#description\">Description</a></li>\n<li><a class=\"reference internal\" href=\"#restrictions\">Restrictions</a></li>\n<li><a class=\"reference internal\" href=\"#related-commands\">Related commands</a></li>\n</ul>\n</li>\n</ul>\n</div>\n        </div>\n      </div>\n    </nav>\n\n    <section data-toggle=\"wy-nav-shift\" class=\"wy-nav-content-wrap\"><nav class=\"wy-nav-top\" aria-label=\"Mobile navigation menu\" >\n          <i data-toggle=\"wy-nav-top\" class=\"fa fa-bars\"></i>\n          <a href=\"CFDEMcoupling_Manual.html\">CFDEMcoupling</a>\n      </nav>\n\n      <div class=\"wy-nav-content\">\n        <div class=\"rst-content\">\n          <div role=\"navigation\" aria-label=\"Page navigation\">\n  <ul class=\"wy-breadcrumbs\">\n      <li><a href=\"CFDEMcoupling_Manual.html\" class=\"icon icon-home\"></a> &raquo;</li>\n      <li>voidfractionModel_trilinearVoidFraction command</li>\n      <li class=\"wy-breadcrumbs-aside\">\n      </li>\n  </ul>\n  <hr/>\n</div>\n          <div role=\"main\" class=\"document\" itemscope=\"itemscope\" itemtype=\"http://schema.org/Article\">\n           <div itemprop=\"articleBody\">\n             \n  <section id=\"voidfractionmodel-trilinearvoidfraction-command\">\n<span id=\"index-0\"></span><h1>voidfractionModel_trilinearVoidFraction command<a class=\"headerlink\" href=\"#voidfractionmodel-trilinearvoidfraction-command\" title=\"Permalink to this headline\"></a></h1>\n<section id=\"syntax\">\n<h2>Syntax<a class=\"headerlink\" href=\"#syntax\" title=\"Permalink to this headline\"></a></h2>\n<p>Defined in couplingProperties dictionary.</p>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">trilinear</span><span class=\"p\">;</span>\n<span class=\"n\">trilinearProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"n\">number1</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n<ul class=\"simple\">\n<li><p><em>number1</em> = (optional, default 0.1) minimum limit for voidfraction</p></li>\n</ul>\n</section>\n<section id=\"examples\">\n<h2>Examples<a class=\"headerlink\" href=\"#examples\" title=\"Permalink to this headline\"></a></h2>\n<div class=\"highlight-default notranslate\"><div class=\"highlight\"><pre><span></span><span class=\"n\">voidfractionModel</span> <span class=\"n\">trilinear</span><span class=\"p\">;</span>\n<span class=\"n\">trilinearProps</span>\n<span class=\"p\">{</span>\n    <span class=\"n\">alphaMin</span> <span class=\"mf\">0.3</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</pre></div>\n</div>\n</section>\n<section id=\"description\">\n<h2>Description<a class=\"headerlink\" href=\"#description\" title=\"Permalink to this headline\"></a></h2>\n<p>The trilinear voidFraction model is supposed to be used when a particle (or its representation) is in the size range of a CFD cell. The particle’s volume is distributed over 8 neighbouring cell centres usind trilinear interpolation. This allows for a very smooth transition of particle volume when a particle travels from one cell to another cell.</p>\n</section>\n<section id=\"restrictions\">\n<h2>Restrictions<a class=\"headerlink\" href=\"#restrictions\" title=\"Permalink to this headline\"></a></h2>\n<blockquote>\n<div><p>The model works only for a structured mesh with equal cubic cells and a clean x/y/z parallel distribution of the cells. WARNING: the alphaMin parameter is not yet considered in the model!!!</p>\n</div></blockquote>\n</section>\n<section id=\"related-commands\">\n<h2>Related commands<a class=\"headerlink\" href=\"#related-commands\" title=\"Permalink to this headline\"></a></h2>\n<p><a class=\"reference internal\" href=\"voidFractionModel.html\"><span class=\"doc\">voidfractionModel</span></a></p>\n</section>\n</section>\n\n\n           </div>\n          </div>\n          <footer>\n\n  <hr/>\n\n  <div role=\"contentinfo\">\n    <p>&#169; Copyright 2025, DCS Computing GmbH.</p>\n  </div>\n\n  Built with <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> using a\n    <a href=\"https://github.com/readthedocs/sphinx_rtd_theme\">theme</a>\n    provided by <a href=\"https://readthedocs.org\">Read the Docs</a>.\n   \n\n</footer>\n        </div>\n      </div>\n    </section>\n  </div>\n  <script>\n      jQuery(function () {\n          SphinxRtdTheme.Navigation.enable(false);\n      });\n  </script> \n\n</body>\n</html>"
  },
  {
    "path": "doc/_static/css/theme_CFDEMcoupling.css",
    "content": "/** rtd_theme improved for CFDEMcoupling **/\n\n@import 'theme.css';\n\n/* add upper roman enumerations */\n.wy-plain-list-upperroman,.rst-content .section ol,.rst-content ol.upperroman,article ol{\nlist-style:upper-roman;\nline-height:24px;\nmargin-bottom:24px}\n.wy-plain-list-upperroman li,.rst-content .section ol li,.rst-content ol.upperroman li,article ol li{\nlist-style:upper-roman;\nmargin-left:24px}\n.wy-plain-list-upperroman li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.upperroman li p:last-child,article ol li p:last-child{\nmargin-bottom:0}\n.wy-plain-list-upperroman li ul,.rst-content .section ol li ul,.rst-content ol.upperroman li ul,article ol li ul{\nmargin-bottom:0}\n.wy-plain-list-upperroman li ul li,.rst-content .section ol li ul li,.rst-content ol.upperroman li ul li,article ol li ul li{\nlist-style:disc}\n"
  },
  {
    "path": "doc/release-notes-PUBLIC-3.8.0.txt",
    "content": "\n===============================================================\nRelease notes for PUBLIC, version 3.8.0 \n\nsrc/lagrangian/cfdemParticle/subModels/IOModel/trackIO/trackIO.C |  Josef Kerbl (DCS) reworked the trackIO IOModel to transfer the LIGGGHTS® particle IDs to the CFDEMcoupling output \nsrc/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C |  Josef Kerbl (DCS) changed the default maximum values of CFL and particle CFL numbers to 1 \napplications/solvers/cfdemSolverIB/cfdemSolverIB.C |  Josef Kerbl (DCS) added compatibility for non-Newtonian viscosity models \napplications/solvers/cfdemSolverPiso/cfdemSolverPiso.C |  Josef Kerbl (DCS) added compatibility for non-Newtonian viscosity models \napplications/solvers/cfdemSolverPisoSTM/cfdemSolverPisoSTM.C |  Josef Kerbl (DCS) added compatibility for non-Newtonian viscosity models \napplications/solvers/cfdemSolverPisoScalar/cfdemSolverPisoScalar.C |  Josef Kerbl (DCS) added compatibility for non-Newtonian viscosity models \ntutorials/.gitignore |  Alice Hager (DCS) moved all blockMeshDict files from constant/polyMesh to system \ndoc/_build/html/liggghtsCommandModel_execute.html |  Alice Hager (DCS) updated the documentation of new features and keywords (handling of numbers and labels, defined keywords, noBlanks, ...) \ndoc/_build/html/liggghtsCommandModel_setDEMGravity.html |  Alice Hager (DCS) added keyword unfix to documentation \ndoc/_build/html/CFDEMcoupling_Manual.html |  Alice Hager (DCS) added information about the solveFlow keyword. \napplications/solvers/cfdemSolverIB/cfdemSolverIB.C |  Alice Hager (DCS) added the solveFlow keyword \ncfdemCloudIB.C |  Alice Hager (DCS) removed the DEMTorques_ from the getDEMdata function (bugfix) \nsrc/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C |  Josef Kerbl (DCS) removed the unused coupleForce_ switch \nsrc/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C |  Josef Kerbl (DCS) removed the unused coupleForce_ switch \nsrc/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.H |  Josef Kerbl (DCS) removed the unused coupleForce_ switch \nsrc/lagrangian/cfdemParticle/subModels/forceModel/noDrag/noDrag.C |  Josef Kerbl (DCS) removed the unused coupleForce_ switch \nsrc/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H |  Josef Kerbl (DCS) elevated the warning of non-matching DEM-timestep, couplingInterval and CFD-timestep to error \ncheckCouplingInterval.C |  Josef Kerbl (DCS) added checkCG to forceModels missing this \nfieldStore.C |  Josef Kerbl (DCS) added checkCG to forceModels missing this \nfieldTimeAverage.C |  Josef Kerbl (DCS) added checkCG to forceModels missing this \nnoDrag.C |  Josef Kerbl (DCS) added checkCG to forceModels missing this \nvolWeightedAverage.C |  Josef Kerbl (DCS) added checkCG to forceModels missing this \nArchimedes.C |  Josef Kerbl (DCS) added support for typeSpecificCG to some force models \ncheckCouplingInterval.C |  Josef Kerbl (DCS) added support for typeSpecificCG to some force models \ncfdemCloud.C |  Josef Kerbl (DCS) changed the default value of cgWarnOnly to false \noneWayVTK.C |  Christoph Goniva (DCS) bugfix to enable correct reading of v field (thx to Moritz Höfert) \napplications/utilities/cfdemPostproc/cfdemPostproc.C |  Christoph Goniva (DCS) enable calculating an writing Us field (thx to Moritz Höfert) \nmeanSupVelocityForce.C |  Christoph Goniva (DCS) enable using cellZones \nforceSubModel.C |  Josef Kerbl (DCS) added check, if scaleDrag > 0 \nbashrc |  Josef Kerbl (DCS) added support to automatically compile LIGGGHTS in debug mode for the Makefile.auto, if WM_COMPILE_OPTION is set to Debug \ncshrc |  Josef Kerbl (DCS) added support to automatically compile LIGGGHTS in debug mode for the Makefile.auto, if WM_COMPILE_OPTION is set to Debug \nfunctions.sh |  Josef Kerbl (DCS) added support to automatically compile LIGGGHTS in debug mode for the Makefile.auto, if WM_COMPILE_OPTION is set to Debug \ncfdemSolverPisoSTM.C |  Christoph Goniva (DCS) added fvOptions and fixedFluxPressureBC for 5.x \ncfdemSolverPiso.C |  Alice Hager (DCS) ported 5.x \ncfdemSolverPisoSTM.C |  Christoph Goniva (DCS) - fvOptions added \napplications/utilities/cfdemPostproc/cfdemPostproc.C |  Alice Hager (DCS) ported 5.x \nmeanSupVelocityForce.C |  Alice Hager (DCS) ported 5.x & major revision \neulerianScalarField.C |  Alice Hager (DCS) ported 5.x \ncfdemCloud.C |  Alice Hager (DCS) ported 5.x \ncfdemCloud.C |  Christoph Goniva (DCS) minor revision \ncfdemCloudIB.C |  Alexander Podlozhnyuk (DCS) adaptions for periodic bc \nIOModel.C |  Josef Kerbl (DCS) - revision ofor 5.x \ndataExchangeModel.C |  Christoph Goniva (DCS) improved calculation of time step fraction \noneWayVTK.C |  Josef Kerbl (DCS) bugfix \nLaEuScalarTemp.C |  Alexander Podlozhnyuk (DCS) extension for compressible flow \nMeiLift.H |  Stefan Radl (TUG) reference added \ncheckCouplingInterval.C |  Christoph Goniva (DCS) consider scaleDia \ncheckCouplingInterval.C |  Christoph Goniva (DCS) default maxCFL=1 \ncheckCouplingInterval.C |  Christoph Goniva (DCS) default maxPCFL=1 \nforceSubModel.C |  Christoph Goniva (DCS) new option scaleDH \ngradPForce.C |  Christoph Goniva (DCS) verbose option \nnoDrag.C |  Christoph Goniva (DCS) bugfix \nparticleCellVolume.C |  Josef Kerbl (DCS) added header to output \nscalarGeneralExchange.C |  Stefan Radl (TUG) major revisions \nviscForce.C |  Christoph Goniva (DCS) verbose option \nengineSearch.C |  Josef Kerbl (DCS) bugfix for MS use \nengineSearchIB.C |  Alexander Podlozhnyuk (DCS) Stefan Radl (TUG) improved periodic \nstandardSearch.C |  Josef Kerbl (DCS) bugfix for MS use \nIBVoidFraction.C |  Alexander Podlozhnyuk (DCS) Stefan Radl (TUG) improved periodic \n===============================================================\n\n"
  },
  {
    "path": "doc/release-notes-PUBLIC-3.8.1.txt",
    "content": "\n===============================================================\nRelease notes for PUBLIC, version 3.8.1\n\nUpdated CFDEMcoupling-PUBLIC to be compatible with OpenFOAM-6 ensuring\nfunctionality on Ubuntu 22.04 and 24.04.\n\nThis updated version and all tutorials are still compatible to LIGGGHTS-PUBLIC 3.8.0\n\nWhile this update contains some bugfixes and improvements, the main intention of this\nupdate is keeping CFDEMcoupling usable also on newer systems where the compilation of\nolder OpenFOAM versions may prove difficult.\n\nNote: On Ubuntu 24.04 set / export the environment variable WM_CXX_STD=c++14\nbefore starting the OpenFOAM-6 compilation.\n===============================================================\n\n"
  },
  {
    "path": "src/eulerian/fvOptionsCFDEM/Make/files",
    "content": "derivedSources=sources/derived\n\n$(derivedSources)/meanSupVelocityForce/meanSupVelocityForce.C\n\nLIB = $(CFDEM_LIB_DIR)/libfvOptionsCFDEM\n"
  },
  {
    "path": "src/eulerian/fvOptionsCFDEM/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\nsinclude $(RULES)/mplib$(WM_MPLIB)\n\nGIT_VERSION := $(shell git describe --dirty --always --tags)\nPFLAGS+= -DGITVERSION=\\\"$(GIT_VERSION)\\\"\nPFLAGS+= -DDEBUGFLAG=\\\"$(DEBUG)\\\"\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\n\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/sampling/lnInclude \\\n    -I$(LIB_SRC)/fvOptions/lnInclude \\\n    -I$(CFDEM_OFVERSION_DIR) \\\n\n\nLIB_LIBS = \\\n     $(PLIBS) \\\n    -lfiniteVolume \\\n    -lsampling \\\n    -lmeshTools \\\n    -lfvOptions\n"
  },
  {
    "path": "src/eulerian/fvOptionsCFDEM/sources/derived/meanSupVelocityForce/meanSupVelocityForce.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 2011 OpenFOAM Foundation\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"meanSupVelocityForce.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n#include \"DimensionedField.H\"\n#include \"fvMatrices.H\"\n\n// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //\n\nnamespace Foam\n{\nnamespace fv\n{\n    defineTypeNameAndDebug(meanSupVelocityForce, 0);\n\n    addToRunTimeSelectionTable\n    (\n        option,\n        meanSupVelocityForce,\n        dictionary\n    );\n}\n}\n\n// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nFoam::fv::meanSupVelocityForce::meanSupVelocityForce\n(\n    const word& sourceName,\n    const word& modelType,\n    const dictionary& dict,\n    const fvMesh& mesh\n)\n:\n    meanVelocityForce(sourceName, modelType, dict, mesh),\n    twoPhase_( coeffs_.lookupOrDefault(\"twoPhase\",false) ),\n    alpha_\n    (   \n        IOobject\n        (\n            \"voidfractionPrev\",\n            mesh_.time().timeName(),\n            mesh_,\n            IOobject::NO_READ,//MUST_READ,\n            IOobject::NO_WRITE\n        ),\n        mesh_,\n        dimensionedScalar(\"ones\", dimensionSet(0,0,0,0,0), 1)\n    ),\n    coupled_( coeffs_.lookupOrDefault(\"coupled\",false) ),\n    voidfraction_\n    (   \n        IOobject\n        (\n            \"voidfractionPrev\",\n            mesh_.time().timeName(),\n            mesh_,\n            IOobject::NO_READ,//MUST_READ,\n            IOobject::NO_WRITE\n        ),\n        mesh_,\n        dimensionedScalar(\"ones\", dimensionSet(0,0,0,0,0), 1)\n    ),\n    modelName_(modelType),\n    alphaMin_(coeffs_.lookupOrDefault(\"alphaMin\",0.0))\n\n{\n    Warning << \"THE FVOPTION meanSupVelocityForce has not been tested/validated!!! \" << endl;\n}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid Foam::fv::meanSupVelocityForce::correct(volVectorField& U)\n{\n    if (twoPhase_)\n    {\n        word alphaName = coeffs_.lookup(\"alphaField\");\n        alpha_ = mesh_.lookupObject<volScalarField>(alphaName);\n    }\n\n    if (coupled_)\n    {\n        word voidfractionName = coeffs_.lookup(\"voidfractionField\");\n        voidfraction_ = mesh_.lookupObject<volScalarField>(voidfractionName);\n    }\n    \n    // making sure that alpha is only set almost-only fluid regions if desired\n    forAll(alpha_,cellI)\n    {\n        if(alpha_[cellI]<alphaMin_)\n            alpha_[cellI]=0;\n    }\n\n    const scalarField& rAU = rAPtr_().internalField();\n\n    // Integrate flow variables over cell set\n    scalar rAUave = 0.0;\n    const scalarField& cv = mesh_.V();\n    scalar totV = 0.0;\n    forAll(cells_,i)\n    {\n        label cellI = cells_[i];\n        scalar volCell = cv[cellI];\n        totV += volCell*alpha_[cellI]; \n        rAUave += rAU[cellI]*volCell*alpha_[cellI]; \n    }\n\n    // Collect accross all processors\n    reduce(rAUave, sumOp<scalar>());\n    reduce(totV, sumOp<scalar>());\n    V_=totV;\n\n    // Volume averages\n    rAUave /= V_;\n\n    scalar magUbarAve = this->magUbarAve(U);\n\n    // Calculate the pressure gradient increment needed to adjust the average\n    // flow-rate to the desired value\n    dGradP_ = relaxation_*(mag(Ubar_) - magUbarAve)/rAUave;\n\n    // Apply correction to velocity field\n    if (modelName_==\"B\" || modelName_==\"Bfull\")\n    {\n        forAll(cells_, i)\n        {\n            label cellI = cells_[i];\n            U[cellI] += flowDir_*rAU[cellI]*dGradP_*alpha_[cellI];\n        }\n    }\n    else\n    {\n        forAll(cells_, i)\n        {\n            label cellI = cells_[i];\n            U[cellI] += voidfraction_[cellI]*flowDir_*rAU[cellI]*dGradP_*alpha_[cellI];\n        }\n    }\n\n    scalar gradP = gradP0_ + dGradP_;\n\n    Info<< \"Pressure gradient source: uncorrected Ubar = \" << magUbarAve\n        << \", pressure gradient = \" << gradP << endl;\n\n    writeProps(gradP);\n\n    Warning << \"Pressure gradient force is neglected in this model!!\" << endl; \n\n    // The following lines would compensate the error that occurs due to the splitting \n    // of the pressure gradient. However, the particleCloud_ object is currently not\n    // accessible here. \n    /*scalar ds(0.0);\n    scalar Vs(0.0);\n    label cellI=0;\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            cellI = particleCloud_.cellIDs()[index][0];\n            \n            if (cellI > -1) // particle found on this processor\n            {\n                //Calc the particle volume\n                ds = 2*particleCloud_.radius(index);\n                Vs = ds*ds*ds*M_PI/6;\n                \n                // set force on particle\n                for(int j=0;j<3;j++) \n                {\n                    // calc particle's static pressure gradient force\n                    particleCloud_.DEMForces()[index][j] -= Vs*gradP*flowDir_[j];\n                }\n            }\n    }*/\n\n\n}\n\nvoid Foam::fv::meanSupVelocityForce::addSup\n(\n    fvMatrix<vector>& eqn,\n    const label fieldI\n)\n{\n    DimensionedField<vector, volMesh> Su\n    (\n        IOobject\n        (\n            name_ + fieldNames_[fieldI] + \"Sup\",\n            mesh_.time().timeName(),\n            mesh_,\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        mesh_,\n        dimensionedVector(\"zero\", eqn.dimensions()/dimVolume, vector::zero)\n    );\n\n    scalar gradP = gradP0_ + dGradP_;\n\n    if (modelName_==\"B\" || modelName_==\"Bfull\")\n    {\n        UIndirectList<vector>(Su, cells_) = flowDir_*gradP;\n    }\n    else\n    {\n        //UIndirectList<vector>(Su, cells_) = voidfraction_*flowDir_*gradP*alpha_; // org version does not work for zones\n\n        UIndirectList<vector>(Su, cells_) = vector::zero;\n        label cellI(-1);\n        forAll(cells_,i)\n        {\n            cellI = cells_[i];\n            Su[cellI] = voidfraction_[cellI]*flowDir_*gradP*alpha_[cellI];\n        }\n    }\n\n    eqn += Su;\n\n}\n\nFoam::scalar Foam::fv::meanSupVelocityForce::magUbarAve\n(\n    const volVectorField& U\n) const\n{\n    scalar magUbarAve = 0.0;\n\n    const scalarField& cv = mesh_.V();\n    forAll(cells_, i)\n    {\n        label cellI = cells_[i];\n        scalar volCell = cv[cellI];\n        magUbarAve += (flowDir_ & U[cellI])*volCell*alpha_[cellI]*voidfraction_[cellI];\n    }\n\n    reduce(magUbarAve, sumOp<scalar>());\n\n    magUbarAve /= V_;\n\n    return magUbarAve;\n}\n\n\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/fvOptionsCFDEM/sources/derived/meanSupVelocityForce/meanSupVelocityForce.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 2011 OpenFOAM Foundation\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nDescription\n    This code is based on meanSupVelocity model of OpenFOAM 3.0.x\n    It is extended to account for the presence of a particle phase.\n\n    Calculates and applies the force necessary to maintain the specified mean\n    velocity.\n\n    Note: Currently only handles kinematic pressure (incompressible solvers).\n\n    \\heading Source usage\n    Example usage:\n    \\verbatim\n    meanSupVelocityForceCoeffs\n    {\n        selectionMode   all;                    // Apply force to all cells\n        fieldNames      (U);                    // Name of velocity field\n        Ubar            (10.0 0 0);             // Desired mean velocity\n        relaxation      0.2;                    // Optional relaxation factor\n    }\n    \\endverbatim\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef meanSupVelocityForce_H\n#define meanSupVelocityForce_H\n\n#include \"meanVelocityForce.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\nnamespace fv\n{\n\n/*---------------------------------------------------------------------------*\\\n               Class meanSupVelocityForce Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass meanSupVelocityForce\n:\n    public meanVelocityForce\n{\nprotected:\n\n    // Protected data\n\n        const bool twoPhase_;\n\n        volScalarField alpha_;\n\n        const bool coupled_;\n\n\t    volScalarField voidfraction_;\n\n        const word modelName_;\n\n        const scalar alphaMin_;\n\n    // Protected Member Functions\n\n        virtual scalar magUbarAve(const volVectorField& U) const;\n\nprivate:\n\n    // Private Member Functions\n\n        //- Disallow default bitwise copy construct\n        meanSupVelocityForce(const meanSupVelocityForce&);\n\n        //- Disallow default bitwise assignment\n        void operator=(const meanSupVelocityForce&);\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"meanSupVelocityForce\");\n\n\n    // Constructors\n\n        //- Construct from explicit source name and mesh\n        meanSupVelocityForce\n        (\n            const word& sourceName,\n            const word& modelType,\n            const dictionary& dict,\n            const fvMesh& mesh\n        );\n\n\n    // Member Functions\n\n        // Evaluate\n\n        virtual void correct(volVectorField& U);\n\n        virtual void addSup\n        (\n            fvMatrix<vector>& eqn,\n            const label fieldI\n        );\n\n        // IO\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace fv\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/Make/files",
    "content": "scalarTransportModel/scalarTransportModel.C\nscalarTransportModel/newScalarTransportModel.C\n\n/*Sub-Level*/\ntemperatureModel/temperatureModel.C\ngeneralManual/generalManual.C\nnoTransport/noTransport.C\ngeneralPhaseChange/generalPhaseChange.C\n\n/*Fields*/\neulerianScalarField/eulerianScalarField.C\neulerianScalarField/newEulerianScalarField.C\n\n/*PhaseChangeModels*/\nphaseChangeModel/phaseChangeModel.C\nphaseChangeModel/newPhaseChangeModel.C\n\nLIB = $(CFDEM_LIB_DIR)/libscalarTransportModelsCFDEM\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\nsinclude $(RULES)/mplib$(WM_MPLIB)\n\nGIT_VERSION := $(shell git describe --dirty --always --tags)\nPFLAGS+= -DGITVERSION=\\\"$(GIT_VERSION)\\\"\nPFLAGS+= -DDEBUGFLAG=\\\"$(DEBUG)\\\"\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\n\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n     $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/transportModels \\\n    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/lnInclude \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/sampling/lnInclude \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR)\n\nLIB_LIBS = \\\n    -L$(CFDEM_LIB_DIR)\\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lincompressibleTransportModels \\\n    -lfiniteVolume \\\n    -lmeshTools \\\n    -lsampling \\\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/eulerianScalarField/eulerianScalarField.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"eulerianScalarField.H\"\n#include \"OFversion.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(eulerianScalarField, 0);\n\ndefineRunTimeSelectionTable(eulerianScalarField, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\neulerianScalarField::eulerianScalarField\n(\n    const dictionary&   dict,\n    cfdemCloud&         sm,\n    word                modelType,\n    int                 modelID\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    fieldName_(modelType),\n    cpVolumetricFieldName_(dict_.lookupOrDefault<word>(\"cpVolumetricFieldName\", \"na\")),\n    cpVolumetric_(dict_.lookupOrDefault<scalar>(\"cpVolumetric\", 0.0)),\n    updateMixtureProperties_(dict_.lookupOrDefault<bool>(\"updateMixtureProperties\", false)),\n    rho_(dict_.lookupOrDefault<scalar>(\"rho\"+fieldName_, -1)),\n    rhoCarrier_(dict_.lookupOrDefault<scalar>(\"rhoCarrier\", -1)),\n    cp_(dict_.lookupOrDefault<scalar>(\"cp\"+fieldName_, -1)),\n    cpCarrier_(dict_.lookupOrDefault<scalar>(\"cpCarrier\", -1)),\n    m_\n    (   IOobject\n        (\n            fieldName_,\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh()\n    ),\n    mSource_\n    (   IOobject\n        (\n            fieldName_+\"Source\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh()\n    ),\n    mSourceKImpl_\n    (   IOobject\n        (\n            fieldName_+\"SourceKImpl\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        0.0*mSource_ /( m_ + dimensionedScalar(\"dummy\", m_.dimensions(), 1e-32) ) //initi with zero\n    ),\n    fieldType_(\"undefined\")\n    #ifndef versionExt32\n    ,fvOptions_(sm.mesh())\n    #endif\n{\n\n\n    if ( m_.dimensions() == dimensionSet(0, 0, 0, 1, 0) )\n    {\n        speciesID_ = -1;\n        fieldType_ = \"temperature\";\n        Info << \"eulerianScalarField:: found a Temperature field! \" << endl;\n    }\n    else\n    {\n        speciesID_ = modelID;\n        fieldType_ = \"species\";\n        Info << \"eulerianScalarField:: found a species field, will assign speciesID: \" \n             << speciesID_\n             << endl;\n    }\n\n    #ifndef versionExt32\n    fvOptions_.reset(dict.subDict(\"fvOptions\"+fieldName_));\n    #endif\n\n    if( (cpVolumetricFieldName_==\"na\"||!updateMixtureProperties_) && cpVolumetric_<=0.0)\n        FatalError <<\"You did not specify a cpVolumetricFieldName (or you do not updateMixtureProperties) and also cpVolumetric is zero (or negative)! Either provide the field name, or set cpVolumetric to a reasonable value. \\n\" \n                   << abort(FatalError);    \n\n    if(speciesID_>-1 && updateMixtureProperties_ && (rho_<=0 || cp_<=0) )\n        FatalError <<\"You like to update the phase properties, but density and cp of the eulerianScalarField with name '\" \n                   << fieldName_\n                   <<\"' are not specified or zero. \\n\" \n                   << abort(FatalError);    \n\n    if(speciesID_>-1 && updateMixtureProperties_ && (rhoCarrier_<=0 || cpCarrier_<=0) )\n        FatalError <<\"You like to update the phase properties, but density and cp of the carrier phase are not specified or zero \\n\" \n                   << abort(FatalError);    \n                   \n    //Report options for cp \n    if(fieldType_==\"temperature\")\n    {\n        if(cpVolumetric_!=0.0 && cpVolumetricFieldName_!=\"na\")\n        FatalError <<\"eulerianScalarField:: You have specified 'cpVolumetric' and 'cpVolumetricFieldName' in a dictionary in '/constant'. This might be confusing. Please unset one of these two inputs to avoid confusion. \\n\" \n                   << abort(FatalError);    \n\n        if(cpVolumetricFieldName_==\"na\" || !updateMixtureProperties_) //use also if mixture properties are not updated\n            Info << \"eulerianScalarField:: will use the following FIXED VOLUMETRIC HEAT CAPACITY: \" \n                 << cpVolumetric_ << \" [J/K/m³]\" << endl;\n        else\n            Info << \"eulerianScalarField:: will use the a SPATIALLY-VARAIBLE VOLUMETRIC HEAT CAPACITY with name: \" << cpVolumetricFieldName_ << endl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\neulerianScalarField::~eulerianScalarField()\n{}\n\n// * * * * * * * * * * * * * * * * Member Fct  * * * * * * * * * * * * * * * //\n\n// ************************************************************\nvoid eulerianScalarField::update(surfaceScalarField phi, volScalarField voidfraction, volScalarField nuEff, scalar Sc, bool limitDiffusion) const \n{\n    scalar oneByCpVolumetric = 1./(cpVolumetric_+SMALL);\n    //Normalize source in case we have a temperature field\n    if(fieldType_==\"temperature\")\n    {\n        if(cpVolumetricFieldName_==\"na\" || !updateMixtureProperties_) //use also if mixture properties are not updated\n        {\n            mSource_ *= oneByCpVolumetric;\n            mSourceKImpl_ *= oneByCpVolumetric;\n        }\n        else\n        {\n            const volScalarField& cpVolumetricField_(particleCloud_.mesh().lookupObject<volScalarField> (cpVolumetricFieldName_));\n\n            #if defined(version40) || defined(versionv1612plus)\n            mSource_.primitiveFieldRef() /= cpVolumetricField_.primitiveField()+SMALL;\n            mSourceKImpl_.primitiveFieldRef() /= cpVolumetricField_.primitiveField()+SMALL;\n            #else\n            mSource_.internalField() /= cpVolumetricField_.internalField()+SMALL;\n            mSourceKImpl_.internalField() /= cpVolumetricField_.internalField()+SMALL;\n            #endif\n        }\n    }\n\n    word divScheme(\"div(phi,m)\");\n    word laplacianScheme(\"laplacian(D,m)\");\n\n    if( speciesID_== -1)\n    {\n        divScheme       = \"div(phi,T)\";\n        laplacianScheme = \"laplacian((DT*voidfraction),T)\";\n    }\n\n    // calc diffusionCoeff field\n    volScalarField a=nuEff/Sc*voidfraction;\n    if(limitDiffusion)\n    {\n        forAll(a,cellI)\n            if(voidfraction[cellI] <2*SMALL)\n                a[cellI]=0.;\n    }\n\n    // solve scalar transport equation\n    fvScalarMatrix mEqn\n    (\n\n       fvm::ddt(voidfraction, m_)               //This is the material derivative in a modified form\n     - fvm::Sp(fvc::ddt(voidfraction), m_)      //Needed since phi is (U_face * voidfraction)!\n     + fvm::div(phi, m_, divScheme)             //This phi must be SUPERFICIAL! (i.e., U_face * voidfraction)!\n     - fvm::Sp(fvc::div(phi), m_)\n\n     ==\n\n       fvm::laplacian(a, m_, laplacianScheme) \n     + mSource_\n     + fvm::Sp(mSourceKImpl_, m_)\n     #ifndef versionExt32\n     + fvOptions_(m_)\n     #endif\n    );\n\n    mEqn.relax();\n    #ifndef versionExt32\n    fvOptions_.constrain(mEqn);\n    #endif\n    mEqn.solve();\n\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/eulerianScalarField/eulerianScalarField.H",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\nApplication / Class\n    eulerianScalarField\n    \nDescription\n    Base class for moment transport model & FVM-based solver.\n    WARNING:    the surfaceScalarField 'phi' must be based on U*voidfraction,\n                and not on U!\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef eulerianScalarField_H\n#define eulerianScalarField_H\n\n#include \"cfdemCloud.H\"\n#include \"forceModel.H\"\n#ifndef versionExt32\n#include \"fvOptionList.H\"\n#endif\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class eulerianScalarField Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass eulerianScalarField\n{\n\nprotected:\n\n    // Protected data\n        const dictionary&       dict_;\n\n        cfdemCloud&             particleCloud_;\n\n        const word              fieldName_;\n\n        word                    cpVolumetricFieldName_;   // name of the field holding the volumetric heat capacity\n                                                          // if not provided, must specify a constant holding this value\n\n        scalar                  cpVolumetric_;            // the (constant) volumetric heat capacity (optional)\n\n        //species properties (if required, these properties will be set, default = -1\n        bool                    updateMixtureProperties_;   // switch to indicate whether phase properties will be updated or not\n        scalar                  rho_;                     // the density of this field\n        scalar                  rhoCarrier_;              // the density of the carrier field\n        scalar                  cp_;                      // the heat capacity of this field\n        scalar                  cpCarrier_;               // the heat capacity of the carrier field\n\n        mutable volScalarField  m_;                       // transported quantity\n\n        mutable volScalarField  mSource_;   // source of transported quantity; \n                                            // might involve part of implicit term\n\n        mutable volScalarField  mSourceKImpl_;   // pre-factor for implicit source\n                                                 // will be added with negative sign in transport eqn.\n                                                 // will shadowed\n\n        mutable word            fieldType_;\n\n        #ifndef versionExt32\n        mutable fv::optionList  fvOptions_;\n        #endif\n\n        int                     speciesID_;\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"eulerianScalarField\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            eulerianScalarField,\n            dictionary,\n            (\n                const dictionary&   dict,\n                cfdemCloud&         sm,\n                word                modelType,\n                int                 modelID\n            ),\n            (dict,sm,modelType,modelID)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        eulerianScalarField\n        (\n            const dictionary&   dict,\n            cfdemCloud&         sm,\n            word                modelType,\n            int                 modelID\n        );\n\n\n    // Destructor\n\n        virtual ~eulerianScalarField();\n\n\n    // Selector\n\n        static autoPtr<eulerianScalarField> New\n        (\n            const dictionary&   dict,\n            cfdemCloud&         sm,\n            word                modelType,\n            int                 modelID\n        );\n\n\n    // Member Functions\n    void update(surfaceScalarField, volScalarField, volScalarField, scalar Sc, bool limitDiffusion=false) const ;\n\n    void bound(autoPtr<eulerianScalarField>*) const {};\n\n    // Access\n    word fieldType() const                 { return fieldType_; };\n\n    inline bool updateMixtureProperties() const   { return updateMixtureProperties_; };\n    inline scalar rho()          const            { return rho_; };\n    inline scalar rhoCarrier()   const            { return rhoCarrier_; };\n    inline scalar cp()           const            { return cp_; };\n    inline scalar cpCarrier()    const            { return cpCarrier_; };\n\n    inline volScalarField& m()            const {return m_;}; //returns the transported quantity\n\n    inline volScalarField& mSource()      const {return mSource_;}; //returns the source\n    inline volScalarField& mSourceKImpl() const {return mSourceKImpl_;}; //returns the implicit prefactor of the source\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/eulerianScalarField/newEulerianScalarField.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"eulerianScalarField.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<eulerianScalarField> eulerianScalarField::New\n(\n    const dictionary&   dict,\n    cfdemCloud&         sm,\n    word                modelType,\n    int                 modelID\n)\n{\n    Info<< \"Creating eulerianScalarField with name: \"\n         << modelType \n         << \" and ID \" << modelID << endl;\n\n    return autoPtr<eulerianScalarField>(new eulerianScalarField(dict,sm,modelType,modelID));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/generalManual/generalManual.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"generalManual.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(generalManual, 0);\n\naddToRunTimeSelectionTable\n(\n\tscalarTransportModel,\n\tgeneralManual,\n\tdictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ngeneralManual::generalManual\n(\n    const dictionary& dict,\n    cfdemCloud&       sm\n)\n:\n    scalarTransportModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    phiFieldName_(propsDict_.lookupOrDefault<word>(\"phiFieldName\", \"phi\")),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\", \"voidfraction\")),\n    eulerianFieldList_(propsDict_.lookup(\"eulerianFields\")),\n    ScT_(0.7),\n    PrT_(0.7),\n    idTemp_(-1),\n    updateMixtureProperties_(propsDict_.lookupOrDefault<bool>(\"updateMixtureProperties\", true)),\n    rhoMix_\n    (   IOobject\n        (\n            propsDict_.lookupOrDefault<word>(\"rhoMixFieldName\",\"rhoMixDefault\"),\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"dummy\", dimensionSet(1,-3,0,0,0), -1)\n    ),\n    cpRho_\n    (   IOobject\n        (\n            propsDict_.lookupOrDefault<word>(\"cpVolumetricFieldName\",\"cpRhoDefault\"),\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"dummy\", dimensionSet(1,-1,-2,-1,0), -1)\n    )\n{\n\n    propsDict_.readIfPresent(\"ScT\", ScT_);\n    propsDict_.readIfPresent(\"PrT\", PrT_);\n    \n    Info << \"generalManual:: Using the following turbulent dispersion coefficients: ScT = \" << ScT_ << \" and PrT \" << PrT_ << endl;\n\n    eulerianFields_ = new autoPtr<eulerianScalarField>[eulerianFieldList_.size()];\n    for (int i=0;i<eulerianFieldList_.size();i++)\n    {\n        if(eulerianFieldList_[i]==\"T\")\n            idTemp_= i;\n\n        eulerianFields_[i] = eulerianScalarField::New\n        (\n            propsDict_,\n            sm,\n            eulerianFieldList_[i],\n            i\n        );\n    }\n\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\ngeneralManual::~generalManual()\n{\n    delete [] eulerianFields_;\n}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid generalManual::createFields()\n{}\n\n// ************************************************************\n\n// ************************************************************\nvoid generalManual::evolveFields()\n{\n    //update the fields\n    if(updateMixtureProperties_)\n    {\n        if(eulerianScalarF(0).fieldType()==\"Temperature\" )\n            FatalError <<\"generalManual: first eulerianField is temperature, but we need a species. Please re-order your eulerianFields in the input dict. \\n\" \n                       << abort(FatalError);  \n\n        forAll(rhoMix_, iter)\n        {\n            double denominator              = 1./eulerianScalarF(0).rhoCarrier();\n            rhoMix_[iter]   = 1.0;\n            cpRho_[iter]    = eulerianScalarF(0).cpCarrier();\n            for (int i=0;i<eulerianFieldList_.size();i++)\n            {\n              if(eulerianScalarF(i).fieldType()!=\"temperature\")\n              {\n                denominator += eulerianScalarF(i).m()[iter]\n                             / eulerianScalarF(i).rho();\n\n                rhoMix_[iter] += eulerianScalarF(i).m()[iter];\n                cpRho_[iter]  += eulerianScalarF(i).m()[iter]\n                                                *eulerianScalarF(i).cp();\n              }\n            }\n            rhoMix_[iter]  /= denominator;\n            cpRho_[iter]   /= denominator;\n        }\n\n    }\n\n    //==============================\n    // get references\n    const surfaceScalarField& phi(particleCloud_.mesh().lookupObject<surfaceScalarField> (phiFieldName_));\n    const volScalarField&     voidfraction(particleCloud_.mesh().lookupObject<volScalarField> (voidfractionFieldName_));\n    //==============================\n\n    //Loop through all eulerian fields and update them\n    for (int i=0;i<eulerianFieldList_.size();i++)\n    {\n            if(eulerianScalarF(i).fieldType()==\"Temperature\")\n                eulerianScalarF(i).update(phi, voidfraction, particleCloud_.turbulence_.nuEff(), PrT_);\n            else \n                eulerianScalarF(i).update(phi, voidfraction, particleCloud_.turbulence_.nuEff(), ScT_);\n    }\n}\n\n// ************************************************************\nvoid generalManual::update()\n{\n    evolveFields();\n}\n\n// ************************************************************\nvolScalarField& generalManual::sourceField(int i)\n{\n    return eulerianScalarF(i).mSource();\n}\n\n// ************************************************************\nconst eulerianScalarField& generalManual::eulerianScalarF(int i)\n{\n     return eulerianFields_[i];\n}\n\n// ************************************************************\nconst eulerianScalarField& generalManual::eulerianTemperatureF()\n{\n    if(idTemp_<0)\n        FatalError <<\"You did not specify a temperature field with name 'T', but you are requesting this field in generalManual::eulerianTemperatureF. \\n\" \n                   << abort(FatalError);  \n\n    return eulerianFields_[idTemp_];\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/generalManual/generalManual.H",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n    Description\n    Evolves an arbitrary number of scalar quantities, exchanges sources\n    with the granular phase\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef generalManual_H\n#define generalManual_H\n\n#include \"scalarTransportModel.H\"\n#include \"forceModel.H\"\n#include \"eulerianScalarField.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                Class generalManual Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass generalManual\n:\n    public scalarTransportModel\n{\n\nprotected:\n\n    dictionary                      propsDict_;\n\n    word                            phiFieldName_;\n\n    word                            voidfractionFieldName_;\n\n    const wordList                  eulerianFieldList_;\n\n    autoPtr<eulerianScalarField>*   eulerianFields_;\n\n    scalar                          ScT_; // - Turbulent Schmidt number (optional, default = 0.7)\n\n    scalar                          PrT_; // - Turbulent Prandtl number (optional, default = 0.7)\n\n    int                             idTemp_;    //id with temperature field\n\n    //Extra fields to represent a mixture in the void space\n    bool                            updateMixtureProperties_;   // switch to indicate whether phase properties will be updated or not\n    volScalarField                  rhoMix_;                  //field (if needed) to hold mixture density\n    volScalarField                  cpRho_;                  //field (if needed) to hold volumetric cp-value\n             \n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"generalManual\");\n\n\n    // Constructors\n\n    //- Construct from components\n    generalManual\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n    ~generalManual();\n\n\n    // Member Functions\n\n    const                eulerianScalarField& eulerianTemperatureF();\n\n    const                eulerianScalarField& eulerianScalarF(int);\n\n    void                 createFields();\n\n    void                 update();\n\n    void                 evolveFields();\n\n    volScalarField&      sourceField(int i);\n\n\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/generalPhaseChange/generalPhaseChange.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"generalPhaseChange.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(generalPhaseChange, 0);\n\naddToRunTimeSelectionTable\n(\n\tscalarTransportModel,\n\tgeneralPhaseChange,\n\tdictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ngeneralPhaseChange::generalPhaseChange\n(\n    const dictionary& dict,\n    cfdemCloud&       sm\n)\n:\n    generalManual(dict,sm),\n    phaseChangeDict_(propsDict_.subDict(\"PhaseChangeParameters\")),\n    phaseChangeModelList_(phaseChangeDict_.lookup(\"phaseChangeModels\"))\n{\n\n    phaseChangeModels_ = new autoPtr<phaseChangeModel>[phaseChangeModelList_.size()];\n    for (int i=0;i<phaseChangeModelList_.size();i++)\n    {\n        phaseChangeModels_[i] = phaseChangeModel::New\n        (\n            phaseChangeDict_,\n            sm,\n            phaseChangeModelList_[i],\n            i\n        );\n    }\n\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\ngeneralPhaseChange::~generalPhaseChange()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid generalPhaseChange::createFields()\n{}\n\n// ************************************************************\nvoid generalPhaseChange::update()\n{\n    //Apply the phaseChange operation (loop through list of models)\n    //phaseChangeModels must ADD any sources to the eulerianScalarFields \n    //(since there might be sources due to particle-fluid interactions)\n    const volScalarField&     voidfraction(particleCloud_.mesh().lookupObject<volScalarField> (voidfractionFieldName_));\n    for (int i=0;i<phaseChangeModelList_.size();i++)\n    {\n        int idFieldFrom = phaseChangeModelRef(i).fromID();\n        int idFieldTo   = phaseChangeModelRef(i).toID();\n        phaseChangeModelRef(i).update(voidfraction,                 eulerianTemperatureF().m(),\n                                      eulerianScalarF(idFieldFrom), eulerianScalarF(idFieldTo));\n\n        phaseChangeModelRef(i).setEnthalpySource(eulerianTemperatureF());\n    }\n\n    //to stuff for standard scalar transport\n    generalManual::evolveFields();\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nconst phaseChangeModel& generalPhaseChange::phaseChangeModelRef(int i)\n{\n     return phaseChangeModels_[i];\n}\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/generalPhaseChange/generalPhaseChange.H",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2015 -Stefan Radl, TU Graz, Austria\n\n    Description\n    Derived from generalManual transport Model\n    Evolves an arbitrary number of scalar quantities, exchanges sources\n    with the granular phase, and implements phase-change physics \n    between the Eulerian phases\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef generalPhaseChange_H\n#define generalPhaseChange_H\n\n#include \"generalManual.H\"\n#include \"forceModel.H\"\n#include \"phaseChangeModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                Class generalPhaseChange Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass generalPhaseChange\n:\n    public generalManual\n{\n\nprotected:\n\n    dictionary                      phaseChangeDict_;\n\n    const wordList                  phaseChangeModelList_;\n\n    autoPtr<phaseChangeModel>*      phaseChangeModels_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"generalPhaseChange\");\n\n\n    // Constructors\n    //- Construct from components\n    generalPhaseChange\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n    ~generalPhaseChange();\n\n    //Access function\n    const phaseChangeModel& phaseChangeModelRef(int); //must be const to satisfy compiler!\n\n    // Member Functions\n\n    void                 createFields();\n\n    void                 update();\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/noTransport/noTransport.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"noTransport.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noTransport, 0);\n\naddToRunTimeSelectionTable\n(\n\tscalarTransportModel,\n\tnoTransport,\n\tdictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n// Construct from components\nnoTransport::noTransport\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    scalarTransportModel(dict,sm)\n{\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\nnoTransport::~noTransport()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid noTransport::createFields()\n{}\n\n// ************************************************************\nvoid noTransport::update()\n{}\n\n// ************************************************************\nconst volScalarField& noTransport::sourceField()\n{\n    FatalErrorIn(\"const volScalarField& noTransport::sourceField() \")\n        << \"this source field is NOT implemented, and hence MUST NOT be called!\" << abort(FatalError);\n    return volScalarField::null();\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/noTransport/noTransport.H",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noTransport_H\n#define noTransport_H\n\n#include \"scalarTransportModel.H\"\n#include \"forceModel.H\"\n#include \"eulerianScalarField.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                Class noTransport Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noTransport\n:\n    public scalarTransportModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"none\");\n\n\n    // Constructors\n\n    //- Construct from components\n    noTransport\n    (\n            const dictionary& dict,\n            cfdemCloud& sm\n   );\n\n    // Destructor\n\n    \t~noTransport();\n\n\n    // Member Functions\n\n    void createFields();\n\n    void update();\n\n    const volScalarField& sourceField();\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/phaseChangeModel/newPhaseChangeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"phaseChangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<phaseChangeModel> phaseChangeModel::New\n(\n    const dictionary&   dict,\n    cfdemCloud&         sm,\n    word                modelType,\n    int                 modelID\n)\n{\n    Info<< \"Creating phaseChangeModel with name: \"\n         << modelType \n         << \" and ID \" << modelID << endl;\n\n    return autoPtr<phaseChangeModel>(new phaseChangeModel(dict,sm,modelType,modelID));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/phaseChangeModel/phaseChangeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2014- Stefan Radl, TU Graz, Austria\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"phaseChangeModel.H\"\n#include \"IOmanip.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(phaseChangeModel, 0);\n\ndefineRunTimeSelectionTable(phaseChangeModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nphaseChangeModel::phaseChangeModel\n(\n    const dictionary&   dict,\n    cfdemCloud&         sm,\n    word                modelType,\n    int                 modelID\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    modelName_(modelType),\n    mSaturation_\n    (   IOobject\n        (\n            modelName_+\"Saturation\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"dummy\", dimensionSet(0,0,0,0,0), -1)\n    ),\n    mSource_\n    (   IOobject\n        (\n            modelName_+\"Rate\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"dummy\", dimensionSet(0,0,-1,0,0), -1)\n    ),\n    speciesIDFrom_(0),\n    speciesIDTo_(1),\n    parameterVap_(dict_.lookup(\"parameterVap\")),\n    Rvap_(dict_.lookupOrDefault<scalar>(\"Rvap\", 461.5)),\n    alphaImExSplit_(dict_.lookupOrDefault<scalar>(\"alphaImExSplit\", 0.5)),\n    cpFromField_(0.0),\n    cpToField_(0.0),\n    deltaHEvap_(dict_.lookup(\"deltaHEvap\")),\n    tEvap_(dict_.lookup(\"tEvap\")),\n    verboseDiskIntervall_(-1), //zero or negative--> deaktivate output to disk\n    verboseDiskCounter_(0),\n    sPtr_(NULL)\n{\n    if(parameterVap_.size()<5)\n        FatalError <<\"phaseChangeModel: parameterVap_.size()<5! Provide more parameters to this model. \\n\" \n                   << abort(FatalError);  \n\n    if(alphaImExSplit_<0 || alphaImExSplit_>1)\n        FatalError <<\"alphaImExSplit must be between 0 and 1. \\n\" \n                   << abort(FatalError);  \n    if(dict_.found(\"verboseDiskIntervall\"))\n        verboseDiskIntervall_=readScalar(dict_.lookup(\"verboseDiskIntervall\"));\n\n    if (verboseDiskIntervall_>0)\n    {\n        Info << \"phaseChangeModel will report to disk with intervall \" << verboseDiskIntervall_ << endl;\n        initialzeSummation(typeName, \"phaseChange.logDat\");\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nphaseChangeModel::~phaseChangeModel()\n{}\n\n// * * * * * * * * * * * * * * * * Member Fct  * * * * * * * * * * * * * * * //\nvoid phaseChangeModel::update(const volScalarField&      voidfraction,   //this is 1-particleFraction field\n                              const volScalarField&      temp,           //this is temperature field of the fluid phase\n                              const eulerianScalarField& fromField,      const eulerianScalarField& toField) const \n{\n    //To implement phase change model updates that directly affect \"fromField\", and \"toField\"\n    //MUST ADD to sources (not reset sources!)\n    //MUST be per m³ TOTAL volume, since scalar transport solver is based on this\n    \n    //update the saturation field and cp quantities\n    cpFromField_ = fromField.cpCarrier();\n    cpToField_   = toField.cpCarrier();\n\n    forAll(mSaturation_, iter)\n        mSaturation_[iter] = pVapor( temp[iter] )  / temp[iter] / Rvap_; \n\n    //update the reference quantities\n\n    volScalarField tempF =      voidfraction \n\t                              / ( \n                                              fromField.m()\n                                            + toField.m() * fromField.rho() / toField.rho()\n                                            +               fromField.rho() / fromField.rhoCarrier()\n                                        ); //phi_liquid ... (global) liquid volume fraction (per m³ total!)\n                                           //divided by fromField.m() \n\n\n    //leaving mass rate - implicit/explicit term (divided by fromFiel.m())\n#if defined(version40) || defined(versionv1612plus)\n    fromField.mSource()    -= (1-alphaImExSplit_) * tempF * fromField.m()\n#else\n    fromField.mSource().internalField()     -= (1-alphaImExSplit_) * tempF.internalField()  * fromField.m()\n#endif\n                                              / tEvap_.value()  //characteristic evaporation time\n                                            * (   \n                                                 mSaturation_ \n                                               - toField.m()\n                                                *fromField.rhoCarrier()\n                                              );\n\n#if defined(version40) || defined(versionv1612plus)\n    fromField.mSourceKImpl() -= alphaImExSplit_ * tempF\n#else\n    fromField.mSourceKImpl().internalField()  -= alphaImExSplit_ * tempF.internalField() \n#endif\n                                              / tEvap_.value()  //characteristic evaporation time\n                                            * (   \n                                                 mSaturation_ \n                                               - toField.m()\n                                                *fromField.rhoCarrier()\n                                              );\n\n    tempF *= fromField.m() / tEvap_.value(); //phi_liquid ... (global) liquid volume fraction\n                                             //divided by evaporation time scale\n\n\n    //entering mass rate - explicit & implicit term\n\n#if defined(version40) || defined(versionv1612plus)\n        toField.mSource()     += tempF * mSaturation_;\n        toField.mSourceKImpl()-= tempF * toField.rhoCarrier();\n#else\n        toField.mSource().internalField()       += tempF.internalField()   * mSaturation_;\n        toField.mSourceKImpl().internalField()  -= tempF.internalField()   * toField.rhoCarrier();\n#endif\n\n\n    //set the rate\n#if defined(version40) || defined(versionv1612plus)\n    mSource_  = tempF \n#else\n    mSource_.internalField()  = tempF   .internalField()\n#endif\n                              * (   \n                                    mSaturation_\n                                  - toField.m()\n                                  * toField.rhoCarrier() \n                                );\n\n    if(verboseToDisk())\n        computeIntegral(mSource_);\n}\n\n//************************************************\nvoid phaseChangeModel::setEnthalpySource(const eulerianScalarField& Temperature) const\n{\n\n    //update the heat source\n#if defined(version40) || defined(versionv1612plus)\n       Temperature.mSource() -= mSource_\n                                           * (   deltaHEvap_.value() \n                                               - Temperature.m() * (cpFromField_ - cpToField_)\n                                             );\n#else\n       Temperature.mSource().internalField() -= mSource_.internalField()\n                                           * (   deltaHEvap_.value() \n                                               - Temperature.m().internalField() * (cpFromField_ - cpToField_)\n                                             );\n#endif\n\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid phaseChangeModel::initialzeSummation(word typeName, word  logFileName) const\n{\n    if (Pstream::master())\n    {\n        fileName file_ =logFileName;\n        fileName probeDir;\n        fileName probeSubDir =  typeName;\n\n        Info << \"Integral quantity for model \" <<  typeName << \" will write to file \" << file_ << endl;\n\n        if (particleCloud_.mesh().name() != polyMesh::defaultRegion)\n        {\n            probeSubDir = probeSubDir/particleCloud_.mesh().name();\n        }\n        probeSubDir = \"postProcessing\"/probeSubDir/particleCloud_.mesh().time().timeName();\n\n        if (Pstream::parRun())\n        {\n            // Put in undecomposed case\n            // (Note: gives problems for distributed data running)\n            probeDir = particleCloud_.mesh().time().path()/\"..\"/probeSubDir;\n        }\n        else\n        {\n            probeDir = particleCloud_.mesh().time().path()/probeSubDir;\n        }\n\n\n        // Create directory if does not exist.\n        mkDir(probeDir);\n\n        sPtr_ = new OFstream(probeDir+\"/\"+file_);\n\n        *sPtr_ << '#' \n              << \"Time\" << \"  \" \n              << \"sourceValue\" << endl;\n    }\n}\n\n//*******************************************************************\nvoid phaseChangeModel::computeIntegral(volScalarField& explicitEulerSource) const\n{\n    volScalarField expEulerSrc=explicitEulerSource;\n    particleCloud_.scaleWithVcell(expEulerSrc);\n    scalar integralValue = gSum(expEulerSrc);\n\n    if (Pstream::master() )\n    {\n      *sPtr_ << setprecision(IOstream::defaultPrecision()) ;\n      *sPtr_ << particleCloud_.mesh().time().value() \n            << \"  \" //setw(IOstream::defaultPrecision() + 6)\n            << integralValue\n            << endl;\n    }\n}\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/phaseChangeModel/phaseChangeModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\nLicense\n\n    This is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This code is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this code.  If not, see <http://www.gnu.org/licenses/>.\n\n    Copyright (C) 2015 - Stefan Radl, TU Graz, Austria\n\nApplication / Class\n    phaseChangeModel\n    \nDescription\n    Base class for phase change modeling (e.g., evaporation)\n    TODO: currently handles only evaporation!\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef phaseChangeModel_H\n#define phaseChangeModel_H\n\n#include \"cfdemCloud.H\"\n#include \"forceModel.H\"\n#ifndef versionExt32\n#include \"fvOptionList.H\"\n#endif\n#include \"eulerianScalarField.H\"\n#include \"generalManual.H\"\n#include \"OFstream.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class phaseChangeModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass phaseChangeModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary&       dict_;\n\n        cfdemCloud&             particleCloud_;\n\n        const word              modelName_;     \n\n        mutable volScalarField  mSaturation_;   // saturation concentration field\n\n        mutable volScalarField  mSource_;       // volumetric source of transported quantity (for the leaving phase)\n    \n        int                     speciesIDFrom_; // id of leaving phase\n\n        int                     speciesIDTo_;   // id of receiving phase\n\n        scalarList              parameterVap_;  // parameters for vapor pressure\n\n        scalar                  Rvap_;          // Gas constant of vapor (in J/kg/K)\n\n        scalar                  alphaImExSplit_; // 0...1 (indicate split into implicit and explicit part)\n\n        // Key Evaporation properties\n        mutable scalar          cpFromField_;\n        mutable scalar          cpToField_;\n        dimensionedScalar       deltaHEvap_;    //units: K; deltaHEvap = deltaH_v / cp_g\n        dimensionedScalar       tEvap_;         //units: s; tEvap_ = d_d^2 / (6*Sh*D_Vapor)\n\n        //Reporting\n        mutable int         verboseDiskIntervall_;\n\n        mutable int         verboseDiskCounter_;\n\n        mutable OFstream*   sPtr_; \n\n\n        inline bool verboseToDisk() const\n        { \n            if(verboseDiskIntervall_<=0) return false;\n\n            verboseDiskCounter_++;\n            if(verboseDiskCounter_>=verboseDiskIntervall_)\n            {\n                verboseDiskCounter_=0;\n                return true; \n            }\n            else\n                return false;\n        };\n\n        //Private/protected member functions\n        inline double pVapor(double T) const\n        {   //T in K, p in Pa, from http://ddbonline.ddbst.de/AntoineCalculation/AntoineCalculationCGI.exe?component=Water\n            const double A = parameterVap_[0];\n            const double B = parameterVap_[1];\n            const double C = parameterVap_[2];\n            const double Tmin = parameterVap_[3];\n            const double Tmax = parameterVap_[4];\n    \n            double result = 0;\n            if( T>Tmin )\n                result = 133.322368 * pow(10.0, A - B / ( C + min(Tmax,T) ) );\n            return result;\n        }\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"phaseChangeModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            phaseChangeModel,\n            dictionary,\n            (\n                const dictionary&   dict,\n                cfdemCloud&         sm,\n                word                modelType,\n                int                 modelID\n            ),\n            (dict,sm,modelType,modelID)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        phaseChangeModel\n        (\n            const dictionary&   dict,\n            cfdemCloud&         sm,\n            word                modelType,\n            int                 modelID\n        );\n\n\n    // Destructor\n\n        virtual ~phaseChangeModel();\n\n\n    // Selector\n\n        static autoPtr<phaseChangeModel> New\n        (\n            const dictionary&   dict,\n            cfdemCloud&         sm,\n            word                modelType,\n            int                 modelID\n        );\n\n\n    // Member Functions\n    int  fromID() const {return speciesIDFrom_;};\n    int  toID()   const {return speciesIDTo_;};\n\n    void update(const volScalarField&, const volScalarField&, const eulerianScalarField&, const eulerianScalarField&) const ;\n\n    void setEnthalpySource(const eulerianScalarField&) const;\n\n    void bound(autoPtr<phaseChangeModel>*) const {};\n    void initialzeSummation(word typeName, word  logFileName) const;\n    void computeIntegral (volScalarField& explicitEulerSource) const;\n\n    // Access\n    inline volScalarField& mSource() const {return mSource_;}; //returns the source\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/scalarTransportModel/newScalarTransportModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"scalarTransportModel.H\"\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<scalarTransportModel> scalarTransportModel::New\n(\n    const dictionary& dict, //Not used at the moment\n    cfdemCloud& sm\n)\n{\n    IOdictionary tempDict\n    (\n        IOobject\n        (\n            \"scalarTransportProperties\",\n            sm.mesh().time().constant(),\n            sm.mesh(),\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    );\n\n    word scalarTransportModelType\n    (\n        tempDict.lookup(\"scalarTransportModel\")\n    );\n\n    Info<< \"Selecting scalarTransportModel \"\n\t\t << scalarTransportModelType << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(scalarTransportModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"scalarTransportModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown scalarTransportModelType type \"\n            << scalarTransportModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid scalarTransportModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    autoPtr<scalarTransportModel> h(cstrIter()(tempDict,sm));\n\n    sm.registryM().addProperty(\"scalarTransportModel_\"+h().type()+\"_index\", 0);\n\n    return h;\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/scalarTransportModel/scalarTransportModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"scalarTransportModel.H\"\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(scalarTransportModel, 0);\n\ndefineRunTimeSelectionTable(scalarTransportModel, dictionary);\n\n// * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * //\nvoid scalarTransportModel::createFields()\n{}\n\nvoid scalarTransportModel::update()\n{}\n\nconst volScalarField& scalarTransportModel::sourceField()\n{\n    // dummy source field\n    tmp<volScalarField> tsource\n    (\n        volScalarField\n        (\n            IOobject\n            (\n                \"tsource\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedScalar\n            (\n                \"zero\",\n                dimensionSet(0,0,0,0,0),\n                0\n            )\n        )\n    );\n    return tsource();\n}\n\n// * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from Components\nscalarTransportModel::scalarTransportModel\n(\n    const dictionary& dict, //not used at the moment\n    cfdemCloud& sm\n)\n:\n    particleCloud_(sm),\n    mesh_(sm.mesh()),\n    scalarTransportProperties_\n    (\n        IOobject\n        (\n            \"scalarTransportProperties\",\n            mesh_.time().constant(),\n            mesh_,\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    ),\n    verbose_(false),\n    ignore_(false)\n{\n    createFields();\n}\n\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nscalarTransportModel::~scalarTransportModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/scalarTransportModel/scalarTransportModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    transport model for scalar properties\n\nClass\n    Foam::scalarTransportModel\n\nSourceFiles\n    scalarTransportModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef scalarTransportModel_H\n#define scalarTransportModel_H\n\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                Class scalarTransportModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass scalarTransportModel\n{\nprotected:\n\n    // Protected data\n    cfdemCloud&          particleCloud_;\n\n    const fvMesh&        mesh_;\n\n    const IOdictionary   scalarTransportProperties_;\n\n    bool                 verbose_;      //switch for debug output to screen\n\n    bool                 ignore_;       //ignore updating the model, i.e., deactivate\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"scalarTransportModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            scalarTransportModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        scalarTransportModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n    \tvirtual ~scalarTransportModel();\n\n    // Selector\n\n        static autoPtr<scalarTransportModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n\t// Member Functions\n\n        virtual void createFields();\n\n        virtual void update();\n\n        virtual const volScalarField& sourceField();\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/temperatureModel/temperatureModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"temperatureModel.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(temperatureModel, 0);\n\naddToRunTimeSelectionTable\n(\n\tscalarTransportModel,\n\ttemperatureModel,\n\tdictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n// Construct from components\ntemperatureModel::temperatureModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    scalarTransportModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    PrT_(0.7)\n{\n    propsDict_.readIfPresent(\"PrT\", PrT_);\n\n    Info << \"Using PrT \" << PrT_ << endl;\n\n    temperatureField_ = eulerianScalarField::New\n    (\n         propsDict_,\n         sm,\n         \"T\",\n         0\n    );\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\ntemperatureModel::~temperatureModel()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid temperatureModel::createFields()\n{}\n\n// ************************************************************\nvoid temperatureModel::update()\n{\n\n    //==============================\n    // get references\n    const surfaceScalarField& phi(particleCloud_.mesh().lookupObject<surfaceScalarField> (\"phi\"));\n    const volScalarField& voidfraction(particleCloud_.mesh().lookupObject<volScalarField> (\"voidfraction\"));\n    //==============================\n    temperatureField_->update(phi, voidfraction, particleCloud_.turbulence_.nuEff(), PrT_);\n\n}\n\n// ************************************************************\nconst volScalarField& temperatureModel::sourceField()\n{\n    return temperatureField_->mSource();\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/eulerian/scalarTransportModelsCFDEM/temperatureModel/temperatureModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    transport model for scalar properties\n\nClass\n    temperatureModel\n\nSourceFiles\n    temperatureModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef temperatureModel_H\n#define temperatureModel_H\n\n#include \"scalarTransportModel.H\"\n#include \"forceModel.H\"\n#include \"eulerianScalarField.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                Class temperatureModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass temperatureModel\n:\n    public scalarTransportModel\n{\n\n    dictionary                      propsDict_;\n\n    autoPtr<eulerianScalarField>    temperatureField_;\n\n    scalar                          PrT_; // - Turbulent Prandtl number (optional, default = 0.7)\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"temperatureModel\");\n\n\n    // Constructors\n\n    //- Construct from components\n    temperatureModel\n    (\n            const dictionary& dict,\n            cfdemCloud& sm\n    );\n\n    // Destructor\n\n    \t~temperatureModel();\n\n\n    // Member Functions\n\n    void createFields();\n\n    void update();\n\n    const volScalarField& sourceField();\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/Make/files",
    "content": "path = ../cfdemParticle\ncfdemCloud = $(path)/cfdemCloud\nderived = $(path)/derived\ncfdTools = $(path)/cfdTools\nforceModels = $(path)/subModels/forceModel\nforceSubModels = $(path)/subModels/forceModel/forceSubModels\nforceModelsMS = $(path)/subModels/forceModelMS\nIOModels = $(path)/subModels/IOModel\nvoidFractionModels = $(path)/subModels/voidFractionModel\nlocateModels = $(path)/subModels/locateModel\nmeshMotionModels = $(path)/subModels/meshMotionModel\nmomCoupleModels = $(path)/subModels/momCoupleModel\ndataExchangeModels = $(path)/subModels/dataExchangeModel\naveragingModels = $(path)/subModels/averagingModel\nclockModels = $(path)/subModels/clockModel\nliggghtsCommandModels = $(path)/subModels/liggghtsCommandModel\nsmoothingModels = $(path)/subModels/smoothingModel\nprobeModels = $(path)/subModels/probeModel\nregistryModels = $(path)/subModels/registryModel\nabsorptionEmissionModels = $(path)/subModels/absorptionEmissionModels\n\n\n$(cfdemCloud)/cfdemCloud.C\n$(derived)/cfdemCloudIB/cfdemCloudIB.C\n\n$(cfdTools)/global.C\n$(cfdTools)/IOtools/json/json.C\n$(cfdTools)/newGlobal.C\n\n$(averagingModels)/averagingModel/averagingModel.C\n$(averagingModels)/averagingModel/newAveragingModel.C\n$(averagingModels)/dense/dense.C\n$(averagingModels)/dilute/dilute.C\n\n$(clockModels)/clockModel/clockModel.C\n$(clockModels)/clockModel/newClockModel.C\n$(clockModels)/noClock/noClock.C\n$(clockModels)/standardClock/standardClock.C\n\n$(dataExchangeModels)/dataExchangeModel/dataExchangeModel.C\n$(dataExchangeModels)/dataExchangeModel/newDataExchangeModel.C\n$(dataExchangeModels)/noDataExchange/noDataExchange.C\n$(dataExchangeModels)/oneWayVTK/oneWayVTK.C\n$(dataExchangeModels)/twoWayFiles/twoWayFiles.C\n$(dataExchangeModels)/twoWayMPI/twoWayMPI.C\n\n$(forceModels)/Archimedes/Archimedes.C\n$(forceModels)/ArchimedesIB/ArchimedesIB.C\n$(forceModels)/checkCouplingInterval/checkCouplingInterval.C\n$(forceModels)/DiFeliceDrag/DiFeliceDrag.C\n$(forceModels)/fieldStore/fieldStore.C\n$(forceModels)/fieldTimeAverage/fieldTimeAverage.C\n$(forceModels)/forceModel/forceModel.C\n$(forceModels)/forceModel/newForceModel.C\n$(forceModels)/GidaspowDrag/GidaspowDrag.C\n$(forceModels)/gradPForce/gradPForce.C\n$(forceModels)/KochHillDrag/KochHillDrag.C\n$(forceModels)/LaEuScalarTemp/LaEuScalarTemp.C\n$(forceModels)/MeiLift/MeiLift.C\n$(forceModels)/noDrag/noDrag.C\n$(forceModels)/particleCellVolume/particleCellVolume.C\n$(forceModels)/particleVolume/particleVolume.C\n$(forceModels)/scalarGeneralExchange/scalarGeneralExchange.C\n$(forceModels)/SchillerNaumannDrag/SchillerNaumannDrag.C\n$(forceModels)/ShirgaonkarIB/ShirgaonkarIB.C\n$(forceModels)/virtualMassForce/virtualMassForce.C\n$(forceModels)/viscForce/viscForce.C\n$(forceModels)/volWeightedAverage/volWeightedAverage.C\n\n$(forceSubModels)/forceSubModel/forceSubModel.C\n$(forceSubModels)/forceSubModel/newForceSubModel.C\n$(forceSubModels)/ImEx/ImEx.C\n\n$(IOModels)/basicIO/basicIO.C\n$(IOModels)/IOModel/IOModel.C\n$(IOModels)/IOModel/newIOModel.C\n$(IOModels)/noIO/noIO.C\n$(IOModels)/sophIO/sophIO.C\n$(IOModels)/trackIO/trackIO.C\n\n$(liggghtsCommandModels)/execute/execute.C\n$(liggghtsCommandModels)/liggghtsCommandModel/liggghtsCommandModel.C\n$(liggghtsCommandModels)/liggghtsCommandModel/newLiggghtsCommandModel.C\n$(liggghtsCommandModels)/readLiggghtsData/readLiggghtsData.C\n$(liggghtsCommandModels)/runLiggghts/runLiggghts.C\n$(liggghtsCommandModels)/setDEMGravity/setDEMGravity.C\n$(liggghtsCommandModels)/writeLiggghts/writeLiggghts.C\n\n$(locateModels)/engineSearch/engineSearch.C\n$(locateModels)/engineSearchIB/engineSearchIB.C\n$(locateModels)/locateModel/locateModel.C\n$(locateModels)/locateModel/newLocateModel.C\n$(locateModels)/standardSearch/standardSearch.C\n\n$(meshMotionModels)/meshMotionModel/meshMotionModel.C\n$(meshMotionModels)/meshMotionModel/newMeshMotionModel.C\n$(meshMotionModels)/noMeshMotion/noMeshMotion.C\n\n$(momCoupleModels)/explicitCouple/explicitCouple.C\n$(momCoupleModels)/implicitCouple/implicitCouple.C\n$(momCoupleModels)/momCoupleModel/momCoupleModel.C\n$(momCoupleModels)/momCoupleModel/newMomCoupleModel.C\n$(momCoupleModels)/noCouple/noCouple.C\n\n$(probeModels)/noProbe/noProbe.C\n$(probeModels)/particleProbe/particleProbe.C\n$(probeModels)/probeModel/newProbeModel.C\n$(probeModels)/probeModel/probeModel.C\n\n$(registryModels)/defaultRegistry/defaultRegistry.C\n$(registryModels)/registryModel/newRegistryModel.C\n$(registryModels)/registryModel/registryModel.C\n\n$(smoothingModels)/constDiffSmoothing/constDiffSmoothing.C\n$(smoothingModels)/noSmoothing/noSmoothing.C\n$(smoothingModels)/smoothingModel/newSmoothingModel.C\n$(smoothingModels)/smoothingModel/smoothingModel.C\n\n$(voidFractionModels)/bigParticleVoidFraction/bigParticleVoidFraction.C\n$(voidFractionModels)/centreVoidFraction/centreVoidFraction.C\n$(voidFractionModels)/dividedVoidFraction/dividedVoidFraction.C\n$(voidFractionModels)/GaussVoidFraction/GaussVoidFraction.C\n$(voidFractionModels)/IBVoidFraction/IBVoidFraction.C\n$(voidFractionModels)/noVoidFraction/noVoidFraction.C\n$(voidFractionModels)/trilinearVoidFraction/trilinearVoidFraction.C\n$(voidFractionModels)/voidFractionModel/newVoidFractionModel.C\n$(voidFractionModels)/voidFractionModel/voidFractionModel.C\n\nLIB = $(CFDEM_LIB_DIR)/lib$(CFDEM_LIB_NAME)\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/Make/options",
    "content": "sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB)\nsinclude $(RULES)/mplib$(WM_MPLIB)\n\n$(shell if [ ! -e \"$(CFDEM_LIB_DIR)\" ]; then mkdir -p \"$(CFDEM_LIB_DIR)\"; fi)\n$(shell ln -sf $(CFDEM_LIGGGHTS_LIB_PATH)/lib$(CFDEM_LIGGGHTS_LIB_NAME).so $(CFDEM_LIB_DIR)/)\n\nGIT_VERSION := $(shell git describe --dirty --always --tags)\nPFLAGS+= -DGITVERSION=\\\"$(GIT_VERSION)\\\"\nPFLAGS+= -DDEBUGFLAG=\\\"$(WM_COMPILE_OPTION)\\\"\nPFLAGS+= -DCFDEMWMPROJECTVERSION=\"$(CFDEM_WM_PROJECT_VERSION)\"\n\ninclude $(CFDEM_ADD_LIBS_DIR)/$(CFDEM_ADD_LIBS_NAME)\n\nEXE_INC = \\\n     $(PFLAGS) \\\n     $(PINC) \\\n    -I ./cfdemParticle \\\n    -I$(LIB_SRC)/finiteVolume/lnInclude \\\n    -I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n    -I$(LIB_SRC)/transportModels \\\n    $(CFDEM_ADD_INCOMPTURBMOD_PATHS) \\\n    -I$(LIB_SRC)/meshTools/lnInclude \\\n    -I$(LIB_SRC)/triSurface/lnInclude \\\n    -I$(LIB_SRC)/lagrangian/basic/lnInclude \\\n    -I$(LIB_SRC)/OpenFOAM/containers/HashTables/labelHashSet \\\n    -I$(CFDEM_LIGGGHTS_SRC_DIR) \\\n    -I$(CFDEM_SRC_DIR)/lagrangian/cfdemParticle/cfdTools \\\n\nLIB_LIBS = \\\n     $(PLIBS) \\\n    -L$(CFDEM_LIB_DIR) \\\n    -lfiniteVolume \\\n    -lradiationModels \\\n    $(CFDEM_ADD_INCOMPTURBMOD_LIBS) \\\n    -lmeshTools \\\n    -llagrangian \\\n    -Wl,--whole-archive -l$(CFDEM_LIGGGHTS_LIB_NAME) -Wl,--no-whole-archive \\\n     $(CFDEM_ADD_LIB_PATHS) \\\n     $(CFDEM_ADD_STATICLIBS) \n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/IOtools/json/json.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code implements a simple JSON file writer\n    \nContributing Authors\n\n    copyright:  Federico Municchi, TU Graz, 2015\n                Stefan Radl, TU Graz, 2015\n\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"json.H\"\n#include \"error.H\"\n#include \"IOmanip.H\"\n#include <typeinfo>\n#include <stdlib.h>\n#include <sys/stat.h>\n\nusing namespace Foam;\n\njsonObject::jsonObject()\n:\nlastObject(false)\n{\n};\n\njsonObject::~jsonObject()\n{\n};\n/*-----------------Auxiliary Functions------------------------------------------*/\nvoid indentation(int ind, OFstream* file)\n{\n \n for(int i=0;i<ind;i++)\n  *file << \" \";\n\n}\n\n/*-----------------Add Functions-----------------------------------------------*/\nvoid jsonObject::addjObject(std::string elemName, jsonObject* data) const\n{\n //Register data name\n jObjectNames_.push_back(elemName);\n \n //Register data\n jObjects_.push_back(data);\n data->setIndent(indent+2);\n data->setPtr(sPtr);\n  \n};\n\n/*-------------------------------------------------------------------------------*/\nvoid jsonObject::addjVector(std::string elemName, std::vector<double>* data) const\n{\n //Register data name\n jVectorNames_.push_back(elemName);\n \n //Register data\n jVectors_.push_back(data);\n  \n};\n\n/*-------------------------------------------------------------------------------*/\nvoid jsonObject::addjScalar(std::string elemName, double* data) const\n{\n //Register data name\n jScalarNames_.push_back(elemName);\n \n //Register data\n jScalars_.push_back(data);\n  \n};\n\n/*-------------------------------------------------------------------------------*/\nvoid jsonObject::addjString(std::string elemName, std::string* data) const\n{\n //Register data name\n jStringNames_.push_back(elemName);\n \n //Register data\n jStrings_.push_back(data);\n  \n};\n\n/*-------------------------------------------------------------------------------*/\nvoid jsonObject::addjBool(std::string elemName, bool* data) const\n{\n //Register data name\n jBoolNames_.push_back(elemName);\n \n //Register data\n jBools_.push_back(data);\n  \n};\n\n/*-----------------Write Functions-----------------------------------------------*/\nvoid jsonObject::write() const\n{\n \n  //start writing\n  indentation(indent-2,sPtr);\n  *sPtr<<\"{\" << endl;\n  \n  bool comma=false;\n  \n  //Write Objects\n  for(unsigned int i=0;i<jObjects_.size();i++)\n  {\n   if(i!=0)\n    *sPtr<<\",\"<<endl<<endl;\n   else\n    *sPtr<<endl<<endl; \n    \n   indentation(indent,sPtr);\n   *sPtr<< jObjectNames_[i] << \":\" <<endl;\n   \n   jObjects_[i]->write();\n \n  }\n  \n  \n  if(jObjects_.size()!=0)\n   comma=true;\n  \n  //Write vectors\n  for(unsigned int i=0;i<jVectors_.size();i++)\n  {\n    if(i!=0)\n     *sPtr<<\",\"<<endl<<endl;\n    else\n    {\n     if(comma) *sPtr<<\",\";\n     *sPtr<<endl<<endl;  \n    }\n   indentation(indent,sPtr);\n   *sPtr<< jVectorNames_[i] << \": [\";\n   \n   for(unsigned int s=0;s<jVectors_[i]->size();s++)\n   {\n    if(s!=0)\n      *sPtr<<\",\"<<endl;\n    else\n     *sPtr<<endl;\n      \n    indentation(indent,sPtr);\n     *sPtr<< (*jVectors_[i])[s];\n   }\n   \n    *sPtr<<endl;\n    indentation(indent,sPtr);\n   *sPtr<<  \"]\" ;\n   \n  }\n  \n   if(jVectors_.size()!=0)\n   comma=true;\n  \n  //Write strings\n  for(unsigned int i=0;i<jStrings_.size();i++)\n  {\n    if(i!=0)\n     *sPtr<<\",\"<<endl<<endl;\n    else\n    {\n     if(comma) *sPtr<<\",\";\n     *sPtr<<endl<<endl;  \n    }\n   indentation(indent,sPtr);\n   *sPtr<< jStringNames_[i] << \": \" << *jStrings_[i];\n  \n   \n  }\n  \n   if(jStrings_.size()!=0)\n   comma=true;\n  \n  //Write strings\n  for(unsigned int i=0;i<jScalars_.size();i++)\n  {\n    if(i!=0)\n     *sPtr<<\",\"<<endl<<endl;\n    else\n    {\n     if(comma) *sPtr<<\",\";\n     *sPtr<<endl<<endl;  \n    }\n   indentation(indent,sPtr);\n   *sPtr<< jScalarNames_[i] << \": \" << *jScalars_[i];\n  \n   \n  }\n  \n   if(jScalars_.size()!=0)\n   comma=true;\n  \n  //Write strings\n  for(unsigned int i=0;i<jBools_.size();i++)\n  {\n    if(i!=0)\n     *sPtr<<\",\"<<endl<<endl;\n    else\n    {\n     if(comma) *sPtr<<\",\";\n     *sPtr<<endl<<endl;  \n    }\n   indentation(indent,sPtr);\n   *sPtr<< jBoolNames_[i] << \": \" << *jBools_[i];\n  \n   \n  }\n  \n  \n  *sPtr<<endl<<endl;\n  indentation(indent-2,sPtr);\n   *sPtr<<\"}\"<<endl;\n}\n\n/*-----------------------------------------------------------------------------*/\n/*-----------------jsonFile Class----------------------------------------------*/\n/*-----------------------------------------------------------------------------*/\njsonFile::jsonFile(std::string _dir, std::string _file)\n:\ndirName_(_dir),\nfileName_(_file)\n{\n    //create directory\n    int myProcID(Pstream::myProcNo());\n    if(myProcID==0)\n    {\n        char buf[128];\n        sprintf(buf,\"mkdir %s\",dirName_.c_str());\n        system(buf);\n    }\n    sPtr = new OFstream(dirName_ + \"/\" + fileName_);\n    mainObject.setIndent(2);\n    mainObject.setPtr(sPtr);\n}\n\n/*-----------------------------------------------------------------------------*/\njsonFile::~jsonFile()\n{\n    delete sPtr;\n    for(unsigned int n=0;n<jObjectNames_.size();n++)\n        delete objList_[n];\n}\n\n/*-----------------------------------------------------------------------------*/\nint jsonFile::lookupObject(std::string name) const\n{\n    for(unsigned int n=0;n<jObjectNames_.size();n++)\n    {\n        if(name==jObjectNames_[n])\n        return n;\n    }\n\n    FatalErrorIn(\"ERROR\") << \"\\n ERROR: the object named \" << name << \" could not be found in json file \" << fileName_;\n\n    return 1;\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::setFileName(std::string newname) const\n{\n    fileName_.assign(newname);\n\n    // WARNING: rm: cannot remove ‘AutoDraGStatus.json’: No such file or directory might stem from here\n    delete sPtr;\n\n    sPtr = new OFstream(dirName_ + \"/\" + fileName_);\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::newObject(std::string objName, std::string rootName) const\n{\n    jsonObject* ob = new jsonObject;\n\n    if(rootName==\"mainObject\")\n    {\n        mainObject.addjObject(objName,ob);\n    }\n    else\n    {\n        int id=this->lookupObject(rootName);\n\n        objList_[id]->addjObject(objName,ob);\n    }\n    objList_.push_back(ob);\n    jObjectNames_.push_back(objName);\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::addjVector(std::vector<double>* data , std::string dataname, std::string rootName) const\n{\n    if(rootName==\"mainObject\")\n    {\n        mainObject.addjVector(dataname,data);\n    }\n    else\n    {\n        int id=this->lookupObject(rootName);\n\n        objList_[id]->addjVector(dataname, data);\n    }\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::addjScalar(double* data , std::string dataname, std::string rootName) const\n{\n    if(rootName==\"mainObject\")\n    {\n        mainObject.addjScalar(dataname,data);\n    }\n    else\n    {\n        int id=this->lookupObject(rootName);\n\n        objList_[id]->addjScalar(dataname, data);\n    }\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::addjString(std::string* data , std::string dataname, std::string rootName) const\n{\n    if(rootName==\"mainObject\")\n    {\n        mainObject.addjString(dataname,data);\n    }\n    else\n    {\n        int id=this->lookupObject(rootName);\n\n        objList_[id]->addjString(dataname, data);\n    }\n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::addjBool(bool* data , std::string dataname, std::string rootName) const\n{\n    if(rootName==\"mainObject\")\n    {\n        mainObject.addjBool(dataname,data);\n    }\n    else\n    {\n        int id=this->lookupObject(rootName);\n\n        objList_[id]->addjBool(dataname, data);\n    }   \n}\n\n/*-----------------------------------------------------------------------------*/\nvoid jsonFile::write()\n{\n    //remove old file\n    int myProcID(Pstream::myProcNo());\n    if(myProcID==0)\n    {\n        char buf[128];\n        sprintf(buf,\"rm %s\",fileName_.c_str());\n        system(buf);\n    }\n\n    setFileName(fileName_);\n    mainObject.write();\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/IOtools/json/json.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code implements a simple JSON file writer\n    \nContributing Authors\n\n    copyright:  Federico Municchi, TU Graz, 2015\n                Stefan Radl, TU Graz, 2015\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef OF_JSON_H\n#define OF_JSON_H\n\n#include <string>\n#include <vector>\n#include <fstream>\n#include \"OFstream.H\"\n#include \"Pstream.H\"\n\n\nnamespace Foam\n{\n\n class jsonObject\n {\n   friend class jsonFile;\n  private: \n   \n   mutable OFstream*                                           sPtr;\n   mutable int                                               indent;\n   mutable bool                                          lastObject;\n   mutable std::vector<jsonObject*>                        jObjects_;\n   mutable std::vector<std::string>                   jObjectNames_;\n    \n   mutable std::vector<std::vector<double>*>               jVectors_;\n   mutable std::vector<std::string>                   jVectorNames_;\n    \n   mutable std::vector<double*>                            jScalars_;\n   mutable std::vector<std::string>                   jScalarNames_;\n    \n   mutable std::vector<std::string*>                       jStrings_;\n   mutable std::vector<std::string>                   jStringNames_;\n       \n   mutable std::vector<bool*>                                jBools_;\n   mutable std::vector<std::string>                     jBoolNames_;\n   \n  \n   jsonObject();\n   ~jsonObject();\n    \n   void addjObject(std::string elemName, jsonObject* data) const;\n   \n   void addjVector(std::string elemName, std::vector<double>* data) const;\n  void addjScalar(std::string elemName, double* data) const;\n  void addjString(std::string elemName, std::string* data) const;\n  void addjBool(std::string elemName, bool* data) const;\n  \n  void setIndent(int ind) const {indent=ind;};\n  void setPtr(OFstream* ptr) const {sPtr=ptr;};\n         \n    \n  void write() const;\n  \n  void lastObj() const {lastObject=true;};\n \n  public:\n     \n   \n };\n \n class jsonFile\n {\n \n  \n  private:\n  \n   mutable std::string                   dirName_;\n   mutable std::string                   fileName_;\n   jsonObject                           mainObject;\n   mutable OFstream*                          sPtr;\n   \n   mutable std::vector<jsonObject*>       objList_;\n   mutable std::vector<std::string>  jObjectNames_;  \n \n   int lookupObject(std::string name) const;\n  public:\n   \n   jsonFile(std::string, std::string);\n   ~jsonFile();\n   \n   void setFileName(std::string newname) const;\n   \n   \n   jsonObject* getMainObject() {return &mainObject;};\n   \n   void write();\n   \n   void newObject(std::string objName, std::string rootName=\"mainObject\") const;\n   \n   void addjVector( std::vector<double>* data , std::string dataname, std::string objName=\"mainObject\") const;\n   void addjScalar( double* data, std::string dataname, std::string objName=\"mainObject\") const;\n   void addjString(std::string* data, std::string dataname, std::string objName=\"mainObject\") const;\n   void addjBool(bool* data, std::string dataname, std::string objName=\"mainObject\") const;\n      \n   \n };\n\n\n\n}\n\n/*--------USAGE EXAMPLE---------------------------\n\n    jsonFile file(\"newDir\",\"test.json\");\n   \n    std::string teststring1(\"Is the\");\n    std::string teststring2(\"output working?\");\n    \n    bool ans=true;\n    \n    double scal=9.9999;\n     \n    std::vector<double> vec2_;\n    \n    for(int i=0;i<7;i++)\n     vec2_.push_back(i);\n     \n    file.addjScalar(&scal,\"smaller than 10\");\n    \n    file.newObject(\"test_object\");\n    \n    file.addjVector(&vec2_,\"nested_vector\",\"test_object\");\n    \n    file.newObject(\"nested_object\",\"test_object\");\n    \n    file.addjString(&teststring1,\"teststring1\",\"nested_object\");\n    file.addjString(&teststring2,\"teststring2\",\"nested_object\");\n    file.addjBool(&ans,\"answer\",\"nested_object\");\n    \n    \n    file.write();\n    \n-------THIS CODE WILL PRODUCE A JSON FILE-----------\n{\n\n\n  \"test_object\":\n  {\n\n\n    \"nested_object\":\n    {\n\n\n      \"teststring1\": \"Is the\",\n\n      \"teststring2\": \"output working?\",\n\n      \"answer\": 1\n\n    },\n\n    \"nested_vector\": [\n    0,\n    1,\n    2,\n    3,\n    4,\n    5,\n    6\n    ]\n\n  },\n\n  \"smaller than 10\": 9.9999\n\n}\n    \n\n\n\n*/\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/checkImCoupleM.H",
    "content": "// check if NO explicitCouple model is declared - otherwise error!\n// include this file before the cloud class is created\n\n{\n    // read dict\n    IOdictionary    dict(\n                            IOobject\n                            (\n                                \"couplingProperties\",\n                                mesh.time().constant(),\n                                mesh,\n                                IOobject::MUST_READ,\n                                IOobject::NO_WRITE\n                            )\n                        );\n\n    // read dict\n    wordList a(dict.lookup(\"momCoupleModels\"));\n\n    // look for explicit and throw error if found\n    for(int i=0; i<a.size(); i++)\n        if(a[i] == \"explicitCouple\")\n            FatalError << \"You specified an explicit momemtum coupling model, which is not suitable for this solver.\" << abort(FatalError);\n}\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/checkImExCoupleM.H",
    "content": "// check if both implicit and explicitCouple model is declared - otherwise error!\n// include this file after the cloud class is created\n\nif(particleCloud.registryM().getProperty(\"implicitCouple_index\")+particleCloud.registryM().getProperty(\"explicitCouple_index\") < 1) FatalError << \"You need to specify implicit and explicit momemtum coupling model for this solver.\" << abort(FatalError);\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/checkModelType.H",
    "content": "#include \"sanityChecks/level0_Solver.H\"\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/compressibleContinuityErrsPU.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nGlobal\n    continuityErrs\n\nDescription\n    Calculates and prints the continuity errors.\n    The code is an evolution of compressibleContinuityErrs.H in OpenFOAM(R) 2.3.x,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n{\n    dimensionedScalar totalMass = fvc::domainIntegrate(rho*voidfraction);\n\n    scalar sumLocalContErr =\n        (fvc::domainIntegrate(mag(rho - thermo.rho())*voidfraction)/totalMass).value();\n\n    scalar globalContErr =\n        (fvc::domainIntegrate((rho - thermo.rho())*voidfraction)/totalMass).value();\n\n    cumulativeContErr += globalContErr;\n\n    Info<< \"time step continuity errors : sum local = \" << sumLocalContErr\n        << \", global = \" << globalContErr\n        << \", cumulative = \" << cumulativeContErr\n        << endl;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/constructCFDEMcloud.H",
    "content": "#if defined(MS)\n    #if defined(superquadrics_flag)\n        cfdemCloudRotationSuperquadric particleCloud(mesh);\n    #else\n        cfdemCloudMS particleCloud(mesh);\n    #endif\n#else\n    cfdemCloud particleCloud(mesh);\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/continuityErrorPhiPU.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2009-2012 JKU, Linz\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nGlobal\n    continuityErrs\n\nDescription\n    Calculates and prints the continuity errors.\n    The code is an evolution of continuityErrs.H in OpenFOAM(R) 2.1.x,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n{\n    volScalarField contErr( fvc::div(phi) + particleCloud.ddtVoidfraction() );\n\n    scalar sumLocalContErr = runTime.deltaTValue()*\n        mag(contErr)().weightedAverage(mesh.V()).value();\n\n    scalar globalContErr = runTime.deltaTValue()*\n        contErr.weightedAverage(mesh.V()).value();\n    cumulativeContErr += globalContErr;\n\n    Info<< \"time step continuity errors : sum local = \" << sumLocalContErr\n        << \", global = \" << globalContErr\n        << \", cumulative = \" << cumulativeContErr\n        << endl;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/continuityErrorPhiVoidfraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright (C) 1991-2009 OpenCFD Ltd.\n                                Copyright (C) 2012-     DCS Computing GmbH,Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling.  If not, see <http://www.gnu.org/licenses/>.\n\nGlobal\n    continuityErrs\n\nDescription\n    Calculates and prints the continuity errors.\n    The code is an evolution of continuityErrs.H in OpenFOAM(R) 2.1.x,\n    where additional functionality for CFD-DEM coupling is added.\n\\*---------------------------------------------------------------------------*/\n\n{\n    volScalarField contErr( fvc::div(phi*voidfractionf) + particleCloud.ddtVoidfraction() );\n\n    scalar sumLocalContErr = runTime.deltaTValue()*\n        mag(contErr)().weightedAverage(mesh.V()).value();\n\n    scalar globalContErr = runTime.deltaTValue()*\n        contErr.weightedAverage(mesh.V()).value();\n    cumulativeContErr += globalContErr;\n\n    Info<< \"time step continuity errors : sum local = \" << sumLocalContErr\n        << \", global = \" << globalContErr\n        << \", cumulative = \" << cumulativeContErr\n        << endl;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/couplingForceError.H",
    "content": "//Compute error due to  implicit part of the \n//coupling force acting on particle cloud (using fluid velocity AFTER solving NS)\n#if defined(version40)\n     fError.ref() -= U.ref() * dimensionedScalar(\"1\", dimensionSet(1, -3, -1, 0, 0), 1.0);\n     fError.ref() *= Ksl.oldTime().ref() * dimensionedScalar(\"1\", dimensionSet(-1, 3, 1, 0, 0), 1.0); \n#else\n    fError.internalField() -= U.internalField();\n    fError.internalField() *= Ksl.oldTime().internalField(); \n#endif\n\n//Remove the old error of coupling force from last fluid time step\n//to f to conserve the overall momentum\n//Minus here, because -f in UEqn\nif(particleCloud.expCorrDeltaUError())\n    f += fError;\n\n//Integrate error\nvector fErrorSum(0.0,0.0,0.0);\n#if defined(version40)\n  fErrorSum = sum(mesh.V()*fError.primitiveField());\n#else\n  fErrorSum = sum(mesh.V()*fError.internalField());\n#endif\nreduce(fErrorSum, sumOp<vector>());\n\nInfo << \"TotalError(dU): \" <<  fErrorSum;\nif(particleCloud.verbose()) // in verbose mode we have data for fImpTotal and fExpTotal to normalize fErrorSum\n{\n    Info                  << \" = \" \n                          <<  mag(fErrorSum) / (mag(fImpTotal.value()+fExpTotal.value())+SMALL)*100.0 << \"% of TotalForceImp\";\n}\n\nif(particleCloud.expCorrDeltaUError())\n    Info << \" (corrected)     \" << endl;\nelse\n    Info << \" (uncorrected)   \" << endl;\n\n//Save U BEFORE solving NS for computing error later\n#if defined(version40)\n  fError.ref() = U.ref() * dimensionedScalar(\"1\", dimensionSet(1, -3, -1, 0, 0), 1.0);\n#else\n  fError.internalField() = U.internalField();\n#endif\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/createCFDEMFields.H",
    "content": "    Info<< \"\\nReading momentum exchange field Ksl\\n\" << endl;\n    volScalarField Ksl\n    (\n        IOobject\n        (\n            \"Ksl\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n        //dimensionedScalar(\"0\", dimensionSet(1, -3, -1, 0, 0), 1.0)\n    );\n\n    Info<< \"\\nReading voidfraction field voidfraction = (Vgas/Vparticle)\\n\" << endl;\n    volScalarField voidfraction\n    (\n        IOobject\n        (\n            \"voidfraction\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"Reading particle velocity field Us\\n\" << endl;\n    volVectorField Us\n    (\n        IOobject\n        (\n            \"Us\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh\n    );\n\n    Info<< \"\\nCreating density field rho\\n\" << endl;\n    volScalarField rho\n    (\n        IOobject\n        (\n            \"rho\",\n            runTime.timeName(),\n            mesh,\n            IOobject::MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh//,\n        //dimensionedScalar(\"0\", dimensionSet(1, -3, 0, 0, 0), 1.0)\n    );\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/createFieldsAddOn.H",
    "content": "    Info<< \"\\nConstructing explicit momentum exchange field f.\\n\" << endl;\n    volVectorField f\n    (\n        IOobject\n        (\n            \"f\",\n            runTime.timeName(),\n            mesh,\n            IOobject::NO_READ, // zeroGradient here + zeroGradient in p can cause troubles --> force calculated by not reading the field \n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedVector(\"0\", dimensionSet(1, -2, -2, 0, 0), vector::zero)\n    );\n    f.storePrevIter();\n\n    Info<< \"Constructing coupling force error field fError.\\n\" << endl;\n    volVectorField fError\n    (\n        IOobject\n        (\n            \"fError\",\n            runTime.timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedVector(\"0\", dimensionSet(1, -2, -2, 0, 0), vector::zero)\n    );\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/debugInfo.H",
    "content": "\n  //========================================================================//\n  scalar countCell=0;              // number of cells touched by particles\n  int points=0;                    // number of particles and sub-points\n  scalar totalParticleWeights=0;   // total weight of all particles and sub-points\n  vector totalForce_array(0,0,0);  // total force on particles based on particle array\n  vector totalForce_field(0,0,0);  // forceField of forceM(), used to calc Ksl\n  scalar particleVolume_radius=0;  // total particle voulme based on radius array\n  scalar particleVolume_field=0;   // total particle voulme based on voidfractionfield\n  scalar particleVolume_array=0;   // total particle voulme based on particle array\n  scalar meanR_array=0;            // mean particle radius based on particle array\n  vector meanUs_array(0,0,0);      // mean solid velocity based on particle array\n  vector meanUs_field(0,0,0);      // mean solid velocity based on field Us\n  scalar meanAlpha_field=0;        // mean voidfraction\n  vector meanU_field(0,0,0);       // mean fluid velocity based on field U\n  scalar fpth=4./3.*M_PI;// 4.*pi/3.\n  //========================================================================//\n\n  // get particle based data\n  for(int index = 0;index <  numberOfParticles(); ++index)\n  {\n      for(int i=0;i<3;i++){\n          totalForce_array[i] += impForces_[index][i]; // in giveDEMdata() exp imp and DEM are summed\n          meanUs_array[i] += fieldsToDEM[idVel()][index][i];\n      }\n      meanR_array += fieldsToDEM[idRadius()][index][0];\n      particleVolume_radius += fieldsToDEM[idRadius()][index][0]*fieldsToDEM[idRadius()][index][0]*fieldsToDEM[idRadius()][index][0]*fpth;\n      \n      // loop subCells\n      for(int subCell=0;subCell<cellsPerParticle()[index][0];subCell++)\n      {\n          points++;\n          totalParticleWeights += particleWeights_[index][subCell];\n          particleVolume_array += particleVolumes_[index][subCell];\n      }\n  }\n\n  // get field based data\n  forAll(alpha,cellI)\n  {\n      // check if a particle is inside cell\n      bool particleInside=false;\n      for(int index = 0;index <  numberOfParticles(); ++index){\n          for(int subCell=0;subCell<cellsPerParticle()[index][0];subCell++){\n              if(cellIDs_[index][subCell] == cellI){\n                  particleInside=true;\n                  break;\n              }\n          }\n      }\n\n      if(particleInside)\n      {\n          countCell++;\n          meanAlpha_field += alpha[cellI];\n          meanU_field += U[cellI];\n          meanUs_field += Us[cellI];\n          particleVolume_field += (1-alpha[cellI])*alpha.mesh().V()[cellI];\n          totalForce_field += forceM(0).expParticleForces()[cellI]+forceM(0).impParticleForces()[cellI];\n      }\n  }\n\n  // averaging\n  if(countCell>0)\n  {\n      meanAlpha_field /= countCell;\n      meanU_field /= countCell; \n      meanUs_field /= countCell;\n  }\n  else\n  {\n      meanAlpha_field = 0;\n      meanU_field = vector(0,0,0); \n      meanUs_field = vector(0,0,0);\n  }\n  meanUs_array /= numberOfParticles()+SMALL;   \n  meanR_array /= numberOfParticles()+SMALL;   \n\n  Info <<\"=============================================================================\" << endl;\n  Info << \"Debug Info, only serial and not tested!\" << endl;\n  Info <<\"  numberOfParticles_ = \"<< numberOfParticles() << \" != \" << endl;\n  Info <<\"totalParticleWeights = \"<< totalParticleWeights << endl;\n  Info <<\"   points= \"<< points << endl;\n  Info <<\"countCell= \"<< countCell << endl;\n  Info <<\"                totalForce_array = \"<< mag(totalForce_array)<< \" != \" << endl;\n  Info <<\"                totalForce_field = \"<< mag(totalForce_field) << endl;\n  Info <<\"            particleVolume_field = \"<< particleVolume_field << \" != \" << endl;\n  Info <<\"            particleVolume_array = \"<< particleVolume_array << \" != \" << endl;\n  Info <<\"           particleVolume_radius = \"<< particleVolume_radius << endl;\n  Info <<\"meanUs_field = \"<< mag(meanUs_field) << \" ~= \" << endl;\n  Info <<\"meanUs_array = \"<< mag(meanUs_array) << endl;\n  Info <<\"meanU_field = \"<< mag(meanU_field) << endl;\n  Info <<\"meanAlpha_field = \"<< meanAlpha_field << endl;\n  Info <<\"meanR_array = \"<< meanR_array << endl;\n  Info <<\"=============================================================================\" << endl;\n  Info << endl;\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/declareCFDEMcloud.H",
    "content": "#if defined(MS)\n    #if defined(superquadrics_flag)\n        #include \"cfdemCloudRotationSuperquadric.H\"\n    #else\n        #include \"cfdemCloudMS.H\"\n    #endif\n#else\n    #include \"cfdemCloud.H\"\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/fixedFluxPressureHandling.H",
    "content": "#ifdef version50\n    if (modelType==\"A\")\n    {\n        volScalarField rUsed = rUA*voidfraction;\n        constrainPressure(p, U, phi, rUsed);\n    }\n    else constrainPressure(p, U, phi, rUA);\n#endif\n#ifndef versionExt32\n#ifndef version40\n    if (modelType==\"A\")\n    {\n        setSnGrad<fixedFluxPressureFvPatchScalarField>\n        (\n            #ifdef versionv1612plus\n                p.boundaryFieldRef(),\n            #else\n                p.boundaryField(),\n            #endif\n            (\n                phi.boundaryField()\n              - (mesh.Sf().boundaryField() & U.boundaryField())\n            )/(mesh.magSf().boundaryField()*rUAf.boundaryField()*voidfractionf.boundaryField())\n        );\n    }else\n    {\n        setSnGrad<fixedFluxPressureFvPatchScalarField>\n        (\n            #ifdef versionv1612plus\n                p.boundaryFieldRef(),\n            #else\n                p.boundaryField(),\n            #endif\n            (\n                phi.boundaryField()\n              - (mesh.Sf().boundaryField() & U.boundaryField())\n            )/(mesh.magSf().boundaryField()*rUAf.boundaryField())\n        );\n    }\n#endif\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/forceCheckEx.H",
    "content": "// NOTE:\n// this file is typically included at a position of the solver so that\n// it reports the momentum exchange based on f of the current time step\n\ndimensionedVector fExpTotal;\n\nif(particleCloud.verbose())\n{\n    //calc. total source - this NOT a relevant explicit force!\n    dimensionedVector fExpSource = -1 * particleCloud.momCoupleM(particleCloud.registryM().getProperty(\"explicitCouple_index\")).returnIntegralSourceField(); //negative because we want the force on the fluid\n    reduce(fExpSource, sumOp<dimensionedVector>()); //must reduce, since sum in function is not the global sum!\n\n    //calc. total explicit force\n    fExpTotal = -gSum( \n                                        mesh.V()\n                                    #if defined(version40)\n                                        * f.primitiveField()\n                                    #else\n                                        * f.internalField()\n                                    #endif\n                                        //\n                                      ); //negative because we want the force on the fluid\n\n    fExpTotal.value() -= fExpSource.value();    //Subtract the explicit source, since this is NOT a coupling force!!\n\n    Info << \"  TotalSourceExp [N]: \" << fExpSource.value() << endl;\n    Info << \"  TotalForceExp [N]:  \" << fExpTotal.value()  << endl;\n    Info << \"  These values are based on latest f and fExpSource.\\n\" << endl;\n}\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/forceCheckIm.H",
    "content": "// NOTE:\n// this file is typically included at a position of the solver so that\n// it reports the momentum exchange based on Ksl and Us of the current time step\n// but U is the solution of the previous time step!!!\n\ndimensionedVector fImpTotal;\n\nif(particleCloud.verbose())\n{\n    Info << \"\\nSolver level total Eulerian momentum exchange:\"<< endl;\n\n    //calc. total implicit force\n    volVectorField fImp(Ksl*(Us-U));\n    particleCloud.scaleWithVcell(fImp);\n    fImpTotal = gSum(fImp);\n    Info << \"  TotalForceImp [N]:  \" << fImpTotal.value() << endl;\n    Info << \"  Warning, these values are based on latest Ksl and Us but prev. iteration U!\\n\" << endl;\n}\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/forceCheckImEx.H",
    "content": "//Force Checks - calc. total explicit and implicit force\n#include \"forceCheckIm.H\"\n#include \"forceCheckEx.H\"\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/global.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"global.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(global, 0);\n\ndefineRunTimeSelectionTable(global, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid global::info()\n{\n    Info << \"\\nYou are currently using:\" << endl;\n    Info << \"OF version: \" << FOAMversion << endl;\n    Info << \"OF build: \" << FOAMbuild << endl;\n    Info << \"CFDEM build: \" << CFDEMversion << \"\\n\" << endl;\n}\n\nbool global::debugMode()\n{\n    if(word(DEBUG)!=word(\"Opt\"))\n    {\n        return true;\n    }else\n    {\n        return false;\n    }\n}\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nglobal::global\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    CFDEMversion(GITVERSION),\n    DEBUG(DEBUGFLAG)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nglobal::~global()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/global.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    global\n\nSourceFiles\n    global.Cver\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef global_H\n#define global_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class global Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass global\n{\n\nprotected:\n\n    // Protected data\n    const dictionary& dict_;\n\n    cfdemCloud& particleCloud_;\n\n    const char* const CFDEMversion;\n\n    const char* const DEBUG;\n\n\n    // Protected member functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"global\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            global,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        global\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~global();\n\n\n    // Selector\n\n        static autoPtr<global> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Member Function\n\n    void info();\n\n    // Access\n\n    bool debugMode();\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/mathExtra.H",
    "content": "/* ----------------------------------------------------------------------\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n    \n    Copyright of this contribution:\n    Copyright 2014-     TU Graz, IPPT\n------------------------------------------------------------------------- */\n\n#ifndef CFDEM_MATH_EXTRA_H\n#define CFDEM_MATH_EXTRA_H\n\n#include \"error.h\"\n\n#include <vector>\n//#include <cmath>\n#include <cstdio>\n#include <cctype>\n\n#define TOLERANCE_ORTHO 1e-10\n\nnamespace MathExtra \n{\n\n//  inline void     outerProduct(double *vec1, double *vec2, double **m);\n//  inline double  spheroidGeometry(int index, double bi, double ai);\n\n\n\n//--------------------------------------------------------------------\n//   Outer Product of two vectors\ninline void outerProduct(double *vec1, double *vec2, double **m)\n{\n  int i, j;\n  //debug output\n//  for( i = 0; i < 3; ++i )\n//    printf(\"OUTER PRODUCT: Input: vec1 element %d = %g\", i, vec1[i]);\n//  for( i = 0; i < 3; ++i )\n//    printf(\"OUTER PRODUCT: Input: vec2 element %d=%g\", i, vec2[i]);\n  \n  //calculation\n  for( i = 0; i < 3; ++i )\n    for( j = 0; j < 3; ++j )\n    {\n      m[i][j] = vec1[i] * vec2[j];\n      printf(\"OUTER PRODUCT: Result: m[%d][%d]=%g\", i, j, m[i][j]);\n    }\n    \n    \n}\n\n//--------------------------------------------------------------------\n// Compute the diameter of the hydrodynamically equivalent cylinder\ninline double spheroidDiameter(\n                                double shapeX, double shapeY, double shapeZ,\n                                double& aspectRatio\n                              )\n{\n    //INPUT\n    //  shape       ...values with the half-axes of the spheroid\n    \n    //OUTPUT\n    //  aspectRatio ...the aspect ratio of the spheroid (ai/bi)\n    //                 is also that of the cylinder element\n    //  return value... the hydrodynamically equivalent diameter \n\n     double   bi = std::min( shapeX, std::min(shapeY,shapeZ) );\n     aspectRatio = std::max( shapeX, std::max(shapeY,shapeZ) ) \n                 / std::max(bi,1e-32);\n     aspectRatio = std::max(1.000001,aspectRatio);\n\n     return 2.48 * bi / std::sqrt( std::log(aspectRatio) );\n\n}\n\n//--------------------------------------------------------------------\n// Compute the major, minor axis and eccentricity parameters of a prolate spheroid\ninline bool spheroidGeometry(double aspectRatio,     //input\n                             double& ei, double& Le              //outputs\n                            ) //\n{\n    //INPUT\n    //  aspectRatio ...major/minor aspect ratio\n    \n    //OUTPUT\n    //  ei  ... \n    //  Le  ... \n\n \tei = std::sqrt( \n                     1.0\n                   - 1.0 / (aspectRatio*aspectRatio)\n \t              );\n \tLe = std::log(\n \t\t           (1.0+ei)\n \t\t          /(1.0-ei)\n                 );\n\n\treturn true; \t\t    \n}\n\n//--------------------------------------------------------------------\n// Compute the major, minor axis and eccentricity parameters of a prolate spheroid\ninline double Pi()\n{\n    return 3.1415926535897932384626433832795;\n}\n\n\n//--------------------------------------------------------------------\n// Compute the eccentricity parameters of a prolate spheroid\ninline bool spheroidGeometry2(   double  aspectRatio,                 //inputs\n                                 double& XAe,    double& YAe,         //outputs\n                                 double& XCe,    double& YCe,         //outputs\n                                 double& YHe                          //outputs\n                                ) //\n{\n    //INPUT\n    //  aspectRatio ...major/minor aspect ratio of the spheroid\n    \n    //OUTPUT\n    //  XAe  ...Eccentricity dependet parameter\n    //  YAe  ...Eccentricity dependet parameter\n    //  XCe  ...Eccentricity dependet parameter\n    //  XCe  ...Eccentricity dependet parameter\n    //  YCe  ...Eccentricity dependet parameter\n    //  YHe  ...Eccentricity dependet parameter\n  \n\n    double ei(0.0), Le(0.0);  \n    bool   result = \n           spheroidGeometry(aspectRatio,  //inputs\n                            ei,    Le     //outputs\n                           );\n    if(!result)\n        return false;\n        \n    XAe= 2.6666666666666666666666667\n         *ei*ei*ei\n         /(-2.0*ei+(1.0+ei*ei)*Le); \n    YAe= 5.333333333333333333333333333\n        *ei*ei*ei\n        /(2.0*ei+(3*ei*ei-1.0)*Le);\n    XCe= 1.333333333333333333333333333\n        *ei*ei*ei\n        *(1.0-ei*ei)\n        /(2.0*ei-(1.0-ei*ei)*Le);\n    YCe= 1.3333333333333333333333\n        *ei*ei*ei\n        *(2.0-ei*ei)\n        /(-2.0*ei+(1.0+ei*ei)*Le);\n    YHe= 1.3333333333333333333333\n        *ei*ei*ei*ei*ei\n        /(-2.0*ei+(1.0+ei*ei)*Le);\n\n\treturn true; \t\t    \n\n}\n\n//--------------------------------------------------------------------\n// zeroize a 3x3x3 tensor\ninline void zeroize333(double tensor[3][3][3] )\n{\n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n            for(int iZ=0; iZ<3; iZ++)\n                tensor[iX][iY][iZ] = 0.0;\n}\n\n//--------------------------------------------------------------------\n// zeroize a 3x3 tensor\ninline void zeroize33(double tensor[3][3] )\n{\n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n                tensor[iX][iY] = 0.0;\n}\n\n//--------------------------------------------------------------------\n// multiply a 3x3x3 tensor with a scalar\ninline void multiply333(double scalar, double tensor[3][3][3] )\n{\n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n            for(int iZ=0; iZ<3; iZ++)\n                tensor[iX][iY][iZ] *= scalar;\n}\n//--------------------------------------------------------------------\n// Compute a dot and dyadic product of with a vector\ninline void permutationTensor(double tensor[3][3][3] )\n{\n    zeroize333(tensor);\n    tensor[0][1][2] = 1.0; \n    tensor[1][2][0] = 1.0; \n    tensor[2][0][1] = 1.0; \n    tensor[0][2][1] =-1.0; \n    tensor[2][1][0] =-1.0; \n    tensor[1][0][2] =-1.0; \n}\n\n\n\n//--------------------------------------------------------------------\n// Compute a dot product of the permutation tensor and \n// then a dyadic product of with a vector\ninline bool permutationDotDyadic( \n                                 double vector[3], \n                                 double  tensor[3][3][3]      \n                                )\n{\n    //Generate permutation tensor\n    double permutationT[3][3][3];\n    permutationTensor(permutationT);\n    \n    //Step 1: compute dot prodcut of permutation tensor\n    double permutationDotProd[3][3];\n    zeroize33(permutationDotProd);\n\n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n            for(int iZ=0; iZ<3; iZ++)\n                permutationDotProd[iX][iY] += permutationT[iX][iY][iZ]\n                                            * vector[iZ];\n\n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n            for(int iZ=0; iZ<3; iZ++)\n                tensor[iX][iY][iZ] = permutationDotProd[iX][iY]\n                                   * vector[iZ]; \n    return true;\n\n}\n\n//--------------------------------------------------------------------\n// Compute a dot and dyadic product of with a vector\ninline bool doubleDotTensor333Tensor33(double tensor333[3][3][3], \n                                       double tensor33[3][3],\n                                       double result[3]\n                                      )\n{\n    result[0]=0.0;result[1]=0.0;result[2]=0.0;\n    \n    for(int iX=0; iX<3; iX++)\n        for(int iY=0; iY<3; iY++)\n            for(int iZ=0; iZ<3; iZ++)\n                result[iX] += tensor333[iX][iY][iZ] * tensor33[iY][iZ];\n\n    return true;\n}\n\n}; //end of namespace\n\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/newGlobal.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"global.H\"\n#include \"dilute.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<global> global::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word globalType\n    (\n        dict.lookup(\"global\")\n    );\n\n    Info<< \"Selecting global \"\n         << globalType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(globalType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"global::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown globalType type \"\n            << globalType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid global types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<global>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/readPISOControls_OF30.H",
    "content": "\n//create PISO object\npisoControl piso(mesh);\n\n//create lables\nlabel nCorr             = piso.nCorrPISO();\nlabel nNonOrthCorr      = piso.nNonOrthCorr();\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetAlphaInterpolator.H",
    "content": "alphaInterpolator_.clear();\nalphaInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"alphaInterpolationType\",word(\"cellPoint\")),alpha_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetDDtUInterpolator.H",
    "content": "DDtUInterpolator_.clear();\nDDtUInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"DDtUInterpolationType\",word(\"cellPointFace\")),DDtU_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetDSauterInterpolator.H",
    "content": "dSauterInterpolator_.clear();\ndSauterInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"dSauterInterpolationType\",word(\"cellPoint\")),dSauter_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetDivTauInterpolator.H",
    "content": "divTauInterpolator_.clear();\ndivTauInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"divTauInterpolationType\",word(\"cellPointFace\")),divTau_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetFluidScalarFieldInterpolator.H",
    "content": "fluidScalarFieldInterpolator_.clear();\nfluidScalarFieldInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"fluidScalarFieldInterpolationType\",word(\"cellPoint\")),fluidScalarField_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGInterpolator.H",
    "content": "GInterpolator_.clear();\nGInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"GInterpolationType\",word(\"cellPoint\")),G_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGradAlphaInterpolator.H",
    "content": "gradAlphaInterpolator_.clear();\ngradAlphaInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"gradAlphaInterpolationType\",word(\"cellPointFace\")),gradAlpha_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGradPInterpolator.H",
    "content": "gradPInterpolator_.clear();\ngradPInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"gradPInterpolationType\",word(\"cellPointFace\")),gradP_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGradPsolidInterpolator.H",
    "content": "gradPsolidInterpolator_.clear();\ngradPsolidInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"gradPsolidInterpolationType\",word(\"cellPoint\")),gradPsolid_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGradUInterpolator.H",
    "content": "gradUInterpolator_.clear();\ngradUInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"gradUInterpolationType\",word(\"cellPointFace\")),gradU_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetGradVoidfractionInterpolator.H",
    "content": "gradVoidfractionInterpolator_.clear();\ngradVoidfractionInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"gradVoidfractionInterpolationType\",word(\"cellPointFace\")),gradVoidfraction_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetPhiP1Interpolator.H",
    "content": "phiP1Interpolator_.clear();\nphiP1Interpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"phiP1InterpolationType\",word(\"cellPoint\")),phiP1_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetPhiP2Interpolator.H",
    "content": "phiP2Interpolator_.clear();\nphiP2Interpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"phiP2InterpolationType\",word(\"cellPoint\")),phiP2_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetRhoInterpolator.H",
    "content": "RhoInterpolator_.clear();\nRhoInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"RhoInterpolationType\",word(\"cellPoint\")),rho_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetShearRateInterpolator.H",
    "content": "shearRateInterpolator_.clear();\nshearRateInterpolator_.reset(interpolation<symmTensor>::New(propsDict_.lookupOrDefault(\"shearRateInterpolationType\",word(\"cellPointFace\")),shearRate_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetTInterpolator.H",
    "content": "TInterpolator_.clear();\nTInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"TInterpolationType\",word(\"cellPoint\")),T_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetUInterpolator.H",
    "content": "UInterpolator_.clear();\nUInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"UInterpolationType\",word(\"cellPointFace\")),U_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetUp1Interpolator.H",
    "content": "Up1Interpolator_.clear();\nUp1Interpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"Up1InterpolationType\",word(\"cellPointFace\")),Up1_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetUp2Interpolator.H",
    "content": "Up2Interpolator_.clear();\nUp2Interpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"Up2InterpolationType\",word(\"cellPointFace\")),Up2_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetUsInterpolator.H",
    "content": "UsInterpolator_.clear();\nUsInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"UsInterpolationType\",word(\"cellPointFace\")),Us_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetVoidfractionInterpolator.H",
    "content": "voidfractionInterpolator_.clear();\nvoidfractionInterpolator_.reset(interpolation<scalar>::New(propsDict_.lookupOrDefault(\"voidfractionInterpolationType\",word(\"cellPoint\")),voidfraction_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/resetInterpolators/resetVorticityInterpolator.H",
    "content": "vorticityInterpolator_.clear();\nvorticityInterpolator_.reset(interpolation<vector>::New(propsDict_.lookupOrDefault(\"vorticityInterpolationType\",word(\"cellPointFace\")),vorticity_).ptr());\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/sanityChecks/level0_Cloud.H",
    "content": "//======================================================================//\n//Check if user attempts to change fluid time step\nif( mesh_.time().controlDict().lookupOrDefault<Switch>(\"adjustTimeStep\", false) && !allowAdjustTimeStep_ )\n{\n    FatalError << \"cfdemCloud:: you want to adjustTimeStep in controlDict. This is not allowed in this version of CFDEM.\"\n               << abort(FatalError);\n}\n\n//======================================================================//\n//Check if mesh is empty (decomposition error)\nif(mesh_.cells().size() < 1)\n{\n    int nprocs;\n    MPI_Comm_size(MPI_COMM_WORLD,&nprocs);\n    if(nprocs > 2)  FatalError << endl << \"cfdemCloud:: local mesh has zero cells. Please check the mesh and the decomposition!\" << abort(FatalError);\n\n    Pout << \"WARNING: cfdemCloud:: local mesh has zero cells. Please check the mesh and the decomposition!\" << endl;\n}\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/sanityChecks/level0_Solver.H",
    "content": "//============================================================//\n// check model type\n// referring to: Zhou et al. 2010,JFM\nword modelType = particleCloud.modelType();\n\n//Warning << \"model type not being checked\" << endl;\nif (modelType==\"Bfull\"){\n    Info << \"solving volume averaged Navier Stokes equations of type Bfull\\n\"<< endl;\n\n    // check if gradPForce is used\n    bool found=false;\n    forAll(particleCloud.forceModels(),i)\n    {\n        if(particleCloud.forceModels()[i]==\"gradPForce\")\n            found=true;\n    }\n    if(!found)\n        FatalError <<\"gradPForce model not found! Consider selecting gradPForce model or switching to model type B.\\n\" << abort(FatalError);\n\n    // check if viscForce is used\n    found=false;\n    forAll(particleCloud.forceModels(),i)\n    {\n        if(particleCloud.forceModels()[i]==\"viscForce\")\n            found=true;\n    }\n    if(!found)\n        FatalError <<\"viscForce model not found! Consider selecting viscForce model or switching to model type B.\\n\" << abort(FatalError);\n\n}else if(modelType==\"B\"){\n    Info << \"solving volume averaged Navier Stokes equations of type B\\n\"<< endl;\n\n    // check if gradP and viscForce are used\n    bool found=false;\n    forAll(particleCloud.forceModels(),i)\n    {\n        if(particleCloud.forceModels()[i]==\"gradPForce\" || particleCloud.forceModels()[i]==\"viscForce\")\n            found=true;\n    }\n    if(found)\n        FatalError <<\"do not use gradPForce and viscForce with model type B!\\n\" << abort(FatalError);\n\n}else if (modelType==\"A\"){\n    Info << \"solving volume averaged Navier Stokes equations of type A\"<< endl;\n\n    // check if gradP is used\n    bool found=false;\n    forAll(particleCloud.forceModels(),i)\n    {\n        if(particleCloud.forceModels()[i]==\"gradPForce\")\n            found=true;\n    }\n    if(!found)\n        FatalError <<\"gradPForce model not found! Consider selecting gradPForce model or switching to model type B.\\n\" << abort(FatalError);\n\n    // check if viscForce is used\n    found=false;\n    forAll(particleCloud.forceModels(),i)\n    {\n        if(particleCloud.forceModels()[i]==\"viscForce\")\n            found=true;\n    }\n    if(!found)\n    {\n        FatalError <<\"viscForce model not found! Consider selecting viscForce model or switching to model type B.\\n\" << abort(FatalError);\n    }\n}else if (modelType==\"none\")\n{\n    Warning << \"You chose model type -none- you might get erroneous results!\" << endl;\n}\nelse\n{\n    FatalError <<\"no suitable model type specified:\" << modelType << \"\\n\" << abort(FatalError);\n}\n//============================================================//\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/setupProbeModel.H",
    "content": " //set probeModel parameters for this force model\n //CANNOT be used for scalarGeneralExchange force model, since this force model handles multiple species\n if(probeIt_)\n     particleCloud_.probeM().setOutputFile(typeName+\".logDat\");\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/setupProbeModelfields.H",
    "content": "Field<vector> vValues;\nvValues.clear();\nField<scalar> sValues;\nsValues.clear();\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdTools/versionInfo.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef versionInfo_H\n#define versionInfo_H\n\nword CFDEMversion=\"cfdem-3.8.1\";\nword compatibleLIGGGHTSversion=\"3.8.0\";\nword OFversion=\"6-commit-af7d7f427be78e9b9beb6aceca8fe7d5d4636876\";\n\nInfo << \"\\nCFDEMcoupling version: \" << CFDEMversion <<  endl;\nInfo << \", compatible to LIGGGHTS version: \" << compatibleLIGGGHTSversion <<  endl;\nInfo << \", compatible to OF version and build: \" << OFversion <<  endl;\n\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"fileName.H\"\n#include \"cfdemCloud.H\"\n#include \"global.H\"\n#include \"forceModel.H\"\n#include \"locateModel.H\"\n#include \"momCoupleModel.H\"\n#include \"meshMotionModel.H\"\n#include \"voidFractionModel.H\"\n#include \"dataExchangeModel.H\"\n#include \"IOModel.H\"\n#include \"probeModel.H\"\n#include \"registryModel.H\"\n#include \"averagingModel.H\"\n#include \"clockModel.H\"\n#include \"smoothingModel.H\"\n#include \"liggghtsCommandModel.H\"\n#include \"cyclicPolyPatch.H\"\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\nFoam::cfdemCloud::cfdemCloud\n(\n    const fvMesh& mesh\n)\n:\n    mesh_(mesh),\n    couplingProperties_\n    (\n        IOobject\n        (\n            \"couplingProperties\",\n            mesh_.time().constant(),\n            mesh_,\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    ),\n    liggghtsCommandDict_\n    (\n        IOobject\n        (\n            \"liggghtsCommands\",\n            mesh_.time().constant(),\n            mesh_,\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    ),\n    cgParticleSpecific_(false),\n    cgTypeSpecificDifferent_(false),\n    allowAdjustTimeStep_(couplingProperties_.lookupOrDefault<Switch>(\"allowAdjustTimeStep\", false)),\n    solveFlow_(true),\n    solveScalarTransport_(true),\n    verbose_(couplingProperties_.lookupOrDefault<Switch>(\"verbose\", false)),\n    expCorrDeltaUError_(false),\n    debug_(false),\n    allowCFDsubTimestep_(true),\n    ignore_(false),\n    writeTimePassed_(false),\n    resetWriteTimePassed_(false),\n    modelType_(couplingProperties_.lookup(\"modelType\")),\n    impForces_(NULL),\n    expForces_(NULL),\n    voidfractions_(NULL),\n    cellIDs_(NULL),\n    particleWeights_(NULL),\n    particleVolumes_(NULL),\n    particleV_(NULL),\n    dragPrev_(NULL),\n    numberOfParticles_(-1),\n    d32_(-1),\n    numberOfParticlesChanged_(false),\n    arraysReallocated_(false),\n    forceModels_(couplingProperties_.lookup(\"forceModels\")),\n    momCoupleModels_(couplingProperties_.lookup(\"momCoupleModels\")),\n    liggghtsCommandModelList_(liggghtsCommandDict_.lookup(\"liggghtsCommandModels\")),\n    turbulenceModelType_(couplingProperties_.lookup(\"turbulenceModelType\")),\n    isLES_(false),\n    cg_(1.),\n    cgOK_(true),\n    impDEMdrag_(false),\n    impDEMdragAcc_(false),\n    imExSplitFactor_(1.0),\n    treatVoidCellsAsExplicitForce_(false),\n    useDDTvoidfraction_(\"off\"),\n    ddtVoidfraction_\n    (\n        IOobject\n        (\n            \"ddtVoidfraction\",\n            mesh.time().timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n        dimensionedScalar(\"zero\", dimensionSet(0,0,-1,0,0), 0)  // 1/s\n    ),\n    checkPeriodicCells_(couplingProperties_.lookupOrDefault<Switch>(\"checkPeriodicCells\",false)),\n    wall_periodicityCheckRange_(vector(1,1,1)),\n    wall_periodicityCheckTolerance_(1e-07),\n    meshHasUpdated_(false),\n    turbulence_\n    (\n        #if defined(version24Dev)\n            mesh.lookupObject<turbulenceModel>\n        #elif defined(version21) || defined(version16ext)\n            #ifdef compre\n                mesh.lookupObject<compressible::turbulenceModel>\n            #else\n                mesh.lookupObject<incompressible::turbulenceModel>\n            #endif\n        #elif defined(version15)\n            mesh.lookupObject<incompressible::RASModel>\n        #endif\n        (\n            turbulenceModelType_\n        )\n    ),\n    turbulenceMultiphase_\n    (\n        IOobject\n        (\n            \"turbulenceMultiphase\",\n            mesh.time().timeName(),\n            mesh,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh,\n#ifdef compre\n        dimensionedScalar(\"zero\", dimensionSet(1,-1,-1,0,0), 0)  // kg/m/s\n#else\n        dimensionedScalar(\"zero\", dimensionSet(0,2,-1,0,0), 0)  // m²/s\n#endif\n    ),\n    locateModel_\n    (\n        locateModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    /*momCoupleModel_\n    (\n        momCoupleModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),*/\n    dataExchangeModel_\n    (\n        dataExchangeModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    IOModel_\n    (\n        IOModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    probeModel_\n    (\n        probeModel::New\n        (\n            couplingProperties_,\n            *this,\n            const_cast<char *>(\"none\"),\n            const_cast<char *>(\"none\")\n        )\n    ),\n    registryModel_\n    (\n        registryModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    voidFractionModel_\n    (\n        voidFractionModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    averagingModel_\n    (\n        averagingModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    clockModel_\n    (\n        clockModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    smoothingModel_\n    (\n        smoothingModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    meshMotionModel_\n    (\n        meshMotionModel::New\n        (\n            couplingProperties_,\n            *this\n        )\n    ),\n    idRadius_(-1),\n    idPos_(-1),\n    idVel_(-1),\n    idFacc_(-1),\n    idPartTypes_(-1),\n    idDragExp_(-1),\n    idKsl_(-1),\n    idKslExtra_(-1),\n    idUf_(-1),\n    idTorqueExp_(-1),\n    idKslRotation_(-1),\n    idPullRotation_(-1),\n    idPullOrientation_(-1),\n    idPullOrientation1_(-1),\n    idPullShape_(-1),\n    idDragExpCM_(-1),\n    idKslCM_(-1),\n    idKslExtraCM_(-1),\n    idUfCM_(-1),\n    idTorqueExpCM_(-1),\n    idKslRotationCM_(-1),\n    idFhydro_(-1),\n    idVisc_(-1),\n    idBlockiness_(-1),\n    idArea_(-1),\n    idVol_(-1),\n    idQuat_(-1),\n    idK_(-1),\n    idEpsilon_(-1),\n    idParticleCG_(-1),\n    idMass_(-1),\n    idDensity_(-1),\n    idType_(-1),\n    idConvectiveHeatFlux_(-1),\n    idTemp_(-1)\n{\n    #include \"versionInfo.H\"\n    global buildInfo(couplingProperties_,*this);\n    buildInfo.info();\n\n    //-- apply debug Mode to sub models\n\n    // set debug flag according to env\n    debug_ = buildInfo.debugMode();\n\n    // overwrite debug flag if found in dict\n    if (couplingProperties_.found(\"debug\"))\n        debug_=Switch(couplingProperties_.lookup(\"debug\"));\n\n    // apply flag\n    if(!debugMode()) ddtVoidfraction_.writeOpt() = IOobject::NO_WRITE;\n    if(!debugMode()) turbulenceMultiphase_.writeOpt() = IOobject::NO_WRITE;\n    voidFractionM().applyDebugSettings(debugMode());\n    averagingM().applyDebugSettings(debugMode());\n    //--\n\n    //push dummy to type-specific cg factor since types start with 1\n    cgTypeSpecific_.push_back(-1);\n    cgTypeSpecificDifferent_ = false;\n    dataExchangeM().setCG();\n\n    Info << \"If BC are important, please provide volScalarFields -imp/expParticleForces-\" << endl;\n    if (couplingProperties_.found(\"solveFlow\"))\n        solveFlow_=Switch(couplingProperties_.lookup(\"solveFlow\"));\n    if (couplingProperties_.found(\"solveScalarTransport\"))\n        solveScalarTransport_=Switch(couplingProperties_.lookup(\"solveScalarTransport\"));\n    if (couplingProperties_.found(\"imExSplitFactor\"))\n        imExSplitFactor_ = readScalar(couplingProperties_.lookup(\"imExSplitFactor\"));\n\n    if(imExSplitFactor_>1.0)\n            FatalError  << \"You have set imExSplitFactor > 1 in your couplingProperties. Must be <=1.\"\n                       << abort(FatalError);\n    if(imExSplitFactor_<0.0)\n            FatalError  << \"You have set imExSplitFactor < 0 in your couplingProperties. Must be >=0\"\n                       << abort(FatalError);\n\n    if (couplingProperties_.found(\"ignore\")) ignore_=true;\n    if (turbulenceModelType_==\"LESProperties\")\n    {\n        isLES_ = true;\n        Info << \"WARNING - LES functionality not yet tested!\" << endl;\n    }\n\n    if (couplingProperties_.found(\"useDDTvoidfraction\"))\n    {\n        useDDTvoidfraction_=word(couplingProperties_.lookup(\"useDDTvoidfraction\"));\n\n        if(useDDTvoidfraction_==word(\"a\") ||\n           useDDTvoidfraction_==word(\"b\") ||\n           useDDTvoidfraction_==word(\"off\")\n          )\n            Info << \"choice for ddt(voidfraction) = \" << useDDTvoidfraction_ << endl;\n        else\n            FatalError << \"Model \" << useDDTvoidfraction_\n                       << \" is not a valid choice for ddt(voidfraction). Choose a or b or off.\"\n                       << abort(FatalError);\n    }\n    else\n        Info << \"ignoring ddt(voidfraction)\" << endl;\n\n    momCoupleModel_ = new autoPtr<momCoupleModel>[momCoupleModels_.size()];\n    for (int i=0;i<momCoupleModels_.size();i++)\n    {\n        momCoupleModel_[i] = momCoupleModel::New\n        (\n            couplingProperties_,\n            *this,\n            momCoupleModels_[i]\n        );\n        momCoupleModel_[i]().applyDebugSettings(debugMode());\n        registryM().addProperty(momCoupleModel_[i]().type()+\"_index\",i);\n    }\n\n    forceModel_ = new autoPtr<forceModel>[nrForceModels()];\n    for (int i=0;i<nrForceModels();i++)\n    {\n        forceModel_[i] = forceModel::New\n        (\n            couplingProperties_,\n            *this,\n            forceModels_[i]\n        );\n        forceModel_[i]().applyDebugSettings(debugMode());\n        registryM().addProperty(forceModel_[i]().type()+\"_index\",i);\n    }\n\n    IOM().allocFieldsToDEM();\n\n    registryM().addProperty(voidFractionM().type()+\"_index\", 0);\n    registryM().addProperty(dataExchangeM().type()+\"_index\", 0);\n\n    // Note: this check for getProperty(\"multisphere\") does not work as the cloud is\n    // built before cloudMS which sets the property\n    //if (nrForceModels()<SMALL && registryM().getProperty(\"multisphere\")<1)\n    //    FatalError  << \"Please use at least one forceModel ! \"\n    //                << \"(e.g. noDrag) \\n\"\n    //                << abort(FatalError);\n\n    // run liggghts commands from cfdem\n    liggghtsCommand_ = new autoPtr<liggghtsCommandModel>[liggghtsCommandModelList_.size()];\n    for (int i=0;i<liggghtsCommandModelList_.size();i++)\n    {\n        liggghtsCommand_[i] = liggghtsCommandModel::New\n        (\n            liggghtsCommandDict_,\n            *this,\n            liggghtsCommandModelList_[i],\n            i\n        );\n        registryM().addProperty(liggghtsCommand_[i]().type()+\"_index\",i);\n    }\n\n    #include \"sanityChecks/level0_Cloud.H\"\n}\n\n// * * * * * * * * * * * * * * * * Destructors  * * * * * * * * * * * * * * //\nFoam::cfdemCloud::~cfdemCloud()\n{\n    clockM().evalPar();\n    clockM().normHist();\n    dataExchangeM().destroy(impForces_,3);\n    dataExchangeM().destroy(expForces_,3);\n    dataExchangeM().destroy(voidfractions_,1);\n    dataExchangeM().destroy(cellIDs_,1);\n    dataExchangeM().destroy(particleWeights_,1);\n    dataExchangeM().destroy(particleVolumes_,1);\n    dataExchangeM().destroy(particleV_,1);\n\n    //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n    int iUser=0;\n    for( std::vector<double**>::iterator\n         it  = fieldsToDEM.begin();\n         it != fieldsToDEM.end();\n       ++it)\n    {\n        Info << \"cfdemCloud destroys UserCFDEM data: \" << namesfieldsToDEM[iUser++] << endl;\n        int id = std::distance(fieldsToDEM.begin(), it);\n        if(typesfieldsToDEM[id]==\"scalar-atom\" || typesfieldsToDEM[id]==\"scalar-multisphere\")\n            dataExchangeM().destroy((*it),1);\n        else if(typesfieldsToDEM[id]==\"vector-atom\" || typesfieldsToDEM[id]==\"vector-multisphere\")\n            dataExchangeM().destroy((*it),3);\n        else if(typesfieldsToDEM[id]==\"vector2D-atom\" || typesfieldsToDEM[id]==\"vector2D-multisphere\")\n            dataExchangeM().destroy((*it),2);\n        else if(typesfieldsToDEM[id]==\"quaternion-atom\" || typesfieldsToDEM[id]==\"quaternion-multisphere\")\n            dataExchangeM().destroy((*it),4);\n        else\n            FatalError << \"cfdemCloud::~cfdemCloud(): unknown data type \"<<  typesfieldsToDEM[id] << \" to destroy.\" << abort(FatalError);\n    }\n    //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n}\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\nvoid Foam::cfdemCloud::getDEMdata()\n{\n    if(verbose_) Info << \"Foam::cfdemCloud::getDEMdata()\" << endl;\n    for(std::vector<word>::iterator it = namesfieldsToDEM.begin(); it != namesfieldsToDEM.end(); ++it)\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n        if(pullfieldsToDEM[id])\n        {\n            Info << \"get field with name '\" << *it << \"' at position: \" << id << endl;\n            if(namesfieldsToDEM[id]==\"shapetype\" || namesfieldsToDEM[id]==\"type\" || namesfieldsToDEM[id]==\"body\" || namesfieldsToDEM[id]==\"id\") //type is of type int and we do not yet have fieldsToDEM for int\n            {\n                int** h=NULL;\n                dataExchangeM().allocateArray(h,0.,1);\n                dataExchangeM().getData(namesfieldsToDEM[id],typesfieldsToDEM[id],h);\n                for(int i=0;i<numberOfParticles_;i++)\n                {\n                    fieldsToDEM[id][i][0]=h[i][0];\n                    if(namesfieldsToDEM[id]==\"shapetype\") fieldsToDEM[id][i][0] += 1; // conversion to clumpType convention\n                }\n            }\n            else if(namesfieldsToDEM[id]==\"clumptype\" || namesfieldsToDEM[id]==\"nrigid\" || namesfieldsToDEM[id]==\"id_multisphere\")\n            {\n                int** h=NULL;\n                dataExchangeM().allocateArray(h,0.,1);\n                dataExchangeM().getData(namesfieldsToDEM[id],typesfieldsToDEM[id],h);\n                for(int i=0;i<numberOfClumps();i++)\n                {\n                    fieldsToDEM[id][i][0]=h[i][0];\n                }\n            }\n            else\n                dataExchangeM().getData(namesfieldsToDEM[id],typesfieldsToDEM[id],fieldsToDEM[id]);\n        }\n    }\n    if(verbose_) Info << \"Foam::cfdemCloud::getDEMdata() - done.\" << endl;\n}\n\nvoid Foam::cfdemCloud::giveDEMdata()\n{\n    for(std::vector<word>::iterator it = namesfieldsToDEM.begin(); it != namesfieldsToDEM.end(); ++it)\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n        if(!pullfieldsToDEM[id])\n        {\n            Info << \"giveData field with name '\" << *it << \"' at position: \" << id << endl;\n            dataExchangeM().giveData(namesfieldsToDEM[id],typesfieldsToDEM[id],fieldsToDEM[id]);\n        }\n    }\n    if(verbose_) Info << \"giveDEMdata done.\" << endl;\n}\n\n// * * * * * * * * * * * * * * * protected Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::cfdemCloud::setNumberOfParticles(int nP)\n{\n    if(nP != numberOfParticles())\n    {\n        numberOfParticlesChanged_ = true;\n        numberOfParticles_ = nP;\n    }\n}\n\nvoid Foam::cfdemCloud::setNumberOfClumps(int nC)\n{\n    //Info << \"Foam::cfdemCloud::setNumberOfClumps(int nC) ... do nothing\" << endl;\n}\n\nvoid Foam::cfdemCloud::setPositionsCM(label n,double* pos)\n{\n    //Info << \"Foam::cfdemCloud::setPositionsCM(int nC) ... do nothing\" << endl;\n}\n\nvoid Foam::cfdemCloud::setCellIDsCM(label n,int* ID)\n{\n    //Info << \"Foam::cfdemCloud::setCellIDsCM(int nC) ... do nothing\" << endl;\n}\n\nvoid Foam::cfdemCloud::findCells()\n{\n    locateM().findCell(NULL,fieldsToDEM[idPos()],cellIDs_,numberOfParticles());\n}\n\nvoid Foam::cfdemCloud::setForces()\n{\n    resetArray(impForces_,numberOfParticles(),3);\n    resetArray(expForces_,numberOfParticles(),3);\n\n    cfdemCloud::zeroizeFieldsToDEM();\n\n    for (int i=0;i<cfdemCloud::nrForceModels();i++)\n        cfdemCloud::forceM(i).setForce();\n}\n\nvoid Foam::cfdemCloud::setVoidFraction()\n{\n    cfdemCloud::voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_,particleV_);\n}\n\nvoid Foam::cfdemCloud::resetVoidFraction()\n{\n    cfdemCloud::voidFractionM().resetVoidFractions();\n}\n\nvoid Foam::cfdemCloud::setAlpha(volScalarField& alpha)\n{\n    alpha = cfdemCloud::voidFractionM().voidFractionInterp();\n}\n\nvoid Foam::cfdemCloud::setParticleForceField()\n{\n    averagingM().setVectorSum\n    (\n        forceM(0).impParticleForces(),\n        impForces_,\n        particleWeights_,\n        NULL //mask\n    );\n    averagingM().setVectorSum\n    (\n        forceM(0).expParticleForces(),\n        expForces_,\n        particleWeights_,\n        NULL //mask\n    );\n}\n\nvoid Foam::cfdemCloud::setVectorAverages()\n{\n    if(verbose_) Info << \"- setVectorAverage(Us,fieldsToDEM[idVel()],weights_)\" << endl;\n    averagingM().setVectorAverage\n    (\n        averagingM().UsNext(),\n        fieldsToDEM[idVel()],\n        particleWeights_,\n        averagingM().UsWeightField(),\n        NULL, //mask\n        NULL,\n        false\n    );\n    if(verbose_) Info << \"setVectorAverage done.\" << endl;\n}\n// * * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\nvoid Foam::cfdemCloud::checkCG(bool ok)\n{\n    if(!cgOK_) return;\n    if(!ok) cgOK_ = ok;\n}\nvoid Foam::cfdemCloud::setPos(double**& pos)\n{\n    for(int index = 0;index <  numberOfParticles(); ++index)\n    {\n        for(int i=0;i<3;i++){\n            fieldsToDEM[idPos()][index][i] = pos[index][i];\n        }\n    }\n}\n// * * * * * * * * * * * * * * * ACCESS  * * * * * * * * * * * * * //\n\nlabel Foam::cfdemCloud::particleCell(int index)\n{\n    label cellI = cellIDs()[index][0];\n    return cellI;\n}\n\nconst forceModel& Foam::cfdemCloud::forceM(int i)\n{\n    return forceModel_[i];\n}\n\nint Foam::cfdemCloud::nrForceModels()\n{\n    return forceModels_.size();\n}\n\ndouble** Foam::cfdemCloud::cellsPerParticle()\n{\n    return voidFractionModel_().cellsPerParticle();\n}\n\nscalar Foam::cfdemCloud::voidfraction(int index)\n{\n    return voidfractions()[index][0];\n}\n\nlabel Foam::cfdemCloud::liggghtsCommandModelIndex(word name)\n{\n    int index=-1;\n    forAll(liggghtsCommandModelList_,i)\n    {\n        if(liggghtsCommand()[i]().name() == name)\n        {\n            index = i;\n            break;\n        }\n    }\n    return index;\n}\n\nstd::vector< std::vector<double*> >* Foam::cfdemCloud::getVprobe()\n{\n return probeModel_->getVprobe();\n}\n\nstd::vector< std::vector<double> >* Foam::cfdemCloud::getSprobe()\n{\n return probeModel_->getSprobe();\n}\n\n// * * * * * * * * * * * * * * * WRITE  * * * * * * * * * * * * * //\n\n// * * *   write cfdemCloud internal data   * * * //\n\nbool Foam::cfdemCloud::evolve\n(\n    volScalarField& alpha,\n    volVectorField& Us,\n    volVectorField& U\n)\n{\n    numberOfParticlesChanged_ = false;\n    arraysReallocated_=false;\n    bool doCouple=false;\n\n    if(!ignore())\n    {\n        if(!writeTimePassed_ && mesh_.time().outputTime()) writeTimePassed_=true;\n        if (dataExchangeM().doCoupleNow())\n        {\n            Info << \"\\n Coupling...\" << endl;\n            dataExchangeM().couple(0);\n            doCouple=true;\n\n            // reset vol Fields\n            clockM().start(16,\"resetVolFields\");\n            if(verbose_)\n            {\n                Info << \"couplingStep:\" << dataExchangeM().couplingStep()\n                     << \"\\n- resetVolFields()\" << endl;\n            }\n            averagingM().resetVectorAverage(averagingM().UsPrev(),averagingM().UsNext(),false);\n            resetVoidFraction();\n            averagingM().resetVectorAverage(forceM(0).impParticleForces(),forceM(0).impParticleForces(),true);\n            averagingM().resetVectorAverage(forceM(0).expParticleForces(),forceM(0).expParticleForces(),true);\n            averagingM().resetWeightFields();\n            for (int i=0;i<momCoupleModels_.size(); i++)\n                momCoupleM(i).resetMomSourceField();\n            if(verbose_) Info << \"resetVolFields done.\" << endl;\n            clockM().stop(\"resetVolFields\");\n\n            if(verbose_) Info << \"- getDEMdata()\" << endl;\n            clockM().start(17,\"getDEMdata\");\n            getDEMdata();\n            clockM().stop(\"getDEMdata\");\n            if(verbose_) Info << \"- getDEMdata done.\" << endl;\n\n            // search cellID of particles\n            clockM().start(18,\"findCell\");\n            if(verbose_) Info << \"- findCell()\" << endl;\n            findCells();\n            if(verbose_) Info << \"findCell done.\" << endl;\n            clockM().stop(\"findCell\");\n\n            // set void fraction field\n            clockM().start(19,\"setvoidFraction\");\n            if(verbose_) Info << \"- setvoidFraction()\" << endl;\n            setVoidFraction();\n            if(verbose_) Info << \"setvoidFraction done.\" << endl;\n            clockM().stop(\"setvoidFraction\");\n\n            // set average particles velocity field\n            clockM().start(20,\"setVectorAverage\");\n            setVectorAverages();\n\n\n            //Smoothen \"next\" fields\n            smoothingM().dSmoothing();\n            smoothingM().smoothen(voidFractionM().voidFractionNext());\n\n            //only smoothen if we use implicit force coupling in cells void of particles\n            //because we need unsmoothened Us field to detect cells for explicit\n            //force coupling\n            if(!treatVoidCellsAsExplicitForce())\n                smoothingM().smoothenReferenceField(averagingM().UsNext());\n\n            clockM().stop(\"setVectorAverage\");\n        }\n\n        //============================================\n        //CHECK JUST TIME-INTERPOATE ALREADY SMOOTHENED VOIDFRACTIONNEXT AND UsNEXT FIELD\n        //      IMPLICIT FORCE CONTRIBUTION AND SOLVER USE EXACTLY THE SAME AVERAGED\n        //      QUANTITIES AT THE GRID!\n        Info << \"\\n timeStepFraction() = \" << dataExchangeM().timeStepFraction() << endl;\n        if( dataExchangeM().timeStepFraction() > 1.001 || dataExchangeM().timeStepFraction() < -0.001 )\n        {\n            FatalError << \"cfdemCloud::dataExchangeM().timeStepFraction() = \"<< dataExchangeM().timeStepFraction() <<\" must be >1 or <0 : This might be due to the fact that you used a adjustable CFD time step. Please use a fixed CFD time step.\" << abort(FatalError);\n        }\n        clockM().start(24,\"interpolateEulerFields\");\n\n        // update voidFractionField\n        setAlpha(alpha);\n        if(dataExchangeM().couplingStep() < 2)\n        {\n            alpha.oldTime() = alpha; // supress volume src\n            alpha.oldTime().correctBoundaryConditions();\n        }\n        alpha.correctBoundaryConditions();\n\n        // calc ddt(voidfraction)\n        calcDdtVoidfraction(alpha,Us);\n\n        // update mean particle velocity Field\n        Us = averagingM().UsInterp();\n        Us.correctBoundaryConditions();\n\n        clockM().stop(\"interpolateEulerFields\");\n        //============================================\n\n        if(doCouple)\n        {\n            // set particles forces\n            clockM().start(21,\"setForce\");\n            if(verbose_) Info << \"- setForce(forces_)\" << endl;\n            setForces();\n            if(verbose_) Info << \"setForce done.\" << endl;\n            calcMultiphaseTurbulence();\n            if(verbose_) Info << \"calcMultiphaseTurbulence done.\" << endl;\n            clockM().stop(\"setForce\");\n\n            // get next force field\n            clockM().start(22,\"setParticleForceField\");\n            if(verbose_) Info << \"- setParticleForceField()\" << endl;\n            setParticleForceField();\n            if(verbose_) Info << \"- setParticleForceField done.\" << endl;\n            clockM().stop(\"setParticleForceField\");\n\n            // write DEM data\n            if(verbose_) Info << \" -giveDEMdata()\" << endl;\n            clockM().start(23,\"giveDEMdata\");\n            giveDEMdata();\n            clockM().stop(\"giveDEMdata\");\n\n            dataExchangeM().couple(1);\n        }//end dataExchangeM().couple()\n\n\n        if(verbose_){\n            #include \"debugInfo.H\"\n        }\n\n        clockM().start(25,\"dumpDEMdata\");\n        // do particle IO\n        IOM().dumpDEMdata();\n        clockM().stop(\"dumpDEMdata\");\n\n        if(resetWriteTimePassed_)\n        {\n            writeTimePassed_=false;\n            resetWriteTimePassed_=false;\n        }\n\n    }//end ignore\n    return doCouple;\n}\n\nbool Foam::cfdemCloud::reAllocArrays() const\n{\n    if(verbose_) Info << \"cfdemCloud::reAllocArrays()\" << endl;\n    if(numberOfParticlesChanged_ && !arraysReallocated_)\n    {\n        // get arrays of new length\n        dataExchangeM().allocateArray(impForces_,0.,3);\n        dataExchangeM().allocateArray(expForces_,0.,3);\n        dataExchangeM().allocateArray(voidfractions_,1.,voidFractionM().maxCellsPerParticle());\n        dataExchangeM().allocateArray(cellIDs_,-1.,voidFractionM().maxCellsPerParticle());\n        dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle());\n        dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle());\n        dataExchangeM().allocateArray(particleV_,0.,1);\n\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n        if(namesfieldsToDEM.size()!=fieldsToDEM.size())\n            cfdemCloud::allocateFieldsToDEM();\n        else\n            cfdemCloud::reAllocateFieldsToDEM();\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\n        arraysReallocated_ = true;\n        return true;\n    }\n    return false;\n}\n\nbool Foam::cfdemCloud::reAllocArrays(int nP, bool forceRealloc) const\n{\n    if( (numberOfParticlesChanged_ && !arraysReallocated_) || forceRealloc)\n    {\n        // get arrays of new length\n        dataExchangeM().allocateArray(impForces_,0.,3,nP);\n        dataExchangeM().allocateArray(expForces_,0.,3,nP);\n        dataExchangeM().allocateArray(voidfractions_,1.,voidFractionM().maxCellsPerParticle(),nP);\n        dataExchangeM().allocateArray(cellIDs_,0.,voidFractionM().maxCellsPerParticle(),nP);\n        dataExchangeM().allocateArray(particleWeights_,0.,voidFractionM().maxCellsPerParticle(),nP);\n        dataExchangeM().allocateArray(particleVolumes_,0.,voidFractionM().maxCellsPerParticle(),nP);\n\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n        if(namesfieldsToDEM.size()!=fieldsToDEM.size())\n            cfdemCloud::allocateFieldsToDEM();\n        else\n            cfdemCloud::reAllocateFieldsToDEM();\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n        arraysReallocated_ = true;\n        return true;\n    }\n    return false;\n}\n\ntmp<fvVectorMatrix> cfdemCloud::divVoidfractionTau(volVectorField& U,volScalarField& voidfraction) const\n{\n    return\n    (\n      - fvm::laplacian(voidfractionNuEff(voidfraction), U)\n      - fvc::div(voidfractionNuEff(voidfraction)*dev2(fvc::grad(U)().T()))\n    );\n}\n\ntmp<fvVectorMatrix> cfdemCloud::divVoidfractionTau(volVectorField& U,volScalarField& voidfraction,volScalarField& rho) const\n{\n    return\n    (\n      - fvm::laplacian(rho*voidfractionNuEff(voidfraction), U)\n      - fvc::div(rho*voidfractionNuEff(voidfraction)*dev2(fvc::grad(U)().T()))\n    );\n}\n\ntmp<volScalarField> cfdemCloud::ddtVoidfraction() const\n{\n    if (useDDTvoidfraction_==word(\"off\"))\n    {\n        return tmp<volScalarField> (ddtVoidfraction_ * 0.);\n        if(verbose_)\n            Info << \"suppressing ddt(voidfraction)\" << endl;\n    }\n    return tmp<volScalarField> (ddtVoidfraction_ * 1.) ;\n}\n\nvoid cfdemCloud::calcDdtVoidfraction(volScalarField& voidfraction, volVectorField& Us) const\n{\n    if (useDDTvoidfraction_==word(\"a\"))\n    {\n        // Calculation of new ddtVoidfraction by using divergence of particle fluxes instead\n        ddtVoidfraction_=fvc::div(Us*(1.-voidfraction));\n    }else // \"b\" or \"off\"\n    {\n        ddtVoidfraction_ = fvc::ddt(voidfraction);\n    }\n}\n\n//****************************************\nvoid cfdemCloud::calcMultiphaseTurbulence()\n{\n    //Temporary field for collecting the sources\n    volScalarField tmpSource\n    (   IOobject\n        (\n            \"tmpSource\",\n            mesh().time().timeName(),\n            mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        turbulenceMultiphase_*0.0\n    );\n\n    //reset sources, and compute the sources due to the cloud\n    //Will accumulate all sources for all force models\n    for (int iModel=0; iModel<nrForceModels(); iModel++) //\n    {\n        #ifdef compre\n            forceM(iModel).multiphaseTurbulence(tmpSource, true);\n        #else\n            forceM(iModel).multiphaseTurbulence(tmpSource, false);\n        #endif\n        if(iModel==0)\n            turbulenceMultiphase_    = tmpSource;\n        else\n            turbulenceMultiphase_   += tmpSource;\n    }\n\n}\n\n/*tmp<fvVectorMatrix> cfdemCloud::ddtVoidfractionU(volVectorField& U,volScalarField& voidfraction) const\n{\n    if (dataExchangeM().couplingStep() <= 2) return fvm::ddt(U);\n\n    return fvm::ddt(voidfraction,U);\n}*/\n\ntmp<volScalarField> cfdemCloud::voidfractionNuEff(volScalarField& voidfraction) const\n{\n    if (modelType_==\"B\" || modelType_==\"Bfull\")\n    {\n        return tmp<volScalarField>\n        (\n            #ifdef compre\n                new volScalarField(\"viscousTerm\", (  turbulence_.mut()\n                                                   + turbulence_.mu()\n                                                   + turbulenceMultiphase_\n                                                  )\n                                  )\n            #else\n                new volScalarField(\"viscousTerm\", (  turbulence_.nut()\n                                                   + turbulence_.nu()\n                                                   + turbulenceMultiphase_\n                                                  )\n                                  )\n            #endif\n        );\n    }\n    else\n    {\n        return tmp<volScalarField>\n        (\n            #ifdef compre\n                new volScalarField(\"viscousTerm\", voidfraction*(  turbulence_.mut()\n                                                                + turbulence_.mu()\n                                                                + turbulenceMultiphase_\n                                                               )\n                                  )\n            #else\n                new volScalarField(\"viscousTerm\", voidfraction*(  turbulence_.nut()\n                                                                + turbulence_.nu()\n                                                                + turbulenceMultiphase_\n                                                               )\n                                  )\n            #endif\n        );\n    }\n}\n\nvoid cfdemCloud::resetArray(double**& array,int length,int width,double resetVal)\n{\n    for(int index = 0;index < length; ++index){\n        for(int i=0;i<width;i++){\n            array[index][i] = resetVal;\n        }\n    }\n}\n\ndouble **cfdemCloud::dragPrev()\n{\n    return dragPrev_;\n}\n// * * * * * * * * * * * * * * * *  IOStream operators * * * * * * * * * * * //\n//=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\nvoid cfdemCloud::registerFieldsToDEM(word name, word type, int& id, bool pull)\n{\n    //check if field is available\n    Info << \"cfdemCloud is registering field '\" << name <<\"', and type '\" << type << \"' ...\" << endl;\n    std::vector<word>::iterator it;\n    it = std::find(namesfieldsToDEM.begin(), namesfieldsToDEM.end(), name);\n    if ( it != namesfieldsToDEM.end() )\n    {\n        id = std::distance(namesfieldsToDEM.begin(), it);\n        Info << \"cfdemCloud already found field '\" << name << \"' at position: \" << id << endl;\n    }\n    else\n    {\n        Info << \"cfdemCloud adds field '\" << name <<\"' at end of list.\" << endl;\n        namesfieldsToDEM.push_back(name);\n        typesfieldsToDEM.push_back(type);\n        pullfieldsToDEM.push_back(pull);\n        id = namesfieldsToDEM.size()-1;\n    }\n}\n\n//****************************************\nbool cfdemCloud::checkAndRegisterFieldsToDEM(const wordList names, const word type, std::vector<int> & id)\n{\n    bool validFieldName=false;\n    forAll(names,i)    {\n        int tempPosition=-1; //by default use -1 to indicate invalid field\n        if(names[i]!=\"none\")\n        {\n            validFieldName = true;\n            registerFieldsToDEM(names[i], type, tempPosition);\n        }\n        id.push_back(tempPosition);\n    }\n    return validFieldName;\n}\n\n//****************************************\nvoid cfdemCloud::allocateFieldsToDEM(word shapeType) const\n{\n    if(verbose_) Info << \"cfdemCloud::allocateFieldsToDEM()\" << endl;\n    if(fieldsToDEM.size()>0)\n        FatalError << \"cfdemCloud::allocateFieldsToDEM(): you are attempting to allocate fields in a container that already contains elements. This is not allowed, please clear container.\" << abort(FatalError);\n    //Go through list and allocate\n    for(std::vector<word>::iterator it = namesfieldsToDEM.begin(); it != namesfieldsToDEM.end(); ++it)\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n\n        fieldsToDEM.push_back(NULL); //Must be NULL, otherwise this might confuse external code\n\n        word type(typesfieldsToDEM[id]);\n        int len(-1);\n        if(type==\"scalar-\" + shapeType)\n            len=1;\n        else if(type==\"vector-\" + shapeType)\n            len=3;\n        else if(type==\"vector2D-\" + shapeType)\n            len=2;\n        else if(type==\"quaternion-\" + shapeType)\n            len=4;\n//         else\n//             FatalError << \"cfdemCloud::allocateFieldsToDEM -- unknown array shape: \"\n//                 << type << abort(FatalError);\n\n        if(len>0)\n        {\n            if(verbose_) Info << \"cfdemCloud::allocateFieldsToDEM() allocating field with name '\" << *it << \"'\" << endl;\n            dataExchangeM().allocateArray(fieldsToDEM.back(),0.0,len);\n        }\n    }\n}\n\n//****************************************\nvoid cfdemCloud::reAllocateFieldsToDEM(word shapeType) const\n{\n    if(verbose_) Info << \"cfdemCloud::reAllocateFieldsToDEM()\" << endl;\n    //Go through list and allocate\n    for(std::vector<word>::iterator it = namesfieldsToDEM.begin(); it != namesfieldsToDEM.end(); ++it)\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n\n        word type(typesfieldsToDEM[id]);\n        int len(-1);\n        if(type==\"scalar-\" + shapeType)\n            len=1;\n        else if(type==\"vector-\" + shapeType)\n            len=3;\n        else if(type==\"vector2D-\" + shapeType)\n            len=2;\n        else if(type==\"quaternion-\" + shapeType)\n            len=4;\n//         else\n//             FatalError << \"cfdemCloud::reAllocateFieldsToDEM -- unknown array shape: \"\n//                 << type << abort(FatalError);\n\n\n        if(len>0)\n        {\n            if(verbose_) Info << \"cfdemCloud::reAllocateFieldsToDEM() reAllocating field with name '\" << *it << \"' at position: \" << id << endl;\n            dataExchangeM().allocateArray(fieldsToDEM[id],0.0,len);\n        }\n    }\n}\n\n//****************************************\nvoid cfdemCloud::zeroizeFieldsToDEM(word shapeType)\n{\n    //Go through list and set zero\n    for(std::vector<word>::iterator it = namesfieldsToDEM.begin(); it != namesfieldsToDEM.end(); ++it)\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n        if(!pullfieldsToDEM[id])\n        {\n            if(typesfieldsToDEM[id]==\"scalar-\" + shapeType)\n            {\n                //if(verbose_)\n                Info << \"Zeroizing field with name '\" << *it\n                     << \"' at position: \" << id\n                     << \" with type \" << typesfieldsToDEM[id] << endl;\n                resetArray(fieldsToDEM[id],numberOfParticles(),1);\n            }\n            else if(typesfieldsToDEM[id]==\"vector-\" + shapeType)\n            {\n                //if(verbose_)\n                Info << \"Zeroizing field with name '\" << *it\n                     << \"' at position: \" << id\n                     << \" with type \" << typesfieldsToDEM[id] << endl;\n                resetArray(fieldsToDEM[id],numberOfParticles(),3);\n            }\n        }\n    }\n}\n\n//****************************************\nvoid cfdemCloud::accessFieldsToDEM(word name, double **& field)\n{\n    //set pointer to correct location in the memory\n    if(verbose_)\n        Info << \"cfdemCloud is accessing field '\" << name << \"'\" << endl;\n    std::vector<word>::iterator it;\n    it = std::find(namesfieldsToDEM.begin(), namesfieldsToDEM.end(), name);\n    if ( it != namesfieldsToDEM.end() )\n    {\n        int id = std::distance(namesfieldsToDEM.begin(), it);\n        if(verbose_)\n            Info << \"cfdemCloud found field '\" << name << \"' at position: \" << id << endl;\n        field = fieldsToDEM[id];\n    }\n    else\n            FatalError << \"field \" << name\n                       << \" not found.\"\n                       << abort(FatalError);\n}\n//****************************************\nint cfdemCloud::existsFieldsToDEM(word name)\n{\n    //set pointer to correct location in the memory\n    if(verbose_)\n        Info << \"cfdemCloud is testing existence field '\" << name << \"'\" << endl;\n\n    int id(-1);\n    std::vector<word>::iterator it;\n    it = std::find(namesfieldsToDEM.begin(), namesfieldsToDEM.end(), name);\n    if ( it != namesfieldsToDEM.end() )\n    {\n        id = std::distance(namesfieldsToDEM.begin(), it);\n        if(verbose_)\n        {\n            if(pullfieldsToDEM[id]) Info << \"  cfdemCloud found the pull field '\" << name << \"' at position: \" << id << endl;\n            else  Info << \"  cfdemCloud found the push field '\" << name << \"' at position: \" << id << endl;\n        }\n    }\n    else\n    {\n        if(verbose_)\n            Info << \"  cfdemCloud could not fine field '\" << name << \"'\" << endl;\n    }\n    return id;\n}\n//=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\n// * * * * * * * * * * * * * * * *  IOStream operators * * * * * * * * * * * //\n\n#include \"cfdemCloudIO.C\"\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloud.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    cloud class managing DEM data for CFD-DEM coupling\n\nClass\n    Foam::cfdemCloud\n\nSourceFiles\n    cfdemCloud.C\n    cfdemCloudIO.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef cfdemCloud_H\n#define cfdemCloud_H\n\n// choose version\n#include \"OFversion.H\"\n#include <vector>\n\n#include \"fvCFD.H\"\n#include \"IFstream.H\"\n\n#if defined(version21) || defined(version16ext)\n    #include \"turbulenceModel.H\"\n#elif defined(version15)\n    #include \"RASModel.H\"\n#endif\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// forward declarations\nclass forceModel;\nclass locateModel;\nclass voidFractionModel;\nclass dataExchangeModel;\nclass IOModel;\nclass probeModel;\nclass registryModel;\nclass averagingModel;\nclass clockModel;\nclass smoothingModel;\nclass momCoupleModel;\nclass meshMotionModel;\nclass liggghtsCommandModel;\n\n/*---------------------------------------------------------------------------*\\\n                           Class cfdemCloud Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass cfdemCloud\n{\n\n// protected data\nprotected:\n    const fvMesh& mesh_;\n\n    IOdictionary couplingProperties_;\n\n    IOdictionary liggghtsCommandDict_;\n\n    Switch allowAdjustTimeStep_;\n\n    Switch solveFlow_;\n\n    Switch solveScalarTransport_;\n\n    Switch verbose_;\n\n    Switch expCorrDeltaUError_;\n\n    bool debug_;\n\n    bool allowCFDsubTimestep_;\n\n    bool ignore_;\n\n    bool writeTimePassed_;\n\n    bool resetWriteTimePassed_;\n\n    const word modelType_;\n\n    mutable double **impForces_;\n\n    mutable double **expForces_;\n\n    mutable double **voidfractions_;\n\n    mutable double **cellIDs_;\n\n    mutable double **particleWeights_;\n\n    mutable double **particleVolumes_;\n\n    mutable double **particleV_;\n\n    mutable double **dragPrev_;\n\n    int numberOfParticles_;\n\n    //mutable int maxCellsPerParticle_; // lives now in voidFractionModel.H\n\n    scalar d32_;\n\n    bool numberOfParticlesChanged_;\n\n    mutable bool arraysReallocated_;\n\n    const wordList forceModels_;\n\n    const wordList momCoupleModels_;\n\n    const wordList liggghtsCommandModelList_;\n\n    const word turbulenceModelType_;\n\n    mutable bool isLES_;\n\n    mutable scalar cg_;\n\n    mutable std::vector<double> cgTypeSpecific_;\n\n    bool cgOK_;\n\n    bool impDEMdrag_;\n\n    bool impDEMdragAcc_;\n\n    mutable scalar imExSplitFactor_;\n\n    mutable bool treatVoidCellsAsExplicitForce_; //will treat the coupling force in cells with no Us data explicitly\n\n    mutable word useDDTvoidfraction_;\n\n    mutable volScalarField ddtVoidfraction_;\n\n    //Variable used to de-activate mirroring across periodic boundary conditions\n    mutable Switch checkPeriodicCells_;\n    //de-activation and tolerance variables\n    //if set to  (for a specific direction), the periodic check will NOT be done\n    //default = (1,1,1), i.e., periodic checks will be done\n    //important for probing ambient points. Only read-in in case checkPeriodicCells is active\n    mutable vector wall_periodicityCheckRange_;\n    scalar         wall_periodicityCheckTolerance_;\n\n    bool meshHasUpdated_;\n\n    #if defined(version24Dev)\n        const turbulenceModel& turbulence_;\n    #elif defined(version21) || defined(version16ext)\n        #ifdef compre\n            const compressible::turbulenceModel& turbulence_;\n        #else\n            const incompressible::turbulenceModel& turbulence_;\n        #endif\n    #elif defined(version15)\n        const incompressible::RASModel& turbulence_;\n    #endif\n\n    //Multiphase Turbulence (e.g., slip-induced turbulence)\n    mutable volScalarField turbulenceMultiphase_;\n\n    autoPtr<forceModel>* forceModel_;\n\n    autoPtr<locateModel> locateModel_;\n\n    autoPtr<momCoupleModel>* momCoupleModel_;\n\n    autoPtr<dataExchangeModel> dataExchangeModel_;\n\n    autoPtr<IOModel> IOModel_;\n\n    autoPtr<probeModel> probeModel_;\n\n    autoPtr<registryModel> registryModel_;\n\n    autoPtr<voidFractionModel> voidFractionModel_;\n\n    autoPtr<averagingModel> averagingModel_;\n\n    autoPtr<clockModel> clockModel_;\n\n    autoPtr<smoothingModel> smoothingModel_;\n\n    autoPtr<meshMotionModel> meshMotionModel_;\n\n    autoPtr<liggghtsCommandModel>* liggghtsCommand_;\n\n// Protected member functions\n    virtual void getDEMdata();\n\n    virtual void giveDEMdata();\n\n    virtual void setNumberOfParticles(int);\n\n    virtual void setNumberOfClumps(int);\n\n    virtual void setPositionsCM(label,double*);\n\n    virtual void setCellIDsCM(label,int*);\n\n    virtual void findCells();\n\n    virtual void setForces();\n\n    virtual void setVoidFraction();\n\n    virtual void resetVoidFraction();\n\n    virtual void setAlpha(volScalarField&);\n\n    virtual void setParticleForceField();\n\n    virtual void setVectorAverages();\n\npublic:\n\n    friend class dataExchangeModel;\n    friend class voidFractionModel;\n    friend class forceModel;\n    friend class forceSubModel;\n    friend class generalManual;\n    friend class temperatureModel;\n\n// Constructors\n\n    //- Construct from mesh and a list of particles\n    cfdemCloud\n    (\n            const fvMesh& mesh\n    );\n\n    //- Destructor\n    virtual ~cfdemCloud();\n\n// public Member Functions\n\n    // Access\n       const turbulenceModel& turbulence() {return turbulence_;};\n\n       bool isLES() const {return isLES_; };\n\n       bool debugMode(){ return debug_;};\n\n       bool allowCFDsubTimestep(){ return allowCFDsubTimestep_;};\n\n       void setAllowCFDsubTimestep(bool b){allowCFDsubTimestep_=b;};\n\n       bool expCorrDeltaUError(){ return expCorrDeltaUError_;};\n\n       void setExpCorrDeltaUError(){expCorrDeltaUError_=couplingProperties_.lookupOrDefault<Switch>(\"expCorrDeltaUError\", false);};\n\n       void checkCG(bool);\n\n       void setPos(double **&);\n\n       word modelType(){ return modelType_; };\n\n       label particleCell(int);\n\n       virtual inline vector position(int, bool ovr=false, int mp=-1);\n\n       virtual inline vector velocity(int, bool ovr=false, int mp=-1);\n\n       vector fluidVel(int);\n\n       virtual const forceModel& forceM(int);\n\n       virtual int nrForceModels();\n\n       virtual double** cellsPerParticle();\n\n       scalar voidfraction(int);\n\n       label liggghtsCommandModelIndex(word);\n\n       inline void setCG(double) const;\n\n       inline void setCGTypeSpecific(int, double);\n\n       mutable bool cgParticleSpecific_;\n\n       mutable bool cgTypeSpecificDifferent_;\n\n       inline const scalar& cg() const;\n\n       inline scalar cg(int index) const;\n\n       inline const bool& impDEMdrag() const;\n\n       inline const bool& impDEMdragAcc() const;\n\n       inline const scalar& imExSplitFactor() const;\n\n       inline const bool& treatVoidCellsAsExplicitForce() const;\n\n       inline const bool& ignore() const;\n\n       inline const bool& writeTimePassed() const;\n\n       inline void resetWriteTimePassed();\n\n       inline const fvMesh& mesh() const;\n\n       inline bool allowAdjustTimeStep() const;\n\n       inline bool solveFlow() const;\n\n       inline bool solveScalarTransport() const;\n\n       inline bool verbose() const;\n\n       inline const IOdictionary& couplingProperties() const;\n\n       inline double ** positions() const;\n\n       inline double ** velocities() const;\n\n       inline double ** fluidVels() const;\n\n       inline double ** fAccs() const;\n\n       inline double ** impForces() const;\n\n       inline double ** expForces() const;\n\n       inline double ** Cds() const;\n\n       inline double ** radii() const;\n\n       inline double ** voidfractions() const;\n\n       inline void get_radii(double**&) const;\n\n       virtual inline double ** cellIDs(bool ovr=false) const;\n\n       virtual inline label cellID(int, bool ovr=false, int mp=-1) const;\n\n       inline void get_cellIDs(double**&) const;\n\n       inline double ** particleWeights() const;\n\n       virtual inline label body(int);\n\n       virtual inline double particleVolume(int);\n\n       inline scalar radius(int, bool ovr=false);\n\n       virtual inline double diameter(int, bool ovr=false, int mp=-1);\n\n       inline scalar d32(bool recalc=true);\n       label particleType(label index) const\n       {\n            if(idPartTypes()>-1) return fieldsToDEM[idPartTypes()][index][0];\n            return 1;\n       };\n\n       //access to the particle's rotation and torque data\n       virtual inline double ** DEMTorques() const {return NULL;};\n       virtual inline double ** omegaArray() const {return NULL;};\n       virtual vector omega(int) const {return Foam::vector(0,0,0);};\n\n//        //access to the particles' orientation information\n       virtual vector ex(int) const {\n         FatalError << \"cfdemCloud::ex(): you are attempting to get an access to ex array for spheroids/superquadrics. This is not allowed for spheres. Recompile the code with #define anisotropicRotation in OFversion.H or Are you using the correct solver?\" << abort(FatalError);\n         return Foam::vector(0,0,0);\n       };\n\n       virtual vector ey(int) const {\n         FatalError << \"cfdemCloud::ey(): you are attempting to get an access to ey array for spheroids/superquadrics. This is not allowed for spheres. Recompile the code with #define anisotropicRotation in OFversion.H or Are you using the correct solver?\" << abort(FatalError);\n         return Foam::vector(0,0,0);\n       };\n\n       virtual vector shape(int) const {\n         FatalError << \"cfdemCloud::shapeArray(): you are attempting to get an access to shape array for spheroids/superquadrics. This is not allowed for spheres. Recompile the code with #define anisotropicRotation in OFversion.H or Are you using the correct solver?\" << abort(FatalError);\n         return Foam::vector(0,0,0);\n       };\n\n       // access to complex shape information\n       virtual scalar volume(int) const {\n         FatalError << \"cfdemCloud::volume(): you are attempting to get an access to volume array for superquadrics. This is not allowed for spheres. Are you using the correct solver?\" << abort(FatalError);\n         return 0;\n       };\n\n       virtual scalar area(int) const {\n         FatalError << \"cfdemCloud::area(): you are attempting to get an access to area array for superquadrics. This is not allowed for spheres. Are you using the correct solver?\" << abort(FatalError);\n         return 0;\n       };\n       virtual inline scalarList& area() { static scalarList foo(0); return foo; }\n\n       virtual quaternion quat(int) const {\n         FatalError << \"cfdemCloud::quat(): you are attempting to get an access to quaternion array for superquadrics. This is not allowed for spheres. Are you using the correct solver?\" << abort(FatalError);\n         return quaternion(1);\n       };\n\n       virtual vector2D blockiness(int) const {\n         FatalError << \"cfdemCloud::blockiness(): you are attempting to get an access to blockiness array for superquadrics. This is not allowed for spheres. Are you using the correct solver?\" << abort(FatalError);\n         return Foam::vector2D(0,0);\n       };\n\n       // MS access functions\n#define ErrorMsg FatalError<<\"cfdemCloud: You are attempting to use a MS interface routine. However, your solver is not compiled to use multispheres.\"<<abort(FatalError)\n       virtual inline int nClumpTypes() const {ErrorMsg; return 0;};\n       virtual inline int clumpType(int i) const {ErrorMsg; return 0;};\n       virtual inline double **& clumpVol() const {ErrorMsg; static double **foo = nullptr; return foo;};\n       virtual inline double **& clumpArea() const {ErrorMsg; static double **foo = nullptr; return foo;};\n       virtual inline double **& clumpDH() const {ErrorMsg; static double **foo = nullptr; return foo;};\n       virtual inline label clumpIndexOfParticle(int) {ErrorMsg; return 0;};\n       virtual inline labelList& particlesOfClumpIndex(int) {ErrorMsg; static labelList foo(0); return foo;};\n       virtual inline bool useforcePerClump() const {ErrorMsg; return false;};\n       virtual inline label nrigid(int) {ErrorMsg; return 0;};\n       virtual inline double **& impForcesCM() const {ErrorMsg; static double **foo = nullptr; return foo;};\n       virtual inline double **& expForcesCM() const {ErrorMsg; static double **foo = nullptr; return foo;};\n\n       virtual inline scalarList& DHc() {ErrorMsg; static scalarList foo(0); return foo;};\n       virtual inline void setDHc(scalarList) {FatalError << \"setDHc in cfdemCloud\" << abort(FatalError);};\n       virtual inline void setArea(scalarList) {FatalError << \"setArea in cfdemCloud\" << abort(FatalError);};\n\n       virtual inline vector resolution() {FatalError << \"resolution() in cfdemCloud\" << abort(FatalError); return vector(0,0,0);};\n       virtual inline void initMpData() {FatalError << \"setMpData in cfdemCloud\" << abort(FatalError);};\n       virtual inline void setMpData(int, int, int,  vector, vector, scalar) {/*do nothing*/};\n       virtual inline void setMpDataPoint(int, int, int, int, double) {FatalError << \"setMpDataPoint in cfdemCloud\" << abort(FatalError);};;\n       virtual inline word shapeTypeName() {return \"sphere\";};\n\n       // wrapper function for volume calculation based on particle radius\n       virtual inline scalar particleVolumeScaled(int index, const scalarList& scaleVol)\n       {\n           return 4./3.*M_PI * radius(index)*radius(index)*radius(index) * scaleVol[0];\n       };\n\n       //Optional Extra arrays for implicit coupling with anisotropic drag\n       virtual inline double ** omegaFluid() const { return NULL;};     //the fluid rotation rate\n       double **dragPrev();\n\n       //Detector if SRF module is enable or not\n       virtual inline bool SRFOn(){return false;}\n\n       //allow handshake with refinement field\n       virtual void setRefinementField(volScalarField* refine_) {};\n\n       virtual inline int numberOfObjects(bool ovr=false) const;\n\n       inline int numberOfParticles() const;\n\n       inline bool numberOfParticlesChanged() const;\n\n       virtual inline int numberOfClumps() const;\n\n       //inline void setMaxCellsPerParticle(int) const;\n\n       //inline int maxCellsPerParticle() const;\n\n       inline bool arraysReallocated() const;\n\n       inline const wordList& forceModels();\n\n       inline const voidFractionModel& voidFractionM() const;\n\n       inline const locateModel& locateM() const;\n\n       inline const momCoupleModel& momCoupleM(int) const;\n\n       inline const dataExchangeModel& dataExchangeM() const;\n\n       inline const IOModel& IOM() const;\n\n       inline const probeModel& probeM() const;\n\n       inline const registryModel& registryM() const;\n\n       inline const averagingModel& averagingM() const;\n\n       inline const clockModel& clockM() const;\n\n       inline const smoothingModel& smoothingM() const;\n\n       inline const meshMotionModel& meshMotionM() const;\n\n       inline const wordList& liggghtsCommandModelList() const;\n\n       inline autoPtr<liggghtsCommandModel>* liggghtsCommand() const;\n\n        inline void makeSpecific(volScalarField&);\n\n        inline void makeSpecific(volVectorField&);\n\n        inline void scaleWithVcell(volScalarField&);\n\n        inline void scaleWithVcell(volVectorField&);\n\n    // Write\n\n      // write cfdemCloud internal data\n        virtual bool evolve(volScalarField&,volVectorField&,volVectorField&);\n\n        virtual bool reAllocArrays() const;\n\n        virtual bool reAllocArrays(int nP, bool forceRealloc) const;  //force number of particles during reallocation\n\n\n    // IO\n        void writeScalarFieldToTerminal(double**&);\n\n        void writeVectorFieldToTerminal(double**&);\n\n    // functions\n        tmp<fvVectorMatrix> divVoidfractionTau(volVectorField& ,volScalarField&) const;\n\n        tmp<fvVectorMatrix> divVoidfractionTau(volVectorField& ,volScalarField& ,volScalarField&) const;\n\n        tmp<volScalarField> ddtVoidfraction() const;\n\n        void calcDdtVoidfraction(volScalarField& voidfraction, volVectorField& Us) const;\n\n        void calcMultiphaseTurbulence();\n\n        volScalarField& turbulenceMultiphase() const {return turbulenceMultiphase_;};\n\n        //tmp<fvVectorMatrix> ddtVoidfractionU(volVectorField& ,volScalarField&) const;\n\n        tmp<volScalarField> voidfractionNuEff(volScalarField&) const;\n\n        void resetArray(double**&,int,int,double resetVal=0.);\n\n        std::vector< std::vector<double*> >* getVprobe();\n\n        std::vector< std::vector<double> >* getSprobe();\n\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n        // EXPERIMENAL CODE\n        //SHARED GLOBAL PARTICLE Arrays (public containers for data management)\n        //1-USER-defined particle fields for CFDEM-->ExternalCode transfer (e.g., to handle fluxes)\n        mutable std::vector<word>       namesfieldsToDEM;                    // names of field which are communicated to DEM\n        mutable std::vector<word>       typesfieldsToDEM;                    // types of field which are communicated to DEM\n        mutable std::vector<bool>       pullfieldsToDEM;                     // types of field which are pulled (only) from DEM\n        mutable std::vector<double**>   fieldsToDEM;                         // fields which are communicated to DEM\n\n        void registerFieldsToDEM(word name, word type, int& id, bool pull=false);\n        bool checkAndRegisterFieldsToDEM(const wordList names,const word types,std::vector<int> & id);\n        virtual void allocateFieldsToDEM(word shapeType=\"atom\") const;\n        virtual void reAllocateFieldsToDEM(word shapeType=\"atom\") const;\n        virtual void zeroizeFieldsToDEM(word shapeType=\"atom\");\n        void accessFieldsToDEM(word name, double **& field);\n        int existsFieldsToDEM(word name);\n\n        mutable int idRadius_; // id of particle radius in DEM in modular data exchange framework\n        mutable int idPos_; // id of particle position in DEM in modular data exchange framework\n        mutable int idVel_; // id of particle velocity in DEM in modular data exchange framework\n        mutable int idFacc_; // id of accumulated force on particle in DEM in modular data exchange framework\n        mutable int idPartTypes_; // id of particle type in DEM in modular data exchange framework\n        mutable int idDragExp_; // id of explicit drag in DEM in modular data exchange framework\n        mutable int idKsl_; // id of implicit drag coefficient in DEM in modular data exchange framework\n        mutable int idKslExtra_; // id of implicit anisotropic drag coefficient in DEM in modular data exchange framework\n        mutable int idUf_; // id of fluid vel in DEM in modular data exchange framework\n        mutable int idTorqueExp_; // id of explicit torque in DEM in modular data exchange framework\n        mutable int idKslRotation_; // id of implicit torque coefficient in DEM in modular data exchange framework\n        mutable int idPullRotation_; // id of rotation omega in DEM in modular data exchange framework\n        mutable int idPullOrientation_; // id of orientation (ex) in DEM in modular data exchange framework\n        mutable int idPullOrientation1_; // id of orientation (ey) in DEM in modular data exchange framework\n        mutable int idPullShape_; // id of orientation in DEM in modular data exchange framework\n        mutable int idDragExpCM_; // id of explicit drag for multisphere in DEM in modular data exchange framework\n        mutable int idKslCM_; // id of implicit anisotropic drag for multisphere in DEM in modular data exchange framework\n        mutable int idKslExtraCM_; // id of implicit drag for multisphere in DEM in modular data exchange framework\n        mutable int idUfCM_; // id of fluid vel for multisphere in DEM in modular data exchange framework\n        mutable int idTorqueExpCM_; // id of explicit torque for multisphere in DEM in modular data exchange framework\n        mutable int idKslRotationCM_; // id of implicit torque coefficient for multisphere in DEM in modular data exchange framework\n        mutable int idFhydro_; // id of void fraction in DEM in modular data exchange framework\n        mutable int idVisc_; // id of fluid vel in DEM in modular data exchange framework\n        mutable int idBlockiness_; // id of sq blockiness in DEM in modular data exchange framework\n        mutable int idArea_; // id of sq area in DEM in modular data exchange framework\n        mutable int idVol_; // id of sq volume in DEM in modular data exchange framework\n        mutable int idQuat_; // id of quaternion in DEM in modular data exchange framework\n        mutable int idK_; // id of turbulence k in DEM in modular data exchange framework\n        mutable int idEpsilon_; // id of turbulence epsilon in DEM in modular data exchange framework\n        mutable int idParticleCG_; // id of particle specifig CG factor in DEM in modular data exchange framework\n        mutable int idMass_; // id of convex volume in DEM in modular data exchange framework\n        mutable int idDensity_; // id of convex volume in DEM in modular data exchange framework\n        mutable int idType_; // id of particle type in DEM in modular data exchange framework\n        mutable int idConvectiveHeatFlux_; // id of particle convectiveHeatFlux in DEM in modular data exchange framework\n        mutable int idTemp_; // id of particle convectiveHeatFlux in DEM in modular data exchange framework\n\n        int& idRadius() const {return idRadius_;};\n        int& idPos() const {return idPos_;};\n        int& idVel() const {return idVel_;};\n        int& idFacc() const {return idFacc_;};\n        int& idPartTypes() const {return idPartTypes_;};\n        int& idDragExp() const {return idDragExp_;};\n        int& idKsl() const {return idKsl_;};\n        int& idKslExtra() const {return idKslExtra_;};\n        int& idUf() const {return idUf_;};\n        int& idTorqueExp() const {return idTorqueExp_;};\n        int& idKslRotation() const {return idKslRotation_;};\n        int& idPullRotation() const {return idPullRotation_;};\n        int& idPullOrientation() const {return idPullOrientation_;};\n        int& idPullOrientation1() const {return idPullOrientation1_;};\n        int& idPullShape() const {return idPullShape_;};\n        int& idDragExpCM() const {return idDragExpCM_;};\n        int& idKslCM() const {return idKslCM_;};\n        int& idKslExtraCM() const {return idKslExtraCM_;};\n        int& idUfCM() const {return idUfCM_;};\n        int& idTorqueExpCM() const {return idTorqueExpCM_;};\n        int& idKslRotationCM() const {return idKslRotationCM_;};\n        int& idFhydro() const {return idFhydro_;};\n        int& idVisc() const {return idVisc_;};\n        int& idBlockiness() const {return idBlockiness_;};\n        int& idArea() const {return idArea_;};\n        int& idVol() const {return idVol_;};\n        int& idQuat() const {return idQuat_;};\n        int& idK() const {return idK_;};\n        int& idEpsilon() const {return idEpsilon_;};\n        int& idParticleCG() const {return idParticleCG_;};\n        int& idMass() const {return idMass_;};\n        int& idDensity() const {return idDensity_;};\n        int& idType() const {return idType_;};\n        int& idConvectiveHeatFlux() const {return idConvectiveHeatFlux_;};\n        int& idTemp() const {return idTemp_;};\n        //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n        bool checkPeriodicCells() { return checkPeriodicCells_; }\n        int  wall_periodicityCheckRange(int dir) {return static_cast<int>(wall_periodicityCheckRange_[dir]);}\n        vector  wall_periodicityCheckRange() {return wall_periodicityCheckRange_;}\n        bool meshHasUpdated() { return meshHasUpdated_; }\n        void setMeshHasUpdatedFlag(bool hasUpdated) { meshHasUpdated_ = hasUpdated; }\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#include \"cfdemCloudI.H\"\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudI.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"momCoupleModel.H\"\n#include \"smoothingModel.H\"\n#include \"meshMotionModel.H\"\n#include \"averagingModel.H\"\n#include \"clockModel.H\"\n#include \"IOModel.H\"\n#include \"voidFractionModel.H\"\n#include \"locateModel.H\"\n#include \"probeModel.H\"\n#include \"registryModel.H\"\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\ninline void cfdemCloud::setCG(double cg) const\n{\n    cg_ = cg;\n    Info << \"cg is set to: \" << cg_ << endl;\n};\n\nvector Foam::cfdemCloud::position(int index, bool ovr, int mp)\n{\n    vector pos;\n    for(int i=0;i<3;i++)\n        pos[i] = positions()[index][i];\n    return pos;\n}\n\nvector Foam::cfdemCloud::velocity(int index, bool ovr, int mp)\n{\n    vector vel;\n    for(int i=0;i<3;i++)\n        vel[i] = velocities()[index][i];\n    return vel;\n}\n\ninline void cfdemCloud::setCGTypeSpecific(int type, double cg)\n{\n    if(int(cgTypeSpecific_.size())!=type)\n        FatalError  << \"setCGTypeSpecific attempts to set at location \"\n                    << int(cgTypeSpecific_.size())\n                    << \", but caller requests to set at \"\n                    << type\n                    << \". This is fatal. \"\n                    << abort(FatalError);\n    cgTypeSpecific_.push_back(cg);\n    if(cg<cg_*0.99999 || cg>cg_*1.00001)\n    {\n        cgTypeSpecificDifferent_ = true;\n        registerFieldsToDEM(\"type\",\"scalar-atom\",idPartTypes(),true);\n    }\n    Info << \"type specific cg for type \" << type << \" is set to: \" << cg << endl;\n}\n\ninline const bool& cfdemCloud::impDEMdrag() const\n{\n    return impDEMdrag_;\n};\n\ninline const bool& cfdemCloud::impDEMdragAcc() const\n{\n    return impDEMdragAcc_;\n};\n\ninline const scalar& cfdemCloud::imExSplitFactor() const\n{\n        return imExSplitFactor_;\n};\n\ninline const bool& cfdemCloud::treatVoidCellsAsExplicitForce() const\n{\n    return treatVoidCellsAsExplicitForce_;\n}\n\ninline const scalar& cfdemCloud::cg() const\n{\n    return cg_;\n};\n\ninline scalar cfdemCloud::cg(int index) const\n{\n    if (cgTypeSpecificDifferent_)\n        return cgTypeSpecific_[particleType(index)];\n    else if (cgParticleSpecific_)\n        // idParticleCG constains the char. diameter -> convert to cg factor\n        // on top, there may be a global cg -> apply that too\n        return 2*fieldsToDEM[idRadius()][index][0]/fieldsToDEM[idParticleCG()][index][0]*cg_;\n    else\n        return cg_;\n};\n\ninline const bool& cfdemCloud::ignore() const\n{\n    return ignore_;\n}\n\ninline const bool& cfdemCloud::writeTimePassed() const\n{\n    return writeTimePassed_;\n}\n\ninline void cfdemCloud::resetWriteTimePassed()\n{\n    resetWriteTimePassed_=true;\n}\n\ninline const fvMesh& cfdemCloud::mesh() const\n{\n    return mesh_;\n}\n\ninline bool cfdemCloud::solveFlow() const\n{\n    return bool(solveFlow_);\n}\n\ninline bool cfdemCloud::solveScalarTransport() const\n{\n    return bool(solveScalarTransport_);\n}\n\n\ninline bool cfdemCloud::verbose() const\n{\n    return verbose_;\n}\n\ninline const IOdictionary& cfdemCloud::couplingProperties() const\n{\n    return couplingProperties_;\n}\n\ninline double ** cfdemCloud::positions() const\n{\n    return fieldsToDEM[idPos()];\n}\n\ninline double ** cfdemCloud::velocities() const\n{\n    return fieldsToDEM[idVel()];\n}\n\ninline double ** cfdemCloud::fAccs() const\n{\n    return fieldsToDEM[idFacc()];\n}\n\ninline double ** cfdemCloud::impForces() const\n{\n    return impForces_;\n}\n\ninline double ** cfdemCloud::expForces() const\n{\n    return expForces_;\n}\n\ninline double ** cfdemCloud::radii() const\n{\n    return fieldsToDEM[idRadius()];\n}\n\ninline double ** cfdemCloud::voidfractions() const\n{\n    return voidfractions_;\n}\n\ninline void cfdemCloud::get_radii(double **& values) const\n{\n//    Info << \"set_radii level=\" << numberOfParticles_ << endl;\n    // make a copy of the array entries\n//    for (int i=0;i<numberOfParticles_;i++)\n//        fieldsToDEM[idRadius()][0][i]=values[0][i];\n    values=fieldsToDEM[idRadius()];\n}\n\ninline label Foam::cfdemCloud::cellID(int index, bool ovr, int mp) const\n{\n    return cellIDs_[index][0];\n}\n\ninline double ** cfdemCloud::cellIDs(bool ovr) const\n{\n    return cellIDs_;\n}\n\ninline void cfdemCloud::get_cellIDs(double **& values) const\n{\n//    // make a copy of the array entries\n//    for (int i=0;i<numberOfParticles_;i++)\n//        cellIDs_[0][i]=values[0][i];\n    values=cellIDs_;\n}\n\ninline double ** cfdemCloud::particleWeights() const\n{\n    return particleWeights_;\n}\n\ninline label Foam::cfdemCloud::body(int index)\n{\n    return index;\n}\n\ninline double cfdemCloud::particleVolume(int index)\n{\n    return particleV_[index][0];\n}\n\ninline scalar cfdemCloud::radius(int index, bool ovr)\n{\n    return fieldsToDEM[idRadius()][index][0];\n}\n\ninline double cfdemCloud::diameter(int index, bool ovr, int mp)\n{\n    return 2*fieldsToDEM[idRadius()][index][0];\n}\n\ninline double cfdemCloud::d32(bool recalc)\n{\n    if(d32_<0 || recalc)\n    {\n        scalar Ntot(0);\n        scalar Dtot(0);\n        scalar r(0);\n        for(int index = 0;index <  numberOfParticles(); ++index)\n        {\n            r=fieldsToDEM[idRadius()][index][0];\n            Ntot+=2*r*r*r;\n            Dtot+=r*r;\n        }\n        if(Ntot>SMALL) d32_ = Ntot/Dtot;\n        else d32_ = 0.;\n    }\n\n    return d32_;\n}\n\ninline int cfdemCloud::numberOfObjects(bool ovr) const\n{\n    return numberOfParticles_;\n}\n\ninline int cfdemCloud::numberOfParticles() const\n{\n    return numberOfParticles_;\n}\n\ninline bool cfdemCloud::numberOfParticlesChanged() const\n{\n    return numberOfParticlesChanged_;\n}\n\ninline int cfdemCloud::numberOfClumps() const\n{\n    FatalError << \"cfdemCloud::numberOfClumps() is not called correctly!\" << abort(FatalError);\n    return -1;\n}\n\n/*inline void cfdemCloud::setMaxCellsPerParticle(int maxCellsPerParticle) const\n{\n    maxCellsPerParticle_ = maxCellsPerParticle;\n};\n\ninline int cfdemCloud::maxCellsPerParticle() const\n{\n    return maxCellsPerParticle_;\n}*/\n\ninline bool cfdemCloud::arraysReallocated() const\n{\n    return arraysReallocated_;\n}\n\ninline const wordList& cfdemCloud::forceModels()\n{\n    return forceModels_;\n}\n\ninline const locateModel& cfdemCloud::locateM() const\n{\n    return locateModel_;\n}\n\ninline const momCoupleModel& cfdemCloud::momCoupleM(int i) const\n{\n    return momCoupleModel_[i];\n}\n\ninline const dataExchangeModel& cfdemCloud::dataExchangeM() const\n{\n    return dataExchangeModel_;\n}\n\ninline const IOModel& cfdemCloud::IOM() const\n{\n    return IOModel_;\n}\n\ninline const probeModel& cfdemCloud::probeM() const\n{\n    return probeModel_;\n}\n\ninline const registryModel& cfdemCloud::registryM() const\n{\n    return registryModel_;\n}\n\ninline const voidFractionModel& cfdemCloud::voidFractionM() const\n{\n    return voidFractionModel_;\n}\n\ninline const averagingModel& cfdemCloud::averagingM() const\n{\n    return averagingModel_;\n}\n\ninline const clockModel& cfdemCloud::clockM() const\n{\n    return clockModel_;\n}\n\ninline const smoothingModel& cfdemCloud::smoothingM() const\n{\n    return smoothingModel_;\n}\n\ninline const meshMotionModel& cfdemCloud::meshMotionM() const\n{\n    return meshMotionModel_;\n}\n\ninline const wordList& cfdemCloud::liggghtsCommandModelList() const\n{\n    return liggghtsCommandModelList_;\n}\n\ninline autoPtr<liggghtsCommandModel>* cfdemCloud::liggghtsCommand() const\n{\n    return liggghtsCommand_;\n}\n\ninline void cfdemCloud::makeSpecific(volScalarField& field)\n{\n    forAll(field,cellI)\n        field[cellI] /= mesh_.V()[cellI];\n}\n\ninline void cfdemCloud::makeSpecific(volVectorField& field)\n{\n    forAll(field,cellI)\n        field[cellI] /= mesh_.V()[cellI];\n}\n\ninline void cfdemCloud::scaleWithVcell(volScalarField& field)\n{\n    forAll(field,cellI)\n        field[cellI] *= mesh_.V()[cellI];\n}\n\ninline void cfdemCloud::scaleWithVcell(volVectorField& field)\n{\n    forAll(field,cellI)\n        field[cellI] *= mesh_.V()[cellI];\n}\n\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/cfdemCloud/cfdemCloudIO.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n\\*---------------------------------------------------------------------------*/\n\n#include \"cfdemCloud.H\"\n\n// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n\n// * * * * * * * * * * * * * * * IO * * * * * * * * * * * * * //\n\nvoid Foam::cfdemCloud::writeScalarFieldToTerminal(double**& array)\n{\n    // init double array\n    for (int i=0; i<numberOfParticles(); i++)\n    {\n        Info << array[i][0] << endl;\n    }\n}\n\nvoid Foam::cfdemCloud::writeVectorFieldToTerminal(double**& array)\n{\n    // init double array\n    for (int i=0; i<numberOfParticles(); i++)\n    {\n        for (int j=0; j<3; j++) Info << array[i][j] << \"\\t\";\n        Info << endl;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"fileName.H\"\n#include \"cfdemCloudIB.H\"\n#include \"voidFractionModel.H\"\n#include \"forceModel.H\"\n#include \"locateModel.H\"\n#include \"dataExchangeModel.H\"\n#include \"IOModel.H\"\n#include <mpi.h>\n#include \"IOmanip.H\"\n#include \"OFversion.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ncfdemCloudIB::cfdemCloudIB\n(\n    const fvMesh& mesh\n)\n:\n    cfdemCloud(mesh),\n    angularVelocities_(NULL),\n    pRefCell_(readLabel(mesh.solutionDict().subDict(\"PISO\").lookup(\"pRefCell\"))),\n    pRefValue_(readScalar(mesh.solutionDict().subDict(\"PISO\").lookup(\"pRefValue\"))),\n    DEMTorques_(NULL),\n    haveEvolvedOnce_(false),\n    skipLagrangeToEulerMapping_(false),\n    skipAfter_(false),\n    timeStepsToSkip_(0),\n    calculateTortuosity_(false),\n    frontMeshRefine_(false)\n{\n    if(this->couplingProperties().found(\"skipLagrangeToEulerMapping\"))\n    {\n        Info << \"Will skip lagrange-to-Euler mapping...\" << endl;\n        skipLagrangeToEulerMapping_=true;\n    }\n    if(this->couplingProperties().found(\"timeStepsBeforeSkipping\"))\n    {\n        skipAfter_=true;\n        timeStepsToSkip_ =  readScalar\n        (\n            this->couplingProperties().lookup(\"timeStepsBeforeSkipping\")\n        );\n        Info << \"Will skip LagrangeToEuler mapping after \" << timeStepsToSkip_ << \" time steps\" <<  endl;\n    }\n    if(this->couplingProperties().found(\"tortuosity\"))\n    {\n        calculateTortuosity_ = true;\n        flowDir_ = this->couplingProperties().subDict(\"tortuosity\").lookup(\"flowDirection\");\n        flowDir_ = flowDir_ / mag(flowDir_);\n        Info << \"Will calculate tortuosity in the mean flow direction (\"<<flowDir_[0]<<\" \"<<flowDir_[1]<<\" \"<<flowDir_[2]<<\")\"<< endl;\n    }\n\n     //Must check for walls in case of checkPeriodicCells\n     //periodic check will mirror particles and probing points to ensure proper behavior near processor bounds\n     if(checkPeriodicCells_)\n     {\n        //Enforce reading of the blocking for periodic checks\n        if(readBool(this->couplingProperties().subDict(\"wall_blockPeriodicityCheck\").lookup(\"x\")))\n            wall_periodicityCheckRange_[0] = 0;\n        if(readBool(this->couplingProperties().subDict(\"wall_blockPeriodicityCheck\").lookup(\"y\")))\n            wall_periodicityCheckRange_[1] = 0;\n        if(readBool(this->couplingProperties().subDict(\"wall_blockPeriodicityCheck\").lookup(\"z\")))\n            wall_periodicityCheckRange_[2] = 0;\n\n        if(this->couplingProperties().found(\"wall_periodicityCheckTolerance\"))\n            wall_periodicityCheckTolerance_ = readScalar (this->couplingProperties().lookup(\"wall_periodicityCheckTolerance\"));\n     }\n\n     // add flag for IB cloud --> model checks\n     registryM().addProperty(\"IB\", 1);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ncfdemCloudIB::~cfdemCloudIB()\n{\n    dataExchangeM().destroy(angularVelocities_,3);\n    dataExchangeM().destroy(dragPrev_,3);\n    dataExchangeM().destroy(DEMTorques_,3);\n}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid Foam::cfdemCloudIB::getDEMdata()\n{\n    cfdemCloud::getDEMdata();\n    dataExchangeM().getData(\"omega\",\"vector-atom\",angularVelocities_);\n}\n\nbool Foam::cfdemCloudIB::reAllocArrays() const\n{\n    if(cfdemCloud::reAllocArrays())\n    {\n        Info <<\"Foam::cfdemCloudIB::reAllocArrays()\"<<endl;\n        dataExchangeM().allocateArray(angularVelocities_,0,3);\n        dataExchangeM().allocateArray(dragPrev_,0,3);\n        dataExchangeM().allocateArray(DEMTorques_,0,3);\n        return true;\n    }\n    return false;\n}\n\nvoid Foam::cfdemCloudIB::giveDEMdata()\n{\n\n    cfdemCloud::giveDEMdata();\n    dataExchangeM().giveData(\"hdtorque\",\"vector-atom\", DEMTorques_);\n}\n\ninline double ** Foam::cfdemCloudIB::DEMTorques() const\n{\n    return DEMTorques_;\n}\n\n\nbool Foam::cfdemCloudIB::evolve\n(\n    volScalarField& alpha,\n    volScalarField& interFace\n)\n{\n    numberOfParticlesChanged_ = false;\n    arraysReallocated_=false;\n    bool doCouple=false;\n\n    if(skipAfter_) {\n      if(timeStepsToSkip_<1)\n        skipLagrangeToEulerMapping_=true;\n    }\n\n    if(!writeTimePassed_ && mesh_.time().outputTime()) writeTimePassed_=true;\n    if (dataExchangeM().doCoupleNow())\n    {\n        Info << \"\\n timeStepFraction() = \" << dataExchangeM().timeStepFraction() << endl;\n        dataExchangeM().couple(0);\n        doCouple=true;\n\n//        Info << \"skipLagrangeToEulerMapping_: \" << skipLagrangeToEulerMapping_\n//             << \" haveEvolvedOnce_: \" << haveEvolvedOnce_ << endl;\n        if(!skipLagrangeToEulerMapping_ || !haveEvolvedOnce_)\n        {\n            if(verbose_) Info << \"- getDEMdata()\" << endl;\n            getDEMdata();\n            Info << \"nr particles = \" << numberOfParticles() << endl;\n\n            // search cellID of particles\n            if(verbose_) Info << \"- findCell()\" << endl;\n            locateM().findCell(NULL,fieldsToDEM[idPos()],cellIDs_,numberOfParticles());\n            if(verbose_) Info << \"findCell done.\" << endl;\n\n            // set void fraction field\n            if(verbose_) Info << \"- setvoidFraction()\" << endl;\n            voidFractionM().setvoidFraction(NULL,voidfractions_,particleWeights_,particleVolumes_,particleV_);\n            if(verbose_) Info << \"setvoidFraction done.\" << endl;\n\n            if(verbose_) Info <<\"setInterFace\"<<endl;\n            setInterFace(interFace);\n            if(verbose_) Info <<\"setInterFace done\"<<endl;\n        }\n\n        // update voidFractionField\n        alpha == voidFractionM().voidFractionNext(); // there might be a better approach, see cfdemCloud.C\n        alpha.correctBoundaryConditions();\n\n        // set particles forces\n        if(verbose_) Info << \"- setForce(forces_)\" << endl;\n        for(int index = 0;index <  numberOfParticles_; ++index){\n            for(int i=0;i<3;i++){\n                impForces_[index][i] = 0;\n                expForces_[index][i] = 0;\n            }\n        }\n        zeroizeFieldsToDEM();\n        for (int i=0;i<nrForceModels();i++) forceM(i).setForce();\n        if(verbose_) Info << \"setForce done.\" << endl;\n\n        // write DEM data\n        if(verbose_) Info << \" -giveDEMdata()\" << endl;\n        giveDEMdata();\n\n        dataExchangeM().couple(1);\n\n        haveEvolvedOnce_=true;\n    }\n    Info << \"evolve done.\" << endl;\n\n    //if(verbose_)    #include \"debugInfo.H\";\n\n    // do particle IO\n    IOM().dumpDEMdata();\n    if(skipAfter_)\n    {\n        timeStepsToSkip_--;\n        Info << \"Will skip LagrangeToEuler mapping after \" << timeStepsToSkip_ << \" time steps\" <<  endl;\n    }\n\n    return doCouple;\n}\n\n//defines the mesh refinement zone around a particle\n//twice the particle size in each direction\nvoid Foam::cfdemCloudIB::setInterFace\n(\n    volScalarField& interFace\n)\n{\n    interFace == dimensionedScalar(\"zero\", interFace.dimensions(), 0.);\n    for(int par=0; par< numberOfParticles(); par++)\n    {\n        vector ParPos(positions()[par][0],positions()[par][1],positions()[par][2]);\n        const boundBox& globalBb = mesh().bounds();\n        double skin = 2.0;\n        forAll(mesh_.C(),cellI)\n        {\n            vector posC = mesh_.C()[cellI];\n            if(checkPeriodicCells_)\n            {\n                // Some cells may be located on the other side of a periodic boundary.\n                // In this case, the particle center has to be mirrored in order to correctly\n                // evaluate the interpolation points.\n                vector minPeriodicParticlePos=ParPos;\n                voidFractionM().minPeriodicDistance(par,posC, ParPos, globalBb,\n                                                    minPeriodicParticlePos,\n                                                    wall_periodicityCheckRange());\n\n                ParPos = minPeriodicParticlePos;\n            }\n            double value = voidFractionM().pointInParticle(par, ParPos, posC, skin);\n            if(value <= 0.0)\n            {\n                interFace[cellI] = value + 1.0;\n            }\n        }\n    }\n}\n\nvoid Foam::cfdemCloudIB::calcVelocityCorrection\n(\n    volScalarField& p,\n    volVectorField& U,\n    volScalarField& phiIB,\n    volScalarField& voidfraction\n)\n{\n    setParticleVelocity(U);\n\n    // make field divergence free - set reference value in case it is needed\n    fvScalarMatrix phiIBEqn\n    (\n        fvm::laplacian(phiIB) == fvc::div(U) + fvc::ddt(voidfraction)\n    );\n    if(phiIB.needReference())\n    {\n         phiIBEqn.setReference(pRefCell_, pRefValue_);\n    }\n\n    phiIBEqn.solve();\n\n    U=U-fvc::grad(phiIB);\n    U.correctBoundaryConditions();\n\n    // correct the pressure as well\n    p=p+phiIB/U.mesh().time().deltaT();  // do we have to  account for rho here?\n    p.correctBoundaryConditions();\n\n    if (couplingProperties_.found(\"checkinterface\"))\n    {\n          Info << \"checking no-slip on interface...\" << endl;\n//          #include \"checkInterfaceVelocity.H\" //TODO: check carefully!\n    }\n}\n\nvoid Foam::cfdemCloudIB::setParticleVelocity\n(\n    volVectorField& U\n)\n{\n    label cellI=0;\n    vector uParticle(0,0,0);\n    vector rVec(0,0,0);\n    vector velRot(0,0,0);\n    vector angVel(0,0,0);\n\n    for(int index=0; index < numberOfParticles(); index++)\n    {\n        for(int subCell=0;subCell<cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                // calc particle velocity\n                for(int i=0;i<3;i++) rVec[i]=U.mesh().C()[cellI][i]-position(index)[i];\n                for(int i=0;i<3;i++) angVel[i]=angularVelocities()[index][i];\n                velRot=angVel^rVec;\n                for(int i=0;i<3;i++) uParticle[i] = velocities()[index][i]+velRot[i];\n\n                // impose field velocity\n                U[cellI]=(1-voidfractions_[index][subCell])*uParticle+voidfractions_[index][subCell]*U[cellI];\n            }\n        }\n    }\n    U.correctBoundaryConditions();\n}\n\nvector Foam::cfdemCloudIB::angularVelocity(int index)\n{\n    vector vel;\n    for(int i=0;i<3;i++) vel[i] = angularVelocities_[index][i];\n    return vel;\n}\n\ndouble Foam::cfdemCloudIB::getTortuosity(vector dir)\n{\n    volVectorField U = mesh_.lookupObject<volVectorField>(\"U\");\n    volScalarField voidfraction = mesh_.lookupObject<volScalarField>(\"voidfraction\");\n    double ux = 0.0;\n    double umag = 0.0;\n    forAll(mesh_.V(),cellI)\n    {\n        if(voidfraction[cellI] > 0.5)\n        {\n            double V = mesh_.V()[cellI];\n            ux += ((U[cellI] & dir))*V;\n            umag += mag(U[cellI])*V;\n        }\n    }\n    //double ux_reduced = 0.0;\n    //double umag_reduced = 0.0;\n    //MPI_Allreduce(&ux, &ux_reduced, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\n    //MPI_Allreduce(&umag, &umag_reduced, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\n    reduce(umag, sumOp<scalar>());\n    reduce(ux, sumOp<scalar>());\n    double tortuosity = ux == 0.0 ? 1.0 : umag / ux;\n    return tortuosity;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid cfdemCloudIB::setRefinementField(volScalarField* refine_)\n{\n //Function to allow for setting and activating special refinement operations\n frontMeshRefineField_ = refine_;\n frontMeshRefine_ = true;\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/derived/cfdemCloudIB/cfdemCloudIB.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    cloud class managing DEM data for CFD-DEM coupling and IB representation\n\nClass\n    Foam::cfdemCloudIB derived from cfdemCloud\n\nSourceFiles\n    cfdemCloudIB.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef cfdemCloudIB_H\n#define cfdemCloudIB_H\n\n#include \"cfdemCloud.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class cfdemCloudIB Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass cfdemCloudIB\n:\n    public cfdemCloud\n{\nprotected:\n\n    mutable double **angularVelocities_;\n    label pRefCell_;\n    scalar pRefValue_;\n    \n    mutable double **DEMTorques_;\n\n    mutable bool haveEvolvedOnce_;\n    mutable bool skipLagrangeToEulerMapping_;\n    mutable bool skipAfter_;\n    mutable int  timeStepsToSkip_;\n    mutable bool calculateTortuosity_;\n\n    vector flowDir_;\n\n    //for refinement - needed to ensure correct probing around the interface\n    volScalarField*     frontMeshRefineField_;\n    bool                frontMeshRefine_;\n\npublic:\n\n    // Constructors\n\n        //- Construct from components\n        cfdemCloudIB\n        (\n            const fvMesh& mesh\n        );\n\n    // Destructor\n\n        ~cfdemCloudIB();\n\n\n    // Member Functions\n        void giveDEMdata();\n\n        void getDEMdata();\n\n        bool reAllocArrays() const;\n\n        inline double ** DEMTorques() const;\n    \n        bool evolve(volScalarField&,volScalarField&);\n\n        void calcVelocityCorrection(volScalarField&,volVectorField&,volScalarField&,volScalarField&);\n\n        virtual void setParticleVelocity(volVectorField&);\n\n      // Access\n        vector angularVelocity(int);\n\n        inline double ** angularVelocities() const\n        {\n            return angularVelocities_;\n        };\n        void setInterFace(volScalarField& interFace);   //this field can be used for refinement outside of the cloud\n\n        double getTortuosity(vector dir);\n\n       void setRefinementField(volScalarField* refine_); //this pointer is meant for a field that is used refinement outside of the cloud. can point to the same field as interFace\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/changeDictionaryDicts/changeDictionaryDict_2.4.x",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  3.0.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      changeDictionaryDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndictionaryReplacement\n{\n\n    turbulenceProperties \n    {\n        simulationType  RASModel;\n    }\n    couplingProperties\n    {\n        turbulenceModelType \"RASProperties\";\n    }\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/changeDictionaryDicts/changeDictionaryDict_3.0.x",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  3.0.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      changeDictionaryDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndictionaryReplacement\n{\n\n    turbulenceProperties \n    {\n        simulationType  laminar;\n\n        RAS\n        {\n            RASModel        laminar;\n\n            turbulence      off;\n\n            printCoeffs     on;\n        }\n    }\n    couplingProperties\n    {\n        turbulenceModelType turbulenceProperties;\n    }\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/activateVersion.sh",
    "content": "#!/bin/bash\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/bashrc\n#shopt -s expand_aliases\n\nETCpath=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts\n\n$ETCpath/unComment.sh $1 CFD/constant/turbulenceProperties\n$ETCpath/unComment.sh $1 CFD/constant/transportProperties\n$ETCpath/unComment.sh $1 CFD/constant/couplingProperties\n$ETCpath/unComment.sh $1 CFD/constant/couplingProperties_run\n$ETCpath/unComment.sh $1 CFD/constant/couplingProperties_restart\n$ETCpath/unComment.sh $1 CFD/system/fvOptions\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion.sh",
    "content": "#!/bin/bash\n\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/bashrc\n#shopt -s expand_aliases\n\n# find my OF version\nif [ \"$WM_PROJECT_VERSION\" == \"3.0.x\" ]; then\n    echo 'You are using OpenFOAM 3.0.x. Will activate dicts now...'\n    OFV=OFversion30x\nelse\n    echo 'You are using OpenFOAM 2.4.x or lower. Will activate dicts now...'\n    OFV=OFversion24x\nfi\nETCpath=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts\n\n\n# remove old comment // in every line ending with OFversionXYZ\n# doing this three times to make sure multiple comments are removed\nbash $ETCpath/activateVersion.sh OFversion\nbash $ETCpath/activateVersion.sh OFversion\nbash $ETCpath/activateVersion.sh OFversion\n\n# adding comment // to all lines ending with OFversionXYZ\nbash $ETCpath/commentOut.sh OFversion CFD/constant/turbulenceProperties\nbash $ETCpath/commentOut.sh OFversion CFD/constant/transportProperties\nbash $ETCpath/commentOut.sh OFversion CFD/constant/couplingProperties\nbash $ETCpath/commentOut.sh OFversion CFD/constant/couplingProperties_run\nbash $ETCpath/commentOut.sh OFversion CFD/constant/couplingProperties_restart\nbash $ETCpath/commentOut.sh OFversion CFD/system/fvOptions\n\n# removing the comment // in every line ending with $OFV\nbash $ETCpath/activateVersion.sh $OFV\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion_all.sh",
    "content": "#! /bin/bash\n\n##########################################################################\n# Shellscript:\tupdate tutorial cases in the whole tree according to OFV\n# Author     :\tAndreas Aigner <andreas.aigner@dcs-computing.com>\n# Date       :\t2016-04-15\n# Category   :\tAdmin Utilities\n##########################################################################\n# Description\n#    update tutorial cases in the whole tree according to OFV\n##########################################################################\n\nPN=`basename \"$0\"` # Program name\nBASEDIR=`dirname \"$0\"`\nVER='0.1'\n\nUsage () {\n    echo >&2 \"$PN - update all tutorials in a whole tree, $VER\nusage: $PN [-f] path\n    -f: force to ignore security check;\n        allows other directories than 'cfdemTut' and sub-directories\n    -v: verbose output\n    -h: show this help\n\n    path: path to the root directory of all tutorials\n\nExample:\n    $PN $HOME/Repositories\"\n    exit 1\n}\n\nMsg () { echo >&2 \"$*\"; } # removed \"$PN:\" to shorten output\nFatal () { Msg \"Error: $@\"; exit 1; }\n\n# defaults\nforce_flag=false\nverbose_flag=false\n\nwhile getopts hfv opt\ndo\n    case \"$opt\" in\n      f)  force_flag=true;;\n      v)  verbose_flag=true;;\n      h)  Usage;;\n      \\?) Usage;;\n    esac\ndone\nshift `expr $OPTIND - 1`\n\n[ $# -lt 1 ] && Msg \"No path defined\" && Usage # check for path\n\n# check if readlink exists (we need it for the savety check)\ncommand -v readlink >/dev/null 2>&1 || { Fatal \"readlink is required but it's not installed. Aborting.\"; }\n\n# global paths\ncurRunDir=$(pwd)\ncfdemTutDir=$(readlink -m $CFDEM_TUT_DIR)\n\n#set -x\nfor dir in \"$@\"\ndo\n    Msg \"INFO: Checking $dir\"\n\n    # is directory?\n    if [ ! -d \"$dir\" ]; then\n      Msg \"$dir is not a directory\"\n      continue\n    fi\n\n    # clean paths from multiple separators (pure bash)\n    #dir=$(echo \"$dir\" | sed s#//*#/#g)\n    #cfdemTutDir=$(echo \"$CFDEM_TUT_DIR\" | sed s#//*#/#g)\n\n    # resolve absolute and relative paths (with readlink)\n    # clean paths from multiple separators and resolve ./..\n    if [ \"${dir:0:1}\" = \"/\" ]; then # absolute path\n      curDir=$(readlink -m $dir)\n    else # relative path\n      curDir=$(readlink -m $curRunDir/$dir)\n    fi\n\n    # savety check: check if dir is within $CFDEM_TUT_DIR; skip if forced\n    if [[ $curDir != $cfdemTutDir ]] && [ $force_flag != true ]; then\n        Fatal \"$curDir is not within $cfdemTutDir. Change the directory or use the option -f.\"\n    fi\n\n    # performe change steps\n    ldir=$(find \"$dir\" -name 'CFD' -type d)\n    for cfd in $ldir\n    do\n      casedir=$(dirname \"$cfd\") ## get parent directory of the CFD directory\n      Msg \"INFO: Updating $casedir\"\n      #echo \"do sth here...\"\n      if [ $verbose_flag = true ]; then\n        (cd $casedir && bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion.sh)\n      else\n        (cd $casedir && bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion.sh) &>/dev/null\n      fi\n    done\ndone\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/commentOut.sh",
    "content": "#!/bin/bash\n#Syntax: commentOut <stringTo Search, e.g., version30x> <file>\n#This will do a GLOBAL commenting out!\n\nsed -i \"/$1/ s:^://:g\" $2\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/integratorAndCouplingStyleChange.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# script which should support changing the syntax in the liggghts\n# input files to new integrators and force coupling.\n# WARNING: Use this script at YOUR OWN RISK!!!\n# Please use with caution and prepare a copy of your files\n# BEFORE (!!!) you run this script.\n# DCS Computing GmbH - June 2018\n#===================================================================#\n# SYNTAX CHANGES FOR SPHERES:\n#A) nve/sphere-->nve/cfd_cn/sphere\n#B) couple/cfd/force/implicit-->couple/cfd/force\n#C) CrankNicolson entry goes from couple/cfd/force/implicit to nve/cfd_cn/sphere\n#D) CAddRhoFluid is only used with couple/cfd/force and entries are split up to ${Cadd} and ${rhoFluid}\n#E) transfer_type yes is now handled via transfer_property type\n#F) fix multisphere is no longer an integrator and needs a separate integrator fix integrator all nve/cfd_cn/nonspherical\n#   the fix multisphere and fix integrator command must be before the fix couple/cfd/force/multisphere\n#G) IB cases need for the fix couple/cfd/force the extra keyword torque explicit to communicate hdtorque\n#===================================================================#\n\necho \"WARNING: Use this script at YOUR OWN RISK (!!!). Please use with caution and prepare a copy of your files. BEFORE (!!!) you run this script.\"\necho \"In doubt press Ctrl-C!\"\nread\n\n\necho \"apply rule A) nve/sphere-->nve/cfd_cn/sphere\"\necho \"to all in.* (files named differently will be ignored!)\"\nread\nfind . -iname \"in.*\" -exec sed -i 's/nve\\/sphere/nve\\/cfd_cn\\/sphere/g' {} +\n\necho \"apply rule B) couple/cfd/force/implicit-->couple/cfd/force\"\necho \"to all in.* (files named differently will be ignored!)\"\nread\nfind . -iname \"in.*\" -exec sed -i 's/couple\\/cfd\\/force\\/implicit/couple\\/cfd\\/force/g' {} +\n\necho \"apply rule B)2) couple/cfd/force/integrateImp-->couple/cfd/force && nve/cfd_cn/sphere\"\necho \"to all in.* (files named differently will be ignored!)\"\necho \"please add the command fix integr all nve/cfd_cn/sphere to the files being opend in gedit\"\necho \"Then please save the files and close the gedit window. Then press enter.\"\nread\nfind . -iname \"in.*\" -exec grep -rl \"integrateImp\" {} + | xargs gedit -s;\nread\nfind . -iname \"in.*\" -exec sed -i 's/couple\\/cfd\\/force\\/integrateImp/couple\\/cfd\\/force/g' {} +\n\necho \"Please manually apply rule C): CrankNicolson entry goes from couple/cfd/force/implicit to nve/cfd_cn/sphere (the files will open in gedit.)\"\necho \"Then please save the files and close the gedit window. Then press enter.\"\nread\nfind . -iname \"in.*\" -exec grep -rl \"CrankNicolson\" {} + | xargs gedit -s;\nread\n\necho \"Please manually apply rule D): CAddRhoFluid is only used with couple/cfd/force and entries are split up to \\${Cadd} and \\${rhoFluid}\"\necho \"Then please save the files and close the gedit window. Then press enter.\"\nread\nfind . -iname \"in.*\" -exec grep -rl \"CAddRhoFluid\" {} + | xargs gedit -s;\n\necho \"Please manually apply rule E): transfer_type yes is now handled via couple/cfd (not force!!!) transfer_property name type vector_atom\"\necho \"Then please save the files and close the gedit window. Then press enter.\"\nread\nfind . -iname \"in.*\" -exec grep -rl \"transfer_type\" {} + | xargs gedit -s;\n\necho \"Please manually apply rule F): fix multisphere is no longer an integrator and needs a separate integrator fix integrator all nve/cfd_cn/nonspherical.\"\necho \"The fix multisphere and fix integrator command must be before the fix couple/cfd/force/multisphere!\"\necho \"Then please save the files and close the gedit window. Then press enter.\"\nread\nfind . -iname \"in.*\" -exec grep -rl \"multisphere\" {} + | xargs gedit -s;\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/unComment.sh",
    "content": "#!/bin/bash\n#Syntax: unComment <stringTo Search, e.g., version30x> <file>\n#This will do a GLOBAL uncomment!\n\nsed -i \"/$1/ s:^//::g\" $2\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/OFversion/OFversion.H",
    "content": "#if(CFDEMWMPROJECTVERSION == 60) || (CFDEMWMPROJECTVERSION == 6)\n    #define version60\n#elif(CFDEMWMPROJECTVERSION == 50)\n    #define version50\n#elif(CFDEMWMPROJECTVERSION == 40)\n    #define version40\n#elif(CFDEMWMPROJECTVERSION == 24)\n    #define version24\n#elif(CFDEMWMPROJECTVERSION == 30)\n    #define version30\n#elif(CFDEMWMPROJECTVERSION == 132)\n    #define versionExt32\n#elif(CFDEMWMPROJECTVERSION == 1606)\n    #define versionv1606plus\n#elif(CFDEMWMPROJECTVERSION == 1612)\n    #define versionv1612plus\n#elif(CFDEMWMPROJECTVERSION == 1706)\n    #define versionv1706\n#endif\n\n// features of 16ext work also in extend 3.2\n#if defined(versionExt32)\n    #define version16ext\n#endif\n\n// features of 5.0 work also in 6.0\n#if defined(version60)\n    #define version50\n#endif\n\n// features of 4.0 work also in 5.0\n#if defined(version50)\n    #define version40\n#endif\n\n// features of 3.0 work also in 4.0\n#if defined(version40)\n    #define version30\n#endif\n\n// features of v1706 work also in v1612+\n#if defined(versionv1706)\n    #define versionv1612plus\n#endif\n\n#if defined(versionv1612plus)\n    #define version40\n#endif\n\n// features of v1606+ work also in v1612+\n#if defined(versionv1612plus)\n    #define versionv1606plus\n#endif\n\n// features of 3.0 work also in v1606+\n#if defined(versionv1606plus)\n    #define version30\n#endif\n\n// features of 2.4Dev work also in 3.0\n#if defined(version30)\n    #define version24Dev\n#endif\n\n// basically use 24x settings + some dev features (e.g. new turbulence model structure)\n#if defined(version24Dev)\n    #define version24\n#endif\n\n// features of 2.4 work also in 2.3\n#if defined(version24)\n    #define version23\n#endif\n\n// features of 2.1 work also in 2.3\n#if defined(version23)\n    #define version21\n    #define version221\n#endif\n\n// features of 2.1 work also in 2.2\n#if defined(version22)\n    #define version21\n    #define version221\n#endif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_2.4.x",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n# CFDEM_ADD_INC =\n# CFDEM_ADD_LIB_PATHS =\n# CFDEM_ADD_LIBS =\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 2.4.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n-I$(LIB_SRC)/sampling/lnInclude\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lincompressibleRASModels \\\n-lincompressibleLESModels \\\n-lfvOptions \\\n-lsampling\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \\\n-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiationModels/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lcompressibleRASModels \\\n-lcompressibleLESModels \\\n-lfluidThermophysicalModels \\\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_3.0.x",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n#CFDEM_ADD_INC = \\\n#CFDEM_ADD_LIB_PATHS = \\\n#CFDEM_ADD_LIBS = \\\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 3.0.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n###-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_3.2",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n# CFDEM_ADD_INC =\n# CFDEM_ADD_LIB_PATHS =\n# CFDEM_ADD_LIBS =\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR Extend 3.2                                     ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lincompressibleRASModels \\\n-lincompressibleLESModels \\\n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \\\n-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiationModels/lnInclude \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lcompressibleRASModels \\\n-lcompressibleLESModels \\\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_4.x",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n# CFDEM_ADD_INC =\n# CFDEM_ADD_LIB_PATHS =\n# CFDEM_ADD_LIBS =\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 3.0.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_5.x",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n# CFDEM_ADD_INC =\n# CFDEM_ADD_LIB_PATHS =\n# CFDEM_ADD_LIBS =\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 5.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lthermophysicalProperties \\\n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_6",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n# CFDEM_ADD_INC =\n# CFDEM_ADD_LIB_PATHS =\n# CFDEM_ADD_LIBS =\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 6.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(CFDEM_LIB_DIR)/../include \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-L$(CFDEM_LIB_DIR)/../lib \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lthermophysicalProperties \\\n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(CFDEM_LIB_DIR)/../include \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-L$(CFDEM_LIB_DIR)/../lib \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_solver",
    "content": "ifdef CFDEM_LIGGGHTS_MAKEFILE_POSTFIX\n  ifneq ($(CFDEM_LIGGGHTS_MAKEFILE_POSTFIX),)\n    sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.auto.options_$(CFDEM_LIGGGHTS_MAKEFILE_POSTFIX)\n  else\n    sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.auto.options\n  endif\nelse\n  sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.auto.options\nendif\nifdef OPTIONS_EXTRA_RPATH\n    PFLAGS+=$(OPTIONS_EXTRA_RPATH)\nendif\n$(info OPTIONS_EXTRA_RPATH = $(OPTIONS_EXTRA_RPATH))\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_superquadric",
    "content": "ifdef CFDEM_LIGGGHTS_MAKEFILE_POSTFIX\n  ifneq ($(CFDEM_LIGGGHTS_MAKEFILE_POSTFIX),)\n    sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.user_$(CFDEM_LIGGGHTS_MAKEFILE_POSTFIX)\n  else\n    sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.user\n  endif\nelse\n  sinclude $(CFDEM_LIGGGHTS_SRC_DIR)/MAKE/Makefile.user\nendif\nifeq ($(USE_SUPERQUADRICS), \"ON\")\n    PFLAGS+=-DSUPERQUADRIC_ACTIVE_FLAG -DNONSPHERICAL_ACTIVE_FLAG\nendif\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_v1606+",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n#CFDEM_ADD_INC = \\\n#CFDEM_ADD_LIB_PATHS = \\\n#CFDEM_ADD_LIBS = \\\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 3.0.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/addLibs_universal/additionalLibs_v1612+",
    "content": "# Specify additional include and library paths, as well as libraries for the compilation\n#\n#CFDEM_ADD_INC = \\\n#CFDEM_ADD_LIB_PATHS = \\\n#CFDEM_ADD_LIBS = \\\n\n# additional static libraries to be linked to lagrangian library\nCFDEM_ADD_STATICLIBS = \\\n\n# include flags for compiling with SQ\ninclude $(CFDEM_ADD_LIBS_DIR)/additionalLibs_superquadric\n\n#################################################################\n## SETTINGS FOR 3.0.x                                          ##\n#################################################################\n#----------------------------------------------------------------\n# incompressible turbulence model settings\n#----------------------------------------------------------------\n# paths for incompressible turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \\\n-I$(LIB_SRC)/fvOptions/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_INCOMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lincompressibleTurbulenceModels \\\n-lfvOptions \\\n\nCFDEM_TRI_SURF = \\\n-ltriSurface\n\nCFDEM_SPRAY_LIBS = \\\n    -lliquidProperties \\\n    -lliquidMixtureProperties \\\n    -lsolidProperties \\\n    -lsolidMixtureProperties \\\n    -lthermophysicalFunctions \n\n#----------------------------------------------------------------\n# compressible turbulence model settings\n#----------------------------------------------------------------\n# paths for compressible turbulence models to use\nCFDEM_ADD_COMPTURBMOD_PATHS = \\\n-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \\\n-I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \\\n-I$(LIB_SRC)/transportModels/compressible/lnInclude \\\n-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \\\n\n# libs for turbulence models to use\nCFDEM_ADD_COMPTURBMOD_LIBS = \\\n-lturbulenceModels \\\n-lcompressibleTurbulenceModels \\\n#################################################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/bashrc",
    "content": "#----------------------------------*-sh-*--------------------------------------\n# CFDEMcoupling\n# Christoph Goniva\n# June 2012\n#------------------------------------------------------------------------------\n#\n# Script\n#     etc/bashrc\n#\n# Description\n#     Startup file for cfdem exporting environment variables\n#     Sourced  ~/.bashrc\n#\n#- add this block to your ~/.bashrc and modify for your installation\n#- you can test the correctness using cfdemSystemTest.sh\n\n## STANDARD BLOCK FOR REGULAR INSTALLATIONS\n##================================================#\n##- source cfdem env vars\n#export CFDEM_VERSION=PUBLIC\n#export CFDEM_PROJECT_DIR=$HOME/CFDEM/CFDEMcoupling-$CFDEM_VERSION-$WM_PROJECT_VERSION\n#export CFDEM_PROJECT_USER_DIR=$HOME/CFDEM/$LOGNAME-$CFDEM_VERSION-$WM_PROJECT_VERSION\n#export CFDEM_bashrc=$CFDEM_PROJECT_DIR/src/lagrangian/cfdemParticle/etc/bashrc\n#export CFDEM_LIGGGHTS_SRC_DIR=$HOME/LIGGGHTS/LIGGGHTS-PUBLIC/src\n#export CFDEM_LIGGGHTS_MAKEFILE_NAME=auto\n#export CFDEM_LPP_DIR=$HOME/LIGGGHTS/mylpp/src\n#. $CFDEM_bashrc\n#================================================#\n#------------------------------------------------------------------------------\n\n\n## EXTENDED BLOCK FOR HIGHLY CUSTOMIZED INSTALLATIONS\n## you may insert this right above \". $CFDEM_bashrc\"\n##================================================#\n#export CFDEM_SRC_DIR=$CFDEM_PROJECT_DIR/src\n#export CFDEM_SOLVER_DIR=$CFDEM_PROJECT_DIR/applications/solvers\n#export CFDEM_DOC_DIR=$CFDEM_PROJECT_DIR/doc\n#export CFDEM_UT_DIR=$CFDEM_PROJECT_DIR/applications/utilities\n#export CFDEM_TUT_DIR=$CFDEM_PROJECT_DIR/tutorials\n#export CFDEM_LIGGGHTS_MAKEFILE_POSTIFX=\n#export CFDEM_VERBOSE=false\n#================================================#\n\n#------------------------------------------------------------------------------\n#- export environment variables (adapt to your paths)\n#------------------------------------------------------------------------------\n\nif [[ $CFDEM_SCHEMEMODE == \"\" ]]; then export CFDEM_SCHEMEMODE=robust; fi\n\n## small function defs\naddPath()\n{\nfor path in \"$@\"; do\n  export PATH=\"$path\":\"$PATH\"\ndone\n}\n\naddLDLib()\n{\nfor path in \"$@\"; do\n    export LD_LIBRARY_PATH=\"$path\":\"$LD_LIBRARY_PATH\"\ndone\n}\n\ncfdemecho()\n{\nif [[ ! $CFDEM_VERBOSE == \"false\" ]]; then echo \"$1\"; fi\n}\n\nsetVar()\n{\nvarCont=$(eval echo \\$$1)\nif [[ \"$varCont\" == \"\" ]]; then\n  eval export $1=\"$2\"\n  cfdemecho \"using default $1 = $2\"\nelse\n  cfdemecho \"using userdefined $1 = $varCont\"\nfi\n}\n\ncfdemecho \"************************************\"\nsetVar CFDEM_SRC_DIR $CFDEM_PROJECT_DIR/src\nsetVar CFDEM_SOLVER_DIR $CFDEM_PROJECT_DIR/applications/solvers\nsetVar CFDEM_DOC_DIR $CFDEM_PROJECT_DIR/doc\nsetVar CFDEM_UT_DIR $CFDEM_PROJECT_DIR/applications/utilities\nsetVar CFDEM_TUT_DIR $CFDEM_PROJECT_DIR/tutorials\nsetVar CFDEM_RHEO_DIR $WM_PROJECT_DIR/../ViscoElastic/of60\nsetVar CFDEM_RHEO_LIB_DIR $FOAM_USER_LIBBIN\n\n#check if default lammps lib path should be used\nsetVar CFDEM_LAMMPS_LIB_DIR $CFDEM_LIGGGHTS_SRC_DIR/../lib\n\n#test CFDEM_LAMMPS_LIB_DIR\nif [ -f \"$CFDEM_LAMMPS_LIB_DIR/poems/Makefile.lammps\" ]; then\n    :\nelse\n    echo \"\"\n    echo \"   !!! WARNING CFDEM_LAMMPS_LIB_DIR = $CFDEM_LAMMPS_LIB_DIR seems to be wrong !!!\"\n    echo \"\"\nfi\n\n#- LIGGGHTS lib name\nif [[ $CFDEM_LIGGGHTS_MAKEFILE_NAME == \"auto\" ]] && [[ $CFDEM_LIGGGHTS_MAKEFILE_POSTFIX != \"\" ]] ; then\n    export CFDEM_LIGGGHTS_LIB_NAME=\"lmp_\"$CFDEM_LIGGGHTS_MAKEFILE_NAME\"_\"$CFDEM_LIGGGHTS_MAKEFILE_POSTFIX\nelse\n    export CFDEM_LIGGGHTS_LIB_NAME=lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME\nfi\n\nif [[ ${WM_COMPILE_OPTION} == \"Debug\" ]] && [[ $CFDEM_LIGGGHTS_MAKEFILE_NAME == \"auto\" ]]; then\n  export CFDEM_LIGGGHTS_LIB_NAME=\"${CFDEM_LIGGGHTS_LIB_NAME}-fulldebug\"\nfi\n\n#- LIGGGHTS lib path\nsetVar CFDEM_LIGGGHTS_MAKEFILE_NAME \"auto\"\nsetVar CFDEM_LIGGGHTS_LIB_PATH $CFDEM_LIGGGHTS_SRC_DIR\n\n#- LIGGGHTS executable\nexport CFDEM_LIGGGHTS_EXEC=$CFDEM_LIGGGHTS_LIB_PATH/$CFDEM_LIGGGHTS_LIB_NAME\n\n#- CFDEM lib name\nexport CFDEM_LIB_NAME=lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#- CFDEM compressible lib name\nexport CFDEM_LIB_COMP_NAME=lagrangianCFDEMcomp-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#check if additional libraries should be compiled together with solvers\nsetVar CFDEM_ADD_LIBS_DIR $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/addLibs_universal\nsetVar CFDEM_ADD_LIBS_NAME additionalLibs_$WM_PROJECT_VERSION\n\n# check addLibs path and file name\nif [[ ! -f $CFDEM_ADD_LIBS_DIR/$CFDEM_ADD_LIBS_NAME ]]; then\n    echo \"!!! ERROR !!!: CFDEM_ADD_LIBS_DIR/CFDEM_ADD_LIBS_NAME=$CFDEM_ADD_LIBS_DIR/$CFDEM_ADD_LIBS_NAME does not exist.\"\nfi\n\n#-----------------------------------------------------\n# additional libraries\n\n#- LMP Many2Many lib path and makefile\nexport CFDEM_Many2ManyLIB_PATH=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library\nexport CFDEM_Many2ManyLIB_MAKEFILENAME=$CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- LMP M2M lib path and makefile\nexport CFDEM_M2MLIB_PATH=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/M2M/library\nsetVar CFDEM_M2MLIB_MAKEFILENAME $CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- LMP M2MMS lib path and makefile\nexport CFDEM_M2MMSLIB_PATH=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/M2M/library\nexport CFDEM_M2MMSLIB_MAKEFILENAME=$CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- socketLib lib path and makefile\nexport CFDEM_socketLibLIB_PATH=$CFDEM_SRC_DIR/CoSimProtocols/socketLib\nexport CFDEM_socketLibLIB_MAKEFILENAME=script\n\n#- LMP POEMS lib default path\nexport CFDEM_POEMSLIB_PATH=$CFDEM_LAMMPS_LIB_DIR/poems\n#-----------------------------------------------------\n\n#- path to test harness\nexport CFDEM_TEST_HARNESS_PATH=$CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#- path to libraries\n# check if pathes are already set automatically\nsetVar CFDEM_LIB_DIR $CFDEM_PROJECT_DIR/platforms/$WM_OPTIONS/lib\nsetVar CFDEM_USER_LIB_DIR $CFDEM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/lib\n\naddLDLib \"$CFDEM_LIB_DIR\" \"$CFDEM_USER_LIB_DIR\"\n\n#- path to apps\nsetVar CFDEM_APP_DIR $CFDEM_PROJECT_DIR/platforms/$WM_OPTIONS/bin\nsetVar CFDEM_USER_APP_DIR $CFDEM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/bin\n\naddPath \"$CFDEM_APP_DIR\" \"$CFDEM_USER_APP_DIR\"\n\n#- path to OF version flag file\nexport CFDEM_OFVERSION_DIR=$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFversion\n#------------------------------------------------------------------------------\n#- settings for lpp postproc tool\n#------------------------------------------------------------------------------\n\n#- nr of procs for lpp tool\nexport CFDEM_LPP_NPROCS=1\n\n#- nr of procs for lpp tool\nexport CFDEM_LPP_CHUNKSIZE=1\n\n#- shortcut to run lpp\nalias cfdemLpp='python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE'\n\n#------------------------------------------------------------------------------\n#- aliases for easy navigation (no changes necessary)\n#------------------------------------------------------------------------------\n#- shortcut to cfdem path\nalias cfdem='cd $CFDEM_PROJECT_DIR'\n\n#- shortcut to src path\nalias cfdemSrc='cd $CFDEM_SRC_DIR'\n\n#- shortcut to etc path\nalias cfdemEtc='cd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc'\n\n#- shortcut to tutorial path\nalias cfdemTut='cd $CFDEM_TUT_DIR'\n\n#- shortcut to solver path\nalias cfdemSol='cd $CFDEM_SOLVER_DIR'\n\n#- shortcut to utilities path\nalias cfdemUt='cd $CFDEM_UT_DIR'\n\n#- shortcut to run path\nalias cfdemRun='cd $CFDEM_PROJECT_USER_DIR/run'\n\n#- shortcut to user solver path\nalias cfdemUsrSol='cd $CFDEM_PROJECT_USER_DIR/applications/solvers'\n\n#- shortcut to documentation path\nalias cfdemDoc='cd $CFDEM_DOC_DIR'\n\n#- shortcut to open the doxygen with firefox\nalias cfdemDox='firefox $CFDEM_DOC_DIR/doxygen/html/index.html'\n\n#- shortcut to LIGGGHTS path\nalias cfdemLIG='cd $CFDEM_LIGGGHTS_SRC_DIR'\n\n#- shortcut to system test\nalias cfdemSysTest='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh'\n\n#- shortcut to pull LIGGGHTS\nalias cfdemPullLIG='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/pullLIGGGHTS.sh'\n\n#- shortcut to pull CFDEMcoupling\nalias cfdemPullCFDEMcoupling='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/pullCFDEMcoupling.sh'\n\n#- shortcut to clean CFDEM\nalias cfdemCleanCFDEM='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/cleanCFDEMcoupling.sh'\n\n#- shortcut to compile LIGGGHTS + sublibraries\nalias cfdemCompLIG='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS.sh'\n\n#- shortcut to compile LIGGGHTS' sublibraries\nalias cfdemCompLIGlibs='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh'\n\n#- shortcut to compile CFDEMcoupling +LIGGGHTS\nalias cfdemCompCFDEMall='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_all.sh'\n\n#- shortcut to compile CFDEMcoupling (src+solvers)\nalias cfdemCompCFDEM='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh'\n\n#- shortcut to compile CFDEMcoupling src\nalias cfdemCompCFDEMsrc='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh'\n\n#- shortcut to compile CFDEMcoupling solvers\nalias cfdemCompCFDEMsol='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_sol.sh'\n\n#- shortcut to compile CFDEMcoupling utilities\nalias cfdemCompCFDEMuti='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh'\n\n#- shortcut to test basic tutorials\nalias cfdemTestTUT='bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/testTutorials.sh'\n\n#- refresh link to LIGGGHTS binary\nalias cfdemRefreshLigLink='ln -sf $CFDEM_LIGGGHTS_LIB_PATH/lib$CFDEM_LIGGGHTS_LIB_NAME.so $CFDEM_LIB_DIR'\n\n#- shortcut to change dictionaries according to OF version\ncfdemChangeTutOFversion() { bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion_all.sh $1; }\nexport -f cfdemChangeTutOFversion\n\n#- shortcut to use script for changing integrator and force coupling syntax\nintegratorAndCouplingStyleChange() { bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/integratorAndCouplingStyleChange.sh; }\nexport -f integratorAndCouplingStyleChange\n\n#- shortcut to visualize the clock model data\nalias vizClock='python $CFDEM_UT_DIR/vizClock/matPlot.py'\n\n#- recursive touch of current directory\nalias touchRec='find ./* -exec touch {} \\;'\n\n#- shortcut to run liggghts in serial\ncfdemLiggghts() { $CFDEM_LIGGGHTS_EXEC -in $1; }\nexport -f cfdemLiggghts\n\n#- shortcut to run liggghts in parallel\ncfdemLiggghtsPar() { mpirun -np $2 $CFDEM_LIGGGHTS_EXEC -in $1; }\nis_openmpi=`mpirun -version | grep \"Open MPI\" | wc -l`\n# Open MPI (version > 3) no longer allows oversubscription by default, we do want that though\nif [[ $is_openmpi == 1 ]]; then\n    cfdemLiggghtsPar() { mpirun -oversubscribe -np $2 $CFDEM_LIGGGHTS_EXEC -in $1; }\nfi\nunset is_openmpi\nexport -f cfdemLiggghtsPar\n\n#- shortcut to open files including a pattern\ncfdemGrep() { grep -rl \"$1\" ./* | xargs gedit; }\nexport -f cfdemGrep\n\n#- shortcut lo list files in a directory\n#cfdemListFiles() { find $1 | sed s:\"\"$1\"\":: > listOfFiles.txt; }   #leave out the dir iteslf in list\ncfdemListFiles() { find $1 > listOfFiles.txt; }                     #keep the dir in list\nexport -f cfdemListFiles\n\n#- function to unload environment, everything starting with CFDEM_ and containing cfdem\ncfdemUnsetEnv() { unset cfdemLiggghts cfdemLiggghtsPar cfdemGrep cfdemListFiles cfdemChangeTutOFversion cfdemUnsetEnv integratorAndCouplingStyleChange;\n                  cfdemDirs=\"$CFDEM_PROJECT_DIR $CFDEM_LIB_DIR $CFDEM_USER_LIB_DIR $CFDEM_APP_DIR $CFDEM_USER_APP_DIR\";\n                  foamClean=$WM_PROJECT_DIR/bin/foamCleanPath;\n                  cleaned=$($foamClean \"$PATH\" \"$cfdemDirs\") && PATH=\"$cleaned\";\n                  cleaned=$($foamClean \"$LD_LIBRARY_PATH\" \"$cfdemDirs\") && LD_LIBRARY_PATH=\"$cleaned\";\n                  unset $(env | grep \"CFDEM_\" |awk -F'=' '{print $1}');\n                  unalias $(env | grep \"cfdem\" |awk -F'=' '{print $1}');\n                  unset foamClean cleaned; }\n\nexport -f cfdemUnsetEnv\n\n# check if the run directory exists\nif [ -d \"$CFDEM_PROJECT_USER_DIR\" ]; then\n    :\nelse\n        echo \"make new dirs $CFDEM_PROJECT_USER_DIR ? (y/n)\"\n        read YN\n        if [ $YN == \"y\" ]; then\n            mkdir -p $CFDEM_PROJECT_USER_DIR\n            cd $CFDEM_PROJECT_USER_DIR\n            mkdir run\n            mkdir -p log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n            mkdir -p applications/solvers\n            mkdir -p $CFDEM_LIB_DIR\n            mkdir -p $CFDEM_USER_LIB_DIR\n            mkdir -p $CFDEM_APP_DIR\n            mkdir -p $CFDEM_USER_APP_DIR\n        else\n            echo \"aborted by user.\"\n            #exit\n        fi\nfi\n\n# set thermophysical library version to 6, overwrite if OF5\nsetVar CFDEM_THERMOPHYSICAL_VERSION 6\n\n# detect OF version\nif [[ $WM_PROJECT_VERSION == 6 ]]; then\n    export CFDEM_WM_PROJECT_VERSION=60\nelif [[ $WM_PROJECT_VERSION == 5.* ]]; then\n    export CFDEM_WM_PROJECT_VERSION=50\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    setVar CFDEM_THERMOPHYSICAL_VERSION 5.x\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == 4.* ]]; then\n    export CFDEM_WM_PROJECT_VERSION=40\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == 3.0.* ]]; then\n    export CFDEM_WM_PROJECT_VERSION=30\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == v1606+ ]]; then \n    export CFDEM_WM_PROJECT_VERSION=1606\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == v1612+ ]]; then \n    export CFDEM_WM_PROJECT_VERSION=1612\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == v1706 ]]; then \n    export CFDEM_WM_PROJECT_VERSION=1706\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == 2.4.* ]]; then\n    export CFDEM_WM_PROJECT_VERSION=24\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelif [[ $WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\" ]]; then\n    export CFDEM_WM_PROJECT_VERSION=132\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse\n    clear\n    cfdemecho \"************************************\"\n    cfdemecho \"ERROR from your CFDEM code!\"\n    cfdemecho \"ERROR: your OpenFOAM(R) version is not supported!\"\n    cfdemecho \"Please use a version that is supported, i.e., see the bashrc file in the source directory!\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nfi\n\ncfdemecho \"************************************\"\n\nunset addPath addLDLib cfdemecho setVar\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# sytsem settings test routine for cfdem project \n# Christoph Goniva - May. 2011, DCS Computing GmbH\n#===================================================================#\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#- show gcc settings\ncheckGPP=\"true\"\n\n#- sys check for add on\ncheckAddOn=\"false\"\n\n#- system settings\nprintHeader\n\necho \"*********************************\"\necho \"CFDEM(R)coupling system settings:\"\necho \"*********************************\"\n\necho \"CFDEM_VERSION=$CFDEM_VERSION\"\necho \"couple to OF_VERSION=$WM_PROJECT_VERSION\"\necho \"compile option=$WM_COMPILE_OPTION\"\n\n\necho\necho \"check if paths are set correctly\"\ncheckDirComment \"$CFDEM_PROJECT_DIR\" '$CFDEM_PROJECT_DIR' \"yes\"\ncheckDirComment \"$CFDEM_PROJECT_USER_DIR\" '$CFDEM_PROJECT_USER_DIR' \"no\"\ncheckDirComment \"$CFDEM_SRC_DIR\" '$CFDEM_SRC_DIR' \"yes\"\ncheckDirComment \"$CFDEM_SOLVER_DIR\" '$CFDEM_SOLVER_DIR' \"yes\"\ncheckDirComment \"$CFDEM_TUT_DIR\" '$CFDEM_TUT_DIR' \"yes\"\ncheckDirComment \"$CFDEM_LIGGGHTS_SRC_DIR\" '$CFDEM_LIGGGHTS_SRC_DIR' \"yes\"\ncheckDirComment \"$CFDEM_LIGGGHTS_LIB_PATH\" '$CFDEM_LIGGGHTS_LIB_PATH' \"yes\"\ncheckDirComment \"$CFDEM_ADD_LIBS_DIR\" '$CFDEM_ADD_LIBS_DIR' \"yes\"\ncheckDirComment \"$CFDEM_LIB_DIR\" '$CFDEM_LIB_DIR' \"yes\"\ncheckDirComment \"$CFDEM_APP_DIR\" '$CFDEM_APP_DIR' \"yes\"\ncheckDirComment \"$CFDEM_USER_LIB_DIR\" '$CFDEM_USER_LIB_DIR' \"no\"\ncheckDirComment \"$CFDEM_USER_APP_DIR\" '$CFDEM_USER_APP_DIR' \"no\"\ncheckDirComment \"$CFDEM_TEST_HARNESS_PATH\" '$CFDEM_TEST_HARNESS_PATH' \"no\"\ncheckDirComment \"$C3PO_SRC_DIR\" '$C3PO_SRC_DIR' \"no\"\ncheckDirComment \"$CFDEM_LPP_DIR\" '$CFDEM_LPP_DIR' \"no\"\necho \"\"\n\necho \"library names\"\necho '$CFDEM_LIGGGHTS_LIB_NAME = '\"$CFDEM_LIGGGHTS_LIB_NAME\"\necho '$CFDEM_LIB_NAME = '\"$CFDEM_LIB_NAME\"\necho '$LD_LIBRARY_PATH  = '\"$LD_LIBRARY_PATH\"\necho '$WM_NCOMPPROCS  = '\"$WM_NCOMPPROCS\"\necho '$WM_LABEL_SIZE = '\"$WM_LABEL_SIZE\"\nif [ $WM_LABEL_SIZE != 32 ]; then\n    echo \"!!!! Warning: WM_LABEL_SIZE must be 32!!!!! (Please correct in $FOAM_ETC/bashrc.)\"\nfi\necho \"\"\necho \"Additional lib settings\"\necho 'CFDEM_ADD_LIBS_DIR/CFDEM_ADD_LIBS_NAME = '\"${CFDEM_ADD_LIBS_DIR}/${CFDEM_ADD_LIBS_NAME}\"\ncat <<EOT > .Makefile_vtk_tmp\ninclude $CFDEM_ADD_LIBS_DIR/$CFDEM_ADD_LIBS_NAME\n\n.PHONY: all\n\nall:\n\t@echo \"CFDEM_ADD_LIB_PATHS = \\$(CFDEM_ADD_LIB_PATHS)\"\n\t@echo \"CFDEM_ADD_LIBS = \\$(CFDEM_ADD_LIBS)\"\nEOT\nmake -f .Makefile_vtk_tmp\nrm -f .Makefile_vtk_tmp\necho\n\necho \"LIGGGHTS library link (created during compilation of CFDEM)\"\nls -al ${CFDEM_LIB_DIR}/liblmp*\n\necho \"*******************\"\n\n\nif [ $checkGPP == \"true\" ]\n  then\n    echo \"g++:\"\n    which g++\n    g++ --version\n\n    echo \"gcc:\"\n    which gcc\n    gcc --version\n\n    echo \"mpic++:\"\n    which mpic++\n    mpic++ --version\n\n    echo \"mpirun:\"\n    which mpirun\n    mpirun --version\nfi\n\necho \"**********************\"\necho \"additional packages...\"\n\nif [ $checkAddOn == \"true\" ]\n  then\n    packageName=c3po\n    filePath=$CFDEM_SRC_DIR/$packageName\n    if [ $(checkDir $filePath) == \"true\" ]; then\n        source $filePath/etc/$packageName\"SystemTest.sh\"\n    else\n        echo \"$packageName does not exist.\" \n    fi\n\n    packageName=parScale\n    filePath=$PASCAL_SRC_DIR/..\n    if [ $(checkDir $filePath) == \"true\" ]; then\n        source $filePath/etc/$packageName\"SystemTest.sh\"\n    else\n        echo \"$packageName does not exist.\" \n    fi\nfi\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/cleanCFDEMcoupling.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# clean routine for CFDEMcoupling, part of CFDEMproject \n# Christoph Goniva - Sept. 2013, DCS Computing GmbH\n#===================================================================#\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#================================================================================#\n# clean src remove object files\n#================================================================================#\ncleanCFDEM\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for CFDEMcoupling, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#===================================================================#\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# compile src\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh\n\n#================================================================================#\n# compile solvers\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_sol.sh\n\n#================================================================================#\n# compile utilities\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_all.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for CFDEMcoupling + LIGGGHTS, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#                    update March 2014\n#===================================================================#\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# compile LIGGGHTS src + libraries\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS.sh\n\n#================================================================================#\n# compile CFDEMcoupling\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_sol.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for CFDEMcoupling solvers, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#===================================================================#\n\nwhitelist=\"solver-list.txt\"\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nlogDir=\"log\"\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#- remove old success/fail logs\nrm $logDir/log_compile_results_sol_success\nrm $logDir/log_compile_results_sol_fail\n\nCWD=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\n\necho \"\"\necho \"This routine will compile the solvers specified in solver-list.txt\"\necho \"\"\n#echo \"Are the variables CFDEM_SOLVER_DIR=$CFDEM_SOLVER_DIR\"\n#echo \"and CFDEM_SRC_DIR=$CFDEM_SRC_DIR/lagrangian/cfdemParticle correct? (y/n)\"\n#read YN\n#if [ \"$YN\" != \"y\" ];then\n#  \techo \"Aborted by user.\"\n#  \texit 1\n#fi\n\necho \"\"\necho \"Please provide the solvers to be compiled in the $CWD/$whitelist file.\"\necho \"structure:\"\necho \"path  to provide the path relative to CFDEM_SOLVER_DIR\"\necho \"\"\necho \"example:\"\necho \"cfdemSolverPiso/dir\"\necho \"\"\n\n#- create a tmp file and delete comments in it - work with tmp file then.\ncp $whitelist \"tmpFile.txt\"\nsed -i '/^#/d' \"tmpFile.txt\"\nsed -i '/^$/d' \"tmpFile.txt\"\nwhitelist=\"tmpFile.txt\"\n\nif [ ! -f \"$CWD/$whitelist\" ];then\n    echo \"$whitelist does not exist in $CWD\"\nelse\n    njobs=`wc -l < $CWD/$whitelist` \n    echo \"\"\n    echo \"running compilation in pseudo-parallel mode of $njobs solvers\"\n\n    #--------------------------------------------------------------------------------#\n    logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n\n    ##number of solvers compiled at a time\n\n    if [[ $WM_NCOMPPROCS == \"\" ]] || [ $WM_NCOMPPROCS -eq 1 ]; then\n        nsteps=1\n        let nchunk=$njobs+1 # +1, to wait for the last compilation too\n        echo \"do compilation in serial\"\n    else    \n        nsteps=$WM_NCOMPPROCS\n        let nchunk=$njobs/$nsteps+1\n        echo \"do compilation on $nsteps procs in $nchunk chunks\" \n        let nchunk++ # +1, to wait for the last compilation too     \n    fi\n\n    counter=0\n    for i in `seq $nchunk`\n    do\n\n        #wait until prev. compilation is finished\n        echo \"waiting...\"\n        #until [ `ps -a | grep make | wc -l` -eq 0 ]; \n        until [ `ls -a | grep $logpath/*.tempXYZ | wc -l` -eq 0 ];\n        do \n            sleep 2\n        done\n\n        for j in `seq $nsteps`\n        do\n            let solNr=($i-1)*$nsteps+$j\n            LINE=`head -n $solNr $CWD/$whitelist | tail -1`\n\n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n            # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n            #echo \"change path\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_SOLVER_DIR/$LINE\"\n                #cd $path\n                let solNr++\n            fi\n\n            if [[ \"$counter\" -lt \"$njobs\" ]]; then\n                #--------------------------------------------------------------------------------#\n                #- define variables\n                #logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n                if [[ ${LINE:0:6} = \"Course\" ]] \n                then\n                    LINE=$(basename $LINE)\n                    logfileName=\"log_compileCFDEMcoupling\"\"_$LINE\" \n                    casePath=\"$CFDEM_SOLVER_DIR/Course/$LINE\"\n                else\n                    logfileName=\"log_compileCFDEMcoupling\"\"_$LINE\" \n                    casePath=\"$CFDEM_SOLVER_DIR/$LINE\"\n                fi\n                headerText=\"$logfileName\"\"_$LINE\"\"-$NOW\"\n                parallel=\"true\"\n                #--------------------------------------------------------------------------------#\n\n                echo \"compiling $LINE\"\n                compileSolver $logpath $logfileName $casePath $headerText $parallel\n                let counter++\n            fi\n        done\n\n        #sleep 1 # wait a second until compilation starts\n    done\n\n    echo \"compilation done.\"\nfi\n\n#--------------------------------------------------------------------------------#\n# loop all solvers and collect the logs\n#--------------------------------------------------------------------------------#\n\n#wait until prev. compilation is finished\necho \"waiting...\"\n#until [ `ps -a | grep make | wc -l` -eq 0 ]; \nuntil [ `ls -a | grep $logpath/*.tempXYZ | wc -l` -eq 0 ];\ndo \n    sleep 2\ndone\n\nif [ ! -f \"$CWD/$whitelist\" ];then\n    echo \"$whitelist does not exist in $CWD\"\nelse\n    NLINES=`wc -l < $CWD/$whitelist`\n    COUNT=0\n\n    for masterLogFile in \"$masterLogName\"\n    do\n\n        while [ $COUNT -lt $NLINES ]\n        do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_SOLVER_DIR/$LINE\"\n                #continue\n            fi\n\n            #- execute tutorial\n            echo \"collecting log of $path\"\n\n            #--------------------------------------------------------------------------------#\n            #- define variables\n            #logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n            if [[ ${LINE:0:6} = \"Course\" ]] \n            then\n                LINE=$(basename $LINE)\n                logfileName=\"log_compileCFDEMcoupling\"\"_$LINE\" \n                casePath=\"$CFDEM_SOLVER_DIR/Course/$LINE\"\n            else\n                logfileName=\"log_compileCFDEMcoupling\"\"_$LINE\" \n                casePath=\"$CFDEM_SOLVER_DIR/$LINE\"\n            fi\n            #--------------------------------------------------------------------------------#            \n            collectLogCFDEMcoupling_sol $logpath $logfileName $casePath\n        done\n    done\nfi\nrm \"$CWD/tmpFile.txt\"\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for CFDEMcoupling source, part of CFDEMproject \n# will create all lnInclude directories before compilation in order\n# to avoid missing headers in foreign libraries\n# Christoph Goniva - May. 2012, DCS Computing GmbH\n# update: Stefan Radl (TU Graz, April 2016)\n#===================================================================#\n \n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\nrm $logDir/log_compile_results_src_success\nrm $logDir/log_compile_results_src_fail\n\n##================================================================================#\n## Must compile (but not clean) LIGGGHTS libraries, since it could have been \n## compiled before with the compileLIGGGHTS command\n## Then, check successful compilation\n##================================================================================#\n#bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh noClean\n#echo \"...now checking if LIGGGHTS libraries are compiled that are needed for CFDEM's src packages.\"\n#bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh false\n\n#================================================================================#\n# compile src\n#================================================================================#\nwhitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/library-list.txt\"\necho \"\"\necho \"Please provide the libraries to be compiled in the $whitelist file.\"\n\nif [ ! -f \"$whitelist\" ];then\n    echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n    NLINES=0\n    COUNT=0\nelse\n    NLINES=`wc -l < $whitelist`\n    COUNT=0\nfi\n\n#Generate lnIncludes, only for paths\nwhile [ $COUNT -lt $NLINES ]\ndo\n        let COUNT++  \n        LINE=$( head -n $COUNT $whitelist | tail -1 )\n        LINE=$( eval echo $LINE )\n\n        # white lines\n        if [[ \"$LINE\" == \"\" ]]; then\n            echo \"compile $LINE\"\n            continue\n        # comments\n        elif [[ \"$LINE\" == \\#* ]]; then\n            continue\n         # paths\n        elif [[ \"$LINE\" == */dir ]]; then\n            echo \"will change path and create lnInclude...\"\n            LINE=$(echo \"${LINE%????}\")\n            path=\"$CFDEM_SRC_DIR/$LINE\"\n            cd $path\n            #continue\n        fi\n        wmakeLnInclude .\ndone\nCOUNT=0\n\necho\necho\necho \"\\n Creation of lnInclude directories finished!\"\necho\necho\n\nwhile [ $COUNT -lt $NLINES ]\ndo\n        let COUNT++  \n        LINE=$( head -n $COUNT $whitelist | tail -1 )\n        LINE=$( eval echo $LINE )\n\n        # white lines\n        if [[ \"$LINE\" == \"\" ]]; then\n            echo \"compile $LINE\"\n            continue\n        # comments\n        elif [[ \"$LINE\" == \\#* ]]; then\n            continue\n         # paths\n        elif [[ \"$LINE\" == */dir ]]; then\n            echo \"will change path...\"\n            LINE=$(echo \"${LINE%????}\")\n            path=\"$CFDEM_SRC_DIR/$LINE\"\n            cd $path\n            #continue\n        fi\n        #--------------------------------------------------------------------------------#\n        #- define variables\n        logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n        logfileName=\"log_compileCFDEMcoupling_\"$(basename $LINE)\"\"\n        casePath=\"$path\"\n        headerText=\"$logfileName\"\"-$NOW\"\n        #--------------------------------------------------------------------------------#\n        # remove old log file\n        rm \"$logpath/$logfileName\"*\n        compileLib $logpath $logfileName $casePath $headerText\n\n        if [ ${PIPESTATUS[0]} -ne 0 ]; then         \n            exit 1\n        fi\n\n        collectLogCFDEMcoupling_src $logpath $logfileName $casePath\n        \n\ndone\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for CFDEMcoupling utilities, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#===================================================================#\n\nwhitelist=\"utilities-list.txt\"\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nlogDir=\"log\"\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\nCWD=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\n\necho \"\"\necho \"This routine will compile the utilities specified in utilities-list.txt\"\necho \"\"\n#echo \"Are the variables CFDEM_UT_DIR=$CFDEM_UT_DIR\"\n#echo \"and CFDEM_SRC_DIR=$CFDEM_SRC_DIR/lagrangian/cfdemParticle correct? (y/n)\"\n#read YN\n#if [ \"$YN\" != \"y\" ];then\n#  \techo \"Aborted by user.\"\n#  \texit 1\n#fi\n\necho \"\"\necho \"Please provide the utilities to be compiled in the $CWD/$whitelist file.\"\necho \"structure:\"\necho \"path  to provide the path relative to CFDEM_UT_DIR\"\necho \"\"\necho \"example:\"\necho \"cfdemPostproc/dir\"\necho \"\"\n\n#- create a tmp file and delete comments in it - work with tmp file then.\ncp $whitelist \"tmpFile.txt\"\nsed -i '/^#/d' \"tmpFile.txt\"\nsed -i '/^$/d' \"tmpFile.txt\"\nwhitelist=\"tmpFile.txt\"\n\nif [ ! -f \"$CWD/$whitelist\" ];then\n    echo \"$whitelist does not exist in $CWD\"\nelse\n    njobs=`wc -l < $CWD/$whitelist` \n    echo \"\"\n    echo \"running compilation in pseudo-parallel mode of $njobs utilities\"\n\n    #--------------------------------------------------------------------------------#\n    logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n\n    ##number of utilities compiled at a time\n\n    if [[ $WM_NCOMPPROCS == \"\" ]] || [ $WM_NCOMPPROCS -eq 1 ]; then\n        nsteps=1\n        let nchunk=$njobs+1 # +1, to wait for the last compilation too\n        echo \"do compilation in serial\"\n    else    \n        nsteps=$WM_NCOMPPROCS\n        let nchunk=$njobs/$nsteps+1\n        echo \"do compilation on $nsteps procs in $nchunk chunks\" \n        let nchunk++ # +1, to wait for the last compilation too     \n    fi\n\n    counter=0\n    for i in `seq $nchunk`\n    do\n\n        #wait until prev. compilation is finished\n        echo \"waiting...\"\n        #until [ `ps -a | grep make | wc -l` -eq 0 ]; \n        until [ `ls -a | grep $logpath/*.tempXYZ | wc -l` -eq 0 ];\n        do \n            sleep 2\n        done\n\n        for j in `seq $nsteps`\n        do\n            let solNr=($i-1)*$nsteps+$j\n            LINE=`head -n $solNr $CWD/$whitelist | tail -1`\n\n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n            # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n            #echo \"change path\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_UT_DIR/$LINE\"\n                #cd $path\n                let solNr++\n            fi\n\n            if [[ \"$counter\" -lt \"$njobs\" ]]; then\n                #--------------------------------------------------------------------------------#\n                #- define variables\n                #logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n                logfileName=\"log_compileCFDEMcoupling\"\"_$LINE\" \n                casePath=\"$CFDEM_UT_DIR/$LINE\"\n                headerText=\"$logfileName\"\"_$LINE\"\"-$NOW\"\n                parallel=\"true\"\n                #--------------------------------------------------------------------------------#\n\n                echo \"compiling $LINE\"\n                compileSolver $logpath $logfileName $casePath $headerText $parallel\n                let counter++\n            fi\n        done\n\n        #sleep 1 # wait a second until compilation starts\n    done\n\n    echo \"compilation done.\"\nfi\n\n\n#wait until prev. compilation is finished\necho \"waiting...\"\n#until [ `ps -a | grep make | wc -l` -eq 0 ]; \nuntil [ `ls -a | grep $logpath/*.tempXYZ | wc -l` -eq 0 ];\ndo \n    sleep 2\ndone\n\nrm \"$CWD/tmpFile.txt\"\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileLIGGGHTS.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for LIGGGHTS, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#===================================================================\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# copy LIGGGHTS patch files if available\n#================================================================================#\necho \"copying patch files for LIGGGHTS if available\"\ncp $CFDEM_SRC_DIR/LIGGGHTSpatch/* $CFDEM_LIGGGHTS_SRC_DIR\n\n#--------------------------------------------------------------------------------#\n#- define variables\nlogpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\nlogfileName=\"log_compileLIGGGHTS\" #alternative: logfileName=\"log_compileLIGGGHTS_$NOW\"\nheaderText=\"$logfileName\"\"-$NOW\"\n#--------------------------------------------------------------------------------#\n\n#================================================================================#\n# compile LIGGGHTS dataExchange libraries (forces clean, and then compile)\n#================================================================================#\n. $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_dataExchLib.sh\n\nif [ ${PIPESTATUS[0]} -ne 0 ]; then\n    exit 1\nfi\n\n#================================================================================#\n# compile LIGGGHTS libraries (forces clean, and then compile)\n#================================================================================#\nbash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh \n\nif [ ${PIPESTATUS[0]} -ne 0 ]; then\n    exit 1\nfi\n\n#================================================================================#\n# compile LIGGGHTS src\n#================================================================================#\n\ncompileLIGGGHTS $logpath $logfileName $headerText\n\nif [ ${PIPESTATUS[0]} -ne 0 ]; then         \n    exit 1\nfi\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileLIGGGHTS_dataExchLib.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for LIGGGHTS dataExchangeModel libraries, part of CFDEMproject \n# Christoph Goniva - March. 2014, DCS Computing GmbH\n#===================================================================#\n \n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# compile src\n#================================================================================#\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/library-liggghts-list.txt\"\n    echo \"\"\n    echo \"===========================================\"\n    echo \"Compiling sub-libraries of LIGGGHTS now...\"\n    echo \"Please provide the libraries to be compiled in the $CWD/$whitelist file.\"\n    echo \"Libraries must be in: $CFDEM_LAMMPS_LIB_DIR, or a path defined by the Line in the above file.\"\n\n    if [ ! -f \"$CWD/$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $CWD/$whitelist`\n        COUNT=0\n    fi\n\n    logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                echo \"compile $LINE\"\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"will change path...\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_LAMMPS_LIB_DIR\"\n                cd $path\n                echo $PWD\n                #continue\n            fi\n\n            #--------------------------------------------------------------------------------#\n            #- define variables\n            #logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n            logfileName=\"log_compile$LINE\"\"lib\"\n            headerText=\"$logfileName\"\"-$NOW\"\n            libVarMakefileName=\"CFDEM_$LINE\"\"LIB_MAKEFILENAME\"\n            makeFileName=\"Makefile.${!libVarMakefileName}\"\n            libVarName=\"CFDEM_$LINE\"\"LIB_PATH\"\n            libraryPath=\"${!libVarName}\"\n            compilationModeSwitch=\"$1\"\n            #--------------------------------------------------------------------------------#\n            compileLMPlib $logpath $logfileName $headerText $makeFileName $libraryPath $compilationModeSwitch\n\n            if [ ${PIPESTATUS[0]} -ne 0 ]; then         \n                exit 1\n            fi\n\n    done\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for LIGGGHTS libraries, part of CFDEMproject \n# Christoph Goniva - March. 2014, DCS Computing GmbH\n#===================================================================#\n \n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# compile src\n#================================================================================#\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/package-undo-liggghts-list.txt\"\n    echo \"\"\n    echo \"===========================================\"\n    echo \"deactivating all possible packages of LIGGGHTS now...\"\n    echo \"Please provide the packages to be compiled in the $CWD/$whitelist file.\"\n    echo \"Packages must be in: $CFDEM_LAMMPS_LIB_DIR.\"\n\n    if [ ! -f \"$CWD/$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $CWD/$whitelist`\n        COUNT=0\n    fi\n\n    logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n\n    # resetting Makefile.package\n    cp $CFDEM_LIGGGHTS_SRC_DIR/Makefile.package.empty $CFDEM_LIGGGHTS_SRC_DIR/Makefile.package\n    cp $CFDEM_LIGGGHTS_SRC_DIR/Makefile.package.settings.empty $CFDEM_LIGGGHTS_SRC_DIR/Makefile.package.settings\n\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                echo \"compile $LINE\"\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"will change path...\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_LIGGGHTS_SRC_DIR\"\n                cd $path\n                echo $PWD\n                #continue\n            fi\n\n            #--------------------------------------------------------------------------------#\n            #- define variables\n            logfileName=\"log_compile$LINE\"\"lib\"\n            #--------------------------------------------------------------------------------#\n            rm $logfileName 2>&1 | tee -a $logpath/$logfileName\n\n            make no-$LINE 2>&1 | tee -a $logpath/$logfileName\n    done\n\n    #===================================================================================\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/package-liggghts-list.txt\"\n    echo \"\"\n    echo \"===========================================\"\n    echo \"activating packages of LIGGGHTS now...\"\n    echo \"Please provide the packages to be compiled in the $CWD/$whitelist file.\"\n    echo \"Packages must be in: $CFDEM_LAMMPS_LIB_DIR.\"\n\n    if [ ! -f \"$CWD/$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $CWD/$whitelist`\n        COUNT=0\n    fi\n\n    logpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\n\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                echo \"compile $LINE\"\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"will change path...\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_LIGGGHTS_SRC_DIR\"\n                cd $path\n                echo $PWD\n                #continue\n            fi\n\n            #--------------------------------------------------------------------------------#\n            #- define variables\n            logfileName=\"log_compile$LINE\"\"lib\"\n            #--------------------------------------------------------------------------------#\n\n            rm $logpath/$logfileName\n            make yes-$LINE 2>&1 | tee -a $logpath/$logfileName\n\n            # assuming we need the poems lib if the package POEMS is activated\n            if [[ \"$LINE\" == \"POEMS\" ]]; then\n                echo \"compile $LINE\"\n                cd $CFDEM_POEMSLIB_PATH\n                make -f Makefile.g++ clean 2>&1 | tee -a $logpath/$logfileName\n                #make -j $nProc -f Makefile.g++ lib 2>&1 | tee -a $logpath/$logfileName # I do not see where nProc would be defined here, so let us compile in serial here\n                make -f Makefile.g++ lib 2>&1 | tee -a $logpath/$logfileName\n                cd $path\n            fi\n\n            # special handling of PARSCALE\n            if [[ \"$LINE\" == \"PASCAL\" ]]; then\n                echo \"compile $LINE\"\n                #. $PASCAL_SRC_DIR/refresh 2>&1 | tee -a $logpath/$logfileName\n                . $PASCAL_SRC_DIR/refreshLibrary.sh 2>&1 | tee -a $logpath/$logfileName\n            fi\n    done\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/compileLIGGGHTS_noClean.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# compile routine for LIGGGHTS, part of CFDEMproject \n# Christoph Goniva - May. 2012, DCS Computing GmbH\n#===================================================================\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#================================================================================#\n# copy LIGGGHTS patch files if available\n#================================================================================#\necho \"copying patch files for LIGGGHTS if available\"\ncp $CFDEM_SRC_DIR/LIGGGHTSpatch/* $CFDEM_LIGGGHTS_SRC_DIR\n\n#--------------------------------------------------------------------------------#\n#- define variables\nlogpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\nlogfileName=\"log_compileLIGGGHTS\" #alternative: logfileName=\"log_compileLIGGGHTS_$NOW\"\nheaderText=\"$logfileName\"\"-$NOW\"\n#--------------------------------------------------------------------------------#\n\n#================================================================================#\n# compile LIGGGHTS libraries\n#================================================================================#\n#bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh\n\n#================================================================================#\n# compile LIGGGHTS src\n#================================================================================#\n\ncompileLIGGGHTS $logpath $logfileName $headerText \"false\"\n\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/controlDict_cgs_2.1.x",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.0.0                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      controlDict;\n}\n\n// NB: the #functions do not work here\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nDocumentation\n{\n    docBrowser      \"firefox %f\";\n    doxyDocDirs\n    (\n        \"$WM_PROJECT_USER_DIR/html\"\n        \"~OpenFOAM/html\"\n        \"$WM_PROJECT_DIR/doc/Doxygen/html\"\n    );\n    doxySourceFileExts\n    (\n        \"App_8C.html\"\n        \"_8C.html\"\n    );\n}\n\n\nInfoSwitches\n{\n    writePrecision  6;\n    writeJobInfo    0;\n    writeDictionaries 0;\n\n    // Allow case-supplied C++ code (#codeStream, codedFixedValue)\n    allowSystemOperations   0;\n}\n\n\nOptimisationSwitches\n{\n    fileModificationSkew 10;\n\n    //- Modification checking:\n    //  - timeStamp         : use modification time on file\n    //  - inotify           : use inotify framework\n    //  - timeStampMaster   : do time stamp (and file reading) only on master.\n    //  - inotifyMaster     : do inotify (and file reading) only on master.\n    fileModificationChecking timeStampMaster;//inotify;timeStamp;inotifyMaster;\n\n    commsType       nonBlocking; //scheduled; //blocking;\n    floatTransfer   0;\n    nProcsSimpleSum 0;\n\n    // Force dumping (at next timestep) upon signal (-1 to disable)\n    writeNowSignal              -1; //10;\n    // Force dumping (at next timestep) upon signal (-1 to disable) and exit\n    stopAtWriteNowSignal        -1;\n}\n\n\nDebugSwitches\n{\n    Analytical          0;\n    APIdiffCoefFunc     0;\n    Ar                  0;\n    BICCG               0;\n    BirdCarreau         0;\n    C10H22              0;\n    C12H26              0;\n    C13H28              0;\n    C14H30              0;\n    C16H34              0;\n    C2H5OH              0;\n    C2H6                0;\n    C2H6O               0;\n    C3H6O               0;\n    C3H8                0;\n    C4H10O              0;\n    C6H14               0;\n    C6H6                0;\n    C7H16               0;\n    C7H8                0;\n    C8H10               0;\n    C8H18               0;\n    C9H20               0;\n    CH3OH               0;\n    CH4N2O              0;\n    CarnahanStarling    0;\n    CallbackRegistry    0;\n    CentredFitData<biLinearFitPolynomial>           0;\n    CentredFitData<linearFitPolynomial>             0;\n    CentredFitData<quadraticFitPolynomial>          0;\n    CentredFitData<quadraticLinearFitPolynomial>    0;\n    ChomiakInjector     0;\n    Cloud<basicKinematicParcel> 0;\n    Cloud<basicReactingParcel>  0;\n    Cloud<basicThermoParcel>    0;\n    Cloud<indexedParticle>  0;\n    Cloud<parcel>           0;\n    Cloud<passiveParticle>  0;\n    Cloud<trackedParticle>  0;\n    CoEuler             0;\n    CompositionModel    0;\n    ConeInjection       0;\n    Constant            0;\n    ConstantRateDevolatilisation    0;\n    CrankNicholson      0;\n    CrossPowerLaw       0;\n    Cs                  0;\n    DIC                 0;\n    DICGaussSeidel      0;\n    DILU                0;\n    DILUGaussSeidel     0;\n    DataEntry           0;\n    DeardorffDiffStress 0;\n    DispersionModel     0;\n    DispersionRASModel  0;\n    DragModel           0;\n    ETAB                0;\n    Ergun               0;\n    Euler               0;\n    EulerImplicit       0;\n    EulerRotation       0;\n    extendedCellToFaceStencil 0;\n    FDIC                0;\n    FaceCellWave        0;\n    GAMG                0;\n    GAMGAgglomeration   0;\n    GAMGInterface       0;\n    GAMGInterfaceField  0;\n    Gamma               0;\n    Gamma01             0;\n    GammaV              0;\n    Gauss               0;\n    GaussSeidel         0;\n    Gibilaro            0;\n    Gidaspow            0;\n    GidaspowErgunWenYu  0;\n    GidaspowSchillerNaumann 0;\n    GradientDispersionRAS   0;\n    Gulders             0;\n    GuldersEGR          0;\n    H2O                 0;\n    HashTable           0;\n    HeatTransferModel   0;\n    HerschelBulkley     0;\n    HrenyaSinclair      0;\n    IC8H18              0;\n    ICCG                0;\n    IDDESDelta          0;\n    IDEA                0;\n    IFstream            0;\n    IOMap<dictionary>   0;\n    IOPtrList<MRFZone>  0;\n    IOPtrList<coordinateSystem> 0;\n    IOPtrList<injector> 0;\n    IOPtrList<porousZone>   0;\n    IOobject            0;\n    InjectionModel      0;\n    IntegrationScheme   0;\n    JohnsonJackson      0;\n    KRR4                0;\n    KinematicCloud<basicKinematicParcel> 0;\n    KinematicCloud<basicReactingParcel> 0;\n    KinematicCloud<basicThermoParcel>   0;\n    KinematicParcel<basicReactingParcel> 0;\n    KinematicParcel<basicThermoParcel>  0;\n    LESModel            0;\n    LESdelta            0;\n    LESfilter           0;\n    LISA                0;\n    LRR                 0;\n    LRRDiffStress       0;\n    LamBremhorstKE      0;\n    LaunderGibsonRSTM   0;\n    LaunderSharmaKE     0;\n    LienCubicKE         0;\n    LienCubicKELowRe    0;\n    LienLeschzinerLowRe 0;\n    MB                  0;\n    MC                  0;\n    MCV                 0;\n    MUSCL               0;\n    MUSCL01             0;\n    MUSCLV              0;\n    ManualInjection     0;\n    MarshakRadiation    0;\n    MarshakRadiationFixedT  0;\n    MassTransferModel   0;\n    MeshWave            0;\n    Minmod              0;\n    MinmodV             0;\n    N2                  0;\n    NSRDSfunc0          0;\n    NSRDSfunc1          0;\n    NSRDSfunc14         0;\n    NSRDSfunc2          0;\n    NSRDSfunc3          0;\n    NSRDSfunc4          0;\n    NSRDSfunc5          0;\n    NSRDSfunc6          0;\n    NSRDSfunc7          0;\n    Newtonian           0;\n    NoDispersion        0;\n    NoDrag              0;\n    NoHeatTransfer      0;\n    NoInjection         0;\n    NoMassTransfer      0;\n    NoSurfaceReaction   0;\n    NonlinearKEShih     0;\n    ODE                 0;\n    ODESolver           0;\n    OFstream            0;\n    ORourke             0;\n    OSPRE               0;\n    OSPREV              0;\n    P1                  0;\n    PBiCG               0;\n    PCG                 0;\n    PackedList          0;\n    ParSortableList     0;\n    PatchToPatchInterpolation 0;\n    Phi                 0;\n    PointEdgeWave       0;\n    POSIX               0;\n    Prandtl             0;\n    PrimitivePatch      0;\n    Pstream             0;\n    QUICK               0;\n    QUICKV              0;\n    QZeta               0;\n    RASModel            0;\n    RK                  0;\n    RNGkEpsilon         0;\n    RanzMarshall        0;\n    ReactingCloud<basicReactingParcel>  0;\n    ReactingParcel<basicReactingParcel> 0;\n    Rebound             0;\n    ReitzDiwakar        0;\n    ReitzKHRT           0;\n    RosinRammler        0;\n    RutlandFlashBoil    0;\n    SDA                 0;\n    SFCD                0;\n    SFCDV               0;\n    SHF                 0;\n    SIBS                0;\n    SKA                 0;\n    SLTS                0;\n    SRFModel            0;\n    SRFVelocity         0;\n    STARCDRotation      0;\n    Schaeffer           0;\n    SchillerNaumann     0;\n    SinclairJackson     0;\n    SingleKineticRateDevolatilisation 0;\n    SingleMixtureFraction   0;\n    Smagorinsky         0;\n    SpalartAllmaras     0;\n    SpalartAllmarasDDES 0;\n    SpalartAllmarasIDDES    0;\n    SphereDrag          0;\n    StandardWallInteraction 0;\n    StaticHashTable     0;\n    StochasticDispersionRAS 0;\n    SuperBee            0;\n    SuperBeeV           0;\n    SurfaceReactionModel 0;\n    Syamlal             0;\n    SyamlalOBrien       0;\n    SyamlalRogersOBrien 0;\n    TAB                 0;\n    Table               0;\n    ThermoCloud<basicReactingParcel>    0;\n    ThermoCloud<basicThermoParcel>      0;\n    ThermoParcel<basicReactingParcel>   0;\n    ThermoParcel<basicThermoParcel>     0;\n    UMIST               0;\n    UMISTV              0;\n    UpwindFitData<cubicUpwindFitPolynomial> 0;\n    UpwindFitData<quadraticLinearUpwindFitPolynomial> 0;\n    UpwindFitData<quadraticUpwindFitPolynomial>     0;\n    WallInteractionModel 0;\n    WenYu               0;\n    aC11H10             0;\n    absorptionEmissionModel 0;\n    addCell             0;\n    addFace             0;\n    addPatchCellLayer   0;\n    addPoint            0;\n    advective           0;\n    algebraicPair       0;\n    alphaContactAngle   0;\n    alphaFixedPressure  0;\n    alphatWallFunction  0;\n    angularOscillatingDisplacement  0;\n    angularOscillatingVelocity  0;\n    anisotropic         0;\n    ash                 0;\n    atomizationModel    0;\n    attachDetach        0;\n    autoDensity         0;\n    autoHexMeshDriver   0;\n    autoLayerDriver     0;\n    autoRefineDriver    0;\n    autoSnapDriver      0;\n    bC11H10             0;\n    backgroundMeshDecomposition 0;\n    backward            0;\n    basePatch           0;\n    basicKinematicCloud 0;\n    basicKinematicParcel 0;\n    basicMixture        0;\n    basicReactingCloud  0;\n    basicReactingParcel 0;\n    basicThermo         0;\n    basicThermoCloud    0;\n    basicThermoParcel   0;\n    biLinearFit         0;\n    binaryAbsorptionEmission 0;\n    blended             0;\n    blobsSheetAtomization   0;\n    blobsSwirlInjector  0;\n    booleanSurface      0;\n    boundaryCutter      0;\n    boundaryMesh        0;\n    boundaryToFace      0;\n    boundedBackward     0;\n    boxToCell           0;\n    boxToFace           0;\n    boxToPoint          0;\n    breakupModel        0;\n    calculated          0;\n    cell                0;\n    cellClassification  0;\n    cellCuts            0;\n    cellDistFuncs       0;\n    cellLimited         0;\n    cellList            0;\n    cellLooper          0;\n    cellMDLimited       0;\n    cellMotion          0;\n    cellPoint           0;\n    cellPointFace       0;\n    cellPointWeight     0;\n    cellSet             0;\n    cellSizeControlSurfaces 0;\n    cellToCell          0;\n    cellToFace          0;\n    cellToPoint         0;\n    cellZone            0;\n    centredCECStencil   0;\n    centredCFCStencil   0;\n    chemistryReader     0;\n    chemistrySolver     0;\n    chemkinReader       0;\n    clippedLinear       0;\n    cloud               0;\n    cloudAbsorptionEmission 0;\n    cloudScatter        0;\n    collisionModel      0;\n    combineFaces        0;\n    commSchedule        0;\n    commonRailInjector  0;\n    compound            0;\n    constInjector       0;\n    constant            0;\n    constantAbsorptionEmission  0;\n    constantAlphaContactAngle   0;\n    constantScatter     0;\n    coordinateRotation  0;\n    coordinateSystem    0;\n    coordinateSystems   0;\n    corrected           0;\n    coupled             0;\n    cubeRootVol         0;\n    cubic               0;\n    cubicUpwindFit      0;\n    curve               0;\n    cyclic              0;\n    cyclicLduInterface  0;\n    cyclicLduInterfaceField 0;\n    cylinderToCell      0;\n    cylindrical         0;\n    decompositionMethod 0;\n    definedHollowConeInjector 0;\n    definedInjector     0;\n    definedPressureSwirlInjector 0;\n    diagTensorField     0;\n    diagonal            0;\n    dictionary          0;\n    dimensionSet        1;\n    mappedBase    0;\n    mappedPatch   0;\n    mappedVelocityFlux 0;\n    directionMixed      0;\n    directional         0;\n    disallowGenericFvPatchField 0;\n    disallowGenericPointPatchField 0;\n    disallowGenericPolyPatch    0;\n    dispersionLESModel  0;\n    dispersionModel     0;\n    dispersionRASModel  0;\n    displacementComponentLaplacian 0;\n    displacementInterpolation 0;\n    displacementLaplacian 0;\n    displacementSBRStress 0;\n    distanceSurface     0;\n    Distribution        0;\n    downwind            0;\n    dragModel           0;\n    duplicatePoints     0;\n    dx                  0;\n    dynMixedSmagorinsky 0;\n    dynOneEqEddy        0;\n    dynSmagorinsky      0;\n    dynamicAlphaContactAngle 0;\n    dynamicFvMesh       0;\n    dynamicInkJetFvMesh 0;\n    dynamicMotionSolverFvMesh 0;\n    dynamicRefineFvMesh 0;\n    edgeIntersections   0;\n    edgeList            0;\n    edgeSurface         0;\n    empty               0;\n    engineMesh          0;\n    enrichedPatch       0;\n    epsilonWallFunction 0;\n    errorDrivenRefinement   0;\n    evaporationModel    0;\n    exponential         0;\n    extendedLeastSquares    0;\n    extendedLeastSquaresVectors 0;\n    face                0;\n    faceAreaPair        0;\n    faceCoupleInfo      0;\n    faceLimited         0;\n    faceList            0;\n    faceMDLimited       0;\n    faceSet             0;\n    faceToCell          0;\n    faceToFace          0;\n    faceToPoint         0;\n    faceZone            0;\n    fan                 0;\n    featureEdgeMesh     0;\n    fieldToCell         0;\n    file                0;\n    fileName            2;\n    filteredLinear      0;\n    filteredLinear2     0;\n    filteredLinear2V    0;\n    filteredLinear3     0;\n    filteredLinear3V    0;\n    fixedEnthalpy       0;\n    buoyantPressure 0;\n    fixedFluxBoussinesqBuoyantPressure 0;\n    fixedFluxPressure   0;\n    fixedGradient       0;\n    fixedInternalEnergy 0;\n    fixedInternalValue  0;\n    fixedNormalSlip     0;\n    fixedPressureCompressibleDensity 0;\n    fixedUnburntEnthalpy 0;\n    fixedValue          0;\n    flowRateInletVelocity   0;\n    fluxCorrectedVelocity   0;\n    foamChemistryReader 0;\n    foamFile            0;\n    forceCoeffs         0;\n    forces              0;\n    fourth              0;\n    freestream          0;\n    freestreamPressure  0;\n    frictionalStressModel   0;\n    functionObject      0;\n    fv                  0;\n    fvMesh              0;\n    fvMeshDistribute    0;\n    fvMotionSolver      0;\n    fvPatchField        0;\n    fvScalarMatrix      0;\n    fvSchemes           0;\n    fvSphericalTensorMatrix 0;\n    fvSymmTensorMatrix  0;\n    fvTensorMatrix      0;\n    fvVectorMatrix      0;\n    fvsPatchField       0;\n    general             0;\n    generic             0;\n    genericPatch        0;\n    geomCellLooper      0;\n    geometricSurfacePatch   0;\n    global              0;\n    globalIndexAndTransform 0;\n    globalMeshData      0;\n    globalPoints        0;\n    gnuplot             0;\n    gradientDispersionRAS   0;\n    gradientEnthalpy        0;\n    gradientInternalEnergy  0;\n    gradientUnburntEnthalpy 0;\n    granularPressureModel   0;\n    hCombustionThermo   0;\n    hMixtureThermo<dieselMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<homogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<homogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<inhomogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<inhomogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<multiComponentMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<reactingMixture> 0;\n    hMixtureThermo<veryInhomogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<veryInhomogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<sutherlandTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    harmonic            0;\n    heatTransferModel   0;\n    hexCellLooper       0;\n    hexRef8             0;\n    hhuCombustionThermo 0;\n    hhuMixtureThermo<egrMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<egrMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<homogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<homogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<inhomogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<inhomogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<veryInhomogeneousMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<veryInhomogeneousMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>>> 0;\n    hierarchical        0;\n    hollowConeInjector  0;\n    iC3H8O              0;\n    indexedOctree       0;\n    indexedParticle     0;\n    injectorModel       0;\n    injectorType        0;\n    inletOutlet         0;\n    inletOutletTotalTemperature 0;\n    interfaceCompression 0;\n    intersectedSurface  0;\n    inverseDistance     0;\n    inverseFaceDistance 0;\n    inversePointDistance 0;\n    inverseVolume       0;\n    isoSurface          0;\n    isoSurfaceCell      0;\n    jplot               0;\n    jumpCyclic          0;\n    kEpsilon            0;\n    kOmega              0;\n    kOmegaSST           0;\n    kOmegaSSTSAS        0;\n    kqRWallFunction     0;\n    kinematicCloud      0;\n    labelField          0;\n    labelList           0;\n    labelListList       0;\n    labelToCell         0;\n    labelToFace         0;\n    labelToPoint        0;\n    laminar             0;\n    laminarFlameSpeed   0;\n    laplace             0;\n    layerAdditionRemoval 0;\n    layered             0;\n    lduInterface        0;\n    lduInterfaceField   0;\n    lduMatrix           1;\n    lduMesh             0;\n    leastSquares        0;\n    leastSquaresVectors 0;\n    level               2;\n    limitWith           0;\n    limited             0;\n    limitedCubic        0;\n    limitedCubic01      0;\n    limitedCubicV       0;\n    limitedGamma        0;\n    limitedLimitedCubic 0;\n    limitedLimitedLinear 0;\n    limitedLinear       0;\n    limitedLinear01     0;\n    limitedLinearV      0;\n    limitedMUSCL        0;\n    limitedSurfaceInterpolationScheme 0;\n    limitedVanLeer      0;\n    linear              0;\n    linearFit           0;\n    linearUpwind        0;\n    linearUpwindV       0;\n    liquid              0;\n    locDynOneEqEddy     0;\n    localBlended        0;\n    localMax            0;\n    localMin            0;\n    localPointRegion    0;\n    lowReOneEqEddy      0;\n    manual              0;\n    meshCutAndRemove    0;\n    meshCutter          0;\n    meshModifier        0;\n    meshRefinement      0;\n    meshSearch          0;\n    meshToMesh          0;\n    metis               0;\n    midPoint            0;\n    midPointAndFace     0;\n    mixed               0;\n    mixedEnthalpy       0;\n    mixedInternalEnergy 0;\n    mixedSmagorinsky    0;\n    mixedUnburntEnthalpy 0;\n    mixerFvMesh         0;\n    modifyCell          0;\n    modifyFace          0;\n    modifyPoint         0;\n    motionDiffusivity   0;\n    motionDirectional   0;\n    motionSmoother      0;\n    motionSolver        0;\n    movingConeTopoFvMesh 0;\n    movingWallVelocity  0;\n    muSgsSpalartAllmarasWallFunction 0;\n    multiDirRefinement  0;\n    multiHoleInjector   0;\n    multiLevel          1;\n    multivariateSelection 0;\n    mutRoughWallFunction 0;\n    mutSpalartAllmarasStandardRoughWallFunction  0;\n    mutSpalartAllmarasStandardWallFunction  0;\n    mutSpalartAllmarasWallFunction  0;\n    mutWallFunction     0;\n    nC3H8O              0;\n    nbrToCell           0;\n    nearestToCell       0;\n    nearestToPoint      0;\n    noAbsorptionEmission 0;\n    noDragModel         0;\n    noRadiation         0;\n    none                0;\n    normal              0;\n    normalToFace        0;\n    nuSgsSpalartAllmarasWallFunction 0;\n    nutRoughWallFunction 0;\n    nutSpalartAllmarasStandardRoughWallFunction  0;\n    nutSpalartAllmarasStandardWallFunction  0;\n    nutSpalartAllmarasWallFunction  0;\n    nutWallFunction     0;\n    obj                 0;\n    objectRegistry      0;\n    off                 0;\n    omegaWallFunction   0;\n    oneEqEddy           0;\n    orientedSurface     0;\n    oscillatingDisplacement 0;\n    oscillatingFixedValue 0;\n    oscillatingVelocity 0;\n    outletInlet         0;\n    outletStabilised    0;\n    pair                0;\n    parabolicCylindrical 0;\n    parcel              0;\n    partialSlip         0;\n    passiveParticle     0;\n    patch               0;\n    patchToFace         0;\n    patchZones          0;\n    pdf                 0;\n    perfectInterface    0;\n    pointIndexHitList   0;\n    pointPatchField     0;\n    pointScalarField    0;\n    pointScalarField::DimensionedInternalField 0;\n    pointSet            0;\n    pointSphericalTensorField 0;\n    pointSphericalTensorField::DimensionedInternalField 0;\n    pointSymmTensorField 0;\n    pointSymmTensorField::DimensionedInternalField 0;\n    pointTensorField    0;\n    pointTensorField::DimensionedInternalField 0;\n    pointToCell         0;\n    pointToFace         0;\n    pointToPoint        0;\n    pointVectorField    0;\n    pointVectorField::DimensionedInternalField 0;\n    pointZone           0;\n    polyBoundaryMesh    0;\n    polyMesh            0;\n    polyMeshGeometry    0;\n    polyMeshInfo        0;\n    polyTopoChange      0;\n    polyTopoChanger     0;\n    powerLaw            0;\n    pressureDirectedInletOutletVelocity 0;\n    pressureDirectedInletVelocity 0;\n    pressureInletOutletVelocity 0;\n    pressureInletUniformVelocity 0;\n    pressureInletVelocity 0;\n    pressureNormalInletOutletVelocity 0;\n    pressureSwirlInjector 0;\n    primitiveMesh       0;\n    primitiveMeshGeometry 0;\n    probes              0;\n    processor           0;\n    processorLduInterface 0;\n    processorLduInterfaceField 0;\n    pureMixture<constTransport<specieThermo<hConstThermo<perfectGas>>>> 0;\n    pureMixture<sutherlandTransport<specieThermo<hConstThermo<perfectGas>>>> 0;\n    pureMixture<sutherlandTransport<specieThermo<janafThermo<perfectGas>>>> 0;\n    quadratic           0;\n    quadraticFit        0;\n    quadraticLinearFit  0;\n    quadraticLinearUpwindFit 0;\n    quadraticUpwindFit  0;\n    radiationModel      0;\n    raw                 0;\n    reactingCloud       0;\n    reaction            0;\n    realizableKE        0;\n    refinementHistory   0;\n    refinementIterator  0;\n    reflect             0;\n    regIOobject         0;\n    regionSplit         0;\n    regionToCell        0;\n    remove              0;\n    removeCell          0;\n    removeCells         0;\n    removeFace          0;\n    removeFaces         0;\n    removePoint         0;\n    removePoints        0;\n    reverseLinear       0;\n    rotatedBoxToCell    0;\n    rotatingPressureInletOutletVelocity 0;\n    rotatingTotalPressure 0;\n    sampledPatch        0;\n    sampledPlane        0;\n    sampledSet          0;\n    sampledSurface      0;\n    saturateEvaporationModel 0;\n    scalarAverageField  0;\n    scalarField         0;\n    scalarRange         0;\n    scaleSimilarity     0;\n    scatterModel        0;\n    searchableBox       0;\n    searchableSurface   0;\n    sequential          0;\n    setUpdater          0;\n    sets                0;\n    shapeList           0;\n    shapeToCell         0;\n    simple              0;\n    sixDoFRigidBodyMotionConstraint 0;\n    skewCorrected       0;\n    skewCorrectionVectors 0;\n    sliced              0;\n    slidingInterface    0;\n    slip                0;\n    smooth              0;\n    smoothSolver        0;\n    solid               0;\n    solidBodyMotionFunction 0;\n    solidBodyMotionFvMesh 0;\n    solution            0;\n    spectEddyVisc       0;\n    sphereToCell        0;\n    spherical           0;\n    sphericalTensorAverageField 0;\n    sphericalTensorField 0;\n    standardDragModel   0;\n    standardEvaporationModel 0;\n    staticFvMesh        0;\n    steadyState         0;\n    stl                 0;\n    string              0;\n    stochasticDispersionRAS 0;\n    supersonicFreestream 0;\n    surfaceFeatures     0;\n    surfaceInterpolation 0;\n    surfaceInterpolationScheme 0;\n    surfaceIntersection 0;\n    surfaceNormalFixedValue 0;\n    surfacePatch        0;\n    surfacePatchIOList  0;\n    surfaceScalarField  0;\n    surfaceScalarField::DimensionedInternalField 0;\n    surfaceSlipDisplacement 0;\n    surfaceSphericalTensorField 0;\n    surfaceSphericalTensorField::DimensionedInternalField 0;\n    surfaceSymmTensorField 0;\n    surfaceSymmTensorField::DimensionedInternalField 0;\n    surfaceTensorField 0;\n    surfaceTensorField::DimensionedInternalField 0;\n    surfaceToCell       0;\n    surfaceToPoint      0;\n    surfaceVectorField  0;\n    surfaceVectorField::DimensionedInternalField 0;\n    surfaceWriter       0;\n    surfaces            0;\n    swirlInjector       0;\n    symmTensorAverageField 0;\n    symmTensorField     0;\n    symmetryPlane       0;\n    syringePressure     0;\n    tensorAverageField  0;\n    tensorField         0;\n    tetDecomposedPolyMesh 0;\n    thermoCloud         0;\n    thermophysicalFunction 0;\n    time                0;\n    timeVaryingAlphaContactAngle 0;\n    timeVaryingFlowRateInletVelocity 0;\n    timeVaryingMappedFixedValue 0;\n    timeVaryingTotalPressure 0;\n    timeVaryingUniformFixedValue 0;\n    timer               0;\n    topoAction          0;\n    topoCellLooper      0;\n    topoChangerFvMesh   0;\n    topoSet             0;\n    topoSetSource       0;\n    toroidal            0;\n    totalPressure       0;\n    totalTemperature    0;\n    trackedParticle     0;\n    trajectory          0;\n    transform           0;\n    treeDataCell        0;\n    treeDataFace        0;\n    treeDataTriSurface  0;\n    treeLeaf            0;\n    treeNode            0;\n    triSurface          0;\n    triSurfaceMesh      0;\n    turbulenceModel     0;\n    turbulentHeatFluxTemperature 0;\n    turbulentInlet      0;\n    turbulentIntensityKineticEnergyInlet 0;\n    turbulentMixingLengthDissipationRateInlet 0;\n    turbulentMixingLengthFrequencyInlet 0;\n    uncorrected         0;\n    undoableMeshCutter  0;\n    uniform             0;\n    uniformFixedValue   0;\n    unitInjector        0;\n    upwind              0;\n    upwindCFCStencil    0;\n    value               0;\n    vanAlbada           0;\n    vanAlbadaV          0;\n    vanDriest           0;\n    vanLeer             0;\n    vanLeer01           0;\n    vanLeerV            0;\n    vector2DField       0;\n    vectorAverageField  0;\n    vectorField         0;\n    velocityComponentLaplacian 0;\n    velocityLaplacian   0;\n    viscosityModel      0;\n    volPointInterpolation 0;\n    volScalarField      0;\n    volScalarField::DimensionedInternalField 0;\n    volSphericalTensorField 0;\n    volSphericalTensorField::DimensionedInternalField 0;\n    volSymmTensorField  0;\n    volSymmTensorField::DimensionedInternalField 0;\n    volTensorField      0;\n    volTensorField::DimensionedInternalField 0;\n    volVectorField      0;\n    volVectorField::DimensionedInternalField 0;\n    vtk                 0;\n    walkPatch           0;\n    wall                0;\n    wallHeatTransfer    0;\n    wallLayerCells      0;\n    wallModel           0;\n    waveTransmissive    0;\n    wedge               0;\n    weighted            0;\n    word                2;\n    writer              0;\n    xmgr                0;\n    zeroGradient        0;\n    zoneToCell          0;\n    zoneToFace          0;\n    zoneToPoint         0;\n}\n\n\nDimensionedConstants\n{\n    unitSet             CGS; // SI // USCS\n\n    CGSCoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 2.99792e+10; // speed of light in vacuum (cm/s)\n            G               G [ -1 3 -2 0 0 0 0 ] 6.67429e-8; // gravitational constant (cm^3/(gs^2))\n            h               h [ 1 2 -1 0 0 0 0 ] 6.62607e-27; // Planck's constant (erg.s)\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 4.803204e-10; // elementary charge (statcoulomb)\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 9.10938e-28; // electron mass (g)\n            mp              mp [ 1 0 0 0 0 0 0 ] 1.67262e-24; // proton mass (g)\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 1.66054e-24; // atomic mass unit (g)\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.38065e-16; // Boltzman constant (erg/K)\n        }\n        standard\n        {\n            //- Standard pressure [Pa]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 1000000; // 1 bar (barye)\n            //- Standard temperature [degK]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 298.15; // should be same as in SI unit system\n        }\n    }\n\n    SICoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 2.99792e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 6.67429e-11;\n            h               h [ 1 2 -1 0 0 0 0 ] 6.62607e-34;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 9.10938e-31;\n            mp              mp [ 1 0 0 0 0 0 0 ] 1.67262e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 1.66054e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.38065e-23;\n        }\n        standard\n        {\n            //- Standard pressure [Pa]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 100000;\n            //- Standard temperature [degK]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 298.15;\n        }\n    }\n    USCSCoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 9.83558e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 1.06909e-09;\n            h               h [ 1 2 -1 0 0 0 0 ] 1.57234e-32;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 2.00825e-30;\n            mp              mp [ 1 0 0 0 0 0 0 ] 3.68746e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 3.66083e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.82012e-22;\n        }\n        standard\n        {\n            //- Standard pressure [lbm/ft^2]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 2088.6;\n            //- Standard temperature [degR]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 536.67;\n        }\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/controlDict_cgs_2.2.x",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.2.1                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      controlDict;\n}\n\n// NB: the #functions do not work here\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nDocumentation\n{\n    docBrowser      \"firefox %f\";\n    doxyDocDirs\n    (\n        \"$WM_PROJECT_USER_DIR/html\"\n        \"~OpenFOAM/html\"\n        \"$WM_PROJECT_DIR/doc/Doxygen/html\"\n    );\n    doxySourceFileExts\n    (\n        \"App_8C.html\"\n        \"_8C.html\"\n    );\n}\n\n\nInfoSwitches\n{\n    writePrecision  6;\n    writeJobInfo    0;\n    writeDictionaries 0;\n\n    // Allow case-supplied C++ code (#codeStream, codedFixedValue)\n    allowSystemOperations   0;\n}\n\n\nOptimisationSwitches\n{\n    // On NFS mounted file system: maximum wait for files to appear/get\n    // updated. Set to 0 on distributed case.\n    fileModificationSkew 30;\n\n    //- Modification checking:\n    //  - timeStamp         : use modification time on file\n    //  - inotify           : use inotify framework\n    //  - timeStampMaster   : do time stamp (and file reading) only on master.\n    //  - inotifyMaster     : do inotify (and file reading) only on master.\n    fileModificationChecking timeStampMaster;//inotify;timeStamp;inotifyMaster;\n\n    commsType       nonBlocking; //scheduled; //blocking;\n    floatTransfer   0;\n    nProcsSimpleSum 0;\n\n    // Force dumping (at next timestep) upon signal (-1 to disable)\n    writeNowSignal              -1; //10;\n    // Force dumping (at next timestep) upon signal (-1 to disable) and exit\n    stopAtWriteNowSignal        -1;\n}\n\n\nDebugSwitches\n{\n    Analytical          0;\n    APIdiffCoefFunc     0;\n    Ar                  0;\n    BICCG               0;\n    BirdCarreau         0;\n    C10H22              0;\n    C12H26              0;\n    C13H28              0;\n    C14H30              0;\n    C16H34              0;\n    C2H5OH              0;\n    C2H6                0;\n    C2H6O               0;\n    C3H6O               0;\n    C3H8                0;\n    C4H10O              0;\n    C6H14               0;\n    C6H6                0;\n    C7H16               0;\n    C7H8                0;\n    C8H10               0;\n    C8H18               0;\n    C9H20               0;\n    CH3OH               0;\n    CH4N2O              0;\n    CarnahanStarling    0;\n    CallbackRegistry    0;\n    CentredFitData<biLinearFitPolynomial>           0;\n    CentredFitData<linearFitPolynomial>             0;\n    CentredFitData<quadraticFitPolynomial>          0;\n    CentredFitData<quadraticLinearFitPolynomial>    0;\n    ChomiakInjector     0;\n    Cloud<basicKinematicParcel> 0;\n    Cloud<basicReactingParcel>  0;\n    Cloud<fluidThermoParcel>    0;\n    Cloud<indexedParticle>  0;\n    Cloud<parcel>           0;\n    Cloud<passiveParticle>  0;\n    Cloud<trackedParticle>  0;\n    CoEuler             0;\n    CompositionModel    0;\n    ConeInjection       0;\n    Constant            0;\n    ConstantRateDevolatilisation    0;\n    CrankNicolson      0;\n    CrossPowerLaw       0;\n    Cs                  0;\n    DIC                 0;\n    DICGaussSeidel      0;\n    DILU                0;\n    DILUGaussSeidel     0;\n    DataEntry           0;\n    DeardorffDiffStress 0;\n    DispersionModel     0;\n    DispersionRASModel  0;\n    DragModel           0;\n    ETAB                0;\n    Ergun               0;\n    Euler               0;\n    EulerImplicit       0;\n    EulerRotation       0;\n    extendedCellToFaceStencil 0;\n    FDIC                0;\n    FaceCellWave        0;\n    GAMG                0;\n    GAMGAgglomeration   0;\n    GAMGInterface       0;\n    GAMGInterfaceField  0;\n    Gamma               0;\n    Gamma01             0;\n    GammaV              0;\n    Gauss               0;\n    GaussSeidel         0;\n    Gibilaro            0;\n    Gidaspow            0;\n    GidaspowErgunWenYu  0;\n    GidaspowSchillerNaumann 0;\n    GradientDispersionRAS   0;\n    Gulders             0;\n    GuldersEGR          0;\n    H2O                 0;\n    HashTable           0;\n    HeatTransferModel   0;\n    HerschelBulkley     0;\n    HrenyaSinclair      0;\n    IC8H18              0;\n    ICCG                0;\n    IDDESDelta          0;\n    IDEA                0;\n    IFstream            0;\n    IOMap<dictionary>   0;\n    IOPtrList<MRFZone>  0;\n    IOPtrList<coordinateSystem> 0;\n    IOPtrList<injector> 0;\n    IOPtrList<porousZone>   0;\n    IOobject            0;\n    InjectionModel      0;\n    IntegrationScheme   0;\n    JohnsonJackson      0;\n    KRR4                0;\n    KinematicCloud<basicKinematicParcel> 0;\n    KinematicCloud<basicReactingParcel> 0;\n    KinematicCloud<fluidThermoParcel>   0;\n    KinematicParcel<basicReactingParcel> 0;\n    KinematicParcel<fluidThermoParcel>  0;\n    LESModel            0;\n    LESdelta            0;\n    LESfilter           0;\n    LISA                0;\n    LRR                 0;\n    LRRDiffStress       0;\n    LamBremhorstKE      0;\n    LaunderGibsonRSTM   0;\n    LaunderSharmaKE     0;\n    LienCubicKE         0;\n    LienCubicKELowRe    0;\n    LienLeschzinerLowRe 0;\n    MB                  0;\n    MC                  0;\n    MCV                 0;\n    MUSCL               0;\n    MUSCL01             0;\n    MUSCLV              0;\n    ManualInjection     0;\n    MarshakRadiation    0;\n    MarshakRadiationFixedT  0;\n    MassTransferModel   0;\n    MeshWave            0;\n    Minmod              0;\n    MinmodV             0;\n    N2                  0;\n    NSRDSfunc0          0;\n    NSRDSfunc1          0;\n    NSRDSfunc14         0;\n    NSRDSfunc2          0;\n    NSRDSfunc3          0;\n    NSRDSfunc4          0;\n    NSRDSfunc5          0;\n    NSRDSfunc6          0;\n    NSRDSfunc7          0;\n    Newtonian           0;\n    NoDispersion        0;\n    NoDrag              0;\n    NoHeatTransfer      0;\n    NoInjection         0;\n    NoMassTransfer      0;\n    NoSurfaceReaction   0;\n    NonlinearKEShih     0;\n    ODE                 0;\n    ODESolver           0;\n    OFstream            0;\n    ORourke             0;\n    OSPRE               0;\n    OSPREV              0;\n    P1                  0;\n    PBiCG               0;\n    PCG                 0;\n    PackedList          0;\n    ParSortableList     0;\n    PatchToPatchInterpolation 0;\n    Phi                 0;\n    PointEdgeWave       0;\n    POSIX               0;\n    Prandtl             0;\n    PrimitivePatch      0;\n    Pstream             0;\n    QUICK               0;\n    QUICKV              0;\n    QZeta               0;\n    RASModel            0;\n    RK                  0;\n    RNGkEpsilon         0;\n    RanzMarshall        0;\n    ReactingCloud<basicReactingParcel>  0;\n    ReactingParcel<basicReactingParcel> 0;\n    Rebound             0;\n    ReitzDiwakar        0;\n    ReitzKHRT           0;\n    RosinRammler        0;\n    RutlandFlashBoil    0;\n    SDA                 0;\n    SFCD                0;\n    SFCDV               0;\n    SHF                 0;\n    SIBS                0;\n    SKA                 0;\n    SLTS                0;\n    SRFModel            0;\n    SRFVelocity         0;\n    STARCDRotation      0;\n    Schaeffer           0;\n    SchillerNaumann     0;\n    SinclairJackson     0;\n    SingleKineticRateDevolatilisation 0;\n    SingleMixtureFraction   0;\n    Smagorinsky         0;\n    SolverPerformance   1;\n    SpalartAllmaras     0;\n    SpalartAllmarasDDES 0;\n    SpalartAllmarasIDDES    0;\n    SphereDrag          0;\n    StandardWallInteraction 0;\n    StaticHashTable     0;\n    StochasticDispersionRAS 0;\n    SuperBee            0;\n    SuperBeeV           0;\n    SurfaceReactionModel 0;\n    Syamlal             0;\n    SyamlalOBrien       0;\n    SyamlalRogersOBrien 0;\n    TAB                 0;\n    Table               0;\n    ThermoCloud<basicReactingParcel>    0;\n    ThermoCloud<fluidThermoParcel>      0;\n    ThermoParcel<basicReactingParcel>   0;\n    ThermoParcel<fluidThermoParcel>     0;\n    UMIST               0;\n    UMISTV              0;\n    UpwindFitData<cubicUpwindFitPolynomial> 0;\n    UpwindFitData<quadraticLinearUpwindFitPolynomial> 0;\n    UpwindFitData<quadraticUpwindFitPolynomial>     0;\n    WallInteractionModel 0;\n    WenYu               0;\n    aC11H10             0;\n    absorptionEmissionModel 0;\n    addCell             0;\n    addFace             0;\n    addPatchCellLayer   0;\n    addPoint            0;\n    advective           0;\n    algebraicPair       0;\n    alphaContactAngle   0;\n    alphaFixedPressure  0;\n    alphatWallFunction  0;\n    angularOscillatingDisplacement  0;\n    angularOscillatingVelocity  0;\n    anisotropic         0;\n    ash                 0;\n    atomizationModel    0;\n    attachDetach        0;\n    autoDensity         0;\n    autoHexMeshDriver   0;\n    autoLayerDriver     0;\n    autoRefineDriver    0;\n    autoSnapDriver      0;\n    bC11H10             0;\n    backgroundMeshDecomposition 0;\n    backward            0;\n    basePatch           0;\n    basicKinematicCloud 0;\n    basicKinematicParcel 0;\n    basicMixture        0;\n    basicReactingCloud  0;\n    basicReactingParcel 0;\n    fluidThermo         0;\n    fluidThermoCloud    0;\n    fluidThermoParcel   0;\n    biLinearFit         0;\n    binaryAbsorptionEmission 0;\n    blended             0;\n    blobsSheetAtomization   0;\n    blobsSwirlInjector  0;\n    booleanSurface      0;\n    boundaryCutter      0;\n    boundaryMesh        0;\n    boundaryToFace      0;\n    boundedBackward     0;\n    boxToCell           0;\n    boxToFace           0;\n    boxToPoint          0;\n    breakupModel        0;\n    calculated          0;\n    cell                0;\n    cellClassification  0;\n    cellCuts            0;\n    cellDistFuncs       0;\n    cellLimited         0;\n    cellList            0;\n    cellLooper          0;\n    cellMDLimited       0;\n    cellMotion          0;\n    cellPoint           0;\n    cellPointFace       0;\n    cellPointWeight     0;\n    cellSet             0;\n    cellSizeControlSurfaces 0;\n    cellToCell          0;\n    cellToFace          0;\n    cellToPoint         0;\n    cellZone            0;\n    centredCECStencil   0;\n    centredCFCStencil   0;\n    chemistryReader     0;\n    chemistrySolver     0;\n    chemkinReader       0;\n    clippedLinear       0;\n    cloud               0;\n    cloudAbsorptionEmission 0;\n    cloudScatter        0;\n    collisionModel      0;\n    combineFaces        0;\n    commSchedule        0;\n    commonRailInjector  0;\n    compound            0;\n    constInjector       0;\n    constant            0;\n    constantAbsorptionEmission  0;\n    constantAlphaContactAngle   0;\n    constantScatter     0;\n    coordinateRotation  0;\n    coordinateSystem    0;\n    coordinateSystems   0;\n    corrected           0;\n    coupled             0;\n    cubeRootVol         0;\n    cubic               0;\n    cubicUpwindFit      0;\n    curve               0;\n    cyclic              0;\n    cyclicLduInterface  0;\n    cyclicLduInterfaceField 0;\n    cylinderToCell      0;\n    cylindrical         0;\n    decompositionMethod 0;\n    definedHollowConeInjector 0;\n    definedInjector     0;\n    definedPressureSwirlInjector 0;\n    diagTensorField     0;\n    diagonal            0;\n    dictionary          0;\n    dimensionSet        1;\n    mappedBase    0;\n    mappedPatch   0;\n    mappedVelocityFlux 0;\n    directionMixed      0;\n    directional         0;\n    disallowGenericFvPatchField 0;\n    disallowGenericPointPatchField 0;\n    disallowGenericPolyPatch    0;\n    dispersionLESModel  0;\n    dispersionModel     0;\n    dispersionRASModel  0;\n    displacementComponentLaplacian 0;\n    displacementInterpolation 0;\n    displacementLaplacian 0;\n    displacementSBRStress 0;\n    distanceSurface     0;\n    Distribution        0;\n    downwind            0;\n    dragModel           0;\n    duplicatePoints     0;\n    dx                  0;\n    dynMixedSmagorinsky 0;\n    dynOneEqEddy        0;\n    dynSmagorinsky      0;\n    dynamicAlphaContactAngle 0;\n    dynamicFvMesh       0;\n    dynamicInkJetFvMesh 0;\n    dynamicMotionSolverFvMesh 0;\n    dynamicRefineFvMesh 0;\n    edgeIntersections   0;\n    edgeList            0;\n    edgeSurface         0;\n    empty               0;\n    engineMesh          0;\n    enrichedPatch       0;\n    epsilonWallFunction 0;\n    errorDrivenRefinement   0;\n    evaporationModel    0;\n    exponential         0;\n    extendedLeastSquares    0;\n    extendedLeastSquaresVectors 0;\n    face                0;\n    faceAreaPair        0;\n    faceCoupleInfo      0;\n    faceLimited         0;\n    faceList            0;\n    faceMDLimited       0;\n    faceSet             0;\n    faceToCell          0;\n    faceToFace          0;\n    faceToPoint         0;\n    faceZone            0;\n    fan                 0;\n    featureEdgeMesh     0;\n    fieldToCell         0;\n    file                0;\n    fileName            2;\n    filteredLinear      0;\n    filteredLinear2     0;\n    filteredLinear2V    0;\n    filteredLinear3     0;\n    filteredLinear3V    0;\n    fixedEnthalpy       0;\n    buoyantPressure 0;\n    fixedFluxBoussinesqBuoyantPressure 0;\n    fixedFluxPressure   0;\n    fixedGradient       0;\n    fixedInternalEnergy 0;\n    fixedInternalValue  0;\n    fixedNormalSlip     0;\n    fixedPressureCompressibleDensity 0;\n    fixedUnburntEnthalpy 0;\n    fixedValue          0;\n    flowRateInletVelocity   0;\n    fluxCorrectedVelocity   0;\n    foamChemistryReader 0;\n    foamFile            0;\n    forceCoeffs         0;\n    forces              0;\n    fourth              0;\n    freestream          0;\n    freestreamPressure  0;\n    frictionalStressModel   0;\n    functionObject      0;\n    fv                  0;\n    fvMesh              0;\n    fvMeshDistribute    0;\n    fvMotionSolver      0;\n    fvPatchField        0;\n    fvScalarMatrix      0;\n    fvSchemes           0;\n    fvSphericalTensorMatrix 0;\n    fvSymmTensorMatrix  0;\n    fvTensorMatrix      0;\n    fvVectorMatrix      0;\n    fvsPatchField       0;\n    general             0;\n    generic             0;\n    genericPatch        0;\n    geomCellLooper      0;\n    geometricSurfacePatch   0;\n    global              0;\n    globalIndexAndTransform 0;\n    globalMeshData      0;\n    globalPoints        0;\n    gnuplot             0;\n    gradientDispersionRAS   0;\n    gradientEnthalpy        0;\n    gradientInternalEnergy  0;\n    gradientUnburntEnthalpy 0;\n    granularPressureModel   0;\n    hCombustionThermo   0;\n    hMixtureThermo<homogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<homogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<inhomogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<inhomogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<multiComponentMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hMixtureThermo<reactingMixture> 0;\n    hMixtureThermo<veryInhomogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hMixtureThermo<veryInhomogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<sutherlandTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hThermo<pureMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    harmonic            0;\n    heatTransferModel   0;\n    hexCellLooper       0;\n    hexRef8             0;\n    hhuCombustionThermo 0;\n    hhuMixtureThermo<egrMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<egrMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<homogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<homogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<inhomogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<inhomogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<veryInhomogeneousMixture<constTransport<thermo<hConstThermo<perfectGas>>>>> 0;\n    hhuMixtureThermo<veryInhomogeneousMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>>> 0;\n    hierarchical        0;\n    hollowConeInjector  0;\n    iC3H8O              0;\n    indexedOctree       0;\n    indexedParticle     0;\n    injectorModel       0;\n    injectorType        0;\n    inletOutlet         0;\n    inletOutletTotalTemperature 0;\n    interfaceCompression 0;\n    intersectedSurface  0;\n    inverseDistance     0;\n    inverseFaceDistance 0;\n    inversePointDistance 0;\n    inverseVolume       0;\n    isoSurface          0;\n    isoSurfaceCell      0;\n    jplot               0;\n    jumpCyclic          0;\n    kEpsilon            0;\n    kOmega              0;\n    kOmegaSST           0;\n    kOmegaSSTSAS        0;\n    kqRWallFunction     0;\n    kinematicCloud      0;\n    labelField          0;\n    labelList           0;\n    labelListList       0;\n    labelToCell         0;\n    labelToFace         0;\n    labelToPoint        0;\n    laminar             0;\n    laminarFlameSpeed   0;\n    laplace             0;\n    layerAdditionRemoval 0;\n    layered             0;\n    lduInterface        0;\n    lduInterfaceField   0;\n    lduMatrix           1;\n    lduMesh             0;\n    leastSquares        0;\n    leastSquaresVectors 0;\n    level               2;\n    limitWith           0;\n    limited             0;\n    limitedCubic        0;\n    limitedCubic01      0;\n    limitedCubicV       0;\n    limitedGamma        0;\n    limitedLimitedCubic 0;\n    limitedLimitedLinear 0;\n    limitedLinear       0;\n    limitedLinear01     0;\n    limitedLinearV      0;\n    limitedMUSCL        0;\n    limitedSurfaceInterpolationScheme 0;\n    limitedVanLeer      0;\n    linear              0;\n    linearFit           0;\n    linearUpwind        0;\n    linearUpwindV       0;\n    liquid              0;\n    locDynOneEqEddy     0;\n    localBlended        0;\n    localMax            0;\n    localMin            0;\n    localPointRegion    0;\n    lowReOneEqEddy      0;\n    manual              0;\n    meshCutAndRemove    0;\n    meshCutter          0;\n    meshModifier        0;\n    meshRefinement      0;\n    meshSearch          0;\n    meshToMesh          0;\n    metis               0;\n    midPoint            0;\n    midPointAndFace     0;\n    mixed               0;\n    mixedEnthalpy       0;\n    mixedInternalEnergy 0;\n    mixedSmagorinsky    0;\n    mixedUnburntEnthalpy 0;\n    mixerFvMesh         0;\n    modifyCell          0;\n    modifyFace          0;\n    modifyPoint         0;\n    motionDiffusivity   0;\n    motionDirectional   0;\n    motionSmoother      0;\n    motionSolver        0;\n    movingConeTopoFvMesh 0;\n    movingWallVelocity  0;\n    muSgsSpalartAllmarasWallFunction 0;\n    multiDirRefinement  0;\n    multiHoleInjector   0;\n    multiLevel          0;\n    multivariateSelection 0;\n    mutRoughWallFunction 0;\n    mutSpalartAllmarasStandardRoughWallFunction  0;\n    mutSpalartAllmarasStandardWallFunction  0;\n    mutSpalartAllmarasWallFunction  0;\n    mutWallFunction     0;\n    nC3H8O              0;\n    nbrToCell           0;\n    nearestToCell       0;\n    nearestToPoint      0;\n    noAbsorptionEmission 0;\n    noDragModel         0;\n    noRadiation         0;\n    none                0;\n    normal              0;\n    normalToFace        0;\n    nuSgsSpalartAllmarasWallFunction 0;\n    nutRoughWallFunction 0;\n    nutSpalartAllmarasStandardRoughWallFunction  0;\n    nutSpalartAllmarasStandardWallFunction  0;\n    nutSpalartAllmarasWallFunction  0;\n    nutWallFunction     0;\n    obj                 0;\n    objectRegistry      0;\n    off                 0;\n    omegaWallFunction   0;\n    oneEqEddy           0;\n    orientedSurface     0;\n    oscillatingDisplacement 0;\n    oscillatingFixedValue 0;\n    oscillatingVelocity 0;\n    outletInlet         0;\n    outletStabilised    0;\n    pair                0;\n    parabolicCylindrical 0;\n    parcel              0;\n    partialSlip         0;\n    passiveParticle     0;\n    patch               0;\n    patchToFace         0;\n    patchZones          0;\n    pdf                 0;\n    perfectInterface    0;\n    pointIndexHitList   0;\n    pointPatchField     0;\n    pointScalarField    0;\n    pointScalarField::DimensionedInternalField 0;\n    pointSet            0;\n    pointSphericalTensorField 0;\n    pointSphericalTensorField::DimensionedInternalField 0;\n    pointSymmTensorField 0;\n    pointSymmTensorField::DimensionedInternalField 0;\n    pointTensorField    0;\n    pointTensorField::DimensionedInternalField 0;\n    pointToCell         0;\n    pointToFace         0;\n    pointToPoint        0;\n    pointVectorField    0;\n    pointVectorField::DimensionedInternalField 0;\n    pointZone           0;\n    polyBoundaryMesh    0;\n    polyMesh            0;\n    polyMeshGeometry    0;\n    polyMeshInfo        0;\n    polyTopoChange      0;\n    polyTopoChanger     0;\n    powerLaw            0;\n    pressureDirectedInletOutletVelocity 0;\n    pressureDirectedInletVelocity 0;\n    pressureInletOutletVelocity 0;\n    pressureInletUniformVelocity 0;\n    pressureInletVelocity 0;\n    pressureNormalInletOutletVelocity 0;\n    pressureSwirlInjector 0;\n    primitiveMesh       0;\n    primitiveMeshGeometry 0;\n    probes              0;\n    processor           0;\n    processorLduInterface 0;\n    processorLduInterfaceField 0;\n    pureMixture<constTransport<thermo<hConstThermo<perfectGas>>>> 0;\n    pureMixture<sutherlandTransport<thermo<hConstThermo<perfectGas>>>> 0;\n    pureMixture<sutherlandTransport<thermo<janafThermo<perfectGas>>>> 0;\n    quadratic           0;\n    quadraticFit        0;\n    quadraticLinearFit  0;\n    quadraticLinearUpwindFit 0;\n    quadraticUpwindFit  0;\n    radiationModel      0;\n    raw                 0;\n    reactingCloud       0;\n    reaction            0;\n    realizableKE        0;\n    refinementHistory   0;\n    refinementIterator  0;\n    reflect             0;\n    regIOobject         0;\n    regionSplit         0;\n    regionToCell        0;\n    remove              0;\n    removeCell          0;\n    removeCells         0;\n    removeFace          0;\n    removeFaces         0;\n    removePoint         0;\n    removePoints        0;\n    reverseLinear       0;\n    rotatedBoxToCell    0;\n    rotatingPressureInletOutletVelocity 0;\n    rotatingTotalPressure 0;\n    sampledPatch        0;\n    sampledPlane        0;\n    sampledSet          0;\n    sampledSurface      0;\n    saturateEvaporationModel 0;\n    scalarAverageField  0;\n    scalarField         0;\n    scalarRange         0;\n    scaleSimilarity     0;\n    scatterModel        0;\n    searchableBox       0;\n    searchableSurface   0;\n    sequential          0;\n    setUpdater          0;\n    sets                0;\n    shapeList           0;\n    shapeToCell         0;\n    simple              0;\n    sixDoFRigidBodyMotionConstraint 0;\n    skewCorrected       0;\n    skewCorrectionVectors 0;\n    sliced              0;\n    slidingInterface    0;\n    slip                0;\n    smooth              0;\n    smoothSolver        0;\n    solid               0;\n    solidBodyMotionFunction 0;\n    solidBodyMotionFvMesh 0;\n    solution            0;\n    spectEddyVisc       0;\n    sphereToCell        0;\n    spherical           0;\n    sphericalTensorAverageField 0;\n    sphericalTensorField 0;\n    standardDragModel   0;\n    standardEvaporationModel 0;\n    staticFvMesh        0;\n    steadyState         0;\n    stl                 0;\n    string              0;\n    stochasticDispersionRAS 0;\n    supersonicFreestream 0;\n    surfaceFeatures     0;\n    surfaceInterpolation 0;\n    surfaceInterpolationScheme 0;\n    surfaceIntersection 0;\n    surfaceNormalFixedValue 0;\n    surfacePatch        0;\n    surfacePatchIOList  0;\n    surfaceScalarField  0;\n    surfaceScalarField::DimensionedInternalField 0;\n    surfaceSlipDisplacement 0;\n    surfaceSphericalTensorField 0;\n    surfaceSphericalTensorField::DimensionedInternalField 0;\n    surfaceSymmTensorField 0;\n    surfaceSymmTensorField::DimensionedInternalField 0;\n    surfaceTensorField 0;\n    surfaceTensorField::DimensionedInternalField 0;\n    surfaceToCell       0;\n    surfaceToPoint      0;\n    surfaceVectorField  0;\n    surfaceVectorField::DimensionedInternalField 0;\n    surfaceWriter       0;\n    surfaces            0;\n    swirlInjector       0;\n    symmTensorAverageField 0;\n    symmTensorField     0;\n    symmetryPlane       0;\n    syringePressure     0;\n    tensorAverageField  0;\n    tensorField         0;\n    tetDecomposedPolyMesh 0;\n    thermoCloud         0;\n    thermophysicalFunction 0;\n    time                0;\n    timeVaryingAlphaContactAngle 0;\n    timeVaryingFlowRateInletVelocity 0;\n    timeVaryingMappedFixedValue 0;\n    timeVaryingTotalPressure 0;\n    timeVaryingUniformFixedValue 0;\n    timer               0;\n    topoAction          0;\n    topoCellLooper      0;\n    topoChangerFvMesh   0;\n    topoSet             0;\n    topoSetSource       0;\n    toroidal            0;\n    totalPressure       0;\n    totalTemperature    0;\n    trackedParticle     0;\n    trajectory          0;\n    transform           0;\n    treeDataCell        0;\n    treeDataFace        0;\n    treeDataTriSurface  0;\n    treeLeaf            0;\n    treeNode            0;\n    triSurface          0;\n    triSurfaceMesh      0;\n    turbulenceModel     0;\n    turbulentHeatFluxTemperature 0;\n    turbulentInlet      0;\n    turbulentIntensityKineticEnergyInlet 0;\n    turbulentMixingLengthDissipationRateInlet 0;\n    turbulentMixingLengthFrequencyInlet 0;\n    uncorrected         0;\n    undoableMeshCutter  0;\n    uniform             0;\n    uniformFixedValue   0;\n    unitInjector        0;\n    upwind              0;\n    upwindCFCStencil    0;\n    value               0;\n    vanAlbada           0;\n    vanAlbadaV          0;\n    vanDriest           0;\n    vanLeer             0;\n    vanLeer01           0;\n    vanLeerV            0;\n    vector2DField       0;\n    vectorAverageField  0;\n    vectorField         0;\n    velocityComponentLaplacian 0;\n    velocityLaplacian   0;\n    viscosityModel      0;\n    volPointInterpolation 0;\n    volScalarField      0;\n    volScalarField::DimensionedInternalField 0;\n    volSphericalTensorField 0;\n    volSphericalTensorField::DimensionedInternalField 0;\n    volSymmTensorField  0;\n    volSymmTensorField::DimensionedInternalField 0;\n    volTensorField      0;\n    volTensorField::DimensionedInternalField 0;\n    volVectorField      0;\n    volVectorField::DimensionedInternalField 0;\n    vtk                 0;\n    walkPatch           0;\n    wall                0;\n    wallHeatTransfer    0;\n    wallLayerCells      0;\n    wallModel           0;\n    warnUnboundedGauss  1;\n    waveTransmissive    0;\n    wedge               0;\n    weighted            0;\n    word                2;\n    writer              0;\n    xmgr                0;\n    zeroGradient        0;\n    zoneToCell          0;\n    zoneToFace          0;\n    zoneToPoint         0;\n}\n\n\nDimensionedConstants\n{\n    unitSet             CGS; // SI; // USCS\n\n    SICoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 2.99792e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 6.67429e-11;\n            h               h [ 1 2 -1 0 0 0 0 ] 6.62607e-34;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 9.10938e-31;\n            mp              mp [ 1 0 0 0 0 0 0 ] 1.67262e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 1.66054e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.38065e-23;\n        }\n        standard\n        {\n            //- Standard pressure [Pa]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 100000;\n            //- Standard temperature [degK]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 298.15;\n        }\n    }\n    USCSCoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 9.83558e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 1.06909e-09;\n            h               h [ 1 2 -1 0 0 0 0 ] 1.57234e-32;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 2.00825e-30;\n            mp              mp [ 1 0 0 0 0 0 0 ] 3.68746e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 3.66083e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.82012e-22;\n        }\n        standard\n        {\n            //- Standard pressure [lbm/ft^2]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 2088.6;\n            //- Standard temperature [degR]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 536.67;\n        }\n    }\n}\n\n\nDimensionSets\n{\n    unitSet             SI; // USCS\n\n    SICoeffs\n    {\n        // Basic units\n        kg  kg  [ 1 0 0 0 0 0 0 ] 1.0;\n        m   m   [ 0 1 0 0 0 0 0 ] 1.0;\n        s   s   [ 0 0 1 0 0 0 0 ] 1.0;\n        K   K   [ 0 0 0 1 0 0 0 ] 1.0;\n        mol mol [ 0 0 0 0 1 0 0 ] 1.0;\n        A   A   [ 0 0 0 0 0 1 0 ] 1.0;\n        Cd  Cd  [ 0 0 0 0 0 0 1 ] 1.0;\n\n        // Derived units\n        Hz  Hz  [ s^-1 ] 1.0;\n        N   N   [ kg m s^-2 ] 1.0;\n        Pa  Pa  [ N m^-2 ] 1.0;\n        J   J   [ N m ] 1.0;\n        W   W   [ J s^-1 ] 1.0;\n\n        // Some non-symbolic ones\n        area area [m^2] 1.0;\n        volume volume [m^3] 1.0;\n        density density [ kg m^-3 ] 1.0;\n        acceleration acceleration  [ m s^-2 ] 1.0;\n        kinematicPressure kinematicPressure [ Pa density^-1 ] 1.0;\n\n        // Scaled units. Only allowed in dimensionedType (dimensionedScalar,\n        // dimensionedVector etc.) and UniformDimensionedField, not\n        // in DimensionedField or GeometricField\n        cm  cm  [ m ] 1e-2;\n        mm  mm  [ m ] 1e-3;\n        km  km  [ m ] 1e3;\n\n        // Set of units used for printing. Can be any basic or derived\n        // but not scaled (only supported for dimensionedScalar, etc)\n        //writeUnits (kg m s K mol A Cd);\n    }\n\n    USCSCoeffs\n    {\n        // Basic units\n        lb  lb  [ 1 0 0 0 0 0 0 ] 1.0;\n        ft  ft  [ 0 1 0 0 0 0 0 ] 1.0;\n        s   s   [ 0 0 1 0 0 0 0 ] 1.0;\n        R   R   [ 0 0 0 1 0 0 0 ] 1.0;\n        mol mol [ 0 0 0 0 1 0 0 ] 1.0;\n        A   A   [ 0 0 0 0 0 1 0 ] 1.0;\n        Cd  Cd  [ 0 0 0 0 0 0 1 ] 1.0;\n\n        // Set of units used for printing. Can be any basic or derived\n        // but not scaled (only supported for dimensionedScalar, etc)\n        //writeUnits (lb ft s R mol A Cd);\n    }\n}\n\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/cshrc",
    "content": "#----------------------------------*-sh-*--------------------------------------\n# CFDEMcoupling\n# Christoph Goniva\n# June 2012\n#------------------------------------------------------------------------------\n#\n# Script\n#     etc/cshrc\n#\n# Description\n#     Startup file for cfdem exporting environment variables\n#     Sourced  ~/.cshrc\n#\n#- add this block to your ~/.cshrc and modify for your installation\n#- you can test the correctness using cfdemSystemTest.sh\n\n## STANDARD BLOCK FOR REGULAR INSTALLATIONS\n##================================================#\n##- source cfdem env vars\n#setenv CFDEM_VERSION PUBLIC\n#setenv CFDEM_PROJECT_DIR $HOME/CFDEM/CFDEMcoupling-$CFDEM_VERSION-$WM_PROJECT_VERSION\n#setenv CFDEM_PROJECT_USER_DIR $HOME/CFDEM/$LOGNAME-$CFDEM_VERSION-$WM_PROJECT_VERSION\n#setenv CFDEM_bashrc $CFDEM_PROJECT_DIR/src/lagrangian/cfdemParticle/etc/cshrc\n#setenv CFDEM_LIGGGHTS_SRC_DIR $HOME/LIGGGHTS/LIGGGHTS-PUBLIC/src\n#setenv CFDEM_LIGGGHTS_MAKEFILE_NAME auto\n#setenv CFDEM_LPP_DIR $HOME/LIGGGHTS/mylpp/src\n#source $CFDEM_bashrc\n#================================================#\n#------------------------------------------------------------------------------\n\n\n## EXTENDED BLOCK FOR HIGHLY CUSTOMIZED INSTALLATIONS\n## you may insert this right above \"source $CFDEM_bashrc\"\n##================================================#\n#setenv CFDEM_SRC_DIR $CFDEM_PROJECT_DIR/src\n#setenv CFDEM_SOLVER_DIR $CFDEM_PROJECT_DIR/applications/solvers\n#setenv CFDEM_DOC_DIR $CFDEM_PROJECT_DIR/doc\n#setenv CFDEM_UT_DIR $CFDEM_PROJECT_DIR/applications/utilities\n#setenv CFDEM_TUT_DIR $CFDEM_PROJECT_DIR/tutorials\n#setenv CFDEM_LIGGGHTS_MAKEFILE_POSTFIX\n#setenv CFDEM_VERBOSE=false\n#================================================#\n\n#------------------------------------------------------------------------------\n#- export environment variables (adapt to your paths)\n#------------------------------------------------------------------------------\n\nif (! $?CFDEM_VERBOSE ) setenv CFDEM_VERBOSE true\n\nif (! $?CFDEM_SCHEMEMODE ) setenv CFDEM_SCHEMEMODE robust\n\n## small function defs\nalias addPath 'setenv PATH \\!*\\:${PATH}'\n\nalias addLDLib 'setenv LD_LIBRARY_PATH \\!*\\:${LD_LIBRARY_PATH}'\n\nalias cfdemecho 'if ($CFDEM_VERBOSE == \"true\") echo \\!*'\n\nalias cfdemecho2 'if ($CFDEM_VERBOSE == \"true\") echo \"using userdefined \\!* = ${\\!*}\"'\nalias setVar 'eval \"if (! $?\\!:1 ) then \\\\\neval setenv \\!:1 \\!:2 \\\\\ncfdemecho using default \\!:1 = \\!:2 \\\\\nelse \\\\\ncfdemecho2 \\!:1 \\\\\nendif\"'\n\ncfdemecho \"************************************\"\nsetVar CFDEM_SRC_DIR $CFDEM_PROJECT_DIR/src\nsetVar CFDEM_SOLVER_DIR $CFDEM_PROJECT_DIR/applications/solvers\nsetVar CFDEM_DOC_DIR $CFDEM_PROJECT_DIR/doc\nsetVar CFDEM_UT_DIR $CFDEM_PROJECT_DIR/applications/utilities\nsetVar CFDEM_TUT_DIR $CFDEM_PROJECT_DIR/tutorials\nsetVar CFDEM_RHEO_DIR $WM_PROJECT_DIR/../ViscoElastic/of60\nsetVar CFDEM_RHEO_LIB_DIR $FOAM_USER_LIBBIN\n\n#check if default lammps lib path should be used\nsetVar CFDEM_LAMMPS_LIB_DIR $CFDEM_LIGGGHTS_SRC_DIR/../lib\n\n#test CFDEM_LAMMPS_LIB_DIR\nset h=$CFDEM_LAMMPS_LIB_DIR/poems/Makefile.lammps\nif ( ! ($?h) ) then\n    echo \"\"\n    echo \"WARNING CFDEM_LAMMPS_LIB_DIR = $CFDEM_LAMMPS_LIB_DIR seems to be wrong\"\n    echo \"\"\nendif\nunset h\n\n#- LIGGGHTS lib name\nif ( ($CFDEM_LIGGGHTS_MAKEFILE_NAME == auto) && ($?CFDEM_LIGGGHTS_MAKEFILE_POSTFIX) ) then\n    setenv CFDEM_LIGGGHTS_LIB_NAME \"lmp_\"$CFDEM_LIGGGHTS_MAKEFILE_NAME\"_\"$CFDEM_LIGGGHTS_MAKEFILE_POSTFIX\nelse\n    setenv CFDEM_LIGGGHTS_LIB_NAME lmp_$CFDEM_LIGGGHTS_MAKEFILE_NAME\nendif\n\nif ( ($WM_COMPILE_OPTION == Debug) && ($CFDEM_LIGGGHTS_MAKEFILE_NAME == auto) ) then\n    setenv CFDEM_LIGGGHTS_LIB_NAME \"${CFDEM_LIGGGHTS_LIB_NAME}-fulldebug\"\nendif\n\n#- LIGGGHTS lib path\nsetVar CFDEM_LIGGGHTS_MAKEFILE_NAME \"auto\"\nsetVar CFDEM_LIGGGHTS_LIB_PATH $CFDEM_LIGGGHTS_SRC_DIR\n\n#- LIGGGHTS executable\nsetenv CFDEM_LIGGGHTS_EXEC $CFDEM_LIGGGHTS_LIB_PATH/$CFDEM_LIGGGHTS_LIB_NAME\n\n#- CFDEM lib name\nsetenv CFDEM_LIB_NAME lagrangianCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#- CFDEM compressible lib name\nsetenv CFDEM_LIB_COMP_NAME lagrangianCFDEMcomp-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#check if additional libraries should be compiled together with solvers\nsetVar CFDEM_ADD_LIBS_DIR $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/addLibs_universal\nsetVar CFDEM_ADD_LIBS_NAME additionalLibs_$WM_PROJECT_VERSION\n\n# check addLibs path and file name\nset h=$CFDEM_ADD_LIBS_DIR/$CFDEM_ADD_LIBS_NAME\nif ( ! ($?h) ) then\n    echo \"!!! ERROR !!!: CFDEM_ADD_LIBS_DIR/CFDEM_ADD_LIBS_NAME=$CFDEM_ADD_LIBS_DIR/$CFDEM_ADD_LIBS_NAME does not exist.\"\nendif\nunset h\n\n#-----------------------------------------------------\n# additional libraries\n\n#- LMP Many2Many lib path and makefile\nsetenv CFDEM_Many2ManyLIB_PATH $CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMany2Many/library\nsetenv CFDEM_Many2ManyLIB_MAKEFILENAME $CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- LMP M2M lib path and makefile\nsetenv CFDEM_M2MLIB_PATH $CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/M2M/library\nsetVar CFDEM_M2MLIB_MAKEFILENAME $CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- LMP M2MMS lib path and makefile\nsetenv CFDEM_M2MMSLIB_PATH $CFDEM_SRC_DIR/lagrangian/cfdemParticle/subModels/dataExchangeModel/M2M/library\nsetenv CFDEM_M2MMSLIB_MAKEFILENAME $CFDEM_LIGGGHTS_MAKEFILE_NAME\n\n#- socketLib lib path and makefile\nsetenv CFDEM_socketLibLIB_PATH $CFDEM_SRC_DIR/CoSimProtocols/socketLib\nsetenv CFDEM_socketLibLIB_MAKEFILENAME script\n\n#- LMP POEMS lib default path\nsetenv CFDEM_POEMSLIB_PATH $CFDEM_LAMMPS_LIB_DIR/poems\n#-----------------------------------------------------\n\n#- path to test harness\nsetenv CFDEM_TEST_HARNESS_PATH $CFDEM_PROJECT_USER_DIR/log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n\n#- path to libraries\nsetVar CFDEM_LIB_DIR $CFDEM_PROJECT_DIR/platforms/$WM_OPTIONS/lib\nsetVar CFDEM_USER_LIB_DIR $CFDEM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/lib\n\naddLDLib ${CFDEM_LIB_DIR}\naddLDLib ${CFDEM_USER_LIB_DIR}\n\n#- path to apps\nsetVar CFDEM_APP_DIR $CFDEM_PROJECT_DIR/platforms/$WM_OPTIONS/bin\nsetVar CFDEM_USER_APP_DIR $CFDEM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/bin\n\naddPath ${CFDEM_APP_DIR}\naddPath ${CFDEM_USER_APP_DIR}\n\n#- path to OF version flag file\nsetenv CFDEM_OFVERSION_DIR $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFversion\n#------------------------------------------------------------------------------\n#- settings for lpp postproc tool\n#------------------------------------------------------------------------------\n\n#- nr of procs for lpp tool\nsetenv CFDEM_LPP_NPROCS 1\n\n#- nr of procs for lpp tool\nsetenv CFDEM_LPP_CHUNKSIZE 1\n\n#- shortcut to run lpp\nalias cfdemLpp 'python -i $CFDEM_LPP_DIR/lpp.py --cpunum $CFDEM_LPP_NPROCS --chunksize $CFDEM_LPP_CHUNKSIZE \\!:1'\n\n#------------------------------------------------------------------------------\n#- aliases for easy navigation (no changes necessary)\n#------------------------------------------------------------------------------\n#- shortcut to cfdem path\nalias cfdem 'cd $CFDEM_PROJECT_DIR'\n\n#- shortcut to src path\nalias cfdemSrc 'cd $CFDEM_SRC_DIR'\n\n#- shortcut to etc path\nalias cfdemEtc 'cd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc'\n\n#- shortcut to tutorial path\nalias cfdemTut 'cd $CFDEM_TUT_DIR'\n\n#- shortcut to solver path\nalias cfdemSol 'cd $CFDEM_SOLVER_DIR'\n\n#- shortcut to utilities path\nalias cfdemUt 'cd $CFDEM_UT_DIR'\n\n#- shortcut to run path\nalias cfdemRun 'cd $CFDEM_PROJECT_USER_DIR/run'\n\n#- shortcut to user solver path\nalias cfdemUsrSol 'cd $CFDEM_PROJECT_USER_DIR/applications/solvers'\n\n#- shortcut to documentation path\nalias cfdemDoc 'cd $CFDEM_DOC_DIR'\n\n#- shortcut to open the doxygen with firefox\nalias cfdemDox 'firefox $CFDEM_DOC_DIR/doxygen/html/index.html'\n\n#- shortcut to LIGGGHTS path\nalias cfdemLIG 'cd $CFDEM_LIGGGHTS_SRC_DIR'\n\n#- shortcut to system test\nalias cfdemSysTest 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/cfdemSystemTest.sh'\n\n#- shortcut to pull LIGGGHTS\nalias cfdemPullLIG 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/pullLIGGGHTS.sh'\n\n#- shortcut to pull CFDEMcoupling\nalias cfdemPullCFDEMcoupling 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/pullCFDEMcoupling.sh'\n\n#- shortcut to clean CFDEM\nalias cfdemCleanCFDEM 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/cleanCFDEMcoupling.sh'\n\n#- shortcut to compile LIGGGHTS + sublibraries\nalias cfdemCompLIG 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS.sh'\n\n#- shortcut to compile LIGGGHTS' sublibraries\nalias cfdemCompLIGlibs 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileLIGGGHTS_lib.sh'\n\n#- shortcut to compile CFDEMcoupling +LIGGGHTS\nalias cfdemCompCFDEMall 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_all.sh'\n\n#- shortcut to compile CFDEMcoupling (src+solvers)\nalias cfdemCompCFDEM 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling.sh'\n\n#- shortcut to compile CFDEMcoupling src\nalias cfdemCompCFDEMsrc 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_src.sh'\n\n#- shortcut to compile CFDEMcoupling solvers\nalias cfdemCompCFDEMsol 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_sol.sh'\n\n#- shortcut to compile CFDEMcoupling utilities\nalias cfdemCompCFDEMuti 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/compileCFDEMcoupling_uti.sh'\n\n#- shortcut to test basic tutorials\nalias cfdemTestTUT 'bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/testTutorials.sh'\n\n#- refresh link to LIGGGHTS binary\nalias cfdemRefreshLigLink='ln -sf $CFDEM_LIGGGHTS_LIB_PATH/lib$CFDEM_LIGGGHTS_LIB_NAME.so $CFDEM_LIB_DIR'\n\n#- shortcut to change dictionaries according to OF version\n#cfdemChangeTutOFversion() { bash $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/OFVersionChange/shellScripts/cfdemChangeTutOFversion_all.sh $1; }\n#export -f cfdemChangeTutOFversion\n\n#- shortcut to visualize the clock model data\nalias vizClock 'python $CFDEM_UT_DIR/vizClock/matPlot.py'\n\n#- recursive touch of current directory\nalias touchRec 'find ./* -exec touch {} \\;'\n\n#- shortcut to run liggghts in serial\nalias cfdemLiggghts '$CFDEM_LIGGGHTS_EXEC -in \\!:1'\n\n#- shortcut to run liggghts in parallel\nalias cfdemLiggghtsPar 'mpirun -np \\!:2 -machinefile mynodes $CFDEM_LIGGGHTS_EXEC -in \\!:1'\nset is_openmpi=`mpirun -version | grep \"Open MPI\" | wc -l`\nif ( $is_openmpi == 1 ) then\n    alias cfdemLiggghtsPar 'mpirun -oversubscribe -np \\!:2 $CFDEM_LIGGGHTS_EXEC -in \\!:1'\nendif\nunset is_openmpi\n\n#- shortcut to run lpp\nalias lpp 'python -i $CFDEM_LPP_DIR/lpp.py \\!:1'\n\n#- alias to unload environment, everything starting with CFDEM_ and containing cfdem\nalias cfdemUnsetEnv 'unsetenv cfdemLiggghts cfdemLiggghtsPar cfdemGrep cfdemListFiles cfdemChangeTutOFversion; unalias cfdemUnsetEnv; set cfdemDirs=\"$CFDEM_PROJECT_DIR $CFDEM_LIB_DIR $CFDEM_USER_LIB_DIR $CFDEM_APP_DIR $CFDEM_USER_APP_DIR\"; set foamClean=$WM_PROJECT_DIR/bin/foamCleanPath; set cleaned=`$foamClean \"$PATH\" \"$cfdemDirs\"`; if ( $status == 0 ) setenv PATH \"$cleaned\"; set cleaned=`($foamClean \"$LD_LIBRARY_PATH\" \"$cfdemDirs\"`; if ( $status == 0 ) setenv LD_LIBRARY_PATH \"$cleaned\"; unsetenv \"CFDEM_*\"; unalias \"cfdem*\"; unset foamClean cleaned;'\n\n# check if the directory exists\nif ( -d \"$CFDEM_PROJECT_USER_DIR\" ) then\n    :\nelse\n    if ( -d \"$CFDEM_PROJECT_DIR\" ) then\n        echo \"make new dirs $CFDEM_PROJECT_USER_DIR ? (y/n)\"\n\tset YN=$<\n        if ( $YN == \"y\" ) then\n            mkdir -p $CFDEM_PROJECT_USER_DIR\n            cd $CFDEM_PROJECT_USER_DIR\n            mkdir run\n            mkdir -p log/logFilesCFDEM-$CFDEM_VERSION-$WM_PROJECT_VERSION\n            mkdir -p applications/solvers\n            mkdir -p $CFDEM_LIB_DIR\n            mkdir -p $CFDEM_USER_LIB_DIR\n            mkdir -p $CFDEM_APP_DIR\n            mkdir -p $CFDEM_USER_APP_DIR\n        else\n            echo \"aborted by user.\"\n            exit\n        endif\n    else\n        echo \"error in CFDEMcoupling's cshrc.\"\n        exit\n    endif\nendif\n\n# set thermophysical library version to 6, overwrite if OF5\nsetVar CFDEM_THERMOPHYSICAL_VERSION 6\n\n# detect OF version\nif ( $WM_PROJECT_VERSION =~ \"6\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION 60\nelse if ( $WM_PROJECT_VERSION =~ 5.* ) then\n    setenv CFDEM_WM_PROJECT_VERSION 50\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    setVar CFDEM_THERMOPHYSICAL_VERSION 5.x\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION =~ \"4.*\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION 40\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION =~ \"3.0.*\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION 30\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION =~ \"v1606+\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION v1606\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION =~ \"v1612+\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION v1606\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION =~ \"2.4.*\" ) then\n    setenv CFDEM_WM_PROJECT_VERSION 24\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse if ( $WM_PROJECT_VERSION == \"3.2\" ) then\n    if ( $WM_FORK == \"extend\" ) then\n        setenv CFDEM_WM_PROJECT_VERSION 132\n    endif\n    cfdemecho \"************************************\"\n    cfdemecho \"WARNING from your CFDEM code!\"\n    cfdemecho \"WARNING: Coupling with your OpenFOAM(R) version is not officially supported!\"\n    cfdemecho \"In doubt switch to OpenFOAM(R) 6.\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nelse\n    clear\n    cfdemecho \"************************************\"\n    cfdemecho \"ERROR from your CFDEM code!\"\n    cfdemecho \"ERROR: your OpenFOAM(R) version is not supported!\"\n    cfdemecho \"Please use a version that is supported, i.e., see the bashrc file in the source directory!\"\n    cfdemecho \"************************************\"\n    sleep 1.5\nendif\n\ncfdemecho \"************************************\"\n\nunalias addPath addLDLib cfdemecho cfdemecho2 setVar\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/functions.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# test routine for cfdem project \n# defining functions used by the shell scripts\n# Christoph Goniva - June. 2011, DCS Computing GmbH\n#===================================================================#\n\n#==================================#\n#- function to pull from a repo\n\npullRepo()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    #--------------------------------------------------------------------------------#\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//=== $headerText ===//\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- pull\n    git pull 2>&1 | tee -a $logpath/$logfileName\n}\n#==================================#\n\n#==================================#\n#- function to compile a cfdem library\n\ncompileLib()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    #doClean=\"$5\"\n    #--------------------------------------------------------------------------------#\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- wclean and wmake\n    #if [ $doClean != \"noClean\" ]; then\n        # check library to compile is compressible\n        str=$casePath\n        i=$((${#str}-4))\n        ending=${str:$i:4}\n        if [[ $ending == \"Comp\" ]]; then\n                echo \"Compiling a compressible library - so doing an rmdepall of incomp library first.\"\n                echo \"Please make sure to have the incompressible libraries first in the library-list.txt!\"\n                cd $CFDEM_SRC_DIR/lagrangian/cfdemParticle\n                echo \"changing to $PWD\"\n                if [[ $WM_PROJECT_VERSION == v1606+ || $WM_PROJECT_VERSION == v1612+ || $WM_PROJECT_VERSION == v1706 || $WM_PROJECT_VERSION == 2.4.* || ($WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\") ]]; then\n                    rmdepall 2>&1 | tee -a $logpath/$logfileName\n                else\n                    wrmdep 2>&1 | tee -a $logpath/$logfileName\n                fi\n                cd $casePath\n                echo \"changing to $PWD\"\n            else\n                echo \"Compiling a incompressible library.\"\n        fi\n        if [[ $WM_PROJECT_VERSION == v1606+ || $WM_PROJECT_VERSION == v1612+ || $WM_PROJECT_VERSION == v1706 || $WM_PROJECT_VERSION == 2.4.* || ($WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\") ]]; then\n            rmdepall 2>&1 | tee -a $logpath/$logfileName\n        else\n            wrmdep 2>&1 | tee -a $logpath/$logfileName\n        fi\n        wclean 2>&1 | tee -a $logpath/$logfileName\n        rm -r $casePath/Make/cfdemParticle\n    #fi\n        wmake libso 2>&1 | tee -a $logpath/$logfileName\n\n    if [ ${PIPESTATUS[0]} -ne 0 ]; then \n        return 1\n    fi\n\n    #- keep terminal open\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to compile a cfdem solver\n\ncompileSolver()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    #doClean=\"$5\"\n    parallel=\"$5\"\n    #--------------------------------------------------------------------------------#\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    # check if there is an Allwmake\n    if [ -f \"Allwmake\" ]; then\n        echo \"doing Allwclean and Allwmake for the solver\"\n        bash Allwclean 2>&1 | tee -a $logpath/$logfileName\n        bash Allwmake 2>&1 | tee -a $logpath/$logfileName\n    else\n        #- wclean and wmake\n        #if [ $doClean != \"noClean\" ]; then\n            if [[ $WM_PROJECT_VERSION == v1606+ || $WM_PROJECT_VERSION == v1612+ || $WM_PROJECT_VERSION == v1706 || $WM_PROJECT_VERSION == 2.4.* || ($WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\") ]]; then\n                rmdepall 2>&1 | tee -a $logpath/$logfileName\n            else\n                wrmdep 2>&1 | tee -a $logpath/$logfileName\n            fi\n            wclean 2>&1 | tee -a $logpath/$logfileName\n        #fi\n    fi\n    \n    # compile parallel?\n    if [[ $parallel == \"true\" ]]; then\n        touch $logpath/$logfileName.tempXYZ\n        wmake 2>&1 | tee -a $logpath/$logfileName #&\n        rm $logpath/$logfileName.tempXYZ\n    else\n        touch $logpath/$logfileName.tempXYZ\n        wmake 2>&1 | tee -a $logpath/$logfileName\n        rm $logpath/$logfileName.tempXYZ\n\n    fi\n\n    #- keep terminal open\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to compile LIGGGHTS\n\ncompileLIGGGHTS()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    headerText=\"$3\"\n    clean=\"$4\"\n    #--------------------------------------------------------------------------------#\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $CFDEM_LIGGGHTS_SRC_DIR\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    # LIGGGHTS compilation flags\n    if [[ $WM_NCOMPPROCS == \"\" ]]; then\n         LIG_COMP_FLAGS=\" \"\n    else\n         LIG_COMP_FLAGS=\"-j $WM_NCOMPPROCS \"\n    fi\n\n    if [[ ${WM_COMPILE_OPTION} == \"Debug\" ]] && [[ $CFDEM_LIGGGHTS_MAKEFILE_NAME == \"auto\" ]]; then\n        LIG_COMP_FLAGS=\"${LIG_COMP_FLAGS} debug=FULL\"\n    fi\n\n    #- clean and make\n    if [[ $clean == \"false\" ]]; then\n        echo \"not cleaning LIGGGHTS\"\n    else\n        rm $CFDEM_LIGGGHTS_SRC_DIR/$CFDEM_LIGGGHTS_LIB_NAME\n        make clean-$CFDEM_LIGGGHTS_MAKEFILE_NAME postfix=$CFDEM_LIGGGHTS_MAKEFILE_POSTFIX ${LIG_COMP_FLAGS} 2>&1 | tee -a $logpath/$logfileName\n        rm $CFDEM_LIGGGHTS_SRC_DIR/\"lib\"$CFDEM_LIGGGHTS_LIB_NAME\".a\"\n        echo \"cleaning LIGGGHTS\"\n    fi\n    \n    echo \"compiling LIGGGHTS with ${LIG_COMP_FLAGS}\"\n    make $CFDEM_LIGGGHTS_MAKEFILE_NAME postfix=$CFDEM_LIGGGHTS_MAKEFILE_POSTFIX ${LIG_COMP_FLAGS} 2>&1 | tee -a $logpath/$logfileName\n    make makeshlib 2>&1 | tee -a $logpath/$logfileName\n    make -f Makefile.shlib $CFDEM_LIGGGHTS_MAKEFILE_NAME postfix=$CFDEM_LIGGGHTS_MAKEFILE_POSTFIX ${LIG_COMP_FLAGS} 2>&1 | tee -a $logpath/$logfileName\n\n    if [ ${PIPESTATUS[0]} -ne 0 ]; then \n        return 1\n    fi\n}\n\n#==================================#\n#- function to compile a lammps lib\n\ncompileLMPlib()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    headerText=\"$3\"\n    makeFileName=\"$4\"\n    libraryPath=\"$5\"\n    compilationModeSwitch=\"$6\"\n    #--------------------------------------------------------------------------------#\n\n    #- change path\n    if [ -d \"$libraryPath\" ]; then\n        cd $libraryPath\n    else\n        echo \"\"\n        echo \"lib path $libraryPath does not exist - check settings in .../etc/bashrc.\"\n        read\n    fi\n\n    # LIGGGHTS compilation flags\n    if [[ $WM_NCOMPPROCS == \"\" ]]; then\n         LIG_COMP_FLAGS=\" \"\n    else\n         LIG_COMP_FLAGS=\"-j $WM_NCOMPPROCS \"\n    fi\n\n    if [[ ${WM_COMPILE_OPTION} == \"Debug\" ]] && [[ $CFDEM_LIGGGHTS_MAKEFILE_NAME == \"auto\" ]]; then\n        LIG_COMP_FLAGS=\"${LIG_COMP_FLAGS} debug=FULL\"\n    fi\n\n\n    # check if compilation of library should be done with a separate script\n    if [[ $makeFileName == \"Makefile.script\" ]]; then\n        echo \"use script to complile...\"\n        ./compileMe.sh\n    else\n        # Fallback if $makeFileName does not exist\n        if [[ ! -f \"${makeFileName}\" ]]; then\n          echo \"WARNING: userdefined Makefile ${makeFileName} cannot be found in ${libraryPath}, using default Makefile.mpi\"\n          makeFileName=\"Makefile.mpi\"\n        fi\n\n        #Just check if library is there and and abort if not\n        if [[ $compilationModeSwitch == \"false\" ]]; then\n              if [ -d \"$libraryPath\" ]; then\n                        echo \"lib path $libraryPath EXISTS!\"\n                        libraries=$(ls ${libraryPath}/*.a 2> /dev/null | wc -l)\n                        if [[ $libraries != \"0\" ]]; then\n                            echo \"... and contains the following libraries: \"\n                            ls $libraryPath/*.a\n                            echo \"Congratulations! Check passed! \"\n                        else\n                            echo \"\"\n                            echo \"ERROR!!\"\n                            echo \"... could not find Library!\"\n                            echo \"... it should contain a *.a file to be linked to the final application.\"\n                            echo \"You need to ensure all libaries in this path are compiled.\"\n                            echo \"$libraryPath\"\n                            echo \"are compiled. Therefore, you may want to use an appropriate script that compiles these libraries first. (e.g. cfdemCompLIGlibs)\"\n                            read\n                        fi\n              fi\n        else\n            if [[ $compilationModeSwitch == \"noClean\" ]]; then\n                echo \"compileLMPlib will skip the cleaning step!\"\n                echo \"\"\n            else\n                #Clean and then compile library\n                #- clean up old log file\n                rm $logpath/$logfileName\n            fi\n            #- header\n            echo 2>&1 | tee -a $logpath/$logfileName\n            echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n            echo 2>&1 | tee -a $logpath/$logfileName\n\n            #- write path\n            pwd 2>&1 | tee -a $logpath/$logfileName\n            echo 2>&1 | tee -a $logpath/$logfileName\n\n            if [[ $makeFileName == \"Makefile.Install\" ]]; then\n                echo \"using Install.sh\"\n                bash Install.sh 0 2>&1 | tee -a $logpath/$logfileName\n                bash Install.sh 1 2>&1 | tee -a $logpath/$logfileName\n            else\n                if [[ $compilationModeSwitch == \"noClean\" ]]; then\n                    echo \"compileLMPlib will skip the cleaning step!\"\n                    echo \"\"\n                else\n                    #- clean up\n                    echo \"make clean\" 2>&1 | tee -a $logpath/$logfileName\n                    echo 2>&1 | tee -a $logpath/$logfileName\n                    make -f $makeFileName clean 2>&1 | tee -a $logpath/$logfileName\n                fi\n\n                #- compile\n                echo \"compiling LIB with ${LIG_COMP_FLAGS}\"\n                echo \"make\" 2>&1 | tee -a $logpath/$logfileName\n                echo 2>&1 | tee -a $logpath/$logfileName\n                make -f $makeFileName ${LIG_COMP_FLAGS} 2>&1 | tee -a $logpath/$logfileName\n\n                if [ ${PIPESTATUS[0]} -ne 0 ]; then \n                    return 1\n                fi\n            fi\n        fi\n    fi\n}\n#==================================#\n\n#==================================#\n#- function to clean CFDEMcoupling solvers and src\n\ncleanCFDEM()\n{\n    echo \"do you really want to clean CFDEM src?\"\n    echo \"if not, abort with ctrl-C\"\n    read\n\n    #**********************************************\n    #cleaning libraries\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/library-list.txt\"\n    echo \"\"\n    echo \"Please provide the libraries to be cleaned in the $whitelist file.\"\n\n    if [ ! -f \"$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $whitelist`\n        COUNT=0\n    fi\n\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"will change path...\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_PROJECT_DIR/src/$LINE\"\n                cd $path\n                #continue\n            fi\n\n            cd  $path\n            echo \"cleaning library $PWD\"\n            if [[ $WM_PROJECT_VERSION == v1606+ || $WM_PROJECT_VERSION == v1612+ || $WM_PROJECT_VERSION == v1706 || $WM_PROJECT_VERSION == 2.4.* || ($WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\") ]]; then\n                rmdepall\n            else\n                wrmdep\n            fi\n            wclean    \n            rm -r ./Make/linux*\n            rm -r ./lnInclude\n    done\n\n\n    #**********************************************\n    #cleaning utilities\n    echo \"removing object files in\"\n    echo \"   $CFDEM_UT_DIR\"\n    rm -r $CFDEM_UT_DIR/*/Make/linux*\n    rm -r $CFDEM_UT_DIR/*/Make/linux*\n    rm -r $CFDEM_UT_DIR/*/*.dep\n\n\n\n    #**********************************************\n    #cleaning solvers\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/solver-list.txt\"\n    echo \"\"\n    echo \"Please provide the solvers to be cleaned in the $whitelist file.\"\n\n    if [ ! -f \"$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $whitelist`\n        COUNT=0\n    fi\n\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"will change path...\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_SOLVER_DIR/$LINE\"\n                cd $path\n                #continue\n            fi\n\n            cd  $path            \n            echo \"cleaning solver $PWD\"\n            if [[ $WM_PROJECT_VERSION == v1606+ || $WM_PROJECT_VERSION == v1612+ || $WM_PROJECT_VERSION == v1706 || $WM_PROJECT_VERSION == 2.4.* || ($WM_PROJECT_VERSION == \"3.2\" && $WM_FORK == \"extend\") ]]; then\n                rmdepall\n            else\n                wrmdep\n            fi\n            wclean    \n    done\n\n    #**********************************************\n    #cleaning logs\n    rm $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/log/log_*\n}\n#==================================#\n\n#==================================#\n#- function to clean CFDEMcoupling case\n\ncleanCFDEMcase()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    casepath=\"$1\"\n    keepDEMrestart=\"$2\"\n    keepCFDmesh=\"$3\"\n    #--------------------------------------------------------------------------------#\n\n    echo \"deleting data at: $casePath ? otherwise press Ctrl-C:\\n\"\n    read\n    source $WM_PROJECT_DIR/bin/tools/CleanFunctions\n    #CFD\n    cd $casePath/CFD\n    if [[ $keepCFDmesh == true ]]; then\n        echo \"keeping CFD mesh files\"\n        cp -r constant/polyMesh constant/polyMesh_backup\n        cleanCase\n        mv constant/polyMesh_backup constant/polyMesh\n        rm -r constant/polyMesh_backup\n    else\n        echo \"deleting CFD mesh files\"\n        cleanCase\n    fi\n\n    #CFDEM\n    rm -r $casePath/CFD/clockData\n    rm -r $casePath/CFD/particleProbes\n    rm -r $casePath/CFD/averageProps/\n    rm -r $casePath/CFD/octave/octave-core\n    rm -r $casePath/CFD/octave/octave-workspace\n    rm -r $casePath/remotePlace\n    rm -r $casePath/CFD/oldProcDirs\n    rm -r $casePath/CFD/tmp.balance\n    rm $casePath/CFD/callgrind.out.*\n    rm -r $casePath/CFD/hpctoolkit-*\n    rm -r $casePath/CFD/warnings.liggghts\n    rm  $casePath/log_*\n    #DEM\n    rm $casePath/DEM/post/*\n    touch $casePath/DEM/post/.gitignore\n    if [[ $keepDEMrestart == true ]]; then\n        echo \"keeping DEM restart files\"\n    else\n    rm  $casePath/DEM/post/restart/*\n    fi\n    touch $casePath/DEM/post/restart/.gitignore\n    rm  $casePath/DEM/tmp.lammps.variable\n    rm  $casePath/DEM/log*\n    rm  $casePath/DEM/.portOffset.txt\n    #ParScale\n    rm $casePath/CFD/*.dat\n    rm $casePath/CFD/*.pascal\n    rm $casePath/CFD/*.profile\n    rm -r $casePath/CFD/pascal/0.*\n    rm -r $casePath/CFD/pascal/1\n    rm -r $casePath/CFD/pascal/1.*\n    rm -r $casePath/CFD/pascal/2\n    rm -r $casePath/CFD/pascal/2.*\n    rm -r $casePath/CFD/pascal/3\n    rm -r $casePath/CFD/pascal/3.*\n    rm -r $casePath/CFD/pascal/4\n    rm -r $casePath/CFD/pascal/4.*\n    rm -r $casePath/CFD/pascal/5\n    rm -r $casePath/CFD/pascal/5.*\n    rm -r $casePath/CFD/pascal/6\n    rm -r $casePath/CFD/pascal/6.*\n    rm -r $casePath/CFD/pascal/7\n    rm -r $casePath/CFD/pascal/7.*\n    rm -r $casePath/CFD/pascal/8\n    rm -r $casePath/CFD/pascal/8.*\n    rm -r $casePath/CFD/pascal/9\n    rm -r $casePath/CFD/pascal/9.*\n    rm -r $casePath/CFD/pascal/10\n    rm -r $casePath/CFD/pascal/10.*\n    cd $casePath\n    echo \"done\"\n}\n\n#==================================#\n#- function to run a DEM case\n\nDEMrun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    solverName=\"$5\"\n    debugMode=\"$6\"\n    #--------------------------------------------------------------------------------#\n\n    if [[ $debugMode == \"on\" ]]; then\n        debugMode=\"valgrind\"\n    elif [[ $debugMode == \"strict\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --track-origins=yes --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes\"  \n    elif [[ $debugMode == \"strictXML\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --leak-check=yes --leak-check-heuristics=stdstring,length64,newarray,multipleinheritance --show-reachable=no --num-callers=20 --track-fds=yes --xml=yes --xml-file=valgrind.xml\"  \n    else\n        debugMode=\"\"\n    fi\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath/DEM\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- run applictaion\n    $debugMode $CFDEM_LIGGGHTS_EXEC -in $solverName 2>&1 | tee -a $logpath/$logfileName\n\n    #- keep terminal open (if started in new terminal)\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to detect MPI variant\n\nget_mpirun_cmd()\n{\n    is_openmpi=`mpirun -version | grep \"Open MPI\" | wc -l`\n    # Open MPI (version > 3) no longer allows oversubscription by default, we do want that though\n    if [[ $is_openmpi == 1 ]]; then\n        echo \"mpirun -oversubscribe\"\n    else\n        echo \"mpirun\"\n    fi\n}\n#==================================#\n\n#==================================#\n#- function to run a DEM case in parallel\n\nparDEMrun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    solverName=\"$5\"\n    nrProcs=\"$6\"\n    machineFileName=\"$7\"\n    debugMode=\"$8\"\n    #--------------------------------------------------------------------------------#\n\n    if [[ $debugMode == \"on\" ]]; then\n        debugMode=\"valgrind\"\n    elif [[ $debugMode == \"strict\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --track-origins=yes --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes\"  \n    elif [[ $debugMode == \"strictXML\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --leak-check=yes --leak-check-heuristics=stdstring,length64,newarray,multipleinheritance --show-reachable=no --num-callers=20 --track-fds=yes --xml=yes --xml-file=valgrind.xml\"  \n    else\n        debugMode=\"\"\n    fi\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath/DEM\n\n    #- header\n    echo 2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- detect mpi variant and set oversubscribe flag if open mpi\n    MPIRUN_CMD=`get_mpirun_cmd`\n\n    #- run applictaion\n    if [[ $machineFileName == \"none\" ]]; then\n        $MPIRUN_CMD -np $nrProcs $debugMode $CFDEM_LIGGGHTS_EXEC -in $solverName 2>&1 | tee -a $logpath/$logfileName\n    else\n        $MPIRUN_CMD -machinefile $machineFileName -np $nrProcs $debugMode $CFDEM_LIGGGHTS_EXEC -in $solverName 2>&1 | tee -a $logpath/$logfileName\n    fi\n\n    #- keep terminal open (if started in new terminal)\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to run a CFD case\n\nCFDrun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    solverName=\"$5\"\n    debugMode=\"$6\"\n    #--------------------------------------------------------------------------------#\n\n    if [[ $debugMode == \"on\" ]]; then\n        debugMode=\"valgrind\"\n    else\n        debugMode=\"\"\n    fi\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath/CFD\n\n    #- header\n    echo 2>&1 | tee -a /$logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- clean up case\n    #rm couplingFiles/*\n\n    #- run applictaion\n    $debugMode $solverName 2>&1 | tee -a $logpath/$logfileName\n\n    #- keep terminal open (if started in new terminal)\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to run a CFD case in parallel   !!!NOT DEBUGGED!!!\nparCFDrun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    solverName=\"$5\"\n    nrProcs=\"$6\"\n    machineFileName=\"$7\"\n    debugMode=\"$8\"\n    #--------------------------------------------------------------------------------#\n\n    if [[ $debugMode == \"on\" ]]; then\n        debugMode=\"valgrind\"\n    else\n        debugMode=\"\"\n    fi\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath\n\n    #- remove old data\n    rm -rf processor*\n\n    #- decompose case\n    decomposePar\n\n    #- make proc dirs visible\n    count=0\n    for i in `seq $nrProcs`\n    do\n        let count=$i-1\n        (cd $casePath/processor$count && touch file.foam)\n    done\n\n    #- header\n    echo 2>&1 | tee -a /$logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- detect mpi variant and set oversubscribe flag if open mpi\n    MPIRUN_CMD=`get_mpirun_cmd`\n\n    #- run applictaion\n    if [[ $machineFileName == \"none\" ]]; then\n        $MPIRUN_CMD -np $nrProcs $debugMode $solverName -parallel 2>&1 | tee -a $logpath/$logfileName\n    else\n        $MPIRUN_CMD -machinefile $machineFileName -np $nrProcs $debugMode $solverName -parallel 2>&1 | tee -a $logpath/$logfileName\n    fi\n\n    #- keep terminal open (if started in new terminal)\n    #read\n}\n#==================================#\n\n#==================================#\n#- function to run a parallel CFD-DEM case\n\nparCFDDEMrun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    solverName=\"$5\"\n    nrProcs=\"$6\"\n    machineFileName=\"$7\"\n    debugMode=\"$8\"\n    separateDEM=\"$9\"\n    reconstuctCase=${10}\n    decomposeCase=${11}\n    remoteStorageLocation=${12}\n    #--------------------------------------------------------------------------------#\n\n    if [[ $debugMode == \"on\" ]]; then\n        debugMode=\"valgrind\"\n    elif [[ $debugMode == \"strict\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --track-origins=yes --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes\"\n    elif [[ $debugMode == \"strictXML\" ]]; then\n        #debugMode=\"valgrind --leak-check=full -v --trace-children=yes --track-origins=yes\" \n        debugMode=\"valgrind --tool=memcheck --leak-check=yes --leak-check-heuristics=stdstring,length64,newarray,multipleinheritance --show-reachable=no --num-callers=20 --track-fds=yes --xml=yes --xml-file=valgrind.xml\"  \n    elif [[ $debugMode == \"profile\" ]]; then\n        if [[ $WM_COMPILE_OPTION == \"Debug\" ]]; then\n            # make sure you did hpcstruct before\n            debugMode=\"hpcrun\"\n            rm -r $casePath/CFD/hpctoolkit-$solverName-measurements\n        else\n            echo \"\"\n            echo \"WARNING - you do not use proper Debug flags! (for hpcrun you need Debug)\"\n            echo \"using debugMode off now.\"\n            debugMode=\"\"\n            read\n        fi\n    elif [[ $debugMode == \"callgrind\" ]]; then\n        if [[ $WM_COMPILE_OPTION == \"Debug\" ]]; then\n            debugMode=\"valgrind --tool=callgrind\"\n        else\n            echo \"\"\n            echo \"WARNING - you do not use proper Debug flags! Only when using debug, cachegrind will be able to look through you code.\"\n            debugMode=\"valgrind --tool=callgrind\"\n            read\n        fi\n\n    else\n        debugMode=\"\"\n    fi\n\n    #- clean up old log file\n    rm $logpath/$logfileName\n\n    #- change path\n    cd $casePath/CFD\n\n    #- decompose case\n    if [[ $decomposeCase == \"false\" ]]; then   \n        echo \"Not decomposing case.\"\n    else\n        echo \"Decomposing case.\"\n        decomposePar -force\n\n        if [[ $remoteStorageLocation == \"false\" || $remoteStorageLocation == \"\" ]]; then\n            echo \"do nothing.\"\n        else\n            echo \"do links\"\n            linkProcDirs $remoteStorageLocation\n        fi\n    fi\n\n    #- make proc dirs visible\n    count=0\n    for i in `seq $nrProcs`\n    do\n        let count=$i-1\n        (cd $casePath/CFD/processor$count && touch file.foam)\n    done\n\n    #- header\n    echo 2>&1 | tee -a /$logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- write path\n    pwd 2>&1 | tee -a $logpath/$logfileName\n    echo 2>&1 | tee -a $logpath/$logfileName\n\n    #- clean up case\n    rm couplingFiles/*\n\n    #- detect mpi variant and set oversubscribe flag if open mpi\n    MPIRUN_CMD=`get_mpirun_cmd`\n\n    #- run DEM application (if separate)\n    if [[ $separateDEM == \"false\" || $separateDEM == \"\" ]]; then\n        echo \"no separate DEM run.\"\n    else\n        #gnome-terminal --title='separate DEM' -e \"bash $casePath/DEMrun.sh\"\n        #source $casePath/DEMrun.sh &\n        parDEMrun $logpath $logfileName\"_DEM\" $casePath $headerText $separateDEM $nrProcs $machineFileName $debugMode&\n    fi    \n\n    #- run CFD application\n    if [[ $machineFileName == \"none\" ]]; then\n        $MPIRUN_CMD -np $nrProcs $debugMode $solverName -parallel 2>&1 | tee -a $logpath/$logfileName\n\n        #- reconstruct case\n        if [[ $reconstuctCase == \"true\" ]]; then   \n            #pseudoParallelRun \"reconstructPar\" $nrProcs\n            reconstructPar -noLagrangian\n        fi\n    else\n        $MPIRUN_CMD -machinefile $machineFileName -np $nrProcs $debugMode $solverName -parallel 2>&1 | tee -a $logpath/$logfileName\n\n        #- reconstruct case\n        if [[ $reconstuctCase == \"true\" ]]; then   \n            #pseudoParallelRun \"reconstructPar\" $nrProcs\n            reconstructPar -noLagrangian\n        fi\n    fi\n\n    if [[ $debugMode == \"hpcrun\" ]]; then\n        if [ -f $CFDEM_APP_DIR/$solverName.hpcstruct ]; then\n            rm -r hpctoolkit-$solverName-database*\n            hpcprof -S $CFDEM_APP_DIR/$solverName.hpcstruct -I ./'*' hpctoolkit-$solverName-measurements\n        else\n            echo \"you need to run hpcstruct first for your app!\"\n            read\n        fi   \n    fi\n\n    #- keep terminal open (if started in new terminal)\n    #read\n}\n#==================================#\n\n\n#==================================#\n#- function to collect results from \n#- logfiles to one log file\n\ncollectLog()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    headerText=\"$4\"\n    nrOfLines=\"$5\"\n    #--------------------------------------------------------------------------------#\n\n    echo  2>&1 | tee -a $logpath/$logfileName\n    echo \"//   $headerText   //\" 2>&1 | tee -a $logpath/$logfileName\n    tail --lines=$nrOfLines $casePath |cut -d \" \" -f1- 2>&1 | tee -a $logpath/$logfileName\n}\n#==================================#\n\n#==================================#\n#- function to collect results from \n#- logfiles to one log file\n\ncollectLogCFDEMcoupling_sol()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    #--------------------------------------------------------------------------------#\n    # read name of solver\n    SOLVERNAME=$(basename $casePath)\n    \n    # read last line of log\n    LASTLINE=`tac $logpath/$logfileName | egrep -m 1 .`\n    LASTSTRING=`echo ${LASTLINE##* }`\n    LASTWORD=$(basename $LASTSTRING)\n\n    # log if compilation was success  \n    if [[ $LASTWORD == $SOLVERNAME || $LASTWORD == \"date.\" || ${LASTWORD: -3} == \".so\" ]]; then\n        echo \"$SOLVERNAME\" >> $logpath/log_compile_results_sol_success\n    else\n        echo \"$SOLVERNAME\" >> $logpath/log_compile_results_sol_fail\n    fi\n}\n\ncollectLogCFDEMcoupling_src()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    casePath=\"$3\"\n    #--------------------------------------------------------------------------------#\n    # read name of solver\n    SOLVERNAME=$(basename $casePath)\n    \n    # read last line of log\n    LASTLINE=`tac $logpath/$logfileName | egrep -m 1 .`\n    LASTSTRING=`echo ${LASTLINE##* }`\n    LASTWORD=$(basename $LASTSTRING)\n\n    # log if compilation was success  \n    if [[ $LASTWORD == $SOLVERNAME || ${LASTWORD: -3} == \".so\" ]]; then\n        echo \"$SOLVERNAME\" >> $logpath/log_compile_results_src_success\n    else\n        echo \"$SOLVERNAME\" >> $logpath/log_compile_results_src_fail\n    fi\n}\n#==================================#\n\n#==================================#\n#- function to replace a line in a file where text consecutive\n#  the old line must look like: oldWord\n#  and will be replaced by: newWord\n\nreplaceLineInFile()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    filePath=\"$3\"\n    oldWord=\"$4\"       # give text only until first \"/\"\n    newWord=\"$5\"\n    #--------------------------------------------------------------------------------#\n\n    #- adapt /etc/bashrc\n    echo \"replaceLineInFile $filePath\" 2>&1 | tee -a $logpath/$logfileName\n    sed \"/$oldWord/ c\\ $newWord\" $filePath > $filePath\"2\"  2>&1 | tee -a $logpath/$logfileName\n    cp $filePath\"2\" $filePath  2>&1 | tee -a $logpath/$logfileName\n    rm $filePath\"2\"  2>&1 | tee -a $logpath/$logfileName\n}\n#==================================#\n\n#==================================#\n#- function to replace a line in a file where text is separated by one blank\n#  the old line must look like: oldWord1 oldWord2\n#  and will be replaced by: newWord1 newWord2\n\nreplaceSeparatedLineInFile()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$1\"\n    logfileName=\"$2\"\n    filePath=\"$3\"\n    oldWord1=\"$4\"\n    oldWord2=\"$5\"\n    newWord1=\"$6\"\n    newWord2=\"$7\"\n    #--------------------------------------------------------------------------------#\n\n    #- adapt /etc/bashrc\n    echo \"replaceLineInFile $filePath\" 2>&1 | tee -a $logpath/$logfileName\n    sed \"/$oldWord1 $oldWord2/ c\\ $newWord1 $newWord2\" $filePath > $filePath\"2\"  2>&1 | tee -a $logpath/$logfileName\n    cp $filePath\"2\" $filePath  2>&1 | tee -a $logpath/$logfileName\n    rm $filePath\"2\"  2>&1 | tee -a $logpath/$logfileName\n}\n#==================================#\n\n#=======================================#\n#- script to run a function in pseudo-parallel\n#  several runs of the function are started \n#  simultanously. Only makes sense on shared memory sys\n#  based on script by K. Wardle 6/22/09\n#  published at CFDonline forum\n\npseudoParallelRun()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    appname=$1\n    njobs=$2\n    outputfile=\"log.$appname\"\n    #--------------------------------------------------------------------------------#\n\nif [[ -z \"$njobs\" ]]; then \n   echo \"\"\n   echo \"  K. Wardle 6/22/09\"\n   echo \"  bash script to run reconstructPar (or other fct) in pseudo-parallel mode\"\n   echo \"  by breaking time directories into multiple ranges\"\n   echo \"\" \n   echo \"  USAGE: appname <NP> <outputfile>   [output file is optional] \"\n   echo \"\"\n   exit\nfi\n\n\nappflag=\"-noZero\"\n\n#let njobs1=$njobs+1  \necho \"running $appname $appflag in pseudo-parallel mode on $njobs processors\"\n\n#count the number of time directories\nnsteps=`ls -d processor0/[0-9]*/ | wc -l`\necho \"do $appname on $nsteps time directories\"\n##nsteps=`ls processor0 | wc -l`\n#echo \"nsteps= $nsteps\"\n#let nsteps=$nsteps1-1\n\nlet nchunk=$nsteps/$njobs+1\n#echo \"nchunk = $nchunk\"\n\n#find max time\ntmin=`ls processor0 | sort -nr | tail -1`\n#echo \"tmin = $tmin\"\ntmax=`ls processor0 | sort -nr | head -1`\n#echo \"tmax = $tmax\"\n\necho \"making temp dir\"\ntempdir=\"temp.par$appname\"\nmkdir $tempdir\n\ntstart=$tmin\np=p\n\nfor i in `seq $njobs`\ndo\n  let nn=$i*$nchunk\n  tstop=`ls processor0 | sed -n $nn$p`\n  if [[ $i == $njobs ]] \n\tthen\n\ttstop=$tmax\n  fi\n  \n  echo \"Starting Job $i - $appname time = $tstart through $tstop\"\n  `$appname $appflag -time \"$tstart:$tstop\" > $tempdir/output-$tstop &`\n  \n  let nn=$nn+1\n  tstart=`ls processor0 | sed -n $nn$p`  \ndone\n\n#sleep until jobs finish\n#if number of jobs > njobs, hold loop until job finishes\nnmore_old=`echo 0`\nuntil [ `ps -C $appname | wc -l` -eq 1 ]; \n  do \n    sleep 10\n##    n1=`ps -C $appname | wc -l`\n##    let n2=$n1-1\n    nnow=`ls -d [0-9]*/ | wc -l` ##count time directories in case root dir, this will include 0\n    let nmore=$nsteps-$nnow+1 ##calculate number left to reconstruct and subtract 0 dir\n    if [[ $nmore != $nmore_old ]]\n      then\n      echo \"$nmore directories remaining...\"\n    fi\n    nmore_old=$nmore\n  done\n\n#combine and cleanup\nif [[ -n \"$outputfile\" ]] \n  then\n#check if output file already exists\n  if [ -e \"$outputfile\" ] \n  then\n    echo \"output file $outputfile exists, moving to $outputfile.bak\"\n    mv $outputfile $outputfile.bak\n  fi\n\n  echo \"cleaning up temp files\"\n  for i in `ls $tempdir`\n  do\n    cat $tempdir/$i >> $outputfile\n  done\nfi\n\nrm -rf $tempdir\n\necho \"finished\"\n\n}\n#==================================#\n#- function make a tar.gz copy with date tag from a directory\n#  Remove the original directory\n\nbackupRemoveDir()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    filePath=\"$1\"\n    backupPath=\"$2\"\n    date=\"$3\"\n    #--------------------------------------------------------------------------------#\n    echo \"creating dirctory :\\n $filePath\"\"-until\"\"$date\\n\"\n    mkdir $filePath\"-until\"$date\n    echo \"move : $filePath/* to\\n $filePath\"\"-until\"\"$date\\n and tar.gz\"\n    mv $filePath/* $filePath\"-until\"$date\n    tar czvf  $filePath\"-until\"$date.tar.gz $filePath\"-until\"$date\n    rm -r $filePath\"-until\"$date\n    mv $filePath\"-until\"$date.tar.gz $backupPath\n}\n\n#==================================#\n#- function make a tar.gz copy with date tag from a directory\n#  Keep the original directory\n\nbackupDir()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    filePath=\"$1\"\n    backupPath=\"$2\"\n    date=\"$3\"\n    #--------------------------------------------------------------------------------#\n    echo \"creating dirctory :\\n $filePath\"\"-until\"\"$date\\n\"\n    mkdir $filePath\"-until\"$date\n    echo \"move : $filePath/* to\\n $filePath\"\"-until\"\"$date\\n and tar.gz\"\n    cp -r $filePath/* $filePath\"-until\"$date\n    tar czvf  $filePath\"-until\"$date.tar.gz $filePath\"-until\"$date\n    rm -r $filePath\"-until\"$date\n    mv $filePath\"-until\"$date.tar.gz $backupPath\n}\n\n#========================================#\n#- function to check if a directory exits\ncheckDir()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    filePath=\"$1\"\n    #--------------------------------------------------------------------------------#\n    if [ -d \"$filePath\" ]; then\n         echo \"true\" \n    else\n        echo \"false\" \n    fi\n}\n\n#========================================#\n#- function to check if a directory exits\ncheckDirComment()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    filePath=\"$1\"\n    varName=\"$2\"\n    critical=\"$3\"\n    #--------------------------------------------------------------------------------#\n    if [ $(checkDir $filePath) == \"true\" ]; then\n         echo \"valid:yes critical:$critical - $varName = $filePath\" \n    else\n        echo \"valid:NO  critical:$critical - $varName = $filePath does not exist\" \n    fi\n}\n\n#========================================#\n#- function to check if a variable exits\ncheckEnv()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    var=\"$1\"\n    #--------------------------------------------------------------------------------#\n    if [[ $var == \"\" ]]; then\n        echo \"false\"\n    else\n        echo \"true\"\n    fi\n}\n\n#========================================#\n#- function to check if a variable exits\ncheckEnvComment()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    var=\"$1\"\n    varName=\"$2\"\n    critical=\"$3\"\n    #--------------------------------------------------------------------------------#\n    if [ $(checkEnv $var) == \"true\" ]; then\n         echo \"valid:yes critical:$critical - $varName = $var\" \n    else\n        echo \"valid:NO  critical:$critical - $varName = $var variable not set!\" \n    fi\n}\n\n#========================================#\n#- function to print a header to terminal\nprintHeader()\n{\n    echo \"\"\n    echo \"*********************************************\"\n    echo \"* C F D E M (R) c o u p l i n g             *\"\n    echo \"*                                           *\"\n    echo \"* by DCS Computing GmbH                     *\"\n    echo \"* www.dcs-computing.com                     *\"\n    echo \"*********************************************\"\n    echo \"\" \n}\n\n#========================================#\n#- track memory usage\ntrackMem()\n{\n\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    appname=\"$1\"\n    fileName=\"$2\"\n    #--------------------------------------------------------------------------------#\n\n    rm $fileName\n\n    echo \"please use only the the first 15  strings of the command !!!\"\n\n    /usr/bin/printf \"%-6s %-9s %s\\n\" \"PID\" \"Total\" \"Command\" >> $fileName\n    /usr/bin/printf \"%-6s %-9s %s\\n\" \"---\" \"-----\" \"-------\" >> $fileName\n\n    for PID in $(/bin/ps -e | /usr/bin/awk '$1 ~ /[0-9]+/ { print $1 }')\n    do\n        CMD=$(/bin/ps -o comm -p $PID | /usr/bin/tail -1)\n\n        if [[ $CMD == $appname ]]\n            then\n\n            TOTAL=$(/usr/bin/pmap $PID 2>/dev/null | /usr/bin/tail -1 | /usr/bin/awk '{ print $2 }')\n            [ -n \"$TOTAL\" ] && /usr/bin/printf \"%-6s %-9s %s\\n\" \"$PID\" \"$TOTAL\" \"$CMD\"\n        fi\n    done | /usr/bin/sort -n -k2 >> $fileName\n}\n\n#========================================#\n#- remove brackets from file\nremoveBracketsFromFile()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    oldFileName=\"$1\"\n    overwrite=\"$2\"\n    #--------------------------------------------------------------------------------#\n\n    if [[ $overwrite == \"true\" ]]\n    then\n        sed -i 's/[(,)]//g' $oldFileName\n    else\n        newFileName=\"$oldFileName\"\"_noBrackets\"\n        sed -e 's/[(,)]//g' $oldFileName > $newFileName\n    fi\n}\n\n#========================================#\n#- remove brackets from file\nlinkProcDirs()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    remoteDir=\"$1\"\n    #--------------------------------------------------------------------------------#\n\n    # check remote directory exist\n    if [[ -d \"$remoteDir\" ]]\n    then\n        echo \"  $remoteDir exists - **check**\"\n    else\n        Fatal \"ERROR: remote directory does not exist: $remoteDir\"\n    fi\n\n    # check case is decomposed\n    if [[ -d \"processor0\" ]]\n    then\n        echo \"  case is decomposed - **check**\"\n    else\n        Fatal \"ERROR: case is NOT decomposed - please do so and run again.\"\n    fi\n\n    # check CFD dir exists at remote location\n    if [[ -d $remoteDir/CFD ]]\n    then\n        Fatal \"ERROR: there is (!) a dir called CFD at $remoteDir - please rename it and run again.\"\n    else\n        echo \"  there is no dir called CFD at $remoteDir - **check**\"\n    fi\n\n    # create a dir CFD at remoteDir\n    mkdir $remoteDir/CFD\n\n    # create a backup dir oldProcDirs\n    mkdir oldProcDirs\n\n    # check if oldProcDirs is empty\n    if [[ -d oldProcDirs/processor0 ]]\n    then\n        Fatal \"ERROR: ./oldProcDirs is not empty - please clean up and run again.\"\n    else\n        echo \"  ./oldProcDirs is empty - **check**\"\n    fi\n\n    # moving proc dirs to oldProcsDir (backup)\n    cp -r processor* $remoteDir/CFD\n    mv processor* oldProcDirs\n\n    # create a link to remote proc dirs\n    counter=0\n    for procDir in $remoteDir/CFD/*/; do\n        ln -s $remoteDir/CFD/processor$counter processor$counter\n        counter=$[counter + 1]\n    done\n\n    # create a link to postProcessing dir\n    mkdir postProcessing\n    mv postProcessing $remoteDir/CFD\n    ln -s $remoteDir/CFD/postProcessing postProcessing\n\n    # success\n    echo \"linking was successful\"\n}\n\n#========================================#\n#- function to enable a LIGGGHTS package\nenableLiggghtsPackage()\n{\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    pkgName=\"$1\"\n    whitelist=\"$CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/package-liggghts-list.txt\"\n    #--------------------------------------------------------------------------------#\n\n    if [ ! -f \"$CWD/$whitelist\" ];then\n        echo \"$whitelist does not exist in $CWD. Nothing will be done.\"\n        NLINES=0\n        COUNT=0\n    else\n        NLINES=`wc -l < $CWD/$whitelist`\n        COUNT=0\n    fi\n\n\t\tfound=false\n    while [ $COUNT -lt $NLINES ]\n    do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                LINE=$(echo \"${LINE%????}\")\n\t\t\t\t\t\t\t\techo \"$LINE\"\n\t\t\t\t\t\t\t\tif [[ \"$LINE\" == \"$pkgName\" ]]; then\n\t\t\t\t\t\t\t\t\t\techo \"Package $pkgName already enabled\"\n\t\t\t\t\t\t\t\t\t\tfound=true\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tfi\n            fi\n    done\n\n\t\tif [ $found = false ]; then\n\t\t\t\techo \"Package $pkgName not found - add it to list\"\n\t\t\t\techo $pkgName\"/dir\" >> $CWD/$whitelist\n\t\tfi\n}\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/library-liggghts-list.txt",
    "content": "#syntax: makefileName/dir\n#note: dir is not a path, just a keyword here\n###############################################\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/library-list.txt",
    "content": "lagrangian/cfdemParticle/dir\neulerian/scalarTransportModelsCFDEM/dir\neulerian/fvOptionsCFDEM/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/package-liggghts-list.txt",
    "content": "#syntax: packageName/dir\n#note: dir is not a path, just a keyword here\n###############################################\n#POEMS/dir\n#PASCAL/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/package-undo-liggghts-list.txt",
    "content": "#syntax: packageName/dir\n#note: dir is not a path, just a keyword here\n###############################################\nPOEMS/dir\nDIPOLE/dir\nASPHERE/dir\nPASCAL/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/pullLIGGGHTS.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# pull routine for LIGGGHTS, part of CFDEMproject \n# Christoph Goniva - August. 2013, DCS Computing GmbH\n#===================================================================\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\nlogDir=\"log\"\n\ncd $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc\nmkdir -p $logDir\n\n#--------------------------------------------------------------------------------#\n#- define variables\nlogpath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")/$logDir\"\nlogfileName=\"log_pullLIGGGHTS\"\ncasePath=\"$CFDEM_LIGGGHTS_SRC_DIR\"\nheaderText=\"$logfileName\"\"-$NOW\"\n#--------------------------------------------------------------------------------#\n\npullRepo $logpath $logfileName $casePath $headerText\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/solver-list.txt",
    "content": "cfdemSolverPiso/dir\ncfdemSolverIB/dir\ncfdemSolverPisoScalar/dir\ncfdemSolverPisoSTM/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/testTutorials.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# script to run the basic examples\n# Christoph Goniva - June 2012, DCS Computing GmbH\n#===================================================================#\n\nwhitelist=\"tutorial-list.txt\"\n\nCWD=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nNOW=\"$(date +\"%Y-%m-%d-%H:%M\")\"\n\necho \"\"\necho \"This routine will execute the CFDEMcoupling tutorial cases specified in tutorial-list.txt\"\necho \"\"\necho \"Are the variables CFDEM_TUT_DIR=$CFDEM_TUT_DIR\"\necho \"and CFDEM_SRC_DIR=$CFDEM_SRC_DIR correct? (y/n)\"\nread YN\nif [ \"$YN\" != \"y\" ];then\n  \techo \"Aborted by user.\"\n  \texit 1\nfi\n\necho \"\"\necho \"Please provide the examples to be calculated in the $CWD/$whitelist file.\"\necho \"structure:\"\necho \"path  to provide the path relative to CFDEM_TUT_DIR\"\necho \"\"\necho \"example:\"\necho \"cfdemSolverPiso/settlingTestMPI/dir\"\necho \"\"\n\nif [ ! -f \"$CWD/$whitelist\" ];then\n    echo \"$whitelist does not exist in $CWD\"\nelse\n    NLINES=`wc -l < $CWD/$whitelist`\n    COUNT=0\n\n    for masterLogFile in \"$masterLogName\" #\"$masterLogName\"\"_valgrind\" \n    do\n\n        while [ $COUNT -lt $NLINES ]\n        do\n            let COUNT++  \n            LINE=`head -n $COUNT $CWD/$whitelist | tail -1`\n  \n            # white lines\n            if [[ \"$LINE\" == \"\" ]]; then\n                continue\n            # comments\n            elif [[ \"$LINE\" == \\#* ]]; then\n                continue\n             # paths\n            elif [[ \"$LINE\" == */dir ]]; then\n                echo \"change path\"\n                LINE=$(echo \"${LINE%????}\")\n                path=\"$CFDEM_TUT_DIR/$LINE\"\n                cd $path\n                #continue\n            fi\n\n            #- execute tutorial\n            echo \"running testcase $path\"\n            bash Allrun.sh\n\n            echo \"did the case run correcty? - press enter to proceed.\"\n            read\n        done\n    done\nfi\n\n## run pvg tool on logfile\n#cd $CWD\n#grep \"==\" \"$masterLogName\"\"_valgrind\" > parallel_\"$masterLogName\"\"_valgrind\"\n\n## sort by first arg (+0 -0) and disable last resort comparison (-s)\n## so sorted by first arg only\n#sort +0 -0 -s parallel_\"$masterLogName\"\"_valgrind\" > tmp\n#mv tmp parallel_\"$masterLogName\"\"_valgrind\"\n\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/tutorial-list.txt",
    "content": "#===================================================================#\n# This file specifies the example cases being executed by\n# .../etc/testTutorial.sh , which can be run with the alias\n# cfdemTestTUT\n# Christoph Goniva - June. 2011, DCS Computing GmbH\n#===================================================================#\n\ncfdemPostproc/fillCylinder/dir\ncfdemSolverPiso/settlingTestMPI/dir\ncfdemSolverPiso/ErgunTestMPI/dir\ncfdemSolverPiso/ErgunTestMPI_cgs/dir\ncfdemSolverPiso/ErgunTestMPI_restart/dir\ncfdemSolverPiso/periodicChannel/dir\ncfdemSolverPiso/voidfractionTest/dir\ncfdemSolverIB/twoSpheresGlowinskiMPI/dir\ncfdemSolverPisoScalar/packedBedTemp/dir\ncfdemSolverPisoSTM/packedBedTemp/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/etc/utilities-list.txt",
    "content": "cfdemPostproc/dir\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/IOModel/IOModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"IOModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(IOModel, 0);\n\ndefineRunTimeSelectionTable(IOModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nint IOModel::dumpDEMdata() const\n{\n    return -1;\n}\n\nbool IOModel::dumpNow() const\n{\n    //bool dmp(false);\n    //if (time_.value()+SMALL > time_.endTime().value()-time_.deltaT().value() || time_.outputTime())\n    //    dmp=true;\n\n    return time_.outputTime();\n}\n\nfileName IOModel::createTimeDir(fileName path) const\n{\n    fileName timeDirPath(path/time_.timeName());\n    mkDir(timeDirPath,0777);\n    return timeDirPath;\n}\n\nfileName IOModel::createLagrangianDir(fileName path) const\n{\n    fileName lagrangianDirPath(path/\"lagrangian\");\n    mkDir(lagrangianDirPath,0777);\n    fileName cfdemCloudDirPath(lagrangianDirPath/\"cfdemCloud1\");\n    mkDir(cfdemCloudDirPath,0777);\n    return cfdemCloudDirPath;\n}\n\nfileName IOModel::buildFilePath(word dirName) const\n{\n    // create file structure\n\tfileName path(\"\");\n    if(parOutput_)\n    {\n    \tpath=fileName(particleCloud_.mesh().time().path()/particleCloud_.mesh().time().timeName()/dirName/\"particleCloud\");\n    \tmkDir(path,0777);\n    } else\n    {\n\t\tpath=fileName(\".\"/dirName);\n    \tmkDir(path,0777);\n    \tmkDir(fileName(path/\"constant\"),0777);\n    \tOFstream* stubFile = new OFstream(fileName(path/\"particles.foam\"));\n    \tdelete stubFile;\n        }\n    return path;\n}\n\nvoid IOModel::streamDataToPath(fileName path, double** array,int nPProc,word name,word type,word className,word finaliser) const\n{\n    vector vec;\n    OFstream* fileStream = new OFstream(fileName(path/name));\n    *fileStream << \"FoamFile\\n\";\n    *fileStream << \"{version 2.0; format ascii;class \"<< className << \"; location 0;object  \"<< name <<\";}\\n\";\n    *fileStream << nPProc <<\"\\n\";\n\n    *fileStream << \"(\\n\";\n\n    for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)\n    {\n        if (particleCloud_.cfdemCloud::cellIDs()[index][0] > -1) // particle Found\n        {\n            if (type==\"scalar\"){\n                *fileStream << array[index][0] << \" \\n\";\n            }else if (type==\"position\" || type==\"vector\"){\n                for(int i=0;i<3;i++) vec[i] = array[index][i];\n                *fileStream <<\"( \"<< vec[0] <<\" \"<<vec[1]<<\" \"<<vec[2]<<\" ) \"<< finaliser << \" \\n\";\n            }\n        }\n    }\n\n    *fileStream << \")\\n\";\n    delete fileStream;\n}\n\nvoid IOModel::streamDataToPath(fileName path, int** array,int nPProc,word name,word type,word className,word finaliser) const\n{\n    vector vec;\n    OFstream* fileStream = new OFstream(fileName(path/name));\n    *fileStream << \"FoamFile\\n\";\n    *fileStream << \"{version 2.0; format ascii;class \"<< className << \"; location 0;object  \"<< name <<\";}\\n\";\n    *fileStream << nPProc <<\"\\n\";\n\n    *fileStream << \"(\\n\";\n\n    for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)\n    {\n        if (particleCloud_.cfdemCloud::cellIDs()[index][0] > -1) // particle Found\n        {\n            if (type==\"scalar\"){\n                *fileStream << array[index][0] << \" \\n\";\n            }else if (type==\"position\" || type==\"vector\"){\n                for(int i=0;i<3;i++) vec[i] = array[index][i];\n                *fileStream <<\"( \"<< vec[0] <<\" \"<<vec[1]<<\" \"<<vec[2]<<\" ) \"<< finaliser << \" \\n\";\n            }\n        }\n    }\n\n    *fileStream << \")\\n\";\n    delete fileStream;\n}\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nIOModel::IOModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    time_(sm.mesh().time()),\n    parOutput_(true)\n{\n\tif (\n            particleCloud_.dataExchangeM().myType()==\"oneWayVTK\" ||\n            dict_.found(\"serialOutput\")\n       )\n    {\n        parOutput_=false;\n        Warning << \"IO model is in serial write mode, only data on proc 0 is written\" << endl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nIOModel::~IOModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/IOModel/IOModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    IOModel\n\nSourceFiles\n    IOModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef IOModel_H\n#define IOModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"OFstream.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class IOModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass IOModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        const Time& time_;\n\n        bool parOutput_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"IOModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            IOModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        IOModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~IOModel();\n\n\n    // Selector\n\n        static autoPtr<IOModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Functions\n\n    virtual int dumpDEMdata() const;\n\n    virtual void allocFieldsToDEM() const { /* do nothing */ };\n\n    bool dumpNow() const;\n\n    fileName createTimeDir(fileName) const;\n\n    fileName createLagrangianDir(fileName) const;\n\n    fileName buildFilePath(word) const;\n\n    void streamDataToPath(fileName,double**,int,word,word type,word className,word finaliser) const;\n\n    void streamDataToPath(fileName,int**,int,word,word type,word className,word finaliser) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/IOModel/newIOModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"IOModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<IOModel> IOModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word IOModelType\n    (\n        dict.lookup(\"IOModel\")\n    );\n\n    Info<< \"Selecting IOModel \"\n         << IOModelType << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(IOModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"IOModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown IOModelType type \"\n            << IOModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid IOModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<IOModel>(cstrIter()(dict,sm));\n}\n\n// * * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/basicIO/basicIO.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"basicIO.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(basicIO, 0);\n\naddToRunTimeSelectionTable\n(\n    IOModel,\n    basicIO,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nbasicIO::basicIO\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    IOModel(dict,sm),\n    //propsDict_(dict.subDict(typeName + \"Props\")),\n    dirName_(\"lagrangian\"),\n    path_(\"dev/null\"),\n    nPProc_(-1),\n    lagPath_(\"dev/null\")\n{\n    //if (propsDict_.found(\"dirName\")) dirName_=word(propsDict_.lookup(\"dirName\"));\n    path_ = buildFilePath(dirName_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nbasicIO::~basicIO()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// Public Member Functions\n\nint basicIO::dumpDEMdata() const\n{\n    if (dumpNow())\n    {\n        // make time directory\n        if (parOutput_) lagPath_=buildFilePath(dirName_);\n        else\n        {\n            Info << \"createTimeDir(path_), path=\"<<path_ << endl;\n            Info << \"lagPath_=createTimeDir(fileName(lagPath_/lagrangian)), lagPath=\"<<path_ << endl;\n        \tlagPath_=createTimeDir(path_);\n        \tlagPath_=createTimeDir(fileName(lagPath_/\"lagrangian\"));\n        }\n        // calc the number of particles on proc\n        int count(0);\n        for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)\n            if (particleCloud_.cfdemCloud::cellIDs()[index][0] > -1) count++;\n        nPProc_=count;\n        \n        // stream data to file\n        streamDataToPath(lagPath_, particleCloud_.positions(),nPProc_,\"positions\",\"vector\",\"Cloud<passiveParticle>\",\"0\");\n        streamDataToPath(lagPath_, particleCloud_.velocities(),nPProc_,\"v\",\"vector\",\"vectorField\",\"\");\n        streamDataToPath(lagPath_, particleCloud_.radii(),nPProc_,\"r\",\"scalar\",\"scalarField\",\"\");\n    }\n    return nPProc_;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n// Private Member Functions\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/basicIO/basicIO.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    basicIO\n\nSourceFiles\n    basicIO.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef basicIO_H\n#define basicIO_H\n\n#include \"IOModel.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass basicIO\n:\n    public IOModel\n{\n\nprivate:\n\n    //dictionary propsDict_;\n\n    word dirName_;\n\n    fileName path_;\n\n    mutable int nPProc_;\n\n    // Member Functions\n\nprotected:\n    mutable fileName lagPath_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"basicIO\");\n\n\n    // Constructors\n\n        //- Construct from components\n        basicIO\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~basicIO();\n\n\n    // Member Functions\n    int dumpDEMdata() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/noIO/noIO.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noIO.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noIO, 0);\n\naddToRunTimeSelectionTable\n(\n    IOModel,\n    noIO,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoIO::noIO\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    IOModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoIO::~noIO()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/noIO/noIO.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noIO\n\nSourceFiles\n    noIO.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noIO_H\n#define noIO_H\n\n#include \"IOModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noIO\n:\n    public IOModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"off\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noIO\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noIO();\n\n\n    // Member Functions\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/sophIO/sophIO.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"sophIO.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(sophIO, 0);\n\naddToRunTimeSelectionTable\n(\n    IOModel,\n    sophIO,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nsophIO::sophIO\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    basicIO(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nsophIO::~sophIO()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// Public Member Functions\n\nint sophIO::dumpDEMdata() const\n{\n    int npProcs(-1);\n\n    if (dumpNow())\n    {\n        int idDragExp=particleCloud_.idDragExp();\n        npProcs=basicIO::dumpDEMdata();\n\n        // stream data to file\n        streamDataToPath(lagPath_, particleCloud_.voidfractions(),npProcs,\"voidfractions\",\"scalar\",\"scalarField\",\"\");\n        streamDataToPath(lagPath_, particleCloud_.impForces(),npProcs,\"impForces\",\"vector\",\"vectorField\",\"\");\n        streamDataToPath(lagPath_, particleCloud_.expForces(),npProcs,\"expForces\",\"vector\",\"vectorField\",\"\");\n        streamDataToPath(lagPath_, particleCloud_.fieldsToDEM[idDragExp],npProcs,\"DEMForces\",\"vector\",\"vectorField\",\"\");\n    }\n    return npProcs;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n// Private Member Functions\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/sophIO/sophIO.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    sophIO\n\nSourceFiles\n    sophIO.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef sophIO_H\n#define sophIO_H\n\n#include \"IOModel.H\"\n#include \"basicIO.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass sophIO\n:\n    public basicIO\n{\n\nprivate:\n\n    // Member Functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"sophIO\");\n\n\n    // Constructors\n\n        //- Construct from components\n        sophIO\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~sophIO();\n\n\n    // Member Functions\n    int dumpDEMdata() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/trackIO/trackIO.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"trackIO.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(trackIO, 0);\n\naddToRunTimeSelectionTable\n(\n    IOModel,\n    trackIO,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ntrackIO::trackIO\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    sophIO(dict,sm),\n    idFieldToDEMid_(-1)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ntrackIO::~trackIO()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// Public Member Functions\n\nint trackIO::dumpDEMdata() const\n{\n    int npProcs(-1);\n\n    if (dumpNow())\n    {\n        npProcs=sophIO::dumpDEMdata();\n\n        // stream data to file\n        streamDataToPath(lagPath_, particleCloud_.fieldsToDEM[idFieldToDEMid_],npProcs,\"id\",\"scalar\",\"scalarField\",\"\");\n    }\n    return npProcs;\n}\n\nvoid trackIO::allocFieldsToDEM() const\n{\n    // register data to be communicated\n    particleCloud_.registerFieldsToDEM(\"id\",\"scalar-atom\",idFieldToDEMid_,true);\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n// Private Member Functions\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/IOModel/trackIO/trackIO.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    trackIO\n\nSourceFiles\n    trackIO.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef trackIO_H\n#define trackIO_H\n\n#include \"sophIO.H\"\n#include \"interpolationCellPoint.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass trackIO\n:\n    public sophIO\n{\n\nprivate:\n\n    // Member Functions\n\n    mutable label idFieldToDEMid_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"trackIO\");\n\n\n    // Constructors\n\n        //- Construct from components\n        trackIO\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~trackIO();\n\n\n    // Member Functions\n    int dumpDEMdata() const;\n\n    void allocFieldsToDEM() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"averagingModel.H\"\n#include \"voidFractionModel.H\"\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(averagingModel, 0);\n\ndefineRunTimeSelectionTable(averagingModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid averagingModel::undoVectorAverage\n(\n    volVectorField& fieldPrev,\n    volVectorField& fieldNext,\n    volScalarField& weightField,\n    double** const& value,\n    double** const& weight,\n    double**const& mask,\n    bool single\n) const\n{\n// WARNING - not sure if this is valid for dilute model!!!\n\n    if(!single) fieldPrev == fieldNext;\n\n    label cellI;\n    vector valueVec;\n    scalar weightP;\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                weightP = weight[index][subCell];\n\n                if(weightField[cellI] == weightP)\n                {\n                    fieldNext[cellI] = vector(0,0,0);\n                }else\n                {\n                    fieldNext[cellI] = (fieldNext[cellI]*weightField[cellI]-valueVec*weightP)/(weightField[cellI]-weightP);\n                }\n            }\n        }\n    }\n\n    // correct cell values to patches\n    fieldNext.correctBoundaryConditions();\n}\n\nvoid averagingModel::undoVectorSum\n(\n    volVectorField& field,\n    double** const& value,\n    double** const& weight,\n    double**const& mask\n) const\n{\n    label cellI;\n    vector valueVec;\n    scalar weightP;\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                weightP = weight[index][subCell];\n\n                field[cellI] -= valueVec*weightP;\n            }\n        }//forAllSubPoints\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid averagingModel::setVectorSum\n(\n    volVectorField& field,\n    double**& value,\n    double**& weight,\n    double**const& mask\n) const\n{\n    label cellI;\n    vector valueVec;\n    scalar weightP;\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n            for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n            {\n                cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n                if (cellI >= 0)\n                {\n                    for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                    weightP = weight[index][subCell];\n                    field[cellI] += valueVec*weightP;\n                }\n            }//forAllSubPoints\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid averagingModel::setVectorSumSimple\n(\n    volVectorField& field,\n    double**& value,\n    double**& weight,\n    int nP\n) const\n{\n    label cellI;\n    label subCell=0;\n    vector valueVec;\n    scalar weightP;\n\n    for(int index=0; index< nP; index++)\n    {\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n        if (cellI >= 0)\n        {\n            for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n            weightP = weight[index][subCell];\n            field[cellI] += valueVec*weightP;\n        }\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid averagingModel::setScalarSum\n(\n    volScalarField& field,\n    double**& value,\n    double**const& weight,\n    double**const& mask\n) const\n{\n    label cellI;\n    scalar valueScal;\n    scalar weightP;\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n            {\n                //Info << \"subCell=\" << subCell << endl;\n                cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n                if (cellI >= 0)\n                {\n                    valueScal = value[index][0];\n                    weightP = weight[index][subCell];\n                    field[cellI] += valueScal*weightP;\n                }\n            }//forAllSubPoints\n        //}\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid averagingModel::setDSauter\n(\n    volScalarField& dSauter,\n    double**& weight,\n    volScalarField& weightField,\n    label myParticleType\n) const\n{\n    label cellI;\n    scalar weightP;\n    scalar radius(-1);\n    scalar radiusPow2(-1);\n    scalar radiusPow3(-1);\n\n    scalar scale_ = particleCloud_.cg(); //scaling of parcel vs. primary particle diameter\n    dSauter = 0.0 * dSauter; //set to zero, because we will use it to calc sum(wi*ri^3)\n    volScalarField riPower2\n    (\n        IOobject\n        (\n            \"dummy2\",\n            particleCloud_.mesh().time().timeName(),\n            particleCloud_.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        particleCloud_.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(0, 0, 0, 0, 0),0)\n    );\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(myParticleType!=0) //in case a particle type is specified, only consider particles of the right type\n            if(myParticleType != particleCloud_.particleType(index)) continue; \n\n        radius         = particleCloud_.radii()[index][0] / scale_; //the primary particle diameter\n        radiusPow2 = radius*radius;\n        radiusPow3 = radiusPow2*radius;\n        weightP      = weight[index][0];\n\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n            if (cellI >= 0)\n            {\n                // first entry in this cell\n                if(weightField[cellI] == 0)\n                {\n                    dSauter[cellI]      = radiusPow3; //use dSauter to store sum(ri^3)\n                    riPower2[cellI]    = radiusPow2;\n                    weightField[cellI] = weightP;\n                }\n                else\n                {\n                    dSauter[cellI] = (dSauter[cellI]*weightField[cellI]+radiusPow3*weightP)\n                                    /(weightField[cellI]+weightP);\n                    riPower2[cellI] = (riPower2[cellI]*weightField[cellI]+radiusPow2*weightP)\n                                    /(weightField[cellI]+weightP);\n                    weightField[cellI] += weightP;\n                }\n            }\n        }\n    }\n\n    // set value and correct cell values to patches\n    dSauter=2.0*dSauter / (riPower2+1e-99);\n    dSauter.correctBoundaryConditions();\n\n    return;\n}\n\nvoid averagingModel::resetVectorAverage(volVectorField& prev,volVectorField& next,bool single) const\n{\n    if(!single) prev == next;\n    next == dimensionedVector(\"zero\", next.dimensions(), vector::zero);\n}\n\nvoid averagingModel::resetWeightFields() const\n{\n    UsWeightField_ == dimensionedScalar(\"zero\", UsWeightField_.dimensions(), 0.0);\n}\n\n\nvoid Foam::averagingModel::undoWeightFields(double**const& mask) const\n{\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            // undo voidfraction cause by particle\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n            UsWeightField_[cellI] -= particleCloud_.particleWeights()[index][0];\n        //}\n    }\n}\n\ntmp<volVectorField> Foam::averagingModel::UsInterp() const\n{\n    scalar tsf = particleCloud_.dataExchangeM().timeStepFraction();\n    /*if(1-tsf < 1e-4 && particleCloud_.dataExchangeM().couplingStep() > 1)   // if no subTS &&  !firstTS\n    {\n        //Info << \"using UsNext\" << endl;\n        // NOTE: voidfraction uses Prev (does not work due to Ksl?)\n        return tmp<volVectorField>\n        (\n            new volVectorField(\"Us_averagingModel\", UsNext_)\n        );\n    }\n    else */                                                                   // if subTS || firstTS\n    {\n        //Info << \"using Us blend, tsf=\" << tsf << endl;\n        return tmp<volVectorField>\n        (\n            new volVectorField(\"Us_averagingModel\", (1 - tsf) * UsPrev_ + tsf * UsNext_)\n        );\n    }\n}\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\naveragingModel::averagingModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    UsWeightField_\n    (\n        IOobject\n        (\n            \"UsWeightField_\",\n            particleCloud_.mesh().time().timeName(),\n            particleCloud_.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        particleCloud_.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 0.0)\n    ),\n    UsPrev_\n    (   IOobject\n        (\n            \"UsPrev\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volVectorField> (\"Us\")\n        /*sm.mesh(),\n        dimensionedVector(\"zero\", dimensionSet(0,1,-1,0,0),vector::zero)*/\n    ),\n    UsNext_\n    (   IOobject\n        (\n            \"UsNext\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volVectorField> (\"Us\")\n        /*sm.mesh(),\n        dimensionedVector(\"zero\", dimensionSet(0,1,-1,0,0),vector::zero)*/\n    )\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\naveragingModel::~averagingModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nvoid Foam::averagingModel::applyDebugSettings(bool debug) const\n{\n    if(!debug)\n    {\n        UsWeightField_.writeOpt() = IOobject::NO_WRITE;\n        UsPrev_.writeOpt() = IOobject::NO_WRITE;\n        UsNext_.writeOpt() = IOobject::NO_WRITE;\n    }\n}\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/averagingModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    averagingModel\n\nSourceFiles\n    averagingModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef averagingModel_H\n#define averagingModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"dataExchangeModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class averagingModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass averagingModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        mutable volScalarField UsWeightField_;\n\n        mutable volVectorField UsPrev_;\n\n        mutable volVectorField UsNext_;\n\n    // Protected member functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"averagingModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            averagingModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        averagingModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~averagingModel();\n\n\n    // Selector\n\n        static autoPtr<averagingModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Function\n        void applyDebugSettings(bool) const;\n\n        virtual void setScalarAverage\n        (\n            volScalarField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const& weight2,                  //allows the specification of a 2nd weight field\n            bool      weightWithWeight2=false   //switch to activate 2nd weight field\n        ) const = 0;\n\n        virtual void setVectorAverage\n        (\n            volVectorField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const& weight2,                  //allows the specification of a 2nd weight field\n            bool      weightWithWeight2=false   //switch to activate 2nd weight field\n        ) const = 0;\n\n        void undoVectorAverage\n        (\n            volVectorField& fieldPrev,\n            volVectorField& fieldNext,\n            volScalarField& weightField,\n            double** const& value,\n            double** const& weight,\n            double**const& mask,\n            bool single=false\n        ) const;\n\n        void undoVectorSum\n        (\n            volVectorField& field,\n            double** const& value,\n            double** const& weight,\n            double**const& mask\n        ) const;\n\n\n        void setVectorSum\n        (\n            volVectorField& field,\n            double**& value,\n            double**& weight,\n            double**const& mask\n        ) const;\n\n        void setVectorSumSimple\n        (\n            volVectorField& field,\n            double**& value,\n            double**& weight,\n            int np\n        ) const;\n\n        void setScalarSum\n        (\n            volScalarField& field,\n            double**& value,\n            double**const& weight,\n            double**const& mask\n        ) const;\n\n        void setDSauter\n        (\n            volScalarField& dSauter,\n            double**& weight,\n            volScalarField& weightField,\n            label myParticleType = 0  // can be evaluated for a special type\n        ) const;\n\n        void resetVectorAverage(volVectorField& prev,volVectorField& next,bool single=false) const;\n\n        void resetWeightFields() const;\n\n        void undoWeightFields(double**const&) const;\n\n        tmp<volVectorField> UsInterp() const;\n\n        virtual void setParticleType(label type) const {};\n\n        virtual bool checkParticleType(label) const {return true;};  //consider all particles by default\n\n    // Access\n        inline volVectorField& UsPrev() const {return UsPrev_;};\n\n        inline volVectorField& UsNext() const {return UsNext_;};\n\n        inline volScalarField& UsWeightField() const {return UsWeightField_;};\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/averagingModel/newAveragingModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"averagingModel.H\"\n#include \"dilute.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<averagingModel> averagingModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word averagingModelType\n    (\n        dict.lookup(\"averagingModel\")\n    );\n\n    Info<< \"Selecting averagingModel \"\n         << averagingModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(averagingModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"averagingModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown averagingModelType type \"\n            << averagingModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid averagingModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<averagingModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"dense.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(dense, 0);\n\naddToRunTimeSelectionTable\n(\n    averagingModel,\n    dense,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ndense::dense\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    averagingModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ndense::~dense()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid dense::setScalarAverage\n(\n    volScalarField& field,\n    double**& value,\n    double**& weight,\n    volScalarField& weightField,\n    double**const& mask,\n    double**const& weight2,          //allows the specification of a 2nd weight field\n    bool      weightWithWeight2      //switch to activate 2nd weight field\n) const\n{\n    label cellI;\n    scalar valueScal;\n    scalar weightP;\n\n    #if defined(moreAccuracy)\n    List <long double> sum(field.size());\n    for(int i=0;i<sum.size();i++) sum[i] = 0.;\n    #endif\n\n    if(weightWithWeight2) \n        FatalError << \"dense::setScalarAverage: attempt to weight with weight2, which is not implemented\" << abort(FatalError);\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(!checkParticleType(index)) continue; //skip this particle if not correct type\n\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                valueScal = value[index][0];\n                weightP = weight[index][0];\n\n                #if defined(moreAccuracy)\n                // build sum\n                sum[cellI] += valueScal*weightP;\n                weightField[cellI] += weightP;\n                #else\n                // first entry in this cell\n                if(weightField[cellI] == 0)\n                {\n                    field[cellI] = valueScal;\n                    weightField[cellI] = weightP;\n                }\n                else\n                {\n                    field[cellI] = (field[cellI]*weightField[cellI]+valueScal*weightP)/(weightField[cellI]+weightP);\n                    weightField[cellI] += weightP;\n                }\n                #endif\n            }\n        }\n    }\n\n    // build average\n    #if defined(moreAccuracy)\n    forAll(field,cellI) if(weightField[cellI] > SMALL) field[cellI] = sum[cellI]/weightField[cellI];\n    #endif\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid dense::setVectorAverage\n(\n    volVectorField& field,\n    double**& value,\n    double**& weight,\n    volScalarField& weightField,\n    double**const& mask,\n    double**const& weight2,                  //allows the specification of a 2nd weight field\n    bool      weightWithWeight2   //switch to activate 2nd weight field\n) const\n{\n    label cellI;\n    vector valueVec;\n    scalar weightP;\n\n    #if defined(moreAccuracy)\n    List <long double> sumX(field.size());\n    List <long double> sumY(field.size());\n    List <long double> sumZ(field.size());\n    for(int i=0;i<sumX.size();i++)\n    {\n        sumX[i] = 0.;\n        sumY[i] = 0.;\n        sumZ[i] = 0.;\n    }\n    #endif\n\n    //====================\n    // debug\n    /*for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        Pout << \"--index=\" << index << endl;\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                Pout << \"---subCell=\" << subCell << endl;\n                Pout << \"---weight=\" << weight[index][subCell] << endl;\n                if(weightWithWeight2)    \n                    Pout << \"---weight2=\" << weight2[index][subCell] << endl;\n            }\n            else\n                Pout << \"---subCell not found\" << endl;\n        }\n    }*/\n    //====================\n    if(weightWithWeight2) //use weight2, e.g., mass-averaged\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(!checkParticleType(index)) continue; //skip this particle if not correct type\n\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                weightP = weight[index][subCell]*weight2[index][subCell];\n\n                #if defined(moreAccuracy)\n                // build sum\n                sumX[cellI] += valueVec[0]*weightP;\n                sumY[cellI] += valueVec[1]*weightP;\n                sumZ[cellI] += valueVec[2]*weightP;\n                weightField[cellI] += weightP;\n                #else\n                // first entry in this cell\n                if(weightField[cellI] == 0)\n                {\n                    field[cellI] = valueVec;\n                    weightField[cellI] = weightP;\n                }\n                else\n                {\n                    field[cellI] = (field[cellI]*weightField[cellI]+valueVec*weightP)/(weightField[cellI]+weightP); //Running average calc. style\n                    weightField[cellI] += weightP;\n                }\n                #endif\n            }\n        }//forAllSubPoints\n    }\n    else //standard, i.e., volume-averaged\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(!checkParticleType(index)) continue; //skip this particle if not correct type\n\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                weightP = weight[index][subCell];\n\n                #if defined(moreAccuracy)\n                // build sum\n                sumX[cellI] += valueVec[0]*weightP;\n                sumY[cellI] += valueVec[1]*weightP;\n                sumZ[cellI] += valueVec[2]*weightP;\n                weightField[cellI] += weightP;\n                #else\n                // first entry in this cell\n                if(weightField[cellI] == 0)\n                {\n                    field[cellI] = valueVec;\n                    weightField[cellI] = weightP;\n                }\n                else\n                {\n                    field[cellI] = (field[cellI]*weightField[cellI]+valueVec*weightP)/(weightField[cellI]+weightP); //Running average calc. style\n                    weightField[cellI] += weightP;\n                }\n                #endif\n            }\n        }//forAllSubPoints\n    }\n\n    #if defined(moreAccuracy)\n    // build average\n    forAll(field,cellI)\n    {\n        if(weightField[cellI] > SMALL)\n        {\n            scalar w=weightField[cellI];\n            field[cellI][0] = sumX[cellI]/w;\n            field[cellI][1] = sumY[cellI]/w;\n            field[cellI][2] = sumZ[cellI]/w;\n        }\n    }\n    #endif\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/dense/dense.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    averaging model for dense regime\n\nClass\n    dense\n\nSourceFiles\n    dense.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef dense_H\n#define dense_H\n\n//#define moreAccuracy\n\n#include \"averagingModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass dense\n:\n    public averagingModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"dense\");\n\n\n    // Constructors\n\n        //- Construct from components\n        dense\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~dense();\n\n\n    // Member Functions\n        void setScalarAverage\n        (\n            volScalarField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const& weight2,                  //allows the specification of a 2nd weight field\n            bool      weightWithWeight2=false   //switch to activate 2nd weight field\n        ) const;\n\n        void setVectorAverage\n        (\n            volVectorField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const& weight2,                  //allows the specification of a 2nd weight field\n            bool      weightWithWeight2=false   //switch to activate 2nd weight field\n        ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/dilute/dilute.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"dilute.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(dilute, 0);\n\naddToRunTimeSelectionTable\n(\n    averagingModel,\n    dilute,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ndilute::dilute\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    averagingModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ndilute::~dilute()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid dilute::setScalarAverage\n(\n    volScalarField& field,\n    double**& value,\n    double**& weight,\n    volScalarField& weightField,\n    double**const& mask,\n    double**const& weight2,       //allows the specification of a 2nd weight field\n    bool      weightWithWeight2   //switch to activate 2nd weight field\n) const\n{\n    label cellI;\n    scalar valueScal;\n    scalar weightP;\n\n    if(weightWithWeight2) \n        FatalError << \"dilute::setScalarAverage: attempt to weight with weight2, which is not implemented\" << abort(FatalError);\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI >= 0)\n            {\n                valueScal = value[index][0];\n                weightP = weight[index][0];\n                weightField[cellI] += weightP;\n\n                field[cellI] = valueScal/weightP;\n            }\n        }\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\nvoid dilute::setVectorAverage\n(\n    volVectorField& field,\n    double**& value,\n    double**& weight,\n    volScalarField& weightField,\n    double**const& mask,\n    double**const& weight2,         //allows the specification of a 2nd weight field\n    bool weightWithWeight2    //switch to activate 2nd weight field\n) const\n{\n    label cellI;\n    vector valueVec;\n    scalar weightP;\n\n    if(weightWithWeight2) //use weight2, e.g., mass-averaged - has no effect, just weight is DIFFERENT!\n    {\n        for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n        {\n            for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n            {\n                cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n                if (cellI >= 0)\n                {\n                    for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                    weightP = weight[index][subCell]*weight2[index][subCell];\n                    weightField[cellI] += weightP;\n                    if(weightP > 0) field[cellI] = valueVec; //field[cellI] = valueVec/weightP;\n                }\n            }\n        }\n    }\n    else //standard, i.e., volume-averaged - has no effect, just weight is DIFFERENT!\n    {\n        for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n        {\n            for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n            {\n                //Info << \"subCell=\" << subCell << endl;\n                cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n                if (cellI >= 0)\n                {\n                    for(int i=0;i<3;i++) valueVec[i] = value[index][i];\n                    weightP = weight[index][subCell];\n                    weightField[cellI] += weightP;\n                    if(weightP > 0) field[cellI] = valueVec; //field[cellI] = valueVec/weightP;\n                    //else Warning << \"!!! W A R N I N G --- weightP <= 0\" << endl;\n                }\n            }\n        }\n    }\n\n    // correct cell values to patches\n    field.correctBoundaryConditions();\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/averagingModel/dilute/dilute.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    averaging model for dilute regime - assumes only one particle per cell\n\nClass\n    dilute\n\nSourceFiles\n    dilute.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef dilute_H\n#define dilute_H\n\n#include \"averagingModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass dilute\n:\n    public averagingModel\n{\nprivate:\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"dilute\");\n\n\n    // Constructors\n\n        //- Construct from components\n        dilute\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~dilute();\n\n\n    // Member Functions\n        void setScalarAverage\n        (\n            volScalarField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const& weight2,                  //allows the specification of a 2nd weight field\n            bool      weightWithWeight2=false   //switch to activate 2nd weight field\n        ) const;\n\n        void setVectorAverage\n        (\n            volVectorField& field,\n            double**& value,\n            double**& weight,\n            volScalarField& weightField,\n            double**const& mask,\n            double**const&      weight2,                 //allows the specification of a 2nd weight field\n            bool           weightWithWeight2=false  //switch to activate 2nd weight field\n        ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/clockModel/clockModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#include \"error.H\"\r\n#include <mpi.h>\r\n#include \"clockModel.H\"\r\n#include <unistd.h>\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\r\n\r\ndefineTypeNameAndDebug(clockModel, 0);\r\n\r\ndefineRunTimeSelectionTable(clockModel, dictionary);\r\n\r\n// * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * //\r\n\r\nvoid Foam::clockModel::start(int pos) const\r\n{\r\n    start(pos,\"\");\r\n    return;\r\n}\r\n\r\nvoid Foam::clockModel::start(int pos,const std::string& ident) const\r\n{\r\n    if(particleCloud_.mesh().time().value() > startTime_)\r\n    {\r\n        if (pos >= n_) // alternatively one fixed size?\r\n        {\r\n            n_ = 2*n_;\r\n            deltaT_.resize(n_,0);\r\n            identifier_.resize(n_,\"\");\r\n            nOfRuns_.resize(n_,0);\r\n            level_.resize(n_,-1);\r\n            parent_.resize(n_,-2);\r\n        }\r\n        identifier_[pos]=ident;\r\n        level_[pos] = curLev_;\r\n        curLev_ += 1;\r\n        parent_[pos]=curParent_;\r\n        curParent_ = pos;\r\n        nOfRuns_[pos] += 1;\r\n        deltaT_[pos]-=std::clock();\r\n    }\r\n    return;\r\n}\r\n\r\nvoid Foam::clockModel::stop() const\r\n{\r\n    if(particleCloud_.mesh().time().value() > startTime_)\r\n    {\r\n        deltaT_[curParent_]+=std::clock();\r\n        curLev_ -= 1;\r\n        if (curParent_ >= 0)\r\n        {\r\n            curParent_ = parent_[curParent_];\r\n        }\r\n        else\r\n        {\r\n            curParent_ = -1;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nvoid Foam::clockModel::stop(const std::string& ident) const\r\n{\r\n    if(particleCloud_.mesh().time().value() > startTime_)\r\n    {\r\n        deltaT_[curParent_] += std::clock();\r\n        if (curParent_ > 0 && identifier_[curParent_].compare(ident)!=0)\r\n        {\r\n            Pout<<\"Warning: stop identifier did not equal start identifier! \"<<ident<<\" & \"<<identifier_[curParent_]<<nl;\r\n        }\r\n        curLev_ -= 1;\r\n        if (curParent_ >= 0)\r\n        {\r\n            curParent_ = parent_[curParent_];\r\n        }\r\n        else\r\n        {\r\n            curParent_ = -1;\r\n        }\r\n    }\r\n    return;\r\n}\r\n\r\nstd::string Foam::clockModel::eval() const\r\n{\r\n    std::ostringstream strs(\"Measurements in CPU-seconds:\\n\");\r\n    strs << \"Name\\tdeltaT\\tnOfRuns\\tlevel\\tparentNr\\tparentName\\n\";\r\n    strs.setf(std::ios_base::scientific);\r\n    std::vector<int> shifts = calcShift();\r\n\r\n    for (int i=0; i<n_; i++)\r\n    {\r\n        if (parent_[i] != -2)\r\n        {\r\n            strs << identifier_[i] << \"\\t\";\r\n            strs << static_cast<double>(deltaT_[i])/(CLOCKS_PER_SEC) << \"\\t\";\r\n            strs << nOfRuns_[i] << \"\\t\";\r\n            strs << level_[i] << \"\\t\";\r\n\r\n            if (parent_[i] >= 0)\r\n            {\r\n                strs << (shifts[parent_[i]]) << \"\\t\";\r\n                strs << identifier_[parent_[i]] << \"\\n\";\r\n            }\r\n            else\r\n            {\r\n                strs << parent_[i] << \"\\t\";\r\n                strs << \"none\\n\";\r\n            }\r\n        }\r\n    }\r\n    return strs.str();\r\n}\r\n\r\nvoid Foam::clockModel::evalFile() const\r\n{\r\n    std::ofstream outFile;\r\n    std::string fileName(path_/\"timeEval.txt\");\r\n    outFile.open(fileName.c_str(), ios_base::trunc);\r\n    outFile << \"Time Evaluation\" << nl;\r\n    outFile << eval();\r\n    outFile.close();\r\n}\r\n\r\nvoid Foam::clockModel::evalPar() const\r\n{\r\n    int myrank, numprocs;\r\n    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);\r\n    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);\r\n\r\n    std::ofstream outFile;\r\n    std::ostringstream strs;\r\n    strs.setf(std::ios_base::scientific);\r\n\r\n    std::string fileName(path_/\"timeEval_\");\r\n    strs << myrank << \".txt\";\r\n    fileName.append(strs.str());\r\n\r\n    outFile.open(fileName.c_str(), ios_base::trunc);\r\n    outFile << \"Time Evaluation for Processor Nr.\" << myrank << nl;\r\n    outFile << eval();\r\n    outFile.close();\r\n\r\n    // MPI_REDUCE SUM NODES\r\n    MPI_Barrier(MPI_COMM_WORLD);\r\n    strs.str(\"Parallel Measurements in CPU-seconds of all Processors (starting after first t.s.):\\n\");\r\n    strs << \"Name\\tavgdeltaT\\tmaxdeltaT\\tnOfRuns\\tlevel\\tparentNr\\tparentName\\n\";\r\n    double buffOut = 0.;\r\n    double buffIn = 0.;\r\n    std::vector<int> shifts = calcShift();\r\n\r\n    for (int i=0; i<n_; i++)\r\n    {\r\n        if (parent_[i] != -2)\r\n        {\r\n            strs << identifier_[i] << \"\\t\";\r\n\r\n            buffIn = static_cast<double>(deltaT_[i])/(CLOCKS_PER_SEC);\r\n\r\n            MPI_Reduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);\r\n            MPI_Barrier(MPI_COMM_WORLD);\r\n\r\n            strs << buffOut/numprocs << \"\\t\";\r\n\r\n            MPI_Reduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);\r\n            MPI_Barrier(MPI_COMM_WORLD);\r\n\r\n            strs << buffOut << \"\\t\";\r\n            strs << nOfRuns_[i] << \"\\t\";\r\n            strs << level_[i] << \"\\t\";\r\n\r\n            if (parent_[i] >= 0)\r\n            {\r\n                strs << (shifts[parent_[i]]) << \"\\t\";\r\n                strs << identifier_[parent_[i]] << \"\\n\";\r\n            }\r\n            else\r\n            {\r\n                strs << parent_[i] << \"\\t\";\r\n                strs << \"none\\n\";\r\n            }\r\n        }\r\n    }\r\n    MPI_Barrier(MPI_COMM_WORLD);\r\n\r\n    if (myrank == 0)\r\n    {\r\n        std::string fileName(path_/\"timeEvalFull.txt\");\r\n        outFile.open(fileName.c_str(),ios_base::trunc);\r\n        outFile << strs.str();\r\n        outFile.close();\r\n    }\r\n}\r\n\r\n\r\nvoid Foam::clockModel::initElems()\r\n{\r\n    //init elems\r\n    for (int i = 0;i < n_; i++)\r\n    {\r\n        deltaT_[i] = 0;\r\n        identifier_[i] = \"\";\r\n        nOfRuns_[i] = 0;\r\n        level_[i] = -1;\r\n        parent_[i] = -2;\r\n    }\r\n}\r\n\r\nstd::vector<int> Foam::clockModel::calcShift() const\r\n{\r\n    std::vector<int> shifts = std::vector<int> (n_);\r\n    shifts[0]=0;\r\n    for (int i=1;i<n_;i++)\r\n    {\r\n        if (parent_[i] == -2)\r\n        {\r\n            shifts[i] = shifts[i-1];\r\n        }\r\n        else\r\n        {\r\n            shifts[i] = shifts[i-1]+1;\r\n        }\r\n    }\r\n    return shifts;\r\n}\r\n\r\nvoid Foam::clockModel::normHist() const\r\n{\r\n    int myrank=-10;\r\n    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);\r\n    int numprocs=-10;\r\n    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);\r\n    double buffOut=0.;\r\n    double buffIn=0.;\r\n\r\n    Info << \"==========================\" << endl;\r\n    Info << \" PROCESSOR LOAD HISTOGRAM\" << endl;\r\n\r\n    //Global = 1\r\n    buffIn = double(deltaT_[1]);\r\n    MPI_Allreduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\r\n    if(buffOut>SMALL) buffIn = buffIn*double(numprocs)/buffOut;\r\n    plotHist(buffIn,identifier_[1],numprocs,myrank);\r\n\r\n    //LIGGGHTS = 3\r\n    buffIn = double(deltaT_[3]);\r\n    MPI_Allreduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\r\n    if(buffOut>SMALL) buffIn = buffIn*double(numprocs)/buffOut;\r\n    plotHist(buffIn,identifier_[3],numprocs,myrank);\r\n\r\n    //Coupling - LIGGGHTS = 2 - 3\r\n    buffIn = double(deltaT_[2]) - buffIn;\r\n    MPI_Allreduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\r\n    if(buffOut>SMALL) buffIn = buffIn*double(numprocs)/buffOut;\r\n    plotHist(buffIn,\"Coupling (routines)\",numprocs,myrank);\r\n\r\n    //Flow = 26\r\n    buffIn = double(deltaT_[26]);\r\n    MPI_Allreduce(&buffIn, &buffOut, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\r\n    if(buffOut>SMALL) buffIn = buffIn*double(numprocs)/buffOut;\r\n    plotHist(buffIn,identifier_[26],numprocs,myrank);\r\n    Info << \"===========================\" << endl;\r\n\r\n    getRAMUsage();\r\n    return;\r\n}\r\n\r\nvoid Foam::clockModel::plotHist(double buffIn,const std::string& identifier,int numprocs,int myrank) const\r\n{\r\n    double* globalTime_all = NULL;\r\n    if (myrank == 0) globalTime_all = new double[numprocs];\r\n    MPI_Gather(&buffIn, 1, MPI_DOUBLE, globalTime_all, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);\r\n\r\n    if (myrank == 0)\r\n        for (int j=0; j<numprocs; j++)\r\n            printf(\"%4f  \",globalTime_all[j]);\r\n\r\n    Info << \"\\t\" << identifier << endl;\r\n\r\n    delete [] globalTime_all;\r\n}\r\n\r\nvoid Foam::clockModel::Hist() const\r\n{\r\n    int myrank=-10;\r\n    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);\r\n\r\n    //Global = 1 / Coupling = 2 / LIGGGHTS = 3 /Flow = 26\r\n\r\n    //Global = 1\r\n    Pout << \"[\" << myrank << \"]: \" << identifier_[1] << \" \" << (deltaT_[1]/CLOCKS_PER_SEC) << '\\n';\r\n    //LIGGGHTS = 3\r\n    Pout << \"[\" << myrank << \"]: \" << identifier_[3] << \" \" << (deltaT_[3]/CLOCKS_PER_SEC) << '\\n';\r\n    //Coupling - LIGGGHTS = 2 - 3\r\n    Pout << \"[\" << myrank << \"]: \" << \"Coupling - LIGGGHTS\" << \" \" << ((deltaT_[2]-deltaT_[3])/CLOCKS_PER_SEC) << '\\n';\r\n    //Flow = 26\r\n    Pout << \"[\" << myrank << \"]: \" << identifier_[26] << \" \" << (deltaT_[26]/CLOCKS_PER_SEC) << '\\n';\r\n\r\n    return;\r\n}\r\n\r\nvoid Foam::clockModel::getRAMUsage() const\r\n{\r\n    int myrank=-10;\r\n    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);\r\n    int numprocs=-10;\r\n    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);\r\n\r\n    pid_t myPID = getpid();    //get PID of running process\r\n    //Pout << myPID << \"\\n\";\r\n\r\n    std::string fileName = \"/proc/\"; //build path to /proc/PID/smaps and open file\r\n    std::stringstream strs;\r\n    strs << myPID;\r\n\r\n    fileName.append(strs.str());\r\n    fileName.append(\"/smaps\");\r\n    std::ifstream inFile;\r\n    inFile.open(fileName.data(),ios_base::in);\r\n\r\n    std::string line;\r\n    int RssMem = 0;\r\n    int SwapMem = 0;\r\n    int temp = 0;\r\n    strs.str(\"\");\r\n    if (inFile.is_open())    //search in File smaps for Rss and Swap entries\r\n    {\r\n        while(inFile.good())\r\n        {\r\n            getline(inFile,line);\r\n            strs.str(\"\");\r\n            if (line.substr(0,4).compare(\"Rss:\") == 0)\r\n            {\r\n                strs << line;\r\n                strs >> line >> temp;\r\n                RssMem = RssMem + temp;\r\n                //Pout << temp << \" \";\r\n            }\r\n            else if (line.substr(0,5).compare(\"Swap:\") == 0)\r\n            {\r\n                strs << line;\r\n                strs >> line >> temp;\r\n                SwapMem = SwapMem + temp;\r\n                //Pout << strs.str() << \" \";\r\n            }\r\n        }\r\n    }\r\n    double SwapMB = double(SwapMem)/1024.0; //kB -> MB\r\n    double RssMB = double(RssMem)/1024.0;\r\n\r\n    inFile.close();\r\n\r\n    // set up communication between Procs and plot Stuff\r\n    Info << \" RAM USAGE HISTOGRAM in MB\" << endl;\r\n    plotHist(RssMB,\"RSS memory used\",numprocs,myrank);\r\n    if (SwapMem > 0)\r\n    {\r\n        plotHist(SwapMB,\"WARNING: Swap\",numprocs,myrank);\r\n    }\r\n    Info << \"===========================\" << endl;\r\n\r\n    //Pout << \"SWAP Memory used: \" << SwapMem <<\"MB\\n\";\r\n    //Pout << \"Rss Memory used: \" << RssMem <<\"MB\\n\";\r\n\r\n\r\n    return;\r\n}\r\n// * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * //\r\n\r\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\r\n\r\n// Construct from components\r\nFoam::clockModel::clockModel\r\n(\r\n    const dictionary& dict,\r\n    cfdemCloud& sm\r\n)\r\n:\r\n    dict_(dict),\r\n    particleCloud_(sm),\r\n    path_(\"clockData\"),\r\n    startTime_(sm.mesh().time().startTime().value()+2.*sm.dataExchangeM().couplingTime()), // delay start of measurement by 2*tCouple\r\n    //startTime_(0),                                //no delay\r\n    n_(30),\r\n    deltaT_(n_),\r\n    identifier_(n_),\r\n    nOfRuns_(n_),\r\n    level_(n_),\r\n    curLev_(0),\r\n    parent_(n_),\r\n    curParent_(0)\r\n{\r\n\r\n    Info << \"start clock measurement at t >\"  << startTime_ << endl;\r\n}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\r\n\r\nFoam::clockModel::~clockModel()\r\n{}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n} // End namespace Foam\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/clockModel/clockModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\r\nClass\r\n    clockModel\r\n\r\nSourceFiles\r\n    clockModel.C\r\n\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#ifndef clockModel_H\r\n#define clockModel_H\r\n\r\n#define START(x) start(__COUNTER__,x)\r\n\r\n#include \"fvCFD.H\"\r\n#include \"cfdemCloud.H\"\r\n#include \"dataExchangeModel.H\"\r\n\r\n#include <vector>\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n/*---------------------------------------------------------------------------*\\\r\n                           Class clockModel Declaration\r\n\\*---------------------------------------------------------------------------*/\r\n\r\nclass clockModel\r\n{\r\nprotected:\r\n\r\n    // Protected data\r\n    const dictionary& dict_;\r\n    cfdemCloud& particleCloud_;\r\n    fileName path_;\r\n    scalar startTime_;\r\n\r\n    mutable int n_;\r\n    mutable std::vector<clock_t> deltaT_;\r\n    mutable std::vector<std::string> identifier_;\r\n    mutable std::vector<int> nOfRuns_;\r\n    mutable std::vector<short> level_;\r\n    mutable short curLev_;\r\n    mutable std::vector<int> parent_;\r\n    mutable int curParent_;\r\n\r\npublic:\r\n\r\n    //- Runtime type information\r\n    TypeName(\"clockModel\");\r\n\r\n    // Declare runtime constructor selection table\r\n\r\n        declareRunTimeSelectionTable\r\n        (\r\n            autoPtr,\r\n            clockModel,\r\n            dictionary,\r\n            (\r\n                const dictionary& dict,\r\n                cfdemCloud& sm\r\n            ),\r\n            (dict,sm)\r\n        );\r\n\r\n\r\n    // Constructors\r\n\r\n        //- Construct from components\r\n        clockModel\r\n        (\r\n            const dictionary& dict,\r\n            cfdemCloud& sm\r\n        );\r\n\r\n\r\n    // Destructor\r\n\r\n        virtual ~clockModel();\r\n\r\n\r\n    // Selector\r\n\r\n        static autoPtr<clockModel> New\r\n        (\r\n            const dictionary& dict,\r\n            cfdemCloud& sm\r\n        );\r\n\r\n\r\n    // Member Functions\r\n\r\n\t    virtual void start(int pos) const;\t                //start measurement with custom string identifier\r\n\t    virtual void start(int pos,const std::string& identifier) const;   //start measurement with custom string identifier\r\n\t    virtual void stop() const;\t\t\t\t            //stop last started measurement\r\n\t    virtual void stop(const std::string& identifier) const;    //stop last started measurement with check if identifier is equal\r\n\t    virtual std::string eval() const;\r\n\t    virtual void evalFile() const;\r\n\t    virtual void evalPar() const;\r\n\t    void initElems();\r\n\t    std::vector<int> calcShift() const;\t\t\t        //detects empty indices in vector, when times are evaluated\r\n\t    void Hist() const;\t\t\t\t\t                //calc Histogram\r\n\t    virtual void normHist() const;\t\t\t\t        //calc normalized Histogram\r\n\tvoid plotHist(double,const std::string&,int,int) const;    //plot histogramm to terminal\r\n    \tvoid getRAMUsage() const;\r\n\r\n};\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n} // End namespace Foam\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n#endif\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/clockModel/newClockModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"clockModel.H\"\n#include \"standardSearch.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<clockModel> clockModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word clockModelType\n    (\n        dict.lookup(\"clockModel\")\n    );\n\n    Info<< \"Selecting clockModel \"\n         << clockModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(clockModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"clockModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown clockModelType type \"\n            << clockModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid clockModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<clockModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/noClock/noClock.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noClock.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noClock, 0);\n\naddToRunTimeSelectionTable\n(\n    clockModel,\n    noClock,\n    dictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoClock::noClock\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    clockModel(dict,sm)\n{\n    initElems();\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoClock::~noClock()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/noClock/noClock.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noClock\n\nSourceFiles\n    noClock.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noClock_H\n#define noClock_H\n\n#include \"clockModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noClock\n:\n    public clockModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"off\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noClock\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noClock();\n\n\n    // Member Functions\n\n\t    void start(int pos) const {};\n\t    void start(int pos,const std::string& identifier) const {};\n\t    void stop() const {};\n\t    void stop(const std::string& identifier) const {};\n\t    std::string eval() const {return \"\";};\n\t    void evalFile() const {};\n\t    void evalPar() const {};\n        void normHist() const {};\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/standardClock/standardClock.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"IOModel.H\"\n#include \"standardClock.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(standardClock, 0);\n\naddToRunTimeSelectionTable\n(\n    clockModel,\n    standardClock,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nstandardClock::standardClock\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    clockModel(dict,sm)\n{\n    path_=particleCloud_.IOM().createTimeDir(path_);\n    initElems();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nstandardClock::~standardClock()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/clockModel/standardClock/standardClock.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    standardClock\n\nSourceFiles\n    standardClock.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef standardClock_H\n#define standardClock_H\n\n#include \"clockModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass standardClock\n:\n    public clockModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"standardClock\");\n\n\n    // Constructors\n\n        //- Construct from components\n        standardClock\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~standardClock();\n\n\n    // Member Functions\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"dataExchangeModel.H\"\n#include \"error.H\"\n#include <cstring>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(dataExchangeModel, 0);\n\ndefineRunTimeSelectionTable(dataExchangeModel, dictionary);\n\n// * * * * * * * * * * * * * * protected Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::dataExchangeModel::setNumberOfParticles(int numberOfParticles) const\n{\n    particleCloud_.setNumberOfParticles(numberOfParticles);\n}\n\nvoid Foam::dataExchangeModel::setNumberOfClumps(int numberOfClumps) const\n{\n    particleCloud_.setNumberOfClumps(numberOfClumps);\n}\n\n//====\n// double ***\n\nvoid Foam::dataExchangeModel::allocateArray\n(\n    double***& array,\n    double initVal,\n    int width,\n    int length,\n    int depth\n) const\n{\n    //Pout << \"depth=\" << depth << \" length=\" << length<< \" width=\" << width << endl;\n    // allocate and init double array\n    destroy(array, -1);\n\n    double *data = new double[width*length*depth];\n    double **plane = new double*[length*depth];\n    std::fill_n(data, width*length*depth, initVal);\n\n    array = new double**[depth];\n\n    int n = 0;\n    int m = 0;\n    for (int i=0; i<depth; i++)\n    {\n        m = i*length;\n        array[i] = &plane[m];\n        for (int j=0; j<length; j++)\n        {\n            plane[m+j] = &data[n];\n            n+=width;\n        }\n    }\n}\n\nvoid Foam::dataExchangeModel::destroy(double*** array,int /*len*/) const\n{\n    if (array == NULL) return;\n\n    delete [] array[0][0];\n    delete [] array[0];\n    delete [] array;\n    array = NULL;\n}\n\n//====\n// double **\n\nvoid Foam::dataExchangeModel::allocateArray\n(\n    double**& array,\n    double initVal,\n    int width,\n    int length\n) const\n{\n    // allocate and init double array\n    destroy(array, -1);\n    double *data = new double[width*length];\n    std::fill_n(data, width*length, initVal);\n    array = new double*[length];\n\n    int n = 0;\n    for (int i=0; i<length; i++)\n    {\n        array[i] = &data[n];\n        n += width;\n    }\n}\n\nvoid Foam::dataExchangeModel::allocateArray\n(\n    double**& array,\n    double initVal,\n    int width,\n    const char* length\n) const\n{\n    int len=0;\n    if (strcmp(length,\"nparticles\")==0) len = particleCloud_.numberOfParticles();\n    else if (strcmp(length,\"nbodies\")==0) len = particleCloud_.numberOfClumps();\n    else FatalError<<\"call allocateArray with length, nparticles or nbodies!\\n\" << abort(FatalError);\n    allocateArray(array,initVal,width,max(1,len));\n}\n\nvoid Foam::dataExchangeModel::destroy(double** array,int /*len*/) const\n{\n    if (array == NULL) return;\n\n    delete [] array[0];\n    delete [] array;\n    array = NULL;\n}\n\n//====\n// int **\nvoid Foam::dataExchangeModel::allocateArray\n(\n    int**& array,\n    int initVal,\n    int width,\n    int length\n) const\n{\n    // allocate and init int array\n    destroy(array, -1);\n    int *data = new int[width*length];\n    std::fill_n(data, width*length, initVal);\n    array = new int*[length];\n\n    int n = 0;\n    for (int i=0; i<length; i++)\n    {\n        array[i] = &data[n];\n        n += width;\n    }\n}\n\nvoid Foam::dataExchangeModel::allocateArray\n(\n    int**& array,\n    int initVal,\n    int width,\n    const char* length\n) const\n{\n    int len=0;\n    if (strcmp(length,\"nparticles\")==0) len = particleCloud_.numberOfParticles();\n    else if (strcmp(length,\"nbodies\")==0) len = particleCloud_.numberOfClumps();\n    else FatalError<<\"call allocateArray with length, nparticles or nbodies!\\n\" << abort(FatalError);\n    allocateArray(array,initVal,width,max(1,len));\n}\n\nvoid Foam::dataExchangeModel::destroy(int** array,int /*len*/) const\n{\n    if (array == NULL) return;\n\n    delete [] array[0];\n    delete [] array;\n    array = NULL;\n}\n//====\n\n//====\n// int *\nvoid Foam::dataExchangeModel::allocateArray\n(\n    int*& array,\n    int initVal,\n    int length\n) const\n{\n    dataExchangeModel::destroy(array);\n\n    // allocate and init int array\n    array = new int[length];\n    std::fill_n(array, length, initVal);\n}\n\nvoid Foam::dataExchangeModel::destroy(int* array) const\n{\n    delete [] array;\n    array = NULL;\n}\n//====\n\n//====\n// double *\nvoid Foam::dataExchangeModel::allocateArray\n(\n    double*& array,\n    double initVal,\n    int length\n) const\n{\n    dataExchangeModel::destroy(array);\n\n    // allocate and init double array\n    array = new double[length];\n    std::fill_n(array, length, initVal);\n}\n\nvoid Foam::dataExchangeModel::destroy(double* array) const\n{\n    delete [] array;\n    array = NULL;\n}\n//====\n\n\nbool Foam::dataExchangeModel::couple(int i) const\n{\n    bool coupleNow = false;\n    if (doCoupleNow())\n    {\n        couplingStep_++;\n        coupleNow = true;\n    }\n    return coupleNow;\n}\n\nscalar Foam::dataExchangeModel::timeStepFraction() const\n{\n    scalar frac = ( (particleCloud_.mesh().time().timeIndex()-timeIndexOffset_)*particleCloud_.mesh().time().deltaT().value() - (couplingStep_-1) * couplingTime() ) / couplingTime();\n    return frac;\n}\n\nint Foam::dataExchangeModel::getNumberOfParticles() const\n{\n    FatalError << \"ask for nr of particles - which is not supported for this dataExchange model\" << abort(FatalError);\n    return -1;\n}\n\nint Foam::dataExchangeModel::getNumberOfClumps() const\n{\n    FatalError << \"ask for nr of clumps - which is not supported for this dataExchange model\" << abort(FatalError);\n    return -1;\n}\n\nint Foam::dataExchangeModel::getNumberOfTypes() const\n{\n    FatalError << \"ask for nr of types - which is not supported for this dataExchange model\" << abort(FatalError);\n    return -1;\n}\n\ndouble* Foam::dataExchangeModel::getTypeVol() const\n{\n    FatalError << \"ask for type volume - which is not supported for this dataExchange model\" << abort(FatalError);\n    return NULL;\n}\n\n//void Foam::dataExchangeModel::doDebug() const\n//{\n//    FatalError << \"Foam::dataExchangeModel::doDebug() you should not be here.\" << abort(FatalError);\n//}\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ndataExchangeModel::dataExchangeModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    maxNumberOfParticles_(0),\n    couplingStep_(0),\n    DEMts_(-1.),\n    couplingInterval_(readScalar(dict_.lookup(\"couplingInterval\"))),\n    timeIndexOffset_(particleCloud_.mesh().time().timeIndex())\n{}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ndataExchangeModel::~dataExchangeModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/dataExchangeModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    dataExchangeModel\n\nSourceFiles\n    dataExchangeModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef dataExchangeModel_H\n#define dataExchangeModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n\n#include <mpi.h>\n#include <cmath>\n#include <lammps.h>\n#include <pair.h>\n#include <force.h>\n#include <atom.h>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class dataExchangeModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass dataExchangeModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        int maxNumberOfParticles_;\n\n        mutable int couplingStep_;\n\n        scalar DEMts_;\n\n        int couplingInterval_;\n\n        const int timeIndexOffset_;\n\n    // Protected member functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"dataExchangeModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            dataExchangeModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        dataExchangeModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~dataExchangeModel();\n\n\n    // Selector\n\n        static autoPtr<dataExchangeModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Function\n        void setNumberOfParticles(int) const;\n\n        void setNumberOfClumps(int) const;\n\n        inline const int& maxNumberOfParticles() const {return maxNumberOfParticles_;};\n\n        template <typename T>\n        void getData\n        (\n            word name,\n            word type,\n            T ** const& field\n        ) const { getData(name,type,field,couplingStep_-1); }\n\n        virtual void getData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            label step\n        ) const = 0;\n\n        virtual void getData\n        (\n            word name,\n            word type,\n            int ** const& field,\n            label step\n        ) const=0;\n\n        virtual void giveData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            const char* datatype=\"double\"\n        ) const = 0;\n\n        //====\n        // double ***\n        virtual void allocateArray(double***&, double, int, int,int) const;\n        virtual void destroy(double***,int) const;\n\n        //====\n        // double **\n        virtual void allocateArray(double**&, double, int, int) const;\n        virtual void allocateArray(double**&, double, int, const char* =\"nparticles\") const;\n        virtual void destroy(double**,int) const;\n\n        //====\n        // int **\n        virtual void allocateArray(int**&, int, int, int) const;\n        virtual void allocateArray(int**&, int, int, const char* =\"nparticles\") const;\n        virtual void destroy(int**,int) const;\n        //====\n\n        //====\n        // int *\n        virtual void allocateArray(int*&, int, int) const;\n        virtual void destroy(int*) const;\n        //====\n\n        //====\n        // double *\n        virtual void allocateArray(double*&, double, int) const;\n        virtual void destroy(double*) const;\n        //====\n\n        virtual bool couple(int) const;\n\n        virtual scalar timeStepFraction() const;\n\n        inline int couplingStep() const {return couplingStep_;};\n\n        inline const scalar& DEMts() const {return DEMts_;};\n\n        inline int couplingInterval() const {return couplingInterval_;};\n\n        inline bool subTS() const {\n            if(mag(particleCloud_.mesh().time().deltaT().value()-couplingTime())>SMALL) return true;\n            else return false;\n        };\n\n        inline scalar couplingTime() const {return couplingInterval_ * DEMts_;};\n\n        inline scalar TSstart() const { return particleCloud_.mesh().time().startTime().value()\n                                        + (couplingStep_-1) * couplingTime();};\n\n        inline scalar TSend() const {return particleCloud_.mesh().time().startTime().value()\n                                        + (couplingStep_) * couplingTime();};\n\n        inline int DEMstepsTillT(scalar t) const {return (t - (particleCloud_.mesh().time().value() - couplingTime())  + SMALL) / DEMts_;};\n\n        inline void checkTSsize() const\n        {\n            if(particleCloud_.mesh().time().deltaT().value() >  couplingTime() + SMALL)\n            {\n                Info << \"particleCloud_.mesh().time().deltaT().value() = \" << particleCloud_.mesh().time().deltaT().value() << endl;\n                Info << \"couplingInterval_ = \" << couplingInterval_ << endl;\n                Info << \"DEMts_ = \" << DEMts_ << endl;\n                FatalError<<\"\\nError - CFD time-step bigger than coupling time (= DEM time step * coupling interval)!\\n\"<< abort(FatalError);\n            }\n            if ( std::fabs(( round(couplingTime()/particleCloud_.mesh().time().deltaT().value()) * particleCloud_.mesh().time().deltaT().value() )-couplingTime()) > SMALL )\n            {\n                Info << \"particleCloud_.mesh().time().deltaT().value() = \" << particleCloud_.mesh().time().deltaT().value() << endl;\n                Info << \"couplingInterval_ = \" << couplingInterval_ << endl;\n                Info << \"DEMts_ = \" << DEMts_ << endl;\n                FatalError <<\"\\nWarning - Coupling time (= DEM time step * coupling interval) is not a multiple of  CFD time-step!\\n\"<< abort(FatalError);\n            }\n            if(!particleCloud_.allowCFDsubTimestep() && subTS()) FatalError<<\"\\nYour models require: CFD time-step = coupling interval (= DEM time step * coupling interval)! \\n\"<< abort(FatalError);\n\n            // warn if sub-TS\n            if (particleCloud_.mesh().time().deltaT().value() < couplingTime() - SMALL)\n                Warning << \"You are using sub-time-steps (i.e. CFD TS < coupling time)! Check your settings properly.\" << endl;\n        }\n\n        /*inline bool checkExactTiming() const\n        {\n            return false;\n        }*/\n\n        //void checkNClumpTypes() const {};\n\n        inline void readDEMtsfromDict(dictionary& propsDict)\n        {\n            DEMts_ = readScalar(propsDict.lookup(\"DEMts\"));\n            checkTSsize();\n        }\n\n        inline bool doCoupleNow() const\n        {\n            // couple at first sub TS\n            if ((particleCloud_.mesh().time().timeIndex()-timeIndexOffset_)*particleCloud_.mesh().time().deltaT().value()-SMALL\n                > couplingStep_*DEMts_*couplingInterval_)\n            {\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        virtual int getNumberOfParticles() const;\n        virtual int getNumberOfClumps() const;\n        virtual int getNumberOfTypes() const;\n        virtual double* getTypeVol() const;\n\n        inline void setPositions(label n,double* pos) const\n        {\n            for (int i=0;i<n;i++)\n                for (int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[particleCloud_.idPos()][i][j]=pos[i*3+j];\n        };\n        inline void setCellIDs(label n,int* ID) const\n        {\n            for (int i=0;i<n;i++)\n                particleCloud_.cellIDs_[i][0]=ID[i];\n        };\n\n        inline void setPositionsCM(label n,double* pos) const\n        {\n            particleCloud_.setPositionsCM(n,pos);\n        };\n        inline void setCellIDsCM(label n,int* ID) const\n        {\n            particleCloud_.setCellIDsCM(n,ID);\n        };\n\n        virtual word myType() const=0;\n\n        virtual void setCG() const { FatalError<<\"\\nsetCG() not executed correctly!\\n\"<< abort(FatalError); };\n\n        void setCGs(LAMMPS_NS::LAMMPS *lmp) const \n        { \n            particleCloud_.setCG(lmp->force->cg(INT_MAX));\n            \n            Info << \"LIGGGHTS hosts \" << lmp->atom->ntypes << \" atom types.\" << endl;\n\n//             if ( lmp->force->typeSpecificCG() )\n//             {\n//               Warning << \"\\nYou are using untested code (type specific coarse graining)!!!\\n\"\n//                       << \"\\nThis will most probably give wrong results for most models!!!\\n\"<< endl;\n//               for(int iTyp=1; iTyp<=lmp->atom->ntypes; iTyp++)\n//                   particleCloud_.setCGTypeSpecific(iTyp,lmp->force->cg(iTyp));\n//               lmp->force->reportCG();\n//             }\n        };\n\n        //virtual void doDebug() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/dataExchangeModel/newDataExchangeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"dataExchangeModel.H\"\n#include \"twoWayFiles.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<dataExchangeModel> dataExchangeModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word dataExchangeModelType\n    (\n        dict.lookup(\"dataExchangeModel\")\n    );\n\n    Info<< \"Selecting dataExchangeModel \"\n         << dataExchangeModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(dataExchangeModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"dataExchangeModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown dataExchangeModelType type \"\n            << dataExchangeModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid dataExchangeModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<dataExchangeModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/noDataExchange/noDataExchange.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noDataExchange.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noDataExchange, 0);\n\naddToRunTimeSelectionTable\n(\n    dataExchangeModel,\n    noDataExchange,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoDataExchange::noDataExchange\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dataExchangeModel(dict,sm)\n{\n    Info << \"DEMts_ not set!\" << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoDataExchange::~noDataExchange()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/noDataExchange/noDataExchange.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noDataExchange\n\nSourceFiles\n    noDataExchange.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noDataExchange_H\n#define noDataExchange_H\n\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDataExchange Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noDataExchange\n:\n    public dataExchangeModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"noDataExchange\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noDataExchange\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noDataExchange();\n\n\n    // Member Functions\n        void getData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            label step\n        ) const {};\n\n        void getData\n        (\n            word name,\n            word type,\n            int ** const& field,\n            label step\n        ) const {};\n\n        void giveData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            const char* datatype = \"\"\n        ) const {};\n\n        word myType() const{return typeName; };\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"oneWayVTK.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(oneWayVTK, 0);\n\naddToRunTimeSelectionTable\n(\n    dataExchangeModel,\n    oneWayVTK,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\noneWayVTK::oneWayVTK\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dataExchangeModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    filename_(propsDict_.lookup(\"couplingFilename\")),\n    relativePath_(propsDict_.lookup(\"relativePath\"))\n{\n    readDEMtsfromDict(propsDict_);\n\n    // set max nr of particles from dict\n    maxNumberOfParticles_ = readScalar(propsDict_.lookup(\"maxNumberOfParticles\"));\n    setNumberOfParticles(maxNumberOfParticles_);\n\n    // make a const char* from word\n    //string HH=string(filename_);\n    //charFilename_=const_cast<char*>(HH.c_str());\n    charFilename_ = wordToChar(filename_);\n\n    Info << \"relativePath_\" << relativePath_ << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\noneWayVTK::~oneWayVTK()\n{}\n\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\nchar* oneWayVTK::wordToChar(word& inWord) const\n{\n    return const_cast<char*>(inWord.c_str());\n}\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid oneWayVTK::getData\n(\n    word name,\n    word type,\n    double ** const& field,\n    int step\n) const\n{\n    if (type == \"scalar-atom\")\n    {\n        // get path to particle VTK files\n        char index[100];\n        sprintf(index, charFilename_, step);\n        //fileName H(particleCloud_.mesh().time().path()/\"..\"/\"DEM\"/\"post\"/index);\n        fileName H(particleCloud_.mesh().time().path()/relativePath_/index);\n        Info << \"opening file: \" << H << endl;\n\n        // set file pointer\n        string HH=string(H);\n        const char * paricleFilePath=HH.c_str();\n        ifstream* inputPtr;\n        inputPtr = new ifstream(paricleFilePath);\n        if(!*inputPtr) FatalError << \"File not found!, \" << H << \"\\n\" << abort(FatalError);\n\n        if (name == \"radius\")\n        {\n            // read data\n            string just_read = \" \";\n            while(just_read.compare(name) != 0)  *inputPtr >> just_read;   //read until we read \"name\"\n            *inputPtr >> just_read;                                    // skip text for dataType\n            *inputPtr >> just_read;                                    // skip text for \"1\"\n            *inputPtr >> just_read;                                    // skip text for \"LookUp\"\n            *inputPtr >> just_read;                                    // skip text for \"default\"\n            for(int index = 0;index <  particleCloud_.numberOfParticles(); ++index)\n            {\n                *inputPtr >> field[index][0];\n            }\n        }\n        else\n        {\n            // read data\n            string just_read = \" \";\n            while(just_read.compare(name) != 0)  *inputPtr >> just_read;   //read until we read \"name\"\n            *inputPtr >> just_read;                                    // skip text for dataType\n            for(int index = 0;index <  particleCloud_.numberOfParticles(); ++index)\n            {\n                *inputPtr >> field[index][0];\n            }\n        }\n\n        // clean up inputStream\n        delete inputPtr;\n    } else if (type == \"vector-atom\")\n    {\n        // get path to particle VTK files\n        char index[100];\n        sprintf(index, charFilename_, step);\n        Info << \"debug: index is \" << index << endl; //JOKER\n        //fileName H(particleCloud_.mesh().time().path()/\"..\"/\"DEM\"/\"post\"/index);\n        fileName H(particleCloud_.mesh().time().path()/relativePath_/index);\n        Info << \"opening file: \" << H << endl;\n\n        // set file pointer\n        string HH=string(H);\n        const char * paricleFilePath=HH.c_str();\n        ifstream* inputPtr;\n        inputPtr = new ifstream(paricleFilePath);\n        if(!*inputPtr) FatalError << \"File not found!, \" << H << \"\\n\" << abort(FatalError);\n\n        // read position data from VTK file\n        //NP: secial case as position data has no \"name\" in the vtk file\n        if (name == \"x\")\n        {\n            int numberOfParticles;  // remove this?\n\n            string just_read = \" \";\n//            if(!*inputPtr) FatalIOError << \"File not found!, \" << H << \"\\n\" << abort(FatalError);\n            while(just_read.compare(\"POINTS\") != 0)  *inputPtr >> just_read;   //read until we read \"POINTS\"\n            *inputPtr >> numberOfParticles;                           //this is now the number of points in the file\n            *inputPtr >> just_read;                                    // skip text for dataType\n\n            // give nr of particles to cloud\n            setNumberOfParticles(numberOfParticles);\n\n            // re-allocate arrays of cloud\n            particleCloud_.reAllocArrays();\n\n            for(int index = 0;index <  numberOfParticles; ++index)\n            {\n                *inputPtr >> field[index][0] >> field[index][1] >> field[index][2];\n            }\n        }\n        else\n        {\n            string just_read = \" \";\n            while(just_read.compare(name) != 0)  *inputPtr >> just_read;   //read until we read \"name\"\n            *inputPtr >> just_read;                                    // skip \"3\"\n            *inputPtr >> just_read;                                    // skip nr entries\n            *inputPtr >> just_read;                                    // skip text for dataType\n            for(int index = 0;index <  particleCloud_.numberOfParticles(); ++index)\n            {\n                *inputPtr >> field[index][0] >> field[index][1] >> field[index][2];\n            }\n        }\n\n        // clean up inputStream\n        delete inputPtr;\n    }\n    else\n    {\n        Info << \"unknown type in getData!!!\" << endl;\n    }\n}\n\nvoid oneWayVTK::giveData\n(\n    word name,\n    word type,\n    double ** const& field,\n    const char* datatype\n) const\n{\n    // do nothing\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/oneWayVTK/oneWayVTK.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    one way DEM->CFD coupling via VTK files\n\nClass\n    oneWayVTK\n\nSourceFiles\n    oneWayVTK.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef oneWayVTK_H\n#define oneWayVTK_H\n\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class oneWayVTK Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass oneWayVTK\n:\n    public dataExchangeModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    word filename_;\n\n    fileName relativePath_;\n\n    const char* charFilename_;\n\n  // private member functions\n\n    char* wordToChar(word&) const;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"oneWayVTK\");\n\n\n    // Constructors\n\n        //- Construct from components\n        oneWayVTK\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~oneWayVTK();\n\n\n    // Member Functions\n        void getData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            label step\n        ) const;\n\n        void getData\n        (\n            word name,\n            word type,\n            int ** const& field,\n            label step\n        ) const\n        {};\n\n        void giveData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            const char* datatype = \"\"\n        ) const;\n\n        word myType() const{return typeName; };\n\n        void setCG() const { \n            //no coarse graining data available, assume 1\n            particleCloud_.setCG(1.); \n         };\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayFiles/twoWayFiles.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"twoWayFiles.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"error.H\"\n\n#include <cstring>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(twoWayFiles, 0);\n\naddToRunTimeSelectionTable\n(\n    dataExchangeModel,\n    twoWayFiles,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ntwoWayFiles::twoWayFiles\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dataExchangeModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\"))\n{\n    readDEMtsfromDict(propsDict_);\n\n    // set max nr of particles from dict\n    maxNumberOfParticles_ = readScalar(propsDict_.lookup(\"maxNumberOfParticles\"));\n\n    // give max nr of particles to cloud (corrected later)\n    setNumberOfParticles(maxNumberOfParticles_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ntwoWayFiles::~twoWayFiles()\n{}\n\n\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\n\nconst char* twoWayFiles::wordToChar(word& inWord) const\n{\n    return const_cast<char*>(inWord.c_str());\n}\n\nconst char* twoWayFiles::fileNameToChar(fileName& inWord) const\n{\n    return const_cast<char*>(inWord.c_str());\n}\n\nfileName twoWayFiles::getFilePath(word& name, bool in) const\n{\n    const char* charName = wordToChar(name);\n    char timeStep[40];\n\n    // file touched by DEM\n    strcpy(timeStep, charName);\n    strcat(timeStep,\"1\");\n    fileName particleFilePathOld(particleCloud_.mesh().time().path()/\"couplingFiles\"/timeStep);\n\n    //NP no waiting when writing out at first time\n    if (couplingStep() > 1 || in)\n    {\n        Info << \"wait for file \" << particleFilePathOld << endl;\n        struct stat st;\n        while (stat(fileNameToChar(particleFilePathOld),&st)) sleep(0.03);\n    }\n\n    return particleFilePathOld;\n}\n\nvoid twoWayFiles::renameFilePath(fileName& particleFilePathOld,word& name) const\n{\n    const char* charName = wordToChar(name);\n    char timeStep[40];\n\n    // file touched by CFD\n    strcpy(timeStep, charName);\n    strcat(timeStep,\"0\");\n    fileName particleFilePath(particleCloud_.mesh().time().path()/\"couplingFiles\"/timeStep);\n\n    // rename old file\n    rename(fileNameToChar(particleFilePathOld),fileNameToChar(particleFilePath));\n}\n\n// * * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\nvoid twoWayFiles::getData\n(\n    word name,\n    word type,\n    double ** const& field,\n    label step\n) const\n{\n    // get input path\n    fileName particleFilePath = getFilePath(name,true);\n    Info << \"reading from file: \" << particleFilePath << endl;\n\n    // set file pointer\n    IFstream* inputPtr = new IFstream(particleFilePath);\n\n    // write data to variable\n    int numberOfParticles;\n    /*if(name != \"outRegion1\" && name != \"inRegion1\")*/ *inputPtr >> numberOfParticles;\n\n    // give nr of particles to cloud\n    setNumberOfParticles(numberOfParticles);\n\n    // re-allocate arrays of cloud\n    particleCloud_.reAllocArrays();\n\n    for(int index = 0;index < numberOfParticles; ++index)\n    {\n        if (type == \"scalar-atom\")\n        {\n            *inputPtr >> field[index][0];\n        }\n        else if (type == \"vector-atom\")\n        {\n            for(int i=0;i<3;i++) *inputPtr >> field[index][i];\n        }\n        else\n        {\n            FatalError<<\"unknown type in twoWayFiles::getData!!!\\n\" << abort(FatalError);\n        }\n    }\n\n    // clean up inputStream\n    delete inputPtr;\n\n    // rename file\n    renameFilePath(particleFilePath,name);\n}\n\nvoid twoWayFiles::giveData\n(\n    word name,\n    word type,\n    double ** const& field,\n    const char* datatype\n) const\n{\n    // get output path\n    fileName particleFilePath = getFilePath(name,false);\n    Info << \"writing to file: \" << particleFilePath << endl;\n\n    // set file pointer\n    OFstream* outputPtr = new OFstream(particleFilePath);\n\n    // write data to file\n    int numberOfParticles = particleCloud_.numberOfParticles();\n    *outputPtr << numberOfParticles << endl;\n\n    for(int index = 0;index < numberOfParticles; ++index)\n    {\n        if (type == \"scalar-atom\")\n        {\n            *outputPtr << field[index][0] << endl;\n        }\n        else if (type == \"vector-atom\")\n        {\n            for(int i=0;i<3;i++) *outputPtr << field[index][i] << \" \";\n            *outputPtr << endl;\n        }\n        else\n        {\n            FatalError<<\"unknown type in twoWayFiles::giveData!!!\\n\" << abort(FatalError);\n        }\n    }\n\n    // clean up outputStream\n    delete outputPtr;\n\n    // rename file\n    renameFilePath(particleFilePath,name);\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayFiles/twoWayFiles.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    two way DEM-CFD coupling via files\n\nClass\n    twoWayFiles\n\nSourceFiles\n    twoWayFiles.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef twoWayFiles_H\n#define twoWayFiles_H\n\n#include \"dataExchangeModel.H\"\n#include \"OFstream.H\"\n#include \"sys/stat.h\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class twoWayFiles Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass twoWayFiles\n:\n    public dataExchangeModel\n{\nprivate:\n\n  // private data\n    dictionary propsDict_;\n\n  // private member functions\n\n    const char* wordToChar(word&) const;\n\n    const char* fileNameToChar(fileName&) const;\n\n    fileName getFilePath(word&, bool) const;\n\n    void renameFilePath(fileName&,word&) const;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"twoWayFiles\");\n\n\n    // Constructors\n\n        //- Construct from components\n        twoWayFiles\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~twoWayFiles();\n\n\n    // Member Functions\n        void getData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            label step\n        ) const;\n\n        void getData\n        (\n            word name,\n            word type,\n            int ** const& field,\n            label step\n        ) const {FatalError<<\"function not implemented !!! twoWayFiles::getData!!!\\n\" << abort(FatalError);};\n\n        void giveData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            const char* datatype = \"\"\n        ) const;\n\n        word myType() const{return typeName; };\n\n        void setCG() const\n        {\n            Warning << \"setCG() not used correctly here...we assume cg=1\" << endl;\n            particleCloud_.setCG(1);\n        };\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"twoWayMPI.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"clockModel.H\"\n#include \"pair.h\"\n#include \"force.h\"\n#include \"forceModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(twoWayMPI, 0);\n\naddToRunTimeSelectionTable\n(\n    dataExchangeModel,\n    twoWayMPI,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ntwoWayMPI::twoWayMPI\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dataExchangeModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    lmp(NULL)\n{\n    Info<<\"Starting up LIGGGHTS for first time execution\"<<endl;\n\n    MPI_Comm_dup(MPI_COMM_WORLD, &comm_liggghts);\n\n    // read path from dictionary\n    const fileName liggghtsPath(propsDict_.lookup(\"liggghtsPath\"));\n\n    // open LIGGGHTS input script\n    Info<<\"Executing input script '\"<< liggghtsPath.c_str() <<\"'\"<<endl;\n    lmp = new LAMMPS_NS::LAMMPS(0,NULL,comm_liggghts);\n    lmp->input->file(liggghtsPath.c_str());\n\n    // get DEM time step size\n    DEMts_ = lmp->update->dt;\n    checkTSsize();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ntwoWayMPI::~twoWayMPI()\n{\n    delete lmp;\n}\n\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\nchar* twoWayMPI::wordToChar(word& inWord) const\n{\n    return const_cast<char*>(inWord.c_str());\n}\n\n\n// * * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\n\nvoid twoWayMPI::getData\n(\n    word name,\n    word type,\n    double ** const& field,\n    label step\n) const\n{\n    char* charName = wordToChar(name);\n    char* charType = wordToChar(type);\n    data_liggghts_to_of(charName,charType, lmp, (void*&) field, (char *)\"double\");\n}\n\nvoid twoWayMPI::getData\n(\n    word name,\n    word type,\n    int ** const& field,\n    label step\n) const\n{\n    char* charName = wordToChar(name);\n    char* charType = wordToChar(type);\n    data_liggghts_to_of(charName,charType, lmp, (void*&) field, (char *)\"int\");\n}\n\nvoid twoWayMPI::giveData\n(\n    word name,\n    word type,\n    double ** const& field,\n    const char* datatype\n) const\n{\n    char* charName = wordToChar(name);\n    char* charType = wordToChar(type);\n    char* charDatatype= const_cast<char*> (datatype);\n    data_of_to_liggghts(charName,charType, lmp, (void*) field,charDatatype);\n}\n//============\n// double **\nvoid Foam::twoWayMPI::allocateArray\n(\n    double**& array,\n    double initVal,\n    int width,\n    int length\n) const\n{\n    //if(length==-1) then LIGGGHTS uses own length data\n    allocate_external_double(array, width,length,initVal,lmp);\n}\n\nvoid Foam::twoWayMPI::allocateArray\n(\n    double**& array,\n    double initVal,\n    int width,\n    const char* length\n) const\n{\n    //if(length==-1) then LIGGGHTS uses own length data\n    char* charLength= const_cast<char*> (length);\n    allocate_external_double(array, width,charLength,initVal,lmp);\n}\nvoid Foam::twoWayMPI::destroy(double** array,int len) const\n{\n    if (array == NULL) return;\n\n    //for ( int i = 0; i < len; i++ ) // does not work\n    for ( int i = 0; i < 1; i++ )\n        free(array[i]); \n\n    free(array);\n}\n//============\n// int **\nvoid Foam::twoWayMPI::allocateArray\n(\n    int**& array,\n    int initVal,\n    int width,\n    int length\n) const\n{\n    //if(length==-1) then LIGGGHTS uses own length data\n    allocate_external_int(array, width,length,initVal,lmp);\n}\n\nvoid Foam::twoWayMPI::allocateArray\n(\n    int**& array,\n    int initVal,\n    int width,\n    const char* length\n) const\n{\n    //if(length==-1) then LIGGGHTS uses own length data\n    char* charLength= const_cast<char*> (length);\n    allocate_external_int(array, width,charLength,initVal,lmp);\n}\nvoid Foam::twoWayMPI::destroy(int** array,int len) const\n{\n    if (array == NULL) return;\n\n    //for ( int i = 0; i < len; i++ ) // does not work\n    for ( int i = 0; i < 1; i++ )\n        free(array[i]); \n\n    free(array);\n}\n\nbool Foam::twoWayMPI::couple(int i) const\n{\n    bool coupleNow = false;\n    if (i==0)\n    {\n        couplingStep_++;\n        coupleNow = true;\n\n        // start liggghts\n        {\n            // run commands from liggghtsCommands dict\n            Info<<\"Starting up LIGGGHTS\" << endl;\n            particleCloud_.clockM().start(3,\"LIGGGHTS\");\n\n            // check if liggghtsCommandModels with exaxt timing are being run\n            bool exactTiming(false);\n            int runComNr = -10;\n            DynamicList<scalar> interruptTimes(0);\n            DynamicList<int> DEMstepsToInterrupt(0);\n            DynamicList<int> lcModel(0);\n\n            forAll(particleCloud_.liggghtsCommandModelList(),i)\n            {\n                // Check if exact timing is needed\n                // get time for execution\n                // store time for execution in list\n                if(particleCloud_.liggghtsCommand()[i]().exactTiming())\n                {\n                    exactTiming = true;\n                    DynamicList<scalar> h = particleCloud_.liggghtsCommand()[i]().executionsWithinPeriod(TSstart(),TSend());\n\n                    forAll(h,j)\n                    {\n                        // save interrupt times (is this necessary)\n                        interruptTimes.append(h[j]);\n\n                        // calc stepsToInterrupt\n                        DEMstepsToInterrupt.append(DEMstepsTillT(h[j]));\n\n                        // remember which liggghtsCommandModel to run\n                        lcModel.append(i);\n                    }\n\n                    // make cumulative\n                    label len = DEMstepsToInterrupt.size();\n                    label ind(0);\n                    forAll(DEMstepsToInterrupt,i)\n                    {\n                        ind = len-i-1;\n                        if(ind>0)\n                            DEMstepsToInterrupt[ind] -= DEMstepsToInterrupt[ind-1];\n                    }                    \n\n                    Info << \"Foam::twoWayMPI::couple(i): interruptTimes=\" << interruptTimes << endl;\n                    Info << \"Foam::twoWayMPI::couple(i): DEMstepsToInterrupt=\" << DEMstepsToInterrupt << endl;\n                    Info << \"Foam::twoWayMPI::couple(i): lcModel=\" << lcModel << endl;\n                }\n\n                if(particleCloud_.liggghtsCommand()[i]().type()==\"runLiggghts\")\n                    runComNr=i;\n            }\n\n            // models with exact timing exists\n            label commandLines(0);\n            if(exactTiming)\n            {\n                // extension for more liggghtsCommands active the same time:\n                //    sort interrupt list within this run period\n                //    keep track of corresponding liggghtsCommand\n                int DEMstepsRun(0);\n                \n                forAll(interruptTimes,j)\n                {                  \n                    // set run command till interrupt\n                    DEMstepsRun += DEMstepsToInterrupt[j];          \n                    particleCloud_.liggghtsCommand()[runComNr]().set(DEMstepsToInterrupt[j]);\n                    const char* command = particleCloud_.liggghtsCommand()[runComNr]().command(0);\n                    Info << \"Executing run command: '\"<< command <<\"'\"<< endl;\n                    lmp->input->one(command);\n    \n                    // run liggghts command with exact timing\n                    command = particleCloud_.liggghtsCommand()[lcModel[j]]().command(0);\n                    Info << \"Executing command: '\"<< command <<\"'\"<< endl;\n                    lmp->input->one(command);\n                }\n\n                // do the run\n                if(particleCloud_.liggghtsCommand()[runComNr]().runCommand(couplingStep()))\n                {\n                    particleCloud_.liggghtsCommand()[runComNr]().set(couplingInterval() - DEMstepsRun);\n                    const char* command = particleCloud_.liggghtsCommand()[runComNr]().command(0);\n                    Info << \"Executing run command: '\"<< command <<\"'\"<< endl;\n                    lmp->input->one(command);\n                }\n\n                // do the other non exact timing models\n                forAll(particleCloud_.liggghtsCommandModelList(),i)\n                {\n                    if\n                    (\n                      ! particleCloud_.liggghtsCommand()[i]().exactTiming() &&\n                        particleCloud_.liggghtsCommand()[i]().runCommand(couplingStep())\n                    )\n                    {\n                        commandLines=particleCloud_.liggghtsCommand()[i]().commandLines();\n                        for(int j=0;j<commandLines;j++)\n                        {\n                            const char* command = particleCloud_.liggghtsCommand()[i]().command(j);\n                            Info << \"Executing command: '\"<< command <<\"'\"<< endl;\n                            lmp->input->one(command);\n                        }\n                    }\n                }\n            }\n            // no model with exact timing exists\n            else\n            {\n                forAll(particleCloud_.liggghtsCommandModelList(),i)\n                {\n                    if(particleCloud_.liggghtsCommand()[i]().runCommand(couplingStep()))\n                    {\n                        commandLines=particleCloud_.liggghtsCommand()[i]().commandLines();\n                        for(int j=0;j<commandLines;j++)\n                        {\n                            const char* command = particleCloud_.liggghtsCommand()[i]().command(j);\n                            Info << \"Executing command: '\"<< command <<\"'\"<< endl;\n                            lmp->input->one(command);\n                        }\n                    }\n                }\n            }\n\n            particleCloud_.clockM().stop(\"LIGGGHTS\");\n            Info<<\"LIGGGHTS finished\"<<endl;\n        }\n\n        // give nr of particles to cloud\n        double newNpart = liggghts_get_maxtag(lmp);\n        setNumberOfParticles(newNpart);\n        setNumberOfClumps(-2);\n\n        // re-allocate arrays of cloud\n        particleCloud_.clockM().start(4,\"LIGGGHTS_reallocArrays\");\n        particleCloud_.reAllocArrays();\n        particleCloud_.clockM().stop(\"LIGGGHTS_reallocArrays\");\n    }\n\n    return coupleNow;\n}\n\nint Foam::twoWayMPI::getNumberOfParticles() const\n{\n    return liggghts_get_maxtag(lmp);\n}\n\nint Foam::twoWayMPI::getNumberOfClumps() const\n{\n    #ifdef multisphere\n        return liggghts_get_maxtag_ms(lmp);\n    #endif\n\n    Warning << \"liggghts_get_maxtag_ms(lmp) is not available here!\" << endl;\n    return -1;       \n}\n\nint Foam::twoWayMPI::getNumberOfTypes() const\n{\n    #ifdef multisphere\n        return liggghts_get_ntypes_ms(lmp);\n    #endif\n    Warning << \"liggghts_get_maxtag_ms(lmp) is not available here!\" << endl;\n    return -1;\n}\n\ndouble* Foam::twoWayMPI::getTypeVol() const\n{\n    #ifdef multisphere\n        return liggghts_get_vclump_ms(lmp);\n    #endif\n\n    Warning << \"liggghts_get_vclump_ms(lmp) is not available here!\" << endl;\n    return NULL;       \n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/dataExchangeModel/twoWayMPI/twoWayMPI.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    two way DEM-CFD coupling via MPI\n\nClass\n    twoWayMPI\n\nSourceFiles\n    twoWayMPI.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef twoWayMPI_H\n#define twoWayMPI_H\n\n#include \"dataExchangeModel.H\"\n#include \"liggghtsCommandModel.H\"\n#include \"OFstream.H\"\n#include \"sys/stat.h\"\n#include \"pair.h\"\n#include \"force.h\"\n#include \"forceModel.H\"\n\n//=================================//\n//LAMMPS/LIGGGHTS\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <mpi.h>\n#include <lammps.h>         // these are LAMMPS include files\n#include <input.h>\n#include <atom.h>\n#include <library.h>\n#include <error.h>\n#include <library_cfd_coupling.h>\n#include <update.h>\n//=================================//\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass twoWayMPI\n:\n    public dataExchangeModel\n{\nprivate:\n\n  // private data\n    dictionary propsDict_;\n    MPI_Comm comm_liggghts;\n\n  // private member functions\n\n    char* wordToChar(word&) const;\n\nprotected:\n    LAMMPS_NS::LAMMPS *lmp;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"twoWayMPI\");\n\n\n    // Constructors\n\n        //- Construct from components\n        twoWayMPI\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~twoWayMPI();\n\n\n    // Member Functions\n\n        void getData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            label step\n        ) const;\n\n        void getData\n        (\n            word name,\n            word type,\n            int ** const& field,\n            label step\n        ) const;\n\n        void giveData\n        (\n            word name,\n            word type,\n            double ** const& field,\n            const char* datatype\n        ) const;\n\n        //============\n        // double **\n        void allocateArray(double**&, double, int, int) const;\n        void allocateArray(double**&, double, int,const char* =\"nparticles\") const;\n        void destroy(double**,int) const;\n        //============\n        // int **\n        void allocateArray(int**&, int, int, int) const;\n        void allocateArray(int**&, int, int,const char* =\"nparticles\") const;\n        void destroy(int**,int) const;\n        //==============\n\n        bool couple(int) const;\n\n        int getNumberOfParticles() const;\n        int getNumberOfClumps() const;\n        int getNumberOfTypes() const;\n        double* getTypeVol() const;\n\n        word myType() const{return typeName; };\n\n        void setCG() const { setCGs(lmp); };\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"Archimedes.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(Archimedes, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    Archimedes,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nArchimedes::Archimedes\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    twoDimensional_(false),\n    gravityFieldName_(propsDict_.lookupOrDefault<word>(\"gravityFieldName\",\"g\")),\n    #if defined(version21) || defined(version16ext)\n        g_(sm.mesh().lookupObject<uniformDimensionedVectorField> (gravityFieldName_)),\n    #elif defined(version15)\n        g_(dimensionedVector(sm.mesh().lookupObject<IOdictionary>(\"environmentalProperties\").lookup(gravityFieldName_)).value()),\n    #endif\n    rhoFieldName_(propsDict_.lookupOrDefault<word>(\"densityFieldName\",\"rho\")),\n    rho_(sm.mesh().lookupObject<volScalarField> (rhoFieldName_))\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"archimedesForce\");  //first entry must the be the force\n        particleCloud_.probeM().scalarFields_.append(\"Vp\");\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    if (propsDict_.found(\"twoDimensional\"))\n    {\n        twoDimensional_=true;\n        Info << \"2-dimensional simulation - make sure DEM side is 2D\" << endl;\n    }\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(1,true);       // Archimedes only on DEM side (treatForceDEM=true)\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    // sanity check\n    if(!forceSubM(0).treatForceDEM()) FatalError << \"You use 'treatForceDEM=false' for Archimedes, which is not correct.\" << abort(FatalError);\n}\n\nvoid Archimedes::MSinit()\n{\n    // NOTE: all MS related operations need to be performed during init of MS cloud\n    if (particleCloud_.shapeTypeName() == \"multisphere\" && !particleBased_)\n    {\n        Info << type() << \": activating multisphere mode...\" << endl;\n        forceSubM(0).setSwitches(11,true); // this is a MS model\n\n        // re-setup required communication for MS\n        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).setupCommunication();\n    }\n    else if((particleCloud_.shapeTypeName() == \"superquadric\"))\n    {\n        //set default switches (hard-coded default = false)\n        forceSubM(0).setSwitches(16,true); // pullShape=true\n        forceSubM(0).setSwitches(25,true); // superquadric=true\n        forceSubM(0).setSwitches(26,true); // useQuaternion=true\n\n        // read those switches defined above, if provided in dict  // NOT NECESSARY AS WE DO NOT ADD THINGS TO READABLE SWITCHES LIST\n        //for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        //    forceSubM(iFSub).readSwitches();\n\n        // re-setup required communication for SQ\n        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).setupCommunication();\n    }\n    else if((particleCloud_.shapeTypeName() == \"convex\"))\n    {\n        forceSubM(0).setSwitches(29,true); // convex=true\n\n        // read those switches defined above, if provided in dict  // NOT NECESSARY AS WE DO NOT ADD THINGS TO READABLE SWITCHES LIST\n        //for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        //    forceSubM(iFSub).readSwitches();\n\n        // re-setup required communication for SQ\n        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).setupCommunication();\n    }\n    else\n        // TODO NOTE: this model supposedly cannot run in a particle based mode\n        // --> disallow for now\n        FatalError << type() << \": You are trying to run this model in particle based operation mode. This has not been tested. Aborting...\" << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nArchimedes::~Archimedes()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid Archimedes::setForce() const\n{\n    vector force(0,0,0);\n    scalar piBySix(M_PI/6.);\n    scalar Vs(0.);\n    scalar ds(0.);\n    vector position(0,0,0);\n    label cellI=0;\n    scalar RhoInt(0.);\n\n    #include \"resetRhoInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfObjects(particleBased_); index++)\n    {\n        cellI = particleCloud_.cfdemCloud::cellIDs(particleBased_)[index][0];\n        force=vector::zero;\n\n        if (cellI > -1) // particle Found\n        {\n            if(twoDimensional_)\n            {\n                scalar r = particleCloud_.radius(index);\n                force = -g_.value()*forceSubM(0).rhoField()[cellI]*r*r*M_PI; // circle area\n                Warning << \"Archimedes::setForce() : this functionality is not tested!\" << endl;\n            }\n            else\n            {\n                if (forceSubM(0).interpolation())\n                {\n                    position = particleCloud_.cfdemCloud::position(index, particleBased_);\n                    RhoInt = RhoInterpolator_().interpolate(position, cellI);\n                }\n                else\n                    RhoInt = forceSubM(0).rhoField()[cellI];\n\n                if (forceSubM(0).sq() || forceSubM(0).convex())\n                {\n                    Vs = particleCloud_.volume(index);\n                }\n                else\n                {\n                    ds = particleCloud_.diameter(index, particleBased_);\n                    scalar dParcel = ds;\n                    forceSubM(0).scaleDia(dParcel,index); //caution: this fct will scale ds!\n                    Vs = dParcel*dParcel*dParcel*piBySix;\n                }\n\n                force = -g_.value() * RhoInt * Vs;\n\n                forceSubM(0).scaleForce(force,ds,index);\n            }\n\n            if(forceSubM(0).verbose() && index==0)\n            {\n                Pout << \"g = \" << g_.value() << endl;\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                if (forceSubM(0).interpolation())\n                    Pout << \"Rho(\" << position <<\") = \"<< RhoInt << endl;\n                else\n                    Pout << \"forceSubM(0).rhoField()[cellI] = \" << forceSubM(0).rhoField()[cellI] << endl;\n                Pout << \"Vs = \" << Vs << endl;\n                Pout << \"force = \" << force << endl;\n\n                if (forceSubM(0).ms())\n                {\n                    label ind = particleCloud_.clumpIndexOfParticle(index);\n                    Pout << \"clumpType = \" << particleCloud_.clumpType(ind) << endl;\n                }\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, force);           //first entry must the be the force\n                sValues.setSize(sValues.size()+1, particleCloud_.cfdemCloud::particleVolume(index)); //change this to Vs after TH is clean\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,force,vector::zero);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/Archimedes/Archimedes.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Archimedes buoyancy force for sphere / cylinder (2d)\n    basic \"on-off\" handling of buoyancy at the interface\n\nClass\n    Archimedes\n\nSourceFiles\n    Archimedes.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef Archimedes_H\n#define Archimedes_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class Archimedes Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass Archimedes\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    bool twoDimensional_;\n\n    word gravityFieldName_;\n\n    #ifdef version21\n        const uniformDimensionedVectorField& g_;    // ref to gravity\n    #elif defined(version16ext) || defined(version15)\n        const dimensionedVector& g_;    // ref to gravity\n    #endif\n\n    word rhoFieldName_;\n    const volScalarField& rho_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"Archimedes\");\n\n\n    // Constructors\n\n        //- Construct from components\n        Archimedes\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~Archimedes();\n\n\n    // Member Functions\n        void setForce() const;\n\n        void MSinit();\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/ArchimedesIB/ArchimedesIB.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"ArchimedesIB.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(ArchimedesIB, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    ArchimedesIB,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nArchimedesIB::ArchimedesIB\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    twoDimensional_(false),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")), //mod by alice\n    voidfractions_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),//mod by alice\n    gravityFieldName_(propsDict_.lookupOrDefault<word>(\"gravityFieldName\",\"g\")),\n    #if defined(version21) || defined(version16ext)\n        g_(sm.mesh().lookupObject<uniformDimensionedVectorField> (gravityFieldName_))\n    #elif  defined(version15)\n        g_(dimensionedVector(sm.mesh().lookupObject<IOdictionary>(\"environmentalProperties\").lookup(gravityFieldName_)).value())\n    #endif\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"archimedesIBForce\");  //first entry must the be the force\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    if (propsDict_.found(\"twoDimensional\"))\n    {\n        twoDimensional_=true;\n        Info << \"2-dimensional simulation - make sure DEM side is 2D\" << endl;\n    }\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(0,true);  // enable treatExplicit, otherwise this force would be implicit in slip vel! - IMPORTANT!\n    forceSubM(0).setSwitches(1,true); // treatDEM = true\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nArchimedesIB::~ArchimedesIB()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid ArchimedesIB::setForce() const\n{\n    vector force;\n\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        force=vector::zero;\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n            if (cellI > -1) // particle Found\n            {\n                //force += -g_.value()*forceSubM(0).rhoField()[cellI]*forceSubM(0).rhoField().mesh().V()[cellI]*(1-particleCloud_.voidfractions()[index][subCell]);//mod by alice\n            \tforce += -g_.value()*forceSubM(0).rhoField()[cellI]*particleCloud_.mesh().V()[cellI]*(1-voidfractions_[cellI]);//mod by alice\n    \t    }\n        }\n\n        //Set value fields and write the probe\n        if(probeIt_)\n        {\n            #include \"setupProbeModelfields.H\"\n            // Note: for other than ext one could use vValues.append(x)\n            // instead of setSize\n            vValues.setSize(vValues.size()+1, force);           //first entry must the be the force\n            particleCloud_.probeM().writeProbe(index, sValues, vValues);\n        }\n\n        // set force on particle\n        if(twoDimensional_) Warning<<\"ArchimedesIB model doesn't work for 2D right now!!\\n\"<< endl;\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,force,vector::zero);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/ArchimedesIB/ArchimedesIB.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    ArchimedesIB buoyancy force for sphere / cylinder (2d)\n    basic \"on-off\" handling of buoyancy at the interface\n\n\tContribution by Alice Hager.\n\nClass\n    ArchimedesIB\n\nSourceFiles\n    ArchimedesIB.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef ArchimedesIB_H\n#define ArchimedesIB_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class ArchimedesIB Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass ArchimedesIB\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    bool twoDimensional_;\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfractions_;\n\n    word gravityFieldName_;\n\n    #ifdef version21\n        const uniformDimensionedVectorField& g_;    // ref to gravity\n    #elif defined(version16ext) || defined(version15)\n        const dimensionedVector& g_;    // ref to gravity\n    #endif\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"ArchimedesIB\");\n\n\n    // Constructors\n\n        //- Construct from components\n        ArchimedesIB\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~ArchimedesIB();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"DiFeliceDrag.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(DiFeliceDrag, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    DiFeliceDrag,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nDiFeliceDrag::DiFeliceDrag\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    voidfraction_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    UsFieldName_(propsDict_.lookupOrDefault<word>(\"granVelFieldName\",\"Us\")),\n    UsField_(sm.mesh().lookupObject<volVectorField> (UsFieldName_))\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if (probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"dragForce\"); //first entry must be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");      //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Rep\");       //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Cd\");        //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"voidfraction\");       //other are debug\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(2,true,true); // activate implForceDEM switch and set default to true\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n    forceSubM(0).setSwitchesList(17,true); // activate DiFelice drag correction switch\n    forceSubM(0).setSwitchesList(18,true); // activate Rong drag correction switch\n    forceSubM(0).setSwitchesList(23,true); // activate Tang drag correction switch\n    forceSubM(0).setSwitchesList(28,true); // allow particle specific coarsegraining\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(17,true);  // DiFelice drag correction as default\n    forceSubM(0).setSwitches(18,false); // Rong drag correction NOT default\n    forceSubM(0).setSwitches(23,false); // Tang drag correction NOT default\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // sanity check\n    if (forceSubM(0).voidageFunctionRong()) // not default\n    {\n        Info << \"Using non-default model voidageFunctionRong!\" << endl;\n        forceSubM(0).setSwitches(17,false);\n        forceSubM(0).setSwitches(23,false);\n    }\n    else if(forceSubM(0).voidageFunctionTang()) // not default\n    {\n        Info << \"Using non-default model voidageFunctionTang!\" << endl;\n        forceSubM(0).setSwitches(17,false);\n        forceSubM(0).setSwitches(18,false);\n    }\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\nvoid DiFeliceDrag::MSinit()\n{\n    // NOTE: all MS related operations need to be performed during init of MS cloud\n    if (particleCloud_.shapeTypeName() == \"multisphere\" && !particleBased_)\n    {\n        Info << type() << \": activating multisphere mode...\" << endl;\n        forceSubM(0).setSwitches(11,true); // this is a MS model\n        particleCloud_.checkCG(false);\n\n        // read hydraulic diameter correctors\n        readDHcorr(propsDict_);\n\n        // re-setup required communication for MS\n        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).setupCommunication();\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nDiFeliceDrag::~DiFeliceDrag()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid DiFeliceDrag::setForce() const\n{\n    const volScalarField& nufField = forceSubM(0).nuField();\n    const volScalarField& rhoField = forceSubM(0).rhoField();\n\n    //update force submodels to prepare for loop\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).preParticleLoop(forceSubM(iFSub).verbose());\n\n    vector position(0,0,0);\n    scalar voidfraction(1);\n    vector Ufluid(0,0,0);\n    vector drag(0,0,0);\n    vector dragExplicit(0,0,0);\n    scalar dragCoefficient(0);\n    label cellI=0;\n    vector Us(0,0,0);\n    vector Ur(0,0,0);\n    scalar ds(0);\n    scalar dParcel(0);\n    scalar nuf(0);\n    scalar rho(0);\n    scalar magUr(0);\n    scalar Rep(0);\n    scalar Cd(0);\n\n    #include \"resetVoidfractionInterpolator.H\"\n    #include \"resetUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    // loop all objects\n    for (int index = 0;index <  particleCloud_.numberOfObjects(particleBased_); index++)\n    {\n        cellI = particleCloud_.cellIDs(particleBased_)[index][0];\n\n        drag=vector::zero;\n        dragExplicit=vector::zero;\n        Ufluid=vector::zero;\n        dragCoefficient = 0;\n\n        if (cellI > -1) // particle Found\n        {\n            if (forceSubM(0).interpolation())\n            {\n                position = particleCloud_.position(index, particleBased_);\n\n                voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                Ufluid = UInterpolator_().interpolate(position,cellI);\n\n                //Ensure interpolated void fraction to be meaningful\n                // Info << \" --> voidfraction: \" << voidfraction << endl;\n                if(voidfraction>1.00) voidfraction = 1.00;\n                if(voidfraction<0.30) voidfraction = 0.30;\n            }\n            else\n            {\n                voidfraction = voidfraction_[cellI];\n                Ufluid = U_[cellI];\n            }\n\n            // correct voidfraction\n            ds = particleCloud_.diameter(index, particleBased_);\n//             for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n//                 forceSubM(iFSub).calculateCorrectedVoidage(\n//                     voidfraction, Ufluid, U_.mesh().V()[cellI], ds );\n\n            Us = particleCloud_.velocity(index, particleBased_);\n\n            dParcel = ds;\n            forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n            nuf = nufField[cellI];\n            rho = rhoField[cellI];\n\n            //Update any scalar or vector quantity\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                  forceSubM(iFSub).update(  index,\n                                            cellI,\n                                            ds,\n                                            Ufluid,\n                                            Us,\n                                            nuf,\n                                            rho,\n                                            forceSubM(0).verbose()\n                                         );\n\n            Ur = Ufluid-Us;\n            magUr = mag(Ur);\n            Rep = 0;\n            Cd = 0;\n\n            if (magUr > SMALL && ds > SMALL)\n            {\n\n                // calc particle Re Nr\n                Rep = ds*voidfraction*magUr/(nuf+SMALL);\n\n                // calc fluid drag Coeff\n                Cd = sqr(0.63 + 4.8/sqrt(Rep));\n\n                // calc model coefficient Xi\n                scalar Xi = 0;\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                {\n                    forceSubM(iFSub).calcXi(ds,voidfraction,magUr,nuf,Xi);\n                }\n\n                // calc particle's drag\n                dragCoefficient = 0.125*Cd*rho\n                                 *M_PI\n                                 *ds*ds\n                                 *pow(voidfraction,(2-Xi))*magUr;\n\n                if (modelType_==\"B\")\n                    dragCoefficient /= voidfraction;\n\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                    forceSubM(iFSub).scaleCoeff(dragCoefficient,dParcel,Rep,index);\n                drag = dragCoefficient*Ur; //total drag force!\n\n                // explicitCorr\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                    forceSubM(iFSub).explicitCorr( drag,\n                                                   dragExplicit,\n                                                   dragCoefficient,\n                                                   Ufluid, U_[cellI], Us, UsField_[cellI],\n                                                   forceSubM(iFSub).verbose()\n                                                 );\n            }\n\n            if (forceSubM(0).verbose() && index==0)\n            {\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                Pout << \"Us = \" << Us << endl;\n                Pout << \"Ur = \" << Ur << endl;\n                Pout << \"dprim = \" << ds << endl;\n                Pout << \"dParcel = \" << dParcel << endl;\n                Pout << \"rho = \" << rho << endl;\n                Pout << \"nuf = \" << nuf << endl;\n                Pout << \"voidfraction = \" << voidfraction << endl;\n                Pout << \"Rep = \" << Rep << endl;\n                Pout << \"Cd = \" << Cd << endl;\n                Pout << \"dragCoefficient = \" << dragCoefficient << endl;\n                Pout << \"drag (total) = \" << drag << endl;\n\n                if (forceSubM(0).ms())\n                {\n                    label ind = particleCloud_.clumpIndexOfParticle(index);\n                    Pout << \"ds/scale = \" << ds/forceSubM(0).getCG() << endl;\n                    Pout << \"scale = \" << forceSubM(0).getCG() << endl;\n                    Pout << \"scaleDrag_ = \" << forceSubM(0).scaleDrag() << endl;\n                    Pout << \"clumpType = \"\n                         << particleCloud_.clumpType(ind) << endl;\n                }\n            }\n\n            //Set value fields and write the probe\n            if (probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, drag);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                sValues.setSize(sValues.size()+1, Rep);\n                sValues.setSize(sValues.size()+1, Cd);\n                sValues.setSize(sValues.size()+1, voidfraction);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,drag,dragExplicit,Ufluid,dragCoefficient);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/DiFeliceDrag/DiFeliceDrag.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Di Felice drag law (Zhou et al. (2010), JFM)\n\nClass\n    DiFeliceDrag\n\nSourceFiles\n    DiFeliceDrag.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef DiFeliceDrag_H\n#define DiFeliceDrag_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class DiFeliceDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass DiFeliceDrag\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfraction_;\n\n    word UsFieldName_;\n\n    const volVectorField& UsField_;  // the average particle velocity field (for implicit/expliti force split)\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"DiFeliceDrag\");\n\n\n    // Constructors\n\n        //- Construct from components\n        DiFeliceDrag\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~DiFeliceDrag();\n\n\n    // Member Functions\n        void setForce() const;\n\n        void MSinit();\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"GidaspowDrag.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"averagingModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(GidaspowDrag, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    GidaspowDrag,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nGidaspowDrag::GidaspowDrag\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    voidfraction_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    phi_(propsDict_.lookupOrDefault<scalar>(\"phi\",1.)),\n    UsFieldName_(propsDict_.lookupOrDefault<word>(\"granVelFieldName\",\"Us\")),\n    UsField_(sm.mesh().lookupObject<volVectorField> (UsFieldName_)),\n    switchingVoidfraction_(0.8)\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"dragForce\"); //first entry must be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");      //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Rep\");       //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"betaP\");\n        particleCloud_.probeM().scalarFields_.append(\"voidfraction\");       //other are debug\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(2,true,true); // activate implForceDEM switch and set default to true\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n\n    //set default switches (hard-coded default = false)\n    //forceSubM(0).setSwitches(XXX,true);\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    if (propsDict_.found(\"switchingVoidfraction\"))\n        switchingVoidfraction_ = readScalar(propsDict_.lookup(\"switchingVoidfraction\"));\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nGidaspowDrag::~GidaspowDrag()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid GidaspowDrag::setForce() const\n{\n    const volScalarField& nufField = forceSubM(0).nuField();\n    const volScalarField& rhoField = forceSubM(0).rhoField();\n\n    //update force submodels to prepare for loop\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).preParticleLoop(forceSubM(iFSub).verbose());\n\n    vector position(0,0,0);\n    scalar voidfraction(1);\n    vector Ufluid(0,0,0);\n    vector drag(0,0,0);\n    label cellI=0;\n    vector Us(0,0,0);\n    vector Ur(0,0,0);\n    scalar ds(0);\n    scalar dParcel(0);\n    scalar nuf(0);\n    scalar rho(0);\n    scalar magUr(0);\n    scalar Rep(0);\n    scalar Vs(0);\n    scalar localPhiP(0);\n\n    scalar CdMagUrLag(0);       //Cd of the very particle\n    scalar betaP(0);             //momentum exchange of the very particle\n\n    vector dragExplicit(0,0,0);\n    scalar dragCoefficient(0);\n\n    #include \"resetVoidfractionInterpolator.H\"\n    #include \"resetUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n        drag=vector::zero;\n        dragExplicit=vector::zero;\n        Ufluid=vector::zero;\n        betaP = 0;\n        Vs = 0;\n        voidfraction=0;\n        dragCoefficient = 0;\n\n        if (cellI > -1) // particle Found\n        {\n            if(forceSubM(0).interpolation())\n            {\n                position = particleCloud_.cfdemCloud::position(index);\n                voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                Ufluid = UInterpolator_().interpolate(position,cellI);\n\n                //Ensure interpolated void fraction to be meaningful\n                // Info << \" --> voidfraction: \" << voidfraction << endl;\n                if(voidfraction>1.00) voidfraction = 1.0;\n                if(voidfraction<0.10) voidfraction = 0.10;\n            }else\n            {\n                voidfraction = voidfraction_[cellI];\n                Ufluid = U_[cellI];\n            }\n\n            // correct voidfraction\n            ds = 2*particleCloud_.radius(index);\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                forceSubM(iFSub).calculateCorrectedVoidage(\n                    voidfraction, Ufluid, U_.mesh().V()[cellI], ds );\n\n            Us = particleCloud_.cfdemCloud::velocity(index);\n            dParcel = ds;\n            forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n            rho = rhoField[cellI];\n            nuf = nufField[cellI];\n\n            //Update any scalar or vector quantity\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                  forceSubM(iFSub).update(  index,\n                                            cellI,\n                                            ds,\n                                            Ufluid,\n                                            Us,\n                                            nuf,\n                                            rho,\n                                            forceSubM(0).verbose()\n                                         );\n\n            Vs = ds*ds*ds*M_PI/6;\n            Ur = Ufluid-Us;\n            magUr = mag(Ur);\n            Rep=0.0;\n            localPhiP = 1.0f-voidfraction+SMALL;\n\n            // calc particle's drag coefficient (i.e., Force per unit slip velocity and per m³ PARTICLE)\n            if(voidfraction > switchingVoidfraction_) //dilute\n            {\n                Rep=ds*voidfraction*magUr/(nuf+SMALL);\n                CdMagUrLag = (24.0*nuf/(ds*voidfraction)) //1/magUr missing here, but compensated in expression for betaP!\n                             *(scalar(1.0)+0.15*Foam::pow(Rep, 0.687));\n\n                betaP = 0.75*(                                  //this is betaP = beta / localPhiP!\n                                        rho*voidfraction*CdMagUrLag\n                                      /\n                                        (ds*Foam::pow(voidfraction,2.65))\n                                      );\n            }\n            else  //dense\n            {\n                betaP = (150 * localPhiP*nuf*rho)          //this is betaP = beta / localPhiP!\n                         /  (voidfraction*ds*phi_*ds*phi_)\n                        +\n                          (1.75 * magUr * rho)\n                         /((ds*phi_));\n            }\n\n            // calc particle's drag\n            dragCoefficient = Vs*betaP;\n            if (modelType_==\"B\")\n                dragCoefficient /= voidfraction;\n\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++) forceSubM(iFSub).scaleCoeff(dragCoefficient,dParcel,Rep,index);\n            drag = dragCoefficient * Ur;\n\n            // explicitCorr\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                forceSubM(iFSub).explicitCorr( drag,\n                                               dragExplicit,\n                                               dragCoefficient,\n                                               Ufluid, U_[cellI], Us, UsField_[cellI],\n                                               forceSubM(iFSub).verbose()\n                                             );\n            if(forceSubM(0).verbose() && index >=0 && index <2)\n            {\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                Pout << \"Us = \" << Us << endl;\n                Pout << \"Ur = \" << Ur << endl;\n                Pout << \"dprim = \" << ds << endl;\n                Pout << \"phi = \" << phi_ << endl;\n                Pout << \"rho = \" << rho << endl;\n                Pout << \"nuf = \" << nuf << endl;\n                Pout << \"voidfraction = \" << voidfraction << endl;\n                Pout << \"Rep = \" << Rep << endl;\n                Pout << \"betaP = \" << betaP << endl;\n                Pout << \"drag = \" << drag << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, drag);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                sValues.setSize(sValues.size()+1, Rep);\n                sValues.setSize(sValues.size()+1, betaP);\n                sValues.setSize(sValues.size()+1, voidfraction);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,drag,dragExplicit,Ufluid,dragCoefficient);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/GidaspowDrag/GidaspowDrag.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Gidaspow drag law\n    - only valid for low-Reynolds number systems (Re_p<1000)\n    - including interpolation of the velocity to the exact position\n    - splits off explicit drag component due to fluctuation in fluid and particle\n      velocity (optional via forceSubModel \"ImExCorr\")\n\nClass\n    GidaspowDrag\n\nSourceFiles\n    GidaspowDrag.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef GidaspowDrag_H\n#define GidaspowDrag_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class GidaspowDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass GidaspowDrag\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfraction_;\n\n    const scalar phi_;\n\n    word UsFieldName_;   \n\n    const volVectorField& UsField_;  // the average particle velocity field\n\n    mutable scalar switchingVoidfraction_; //voidfraction above which dilute formulation will be used\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"GidaspowDrag\");\n\n\n    // Constructors\n\n        //- Construct from components\n        GidaspowDrag\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~GidaspowDrag();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"KochHillDrag.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(KochHillDrag, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    KochHillDrag,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nKochHillDrag::KochHillDrag\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    voidfraction_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    UsFieldName_(propsDict_.lookupOrDefault(\"granVelFieldName\",word(\"Us\"))),\n    UsField_(sm.mesh().lookupObject<volVectorField> (UsFieldName_))\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"dragForce\"); //first entry must be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");      //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Rep\");       //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"beta\");      //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"voidfraction\");       //other are debug\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(2,true,true); // activate implForceDEM switch and set default to true\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(7,true); // activate implForceDEMacc switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n\n    //set default switches (hard-coded default = false)\n    //forceSubM(0).setSwitches(XXX,true);\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nKochHillDrag::~KochHillDrag()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid KochHillDrag::setForce() const\n{\n    const volScalarField& nufField = forceSubM(0).nuField();\n    const volScalarField& rhoField = forceSubM(0).rhoField();\n\n    //update force submodels to prepare for loop\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).preParticleLoop(forceSubM(iFSub).verbose());\n\n    vector position(0,0,0);\n    scalar voidfraction(1);\n    vector Ufluid(0,0,0);\n    vector drag(0,0,0);\n    vector dragExplicit(0,0,0);\n    scalar dragCoefficient(0);\n    label cellI=0;\n    vector Us(0,0,0);\n    vector Ur(0,0,0);\n    scalar ds(0);\n    scalar dParcel(0);\n    scalar nuf(0);\n    scalar rho(0);\n    scalar magUr(0);\n    scalar Rep(0);\n    scalar Vs(0);\n    scalar volumefraction(0);\n    scalar betaP(0);\n\n    scalar piBySix(M_PI/6);\n    int couplingInterval(particleCloud_.dataExchangeM().couplingInterval());\n\n    #include \"resetVoidfractionInterpolator.H\"\n    #include \"resetUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n        drag=vector::zero;\n        dragExplicit=vector::zero;\n        Ufluid=vector::zero;\n        dragCoefficient=0;\n        betaP = 0;\n        Vs = 0;\n        voidfraction=0;\n\n        if (cellI > -1) // particle Found\n        {\n            if(forceSubM(0).interpolation())\n            {\n                position = particleCloud_.cfdemCloud::position(index);\n                voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                Ufluid = UInterpolator_().interpolate(position,cellI);\n\n                //Ensure interpolated void fraction to be meaningful\n                // Info << \" --> voidfraction: \" << voidfraction << endl;\n                if(voidfraction>1.00) voidfraction = 1.00;\n                if(voidfraction<0.40) voidfraction = 0.40;\n            }else\n            {\n                voidfraction = voidfraction_[cellI];\n                Ufluid = U_[cellI];\n            }\n\n            // correct voidfraction\n            ds = particleCloud_.diameter(index);\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                forceSubM(iFSub).calculateCorrectedVoidage(\n                    voidfraction, Ufluid, U_.mesh().V()[cellI], ds );\n\n            dParcel = ds;\n            forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n            nuf = nufField[cellI];\n            rho = rhoField[cellI];\n\n            Us = particleCloud_.cfdemCloud::velocity(index);\n\n            //Update any scalar or vector quantity\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                  forceSubM(iFSub).update(  index,\n                                            cellI,\n                                            ds,\n                                            Ufluid,\n                                            Us,\n                                            nuf,\n                                            rho,\n                                            forceSubM(0).verbose()\n                                         );\n\n            Ur = Ufluid-Us;\n            magUr = mag(Ur);\n            Rep = 0;\n\n            Vs = ds*ds*ds*piBySix;\n\n            volumefraction = max(SMALL,min(1-SMALL,1-voidfraction));\n\n            if (magUr > 0)\n            {\n\n                // calc particle Re Nr\n                Rep = ds*voidfraction*magUr/(nuf+SMALL);\n\n                // calc model coefficient F0\n                scalar F0=0.;\n                if(volumefraction < 0.4)\n                {\n                    F0 = (1. + 3.*sqrt((volumefraction)/2.) + (135./64.)*volumefraction*log(volumefraction)\n                          + 16.14*volumefraction\n                         )/\n                         (1+0.681*volumefraction-8.48*sqr(volumefraction)\n                          +8.16*volumefraction*volumefraction*volumefraction\n                         );\n                } else {\n                    F0 = 10*volumefraction/(voidfraction*voidfraction*voidfraction);\n                }\n\n                // calc model coefficient F3\n                scalar F3 = 0.0673+0.212*volumefraction+0.0232/pow(voidfraction,5);\n\n                //Calculate F (the factor 0.5 is introduced, since Koch and Hill, ARFM 33:619–47, use the radius\n                //to define Rep, and we use the particle diameter, see vanBuijtenen et al., CES 66:2368–2376.\n                scalar F = voidfraction * (F0 + 0.5*F3*Rep);\n\n                // calc drag model coefficient betaP\n                betaP = 18.*nuf*rho/(ds*ds)*voidfraction*F;\n\n                // calc particle's drag\n                dragCoefficient = Vs*betaP;\n                if (modelType_==\"B\")\n                    dragCoefficient /= voidfraction;\n\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++) forceSubM(iFSub).scaleCoeff(dragCoefficient,dParcel,Rep,index);\n\n                if(forceSubM(0).switches()[7]) // implForceDEMaccumulated=true\n                {\n                    //get drag from the particle itself\n                    for (int j=0 ; j<3 ; j++) drag[j] = particleCloud_.fAccs()[index][j]/couplingInterval;\n                }else\n                {\n                    drag = dragCoefficient * Ur;\n\n                    // explicitCorr\n                    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                        forceSubM(iFSub).explicitCorr( drag,\n                                                       dragExplicit,\n                                                       dragCoefficient,\n                                                       Ufluid, U_[cellI], Us, UsField_[cellI],\n                                                       forceSubM(iFSub).verbose()\n                                                     );\n                }\n            }\n\n            if(forceSubM(0).verbose() && index >=0 && index <2)\n            {\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                Pout << \"Us = \" << Us << endl;\n                Pout << \"Ur = \" << Ur << endl;\n                Pout << \"dprim = \" << ds << endl;\n                Pout << \"rho = \" << rho << endl;\n                Pout << \"nuf = \" << nuf << endl;\n                Pout << \"voidfraction = \" << voidfraction << endl;\n                Pout << \"Rep = \" << Rep << endl;\n                Pout << \"betaP = \" << betaP << endl;\n                Pout << \"dragCoefficient = \" << dragCoefficient << endl;\n                Pout << \"drag = \" << drag << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, drag);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                sValues.setSize(sValues.size()+1, Rep);\n                sValues.setSize(sValues.size()+1, betaP);\n                sValues.setSize(sValues.size()+1, voidfraction);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,drag,dragExplicit,Ufluid,dragCoefficient);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/KochHillDrag/KochHillDrag.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Koch, Hill drag law\n    based on Koch Hill 2001,\"Inertial effects in suspensions and porous-media \n    flows\", Annual Review of fluid mechanics.\n    including interpolation of the velocity to the exact position\n    including drag coefficient for implicit drag for DEM\n\nClass\n    KochHillDrag\n\nSourceFiles\n    KochHillDrag.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef KochHillDrag_H\n#define KochHillDrag_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class KochHillDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass KochHillDrag\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfraction_;\n\n    word UsFieldName_;   \n\n    const volVectorField& UsField_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"KochHillDrag\");\n\n\n    // Constructors\n\n        //- Construct from components\n        KochHillDrag\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~KochHillDrag();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"LaEuScalarTemp.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(LaEuScalarTemp, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    LaEuScalarTemp,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nLaEuScalarTemp::LaEuScalarTemp\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word name\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(name == \"\" ? typeName + \"Props\" : name + \"Props\")),\n    compressible_(propsDict_.lookupOrDefault<Switch>(\"compressible\",false)),\n    EuFieldName_(propsDict_.lookupOrDefault<word> (\"EuFieldName\",(compressible_ == false) ? \"Tsource\" : \"Qsource\")),\n    tempFieldName_(propsDict_.lookup(\"tempFieldName\")),\n    T_(sm.mesh().lookupObject<volScalarField> (tempFieldName_)),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    voidfraction_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    maxSource_(1e30),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    lambda_(propsDict_.lookupOrDefault<scalar>(\"lambda\", -1.0)),\n    Cp_(propsDict_.lookupOrDefault<scalar>(\"Cp\", -1.0)),\n    CpField_\n    (\n        IOobject\n        (\n            \"CpField\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(0, 2, -2, -1, 0, 0, 0), Cp_)\n    ),\n    LambdaField_\n    (\n        IOobject\n        (\n            \"LambdaField\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(1, 1, -3, -1, 0, 0, 0), lambda_)\n    ),\n    NuCorrelation_(propsDict_.lookupOrDefault<word>(\"NuCorrelation\", \"LiMason\"))\n{\n    /*if (lambda_<0)\n    {\n        Warning << \"You tried using an invalid value (<0) for lambda - using SMALL instead!\" << endl;\n        lambda_=SMALL;\n    } else if (lambda_==0)\n        Warning << \"Ignoring fluid-particle heat transfer as lambda was is to 0!\" << endl;*/\n\n    if (propsDict_.found(\"maxSource\"))\n    {\n        maxSource_=readScalar(propsDict_.lookup (\"maxSource\"));\n        Info << \"limiting eulerian source field to: \" << maxSource_ << endl;\n    }\n\n    if(compressible_) Info << \"Compressibility mode enabled.\" << endl;\n\n    if (NuCorrelation_ == \"LiMason\")\n    {\n        Info << \"LaEuScalarTemp: using LiMason correlation for Nusselt number.\" << endl;\n        Nusselt=&LaEuScalarTemp::NuLiMason;\n    }\n    else if (NuCorrelation_ == \"Deen\")\n    {\n        Info << \"LaEuScalarTemp: using Deen correlation for Nusselt number.\" << endl;\n        Nusselt = &LaEuScalarTemp::NuDeen;\n    }\n    else if (NuCorrelation_ == \"Gunn\")\n    {\n        Info << \"LaEuScalarTemp: using Gunn correlation for Nusselt number.\" << endl;\n        Nusselt = &LaEuScalarTemp::NuGunn;\n    }\n    else\n        FatalError << \"Unknown name for Nusselt number correlation: '\" << NuCorrelation_\n            << \"'. Must be 'LiMason' or 'Deen' or 'Gunn'.\"\n            << abort(FatalError);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(32,true); // pullConvectiveHeatFlux\n    forceSubM(0).setSwitches(33,true); // pullTemp\n\n    // re-setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    particleCloud_.checkCG(true);\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nLaEuScalarTemp::~LaEuScalarTemp()\n{\n}\n\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\n\nvoid LaEuScalarTemp::setForce() const\n{\n        // build reference\n        volScalarField& EuField(particleCloud_.mesh().lookupObjectRef<volScalarField> (EuFieldName_));\n\n        // reset Scalar field\n        forAll(EuField,cellI) EuField[cellI] = 0.;\n\n        const volScalarField& nufField = forceSubM(0).nuField();\n        const volScalarField& rhoField = forceSubM(0).rhoField();\n\n        // calc La based heat flux\n        vector position(0,0,0);\n        scalar voidfraction(1);\n        vector Ufluid(0,0,0);\n        scalar Tfluid(0);\n        label cellI=0;\n        vector Us(0,0,0);\n        scalar ds(0);\n        scalar dparcel(0);\n        scalar numberParticlesInParcel(1);\n        scalar nuf(0);\n        scalar rho(0);\n        scalar magUr(0);\n        scalar As(0);\n        scalar Rep(0);\n        scalar Pr(0);\n        scalar Nup(0);\n\n        #include \"resetVoidfractionInterpolator.H\"\n        #include \"resetUInterpolator.H\"\n        #include \"resetTInterpolator.H\"\n\n        if(Cp_ < 0) CpField_ = EuField.mesh().lookupObject<volScalarField> (\"Cp\");\n        if(lambda_<0)\n        {\n            const volScalarField& alpha = EuField.mesh().lookupObject<volScalarField> (\"thermo:alpha\");\n            LambdaField_ = alpha*CpField_;\n        }\n\n        for(int index = 0;index < particleCloud_.numberOfParticles(); ++index)\n        {\n            //if(particleCloud_.regionM().inRegion()[index][0])\n            //{\n                cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n                if(cellI >= 0)\n                {\n                    if(forceSubM(0).interpolation())\n                    {\n                        position = particleCloud_.cfdemCloud::position(index);\n                        voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                        Ufluid = UInterpolator_().interpolate(position,cellI);\n                        Tfluid = TInterpolator_().interpolate(position,cellI);\n                    }else\n                    {\n                        voidfraction = voidfraction_[cellI];\n                        Ufluid = U_[cellI];\n                        Tfluid = T_[cellI];\n                    }\n\n                    // calc relative velocity\n                    Us = particleCloud_.cfdemCloud::velocity(index);\n                    ds = 2*particleCloud_.radius(index);\n                    dparcel = ds;\n                    forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n                    numberParticlesInParcel    = dparcel/ds;\n                    numberParticlesInParcel   *= numberParticlesInParcel*numberParticlesInParcel;\n                    nuf = nufField[cellI];\n                    rho = rhoField[cellI];\n                    if (LambdaField_[cellI]<0)\n                    {\n                        Warning << \"You tried using an invalid value (<0) for lambda - using SMALL instead!\" << endl;\n                        LambdaField_[cellI]=SMALL;\n                    }\n                    if (CpField_[cellI]<0)\n                    {\n                        Warning << \"You tried using an invalid value (<0) for Cp - using SMALL instead!\" << endl;\n                        CpField_[cellI]=SMALL;\n                    }\n\n                    //Update any scalar or vector quantity\n                    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                          forceSubM(iFSub).update(  index,\n                                                    cellI,\n                                                    ds,\n                                                    Ufluid,\n                                                    Us,\n                                                    nuf,\n                                                    rho,\n                                                    forceSubM(0).verbose()\n                                                 );\n\n                    magUr = mag(Ufluid-Us);\n                    As = ds*ds*M_PI*numberParticlesInParcel;\n\n                    Rep = ds*magUr/nuf;\n                    scalar h(0.);\n                    Nup = 0.;\n                    Pr = 0.;\n                    if(LambdaField_[cellI]>0)\n                    {\n                        Pr = max(SMALL,CpField_[cellI]*nuf*rho/LambdaField_[cellI]);\n\n                        Nup = (this->*Nusselt)(Rep, Pr, voidfraction);\n\n                        h = LambdaField_[cellI]*Nup/(ds);\n                    }\n\n                    // calc convective heat flux [W]\n                    scalar partHeatFlux     = h * As * (Tfluid - particleCloud_.fieldsToDEM[particleCloud_.idTemp()][index][0]);\n                    particleCloud_.fieldsToDEM[particleCloud_.idConvectiveHeatFlux()][index][0] = partHeatFlux;\n\n                    if(forceSubM(0).verbose() && index >=0 && index <2)\n                    {\n                        Pout << \"magUr = \" << magUr << endl;\n                        Pout << \"As = \" << As << endl;\n                        Pout << \"r = \" << particleCloud_.radius(index) << endl;\n                        Pout << \"dprim = \" << ds << endl;\n                        Pout << \"nuf = \" << nuf << endl;\n                        Pout << \"Rep = \" << Rep << endl;\n                        Pout << \"Pr = \" << Pr << endl;\n                        Pout << \"Nup = \" << Nup << endl;\n                        Pout << \"voidfraction = \" << voidfraction << endl;\n                        Pout << \"particleCloud_.fieldsToDEM[particleCloud_.idTemp()][index][0] = \" << particleCloud_.fieldsToDEM[particleCloud_.idTemp()][index][0] << endl;\n                        Pout << \"particleCloud_.fieldsToDEM[particleCloud_.idConvectiveHeatFlux()][index][0] = \" << particleCloud_.fieldsToDEM[particleCloud_.idConvectiveHeatFlux()][index][0] << endl;\n                        Pout << \"Tfluid = \" << Tfluid << endl  ;\n                    }\n                }\n            //}\n        }\n\n        particleCloud_.averagingM().setScalarSum\n        (\n            EuField,\n            particleCloud_.fieldsToDEM[particleCloud_.idConvectiveHeatFlux()],\n            particleCloud_.particleWeights(),\n            NULL\n        );\n\n        // scale with -1./(Vcell*rho*Cp)\n\n        if(compressible_)\n        {\n            forAll(EuField,cellI)\n                EuField[cellI] /= -EuField.mesh().V()[cellI];\n        } else\n        {\n            forAll(EuField,cellI)\n                EuField[cellI] /= -rhoField[cellI]*CpField_[cellI]*EuField.mesh().V()[cellI];\n        }\n\n        // limit source term\n        scalar EuFieldInCell;\n        forAll(EuField,cellI)\n        {\n            EuFieldInCell = EuField[cellI];\n\n            if(mag(EuFieldInCell) > maxSource_ )\n            {\n                 EuField[cellI] = sign(EuFieldInCell) * maxSource_;\n            }\n        }\n\n        EuField.correctBoundaryConditions();\n\n        if(compressible_)\n        {\n            Info << \"total convective particle-fluid heat flux [W] (Eulerian) = \"\n                 << gSum(EuField*1*EuField.mesh().V())\n                 << endl;\n        } else\n        {\n            Info << \"total convective particle-fluid heat flux [W] (Eulerian) = \"\n                 << gSum(EuField*rhoField*CpField_*EuField.mesh().V())\n                 << endl;\n        }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/LaEuScalarTemp/LaEuScalarTemp.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    two way LaEu Scalar Exchange between DEM and CFD\n    convective heat transfer model following\n    Li and Mason (2000), A computational investigation of transient heat\n    transfer in  pneumatic transport of granular particles, Pow.Tech 112\n\n    This model will put all the source into the explicit coupling term\n    for the fluid-side integration (might be unstable)\n\nClass\n    LaEuScalarTemp\n\nSourceFiles\n    LaEuScalarTemp.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef LaEuScalarTemp_H\n#define LaEuScalarTemp_H\n\n#include \"forceModel.H\"\n#include \"averagingModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class LaEuScalarTemp Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass LaEuScalarTemp\n:\n    public forceModel\n{\nprotected:\n\n    dictionary propsDict_;\n\n    bool compressible_;\n\n    const word EuFieldName_;\n\n    word tempFieldName_;\n\n    const volScalarField& T_;            // ref to temperature field\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfraction_;    // ref to voidfraction field\n\n    scalar maxSource_;                           // max (limited) value of src field\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    scalar lambda_;                              // fluid thermal conductivity [W/(m*K)]\n\n    scalar Cp_;                                  // specific heat capacity [W*s/(kg*K)]\n\n    mutable volScalarField CpField_;\n\n    mutable volScalarField LambdaField_;\n\n    word NuCorrelation_;\n    double (LaEuScalarTemp::*Nusselt)(double Re, double Pr, double vf) const;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"LaEuScalarTemp\");\n\n    // Constructors\n\n        //- Construct from components\n        LaEuScalarTemp\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word name = word(\"\")\n        );\n\n    // Destructor\n\n        ~LaEuScalarTemp();\n\n\n    // Member Functions\n        void setForce() const;\n\n    //--- Nusselt correlations ---\n\n// Nusselt number correlation from\n//    Li and Mason (2000), A computational investigation of transient heat\n//    transfer in  pneumatic transport of granular particles, Pow.Tech 112\n        double NuLiMason(double Re, double Pr, double vf) const\n        {\n            double Nup(1.);\n            double n(3.5);\n\n            if (Re < 200)\n                Nup = 2. + 0.6 * pow(vf,n) * sqrt(Re) * pow(Pr,0.33);\n            else if (Re < 1500)\n                Nup = 2. + (0.5 * sqrt(Re) + 0.02 * pow(Re,0.8)) * pow(vf,n) * pow(Pr,0.33);\n            else\n                Nup = 2. + 0.000045 * pow(vf,n) * pow(Re,1.8);\n\n            return Nup;\n        }\n\n// Nusselt number correlation from\n//    Deen, N.G. et al., Review of direct numerical simulation of\n//    fluid–particle mass, momentum and heat transfer in dense gas–solid flows.\n//    Chemical Engineering Science 116 (2014) 710–724\n        double NuDeen(double Re, double Pr, double vf) const\n        {\n            //NOTE: This function is fitted for Reynolds numbers between 0 and 100!!!\n            double Nup(1.);\n            double PrPowOneThird = pow(Pr, 0.3333333333);\n\n            Nup = (7.00 - 10.0*vf + 5*vf*vf)\n                * (1.00 + 0.17 * pow(Re, 0.2) * PrPowOneThird)\n                + (1.33 - 2.31*vf + 1.16*vf*vf) * pow(Re, 0.7) * PrPowOneThird ;\n\n            return Nup;\n        }\n\n// Nusselt number correlation from\n//    Gunn, D. (1978). Transfer of heat or mass to particles in fixed and fluidised beds.\n//    International Journal of Heat and Mass Transfer, 21(4):467–476.\n        double NuGunn(double Re, double Pr, double vf) const\n        {\n            //NOTE: This function is fitted for Reynolds numbers between 0 and 100!!!\n            double Nup(1.);\n            double PrPowOneThird = pow(Pr, 0.3333333333);\n\n            Nup = (7.00 - 10.0*vf + 5*vf*vf)\n                * (1.00 + 0.70 * pow(Re, 0.2) * PrPowOneThird)\n                + (1.33 - 2.40*vf + 1.20*vf*vf) * pow(Re, 0.7) * PrPowOneThird ;\n\n            return Nup;\n        }\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/MeiLift/MeiLift.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"MeiLift.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(MeiLift, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    MeiLift,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nMeiLift::MeiLift\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    useSecondOrderTerms_(false)\n{\n    if (propsDict_.found(\"useSecondOrderTerms\")) useSecondOrderTerms_=true;\n\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"liftForce\"); //first entry must the be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");        //other are debug\n        particleCloud_.probeM().vectorFields_.append(\"vorticity\");  //other are debug\n        particleCloud_.probeM().vectorFields_.append(\"omegaPart\");    //particle rotation rate\n        particleCloud_.probeM().scalarFields_.append(\"Rep\");          //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Rew\");          //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"J_star\");       //other are debug\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(false);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n    forceSubM(0).setSwitches(14,true); // pullRotation=true\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(0,true);  // enable treatExplicit, otherwise this force would be implicit in slip vel! - IMPORTANT!\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nMeiLift::~MeiLift()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid MeiLift::setForce() const\n{\n    const volScalarField& nufField = forceSubM(0).nuField();\n    const volScalarField& rhoField = forceSubM(0).rhoField();\n\n    vector position(0,0,0);\n    vector lift(0,0,0);\n    vector Us(0,0,0);\n    vector Ur(0,0,0);\n    scalar magUr(0);\n    scalar magVorticity(0);\n    scalar magOmega(0);\n    scalar ds(0);\n    scalar dParcel(0);\n    scalar nuf(0);\n    scalar rho(0);\n    scalar voidfraction(1);\n    scalar Rep(0);\n    scalar Rew(0);\n    scalar Cl(0);\n    scalar Cl_star(0);\n    scalar J_star(0);\n    scalar Omega_eq(0);\n    scalar alphaStar(0);\n    scalar epsilon(0);\n    scalar omega_star(0);\n    vector vorticity_fluid(0,0,0);\n    vector omegaParticle(0,0,0);\n    volVectorField vorticity_ = fvc::curl(U_);\n\n    #include \"resetVorticityInterpolator.H\"\n    #include \"resetUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        lift        = vector::zero;\n        label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if (cellI > -1) // particle Found\n        {\n            Us = particleCloud_.cfdemCloud::velocity(index);\n            for(int j=0;j<3;j++)\n                omegaParticle[j] = particleCloud_.fieldsToDEM[particleCloud_.idPullRotation()][index][j];\n\n            if( forceSubM(0).interpolation() )\n            {\n                position       = particleCloud_.cfdemCloud::position(index);\n                Ur               = UInterpolator_().interpolate(position,cellI)\n                                    - Us;\n//                 vorticity       = vorticityInterpolator_().interpolate(position,cellI);\n            }\n            else\n            {\n                Ur =  U_[cellI]\n                      - Us;\n//                 vorticity=vorticity_[cellI];\n            }\n\n            magUr        = mag(Ur);\n//             magVorticity = mag(vorticity);\n            magOmega     = mag(omegaParticle);\n\n            if (magUr > 0 && magOmega > 0)\n            {\n                ds  = 2*particleCloud_.radius(index);\n                dParcel = ds;\n                forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n                nuf = nufField[cellI];\n                rho = rhoField[cellI];\n\n                //Update any scalar or vector quantity\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                      forceSubM(iFSub).update(  index,\n                                                cellI,\n                                                ds,\n                                                nuf,\n                                                rho,\n                                                forceSubM(0).verbose()\n                                             );\n\n\n                // calc dimensionless properties\n                Rep = ds*magUr/nuf;\n                Rew = magOmega*ds*ds/nuf;\n\n                alphaStar   = magOmega*ds/magUr/2.0;\n                epsilon     = sqrt(2.0*alphaStar /Rep );\n                omega_star=2.0*alphaStar;\n\n                //Basic model for the correction to the Saffman lift\n                //Based on McLaughlin (1991)\n                if(epsilon < 0.1)\n                {\n                    J_star = -140 *epsilon*epsilon*epsilon*epsilon*epsilon\n                                         *log( 1./(epsilon*epsilon+SMALL) );\n                }\n                else if(epsilon > 20)\n                {\n                  J_star = 1.0-0.287/(epsilon*epsilon+SMALL);\n                }\n                else\n                {\n                 J_star = 0.3\n                            *(     1.0\n                                  +tanh(  2.5 * log10(epsilon)+0.191  )\n                             )\n                            *(    0.667\n                                 +tanh(  6.0 * (epsilon-0.32)  )\n                              );\n                }\n                Cl=J_star*4.11*epsilon; //multiply McLaughlin's correction to the basic Saffman model\n\n                //Second order terms given by Loth and Dorgan 2009\n                if(useSecondOrderTerms_)\n                {\n                    Omega_eq = omega_star/2.0*(1.0-0.0075*Rew)*(1.0-0.062*sqrt(Rep)-0.001*Rep);\n                    Cl_star=1.0-(0.675+0.15*(1.0+tanh(0.28*(omega_star/2.0-2.0))))*tanh(0.18*sqrt(Rep));\n                    Cl += Omega_eq*Cl_star;\n                }\n\n                lift =  0.125*M_PI\n                       *rho\n                       *Cl\n                       //*magUr*Ur^vorticity/magVorticity\n                       *magUr*magUr*omegaParticle^Ur/mag(omegaParticle^Ur)\n                       *ds*ds; //total force on all particles in parcel\n\n                forceSubM(0).scaleForce(lift,dParcel,index);\n\n                if (modelType_==\"B\")\n                {\n                    voidfraction = particleCloud_.voidfraction(index);\n                    lift /= voidfraction;\n                }\n            }\n\n            if(forceSubM(0).verbose() && index==0)\n            {\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                Pout << \"Us = \" << Us << endl;\n                Pout << \"Ur = \" << Ur << endl;\n//                 Pout << \"vorticity = \" << vorticity << endl;\n                Pout << \"omega_s = \" << omegaParticle << endl;\n                Pout << \"dprim = \" << ds << endl;\n                Pout << \"rho = \" << rho << endl;\n                Pout << \"nuf = \" << nuf << endl;\n                Pout << \"Rep = \" << Rep << endl;\n                Pout << \"Rew = \" << Rew << endl;\n                Pout << \"alphaStar = \" << alphaStar << endl;\n                Pout << \"epsilon = \" << epsilon << endl;\n                Pout << \"J_star = \" << J_star << endl;\n                Pout << \"lift = \" << lift << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, lift);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                vValues.setSize(vValues.size()+1, omegaParticle);\n                sValues.setSize(sValues.size()+1, Rep);\n                sValues.setSize(sValues.size()+1, Rew);\n                sValues.setSize(sValues.size()+1, J_star);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,lift,vector::zero);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/MeiLift/MeiLift.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n     This function is based on the derivation in R. Kurose, S. Komori, \n     Drag and lift forces on a rotating sphere in a linear shear flow, \n     Journal of Fluid Mechanics. 384 (1999) 183-206.\n\n     The data for this functions is based on J.B. Mclaughlin, \n     Inertial migration of a small sphere in linear shear flows, \n     Journal of Fluid Mechanics. 224 (1991) 261-274.\n\n     The second order terms are based on: \n     Mei Lift force following Loth and Dorgan 2009,\n     Environ Fluid Mech (2009) 9:187–206, DOI 10.1007/s10652-009-9123-x\n     and can be added to the lift coefficient if desired\n     (contribution from RQ)\n\n    - including interpolation of the velocity to the particle position (optional)\n    - including output to file for testing/data analysis (optional)\n\n\nClass\n    MeiLift\n\nSourceFiles\n    MeiLift.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef MeiLift_H\n#define MeiLift_H\n\n#include \"forceModel.H\"\n#include \"IOList.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class MeiLift Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass MeiLift\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    bool useSecondOrderTerms_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"MeiLift\");\n\n\n    // Constructors\n\n        //- Construct from components\n        MeiLift\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~MeiLift();\n\n\n    // Member Functions\n        void setForce() const;\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/SchillerNaumannDrag/SchillerNaumannDrag.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"SchillerNaumannDrag.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(SchillerNaumannDrag, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    SchillerNaumannDrag,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nSchillerNaumannDrag::SchillerNaumannDrag\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    voidfraction_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    UsFieldName_(propsDict_.lookupOrDefault<word>(\"granVelFieldName\",\"Us\")),\n    UsField_(sm.mesh().lookupObject<volVectorField> (UsFieldName_))\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"dragForce\"); //first entry must the be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");      //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Rep\");       //other are debug\n        particleCloud_.probeM().scalarFields_.append(\"Cd\");        //other are debug\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(false);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(2,true,true); // activate implForceDEM switch and set default to true\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n\n    //set default switches (hard-coded default = false)\n    //forceSubM(0).setSwitches(XXX,true);\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nSchillerNaumannDrag::~SchillerNaumannDrag()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid SchillerNaumannDrag::setForce() const\n{\n    const volScalarField& nufField = forceSubM(0).nuField();\n    const volScalarField& rhoField = forceSubM(0).rhoField();\n\n    //update force submodels to prepare for loop\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).preParticleLoop(forceSubM(iFSub).verbose());\n\n    vector position(0,0,0);\n    scalar voidfraction(1);\n    vector Ufluid(0,0,0);\n    vector drag(0,0,0);\n    vector dragExplicit(0,0,0);\n    scalar dragCoefficient(0);\n    label cellI=0;\n    vector Us(0,0,0);\n    vector Ur(0,0,0);\n    scalar ds(0);\n    scalar dParcel(0);\n    scalar nuf(0);\n    scalar rho(0);\n    scalar magUr(0);\n    scalar Rep(0);\n    scalar Cd(0);\n\n    #include \"resetVoidfractionInterpolator.H\"\n    #include \"resetUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n        drag=vector::zero;\n        dragExplicit=vector::zero;\n        Ufluid=vector::zero;\n        dragCoefficient = 0;\n\n        if (cellI > -1) // particle Found\n        {\n            if(forceSubM(0).interpolation())\n            {\n                position = particleCloud_.cfdemCloud::position(index);\n                voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                Ufluid = UInterpolator_().interpolate(position,cellI);\n            }else\n            {\n                voidfraction = voidfraction_[cellI];\n                Ufluid = U_[cellI];\n            }\n\n            // correct voidfraction\n            ds = 2*particleCloud_.radius(index);\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                forceSubM(iFSub).calculateCorrectedVoidage(\n                    voidfraction, Ufluid, U_.mesh().V()[cellI], ds );\n\n            Us = particleCloud_.cfdemCloud::velocity(index);\n            dParcel = ds;\n            forceSubM(0).scaleDia(ds,index); //caution: this fct will scale ds!\n            nuf = nufField[cellI];\n            rho = rhoField[cellI];\n\n            //Update any scalar or vector quantity\n            for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                  forceSubM(iFSub).update(  index,\n                                            cellI,\n                                            ds,\n                                            Ufluid,\n                                            Us,\n                                            nuf,\n                                            rho,\n                                            forceSubM(0).verbose()\n                                         );\n\n            Ur = Ufluid-Us;\n            magUr = mag(Ur);\n            Rep = 0;\n            Cd = 0;\n\n            if (magUr > 0)\n            {\n               // calc particle Re Nr\n                Rep = ds*magUr/nuf;\n\n                // calc fluid drag Coeff\n                Cd = max(0.44,24.0/Rep*(1.0+0.15*pow(Rep,0.687)));\n\n                // calc particle's drag\n                dragCoefficient = 0.125*Cd*rho\n                                 *M_PI\n                                 *ds*ds\n                                 *magUr;\n\n                if (modelType_==\"B\")\n                    dragCoefficient /= voidfraction;\n\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++) forceSubM(iFSub).scaleCoeff(dragCoefficient,dParcel,Rep,index);\n                drag = dragCoefficient*Ur; //total drag force!\n\n                // explicitCorr\n                for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                    forceSubM(iFSub).explicitCorr( drag,\n                                                   dragExplicit,\n                                                   dragCoefficient,\n                                                   Ufluid, U_[cellI], Us, UsField_[cellI],\n                                                   forceSubM(iFSub).verbose()\n                                                 );\n            }\n\n            if(forceSubM(0).verbose() && index==0)\n            {\n                Pout << \"cellI = \" << cellI << endl;\n                Pout << \"index = \" << index << endl;\n                Pout << \"Us = \" << Us << endl;\n                Pout << \"Ur = \" << Ur << endl;\n                Pout << \"dprim = \" << ds << endl;\n                Pout << \"rho = \" << rho << endl;\n                Pout << \"nuf = \" << nuf << endl;\n                Pout << \"voidfraction = \" << voidfraction << endl;\n                Pout << \"Rep = \" << Rep << endl;\n                Pout << \"Cd = \" << Cd << endl;\n                Pout << \"drag = \" << drag << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, drag);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                sValues.setSize(sValues.size()+1, Rep);\n                sValues.setSize(sValues.size()+1, Cd);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,drag,dragExplicit,Ufluid,dragCoefficient);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/SchillerNaumannDrag/SchillerNaumannDrag.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Schiller Naumann drag law\n    contribution from RQ\n\nClass\n    SchillerNaumannDrag\n\nSourceFiles\n    SchillerNaumannDrag.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef SchillerNaumannDrag_H\n#define SchillerNaumannDrag_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class SchillerNaumannDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass SchillerNaumannDrag\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word voidfractionFieldName_;\n\n    const volScalarField& voidfraction_;\n\n    word UsFieldName_;   \n\n    const volVectorField& UsField_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"SchillerNaumannDrag\");\n\n\n    // Constructors\n\n        //- Construct from components\n        SchillerNaumannDrag\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~SchillerNaumannDrag();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"ShirgaonkarIB.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(ShirgaonkarIB, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    ShirgaonkarIB,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nShirgaonkarIB::ShirgaonkarIB\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    twoDimensional_(false),\n    depth_(1),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    pressureFieldName_(propsDict_.lookup(\"pressureFieldName\")),\n    p_(sm.mesh().lookupObject<volScalarField> (pressureFieldName_)),\n    useTorque_(false)\n{\n    //Append the field names to be probed\n    particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n    particleCloud_.probeM().vectorFields_.append(\"dragForce\"); //first entry must the be the force\n    particleCloud_.probeM().writeHeader();\n\n\n    if (propsDict_.found(\"twoDimensional\"))\n    {\n        twoDimensional_=true;\n        depth_ = readScalar(propsDict_.lookup(\"depth\"));\n        Info << \"2-dimensional simulation - make sure DEM side is 2D\" << endl;\n        Info << \"depth of domain is assumed to be :\" << depth_ << endl;\n    }\n\n    if(propsDict_.found(\"useTorque\")) useTorque_ = true;\n\n    particleCloud_.checkCG(false);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nShirgaonkarIB::~ShirgaonkarIB()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid ShirgaonkarIB::setForce() const\n{\n\n    label cellI;\n    vector drag;\n    vector torque;\n\n    volVectorField h=forceSubM(0).IBDragPerV(U_,p_);\n\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        drag=vector::zero;\n        torque=vector::zero;\n        vector positionCenter = particleCloud_.cfdemCloud::position(index);\n\n        for(int subCell=0;subCell<particleCloud_.cellsPerParticle()[index][0];subCell++)\n        {\n            //Info << \"subCell=\" << subCell << endl;\n            cellI = particleCloud_.cfdemCloud::cellIDs()[index][subCell];\n\n            if (cellI > -1) // particle Found\n            {\n                vector rc = particleCloud_.mesh().C()[cellI];\n                drag   += h[cellI]*h.mesh().V()[cellI];\n                torque += (rc - positionCenter)^h[cellI]*h.mesh().V()[cellI];\n            }\n\n        }\n\n        // set force on particle\n        if(twoDimensional_) drag /= depth_;\n\n        //Set value fields and write the probe\n        if(probeIt_)\n        {\n            #include \"setupProbeModelfields.H\"\n            // Note: for other than ext one could use vValues.append(x)\n            // instead of setSize\n            vValues.setSize(vValues.size()+1, drag);           //first entry must the be the force\n            particleCloud_.probeM().writeProbe(index, sValues, vValues);\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,drag,vector::zero);\n\n        if(forceSubM(0).verbose()) Info << \"impForces = \" << impForces()[index][0]<<\",\"<<impForces()[index][1]<<\",\"<<impForces()[index][2] << endl;\n        if(useTorque_) for(int j=0;j<3;j++) particleCloud_.DEMTorques()[index][j] = torque[j];\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/ShirgaonkarIB/ShirgaonkarIB.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    drag law for ficticious domain method calculating: sum(mu*nabla*u-laplace*p)\n    contribution from Alice Hager\n\nClass\n    ShirgaonkarIB\n\nSourceFiles\n    ShirgaonkarIB.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef ShirgaonkarIB_H\n#define ShirgaonkarIB_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class ShirgaonkarIB Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass ShirgaonkarIB\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    bool verbose_;\n\n    bool twoDimensional_;\n\n    double depth_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word pressureFieldName_;\n\n    const volScalarField& p_;\n\n    bool useTorque_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"ShirgaonkarIB\");\n\n\n    // Constructors\n\n        //- Construct from components\n        ShirgaonkarIB\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~ShirgaonkarIB();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"checkCouplingInterval.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(checkCouplingInterval, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    checkCouplingInterval,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ncheckCouplingInterval::checkCouplingInterval\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    warnOnly_(propsDict_.lookupOrDefault<Switch>(\"warnOnly\", true)),\n    velocityFieldName_(propsDict_.lookupOrDefault<word>(\"velocityFieldName\", \"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velocityFieldName_)),\n    rhoP_(readScalar(propsDict_.lookup(\"rhoP\"))),\n    maxCFL_(propsDict_.lookupOrDefault<scalar>(\"maxCFL\", 1.)),\n    maxPCFL_(propsDict_.lookupOrDefault<scalar>(\"maxPCFL\", 1.)),\n    maxAccNr_(propsDict_.lookupOrDefault<scalar>(\"maxAccNr\", 0.005)),\n    maxRelVelChange_(propsDict_.lookupOrDefault<scalar>(\"maxRelVelChange\", 0.1)),\n    UmaxExpected_(readScalar(propsDict_.lookup(\"UmaxExpected\"))),\n    minAllowedVcellByVparcel_(propsDict_.lookupOrDefault<scalar>(\"minAllowedVcellByVparcel\", 3.)),\n    largeVcellByVparcel_(propsDict_.lookupOrDefault<scalar>(\"largeVcellByVparcel\", 10000)),\n    nextRun_(0),\n    timeInterval_(propsDict_.lookupOrDefault<scalar>(\"timeInterval\", sm.dataExchangeM().couplingTime())*10.),\n    couplingStepInterval_(floor(timeInterval_/sm.dataExchangeM().couplingTime()))\n{\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n\n    //set default switches (hard-coded default = false)\n    //forceSubM(0).setSwitches(XXX,true);\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    //// setup required communication\n    //for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n    //    forceSubM(iFSub).setupCommunication();\n\n    Info << \"running checkCouplingInterval every \" << couplingStepInterval_ << \" coupling steps,\"\n         << \"which is every \" << timeInterval_ << \" seconds.\" << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ncheckCouplingInterval::~checkCouplingInterval()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\ninline bool checkCouplingInterval::doCheck() const\n{\n    label couplingStep = particleCloud_.dataExchangeM().couplingStep();\n    if(couplingStep >= nextRun_)\n    {\n        nextRun_ += couplingStepInterval_;\n        return true;\n    }\n    return false;\n}\n\nvoid checkCouplingInterval::setForce() const\n{\n    if(doCheck())\n    {\n        Info << \"========================================================================\" << endl;\n        Info << \"Check Coupling Interval\" << endl;\n        Info << \"========================================================================\" << endl;\n\n        //==============================================================================================\n        // calc the maximum CFL number\n        scalar CFL = 0.0;\n        scalar CFLexpected = 0.0;\n        scalar ts = particleCloud_.mesh().time().deltaT().value();\n\n        if (particleCloud_.mesh().nInternalFaces())\n        {\n            surfaceScalarField phi(particleCloud_.mesh().lookupObject<surfaceScalarField> (\"phi\"));\n            scalarField sumPhi(fvc::surfaceSum(mag(phi))().internalField());\n\n            CFL = 0.5*gMax(sumPhi/particleCloud_.mesh().V().field())*ts;\n\n            scalar minVol = gMin(particleCloud_.mesh().V());\n            scalar minLen = pow(minVol,1./3.);\n            CFLexpected = UmaxExpected_ * ts / minLen;\n        }\n\n        if (CFL > maxCFL_)\n        {\n            if(warnOnly_)\n                Warning << \"CFL exceeds maximum allowed value:\" << maxCFL_\n                           << \", and reached the value:\" << CFL\n                           << \"\\ncheck your settings!\" << endl;\n            else\n                FatalError << \"CFL exceeds maximum allowed value:\" << maxCFL_\n                           << \", and reached the value:\" << CFL\n                           << \"\\nThe simulation is stopped, check your settings.\" << abort(FatalError);\n        }\n        else if (CFLexpected > maxCFL_)\n            if(warnOnly_)\n                Warning << \"Expected CFL (based on UmaxExpected) exceeds maximum allowed value:\" << maxCFL_\n                           << \", and reached the value:\" << CFLexpected\n                           << \"\\ncheck your settings.\" << endl;\n            else\n                FatalError << \"Expected CFL (based on UmaxExpected) exceeds maximum allowed value:\" << maxCFL_\n                           << \", and reached the value:\" << CFLexpected\n                           << \"\\nThe simulation is stopped, check your settings.\" << abort(FatalError);\n        else\n        {\n            Info << \"max. CFL = \" << CFL << endl;\n            Info << \"max. expected CFL (based on UmaxExpected) = \" << CFLexpected << endl;\n        }\n        //==============================================================================================\n\n\n        //==============================================================================================\n        // particle relaxation time tau,\n        // Stokes nr,\n        // cell/particle volume ratio\n\n        const volScalarField& nufField = forceSubM(0).nuField();\n        const volScalarField& rhoField = forceSubM(0).rhoField();\n\n        // find min particle relaxation time\n        scalar minTauP = 1e10;\n        scalar minTauPAll = 1e10;\n        scalar tauP = -1;\n        scalar rad = -1;\n        scalar scaledRad = -1.;\n\n        // find min/max particle stokes Nr\n        scalar St = -1;\n        scalar minSt = 1e10;\n        scalar minStAll = 1e10;\n        scalar maxSt = -1;\n        scalar maxStAll = -1;\n\n        // max particle CFL Nr\n        scalar maxVel = -1;\n        scalar maxVelAll = -1;\n        scalar minVel = 1e10;\n        //scalar minVelAll = 1e10;\n\n        // find max parcel diameter\n        scalar maxDparcel = -1;\n        scalar maxDparcelAll = -1;\n\n        // find min cell vol\n        scalar minVcell = 1e10;\n        scalar minVcellAll = 1e10;\n\n        // get info on scaleDrag being used.\n        // we do not call getProperty in constructor to be independent of order of forceModels\n        scalar scaleDrag=particleCloud_.registryM().getProperty(\"scaleDrag\");\n        Info << \"checkCouplingInterval considers scaleDrag = \"<< scaleDrag << endl;\n\n        for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n        {\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n            if (cellI > -1) // particle Found\n            {\n                rad = particleCloud_.radius(index);\n                forceSubM(0).scaleDia(rad,index);\n                tauP = rhoP_*4*scaledRad*scaledRad/\n                        (18 * nufField[cellI] * rhoField[cellI])/scaleDrag;\n                minTauP = min(minTauP,tauP);\n\n                maxDparcel = max(maxDparcel,2*particleCloud_.radius(index));\n\n                minVcell = min(minVcell,particleCloud_.mesh().V()[cellI]);\n\n                // StokesNr\n                St = tauP*mag(U_[cellI]-particleCloud_.cfdemCloud::velocity(index))/(2*rad);\n                minSt = min(minSt,St);\n                maxSt = max(maxSt,St);\n\n                maxVel = max(maxVel,mag(particleCloud_.cfdemCloud::velocity(index)));\n                minVel = min(minVel,mag(particleCloud_.cfdemCloud::velocity(index)));\n            }\n        }\n\n        // allreduce results\n        MPI_Allreduce(&minTauP, &minTauPAll, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);\n        MPI_Allreduce(&minSt, &minStAll, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);\n        MPI_Allreduce(&maxSt, &maxStAll, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);\n        MPI_Allreduce(&maxDparcel, &maxDparcelAll, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);\n        MPI_Allreduce(&minVcell, &minVcellAll, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);\n        MPI_Allreduce(&maxVel, &maxVelAll, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);\n        //MPI_Allreduce(&minVel, &minVelAll, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);\n\n        // calc based on reduced results\n\n        // calc max couplingTime/particle relaxation time ratio\n        scalar DEMtime = particleCloud_.dataExchangeM().DEMts()\n                        *particleCloud_.dataExchangeM().couplingInterval();\n        scalar accNr = DEMtime/minTauPAll;\n\n        // calc min cell/parcel volume ratio\n        scalar maxVparcelAll = maxDparcelAll*maxDparcelAll*maxDparcelAll*3.1416/6.0;\n        scalar minVcellByVparcel = minVcellAll/maxVparcelAll;\n\n        //particle CFL number\n        scalar pCFL = maxVelAll*particleCloud_.dataExchangeM().couplingTime()/pow(minVcellAll,1./3.);\n\n        if(accNr > maxAccNr_)\n        {\n            if(warnOnly_)\n                Warning << \"The max. acceleration nr (coupling time / particle relaxation time) exceeds the maximum allowed value \" << maxAccNr_\n                           << \", and reached the value:\" << accNr\n                           << \"\\ncheck your settings.\" << endl;\n            else\n                FatalError << \"The max. acceleration nr (coupling time / particle relaxation time) exceeds the maximum allowed value \" << maxAccNr_\n                           << \", and reached the value:\" << accNr\n                           << \"\\nThe simulation is stopped, check your settings.\" << abort(FatalError);\n        }\n        else\n        {\n            Info << \"min. occurring particle relaxation time [s]: \" << minTauPAll << endl;\n            Info << \"coupling interval [s]: \" << DEMtime << endl;\n            Info << \"max. occurring acceleration nr (coupling time [s] / min. particle relaxation time [s]): \" << accNr << endl;\n        }\n\n        if(minVcellByVparcel < minAllowedVcellByVparcel_)\n        {\n            if(warnOnly_)\n                Warning << \"The min. ratio of Vcell / Vparcel is below the minimum allowed value \" << minAllowedVcellByVparcel_\n                           << \", and reached the value: \" << minVcellByVparcel << \".\"\n                           << \"\\ncheck your settings.\" << endl;\n            else\n                FatalError << \"The min. ratio of Vcell / Vparcel is below the minimum allowed value \" << minAllowedVcellByVparcel_\n                           << \", and reached the value: \" << minVcellByVparcel\n                           << \"\\nThe simulation is stopped, check your settings.\" << abort(FatalError);\n        }\n        else if (minVcellByVparcel > largeVcellByVparcel_)\n        {\n            Warning << \"The ratio of Vcell / Vparcel is above the defined value of \" << largeVcellByVparcel_\n                           << \", and reached the value: \" << minVcellByVparcel << \".\"\n                           << \"\\nFor efficiency reasons the voidfraction model centre is recommended.\" << endl;\n        }\n        else\n            Info << \"min. ratio of Vcell / Vparcel is \" << minVcellByVparcel << endl;\n\n        Info << \"min./max. Stokes Nr: \" << minStAll << \" / \" << maxStAll << endl;\n\n        if(pCFL > maxPCFL_)\n        {\n            if(warnOnly_)\n                Warning << \"The max. particle coupling CFL number is aboce the maximum allowed value \" << maxPCFL_\n                           << \", and reached the value:\" << pCFL\n                           << \"\\ncheck your settings.\" << endl;\n            else\n                FatalError << \"The max. particle coupling CFL number is aboce the maximum allowed value \" << maxPCFL_\n                           << \", and reached the value:\" << pCFL\n                           << \"\\ncheck your settings.\" << abort(FatalError);\n        }\n        else\n        Info << \"max. particle coupling CFL Nr: \" << pCFL << endl;\n\n        /*//Set value fields and write the probe\n        if(probeIt_)\n        {\n            #include \"setupProbeModelfields.H\"\n            // Note: for other than ext one could use vValues.append(x)\n            // instead of setSize\n            sValues.setSize(sValues.size()+1, CFL);\n            sValues.setSize(sValues.size()+1, CFLexpected);\n            sValues.setSize(sValues.size()+1, minTauPAll);\n            sValues.setSize(sValues.size()+1, minVcellByVparcel);\n            sValues.setSize(sValues.size()+1, minStAll);\n            sValues.setSize(sValues.size()+1, maxStAll);\n            particleCloud_.probeM().writeProbe(0, sValues, vValues);\n        }*/\n\n        // look for patches of type empty -> 2d simulation\n        bool empty_check = false;\n        bool size_check = false;\n        const polyBoundaryMesh& pbm = particleCloud_.mesh().boundaryMesh();\n        forAll(pbm, i)\n        {\n            if ( pbm[i].type() == \"empty\" )\n            {\n                empty_check = true;\n                break;\n            }\n        }\n\n        // get domain size\n        const faceList & ff = particleCloud_.mesh().faces();\n        const pointField & pp = particleCloud_.mesh().points();\n        scalar xDim, yDim, zDim;\n        pointField pLocal;\n\n        xDim = (Foam::max(particleCloud_.mesh().C() & vector(1,0,0)) -\n                Foam::min(particleCloud_.mesh().C() & vector(1,0,0))).value();\n        yDim = (Foam::max(particleCloud_.mesh().C() & vector(0,1,0)) -\n                Foam::min(particleCloud_.mesh().C() & vector(0,1,0))).value();\n        zDim = (Foam::max(particleCloud_.mesh().C() & vector(0,0,1)) -\n                Foam::min(particleCloud_.mesh().C() & vector(0,0,1))).value();\n\n        // if there is only one cell\n        //   -> smallest dim will be 0\n        //   -> correct by considering points\n        const cell & cc = particleCloud_.mesh().cells()[0];\n        labelList pLabels(cc.labels(ff));\n        pLocal = pointField(pLabels.size(), vector::zero);\n\n        forAll (pLabels, pointi)\n            pLocal[pointi] = pp[pLabels[pointi]];\n\n        if      (xDim <= 1e-12)\n            xDim = Foam::max(pLocal & vector(1,0,0)) - Foam::min(pLocal & vector(1,0,0));\n        else if (yDim <= 1e-12)\n            yDim = Foam::max(pLocal & vector(0,1,0)) - Foam::min(pLocal & vector(0,1,0));\n        else if (zDim <= 1e-12)\n            zDim = Foam::max(pLocal & vector(0,0,1)) - Foam::min(pLocal & vector(0,0,1));\n\n        if (std::min({xDim, yDim, zDim}) >= 10*maxDparcel)\n            size_check = true;\n\n        if (empty_check && size_check)\n            Warning << \"\\n    You are running a 2d simulation with quite a large domain.\"\n                    << \"\\n    Min domain size: \" << std::min({xDim, yDim, zDim})\n                    << \"\\n    Particle diameter: \" << maxDparcel\n                    << \"\\n    Is this intentional?\"\n                    << endl;\n\n        // check ratio of smoothing length and average particle diameter\n        if(particleCloud_.smoothingM().doSmoothing() && particleCloud_.dataExchangeM().couplingStep() == 1)\n        {\n            // calculate average particle diameter:\n            double averageParticleDiameter = 0;\n            for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n            {\n                averageParticleDiameter += particleCloud_.radius(index)*2;\n            }\n            if (particleCloud_.numberOfParticles() > 0)\n                averageParticleDiameter /= particleCloud_.numberOfParticles();\n            // get smoothing length\n            double smoothingLength = particleCloud_.smoothingM().smoothingLength().value();\n            Info << \"smoothingLength: \" << smoothingLength << endl;\n            if (smoothingLength > averageParticleDiameter)\n            {\n                if(warnOnly_)\n                Warning << \"Smoothing length is recommended to be lower than than average particle diameter (in this case: \"\n                        << averageParticleDiameter << \")\" << endl;\n                else\n                FatalError << \"Smoothing length is recommended to be lower than than average particle diameter (in this case: \"\n                        << averageParticleDiameter << \")\"  << abort(FatalError);\n            }\n        }\n\n        // check change of fluid velocity over particle path length\n        volTensorField velGrad = fvc::grad(particleCloud_.mesh().lookupObject<volVectorField> (\"U\"));\n\n        scalar maxVelGradMag = -1;\n        forAll(velGrad, i)\n        {\n            scalar velGradMag = mag(velGrad[i]);\n            maxVelGradMag = max(velGradMag, maxVelGradMag);\n        }\n\n        scalar deltaFluidVel = maxVelGradMag * maxVelAll * particleCloud_.dataExchangeM().couplingTime();\n\n        scalar deltaFluidVelAll= -1;\n        MPI_Allreduce(&deltaFluidVel, &deltaFluidVelAll, 1,\n                      MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);\n\n        if (deltaFluidVelAll > maxRelVelChange_ * maxVelAll)\n        {\n            if (warnOnly_)\n                Warning\n                    << \"\\n    Change of fluid velocity over one coupling interval that\"\n                    << \"\\n    one particle may experience is quite large: \"\n                    << \"\\n    delta Uf / max(Vp) = \" << deltaFluidVelAll / maxVelAll\n                    << \"\\n    The allowed maximum limit is set to \" << maxRelVelChange_\n                    << \"\\n    Consider decreasing the coupling interval.\"\n                    << endl;\n            else\n                FatalError\n                    << \"\\n    Change of fluid velocity over one coupling interval that\"\n                    << \"\\n    one particle may experience is quite large: \"\n                    << \"\\n    delta Uf / max(Vp) = \" << deltaFluidVelAll / maxVelAll\n                    << \"\\n    The allowed maximum limit is set to \" << maxRelVelChange_\n                    << \"\\n    Consider decreasing the coupling interval.\"\n                    << abort(FatalError);\n        }\n\n        // if mesh moves, make sure that turboEngine model is used\n        if(particleCloud_.mesh().changing())\n        {\n            if ( particleCloud_.locateM().type() == \"engine\")\n            {\n                if(warnOnly_)\n                Warning << \"For changing meshes use turboEngine type locate model - engine model might lead to loss of particles!!\" << endl;\n                else\n                FatalError << \"For changing meshes use turboEngine type locate model - engine model might lead to loss of particles!!\"  << abort(FatalError);\n            }\n        }\n\n        Info << \"========================================================================\" << endl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/checkCouplingInterval/checkCouplingInterval.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    check the coupling interval,\n    by comparing couplingTime/particle relaxation time\n\nClass\n    checkCouplingInterval\n\nSourceFiles\n    checkCouplingInterval.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef checkCouplingInterval_H\n#define checkCouplingInterval_H\n\n#include \"forceModel.H\"\n#include \"dataExchangeModel.H\"\n#include <mpi.h>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class checkCouplingInterval Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass checkCouplingInterval\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    Switch warnOnly_;\n\n    word velocityFieldName_;\n\n    const volVectorField& U_;\n\n    const scalar rhoP_;\n\n    scalar maxCFL_;\n\n    scalar maxPCFL_;\n\n    scalar maxAccNr_;\n\n    scalar maxRelVelChange_;\n\n    scalar UmaxExpected_;\n\n    scalar minAllowedVcellByVparcel_;\n\n    scalar largeVcellByVparcel_;\n\n    mutable int nextRun_;\n\n    scalar timeInterval_;\n\n    int couplingStepInterval_;\n\n    inline bool doCheck() const;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"checkCouplingInterval\");\n\n\n    // Constructors\n\n        //- Construct from components\n        checkCouplingInterval\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~checkCouplingInterval();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"fieldStore.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(fieldStore, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    fieldStore,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nfieldStore::fieldStore\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    mesh_(particleCloud_.mesh()),\n    scalarFieldNames_(propsDict_.lookup(\"scalarFieldNames\")),\n    vectorFieldNames_(propsDict_.lookup(\"vectorFieldNames\"))\n{\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // create time average scalar fields\n    scalarFields_.setSize(scalarFieldNames_.size());\n\n    for (int i=0;i < scalarFieldNames_.size(); i++)\n    {\n        word fieldName = \"stored_\" + scalarFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        scalarFields_.set\n        (\n            i,\n            new volScalarField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::NO_READ,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedScalar(\"0\", mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]).dimensions(), 0)\n            )\n        );\n    }\n\n    // create time average vector fields\n    vectorFields_.setSize(vectorFieldNames_.size());\n\n    for (int i=0;i < vectorFieldNames_.size(); i++)\n    {\n        word fieldName = \"stored_\" + vectorFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        vectorFields_.set\n        (\n            i,\n            new volVectorField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::NO_READ,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedVector(\"0\", mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]).dimensions(), vector::zero)\n            )\n        );\n    }\n\n    particleCloud_.checkCG(true);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nfieldStore::~fieldStore()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid fieldStore::setForce() const\n{\n    if(particleCloud_.writeTimePassed())\n    {\n        if(particleCloud_.verbose()) Info << \"fieldStore.C - setForce()\" << endl;\n\n        for (int i=0;i < scalarFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volScalarField& field = mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]);\n\n            // save field\n            scalarFields_[i] = field;\n        }\n\n        for (int i=0;i < vectorFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volVectorField& field = mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]);\n\n            // save field\n            vectorFields_[i] = field;\n        }\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/fieldStore/fieldStore.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    calc time average of scalar or vector field\n\nClass\n    fieldStore\n\nSourceFiles\n    fieldStore.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef fieldStore_H\n#define fieldStore_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class fieldStore Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass fieldStore\n:\n    public forceModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    const fvMesh& mesh_;\n\n    const wordList scalarFieldNames_;\n\n    const wordList vectorFieldNames_;\n\n    mutable PtrList<volScalarField> scalarFields_;\n\n    mutable PtrList<volVectorField> vectorFields_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"fieldStore\");\n\n\n    // Constructors\n\n        //- Construct from components\n        fieldStore\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~fieldStore();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/fieldTimeAverage/fieldTimeAverage.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"fieldTimeAverage.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(fieldTimeAverage, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    fieldTimeAverage,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nfieldTimeAverage::fieldTimeAverage\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    mesh_(particleCloud_.mesh())\n{\n    init();\n    particleCloud_.checkCG(true);\n}\n\n// Construct from components\nfieldTimeAverage::fieldTimeAverage\n(\n    const dictionary& dict,\n    const dictionary& mydict,\n    const word& fieldPrefix,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(mydict),\n    mesh_(particleCloud_.mesh())\n{\n    init(fieldPrefix);\n    particleCloud_.checkCG(true);\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nfieldTimeAverage::~fieldTimeAverage()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid fieldTimeAverage::init(word fieldPrefix)\n{\n    startTime_=0.;\n    scalarFieldNames_=wordList(propsDict_.lookup(\"scalarFieldNames\"));\n    vectorFieldNames_=wordList(propsDict_.lookup(\"vectorFieldNames\"));\n    nrAverages_=0.0;\n\n    // create time average scalar fields\n    scalarFields_.setSize(scalarFieldNames_.size());\n\n    if (propsDict_.found(\"startTime\"))\n        startTime_=readScalar(propsDict_.lookup(\"startTime\"));\n\n    for (int i=0;i < scalarFieldNames_.size(); i++)\n    {\n        word fieldName = fieldPrefix + scalarFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        scalarFields_.set\n        (\n            i,\n            new volScalarField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::READ_IF_PRESENT,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedScalar(\"0\", mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]).dimensions(), 0)\n            )\n        );\n    }\n\n    // create time average vector fields\n    vectorFields_.setSize(vectorFieldNames_.size());\n\n    for (int i=0;i < vectorFieldNames_.size(); i++)\n    {\n        word fieldName = fieldPrefix + vectorFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        vectorFields_.set\n        (\n            i,\n            new volVectorField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::READ_IF_PRESENT,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedVector(\"0\", mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]).dimensions(), vector::zero)\n            )\n        );\n    }\n}\n\nvoid fieldTimeAverage::setForce() const\n{\n    if(mesh_.time().value() >= startTime_)\n    {\n        if(particleCloud_.verbose()) Info << \"fieldTimeAverage.C - setForce()\" << endl;\n\n        for (int i=0;i < scalarFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volScalarField& field = mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]);\n            averaging(field,i,nrAverages_);\n        }\n\n        for (int i=0;i < vectorFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volVectorField& field = mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]);\n            averaging(field,i,nrAverages_);\n        }\n        nrAverages_++;\n    }// end if time >= startTime_\n}\n\nvoid fieldTimeAverage::averaging(const volScalarField& field,int& i,double& nrAverages_) const\n{\n    // first entry in this field\n    if(nrAverages_ == 0)\n        scalarFields_[i] = field;\n    else\n        scalarFields_[i] = (scalarFields_[i]*nrAverages_+field*1)/(nrAverages_+1);\n}\n\nvoid fieldTimeAverage::averaging(const volVectorField& field,int& i,double& nrAverages_) const\n{\n    // first entry in this field\n    if(nrAverages_ == 0)\n        vectorFields_[i] = field;\n    else\n        vectorFields_[i] = (vectorFields_[i]*nrAverages_+field*1)/(nrAverages_+1);\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/fieldTimeAverage/fieldTimeAverage.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    calc time average of scalar or vector field\n\nClass\n    fieldTimeAverage\n\nSourceFiles\n    fieldTimeAverage.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef fieldTimeAverage_H\n#define fieldTimeAverage_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class fieldTimeAverage Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass fieldTimeAverage\n:\n    public forceModel\n{\nprotected:\n\n    dictionary propsDict_;\n\n    const fvMesh& mesh_;\n\n    scalar startTime_;\n\n    wordList scalarFieldNames_;\n\n    wordList vectorFieldNames_;\n\n    mutable PtrList<volScalarField> scalarFields_;\n\n    mutable PtrList<volVectorField> vectorFields_;\n\n    mutable double nrAverages_;\n\n    void init(word fieldPrefix = word(\"timeAverage_\"));\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"fieldTimeAverage\");\n\n\n    // Constructors\n\n        //- Construct from components\n        fieldTimeAverage\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n        //- Construct from components\n        fieldTimeAverage\n        (\n            const dictionary& dict,\n            const dictionary& mydict,\n            const word& fieldPrefix,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~fieldTimeAverage();\n\n\n    // Member Functions\n        void setForce() const;\n\n        virtual inline void averaging(const volScalarField&,int&,double&) const;\n\n        virtual inline void averaging(const volVectorField&,int&,double&) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"forceModel.H\"\n#include \"mathExtra.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(forceModel, 0);\n\ndefineRunTimeSelectionTable(forceModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nforceModel::forceModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    //treatExplicit_(false),\n    //treatDEM_(false),\n    //implDEM_(false),\n    impParticleForces_\n    (   IOobject\n        (\n            \"impParticleForces\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedVector(\"zero\", dimensionSet(1,1,-2,0,0), vector(0,0,0)) // N\n    ),\n    expParticleForces_\n    (   IOobject\n        (\n            \"expParticleForces\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedVector(\"zero\", dimensionSet(1,1,-2,0,0), vector(0,0,0)) // N\n    ),\n    modelType_(sm.modelType()),\n    probeIt_(sm.probeM().active()),\n    particleBased_(dict.lookupOrDefault<Switch>(\"particleBased\", false)),\n    forceSubModels_(0),\n    forceSubModel_(new autoPtr<forceSubModel>[nrForceSubModels()]),\n    voidfractionInterpolator_(NULL),\n    UInterpolator_(NULL),\n    vorticityInterpolator_(NULL),\n    gradPInterpolator_(NULL),\n    gradUInterpolator_(NULL),\n    gradVoidfractionInterpolator_(NULL),\n    Up1Interpolator_(NULL),\n    Up2Interpolator_(NULL),\n    dSauterInterpolator_(NULL),\n    phiP1Interpolator_(NULL),\n    phiP2Interpolator_(NULL),\n    alphaInterpolator_(NULL),\n    gradAlphaInterpolator_(NULL),\n    TInterpolator_(NULL),\n    UsInterpolator_(NULL),\n    fluidScalarFieldInterpolator_(NULL),\n    gradPsolidInterpolator_(NULL),\n    shearRateInterpolator_(NULL),\n    DDtUInterpolator_(NULL),\n    divTauInterpolator_(NULL),\n    RhoInterpolator_(NULL),\n    kInterpolator_(NULL),\n    epsilonInterpolator_(NULL)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nforceModel::~forceModel()\n{}\n\n// * * * * * * * * * * * * * * * * Member Fct  * * * * * * * * * * * * * * * //\n\nvoid Foam::forceModel::applyDebugSettings(bool debug) const\n{\n    if(!debug)\n    {\n        impParticleForces_.writeOpt() = IOobject::NO_WRITE;\n        expParticleForces_.writeOpt() = IOobject::NO_WRITE;\n    }\n}\n\n//Function for to add turbulence due to multiphase interaction\nvoid forceModel::multiphaseTurbulence(volScalarField& field, bool) const\n{\n    // just return zero\n    field     *= 0.0;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nvoid forceModel::repartitionImExForces() const\n{\n  if(particleCloud_.imExSplitFactor()<1.0)\n  {\n    Info << \"Will re-partition split of implicit and explicit forces: alpha = \"\n         << particleCloud_.imExSplitFactor() << endl;\n    // Update implicit particle\n    expParticleForces_ += (1.0-particleCloud_.imExSplitFactor())*impParticleForces_;\n    impParticleForces_ *= particleCloud_.imExSplitFactor();\n  }\n}\n\nvoid forceModel::treatVoidCells() const\n{\n  //force coupling force in cells where there are no particles to be explicit force\n  if(particleCloud_.treatVoidCellsAsExplicitForce())\n  {\n        int counter(0);\n        volVectorField& Us = particleCloud_.averagingM().UsNext();\n        forAll(Us,cellI)\n        {\n            if ( mag(Us[cellI]) == 0.0)  // cell is void of particles\n            {\n                expParticleForces_[cellI] += impParticleForces_[cellI];\n                impParticleForces_[cellI] *= 0.0;\n                counter +=1;\n            }\n        }\n        Info << \"Re-partitioned \"<<  counter << \" cells void of particles\" << endl;\n  }\n}\n\nvoid forceModel::setForceSubModels(dictionary& dict)\n{\n    if (dict.found(\"forceSubModels\"))\n    {\n        forceSubModels_ = wordList(dict.lookup(\"forceSubModels\"));\n        if(forceSubModels_.size()==0) // empty list found\n        {\n            Info << \" Found empty list of forceSubModels - setting to default forceSubModel ImEx\" << endl;\n            forceSubModels_.setSize(1, \"ImEx\");\n        }\n        else\n        {\n            // check if an ImEx model is there\n            bool foundImEx=false;\n            forAll(forceSubModels_,i)\n            {\n                if(forceSubModels_[i]==\"ImEx\" || forceSubModels_[i]==\"ImExCorr\" || forceSubModels_[i]==\"ImExDipole\" || forceSubModels_[i]==\"ImExFibre\") foundImEx=true;\n            }\n\n            if(!foundImEx) // add ImEx if none found\n            {\n                Info << \" Adding the default forceSubModel ImEx on top of your selection (as first model).\" << endl;\n                wordList h(0);\n                h.setSize(1, \"ImEx\");\n                h.append(forceSubModels_);\n                forceSubModels_=h;\n            }\n\n            if(forceSubModels_.size()>1)\n            {\n               Warning << \" You are using more than one forceSubModel: \"\n                        << forceSubModels_ <<\"Make sure all operations can be superposed.\\n\" << endl;\n            }\n        }\n    }\n    else if (dict.found(\"forceSubModel\"))\n    {\n        FatalError << \"Did you mean the forceSubModels keyword? \" << abort(FatalError);\n    }\n    else // use ImEx as default forceSubModel if nothing is specifed\n    {\n        Info << \" No forceSubModel specified - setting to default forceSubModel ImEx.\" << endl;\n        forceSubModels_.setSize(1, \"ImEx\");\n    }\n\n    delete[] forceSubModel_;\n    forceSubModel_ = new autoPtr<forceSubModel>[nrForceSubModels()];\n    for (int i=0;i<nrForceSubModels();i++)\n    {\n        forceSubModel_[i] = forceSubModel::New\n        (\n            dict,\n            particleCloud_,\n            *this,\n            forceSubModels_[i]\n        );\n        particleCloud_.registryM().addProperty(type()+\"_\"+forceSubModel_[i]().type()+\"_index\",i);\n    }\n}\n\nvoid forceModel::readDHcorr(dictionary& dict)\n{\n    scalarList DHc(dict.lookup(\"DHc\"));\n    particleCloud_.setDHc(DHc);\n}\n\nvoid forceModel::readArea(dictionary& dict)\n{\n    scalarList area(dict.lookup(\"area\"));\n    particleCloud_.setArea(area);\n\n    if(forceSubM(0).verbose() && area.size() > 0 &&  forceSubM(0).getCG()>1)\n    {\n        Warning << \"\\n\\n==============================================================================\\n\"\n         << \"       ! ! !  W A R N I N G  ! ! !\\n\"\n         << \"  You specified area and coarse graining is active - take care you specify\\n\"\n         << \"  area for the coarse grained particles!\\n\" \n         << \"       ! ! !  W A R N I N G  ! ! !\\n\"\n         << \"==============================================================================\\n\\n\" << endl;\n    }\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/forceModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    forceModel\n\nSourceFiles\n    forceModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef forceModel_H\n#define forceModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"probeModel.H\"\n#include \"forceSubModel.H\"\n#include \"interpolationCellPointFace.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class forceModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass forceModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        //Switch treatExplicit_;                      // marker to treat force in implicit way (otherwise explicit)\n        //Switch treatDEM_;                           // marker to use the force only on DEM side\n        //Switch implDEM_;                           // marker to use the implicit force on DEM side\n\n        mutable volVectorField impParticleForces_;  // sum of implicit particle forces [N]\n\n        mutable volVectorField expParticleForces_;  // sum of explicit particle forces [N]\n\n        const word modelType_;\n\n        bool probeIt_;\n\n        bool particleBased_;\n\n        wordList forceSubModels_;\n\n        autoPtr<forceSubModel>* forceSubModel_;\n\n        mutable autoPtr<interpolation<scalar> > GInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > voidfractionInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > UInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > vorticityInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > gradPInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > gradUInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > gradVoidfractionInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > Up1Interpolator_;\n\n        mutable autoPtr<interpolation<vector> > Up2Interpolator_;\n\n        mutable autoPtr<interpolation<scalar> > dSauterInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > phiP1Interpolator_;\n\n        mutable autoPtr<interpolation<scalar> > phiP2Interpolator_;\n\n        mutable autoPtr<interpolation<scalar> > alphaInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > gradAlphaInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > TInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > UsInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > fluidScalarFieldInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > gradPsolidInterpolator_;\n\n        mutable autoPtr<interpolation<symmTensor> > shearRateInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > DDtUInterpolator_;\n\n        mutable autoPtr<interpolation<vector> > divTauInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > RhoInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > kInterpolator_;\n\n        mutable autoPtr<interpolation<scalar> > epsilonInterpolator_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"forceModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            forceModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        forceModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~forceModel();\n\n\n    // Selector\n\n        static autoPtr<forceModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word forceType\n        );\n\n\n    // Member Functions\n\n        void applyDebugSettings(bool) const;\n\n        virtual void setForce() const = 0;\n\n        virtual void multiphaseTurbulence(volScalarField&, bool) const;\n\n        //tmp<volScalarField> provideScalarField();\n\n    // Access\n        word modelType(){ return modelType_; };\n\n        bool modelIsParticleBased() {return particleBased_;};\n\n        inline volVectorField& impParticleForces() const { return impParticleForces_;};\n\n        inline volVectorField& expParticleForces() const { return expParticleForces_;};\n\n//         virtual inline double ** impForces() const { return particleCloud_.impForces_;};\n//\n//         virtual inline double ** expForces() const { return particleCloud_.expForces_;};\n\n        inline double ** omegaFluid() const { return particleCloud_.omegaFluid();};\n\n        virtual inline bool requiresQuaternion() { return forceSubM(0).useQuat();};\n\n        virtual inline bool requiresSuperquadric() { return forceSubM(0).sq();};\n\n        void repartitionImExForces() const; //Repartition Implixit/Explicit forces\n\n        void treatVoidCells() const;\n\n        inline const wordList& forceSubModels(){ return forceSubModels_; };\n\n        inline const forceSubModel& forceSubM(int i) const { return forceSubModel_[i]; };\n\n        inline int nrForceSubModels() const { return forceSubModels_.size(); };\n\n        void setForceSubModels(dictionary& dict);\n\n    // MS member funtions\n        void readDHcorr(dictionary& dict);\n\n        void readArea(dictionary& dict);\n\n        virtual void MSinit() {}; // extra init function for MS stuff\n\n    // MS access\n        virtual inline double ** impForces() const\n        {\n            if (forceSubM(0).ms())\n                return particleCloud_.impForcesCM();\n            else\n                return particleCloud_.impForces();\n        };\n\n        virtual inline double ** expForces() const\n        {\n            if (forceSubM(0).ms())\n                return particleCloud_.expForcesCM();\n            else\n                return particleCloud_.expForces();\n        };\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceModel/newForceModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"forceModel.H\"\n#include \"DiFeliceDrag.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<forceModel> forceModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word forceType\n)\n{\n    Info<< \"Selecting forceModel \"\n         << forceType << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(forceType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"forceModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown forceModelType type \"\n            << forceType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid forceModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<forceModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/ImEx/ImEx.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"ImEx.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(ImEx, 0);\n\naddToRunTimeSelectionTable\n(\n    forceSubModel,\n    ImEx,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nImEx::ImEx\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    forceModel& fm\n)\n:\n    forceSubModel(dict,sm,fm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nImEx::~ImEx()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid ImEx::calcXi(const scalar& ds, const scalar& voidfraction, const scalar& magUr, const scalar& nuf, scalar& Xi ) const\n{\n    forceSubModel::calcXi(ds,voidfraction,magUr,nuf,Xi);\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/ImEx/ImEx.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    ImEx\n\nSourceFiles\n    ImEx.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef ImEx_H\n#define ImEx_H\n\n#include \"forceSubModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class ImEx Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass ImEx\n:\n    public forceSubModel\n{\nprivate:\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"ImEx\");\n\n\n    // Constructors\n\n        //- Construct from components\n        ImEx\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            forceModel& fm\n        );\n\n    // Destructor\n\n        ~ImEx();\n\n\n    // Member Functions\n\n        word myType() const{return typeName; };\n\n        void calcXi(const scalar& ds, const scalar& voidfaction, const scalar& magUr, const scalar& nuf, scalar& Xi ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"forceSubModel.H\"\n#include \"forceModel.H\"\n#include \"mathExtra.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(forceSubModel, 0);\n\ndefineRunTimeSelectionTable(forceSubModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nforceSubModel::forceSubModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    forceModel& fm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    forceModel_(fm),\n    nrDefaultSwitches_(34),                                          // !!!\n    switchesNameList_(wordList(nrDefaultSwitches_)),\n    switchesList_(List<Switch>(nrDefaultSwitches_)),\n    switches_(List<Switch>(nrDefaultSwitches_)),\n    nu_\n    (\n        IOobject\n        (\n            \"scalarViscosity\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"nu0\", dimensionSet(0, 2, -1, 0, 0), 1.)\n    ),\n    /*mu_\n    (\n        IOobject\n        (\n            \"scalarViscosity\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedScalar(\"mu0\", dimensionSet(1, -1, -1, 0, 0), 1.)\n    ),*/\n    divTau_\n    (\n        IOobject\n        (\n            \"divTau\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedVector(\"divTau\", dimensionSet(1, -2, -2, 0, 0), vector::zero)\n    ),\n    IBDragPerV_\n    (\n        IOobject\n        (\n            \"IBDragPerV\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedVector(\"IBDragPerV\", dimensionSet(1, -2, -2, 0, 0), vector::zero)\n    ),\n    densityFieldName_(dict_.lookupOrDefault<word>(\"densityFieldName\",\"rho\")),\n    rho_(sm.mesh().lookupObject<volScalarField> (densityFieldName_)),\n    verboseDiskIntervall_(1),\n    verboseDiskCounter_(0),\n    cg_(dict_.lookupOrDefault<scalar>(\"scale\",1.)),\n    scaleDrag_(dict_.lookupOrDefault<scalar>(\"scaleDrag\",1.)),\n    scaleDragLocal_(dict_.lookupOrDefault<scalar>(\"scaleDragLocal\",1.)),\n    scaleTorque_(dict_.lookupOrDefault<scalar>(\"scaleTorque\",1.)),\n    scaleDH_(dict_.lookupOrDefault<scalar>(\"scaleDH\",1.))\n{\n    // init standard switch list\n    int iCounter(0);\n    switchesNameList_[iCounter]=\"treatForceExplicit\"; iCounter++;   //0 - will treat force explicity (based on slip velocity)\n    switchesNameList_[iCounter]=\"treatForceDEM\";iCounter++;         //1 - will treat forces on DEM side only\n    switchesNameList_[iCounter]=\"implForceDEM\";iCounter++;          //2\n    switchesNameList_[iCounter]=\"verbose\";iCounter++;               //3\n    switchesNameList_[iCounter]=\"interpolation\";iCounter++;         //4\n    switchesNameList_[iCounter]=\"useFilteredDragModel\";iCounter++;  //5\n    switchesNameList_[iCounter]=\"useParcelSizeDependentFilteredDrag\";iCounter++;  //6\n    switchesNameList_[iCounter]=\"implForceDEMaccumulated\";iCounter++;             //7\n    switchesNameList_[iCounter]=\"scalarViscosity\";iCounter++;                     //8\n    switchesNameList_[iCounter]=\"verboseToDisk\";iCounter++;                       //9\n    switchesNameList_[iCounter]=\"useCorrectedVoidage\";iCounter++;                 //10\n    switchesNameList_[iCounter]=\"multisphere\";iCounter++;                         //11\n    switchesNameList_[iCounter]=\"useTorque\";iCounter++;                           //12\n    switchesNameList_[iCounter]=\"anisotropicDrag\";iCounter++;                     //13\n    switchesNameList_[iCounter]=\"pullRotation\";iCounter++;                        //14\n    switchesNameList_[iCounter]=\"pullOrientation\";iCounter++;                     //15\n    switchesNameList_[iCounter]=\"pullShape\";iCounter++;                           //16\n    switchesNameList_[iCounter]=\"voidageFunctionDiFelice\";iCounter++;             //17\n    switchesNameList_[iCounter]=\"voidageFunctionRong\";iCounter++;                 //18\n    switchesNameList_[iCounter]=\"useUf\";iCounter++;                               //19\n    switchesNameList_[iCounter]=\"useFhydro\";iCounter++;                           //20\n    switchesNameList_[iCounter]=\"implTorqueDEM\";iCounter++;                       //21\n    switchesNameList_[iCounter]=\"useVisc\";iCounter++;                             //22\n    switchesNameList_[iCounter]=\"voidageFunctionTang\";iCounter++;                 //23\n    switchesNameList_[iCounter]=\"useMpData\";iCounter++;                           //24\n    switchesNameList_[iCounter]=\"superquadric\";iCounter++;                        //25\n    switchesNameList_[iCounter]=\"useQuaternion\";iCounter++;                       //26\n    switchesNameList_[iCounter]=\"pushTurbulence\";iCounter++;                      //27\n    switchesNameList_[iCounter]=\"particleSpecificCG\";iCounter++;                  //28\n    switchesNameList_[iCounter]=\"convex\";iCounter++;                              //29\n    switchesNameList_[iCounter]=\"pullType\";iCounter++;                            //30\n    switchesNameList_[iCounter]=\"pullDensity\";iCounter++;                         //31\n    switchesNameList_[iCounter]=\"pushConvectiveHeatFlux\";iCounter++;              //32\n    switchesNameList_[iCounter]=\"pullTemp\";iCounter++;                            //33\n\n    // should be done by default\n    //for(int i=0;i<switchesList_.size();i++)\n    //{\n    //    switchesList_[i]=false;\n    //    switches_[i]=false;\n    //}\n\n    // sanity check of what is defined above\n    if(switchesNameList_.size() != nrDefaultSwitches_)\n        FatalError<< \"please check the nr of switches defined in forceSubModel class.\" << abort(FatalError);\n\n    // info about scaleDia being used\n    if (cg_ != 1)\n        Info << \"using scale = \" << cg_ << endl;\n    else if (particleCloud_.cg() != 1)\n    {\n        cg_=particleCloud_.cg();\n        Info << \"using scale from liggghts cg = \" << cg_ << endl;\n    }\n\n    // info about scaleDrag being used\n    if (scaleDrag_ != 1.)\n        Info << \"using scaleDrag = \" << scaleDrag_ << endl;\n\n    if (scaleDrag_ < SMALL)\n       FatalError<< \"scaleDrag > 0 required\" << abort(FatalError);\n\n    particleCloud_.registryM().addProperty(\"scaleDrag\",scaleDrag_);\n\n    // info about scaleDrag being used\n    if (scaleDragLocal_ != 1.)\n        Info << \"using scaleDragLocal = \" << scaleDragLocal_ << endl;\n\n    if (scaleDragLocal_ < SMALL)\n       FatalError<< \"scaleDragLocal > 0 required\" << abort(FatalError);\n\n    // info about scaleTorque being used\n    if (scaleTorque_ != 1.)\n        Info << \"using scaleTorque = \" << scaleTorque_ << endl;\n\n    if (scaleTorque_ < SMALL)\n       FatalError<< \"scaleTorque > 0 required\" << abort(FatalError);\n\n    // info about scaleDH being used\n    if (scaleDH_ != 1)\n        Info << \"using scaleDH = \" << scaleDH_ << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nforceSubModel::~forceSubModel()\n{}\n\n// * * * * * * * * * * * * * * * * Member Fct  * * * * * * * * * * * * * * * //\nvoid forceSubModel::partToArray\n(\n    const label& index,\n    const vector& dragTot,\n    const vector& dragEx,\n    const vector& Ufluid,\n    scalar Cd,\n    const vector& CdExtra\n) const\n{\n    // forces for CFD\n    if(!treatForceDEM())\n    {\n        if(treatForceExplicit())\n        {\n            for(int j=0;j<3;j++)\n                myForceM().expForces()[index][j] += dragTot[j];\n        }\n        else   //implicit treatment, taking explicit force contribution into account\n        {\n            for(int j=0;j<3;j++)\n            {\n                myForceM().impForces()[index][j] += dragTot[j] - dragEx[j];\n                myForceM().expForces()[index][j] += dragEx[j];\n            }\n        }\n    }\n\n    // forces for DEM\n    if(implForceDEM())\n    {\n        if(ms())\n        {\n            for(int j=0;j<3;j++)\n                particleCloud_.fieldsToDEM[particleCloud_.idUfCM()][index][j] = Ufluid[j];\n\n            if(anisotropicDrag())\n            {\n                for(int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[particleCloud_.idKslExtraCM()][index][j] = CdExtra[j];\n\n                for(int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[particleCloud_.idDragExpCM()][index][j] += dragEx[j];\n            }\n            else\n                particleCloud_.fieldsToDEM[particleCloud_.idKslCM()][index][0] = Cd;\n        }\n        else\n        {\n            for(int j=0;j<3;j++)\n                particleCloud_.fieldsToDEM[particleCloud_.idUf()][index][j] = Ufluid[j];\n\n            if(anisotropicDrag())\n            {\n                for(int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[particleCloud_.idKslExtra()][index][j] = CdExtra[j];\n\n                for(int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[particleCloud_.idDragExp()][index][j] += dragEx[j];\n            }\n            else\n                particleCloud_.fieldsToDEM[particleCloud_.idKsl()][index][0] = Cd;\n        }\n    }\n    else\n    {\n        if(ms())\n        {\n            for(int j=0;j<3;j++)\n                particleCloud_.fieldsToDEM[particleCloud_.idDragExpCM()][index][j] += dragTot[j];\n        }\n        else\n        {\n            for(int j=0;j<3;j++)\n                particleCloud_.fieldsToDEM[particleCloud_.idDragExp()][index][j] += dragTot[j];\n        }\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::partToArrayAnisotropicTorque\n(\n    const label&        index,\n    const vector&       CdTorque,\n    const vector& torqueTotal  //this is the total torque\n) const\n{\n\n    if(useTorque())\n    {\n        if(implTorqueDEM())\n        {\n            if(ms())\n            {\n                for(int iDir=0;iDir<3;iDir++)\n                {\n                    particleCloud_.fieldsToDEM[particleCloud_.idKslRotationCM()][index][iDir] = CdTorque[iDir];\n                    particleCloud_.fieldsToDEM[particleCloud_.idTorqueExpCM()][index][iDir] += torqueTotal[iDir];\n                }\n                /*if(verbose()) Pout << \"*********forceSubModel::partToArrayAnisotropic: CdTorque: \"\n                                      << CdTorque\n                                      << \", torqueTotal: \" << torqueTotal << endl;*/\n            }\n            else\n            {\n                for(int iDir=0;iDir<3;iDir++)\n                {\n                    particleCloud_.fieldsToDEM[particleCloud_.idKslRotation()][index][iDir] = CdTorque[iDir];\n                    particleCloud_.fieldsToDEM[particleCloud_.idTorqueExp()][index][iDir] += torqueTotal[iDir];\n                }\n            }\n        }\n        else\n        {\n            for(int iDir=0;iDir<3;iDir++)\n                particleCloud_.fieldsToDEM[particleCloud_.idTorqueExpCM()][index][iDir] += torqueTotal[iDir];\n        }\n\n    }\n    else\n    {\n        if(index==0) Info << \"forceSubModel::partToArrayAnisotropicTorque, useTorque=false\" << endl;\n    }\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::explicitCorr\n(\n    vector& dragImplicit,\n    vector& dragExplicit,\n    scalar& dragCoefficient,\n    vector& Ufluid,\n    const vector& Ucell,\n    vector& Us,\n    const vector& UsCell,\n    bool verbose,\n    label index\n) const\n{\n    dragExplicit=vector::zero;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::explicitCorrScalar(scalar& sourceKImplicit,\n                                       scalar& sourceExplicit,\n                                       scalar& areaTimesTransferCoefficient,\n                                       scalar& fluidProperty,\n                                       const   scalar& fluidPropertyCell,\n                                       scalar& particleProperty,\n                                       bool    verbose,\n                                       label   index) const\n{\n\n    //everything is explicit, no verbose\n    sourceExplicit  = areaTimesTransferCoefficient * (fluidProperty - particleProperty);\n    sourceKImplicit = 0.0;\n\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::update( label    particleI,\n                            label    cellI,\n                            scalar&  d,\n                            scalar&  scalToUpdate1,\n                            scalar&  scalToUpdate2,\n                            bool     verbose\n                          ) const\n{\n    //no action\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::update( label    particleI,\n                            label    cellI,\n                            scalar&  d,\n                            vector&  vecToUpdate1,\n                            vector&  vecToUpdate2,\n                            scalar&  scalToUpdate1,\n                            scalar&  scalToUpdate2,\n                            bool     verbose\n                          ) const\n{\n    //no action\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::scaleDia(scalar& d, int index) const\n{\n    if (particleCG() || particleCloud_.cgTypeSpecificDifferent_)\n        d /= particleCloud_.cg(index) / scaleDH_;\n    else\n        d /= cg_ / scaleDH_;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::scaleForce(vector& force, scalar& d, int index) const\n{\n    if (particleCG() || particleCloud_.cgTypeSpecificDifferent_)\n        force *= getCG(index)*getCG(index)*getCG(index);\n    else\n        force *= cg_*cg_*cg_;\n\n    force *= scaleDrag_;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::scaleCoeff(scalar& coeff, scalar& d, scalar& Rep, int index) const\n{\n    if (particleCG() || particleCloud_.cgTypeSpecificDifferent_)\n        coeff *= getCG(index)*getCG(index)*getCG(index);\n    else\n        coeff *= cg_*cg_*cg_;\n\n    coeff *= scaleDrag_;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::scaleForceLocal(vector& force) const\n{\n    force *= scaleDragLocal_;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::scaleTorque(vector& torque) const\n{\n    torque *= scaleTorque_;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nconst scalar forceSubModel::scaleDrag(int index) const\n{\n    return particleCloud_.cg(index);\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid forceSubModel::explicitLimit\n(\n    vector& dragImplicit,\n    vector& dragExplicit,\n    scalar& d\n) const\n{\n    dragExplicit=vector::zero;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nvoid forceSubModel::readSwitches() const\n{\n    bool first(true);\n    forAll(switchesNameList_,i)\n    {\n        if(switchesList_[i] > 0+SMALL) //check if switch is read from dict\n        {\n            if(first)\n            {\n                Info << \" reading switches:\" << endl;\n                first = false;\n            }\n            Info << \"  looking for \" << switchesNameList_[i] << \" ... \";\n            if (dict_.found(switchesNameList_[i]))\n            {\n                Info << \" found in dict. \" ;\n                switches_[i]=Switch(dict_.lookup(switchesNameList_[i]));\n            }else\n            {\n                Info << \" not found in dict, using default. \" ;\n                if(i==2) Warning << \"\\n You are using the default value for 'implForceDEM' - beware that in CFDEMcoupling versions newer than 3.8.0 this default value has changed from (previously) false to (now) true!\" << endl;\n            }\n\n            // user set treatForceExplicit to true && no explicitCouple model is defined && treatForceDEM=false(i.e. it will go to f) && modelType != \"none\"\n            if(i==0 && switches_[0] > 0+SMALL && particleCloud_.registryM().getProperty(\"explicitCouple_index\") < 0 && switches_[1] < 0+SMALL && particleCloud_.modelType() != \"none\")\n                FatalError <<  \"You are using treatForceExplicit=true here, this requres having an explicit momentum couple model!\" << abort(FatalError);\n            else\n                Info << switchesNameList_[i] << \" = \" << switches_[i] << endl;\n        }\n    }\n    Info << endl;\n\n    /*// sanity check\n    if(switchesList_[0] < 0+SMALL) //check if switch is not read from dict\n    {\n        // (treatForceExplicit is set to true) && no explicitCouple model is defined && treatForceDEM=false\n        if(switches_[0] > 0+SMALL && particleCloud_.registryM().getProperty(\"explicitCouple_index\") < 0 && switches_[1] < 0+SMALL)\n            FatalError <<  \"treatForceExplicit = true. This requres having an explicit momentum couple model!\" << abort(FatalError);\n    }\n\n\n    // debug info\n    Info << \"other switches for forceSubModel which are auot-set:\" << myType() << endl;\n    forAll(switchesNameList_,i)\n    {\n        if(switchesList_[i] < 0+SMALL) //check if switch is NOT read from dict but exists\n        {\n            Info << \"\\t\" << switchesNameList_[i] << \" = \" << switches_[i] << endl;\n        }\n    }\n    Info << endl;*/\n\n    if(implForceDEM()) // implForceDEM=true\n    {\n        // communicate implForceDEM to particleCloud\n        particleCloud_.impDEMdrag_=true;\n\n        // do sanity check\n        // This can work if the accumulator is used, but is explicitely applied on the CFD side\n        // Sanity check is therefore not necessary here\n        /*\n        if(switches_[0]) // treatExplicit=true\n        {\n            FatalError << \"Please check your settings, treatExplicit together with implForceDEM does not work!.\"\n                       << abort(FatalError);\n        }\n        */\n    }\n\n    if(switches_[7]) // implForceDEMaccumulated=true\n    {\n        // sanity check for implForceDEMaccumulated\n        if(!switches_[2]) //implForceDEM=false\n        {\n            Warning<< \"please check your settings, implForceDEMaccumulated without implForceDEM does not work! (using implForceDEMaccumulated=false)\" << endl;\n            switches_[3]=false;\n        }else\n        {\n            particleCloud_.impDEMdragAcc_=true;\n        }\n    }\n\n    if(switches_[8]) // scalarViscosity=true\n    {\n        Info << \"Using a constant viscosity for this force model.\" << endl;\n        dimensionedScalar  nu0_(\"nu\", dimensionSet(0, 2, -1, 0, 0), dict_.lookup(\"nu\"));\n        nu_=volScalarField\n        (\n            IOobject\n            (\n                \"scalarViscosity\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            nu0_\n        );\n\n        /*if (dict_.found(\"mu\"))\n        {\n            Info << \"Using a constant viscosity for this force model.\" << endl;\n            dimensionedScalar  mu0_(\"mu\", dimensionSet(1, -1, -1, 0, 0), dict_.lookup(\"mu\"));\n            mu_=volScalarField\n            (\n                IOobject\n                (\n                    \"scalarViscosity\",\n                    particleCloud_.mesh().time().timeName(),\n                    particleCloud_.mesh(),\n                    IOobject::NO_READ,\n                    IOobject::NO_WRITE\n                ),\n                particleCloud_.mesh(),\n                mu0_\n            );\n        }*/\n    }\n\n    if(anisotropicDrag() && !implForceDEM())\n        FatalError<< \"You have set 'implForceDEM' to false, but 'anisotropicDrag' to true.\"<< abort   (FatalError);\n\n    // read extra variables\n    dict_.readIfPresent(\"verboseDiskIntervall\", verboseDiskIntervall_);\n\n    // look for old nomenclature\n    if (dict_.found(\"treatExplicit\") || dict_.found(\"treatDEM\") || dict_.found(\"implDEM\"))\n        FatalError<< \"You are using an old nomenclature for force model settings, please have a look at the forceSubModel doc.\" << abort(FatalError);\n\n    // look for old nomenclature\n    if (dict_.found(\"verbose\"))\n        Warning<< \"Please make sure you use the new nomenclature for verbose force model settings, please have a look at the forceSubModel doc.\" << endl;\n}\n\nvoid forceSubModel::setupCommunication() const\n{\n    particleCloud_.registerFieldsToDEM(\"radius\",\"scalar-atom\",particleCloud_.idRadius(),true);\n    particleCloud_.registerFieldsToDEM(\"x\",\"vector-atom\",particleCloud_.idPos(),true);\n    particleCloud_.registerFieldsToDEM(\"v\",\"vector-atom\",particleCloud_.idVel(),true);\n\n    if(particleCloud_.impDEMdragAcc())\n        particleCloud_.registerFieldsToDEM(\"dragAcc\",\"vector-atom\",particleCloud_.idFacc(),true);\n\n    if(ms())\n    {\n        if(implForceDEM())\n        {\n            if(anisotropicDrag())\n                particleCloud_.registerFieldsToDEM(\"Ksl_Extra_cm\",\"vector-multisphere\",particleCloud_.idKslExtraCM());\n            else\n                particleCloud_.registerFieldsToDEM(\"Ksl_cm\",\"scalar-multisphere\",particleCloud_.idKslCM());\n\n            particleCloud_.registerFieldsToDEM(\"uf_cm\",\"vector-multisphere\",particleCloud_.idUfCM());\n        }\n        else\n        {\n            particleCloud_.registerFieldsToDEM(\"dragforce_cm\",\"vector-multisphere\",particleCloud_.idDragExpCM());\n        }\n        if(useTorque())\n        {\n            if(implTorqueDEM())\n            {\n                particleCloud_.registerFieldsToDEM(\"KslRotation\",\"vector-multisphere\",particleCloud_.idKslRotationCM()); // TODO: this should have other name on DEM side (is ambigous with MS version)\n            }\n            particleCloud_.registerFieldsToDEM(\"hdtorque_cm\",\"vector-multisphere\",particleCloud_.idTorqueExpCM());\n        }\n    }\n    else\n    {\n        if(implForceDEM())\n        {\n            if(anisotropicDrag())\n                particleCloud_.registerFieldsToDEM(\"KslExtra\",\"vector-atom\",particleCloud_.idKslExtra());\n            else\n                particleCloud_.registerFieldsToDEM(\"Ksl\",\"scalar-atom\",particleCloud_.idKsl());\n\n            particleCloud_.registerFieldsToDEM(\"uf\",\"vector-atom\",particleCloud_.idUf());\n        }\n        else\n        {\n            particleCloud_.registerFieldsToDEM(\"dragforce\",\"vector-atom\",particleCloud_.idDragExp());\n        }\n        if(useTorque())\n        {\n            if(implTorqueDEM())\n            {\n                particleCloud_.registerFieldsToDEM(\"KslRotation\",\"vector-atom\",particleCloud_.idKslRotation());\n            }\n            particleCloud_.registerFieldsToDEM(\"hdtorque\",\"vector-atom\",particleCloud_.idTorqueExp());\n        }\n    }\n\n\n    if(pullRotation())\n        particleCloud_.registerFieldsToDEM(\"omega\",\"vector-atom\",particleCloud_.idPullRotation(),true);\n\n    if(pullOrientation())\n    {\n        if(ms())\n        {\n            particleCloud_.registerFieldsToDEM(\"ex_space\",\"vector-multisphere\",particleCloud_.idPullOrientation(),true);\n            particleCloud_.registerFieldsToDEM(\"ey_space\",\"vector-multisphere\",particleCloud_.idPullOrientation1(),true);\n        }\n        else\n        {\n            particleCloud_.registerFieldsToDEM(\"ex\",\"vector-atom\",particleCloud_.idPullOrientation(),true);\n        }\n    }\n    if(pullShape())\n        particleCloud_.registerFieldsToDEM(\"shape\",\"vector-atom\",particleCloud_.idPullShape(),true);\n    if(useUf())\n        particleCloud_.registerFieldsToDEM(\"uf\",\"vector-atom\",particleCloud_.idUf());\n    if(useFhydro())\n        particleCloud_.registerFieldsToDEM(\"Fhydro\",\"vector-atom\",particleCloud_.idFhydro(),true);\n    if(useVisc())\n        particleCloud_.registerFieldsToDEM(\"muf\",\"scalar-atom\",particleCloud_.idVisc());\n\n    if(sq())\n    {\n        particleCloud_.registerFieldsToDEM(\"area\",\"scalar-atom\",particleCloud_.idArea(),true);\n        particleCloud_.registerFieldsToDEM(\"volume\",\"scalar-atom\",particleCloud_.idVol(),true);\n        particleCloud_.registerFieldsToDEM(\"blockiness\",\"vector2D-atom\",particleCloud_.idBlockiness(),true);\n    }\n    if(convex())\n    {\n        particleCloud_.registerFieldsToDEM(\"rmass\",\"scalar-atom\",particleCloud_.idMass(),true);\n        particleCloud_.registerFieldsToDEM(\"density\",\"scalar-atom\",particleCloud_.idDensity(),true);\n        particleCloud_.registerFieldsToDEM(\"shapetype\",\"scalar-atom\",particleCloud_.idType(),true);\n    }\n    if(pullType())\n    {\n        word nameForType;\n        if(particleCloud_.shapeTypeName()==\"convex\")\n            nameForType=word(\"shapetype\");\n        else\n        {\n            nameForType=word(\"type\");\n            Warning <<\"\\n  Using (material) type to distinguish types (e.g. scaleVol).\\n\"\n                    <<\"  You might use separate material types if you want to scale them separately.\" << endl;\n        }\n        //TODO use e.g. group to identify different sq types and use groups for SQ templates\n        //if(particleCloud_.shapeTypeName()==\"superquadric\")\n        particleCloud_.registerFieldsToDEM(nameForType,\"scalar-atom\",particleCloud_.idType(),true);\n    }\n    if(pullDensity())\n        particleCloud_.registerFieldsToDEM(\"density\",\"scalar-atom\",particleCloud_.idDensity(),true);\n    if(pushConvectiveHeatFlux())\n        particleCloud_.registerFieldsToDEM(\"convectiveHeatFlux\",\"scalar-atom\",particleCloud_.idConvectiveHeatFlux());\n    if(pullTemp())\n        particleCloud_.registerFieldsToDEM(\"Temp\",\"scalar-atom\",particleCloud_.idTemp(),true);\n    if(useQuat())\n        particleCloud_.registerFieldsToDEM(\"quaternion\",\"quaternion-atom\",particleCloud_.idQuat(),true);\n\n    if(pushTurbulence())\n    {\n        particleCloud_.registerFieldsToDEM(\"k\",\"scalar-atom\",particleCloud_.idK());\n        particleCloud_.registerFieldsToDEM(\"epsilon\",\"scalar-atom\",particleCloud_.idEpsilon());\n    }\n\n    if (particleCG())\n    {\n        particleCloud_.registerFieldsToDEM(\"dSauter\", \"scalar-atom\", particleCloud_.idParticleCG(), true);\n        particleCloud_.cgParticleSpecific_ = true;\n    }\n}\n\nconst volScalarField& forceSubModel::nuField() const\n{\n    #ifdef compre\n        nu_=particleCloud_.turbulence_.mu() / rho_;\n        return nu_;\n    #else\n        if(switches_[8]) // scalarViscosity=true\n            return nu_;\n        else\n            return particleCloud_.turbulence_.nu();\n    #endif\n}\n\nconst volScalarField& forceSubModel::muField() const\n{\n    #ifdef compre\n        return particleCloud_.turbulence_.mu();\n    #else\n        if(switches_[8]) // scalarViscosity=true\n        {\n            // usage of constant mu_ is still commented, as not tested\n            // particleCloud_.turbulence_.nu()*rho_ does not work properly\n            FatalError<< \"implementation not complete!\" << abort(FatalError);\n            //return mu_; // to be used with above code to set mu_ in readSwitches()\n\n            return particleCloud_.turbulence_.nu()*rho_;// for now just to have a return\n        }else\n            return particleCloud_.turbulence_.nu()*rho_;\n    #endif\n}\n\nconst volScalarField& forceSubModel::rhoField() const\n{\n    return rho_;\n}\n\nconst volVectorField& forceSubModel::divTauField(const volVectorField& U) const\n{\n    // calc div(Tau)\n    #ifdef compre\n        const volScalarField& mu_ = muField();\n        divTau_ = -fvc::laplacian(mu_, U) - fvc::div(mu_*dev(fvc::grad(U)().T()));\n        return divTau_;\n    #else\n        const volScalarField& nu_ = nuField();\n        const volScalarField& rho_ = rhoField();\n        divTau_ = -fvc::laplacian(nu_*rho_, U)- fvc::div(nu_*rho_*dev(fvc::grad(U)().T()));\n        return divTau_;\n    #endif\n}\n\nconst volVectorField& forceSubModel::IBDragPerV(const volVectorField& U,const volScalarField& p) const\n{\n    #ifdef compre\n        IBDragPerV_ = muField()*fvc::laplacian(U)-fvc::grad(p);\n    #else\n        IBDragPerV_ = rhoField()*(nuField()*fvc::laplacian(U)-fvc::grad(p));\n    #endif\n    return IBDragPerV_;\n}\n\nvoid forceSubModel::calcXi(const scalar& ds, const scalar& voidfraction, const scalar& magUr, const scalar& nuf, scalar& Xi ) const\n{\n    if(!(voidageFunctionDiFelice() || voidageFunctionRong() || voidageFunctionTang()))\n    {\n        Xi = 2;\n    } else if(!(voidageFunctionDiFelice() ^ voidageFunctionRong() ^ voidageFunctionTang() ))\n    { //triple XOR, \"There can be only one!\"\n        FatalError<< \"Only one drag correction function permitted, please select either voidageFunctionDiFelice OR voidageFunctionRong!\" << abort(FatalError);\n    } else if (voidageFunctionDiFelice())\n    {\n        // calc DiFelice drag correction\n\n        // calc particle Re number\n        scalar Rep = ds*voidfraction*magUr/(nuf+SMALL);\n\n        // calc Xi\n        if(Rep < SMALL)\n            Xi = 3.7;\n        else\n            Xi = 3.7 - 0.65 * exp(-sqr(1.5-log10(Rep))/2);\n\n    } else if (voidageFunctionRong())\n    {\n        // calculate Rong drag correction\n\n        scalar Rep = ds*voidfraction*magUr/(nuf+SMALL);\n        if(Rep < SMALL)\n            Xi = 2.65 * (voidfraction + 1.0);\n        else\n            Xi = 2.65 * (voidfraction + 1.0) - (5.3-3.5*voidfraction)*voidfraction*voidfraction*exp(-sqr(1.5-Foam::log10(Rep))/2.0);\n    } else if (voidageFunctionTang())\n    {\n        // calculate Tang drag correction\n        scalar Rep = ds*voidfraction*magUr/(nuf+SMALL);\n        if(Rep < SMALL || 1 - voidfraction < SMALL)\n            Xi = 2;\n        else\n            Xi = 2 -\n            Foam::log10(((1.5*sqrt(1-voidfraction)+1)*voidfraction*voidfraction - (10*(voidfraction-1))/(voidfraction*voidfraction) +\n             (0.0644*pow(voidfraction,-4)+0.169*voidfraction)*pow(Rep,0.657) - (0.00456*Rep)*pow(voidfraction,-4) + 0.11*(voidfraction-2)*(voidfraction-1)*Rep)\n             / (0.2334*pow(Rep,0.657) - 0.00456*Rep + 1))\n            / Foam::log10(voidfraction);\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/forceSubModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    forceSubModel\n\nSourceFiles\n    forceSubModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef forceSubModel_H\n#define forceSubModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"probeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class forceSubModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass forceSubModel\n{\nprivate:\n\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        forceModel& forceModel_;\n\n        label nrDefaultSwitches_;                   // nr of switches defined in mother class\n\n        wordList switchesNameList_;                 // names of switches available\n\n        mutable List<Switch> switchesList_;         // switches which are requested in dict\n\n        mutable List<Switch> switches_;\n\n        mutable volScalarField nu_;\n\n        //mutable volScalarField mu_;\n\n        mutable volVectorField divTau_;\n\n        mutable volVectorField IBDragPerV_;\n\n        word densityFieldName_;\n\n        const   volScalarField& rho_;\n\n        mutable int     verboseDiskIntervall_;\n\n        mutable int     verboseDiskCounter_;\n\n        scalar cg_;\n\n        scalar scaleDrag_;\n\n        scalar scaleDragLocal_;\n\n        scalar scaleTorque_;\n\n        scalar scaleDH_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"forceSubModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            forceSubModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm,\n                forceModel& fm\n            ),\n            (dict,sm,fm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        forceSubModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            forceModel& fm\n        );\n\n\n    // Destructor\n\n        virtual ~forceSubModel();\n\n\n    // Selector\n\n        static autoPtr<forceSubModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            forceModel& fm,\n            word forceType\n        );\n\n\n    // Member Functions\n        void partToArray(const label&, const vector&, const vector&, const vector& Ufluid=vector::zero, scalar Cd=scalar(0),const vector& CdExtra=vector::zero) const;\n\n        //function to set anisotropic drag components for DEM side only.\n        void partToArrayAnisotropic(const label&, const vector&, const vector& dragEx=vector::zero) const;\n\n        //function to set anisotropic torque components for DEM side only.\n        void partToArrayAnisotropicTorque(const label&, const vector&, const vector& torqueTotal=vector::zero) const;\n\n        virtual void constructorCalls(word typeName) const {}\n\n        virtual void preParticleLoop(bool verbose=false) const {}\n\n        virtual void postParticleLoop(bool verbose=false) const {}\n\n        virtual void explicitCorr(vector&, vector&, scalar&, vector&, const vector&, vector&, const vector&, bool,label index=100) const;\n\n        virtual void explicitCorrScalar(scalar&, scalar&, scalar&,\n                                        scalar&, const scalar&, scalar&, bool, label index=100) const;\n\n        virtual void update(label particleI,        label cellI,            scalar& d,\n                            scalar& scalToUpdate1,  scalar&  scalToUpdate2, bool  verbose) const;\n\n        virtual void update(label particleI,        label cellI,            scalar& d,\n                            vector& vecToUpdate1,   vector&  vecToUpdate2,\n                            scalar& scalToUpdate1,  scalar&  scalToUpdate2,\n                            bool  verbose) const;\n\n        virtual void scaleDia(scalar& d, int index=0) const;\n\n        virtual void scaleForce(vector& force, scalar& d, int index=0) const;\n\n        virtual void scaleCoeff(scalar& coeff, scalar& d, scalar& Rep, int index=0) const;\n\n        virtual void scaleForceLocal(vector& force) const;\n\n        virtual void scaleTorque(vector& torque) const;\n\n        virtual void explicitLimit(vector&, vector&, scalar&) const;\n\n        virtual void verboseToDiskWrite(Field<scalar>& writeValues) const {};//implement writing to disk\n\n        virtual void calculateCorrectedVoidage(\n            scalar& voidfraction, vector& Ufluid, scalar cellVolume, scalar diameter\n        ) const {};\n\n        virtual void  updateField(volScalarField* scalField, volVectorField* vecField) const {};\n\n        virtual void  getField(vector position, label cellI, scalar& scalVal, vector& vecVal) const {};\n\n    // Access\n        inline bool treatForceExplicit() const { return switches_[0]; }\n\n        inline bool treatForceDEM() const { return switches_[1]; }\n\n        inline bool implForceDEM() const { return switches_[2]; }\n\n        inline bool verbose() const      { return switches_[3]; }\n\n        inline bool interpolation() const { return switches_[4]; }\n\n        inline bool useFilteredDragModel() const { return switches_[5]; }\n\n        inline bool useParcelSizeDependentFilteredDrag() const { return switches_[6]; }\n\n        inline bool verboseToDisk() const\n        {\n            verboseDiskCounter_++;\n            if(verboseDiskCounter_>=verboseDiskIntervall_)\n            {\n                verboseDiskCounter_=0;\n                return switches_[9];\n            }\n            else\n                return false;\n        }\n\n        virtual word myType() const=0;\n\n        inline bool ms() const { return switches_[11]; }\n        inline bool sq() const { return switches_[25]; }\n        inline bool convex() const { return switches_[29]; }\n\n        inline bool useTorque() const { return switches_[12]; }\n\n        inline bool anisotropicDrag() const { return switches_[13]; }\n\n        inline bool pullRotation() const { return switches_[14]; }\n\n        inline bool pullOrientation() const { return switches_[15]; }\n\n        inline bool pullShape() const { return switches_[16]; }\n\n        inline bool voidageFunctionDiFelice() const { return switches_[17]; }\n\n        inline bool voidageFunctionRong() const { return switches_[18]; }\n        inline bool voidageFunctionTang() const { return switches_[23]; }\n\n        inline bool useUf() const { return switches_[19]; }\n\n        inline bool useFhydro() const { return switches_[20]; }\n\n        inline bool implTorqueDEM() const { return switches_[21]; }\n\n        inline bool useVisc() const { return switches_[22]; }\n\n        inline bool useMpData() const { return switches_[24]; }\n\n        inline bool useQuat() const { return switches_[26]; }\n\n        inline bool pushTurbulence() const { return switches_[27]; }\n\n        inline bool particleCG() const { return switches_[28]; }\n\n        inline bool pullType() const { return switches_[30]; }\n\n        inline bool pullDensity() const { return switches_[31]; }\n\n        inline bool pushConvectiveHeatFlux() const { return switches_[32]; }\n\n        inline bool pullTemp() const { return switches_[33]; }\n\n        inline forceModel& myForceM() const { return forceModel_; }\n\n        inline const List<Switch>& switches() const { return switches_; }\n\n        inline const wordList& switchesNameList() const { return switchesNameList_; }\n\n        void setSwitchesList(label i, bool v, bool defaultValue=false) const { switchesList_[i] = v; switches_[i]=defaultValue; }\n\n        void setSwitches(label i, Switch v) const { switches_[i] = v; }\n\n        virtual void readSwitches() const;\n\n        void setupCommunication() const;\n\n        const label& nrDefaultSwitches() const { return nrDefaultSwitches_; }\n\n        const volScalarField& nuField() const;\n\n        const volScalarField& muField() const;\n\n        const volScalarField& rhoField() const;\n\n        const volVectorField& divTauField(const volVectorField&) const;\n\n        const volVectorField& IBDragPerV(const volVectorField&,const volScalarField&) const;\n\n        inline scalar getCG(int index=0) const { return particleCloud_.cg(index); };\n\n        const scalar scaleDrag(int index=0) const;\n\n        const scalar& scaleDragLocal() const {return scaleDragLocal_;};\n\n        const scalar& scaleTorque() const {return scaleTorque_;};\n\n        virtual void calcXi(const scalar& ds, const scalar& voidfaction, const scalar& magUr, const scalar& nuf, scalar& Xi ) const=0;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/forceSubModels/forceSubModel/newForceSubModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"forceSubModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<forceSubModel> forceSubModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    forceModel& fm,\n    word forceType\n)\n{\n    Info<< \" Selecting forceSubModel \"\n         << forceType << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(forceType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"forceSubModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown forceSubModelType type \"\n            << forceType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid forceSubModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<forceSubModel>(cstrIter()(dict,sm,fm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"gradPForce.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(gradPForce, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    gradPForce,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ngradPForce::gradPForce\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    pFieldName_(propsDict_.lookupOrDefault<word>(\"pFieldName\",\"p\")),\n    p_(sm.mesh().lookupObject<volScalarField> (pFieldName_)),\n    velocityFieldName_(propsDict_.lookupOrDefault<word>(\"velocityFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velocityFieldName_)),\n    useRho_(false),\n    useU_(false),\n    addedMassCoeff_(0.0)\n{\n    // block gradPForceModel for type B\n    if (modelType_ == \"B\") FatalError <<\"using  model gradPForce with model type B is not valid\\n\" << abort(FatalError);\n\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"gradPForce\"); //first entry must the be the force\n        particleCloud_.probeM().scalarFields_.append(\"Vs\");\n        particleCloud_.probeM().scalarFields_.append(\"rho\");\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(0,true);       // make treatForceExplicit=true the default (is desired, otherwise this force would be implicit in slip vel!)\n    if (modelType_ == \"Bfull\")              // type Bfull\n        forceSubM(0).setSwitches(1,false);  // treatForceDEM = false\n    else                                    // type A\n        forceSubM(0).setSwitches(1,true);   // treatForceDEM = true\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    if (propsDict_.found(\"useU\")) useU_=true;\n    if (propsDict_.found(\"useAddedMass\")) \n    {\n        addedMassCoeff_ =  readScalar(propsDict_.lookup(\"useAddedMass\"));\n        Info << \"gradP will also include added mass with coefficient: \" << addedMassCoeff_ << endl;\n        Info << \"WARNING: use fix nve/sphere/addedMass in LIGGGHTS input script to correctly account for added mass effects!\" << endl;\n    }\n\n    if(p_.dimensions()==dimensionSet(0,2,-2,0,0))\n        useRho_ = true;\n\n    particleCloud_.registryM().addProperty(\"gradPpFieldName_\"+pFieldName_,0.);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ngradPForce::~gradPForce()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid gradPForce::setForce() const\n{\n    volVectorField gradP_ = fvc::grad(p_);\n    /*if (useU_)\n    {\n        // const volScalarField& voidfraction_ = particleCloud_.mesh().lookupObject<volScalarField> (\"voidfraction\");\n        volScalarField U2 = U_&U_;// *voidfraction_*voidfraction_;\n        if (useRho_)\n            gradP_ = fvc::grad(0.5*U2);\n        else\n            gradP_ = fvc::grad(0.5*forceSubM(0).rhoField()*U2);\n    }*/\n    vector gradP;\n    scalar Vs;\n    scalar rho;\n    vector position;\n    vector force;\n    label cellI;\n    scalar rs(0);\n    const scalar  fourPiByThree(4./3.*M_PI);\n\n    #include \"resetGradPInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        force=vector(0,0,0);\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if (cellI > -1) // particle Found\n        {\n            position = particleCloud_.cfdemCloud::position(index);\n            rs = particleCloud_.radius(index);\n\n            if(forceSubM(0).interpolation()) // use intepolated values for alpha (normally off!!!)\n            {\n                gradP = gradPInterpolator_().interpolate(position,cellI);\n            }else\n            {\n                gradP = gradP_[cellI];\n            }\n\n            Vs = particleCloud_.cfdemCloud::particleVolume(index);\n            //Vs = rs*rs*rs*fourPiByThree; //change Vs calc to this after TH is clean!\n            rho = forceSubM(0).rhoField()[cellI];\n\n            // calc particle's pressure gradient force\n            if (useRho_)\n                force = -Vs*gradP*rho*(1.0+addedMassCoeff_);\n            else\n                force = -Vs*gradP*(1.0+addedMassCoeff_);\n\n            if(forceSubM(0).verbose() && index >=0 && index <2)\n            {\n                Info << \"index = \" << index << endl;\n                Info << \"gradP = \" << gradP << endl;\n                Info << \"force = \" << force << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, force);           //first entry must the be the force\n                sValues.setSize(sValues.size()+1, Vs);\n                sValues.setSize(sValues.size()+1, rho);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,force,vector::zero);\n    }\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/gradPForce/gradPForce.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    -grad(p)*Vp * rho  ... if p is normalized with pressure\n    -grad(p)*Vp        ... if p is real pressure\n    pressure gradient force\n    including interpolation of the velocity to the exact position\n\nClass\n    gradPForce\n\nSourceFiles\n    gradPForce.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef gradPForce_H\n#define gradPForce_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class gradPForce Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass gradPForce\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word pFieldName_;\n\n    const volScalarField& p_;\n\n    word velocityFieldName_;\n\n    const volVectorField& U_;\n\n    bool useRho_;\n\n    bool useU_;          // if false: substitution p=0.5*rho*U^2\n\n    mutable double addedMassCoeff_; //added mass coefficient\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"gradPForce\");\n\n\n    // Constructors\n\n        //- Construct from components\n        gradPForce\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~gradPForce();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/noDrag/noDrag.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noDrag.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noDrag, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    noDrag,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoDrag::noDrag\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    noDEMForce_(propsDict_.lookupOrDefault<Switch>(\"noDEMForce\",false)),\n    keepCFDForce_(propsDict_.lookupOrDefault<Switch>(\"keepCFDForce\",false))\n{\n    Info << \"noDragTestMe: \" << noDEMForce_ << \" \" << keepCFDForce_ << endl;\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n\n    //set default switches (hard-coded default = false)\n    //forceSubM(0).setSwitches(XXX,true);\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n}\n\nvoid noDrag::MSinit()\n{\n    // NOTE: all MS related operations need to be performed during init of MS cloud\n    if (particleCloud_.shapeTypeName() == \"multisphere\" && !particleBased_)\n    {\n        Info << type() << \": activating multisphere mode...\" << endl;\n        forceSubM(0).setSwitches(11,true); // this is a MS model\n\n        // re-setup required communication for MS\n        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).setupCommunication();\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoDrag::~noDrag()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid noDrag::setForce() const\n{\n    if (forceSubM(0).verbose())\n        Info << \"noDrag::setForce:\"\n             << \"  noDEMForce=\" << noDEMForce_\n             << \"  , keepCFDForce=\" << keepCFDForce_\n             << endl;\n\n    label cellI=0;\n    int idDragExp=0;\n    int idKsl=0;\n    int idUf=0;\n    if (forceSubM(0).ms())\n    {\n        idDragExp=particleCloud_.idDragExpCM();\n        idKsl=particleCloud_.idKslCM();\n        idUf=particleCloud_.idUfCM();\n    }\n    else\n    {\n        idDragExp=particleCloud_.idDragExp();\n        idKsl=particleCloud_.idKsl();\n        idUf=particleCloud_.idUf();\n    }\n\n\n    for (int index = 0;index < particleCloud_.numberOfObjects(particleBased_); index++)\n    {\n        cellI = particleCloud_.cellIDs(particleBased_)[index][0];\n        if (cellI > -1) // particle Found\n        {\n            //==========================\n            // set force on particle (proposed new code)\n            // write particle based data to global array\n            //forceSubM(0).partToArray(index,drag,dragExplicit);\n            //==========================\n            // set force on particle (old code)\n            if (!keepCFDForce_)\n            {\n                for (int j=0;j<3;j++)\n                {\n                    expForces()[index][j] = 0.;\n                    impForces()[index][j] = 0.;\n                }\n            }\n            if (noDEMForce_)\n            {\n                for (int j=0;j<3;j++)\n                    particleCloud_.fieldsToDEM[idDragExp][index][j] = 0.;\n\n                if (particleCloud_.impDEMdrag())\n                {\n                    particleCloud_.fieldsToDEM[idKsl][index][0] = 0.;\n                    for (int j=0;j<3;j++)\n                        particleCloud_.fieldsToDEM[idUf][index][j] = 0.;\n                }\n            }\n            //==========================\n        }\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/noDrag/noDrag.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noDrag\n\nSourceFiles\n    noDrag.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noDrag_H\n#define noDrag_H\n\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noDrag\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    Switch noDEMForce_;\n\n    Switch keepCFDForce_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"noDrag\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noDrag\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noDrag();\n\n\n    // Member Functions\n        void setForce() const;\n\n        void MSinit();\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/particleCellVolume/particleCellVolume.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"particleCellVolume.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n#include <mpi.h>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(particleCellVolume, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    particleCellVolume,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nparticleCellVolume::particleCellVolume\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    mesh_(particleCloud_.mesh()),\n    startTime_(propsDict_.lookupOrDefault<scalar>(\"startTime\",0.)),\n    scalarFieldName_(\"voidfraction\"),\n    scalarField_\n    (   \n        IOobject\n        (\n            \"particleCellVolume\",\n            mesh_.time().timeName(),\n            mesh_,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh_,\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 0)\n    ),\n    scalarField2_\n    (   \n        IOobject\n        (\n            \"cellVolume\",\n            mesh_.time().timeName(),\n            mesh_,\n            IOobject::NO_READ,\n            IOobject::AUTO_WRITE\n        ),\n        mesh_,\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 0)\n    ),\n    upperThreshold_(propsDict_.lookupOrDefault<scalar>(\"upperThreshold\",1.01)),\n    lowerThreshold_(propsDict_.lookupOrDefault<scalar>(\"lowerThreshold\",-0.01)),\n    path_(\"postProcessing/particleCellVolume\"),\n    sPtr_(NULL),\n    writeToFile_(propsDict_.lookupOrDefault<Switch>(\"writeToFile\",false))\n{\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n\n    // read those switches defined above, if provided in dict\n    forceSubM(0).readSwitches();\n\n    particleCloud_.checkCG(true);\n\n    // create the path and generate output file\n    if(writeToFile_)\n    {\n        path_=particleCloud_.IOM().createTimeDir(path_);\n\t    sPtr_ = new OFstream(path_/\"particleCellVolume.txt\");\n        *sPtr_ << \"# time | total particle volume in cells | total volume of cells with particles | average volume fraction | min(voidfraction) | max(voidfraction)\" << endl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nparticleCellVolume::~particleCellVolume()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid particleCellVolume::setForce() const\n{\n    if(mesh_.time().value() >= startTime_)\n    {\n        if(forceSubM(0).verbose()) Info << \"particleCellVolume.C - setForce()\" << endl;\n\n        scalarField_ == dimensionedScalar(\"zero\", scalarField_.dimensions(), 0.);\n\n        // get reference to actual field\n        const volScalarField& field = mesh_.lookupObject<volScalarField>(scalarFieldName_);\n\n        scalar fieldValue=-1;\n        scalar cellVol=-1;\n        scalar minFieldVal=1e18;\n        scalar maxFieldVal=-1e18;\n\n        forAll(field,cellI)\n        {\n            fieldValue = field[cellI];\n            if(fieldValue < upperThreshold_ && fieldValue > lowerThreshold_)\n            {\n                cellVol = mesh_.V()[cellI];\n                scalarField_[cellI] = (1-fieldValue) * cellVol;\n                scalarField2_[cellI] = cellVol;\n                minFieldVal=min(minFieldVal,fieldValue);\n                maxFieldVal=max(maxFieldVal,fieldValue);\n            }\n            else\n            {\n                scalarField_[cellI] = 0.;\n                scalarField2_[cellI] = 0.;\n            }\n        }\n        scalarField_ == dimensionedScalar(\"zero\", scalarField_.dimensions(), gSum(scalarField_));\n        scalarField2_ == dimensionedScalar(\"zero\", scalarField_.dimensions(), gSum(scalarField2_));\n        reduce(minFieldVal, minOp<scalar>());\n        reduce(maxFieldVal, maxOp<scalar>());\n\n        if(forceSubM(0).verbose())\n        {\n           Info << \"calculated integral particle volume \"\n                << \" = \" << scalarField_[0]\n                << \",\\n considering cells where the field < \" << upperThreshold_\n                << \", and > \" << lowerThreshold_\n                << \",\\n the total volume of cells holding particles = \" << scalarField2_[0]\n                << \",\\n this results in an average volume fraction of:\" << scalarField_[0]/(scalarField2_[0]+SMALL)\n                << \",\\n the min occurring \" << scalarFieldName_ << \" is:\" << minFieldVal\n                << \",\\n the max occurring \" << scalarFieldName_ << \" is:\" << maxFieldVal\n                << endl;\n        }\n\n        // write to file\n        if(writeToFile_)\n        {\n            *sPtr_<< mesh_.time().value() << \" \" ;\n            *sPtr_<< scalarField_[0] << \" \" ;\n            *sPtr_<< scalarField2_[0] << \" \" ;\n            *sPtr_<< scalarField_[0]/(scalarField2_[0]+SMALL) << \" \" ;\n            *sPtr_<< minFieldVal << \" \" ;\n            *sPtr_<< maxFieldVal << endl;\n        }\n    }// end if time >= startTime_\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/particleCellVolume/particleCellVolume.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    calc volume of the particles from the voidfraction field\nClass\n    particleCellVolume\n\nSourceFiles\n    particleCellVolume.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef particleCellVolume_H\n#define particleCellVolume_H\n\n#include \"forceModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class particleCellVolume Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass particleCellVolume\n:\n    public forceModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    const fvMesh& mesh_;\n\n    mutable scalar startTime_;\n\n    const word scalarFieldName_;\n\n    mutable volScalarField scalarField_;\n\n    mutable volScalarField scalarField2_;\n\n    mutable scalar upperThreshold_;\n\n    mutable scalar lowerThreshold_;\n\n    mutable fileName path_;\n\n    mutable OFstream* sPtr_;\n\n    Switch writeToFile_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"particleCellVolume\");\n\n\n    // Constructors\n\n        //- Construct from components\n        particleCellVolume\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~particleCellVolume();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/particleVolume/particleVolume.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"particleVolume.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n#include <mpi.h>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(particleVolume, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    particleVolume,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nparticleVolume::particleVolume\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    startTime_(propsDict_.lookupOrDefault<scalar>(\"startTime\",0.)),\n    path_(\"postProcessing/particleVolume\"),\n    sPtr_(NULL),\n    writeToFile_(propsDict_.lookupOrDefault<Switch>(\"writeToFile\",false))\n{\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n\n    // read those switches defined above, if provided in dict\n    forceSubM(0).readSwitches();\n\n    particleCloud_.checkCG(true);\n\n    // create the path and generate output file\n    if(writeToFile_)\n    {\n        path_=particleCloud_.IOM().createTimeDir(path_);\n\t    sPtr_ = new OFstream(path_/\"particleVolume.txt\");\n        //*sPtr_ << \"time | total particle volume\" << nl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nparticleVolume::~particleVolume()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid particleVolume::setForce() const\n{\n    if(particleCloud_.mesh().time().value() >= startTime_)\n    {\n\n        if(forceSubM(0).verbose()) Info << \"particleVolume.C - setForce()\" << endl;\n\n        scalar rs(0);\n        scalar VsTot(0);\n        const scalar fpth=(4./3.*M_PI);//4.188790204786390525;//4./3.*pi;\n        \n        for(int index = 0;index <  particleCloud_.numberOfParticles(); ++index)\n        {\n            if(particleCloud_.cfdemCloud::cellIDs()[index][0] >= 0)\n            {\n                rs = particleCloud_.radius(index);\n                forceSubM(0).scaleDia(rs,index); //caution: this fct will scale ds!\n                VsTot += rs*rs*rs*fpth;\n            }\n        }\n\n        reduce(VsTot, sumOp<scalar>());\n        if(forceSubM(0).verbose()) Info << \"Total particle volume (located in domain) = \" << VsTot << endl;\n\n        // write to file\n        if(writeToFile_)\n        {\n            *sPtr_<< particleCloud_.mesh().time().value() << \" \" ;\n            *sPtr_<< VsTot << endl;\n        }\n    }// end if time >= startTime_\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/particleVolume/particleVolume.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    calc volume of the particles from the voidfraction field\nClass\n    particleVolume\n\nSourceFiles\n    particleVolume.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef particleVolume_H\n#define particleVolume_H\n\n#include \"forceModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class particleVolume Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass particleVolume\n:\n    public forceModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    scalar startTime_;\n\n    mutable fileName path_;\n\n    mutable OFstream* sPtr_;\n\n    Switch writeToFile_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"particleVolume\");\n\n\n    // Constructors\n\n        //- Construct from components\n        particleVolume\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~particleVolume();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/scalarGeneralExchange/scalarGeneralExchange.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"scalarGeneralExchange.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n#define ALARGECONCENTRATION 1e32\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(scalarGeneralExchange, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    scalarGeneralExchange,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nscalarGeneralExchange::scalarGeneralExchange\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    scalarTransportProperties_                  //this is clumsy, but effective\n    (\n        IOobject\n        (\n            \"scalarTransportProperties\",\n            sm.mesh().time().constant(),\n            sm.mesh(),\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    ),\n    generalPropsDict_(scalarTransportProperties_.subDict(\"generalManualProps\")),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),             //common names/data\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    tempFieldName_(propsDict_.lookup(\"tempFieldName\")),                             //temperature names/data\n    partTempName_(propsDict_.lookup(\"partTempName\")),\n    partHeatFluxName_(propsDict_.lookupOrDefault<word>(      \"partHeatFluxName\", \"none\")),\n    partHeatTransCoeffName_(propsDict_.lookupOrDefault<word>(\"partHeatTransCoeffName\", \"none\")),\n    partHeatFluidName_(propsDict_.lookupOrDefault<word>(     \"partHeatFluidName\", \"none\")),\n    partDat_(NULL),\n    partDatFlux_(NULL),\n    partDatTransCoeff_(NULL),\n    partDatFluid_(NULL),\n    partDatTmpExpl_(NULL),\n    partDatTmpImpl_(NULL),\n    validPartFlux_(false),\n    validPartTransCoeff_(false),\n    validPartFluid_(false),\n    haveTemperatureEqn_(false),\n    useLiMason_(false),\n    useGeneralCorrelation_(false),\n    generalCorrelationParameters_(propsDict_.lookupOrDefault<scalarList>(\"generalCorrelationParameters\",scalarList(0))),\n    lambda_(readScalar(propsDict_.lookup(\"lambda\"))),\n    Prandtl_(readScalar(propsDict_.lookup(\"Prandtl\"))),\n    eulerianFieldNames_( generalPropsDict_.lookup(\"eulerianFields\")),\n    partDatPositionInRegister_(eulerianFieldNames_.size(),-1),\n    partSpeciesNames_(propsDict_.lookup(\"partSpeciesNames\")),\n    partSpeciesFluxNames_(propsDict_.lookup(\"partSpeciesFluxNames\")),\n    partSpeciesTransCoeffNames_(propsDict_.lookup(\"partSpeciesTransCoeffNames\")),\n    partSpeciesFluidNames_(propsDict_.lookup(\"partSpeciesFluidNames\")),\n    DMolecular_(propsDict_.lookup(\"DMolecular\")),\n    maxSource_(1e30),\n    scaleDia_(1.)\n{\n    setForceSubModels(propsDict_);\n    particleBased_ = true;  // this model is always particle based\n    setupModel();\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n      forAll(eulerianFieldNames_, fieldIt)\n      {\n        particleCloud_.probeM().initialize(typeName, typeName + \"_\" + eulerianFieldNames_[fieldIt] + \".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");               //first entry must the be the vector to probe\n        if(eulerianFieldNames_[fieldIt]==tempFieldName_) //this is the temperature\n        {\n            particleCloud_.probeM().scalarFields_.append(\"Rep\");\n            particleCloud_.probeM().scalarFields_.append(\"Nu\");\n        }\n        else\n            particleCloud_.probeM().scalarFields_.append(\"Sh\");\n        particleCloud_.probeM().scalarFields_.append(\"exchangeRate\");\n        particleCloud_.probeM().writeHeader();\n      }\n    }\n\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).constructorCalls(typeName);\n\n    particleCloud_.setAllowCFDsubTimestep(false);\n}\n\n// ***********************************************************\n// Construct from components for scalarGeneralExchangePhaseChange\nscalarGeneralExchange::scalarGeneralExchange\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word        dictName\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(dictName + \"Props\")),\n    scalarTransportProperties_                  //this is clumsy, but effective\n    (\n        IOobject\n        (\n            \"scalarTransportProperties\",\n            sm.mesh().time().constant(),\n            sm.mesh(),\n            IOobject::MUST_READ,\n            IOobject::NO_WRITE\n        )\n    ),\n    generalPropsDict_(scalarTransportProperties_.subDict(\"generalManualProps\")),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),             //common names/data\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    tempFieldName_(propsDict_.lookup(\"tempFieldName\")),                             //temperature names/data\n    partTempName_(propsDict_.lookup(\"partTempName\")),\n    partHeatFluxName_(propsDict_.lookupOrDefault<word>(      \"partHeatFluxName\", \"none\")),\n    partHeatTransCoeffName_(propsDict_.lookupOrDefault<word>(\"partHeatTransCoeffName\", \"none\")),\n    partHeatFluidName_(propsDict_.lookupOrDefault<word>(     \"partHeatFluidName\", \"none\")),\n    partDat_(NULL),\n    partDatFlux_(NULL),\n    partDatTransCoeff_(NULL),\n    partDatFluid_(NULL),\n    partDatTmpExpl_(NULL),\n    partDatTmpImpl_(NULL),\n    validPartFlux_(false),\n    validPartTransCoeff_(false),\n    validPartFluid_(false),\n    haveTemperatureEqn_(false),\n    useLiMason_(false),\n    useGeneralCorrelation_(false),\n    lambda_(readScalar(propsDict_.lookup(\"lambda\"))),\n    Prandtl_(readScalar(propsDict_.lookup(\"Prandtl\"))),\n    eulerianFieldNames_( generalPropsDict_.lookup(\"eulerianFields\")),\n    partDatPositionInRegister_(eulerianFieldNames_.size(),-1),\n    partSpeciesNames_(propsDict_.lookup(\"partSpeciesNames\")),\n    partSpeciesFluxNames_(propsDict_.lookup(\"partSpeciesFluxNames\")),\n    partSpeciesTransCoeffNames_(propsDict_.lookup(\"partSpeciesTransCoeffNames\")),\n    partSpeciesFluidNames_(propsDict_.lookup(\"partSpeciesFluidNames\")),\n    DMolecular_(propsDict_.lookup(\"DMolecular\")),\n    partHeatFluxPositionInRegister_(-1),\n    partHeatTransCoeffPositionInRegister_(-1),\n    partHeatFluidPositionInRegister_(-1),\n    maxSource_(1e30),\n    scaleDia_(1.)\n{\n    setForceSubModels(propsDict_);\n    particleBased_ = true;  // this model is always particle based\n    setupModel();\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n      forAll(eulerianFieldNames_, fieldIt)\n      {\n        particleCloud_.probeM().initialize(dictName, dictName + \"_\" + eulerianFieldNames_[fieldIt] + \".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");               //first entry must the be the vector to probe\n        if(eulerianFieldNames_[fieldIt]==tempFieldName_) //this is the temperature\n        {\n            particleCloud_.probeM().scalarFields_.append(\"Rep\");\n            particleCloud_.probeM().scalarFields_.append(\"Nu\");                 //other are debug\n        }\n        else\n            particleCloud_.probeM().scalarFields_.append(\"Sh\");\n        particleCloud_.probeM().scalarFields_.append(\"exchangeRate\");\n        particleCloud_.probeM().writeHeader();\n      }\n    }\n\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).constructorCalls(dictName);\n\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nscalarGeneralExchange::~scalarGeneralExchange()\n{\n    particleCloud_.dataExchangeM().destroy(partDat_,1);\n    particleCloud_.dataExchangeM().destroy(partDatTmpExpl_,1);\n    particleCloud_.dataExchangeM().destroy(partDatTmpImpl_,1);\n\n    //external particle data (e.g., fluxes, transCoeff, or fluid data) will be destroyed in cloud,\n}\n\n// * * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\nvoid scalarGeneralExchange::allocateMyArrays(scalar initVal) const\n{\n    //Only allocate temporary Lagrangian arrays, correct length will be provided by ExternalCode\n    if(particleCloud_.numberOfParticlesChanged())\n    {\n        particleCloud_.dataExchangeM().allocateArray(partDat_,initVal,1);\n        particleCloud_.dataExchangeM().allocateArray(partDatTmpExpl_,initVal,1);\n        particleCloud_.dataExchangeM().allocateArray(partDatTmpImpl_,initVal,1);\n    }\n    //external particle data (e.g., fluxes, transCoeff, or fluid data) will be allocated in cloud,\n    //just need to set pointers before access\n\n}\n// * * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\n\nvoid scalarGeneralExchange::setForce() const\n{\n    forAll(eulerianFieldNames_,fieldI)\n    {\n        // build reference\n        volScalarField& explicitEulerSource(particleCloud_.mesh().lookupObjectRef<volScalarField> (eulerianFieldNames_[fieldI]+\"Source\"));\n        volScalarField& implicitEulerSource(particleCloud_.mesh().lookupObjectRef<volScalarField> (eulerianFieldNames_[fieldI]+\"SourceKImpl\"));\n\n        // reset Scalar field (== means hard reset)\n        explicitEulerSource == dimensionedScalar(\"zero\", explicitEulerSource.dimensions(), 0.);\n        implicitEulerSource == dimensionedScalar(\"zero\", implicitEulerSource.dimensions(), 0.);\n\n        if(eulerianFieldNames_[fieldI]!=\"T\" && particleSpeciesValue_[fieldI]<0.0)    //skip if species is not active\n            return;\n\n        //Set the names of the exchange fields\n        word    fieldName;\n        scalar  transportParameter;\n\n        if(eulerianFieldNames_[fieldI]==\"T\") //this is the temperature\n        {\n            fieldName          = tempFieldName_;\n            transportParameter = lambda_;\n\n            setPointersToExternalArrays( partHeatFluxName_,       partHeatFluxPositionInRegister_,\n                                         partHeatTransCoeffName_, partHeatTransCoeffPositionInRegister_,\n                                         partHeatFluidName_,      partHeatFluidPositionInRegister_\n                                       );\n            if(probeIt_)\n                particleCloud_.probeM().setOutputFile(typeName+\"_\"+tempFieldName_+\".logDat\");\n        }\n        else\n        {\n            fieldName          = eulerianFieldNames_[fieldI];\n            transportParameter = DMolecular_[fieldI];\n\n            setPointersToExternalArrays( partSpeciesFluxNames_[fieldI],       partSpeciesFluxPositionInRegister_[fieldI],\n                                         partSpeciesTransCoeffNames_[fieldI], partSpeciesTransCoeffPositionInRegister_[fieldI],\n                                         partSpeciesFluidNames_[fieldI],      partSpeciesFluidPositionInRegister_[fieldI]\n                                       );\n            if(probeIt_)\n                particleCloud_.probeM().setOutputFile(typeName + \"_\" + fieldName + \".logDat\");\n        }\n\n\n        //==============================\n        // get references\n        const volScalarField& voidfraction_(particleCloud_.mesh().lookupObject<volScalarField> (voidfractionFieldName_));    // ref to voidfraction field\n        const volVectorField& U_(particleCloud_.mesh().lookupObject<volVectorField> (velFieldName_));\n        const volScalarField& fluidScalarField_(particleCloud_.mesh().lookupObject<volScalarField> (fieldName));            // ref to scalar field\n        const volScalarField& nufField = forceSubM(0).nuField();\n        //==============================\n\n        if (particleCloud_.shapeTypeName() == \"multisphere\")\n        {\n            if (scaleDia_ > 1)\n                Info << typeName << \" using scale = \" << scaleDia_ << endl;\n            else if (particleCloud_.cg() > 1)\n            {\n                scaleDia_=particleCloud_.cg();\n                Info << typeName << \" using scale from liggghts cg = \" << scaleDia_ << endl;\n            }\n        }\n\n        // realloc the arrays and get data\n        allocateMyArrays(0.0);\n\n        // calc La based heat flux\n        vector position(0,0,0);\n        scalar voidfraction(1);\n        vector Ufluid(0,0,0);\n        scalar fluidValue(0);\n        label  cellI=0;\n        vector Us(0,0,0);\n        vector Ur(0,0,0);\n        scalar dscaled(0);\n        scalar dparcel(0);\n        scalar numberParticlesInParcel(1);\n        scalar nuf(0);\n        scalar magUr(0);\n        scalar As(0);\n        scalar Rep(0);\n        scalar Pr(0);\n        scalar sDth(scaleDia_*scaleDia_*scaleDia_);\n\n        #include \"resetVoidfractionInterpolator.H\"\n        #include \"resetUInterpolator.H\"\n        #include \"resetFluidScalarFieldInterpolator.H\"\n\n        for (int index = 0;index < particleCloud_.numberOfParticles(); ++index)\n        {\n                cellI = particleCloud_.cfdemCloud::cellIDs(particleBased_)[index][0];\n                if (cellI >= 0)\n                {\n                    if (forceSubM(0).interpolation())\n                    {\n                        position = particleCloud_.cfdemCloud::position(index, particleBased_);\n                        voidfraction = voidfractionInterpolator_().interpolate(position,cellI);\n                        Ufluid = UInterpolator_().interpolate(position,cellI);\n                        fluidValue = fluidScalarFieldInterpolator_().interpolate(position,cellI);\n                    }\n                    else\n                    {\n                        voidfraction = voidfraction_[cellI];\n                        Ufluid       = U_[cellI];\n                        fluidValue   = fluidScalarField_[cellI];\n                    }\n\n                    if (particleCloud_.shapeTypeName() != \"multisphere\")\n                    {\n                        dscaled = 2*particleCloud_.radius(index);\n                        dparcel = dscaled;\n\n                        // correct voidfraction\n                        vector dummy(0,0,0);\n                        for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n                            forceSubM(iFSub).calculateCorrectedVoidage(\n                                // do not rescale Ufluid, dummy variable required for call\n                                voidfraction, dummy, U_.mesh().V()[cellI], dscaled );\n                    }\n\n                    // calc relative velocity\n                    Us      = particleCloud_.cfdemCloud::velocity(index, particleBased_);\n                    Ur      = Ufluid-Us;\n                    magUr   = mag(Ur);\n\n                    if (particleCloud_.shapeTypeName() != \"multisphere\")\n                    {\n                        forceSubM(0).scaleDia(dscaled,index); //caution: this fct will scale ds!\n                        numberParticlesInParcel    = dparcel/dscaled;\n                        numberParticlesInParcel   *= numberParticlesInParcel*numberParticlesInParcel;\n                        As      = dscaled*dscaled*M_PI*numberParticlesInParcel;\n                    }\n                    else\n                    {\n                        dscaled = 2*particleCloud_.radius(index)/scaleDia_;\n                        As      = dscaled*dscaled*M_PI*sDth;\n                    }\n\n                    nuf     = nufField[cellI];\n                    Rep     = dscaled*magUr*voidfraction/nuf; //MUST use superficial velocity here!\n                    if(eulerianFieldNames_[fieldI]==\"T\") //have temperature\n                        Pr      = Prandtl_;\n                    else\n                        Pr      = max(SMALL,nuf/transportParameter); //This is Sc for species\n\n                    scalar alpha = transportParameter*(this->*Nusselt)(Rep,Pr,voidfraction)/dscaled;\n\n                    // calc convective heat flux [W]\n                    scalar areaTimesTransferCoefficient = alpha * As;\n                    scalar partValue;\n                    if(eulerianFieldNames_[fieldI]==\"T\") partValue=particleCloud_.fieldsToDEM[partDatPositionInRegister_[fieldI]][index][0];\n                    else partValue=particleCloud_.fieldsToDEM[partDatPositionInRegister_[fieldI]][index][0];\n                    scalar tmpPartFlux     =  areaTimesTransferCoefficient\n                                           * (fluidValue - partValue);\n\n                    // split implicit/explicit contribution\n                    forceSubM(0).explicitCorrScalar( partDatTmpImpl_[index][0],\n                                                     partDatTmpExpl_[index][0],\n                                                     areaTimesTransferCoefficient,\n                                                     fluidValue,\n                                                     fluidScalarField_[cellI],\n                                                     partValue,\n                                                     forceSubM(0).verbose()\n                                                   );\n                    if(validPartFlux_)\n                        partDatFlux_[index][0]+= tmpPartFlux; //MUST ADD total source for ALL particles in parcel\n\n                    if(validPartTransCoeff_)\n                        partDatTransCoeff_[index][0]+= alpha; //MUST ADD total source coefficient here\n\n                    if(validPartFluid_)\n                        partDatFluid_[index][0]      = fluidValue; //MUST NOT add here, since this is factor\n\n\n                    if( forceSubM(0).verbose())\n                    {\n                        Pout << \"fieldName = \" << fieldName << endl;\n                        Pout << \"index    = \" <<index << endl;\n                        Pout << \"partFlux = \" << tmpPartFlux << endl;\n                        Pout << \"magUr = \" << magUr << endl;\n                        Pout << \"As = \" << As << endl;\n                        Pout << \"r = \" << particleCloud_.radius(index) << endl;\n                        Pout << \"dscaled = \" << dscaled << endl;\n                        Pout << \"nuf = \" << nuf << endl;\n                        Pout << \"Rep = \" << Rep << endl;\n                        Pout << \"Pr/Sc = \" << Pr << endl;\n                        Pout << \"Nup/Shp = \" << (this->*Nusselt)(Rep,Pr,voidfraction) << endl;\n                        Pout << \"voidfraction = \" << voidfraction << endl;\n                        Pout << \"fluidValue = \" << fluidValue << endl  ;\n                        Pout << \"partValue = \" << partValue << endl;\n                        if(validPartFlux_)\n                            Pout << \"partDatFlux: \"       <<  partDatFlux_[index][0] << endl;\n                        if(validPartTransCoeff_)\n                            Pout << \"partDatTransCoeff: \" <<  partDatTransCoeff_[index][0] << endl;\n                    }\n\n                    //Set value fields and write the probe\n                    if(probeIt_)\n                    {\n                        #include \"setupProbeModelfields.H\"\n                        // Note: for other than ext one could use vValues.append(x)\n                        // instead of setSize\n                        vValues.setSize(vValues.size()+1, Ur);\n                        if(eulerianFieldNames_[fieldI]==\"T\") //this is the temperature, then also report Rep\n                            sValues.setSize(sValues.size()+1, Rep);\n                        sValues.setSize(sValues.size()+1, (this->*Nusselt)(Rep,Pr,voidfraction));\n                        sValues.setSize(sValues.size()+1, tmpPartFlux);\n                        particleCloud_.probeM().writeProbe(index, sValues, vValues);\n                    }\n                }\n        }\n\n        //Handle explicit and implicit source terms on the Euler side\n        //these are simple summations!\n        particleCloud_.averagingM().setScalarSum\n        (\n            explicitEulerSource,\n            partDatTmpExpl_,\n            particleCloud_.particleWeights(),\n            NULL\n        );\n\n        particleCloud_.averagingM().setScalarSum\n        (\n            implicitEulerSource,\n            partDatTmpImpl_,\n            particleCloud_.particleWeights(),\n            NULL\n        );\n\n        // scale with the cell volume to get (total) volume-specific source\n        particleCloud_.makeSpecific(explicitEulerSource);\n        explicitEulerSource*=-1;\n        particleCloud_.makeSpecific(implicitEulerSource);\n        implicitEulerSource*=-1;\n\n        // limit explicit source term\n        scalar explicitEulerSourceInCell;\n        forAll(explicitEulerSource,cellI)\n        {\n            explicitEulerSourceInCell = explicitEulerSource[cellI];\n\n            if(mag(explicitEulerSourceInCell) > maxSource_ )\n            {\n                 explicitEulerSource[cellI] = sign(explicitEulerSourceInCell) * maxSource_;\n            }\n        }\n\n\n        //Reporting of integral quantities\n        //TODO: write to different file for fieldI>0\n        Field<scalar> writeValues; bool writeDiskNow=forceSubM(0).verboseToDisk(); //must call 'verboseToDisk()' only once since this function is incremeting a counter!\n        writeValues.clear();\n        if( forceSubM(0).verbose() || writeDiskNow)\n        {\n            scalar exchangeRate = gSum(-(explicitEulerSource\n                                        +implicitEulerSource*fluidScalarField_)\n                                        *explicitEulerSource.mesh().V()\n                                      );\n            // Note: for other than ext one could use writeValues.append(x)\n            // instead of setSize\n            writeValues.setSize(writeValues.size()+1, exchangeRate);\n\n            if(forceSubM(0).verbose())\n            {\n              if(eulerianFieldNames_[fieldI]==\"T\") //have temperature\n                Info << \"total convective particle-fluid heat flux [W] (Eulerian) = \"\n                    << exchangeRate\n                    << endl;\n              else\n                Info << \"fieldI: \" << fieldI\n                     << \": total convective particle-fluid species flux [kmol/s] (or [kg/s]) (Eulerian) = \"\n                     << exchangeRate\n                     << endl;\n            }\n        }\n        if( writeDiskNow )\n          for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n            forceSubM(iFSub).verboseToDiskWrite(writeValues);\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\ndouble scalarGeneralExchange::NusseltLiMason(double Rep, double Pr, double voidfraction) const\n{\n    double h1(0);\n    double h2(0);\n    double Nup(0);\n    if (Rep < 200.0)\n    {\n         Nup = 2.0\n             + 0.6\n             * voidfraction*voidfraction*voidfraction*sqrt(voidfraction) //voidfraction^3.5\n             * sqrt(Rep)\n             * pow(Pr,0.33333333333); //This is Sh for species\n    }\n    else if (Rep < 1500.0)\n    {\n          h1  = voidfraction*voidfraction*voidfraction*sqrt(voidfraction); //voidfraction^3.5\n          h2  = pow(Pr,0.3333333333);\n          Nup = 2.0\n              + 0.5 *h1*sqrt(Rep)*h2\n              + 0.02*h1*pow(Rep,0.8)*h2;\n    }\n    else\n    {\n          Nup = 2.0\n              + 0.000045\n              * voidfraction*voidfraction*voidfraction*sqrt(voidfraction) //voidfraction^3.5\n              * pow(Rep,1.8);\n    }\n\n    return Nup;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\ndouble scalarGeneralExchange::NusseltDeenEtAl(double Rep, double Pr, double voidfraction) const\n{\n    //WARNING: This function is fitted for Reynolds numbers between 0 and 100!!!\n    double Nup(0);\n    double PrPowOneThird  = pow(Pr,0.3333333333) ;\n    Nup =\n       ( 7.0 - 10.0 * voidfraction + 5 * voidfraction * voidfraction )\n     *\n       (1.0 +\n        0.17\n       * pow(Rep,0.2)\n       * PrPowOneThird\n       )\n     +\n     ( 1.33 - 2.31 * voidfraction + 1.16 * voidfraction * voidfraction )\n     * pow(Rep,0.7)\n     * PrPowOneThird ;\n\n    return Nup;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\ndouble scalarGeneralExchange::NusseltGeneralCorrelation(double Rep, double Pr, double voidfraction) const\n{\n    //WARNING: This function my be fitted to data for a limited range of Reynolds number!!\n    double Nup(0);\n    double PrPowOneThird  = pow(Pr,0.3333333333) ;\n    Nup =\n       (  generalCorrelationParameters_[0]\n        + generalCorrelationParameters_[1] * voidfraction\n        + generalCorrelationParameters_[2] * voidfraction * voidfraction )\n     *\n       (  generalCorrelationParameters_[3]\n        + generalCorrelationParameters_[4]\n       * pow(Rep,0.2)\n       * PrPowOneThird\n       )\n     +\n     (  generalCorrelationParameters_[5]\n      + generalCorrelationParameters_[6] * voidfraction\n      + generalCorrelationParameters_[7] * voidfraction * voidfraction )\n     * pow(Rep,0.7)\n     * PrPowOneThird ;\n\n    return Nup;\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid scalarGeneralExchange::setupModel() const\n{\n    //just allocate arrays for internal use\n    allocateMyArrays(0.0);\n\n    //analyze dict to decide on allocation of external arrays\n    //FLUXES (explicit coupling strategy)\n    if(partHeatFluxName_!=\"none\")\n    {\n        validPartFlux_=true;\n        particleCloud_.registerFieldsToDEM(partHeatFluxName_,\"scalar-atom\", partHeatFluxPositionInRegister_);\n    }\n    bool validspeciesFlux =\n        particleCloud_.checkAndRegisterFieldsToDEM(partSpeciesFluxNames_,\"scalar-atom\",partSpeciesFluxPositionInRegister_);\n\n    if( (validPartFlux_ && !validspeciesFlux && partSpeciesFluxNames_.size()>0) || (!validPartFlux_ && validspeciesFlux ))\n        FatalError <<  \"scalarGeneralExchange::setupModel: you have set a valid species flux name, but a non-valid heatflux name (or vice versa). This will mess up memory allocation. Please use both valid or non-valid flux names\" << abort(FatalError);\n\n    //TRANSCOEFF and FLUID (implicit coupling strategy)\n    if(partHeatTransCoeffName_!=\"none\")    {\n        validPartTransCoeff_=true;\n        Info << \"Found a valid partHeatTransCoeffName: \" << partHeatTransCoeffName_ << endl;\n        particleCloud_.registerFieldsToDEM(partHeatTransCoeffName_,\"scalar-atom\", partHeatTransCoeffPositionInRegister_);\n    }\n    if(partHeatFluidName_!=\"none\")    {\n        validPartFluid_=true;\n        Info << \"Found a valid partHeatFluidName: \" << partHeatFluidName_ << endl;\n        particleCloud_.registerFieldsToDEM(partHeatFluidName_,\"scalar-atom\", partHeatFluidPositionInRegister_);\n    }\n    if( validPartTransCoeff_ && !validPartFluid_ )\n        FatalError <<\"Transfer coefficient set, but and fluid name missing. Check your entries in the couplingProperties! \\n\"\n                   << abort(FatalError);\n    if( !validPartTransCoeff_ && validPartFluid_ )\n        FatalError <<\"Fluid name set, but transfer coefficient missing. Check your entries in the couplingProperties! \\n\"\n                   << abort(FatalError);\n\n    bool validspeciesTransCoeff =\n        particleCloud_.checkAndRegisterFieldsToDEM(partSpeciesTransCoeffNames_,\"scalar-atom\",partSpeciesTransCoeffPositionInRegister_);\n    bool validspeciesFluid =\n        particleCloud_.checkAndRegisterFieldsToDEM(partSpeciesFluidNames_,\"scalar-atom\",partSpeciesFluidPositionInRegister_);\n\n    if( (validPartTransCoeff_ && !validspeciesTransCoeff && partSpeciesTransCoeffNames_.size()>0 ) || (!validPartTransCoeff_ && validspeciesTransCoeff ))\n        FatalError <<  \"scalarGeneralExchange::setupModel: you have set a valid species transCoeff name, but a non-valid heat trans coeff name (or vice versa). This will mess up memory allocation. Please use both valid or non-valid transCoeff names. You might want to use 'none' in partSpeciesTransCoeffNames to de-activate the species transCoeff name!\" << abort(FatalError);\n\n    if( (validPartFluid_ && !validspeciesFluid && partSpeciesFluidNames_.size()>0) || (!validPartFluid_ && validspeciesFluid ))\n        FatalError <<  \"scalarGeneralExchange::setupModel: you have set a valid species fluid name, but a non-valid heat fluid name (or vice versa). This will mess up memory allocation. Please use both valid or non-valid fluid names. You might want to use 'none' in partSpeciesFluidNames to de-activate the species fluid name!\" << abort(FatalError);\n\n\n    //FINALY check and Info\n    if(validPartFlux_ && validspeciesFlux)    {\n        Info << \"Found a valid partHeatFluxName and partSpeciesFluxName: \" << partHeatFluxName_ << endl;\n        Info << \"scalarGeneralExchange (or derived model) will now proceed with EXPLICIT flux coupling \" << endl;\n    }\n    else if(validPartTransCoeff_ && validPartFluid_)\n    {\n        Info << \"Found a valid partHeatTransCoeffName and partHeatFluidfName (& corresponding species names).\" << endl;\n        Info << \"scalarGeneralExchange (or derived model) will now proceed with IMPLICIT flux coupling \" << endl;\n    }\n    else if(validPartFlux_ )    {\n        Info << \"Found a valid partHeatFluxName: \" << partHeatFluxName_ << endl;\n        Info << \"scalarGeneralExchange (or derived model) will now proceed with EXPLICIT flux coupling for heat. \" << endl;\n    }\n    else\n        FatalError <<  \"scalarGeneralExchange::setupModel: you did not specify a valid flux or transCoeff name set. Please either specify valid flux names, or valid transCoeff and fluid names.\" << abort(FatalError);\n\n\n    //Make internal settings\n    if (propsDict_.found(\"maxSource\"))\n    {\n        maxSource_=readScalar(propsDict_.lookup (\"maxSource\"));\n        Info << \"limiting eulerian source field to: \" << maxSource_ << endl;\n    }\n\n    if (propsDict_.found(\"useLiMason\"))\n    {\n        useLiMason_=readBool(propsDict_.lookup (\"useLiMason\"));\n        Info << \"setting for useLiMason: \" << useLiMason_ << endl;\n    }\n    if (propsDict_.found(\"useGeneralCorrelation\"))\n    {\n        useGeneralCorrelation_=readBool(propsDict_.lookup (\"useGeneralCorrelation\"));\n        Info << \"setting for useGeneralCorrelation: \" << useGeneralCorrelation_ << endl;\n    }\n\n    if(useLiMason_ && useGeneralCorrelation_)\n        FatalError <<\"You cannot set 'useLiMason' AND 'useGeneralCorrelation' to true. Just set one seeting to true.  \\n\"\n                   << abort(FatalError);\n\n    if(useLiMason_)\n        Nusselt=&scalarGeneralExchange::NusseltLiMason;\n    else if(useGeneralCorrelation_)\n    {\n        //generalCorrelationParameters_ = propsDict_.lookup(\"generalCorrelationParameters\");\n        if(generalCorrelationParameters_.size()<8 || generalCorrelationParameters_.size()>8)\n            FatalError <<\"The data array specified as 'generalCorrelationParameters' is too short or too long. Must specify exactly 8 values. You specified: \\n\"\n                       << generalCorrelationParameters_ << endl\n                       << abort(FatalError);\n        Nusselt=&scalarGeneralExchange::NusseltGeneralCorrelation;\n    }\n    else\n        Nusselt=&scalarGeneralExchange::NusseltDeenEtAl;\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n    forceSubM(0).setSwitchesList(9,true); // activate verboseToDisk switch\n\n    if (particleCloud_.shapeTypeName() != \"multisphere\")\n        forceSubM(0).setSwitchesList(10,true); // activate correctedVoidage switch\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    particleCloud_.checkCG(true);\n\n    if (particleCloud_.shapeTypeName() == \"multisphere\")\n    {\n        if (propsDict_.found(\"scale\"))\n            scaleDia_=scalar(readScalar(propsDict_.lookup(\"scale\")));\n    }\n\n    //check species names\n    Info << \"scalarGeneralExchange found the following eulerianFieldName: \" << eulerianFieldNames_ << endl;\n    int numTempEqn=0;\n    for(int iEul=0;iEul<eulerianFieldNames_.size(); iEul++)\n        if(eulerianFieldNames_[iEul]==tempFieldName_)\n        {\n            haveTemperatureEqn_ = true;\n            numTempEqn = 1;\n            Info << \"scalarGeneralExchange identified the eulerianField '\" << tempFieldName_\n                 << \"' as being the temperature field\" << endl;\n        }\n\n    //check if enough particle properties have been provided\n    if(partSpeciesNames_.size()!=(eulerianFieldNames_.size()-numTempEqn))\n        FatalError <<\"Not enough partSpeciesNames specified in the couplingProperties file. \\n\"\n                   << abort(FatalError);\n    else\n        Info << \"Found valid partSpeciesNames: \" << partSpeciesNames_ << endl;\n    if(partSpeciesFluxNames_.size()!=(eulerianFieldNames_.size()-numTempEqn))\n        FatalError <<\"Not enough partSpeciesFluxNames specified in the couplingProperties file. \\n\"\n                   << abort(FatalError);\n    else\n        Info << \"Found valid partSpeciesFluxNames: \" << partSpeciesFluxNames_ << endl;\n    if(partSpeciesTransCoeffNames_.size()!=(eulerianFieldNames_.size()-numTempEqn))\n        FatalError <<\"Not enough partSpeciesTransCoeffNames specified in the couplingProperties file. \\n\"\n                   << abort(FatalError);\n    else\n        Info << \"Found valid partSpeciesTransCoeffNames: \" << partSpeciesTransCoeffNames_ << endl;\n    if(partSpeciesFluidNames_.size()!=(eulerianFieldNames_.size()-numTempEqn))\n        FatalError <<\"Not enough partSpeciesFluidNames specified in the couplingProperties file. \\n\"\n                   << abort(FatalError);\n    else\n        Info << \"Found valid partSpeciesFluidNames: \" << partSpeciesFluidNames_ << endl;\n    if(DMolecular_.size()!=(eulerianFieldNames_.size()-numTempEqn))\n        FatalError <<\"Not enough DMolecular specified in the couplingProperties file. \\n\"\n                   << abort(FatalError);\n\n    particleSpeciesValue_=scalarList(eulerianFieldNames_.size(),-1.);\n    for(int iPart=0;iPart<partSpeciesNames_.size(); iPart++)\n    {\n        if(partSpeciesNames_[iPart]==\"none\")\n            particleSpeciesValue_[iPart]=-1; //will not consider this species for coupling\n        else if(partSpeciesNames_[iPart]==\"zero\")\n            particleSpeciesValue_[iPart]=0.0;//will set this species to zero for coupling\n        else\n            particleSpeciesValue_[iPart]=2*ALARGECONCENTRATION;//set to a very large value to request pull\n    }\n\n    // get DEM field ref\n    forAll(eulerianFieldNames_,fieldI)\n    {\n        if(eulerianFieldNames_[fieldI]==\"T\")\n            particleCloud_.registerFieldsToDEM(partTempName_,\"scalar-atom\", partDatPositionInRegister_[fieldI],true);\n        else if (particleSpeciesValue_[fieldI]>ALARGECONCENTRATION)\n            particleCloud_.registerFieldsToDEM(partSpeciesNames_[fieldI],\"scalar-atom\", partDatPositionInRegister_[fieldI],true);\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid scalarGeneralExchange::setPointersToExternalArrays(    word nameFlux,          int positionFlux,\n                                                            word nameTransCoeff,    int positionTransCoeff,\n                                                            word nameFluid,         int positionFluid\n                                                       ) const\n{\n    if(particleCloud_.fieldsToDEM.size() !=\n               particleCloud_.namesfieldsToDEM.size()\n      )\n      FatalError <<  \"\\n\\n****CATASTROPHIC ERROR MOST LIKELY CAUSED BY USER!!! \\n\"\n                 <<  \"particleCloud_.fieldsToDEM.size() is NOT EQUAL to particleCloud_.namesfieldsToDEM.size().\"\n                 <<  \"This may be caused by an incorrect time step, or coupling interval, resulting in the fact that an array inside particleCloud_ was not allocated. \"\n                 <<  \"Please check your time step and coupling interval settings, such that fluid-particle coupling is done EVERY fluid time step. \\n\\n\"\n                 << abort(FatalError);\n\n    if(validPartFlux_)  //EXPLICIT coupling strategy for Lagrangian part\n    {\n            partDatFlux_           = particleCloud_.fieldsToDEM[positionFlux];\n            if( forceSubM(0).verbose() )    {\n                Info <<\"scalarParticleFilter will push particle fluxes to '\" << nameFlux\n                     << \"' (register:\" << positionFlux <<  \"). \\n\" << endl;\n            }\n    }\n\n    if(validPartTransCoeff_) //IMPLICIT coupling strategy for Lagrangian part\n    {\n            partDatTransCoeff_     = particleCloud_.fieldsToDEM[positionTransCoeff];\n            partDatFluid_          = particleCloud_.fieldsToDEM[positionFluid];\n            if( forceSubM(0).verbose() )    {\n                Info <<\"scalarParticleFilter will push transfer coefficients to '\" << nameTransCoeff\n                     << \"' (register:\" << positionTransCoeff <<  \"). \\n\" << endl;\n                Info <<\"scalarParticleFilter will push fluid values to '\" << nameFluid\n                     << \"' (register:\" << positionFluid <<  \"). \\n\" << endl;\n            }\n    }\n\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/scalarGeneralExchange/scalarGeneralExchange.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Two way general scalar exchange between DEM and CFD\n    convective heat and species transfer model. The standard model is that of\n    Deen, N.G. et al., Review of direct numerical simulation of \n    fluid–particle mass, momentum and heat transfer in dense gas–solid flows.\n    Chemical Engineering Science 116 (2014) 710–724\n    This correlation is based on that of Gunn (1978).\n\n    Alternatively, the correclation of\n    Li and Mason (2000), A computational investigation of transient heat\n    transfer in  pneumatic transport of granular particles, Pow.Tech 112\n    can be activated. However, this correlation is not suitable for \n    dense granular flows.\n\n    This model allows an implicit/explicit split of the coupling term.\n    The implicit/explicit splitting is realized in a force sub-model\n\n    WARNING:\n    This model REQUIRES the 'generalManual' speciesTransportModel\n\nClass\n    scalarGeneralExchange\n\nSourceFiles\n    scalarGeneralExchange.C\n\nContributing author and copyright holder of this model/file\n    Copyright, 2015     Stefan Radl, TU Graz (radl@tugraz.at)\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef scalarGeneralExchange_H\n#define scalarGeneralExchange_H\n\n#include \"forceModel.H\"\n#include \"averagingModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class scalarGeneralExchange Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass scalarGeneralExchange\n:\n    public forceModel\n{\nprotected:\n\n    mutable dictionary  propsDict_;\n\n    const IOdictionary  scalarTransportProperties_;\n\n    dictionary          generalPropsDict_;\n\n    word                voidfractionFieldName_;\n\n    word                velFieldName_;\n\n    word                tempFieldName_;               \n    word                partTempName_;\n    word                partHeatFluxName_;\n    word                partHeatTransCoeffName_;\n    word                partHeatFluidName_;\n\n    mutable double      **partDat_;                   // Lagrangian array ExtCode-->CFDEM\n\n    mutable double      **partDatFlux_;               // Lagrangian array CFDEM-->ExtCode (explicit contribution)\n    mutable double      **partDatTransCoeff_;         // Lagrangian array CFDEM-->ExtCode (implicit contribution)\n    mutable double      **partDatFluid_;              // Lagrangian array CFDEM-->ExtCode (implicit contribution)\n\n    mutable double       **partTemp_;\n\n    mutable double      **partDatTmpExpl_;            // Lagrangian array - for explicit source to fluid eqns\n    mutable double      **partDatTmpImpl_;            // Lagrangian array - for implicit source to fluid eqns\n\n    mutable double      **partDatSaturation_;                   // Lagrangian array\n    mutable double      **partCoolingFlux_;\n    \n    mutable bool        validPartFlux_;               //indicator if found, based on heat, but also used for species \n                                                      //also indicates EXplicit Coupling\n    mutable bool        validPartTransCoeff_;         //indicator if found, based on heat, but also used for species\n                                                      //also indicates IMplicit Coupling\n    mutable bool        validPartFluid_;              //indicator if found, based on heat, but also used for species\n\n    mutable bool        haveTemperatureEqn_;          //indicator for temperature field or not\n\n    mutable bool        useLiMason_;                  //switch to activate calculation using Li-Mason\n    mutable bool        useGeneralCorrelation_;       //switch to activate calculation using a generalized correlation\n    mutable scalarList  generalCorrelationParameters_; //parameter for general correlation\n\n    scalar              lambda_;                      // fluid thermal conductivity [W/(m*K)]\n    scalar              Prandtl_;                     // Prandtl number\n\n    //Species Word Lists\n    mutable wordList    eulerianFieldNames_;           //List with Eulerian fields to exchange (handed over)\n\n    mutable scalarList  particleSpeciesValue_;         //list with scalar to indicate particle property is available\n    const wordList      partSpeciesNames_;\n    const wordList      partSpeciesFluxNames_;\n    const wordList      partSpeciesTransCoeffNames_;\n    const wordList      partSpeciesFluidNames_;\n\n    scalarList          DMolecular_; \n\n    //information related to external register\n    mutable labelList           partDatPositionInRegister_;\n    mutable int                 partHeatFluxPositionInRegister_;\n    mutable std::vector<int>    partSpeciesFluxPositionInRegister_;\n    mutable int                 partHeatTransCoeffPositionInRegister_;\n    mutable std::vector<int>    partSpeciesTransCoeffPositionInRegister_;\n    mutable int                 partHeatFluidPositionInRegister_;\n    mutable std::vector<int>    partSpeciesFluidPositionInRegister_;\n\n    //Scalar properties\n    mutable scalar      maxSource_;                   // max (limited) value of src field\n\n    mutable scalar      scaleDia_;\n\n    void allocateMyArrays(scalar initialValue) const;\n    void setupModel() const;\n    void setPointersToExternalArrays(   word nameFlux,          int positionFlux,\n                                        word nameTransCoeff,    int positionTransCoeff,\n                                        word nameFluid,         int positionFluid\n                                    ) const;\n\n    mutable double (scalarGeneralExchange::*Nusselt)(double Re, double Pr, double voidfraction) const;\n    double NusseltLiMason(double Re, double Pr, double voidfraction) const;\n    double NusseltDeenEtAl(double Re, double Pr, double voidfraction)  const;\n    double NusseltGeneralCorrelation(double Re, double Pr, double voidfraction)  const;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"scalarGeneralExchange\");\n\n    // Constructors\n\n        //- Construct from components\n        scalarGeneralExchange\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n        //- Construct from components\n        scalarGeneralExchange\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word        dictName\n        );\n\n    // Destructor\n\n        ~scalarGeneralExchange();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/virtualMassForce/virtualMassForce.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"virtualMassForce.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n#define NOTONCPU 9999\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(virtualMassForce, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    virtualMassForce,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nvirtualMassForce::virtualMassForce\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    phiFieldName_(propsDict_.lookup(\"phiFieldName\")),\n    phi_(sm.mesh().lookupObject<surfaceScalarField> (phiFieldName_)),\n    UrelOldName_(propsDict_.lookupOrDefault<word>(\"UrelOldName\",\"UrelOld\")),\n    UrelOldFieldToDEMid_(-1),\n    splitUrelCalculation_(false),\n    Cadd_(0.5)\n{\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"virtualMassForce\"); //first entry must the be the force\n        particleCloud_.probeM().vectorFields_.append(\"Urel\");\n        particleCloud_.probeM().vectorFields_.append(\"UrelOld\");\n        particleCloud_.probeM().vectorFields_.append(\"ddtUrel\");\n        particleCloud_.probeM().scalarFields_.append(\"Vs\");\n        particleCloud_.probeM().scalarFields_.append(\"rho\");\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(1,true); // activate treatForceDEM switch (DEM side only treatment)\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(0,true);  // will treat forces explicitly on CFD side - IMPORTANT!\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    //Extra switches/settings\n    if(propsDict_.found(\"splitUrelCalculation\"))\n    {\n        splitUrelCalculation_ = readBool(propsDict_.lookup(\"splitUrelCalculation\")); \n        if(splitUrelCalculation_)\n            Info << \"Virtual mass model: will split the Urel calculation\\n\";\n            Info << \"WARNING: be sure that LIGGGHTS integration takes ddtv_p implicitly into account! \\n\";\n    }\n    if(propsDict_.found(\"Cadd\"))\n    {\n        Cadd_ = readScalar(propsDict_.lookup(\"Cadd\")); \n        Info << \"Virtual mass model: using non-standard Cadd = \" << Cadd_ << endl;\n    }\n\n    if(!splitUrelCalculation_)\n        FatalError << \"Virtual mass model: you have set 'splitUrelCalculation' to false, but this is not implemented. use true!\" << abort(FatalError);\n\n    // register data to be communicated\n    if(!splitUrelCalculation_) particleCloud_.registerFieldsToDEM(UrelOldName_,\"vector-atom\",UrelOldFieldToDEMid_,true);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nvirtualMassForce::~virtualMassForce()\n{\n}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid virtualMassForce::setForce() const\n{\n    scalar dt = U_.mesh().time().deltaT().value();\n\n    vector position(0,0,0);\n    vector Ufluid(0,0,0);\n    vector Ur(0,0,0);\n    vector DDtU(0,0,0);\n    vector UrelOld(0,0,0);\n    vector ddtUrel(0,0,0);\n\n    //Compute extra vfields in case it is needed\n    volVectorField DDtU_(0.0*U_/U_.mesh().time().deltaT());\n    if(splitUrelCalculation_)\n        DDtU_ = fvc::ddt(U_) + fvc::div(phi_, U_); //Total Derivative of fluid velocity\n\n    #include \"resetUInterpolator.H\"\n    #include \"resetDDtUInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    bool haveUrelOld_(false); \n    const scalar  fourPiByThree(4./3.*M_PI);\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        vector virtualMassForce(0,0,0);\n        label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if (cellI > -1) // particle Found\n        {\n\n            if(forceSubM(0).interpolation()) \n            {\n                position     = particleCloud_.cfdemCloud::position(index);\n                Ufluid       = UInterpolator_().interpolate(position,cellI);\n            }\n            else\n            {\n                Ufluid = U_[cellI];\n            }\n       \n\n            if(splitUrelCalculation_)  //if split, just use total derivative of fluid velocity\n            {\n                if(forceSubM(0).interpolation()) \n                {\n                    DDtU = DDtUInterpolator_().interpolate(position,cellI);\n                }\n                else\n                {\n                    DDtU = DDtU_[cellI];\n                }\n            }\n            else\n            {\n                vector Us = particleCloud_.cfdemCloud::velocity(index);\n                Ur = Ufluid - Us;\n            }\n\n            if(splitUrelCalculation_) //we can always compute the total derivative in case we split\n                ddtUrel = DDtU;\n            else\n            {            \n                //Check of particle was on this CPU the last step\n                if(particleCloud_.fieldsToDEM[UrelOldFieldToDEMid_][index][0]==NOTONCPU) //use 1. element to indicate that particle was on this CPU the last time step\n                {\n                    haveUrelOld_ = false;\n                    ddtUrel = vector(0,0,0);\n                }\n                else\n                    haveUrelOld_ = true;\n\n                for(int j=0;j<3;j++)\n                {\n                    UrelOld[j]         = particleCloud_.fieldsToDEM[UrelOldFieldToDEMid_][index][j];\n                    particleCloud_.fieldsToDEM[UrelOldFieldToDEMid_][index][j] = Ur[j];\n                }\n                if(haveUrelOld_ ) //only compute force if we have old (relative) velocity\n                    ddtUrel = (Ur-UrelOld)/dt;\n            }\n            scalar rs = particleCloud_.radius(index);\n            scalar Vs = rs*rs*rs*fourPiByThree;\n            scalar rho = forceSubM(0).rhoField()[cellI];\n\n            virtualMassForce = Cadd_ * rho * Vs * ddtUrel;\n\n            if( forceSubM(0).verbose() ) //&& index>100 && index < 105)\n            {\n                Pout << \"index / cellI = \" << index << tab << cellI << endl;\n                Pout << \"position = \" << particleCloud_.cfdemCloud::position(index) << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, virtualMassForce);           //first entry must the be the force\n                vValues.setSize(vValues.size()+1, Ur);\n                vValues.setSize(vValues.size()+1, UrelOld); \n                vValues.setSize(vValues.size()+1, ddtUrel);\n                sValues.setSize(sValues.size()+1, Vs);\n                sValues.setSize(sValues.size()+1, rho);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,virtualMassForce,vector::zero);\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/virtualMassForce/virtualMassForce.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    virtualMassForce\n\nSourceFiles\n    virtualMassForce.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef virtualMassForce_H\n#define virtualMassForce_H\n\n#include \"forceModel.H\"\n#include \"dataExchangeModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class virtualMassForce Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass virtualMassForce\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    const volVectorField& U_;\n\n    word phiFieldName_;\n\n    const surfaceScalarField& phi_;\n\n    word UrelOldName_;\n\n    mutable label UrelOldFieldToDEMid_;\n\n    mutable bool splitUrelCalculation_;    //indicator to split calculation of Urel between CFDEM and LIGGGHTS\n                                           //requires the integration fix to take dv/dt into account!\n\n    mutable double Cadd_;                  //indicator to split calculation of Urel between CFDEM and LIGGGHTS\n                                           //requires the integration fix to take dv/dt into account!\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"virtualMassForce\");\n\n\n    // Constructors\n\n        //- Construct from components\n        virtualMassForce\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~virtualMassForce();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"viscForce.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(viscForce, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    viscForce,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nviscForce::viscForce\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velocityFieldName_(propsDict_.lookupOrDefault<word>(\"velocityFieldName\",\"U\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velocityFieldName_)),\n    addedMassCoeff_(0.0)\n{\n    // block viscForceModel for type B\n    if (modelType_ == \"B\") FatalError <<\"using  model viscForce with model type B is not valid\\n\" << abort(FatalError);\n\n    // suppress particle probe\n    if (probeIt_ && propsDict_.found(\"suppressProbe\"))\n        probeIt_=!Switch(propsDict_.lookup(\"suppressProbe\"));\n    if(probeIt_)\n    {\n        particleCloud_.probeM().initialize(typeName, typeName+\".logDat\");\n        particleCloud_.probeM().vectorFields_.append(\"viscForce\"); //first entry must the be the force\n        particleCloud_.probeM().scalarFields_.append(\"Vs\");\n        particleCloud_.probeM().writeHeader();\n    }\n\n    particleCloud_.checkCG(true);\n\n    // init force sub model\n    setForceSubModels(propsDict_);\n\n    // define switches which can be read from dict\n    forceSubM(0).setSwitchesList(0,true); // activate treatExplicit switch\n    forceSubM(0).setSwitchesList(3,true); // activate search for verbose switch\n    forceSubM(0).setSwitchesList(4,true); // activate search for interpolate switch\n    forceSubM(0).setSwitchesList(8,true); // activate scalarViscosity switch\n\n    //set default switches (hard-coded default = false)\n    forceSubM(0).setSwitches(0,true);       // make treatForceExplicit=true the default (is desired, otherwise this force would be implicit in slip vel!)\n    if (modelType_ == \"Bfull\")              // type Bfull\n        forceSubM(0).setSwitches(1,false);  // treatForceDEM = false\n    else                                    // type A\n        forceSubM(0).setSwitches(1,true);   // treatForceDEM = true\n\n    // read those switches defined above, if provided in dict\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).readSwitches();\n\n    // setup required communication\n    for (int iFSub=0;iFSub<nrForceSubModels();iFSub++)\n        forceSubM(iFSub).setupCommunication();\n\n    if (propsDict_.found(\"useAddedMass\")) \n    {\n        addedMassCoeff_ =  readScalar(propsDict_.lookup(\"useAddedMass\"));\n        Info << \"viscForce will also include added mass with coefficient: \" << addedMassCoeff_ << endl;\n        Info << \"WARNING: use fix nve/sphere/addedMass in LIGGGHTS input script to correctly account for added mass effects!\" << endl;\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nviscForce::~viscForce()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid viscForce::setForce() const\n{\n    const volVectorField& divTau_ = forceSubM(0).divTauField(U_);\n\n    vector divTau;\n    scalar Vs;\n    vector position;\n    vector force;\n    label cellI;\n    scalar rs(0);\n    const scalar  fourPiByThree(4./3.*M_PI);\n\n    #include \"resetDivTauInterpolator.H\"\n    #include \"setupProbeModel.H\"\n\n    for(int index = 0;index <  particleCloud_.numberOfParticles(); index++)\n    {\n        force=vector(0,0,0);\n        cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if (cellI > -1) // particle Found\n        {\n            rs = particleCloud_.radius(index);\n            position = particleCloud_.cfdemCloud::position(index);\n\n            if(forceSubM(0).interpolation()) // use intepolated values for alpha (normally off!!!)\n            {\n                divTau = divTauInterpolator_().interpolate(position,cellI);\n            }else\n            {\n                divTau = divTau_[cellI];\n            }\n\n            Vs = particleCloud_.cfdemCloud::particleVolume(index);\n            //Vs = rs*rs*rs*fourPiByThree;  //change Vs calc to this after TH is clean!\n\n            // calc the contribution of the deviatoric stress \n            // to the generalized buoyancy force\n            force = -Vs*divTau*(1.0+addedMassCoeff_);\n\n            if(forceSubM(0).verbose() && index >0 && index <2)\n            {\n                Info << \"index = \" << index << endl;\n                Info << \"gradP = \" << divTau << endl;\n                Info << \"force = \" << force << endl;\n            }\n\n            //Set value fields and write the probe\n            if(probeIt_)\n            {\n                #include \"setupProbeModelfields.H\"\n                // Note: for other than ext one could use vValues.append(x)\n                // instead of setSize\n                vValues.setSize(vValues.size()+1, force);           //first entry must the be the force\n                sValues.setSize(sValues.size()+1, Vs);\n                particleCloud_.probeM().writeProbe(index, sValues, vValues);\n            }\n        }\n\n        // write particle based data to global array\n        forceSubM(0).partToArray(index,force,vector::zero);\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/viscForce/viscForce.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    -div(tau)*Vp\nClass\n    viscForce\n\nSourceFiles\n    viscForce.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef viscForce_H\n#define viscForce_H\n\n#include \"forceModel.H\"\n#include \"interpolationCellPoint.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class viscForce Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass viscForce\n:\n    public forceModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word velocityFieldName_;\n\n    const volVectorField& U_;\n\n    mutable double addedMassCoeff_; //added mass coefficient\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"viscForce\");\n\n\n    // Constructors\n\n        //- Construct from components\n        viscForce\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~viscForce();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/volWeightedAverage/volWeightedAverage.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"volWeightedAverage.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"dataExchangeModel.H\"\n#include <mpi.h>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(volWeightedAverage, 0);\n\naddToRunTimeSelectionTable\n(\n    forceModel,\n    volWeightedAverage,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nvolWeightedAverage::volWeightedAverage\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    forceModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    mesh_(particleCloud_.mesh()),\n    startTime_(propsDict_.lookupOrDefault<scalar>(\"startTime\",0.)),\n    scalarFieldNames_(propsDict_.lookup(\"scalarFieldNames\")),\n    vectorFieldNames_(propsDict_.lookup(\"vectorFieldNames\")),\n    volumeFractionName_(propsDict_.lookupOrDefault<word>(\"volumeFractionName\",\"voidfraction\")),\n    volumeFraction_(particleCloud_.mesh().lookupObject<volScalarField>(volumeFractionName_)),\n    upperThreshold_(readScalar(propsDict_.lookup(\"upperThreshold\"))),\n    lowerThreshold_(readScalar(propsDict_.lookup(\"lowerThreshold\"))),\n    useVolumeFraction_(propsDict_.lookupOrDefault<Switch>(\"useVolumeFraction\",false)),\n    verbose_(propsDict_.lookupOrDefault<Switch>(\"verbose\",false)),\n    path_(\"postProcessing/volWeightedAverage\"),\n    sPtr_(NULL),\n    writeToFile_(propsDict_.lookupOrDefault<Switch>(\"writeToFile\",false))\n{\n    // create vol weighted average scalar fields\n    scalarFields_.setSize(scalarFieldNames_.size());\n\n    for (int i=0;i < scalarFieldNames_.size(); i++)\n    {\n        word fieldName = \"volAverage_\" + scalarFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        scalarFields_.set\n        (\n            i,\n            new volScalarField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::NO_READ,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedScalar(\"0\", mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]).dimensions(), 0)\n            )\n        );\n    }\n\n    // create vol weighted average vector fields\n    vectorFields_.setSize(vectorFieldNames_.size());\n\n    for (int i=0;i < vectorFieldNames_.size(); i++)\n    {\n        word fieldName = \"volAverage_\" + vectorFieldNames_[i];\n\n        Info<< \"Creating field \" << fieldName << endl;\n        vectorFields_.set\n        (\n            i,\n            new volVectorField\n            (\n                IOobject\n                (\n                    fieldName,\n                    mesh_.time().timeName(),\n                    mesh_,\n                    IOobject::NO_READ,\n                    IOobject::AUTO_WRITE\n                ),\n                mesh_,\n                dimensionedVector(\"0\", mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]).dimensions(), vector::zero)\n            )\n        );\n    }\n\n    // create the path and generate output file\n    if(writeToFile_)\n    {\n        path_=particleCloud_.IOM().createTimeDir(path_);\n\t    sPtr_ = new OFstream(path_/\"volWeightedAverage.txt\");\n        //*sPtr_ << \"time | vol av. scalar field i | ... | vol av. vector field i\" << nl;\n    }\n\n    particleCloud_.checkCG(true);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nvolWeightedAverage::~volWeightedAverage()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid volWeightedAverage::setForce() const\n{\n    if(mesh_.time().value() >= startTime_)\n    {\n        if(verbose_) Info << \"volWeightedAverage.C - setForce()\" << endl;\n\n        // write to file\n        if(writeToFile_) *sPtr_<< mesh_.time().value() << \" \" ;\n\n        for (int i=0;i < scalarFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volScalarField& field = mesh_.lookupObject<volScalarField>(scalarFieldNames_[i]);\n\n            scalar fieldValue=-1.;\n            scalar volWeightedAverage=-1.;\n            scalar cellVol=-1.;\n            scalar totVol=0.;\n            scalar totVol_all=0.;\n            scalar integralValue=0.;\n            scalar volumeFraction(1.);\n\n            forAll(field,cellI)\n            {\n                fieldValue = field[cellI];\n                if(fieldValue < upperThreshold_ && fieldValue > lowerThreshold_)\n                {\n                    cellVol = mesh_.V()[cellI];\n                    if(useVolumeFraction_)\n                        volumeFraction = volumeFraction_[cellI];\n                    scalarFields_[i][cellI] = fieldValue * cellVol * volumeFraction;\n                    totVol += cellVol;\n                }\n                else\n                {\n                    scalarFields_[i][cellI] = 0.;\n                }\n            }\n\n            MPI_Allreduce(&totVol, &totVol_all, 3, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\n            integralValue = gSum(scalarFields_[i]);\n            volWeightedAverage = integralValue / (totVol_all+SMALL);\n            scalarFields_[i] == dimensionedScalar(\"value\", scalarFields_[i].dimensions(), volWeightedAverage);\n\n            if(verbose_)\n            {\n                Info << \"calculated vol. weighted average of field: \" << scalarFieldNames_[i]\n                     << \" = \" << volWeightedAverage\n                     << \",\\n integral value \"\n                     << \" = \" << integralValue\n                     << \",\\n volume accounted for \"\n                     << \" = \" << totVol_all\n                     << \",\\n considering cells where the field < \" << upperThreshold_\n                     << \", and > \" << lowerThreshold_ << endl;\n            }\n\n            // write to file\n            if(writeToFile_) *sPtr_<< volWeightedAverage << \" \" ;\n        }\n\n        for (int i=0;i < vectorFieldNames_.size(); i++)\n        {\n            // get reference to actual field\n            const volVectorField& field = mesh_.lookupObject<volVectorField>(vectorFieldNames_[i]);\n\n            vector fieldValue(-1.,-1.,-1.);\n            vector volWeightedAverage(-1.,-1.,-1.);\n            scalar magvolWeightedAverage=-1.;\n            scalar cellVol=-1.;\n            scalar totVol=0.;\n            scalar totVol_all=0.;\n            scalar volumeFraction(1.);\n\n            forAll(field,cellI)\n            {\n                fieldValue = field[cellI];\n                magvolWeightedAverage = mag(fieldValue);\n                if(magvolWeightedAverage < upperThreshold_ && magvolWeightedAverage > lowerThreshold_)\n                {\n                    cellVol = mesh_.V()[cellI];\n                    if(useVolumeFraction_)\n                        volumeFraction = volumeFraction_[cellI];\n                    vectorFields_[i][cellI] = fieldValue * cellVol * volumeFraction;\n                    totVol += cellVol;\n                }\n                else\n                {\n                    vectorFields_[i][cellI] = vector::zero;\n                }\n            }\n\n            MPI_Allreduce(&totVol, &totVol_all, 3, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);\n            volWeightedAverage = gSum(vectorFields_[i]) / (totVol_all+SMALL);\n            vectorFields_[i] == volWeightedAverage;\n\n            if(verbose_)\n            {\n                Info << \"calculated vol. weighted average of field: \" << vectorFieldNames_[i]\n                     << \" = \" << volWeightedAverage\n                     << \",\\n considering cells where the mag(field) < \" << upperThreshold_\n                     << \", and > \" << lowerThreshold_ << endl;\n            }\n\n            // write to file\n            if(writeToFile_) *sPtr_<< volWeightedAverage << \" \";\n        }\n\n        // write to file\n        if(writeToFile_) *sPtr_<< endl;\n\n    }// end if time >= startTime_\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/forceModel/volWeightedAverage/volWeightedAverage.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    calc time average of scalar or vector field\nClass\n    volWeightedAverage\n\nSourceFiles\n    volWeightedAverage.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef volWeightedAverage_H\n#define volWeightedAverage_H\n\n#include \"forceModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class volWeightedAverage Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass volWeightedAverage\n:\n    public forceModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    const fvMesh& mesh_;\n\n    scalar startTime_;\n\n    const wordList scalarFieldNames_;\n\n    const wordList vectorFieldNames_;\n\n    const word volumeFractionName_;\n\n    mutable PtrList<volScalarField> scalarFields_;\n\n    mutable PtrList<volVectorField> vectorFields_;\n\n    const volScalarField& volumeFraction_;\n\n    mutable scalar upperThreshold_;\n\n    mutable scalar lowerThreshold_;\n\n    Switch useVolumeFraction_;\n\n    Switch verbose_;\n\n    mutable fileName path_;\n\n    mutable OFstream* sPtr_;\n\n    Switch writeToFile_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"volWeightedAverage\");\n\n\n    // Constructors\n\n        //- Construct from components\n        volWeightedAverage\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~volWeightedAverage();\n\n\n    // Member Functions\n        void setForce() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/execute/execute.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"execute.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(execute, 0);\n\naddToRunTimeSelectionTable\n(\n    liggghtsCommandModel,\n    execute,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nexecute::execute\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    liggghtsCommandModel(dict,sm,i),\n    nrModel_(i),\n    myName_(\"notYetGiven\"),\n    propsDict_(dict),\n    commandList_(0),\n    command_(\"\"),\n    scalarList_(0),\n    labelList_(0)\n{\n    // define dictionary\n    char h[80];\n    sprintf(h,\"%d\",nrModel_);\n    myName_=word(typeName + \"Props\" + h);\n    propsDict_=dictionary(dict.subDict(myName_));\n\n    // read command from dict\n    commandList_ = wordList(propsDict_.lookup(\"command\"));\n\n    // read list of scalars\n    if(propsDict_.found(\"scalars\")) scalarList_ = scalarList(propsDict_.lookup(\"scalars\"));\n\n    // read list of labels\n    if(propsDict_.found(\"labels\")) labelList_ = labelList(propsDict_.lookup(\"labels\"));\n\n    // check if verbose\n    if (propsDict_.found(\"verbose\")) verbose_=true;\n\n    parseCommandList(commandList_, labelList_, scalarList_, command_, propsDict_, timeStamp_);\n    Info << \"liggghtsCommand \" << command_ << endl;\n\n    strCommand_=string(command_);\n\n    checkTimeMode(propsDict_);\n\n    checkTimeSettings(propsDict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nexecute::~execute()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nconst char* execute::command(int commandLine)\n{\n    return strCommand_.c_str();\n}\n\nbool execute::runCommand(int couplingStep)\n{\n    if(timeStamp_) strCommand_=addTimeStamp(command_);\n    checkTimeSettings(propsDict_);\n\n    return runThisCommand(couplingStep);\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/execute/execute.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    execute a liggghts command\nClass\n    execute\n\nSourceFiles\n    execute.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef execute_H\n#define execute_H\n\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class execute Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass execute\n:\n    public liggghtsCommandModel\n{\nprivate:\n\n    int nrModel_;\n\n    word myName_;\n\n    dictionary propsDict_;\n\n    wordList commandList_;\n\n    word command_;\n\n    scalarList scalarList_;\n\n    labelList labelList_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"execute\");\n\n\n    // Constructors\n\n        //- Construct from components\n        execute\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n    // Destructor\n\n        ~execute();\n\n\n    // Member Functions\n\n    word name(){return myName_;};\n\n    const char* command(int);\n\n    bool runCommand(int);\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include <sys/stat.h>\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(liggghtsCommandModel, 0);\n\ndefineRunTimeSelectionTable(liggghtsCommandModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nliggghtsCommandModel::liggghtsCommandModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    strCommand_(\"notDefined\"),\n    nextRun_(-1),\n    lastRun_(-1),\n    runFirst_(false),\n    runLast_(false),\n    runEveryCouplingStep_(false),\n    runEveryWriteStep_(false),\n    startTime_(-1.),\n    endTime_(-1.),\n    timeInterval_(0.),\n    firstCouplingStep_(-1),\n    lastCouplingStep_(-1),\n    couplingStepInterval_(0),\n    exactTiming_(false),\n    commandLines_(1),\n    verbose_(false),\n    timeStamp_(false)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nliggghtsCommandModel::~liggghtsCommandModel()\n{}\n\n// * * * * * * * * * * * * * * * * Member Fct  * * * * * * * * * * * * * * * //\n\nvoid liggghtsCommandModel::checkTimeMode(dictionary& propsDict)\n{\n    runFirst_=Switch(propsDict.lookup(\"runFirst\"));\n\n    if(!runFirst_)\n    {\n        // check if being run only at last coupling step\n        runLast_=Switch(propsDict.lookup(\"runLast\"));\n\n        if(!runLast_)\n        {\n            // check if being run every coupling step\n            runEveryCouplingStep_=Switch(propsDict.lookup(\"runEveryCouplingStep\"));\n\n            if(!runEveryCouplingStep_)\n            {\n                runEveryWriteStep_=Switch(propsDict.lookup(\"runEveryWriteStep\"));\n            }\n        }\n    }\n    if(verbose_){\n        Info << \"runFirst = \" << runFirst_ << endl;\n        Info << \"runLast = \" << runLast_ << endl;\n        Info << \"runEveryCouplingStep = \" << runEveryCouplingStep_ << endl;\n        Info << \"runEveryWriteStep = \" << runEveryWriteStep_ << endl;\n    }\n}\n\nvoid liggghtsCommandModel::checkTimeSettings(const dictionary& propsDict)\n{\n    if(!runFirst_) //lastRun or runEveryCouplingStep or every n steps or every writeStep\n    {\n        scalar DEMts = particleCloud_.dataExchangeM().DEMts();\n        scalar couplingInterval = particleCloud_.dataExchangeM().couplingInterval();\n        scalar simStartTime = particleCloud_.mesh().time().startTime().value();\n\n        if(runLast_) // last run\n        {\n            // read time options from subdict\n            endTime_ = particleCloud_.mesh().time().endTime().value()-simStartTime;\n            startTime_ = endTime_;\n            timeInterval_ = -1;\n\n            // calculate coupling times\n            firstCouplingStep_ = floor((startTime_+SMALL)/DEMts/couplingInterval);\n            lastCouplingStep_ = floor((endTime_+SMALL)/DEMts/couplingInterval);\n            couplingStepInterval_ = -1;\n        }\n        else         //runEveryCouplingStep of every n steps or every writeStep\n        {\n            if (!runEveryCouplingStep_ && !runEveryWriteStep_) // every n steps\n            {\n                // read time options from subdict\n                startTime_ = readScalar(propsDict.lookup(\"startTime\"));\n                endTime_ = readScalar(propsDict.lookup(\"endTime\"));\n                timeInterval_ = readScalar(propsDict.lookup(\"timeInterval\"));\n\n                // calculate coupling times\n                firstCouplingStep_ = floor((startTime_+SMALL-simStartTime)/DEMts/couplingInterval);\n                lastCouplingStep_ = floor((endTime_+SMALL-simStartTime)/DEMts/couplingInterval);\n                couplingStepInterval_ = floor(timeInterval_+SMALL/DEMts/couplingInterval);\n            }\n            else      //runEveryCouplingStep  or writeStep\n            {\n                firstCouplingStep_ =1;\n                lastCouplingStep_ =1e9;\n                couplingStepInterval_ =1;\n            }\n        }\n    }\n    else // runFirst\n    {\n            firstCouplingStep_ =1;\n            lastCouplingStep_ =1;\n            couplingStepInterval_ =-1;\n    }\n\n    if(verbose_){\n        Info << \"firstCouplingStep = \" << firstCouplingStep_ << endl;\n        Info << \"lastCouplingStep = \" << lastCouplingStep_ << endl;\n        Info << \"couplingStepInterval = \" << couplingStepInterval_ << endl;\n        Info << \"nextRun = \" << nextRun_ << endl;\n    }\n}\n\nbool liggghtsCommandModel::runThisCommand(int couplingStep)\n{\n    if(verbose_) Info << \"couplingStep = \" << couplingStep << endl;\n    bool runIt=false;\n    if(\n       (!runEveryWriteStep_ && firstCouplingStep_  <= couplingStep && lastCouplingStep_  >= couplingStep)  ||\n       (runEveryWriteStep_  && particleCloud_.mesh().time().outputTime())  ||   // classic handling for !subTS\n       (runEveryWriteStep_  && particleCloud_.writeTimePassed())                // special handling for subTS (will not allow >1 commands at writeTime)\n      )\n    {\n        if(couplingStep >= nextRun_)\n        {\n            runIt=true;\n            nextRun_=couplingStep + couplingStepInterval_;\n            lastRun_=couplingStep;\n\n            if(runEveryWriteStep_  && particleCloud_.writeTimePassed()) particleCloud_.resetWriteTimePassed();\n        }\n    }\n    return runIt;\n}\n\nstring liggghtsCommandModel::addTimeStamp(word command)\n{\n    char add[100];\n    sprintf(add,\"%f\",particleCloud_.mesh().time().value());\n\n    return string(command+add);\n}\n\nDynamicList<scalar> liggghtsCommandModel::executionsWithinPeriod(scalar TSstart,scalar TSend)\n{\n    Info << \"liggghtsCommandModel::executionsWithinPeriod TSstart\" << TSstart << endl;\n    Info << \"liggghtsCommandModel::executionsWithinPeriod TSend\" << TSend << endl;\n    Info << \"startTime =\" << startTime_ << endl;\n    Info << \"endTime =\" << endTime_ << endl;\n\n    // init exec times array\n    DynamicList<scalar> executions(0);\n\n    // current TS within active period\n    if(startTime_+SMALL<TSend && endTime_>TSstart-SMALL )\n    {\n        Info << \"working time within this TS\" << endl;\n\n        // find first execution within TS (better routine with modulo)\n        int startNr = 0;\n        scalar t = startTime_ + startNr * timeInterval_;\n\n        if(timeInterval_ > SMALL)\n        {\n            while (TSend - t > SMALL)\n            {\n                t = startTime_ + startNr * timeInterval_;\n                startNr++;\n            }\n            t -= timeInterval_;\n        }\n        // check if first exec found within TS\n        if(TSstart < t + SMALL && t +SMALL < TSend)\n        {\n            // check for more executions\n            while (t < endTime_ + SMALL && TSend - t > SMALL)\n            {\n                executions.append(t);\n                t += timeInterval_;\n            }\n        }\n        //else\n        //    Info << \"liggghtsCommandModel::executionsWithinPeriod error???\" << endl;     \n\n        // debug\n        Info << \"liggghtsCommandModel::executionsWithinPeriod executions=\" << executions << endl;\n    }\n\n    // return dummy\n\n    return executions;\n}\n\nbool liggghtsCommandModel::checkPath(fileName path)\n{\n    string strPath = string(path);\n    struct stat buffer;   \n    return (stat (strPath.c_str(), &buffer) == 0); \n}\n\n\nvoid liggghtsCommandModel::parseCommandList(wordList& commandList,labelList& labelList,\n                                            scalarList& scalarList,\n                                            word& command, dictionary& propsDict, \n                                            bool& timeStamp)\n{\n    bool addBlank = true;  // std no blanks after each word\n    fileName add;\n    label numberCount=0;   // nr of scalars inserted to command\n    label labelCount=0;   // nr of labels inserted to command\n\n    forAll(commandList,i)\n    {\n        add = word(commandList[i]);\n\n        //- handle symbols\n        if (add == \"$couplingInterval\")\n        {\n            char h[50];\n            sprintf(h,\"%d\",particleCloud_.dataExchangeM().couplingInterval());\n            add = h;\n        }\n        else if (add==\"dot\")    add = \".\";\n        else if (add==\"dotdot\") add = \"..\";\n        else if (add==\"slash\")  add = \"/\";\n        else if (add==\"noBlanks\")  // no blanks after the following words\n        {\n            add = \"\";\n            addBlank = false;\n        }else if (add==\"blanks\") // add a blank here and after the following words\n        {\n            add = \"\";\n            addBlank = true;\n        }else if (add==\"timeStamp\") // next command will be a number read from labelList\n        {\n            add = \"\";\n            timeStamp=true;\n        }else if (add==\"number\") // next command will be a number read from labelList\n        {\n            /*if (!propsDict.found(\"scalars\"))\n            {\n                FatalError<<\"you want to use a number in the command\\n - specify a scalar list with all numbers\"\n                << abort(FatalError);\n            }*/\n            char h[50];\n            sprintf(h,\"%f\",scalarList[numberCount]);\n            add = h;\n            numberCount ++;\n        }else if (add==\"label\") // next command will be a number read from labelList\n        {\n            /*if (!propsDict.found(\"labels\"))\n            {\n                FatalError<<\"you want to use a label in the command\\n - specify a label list with all numbers\"\n                << abort(FatalError);\n            }*/\n            char h[50];\n            sprintf(h,\"%d\",labelList[labelCount]);\n            add = h;\n            labelCount ++;\n        }\n\n        // compose command\n        if (addBlank)\n        {\n            command += add + \" \";\n        }else\n        {\n            command += add;\n        }\n    }\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/liggghtsCommandModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    liggghtsCommandModel\n\nSourceFiles\n    liggghtsCommandModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef liggghtsCommandModel_H\n#define liggghtsCommandModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"dataExchangeModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class liggghtsCommandModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass liggghtsCommandModel\n{\n\nprotected:\n\n    // Protected data\n    const dictionary& dict_;\n\n    cfdemCloud& particleCloud_;\n\n    string strCommand_;\n\n    int nextRun_;\n\n    int lastRun_;\n\n    Switch runFirst_;\n\n    Switch runLast_;\n\n    Switch runEveryCouplingStep_;\n\n    Switch runEveryWriteStep_;\n\n    scalar startTime_;\n\n    scalar endTime_;\n\n    scalar timeInterval_;\n\n    int firstCouplingStep_;\n\n    int lastCouplingStep_;\n\n    int couplingStepInterval_;\n\n    bool exactTiming_;\n\n    label commandLines_;\n\n    bool verbose_;\n\n    bool timeStamp_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"liggghtsCommandModel\");\n\n    // Declare runtime constructor selection table\n\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            liggghtsCommandModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm,\n                int i\n            ),\n            (dict,sm,i)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        liggghtsCommandModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n\n    // Destructor\n\n        virtual ~liggghtsCommandModel();\n\n\n    // Selector\n\n        static autoPtr<liggghtsCommandModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word liggghtsCommandType,\n            int i\n        );\n\n\n    // Member Functions\n\n        virtual const char* command(int)=0;\n\n        void checkTimeMode(dictionary&);\n\n        void checkTimeSettings(const dictionary&);\n\n        virtual bool runCommand(int)=0;\n\n        bool runThisCommand(int);\n\n        string addTimeStamp(word);\n\n        virtual void set(int){};\n\n        DynamicList<scalar> executionsWithinPeriod(scalar,scalar);\n\n        bool checkPath(fileName);\n\n    // Access\n\n        int nextRun(){return nextRun_;};\n\n        int lastRun(){return lastRun_;};\n\n        virtual word name()=0;\n\n        bool exactTiming(){return exactTiming_;};\n\n        label commandLines(){return commandLines_;};\n\n        void parseCommandList(wordList&, labelList&, scalarList&, word&, dictionary&, bool& timeStamp);\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/liggghtsCommandModel/newLiggghtsCommandModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"liggghtsCommandModel.H\"\n#include \"execute.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<liggghtsCommandModel> liggghtsCommandModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word liggghtsCommandType,\n    int i\n)\n{\n    Info<< \"Selecting liggghtsCommandModel \"\n         << liggghtsCommandType << \" ,provide dicts, numbered from 0 to n\" << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(liggghtsCommandType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"liggghtsCommandModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown liggghtsCommandModelType type \"\n            << liggghtsCommandType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid liggghtsCommandModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<liggghtsCommandModel>(cstrIter()(dict,sm,i));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/readLiggghtsData/readLiggghtsData.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"readLiggghtsData.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(readLiggghtsData, 0);\n\naddToRunTimeSelectionTable\n(\n    liggghtsCommandModel,\n    readLiggghtsData,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nreadLiggghtsData::readLiggghtsData\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    liggghtsCommandModel(dict,sm,i),\n    nrModel_(i),\n    insertionNr_(0.),\n    command_(\"read_data\"),\n    myName_(\"notYetGiven\"),\n    propsDict_(dict),\n    filePathList_(0)\n{\n    // define dictionary\n    char h[80];\n    sprintf(h,\"%d\",nrModel_);\n    myName_=word(typeName + \"Props\" + h);\n    propsDict_=dictionary(dict.subDict(myName_));\n\n    if (propsDict_.found(\"exactTiming\"))\n        exactTiming_=true;\n    Info << \"exactTiming==\" << exactTiming_ << endl;\n\n    if (propsDict_.found(\"verbose\")) verbose_=true;\n\n    // read first index of data file to be injected\n    insertionNr_=readScalar(propsDict_.lookup(\"startIndex\"));\n\n    // read command from dict\n    filePathList_ = wordList(propsDict_.lookup(\"filePath\"));\n\n    command_ += \" \";\n    forAll(filePathList_,i)\n    {\n        fileName add = filePathList_[i];\n\n        //- handle symbols\n        if (add==\"dot\")    add = \".\";\n        else if (add==\"dotdot\") add = \"..\";\n        else if (add==\"slash\")  add = \"/\";\n\n        // compose command\n        command_ += add;\n    }\n\n    checkTimeMode(propsDict_);\n\n    checkTimeSettings(propsDict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nreadLiggghtsData::~readLiggghtsData()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nconst char* readLiggghtsData::command(int commandLine)\n{\n    char h[50];\n    sprintf(h,\"_%d\",insertionNr_);\n    word add = h;\n    insertionNr_++;\n    strCommand_=string(command_ + add + \" add\");\n\n    return strCommand_.c_str();\n}\n\nbool readLiggghtsData::runCommand(int couplingStep)\n{\n    checkTimeSettings(propsDict_);\n    return runThisCommand(couplingStep);\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/readLiggghtsData/readLiggghtsData.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    readLiggghtsData\n\nSourceFiles\n    readLiggghtsData.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef readLiggghtsData_H\n#define readLiggghtsData_H\n\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class readLiggghtsData Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass readLiggghtsData\n:\n    public liggghtsCommandModel\n{\nprivate:\n\n    int nrModel_;\n\n    int insertionNr_;\n\n    word command_;\n\n    word myName_;\n\n    dictionary propsDict_;\n\n    wordList filePathList_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"readLiggghtsData\");\n\n\n    // Constructors\n\n        //- Construct from components\n        readLiggghtsData\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n    // Destructor\n\n        ~readLiggghtsData();\n\n\n    // Member Functions\n\n    word name(){return myName_;};\n\n    const char* command(int);\n\n    bool runCommand(int);\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/runLiggghts/runLiggghts.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"runLiggghts.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(runLiggghts, 0);\n\naddToRunTimeSelectionTable\n(\n    liggghtsCommandModel,\n    runLiggghts,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nrunLiggghts::runLiggghts\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    liggghtsCommandModel(dict,sm,i),\n    propsDict_(dict),\n    command_(\"run\"),\n    preNo_(false),\n    stdInterval_(0)\n{\n    word myName=word(typeName + \"Props\");\n    if (dict.found(myName))    \n    {\n        propsDict_=dictionary(dict.subDict(myName));\n        preNo_=Switch(propsDict_.lookup(\"preNo\"));\n\n        // check if verbose\n        if (propsDict_.found(\"verbose\")) verbose_=true;\n    }\n\n    runEveryCouplingStep_=true;\n\n    strCommand_=createCommand(command_);\n\n    //this allows to do run command only once, better use checkTimeMode(propsDict_) to get all options\n    runFirst_=Switch(propsDict_.lookupOrDefault<Switch>(\"runFirst\",false));\n    if(runFirst_) lastCouplingStep_ = firstCouplingStep_;\n\n    checkTimeSettings(dict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nrunLiggghts::~runLiggghts()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nconst char* runLiggghts::command(int commandLine)\n{\n    return strCommand_.c_str();\n}\n\nstring runLiggghts::createCommand( word command, int interval, word appendix, word appendix2, word appendix3, word appendix4)\n{\n    fileName add;\n    char h[50];\n    sprintf(h,\"%d\",interval);\n    add = h;\n    command += \" \" + add + \" \" + appendix + \" \" + appendix2 + \" \" + appendix3 + \" \" + appendix4;\n\n    return string(command);\n}\n\nbool runLiggghts::runCommand(int couplingStep)\n{\n    if(couplingStep <= lastCouplingStep_)\n    {\n        //change command to  \"run xxx pre no\"\n        if (preNo_ && (couplingStep > firstCouplingStep_))\n            strCommand_=createCommand(command_, particleCloud_.dataExchangeM().couplingInterval(),\"pre\",\"no\",\"post\",\"no\");\n        else\n            strCommand_=createCommand(command_, particleCloud_.dataExchangeM().couplingInterval());\n    }else strCommand_=createCommand(command_, 0);\n    \n    return runThisCommand(couplingStep);\n}\n\nvoid runLiggghts::set(int interval)\n{\n    if (preNo_)\n        strCommand_ = createCommand(command_, interval,\"pre\",\"no\",\"post\",\"no\");\n    else\n        strCommand_ = createCommand(command_, interval);\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/runLiggghts/runLiggghts.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    execute the liggghts command run $nrSteps\n\nClass\n    runLiggghts\n\nSourceFiles\n    runLiggghts.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef runLiggghts_H\n#define runLiggghts_H\n\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class runLiggghts Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass runLiggghts\n:\n    public liggghtsCommandModel\n{\nprivate:\n    dictionary propsDict_;\n\n    word command_;\n\n    bool preNo_;\n\n    int stdInterval_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"runLiggghts\");\n\n\n    // Constructors\n\n        //- Construct from components\n        runLiggghts\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n    // Destructor\n\n        ~runLiggghts();\n\n\n    // Member Functions\n\n    const char* command(int);\n\n    string createCommand(word=\"\",int=0,word=\"\",word=\"\",word=\"\",word=\"\");\n\n    bool runCommand(int);\n\n    word name(){return \"runLiggghts\";};\n\n    void set(int);\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/setDEMGravity/setDEMGravity.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"setDEMGravity.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(setDEMGravity, 0);\n\naddToRunTimeSelectionTable\n(\n    liggghtsCommandModel,\n    setDEMGravity,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nsetDEMGravity::setDEMGravity\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    liggghtsCommandModel(dict,sm,i),\n    propsDict_(dict),\n    nrModel_(i),\n    insertionNr_(0.),\n    command_(0),\n    filePathList_(100),\n    scalarList_(40),\n    labelList_(1),\n    #if defined(version21) || defined(version16ext)\n        g_(sm.mesh().lookupObject<uniformDimensionedVectorField> (\"g\")),\n    #elif defined(version15)\n        g_(dimensionedVector(sm.mesh().lookupObject<IOdictionary>(\"environmentalProperties\").lookup(\"g\")).value()),\n    #endif\n    unfix_(false)\n{\n    // define dictionary\n    char h[80];\n    sprintf(h,\"%d\",nrModel_);\n    word myName_=word(typeName + \"Props\" + h);\n    propsDict_=dictionary(dict.subDict(myName_));\n\n    // read unfix flag\n    unfix_=Switch(propsDict_.lookupOrDefault(\"unfix\",false));\n\n    if (propsDict_.found(\"exactTiming\"))\n        exactTiming_=true;\n    Info << \"exactTiming==\" << exactTiming_ << endl;\n\n    if (propsDict_.found(\"verbose\")) verbose_=true;\n\n    scalar gNorm=mag(g_.value());\n    vector g=g_.value()/mag(g_.value());\n\n\n    //=======================================\n    // create command\n\n    if(unfix_)\n    {\n        filePathList_[0] = \"unfix\";\n        filePathList_[1] = \"gravity\";\n    }\n    else\n    {\n        filePathList_[0] = \"fix\";\n        filePathList_[1] = \"gravity\";\n        filePathList_[2] = \"all\";\n        filePathList_[3] = \"gravity\";\n        filePathList_[4] = \"number\";\n        filePathList_[5] = \"vector\";\n        filePathList_[6] = \"number\";\n        filePathList_[7] = \"number\";\n        filePathList_[8] = \"number\";\n        scalarList_[0]=gNorm;\n        scalarList_[1]=g[0];\n        scalarList_[2]=g[1];\n        scalarList_[3]=g[2];\n    }\n\n    command_=wordList(1);\n\n    parseCommandList(filePathList_, labelList_, scalarList_, command_[0], propsDict_, timeStamp_);\n    Info << \"liggghtsCommand \" << command_[0] << endl;\n\n    checkTimeSettings(propsDict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nsetDEMGravity::~setDEMGravity()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nconst char* setDEMGravity::command(int commandLine)\n{\nInfo << \"commandLine=\" << commandLine << endl;\n    strCommand_=string(command_[commandLine]);\n    \n    return strCommand_.c_str();\n}\n\nbool setDEMGravity::runCommand(int couplingStep)\n{\n    checkTimeSettings(propsDict_);\n    return runThisCommand(couplingStep);\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/setDEMGravity/setDEMGravity.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    setDEMGravity\n\nSourceFiles\n    setDEMGravity.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef setDEMGravity_H\n#define setDEMGravity_H\n\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class setDEMGravity Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass setDEMGravity\n:\n    public liggghtsCommandModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    int nrModel_;\n\n    int insertionNr_;\n\n    wordList command_;\n\n    wordList filePathList_;\n\n    scalarList scalarList_;\n\n    labelList labelList_;\n\n    #ifdef version21\n        const uniformDimensionedVectorField& g_;    // ref to gravity\n    #elif defined(version16ext) || defined(version15)\n        const dimensionedVector& g_;    // ref to gravity\n    #endif\n\n    Switch unfix_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"setDEMGravity\");\n\n\n    // Constructors\n\n        //- Construct from components\n        setDEMGravity\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n    // Destructor\n\n        ~setDEMGravity();\n\n\n    // Member Functions\n\n    word name(){return typeName;};\n\n    const char* command(int);\n\n    bool runCommand(int);\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/writeLiggghts/writeLiggghts.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"writeLiggghts.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(writeLiggghts, 0);\n\naddToRunTimeSelectionTable\n(\n    liggghtsCommandModel,\n    writeLiggghts,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nwriteLiggghts::writeLiggghts\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    int i\n)\n:\n    liggghtsCommandModel(dict,sm,i),\n    propsDict_(dict),\n    command_(\"write_restart\"),\n    path_(word(\"..\")/word(\"DEM\")),\n    writeName_(\"liggghts.restartCFDEM\"),\n    writeLastOnly_(false),\n    overwrite_(false),\n    writeEvery_(1),\n    counter_(-1)\n{\n    if (dict.found(typeName + \"Props\"))    \n    {\n        Info << \"   Found a dictionary \" << word(typeName + \"Props\") << \", reading user defined values (if specified):\" << endl;\n        propsDict_=dictionary(dict.subDict(typeName + \"Props\"));\n\n        // check if verbose\n        if (propsDict_.found(\"verbose\")) verbose_=true;\n\n        if(propsDict_.found(\"writeLastOnly\"))\n        {\n            writeLastOnly_=Switch(propsDict_.lookup(\"writeLastOnly\"));\n        }\n        if(propsDict_.found(\"writeLast\")) FatalError<<\"You are using the old style variable name <writeLast> - this keyword has changed to <writeLastOnly>.\" << abort(FatalError);\n\n        if (propsDict_.found(\"path\"))\n        {\n            path_=fileName(propsDict_.lookup(\"path\"));\n            if (!checkPath(path_))\n                FatalError<<\"The path you provided in writeLiggghtsProps is incorrect: \" << path_ << \"\\n\" << abort(FatalError);\n            else\n                Info << \"   Using user defined path to write LIGGGHTS restart file: \" << path_ << endl;\n        }\n\n        if(propsDict_.found(\"writeName\"))\n        {\n            propsDict_.lookup(\"writeName\") >> writeName_;\n        }\n\n        if(propsDict_.found(\"writeEvery\"))\n        {\n            propsDict_.lookup(\"writeEvery\") >> writeEvery_;\n            if(writeEvery_<1) FatalError << \"writeEvery must be chosen > 0\" << abort(FatalError);\n        }\n\n        overwrite_=Switch(propsDict_.lookup(\"overwrite\"));\n    }\n    else\n    {\n        Info << \"   Did not find a dictionary \" << word(typeName + \"Props\") << \", using default values:\" << endl;\n    }\n\n    if(writeLastOnly_)\n        runLast_=true;\n    else\n    {\n        //Warning << \"Using invalid options of writeLiggghts, please use 'writeLast' option.\" << endl;\n        runEveryWriteStep_=true;\n    }    \n\n    command_ += \" \" + path_ + \"/\" + writeName_;\n    if(overwrite_)\n        strCommand_=string(command_);\n    else\n        command_ += \"_\";\n\n    // output for user\n    Info << \"     overwrite = \" << Switch(overwrite_) << endl;\n    Info << \"     path = \" << path_ << endl;\n    if(overwrite_) Info << \"     writeName = \" << writeName_ << \" (Restart file is written to \" << command_ << \" .\" << endl;\n    else Info << \"     writeName = \" << writeName_ << \" (Restart file is written to \" << command_ << \"<timeStamp> .\" << endl;\n    Info << \"     writeLastOnly = \" << writeLastOnly_ << endl;\n    Info << \"     writeEvery = \" << writeEvery_ << \" (Restart file is written every \" << writeEvery_ \n         << \" CFD's writeInterval.)\" << endl;\n    Info << \"     verbose = \" << Switch(verbose_) << endl;\n\n    checkTimeSettings(dict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nwriteLiggghts::~writeLiggghts()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nconst char* writeLiggghts::command(int commandLine)\n{\n    return strCommand_.c_str();\n}\n\nbool writeLiggghts::runCommand(int couplingStep)\n{\n    if(!overwrite_) strCommand_=addTimeStamp(command_);\n    if(particleCloud_.writeTimePassed()) counter_ = counter_+1;\n    label writeInterval = counter_ % writeEvery_;\n    bool a=runThisCommand(couplingStep); // needs to be called as it triggers resetWriteTimePassed()\n    if(writeInterval == 0) return a;\n    else return 0;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/liggghtsCommandModel/writeLiggghts/writeLiggghts.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    execute the liggghts command write_restart\n\nClass\n    writeLiggghts\n\nSourceFiles\n    writeLiggghts.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef writeLiggghts_H\n#define writeLiggghts_H\n\n#include \"liggghtsCommandModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class writeLiggghts Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass writeLiggghts\n:\n    public liggghtsCommandModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    word command_;\n\n    fileName path_;\n\n    fileName writeName_;\n\n    Switch writeLastOnly_;\n\n    Switch overwrite_;\n\n    label writeEvery_;\n\n    label counter_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"writeLiggghts\");\n\n\n    // Constructors\n\n        //- Construct from components\n        writeLiggghts\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            int i\n        );\n\n    // Destructor\n\n        ~writeLiggghts();\n\n\n    // Member Functions\n\n    const char* command(int);\n\n    bool runCommand(int);\n\n    word name(){return \"writeLiggghts\";};\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/engineSearch/engineSearch.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n#include \"error.H\"\n\n#include \"engineSearch.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(engineSearch, 0);\n\naddToRunTimeSelectionTable\n(\n    locateModel,\n    engineSearch,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nengineSearch::engineSearch\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word name\n)\n:\n    locateModel(dict,sm),\n    propsDict_(dict.subDict(name == \"\" ? typeName + \"Props\" : name + \"Props\")),\n    treeSearch_(propsDict_.lookupOrDefault<Switch>(\"treeSearch\", true)),\n    #if defined(version30)\n        searchEngine_(particleCloud_.mesh(),polyMesh::FACE_PLANES)\n    #elif defined(version21)\n        searchEngine_(particleCloud_.mesh(),polyMesh::FACEPLANES) // FACEPLANES or FACECENTRETETS; FACEDIAGTETS not stable\n    #elif defined(version16ext)\n        searchEngine_(particleCloud_.mesh(),false) //(particleCloud_.mesh(),faceDecomp_)\n    #endif\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nengineSearch::~engineSearch()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nlabel engineSearch::findCell\n(\n    double** const& mask,\n    double**& positions,\n    double**& cellIDs,\n    int size,\n    bool checkRad\n) const\n{\n    vector position;\n    for(int index = 0;index < size; ++index)\n    {\n        if(!checkRad || particleCloud_.radius(index) > SMALL)\n        {\n            // create pos vector\n            for(int i=0;i<3;i++) position[i] = positions[index][i];\n\n            cellIDs[index][0] = searchEngine_.findCell(position,-1,treeSearch_);\n\n            // give it another try with CELL_TETS (very expensive)\n            //if(cellIDs[index][0]==-1) cellIDs[index][0] = particleCloud_.mesh().findCell(position,polyMesh::CELL_TETS);\n        }\n        else cellIDs[index][0] = -1;\n    }\n    return 1;\n}\n\nlabel engineSearch::findSingleCell\n(\n    vector& position,\n    label& oldCellID\n) const\n{\n    label cellI = searchEngine_.findCell(position,oldCellID,treeSearch_);\n\n    // give it another try with CELL_TETS (very expensive)\n    //if(cellI==-1) cellI = particleCloud_.mesh().findCell(position,polyMesh::CELL_TETS);\n\n    return cellI;\n}\n\nlabel engineSearch::intersection\n(\n    const point& pStart,\n    const point& pEnd\n) const\n{\n    // find intersection with boundary\n    label face = searchEngine_.findNearestBoundaryFace(pEnd);\n\n    // try alternative\n    if (face==-1)\n    {\n        face = searchEngine_.intersection(pStart,pEnd).index();\n\n        if (face==-1 && mag(pStart-point(0,0,0))<SMALL)\n        {\n            point pStart2 = pEnd+0.0001*(pStart-pEnd)/mag(pStart-pEnd);\n            face = searchEngine_.intersection(pStart2,pEnd).index();\n        }\n    }\n    return face;\n}\n\nlabel engineSearch::intersections\n(\n    const point& pStart,\n    const point& pEnd\n) const\n{\n    return searchEngine_.intersection(pEnd,pStart).index();\n}\n\nlabel engineSearch::findNearestCell\n(\n    const point& pStart\n) const\n{\n    return searchEngine_.findNearestCell(pStart,-1,true);\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/engineSearch/engineSearch.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    engineSearch\n\nSourceFiles\n    engineSearch.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef engineSearch_H\n#define engineSearch_H\n\n#include \"locateModel.H\"\n\n# include \"meshSearch.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass engineSearch\n:\n    public locateModel\n{\n\nprotected:\n\n    dictionary propsDict_;\n\n    Switch treeSearch_;\n\n    mutable meshSearch searchEngine_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"engine\");\n\n\n    // Constructors\n\n        //- Construct from components\n        engineSearch\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word name = word(\"\")\n        );\n\n    // Destructor\n\n        ~engineSearch();\n\n\n    // Member Functions\n        virtual label findCell\n        (\n            double** const& mask,\n            double**& positions,\n            double**& cellIDs,\n            int size,\n            bool checkRad=true\n        ) const;\n\n        label findSingleCell\n        (\n            vector& position,\n            label& oldCellID\n        ) const;\n\n        label intersection\n        (\n                const point& pStart,\n                const point& pEnd\n        ) const;\n\n        label intersections\n        (\n                const point& pStart,\n                const point& pEnd\n        ) const;\n\n        label findNearestCell\n        (\n                const point& pStart\n        ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/engineSearchIB/engineSearchIB.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n\n#include \"engineSearchIB.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"mathematicalConstants.H\"\n\n#include <mpi.h>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(engineSearchIB, 0);\n\naddToRunTimeSelectionTable\n(\n    engineSearch,\n    engineSearchIB,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nengineSearchIB::engineSearchIB\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    engineSearch(dict,sm,typeName),\n    zSplit_(propsDict_.lookupOrDefault<scalar>(\"zSplit\",8)),\n    xySplit_(propsDict_.lookupOrDefault<scalar>(\"xySplit\",16)),\n    coef_(2.0),\n    verbose_(propsDict_.lookupOrDefault<Switch>(\"verbose\", false)),\n    numberOfSatellitePoints_((zSplit_-1)*xySplit_ + 2)\n{\n    bbPtr_.reset(new boundBox(particleCloud_.mesh().points(), false));\n    if(verbose_)\n    {\n        Pout<<\"MinBounds (x,y,z): \"<<bbPtr_().min()<<endl;\n        Pout<<\"MaxBounds (x,y,z): \"<<bbPtr_().max()<<endl;\n    }\n    for(int countPoints = 0; countPoints < numberOfSatellitePoints_; ++countPoints)\n    {\n        satellitePoints_.push_back(generateSatellitePoint(countPoints));\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nengineSearchIB::~engineSearchIB()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\nlabel engineSearchIB::findCell\n(\n    double** const& mask,\n    double**& positions,\n    double**& cellIDs,\n    int size,\n    bool checkRad\n) const\n{\n    bool checkPeriodicCells(particleCloud_.checkPeriodicCells());\n    const boundBox& globalBb = particleCloud_.mesh().bounds();\n\n    if(particleCloud_.meshHasUpdated())\n    {\n        searchEngine_.correct();\n        bbPtr_.reset(new boundBox(particleCloud_.mesh().points(), false));\n        if(verbose_)\n        {\n            Pout<<\"MinBounds (x,y,z): \"<<bbPtr_().min()<<endl;\n            Pout<<\"MaxBounds (x,y,z): \"<<bbPtr_().max()<<endl;\n        }\n    }\n\n    vector position;\n    for(int index = 0;index < size; ++index)\n    {\n        cellIDs[index][0]=-1;\n        double radius=particleCloud_.radius(index);\n        //if(mask[index][0] && radius > SMALL)\n        if(radius > SMALL)\n        {\n            // create pos vector\n            for(int i=0;i<3;i++) position[i] = positions[index][i];\n\n            bool isInside = isInsideRectangularDomain(position, coef_*radius);\n\n            if(!isInside && checkPeriodicCells)\n            {\n                vector positionCenterPeriodic;\n                for(int xDir=-1*particleCloud_.wall_periodicityCheckRange(0); \n                        xDir<=particleCloud_.wall_periodicityCheckRange(0); \n                        xDir++)\n                {\n                    positionCenterPeriodic[0] =  position[0]\n                                              + static_cast<double>(xDir)\n                                              * (globalBb.max()[0]-globalBb.min()[0]);\n                    for(int yDir=-1*particleCloud_.wall_periodicityCheckRange(1); \n                            yDir<=particleCloud_.wall_periodicityCheckRange(1); \n                            yDir++)\n                    {\n                        positionCenterPeriodic[1] =  position[1]\n                                                  + static_cast<double>(yDir)\n                                                  * (globalBb.max()[1]-globalBb.min()[1]);\n                        for(int zDir=-1*particleCloud_.wall_periodicityCheckRange(2); \n                                zDir<=particleCloud_.wall_periodicityCheckRange(2); \n                                zDir++)\n                        {\n                            positionCenterPeriodic[2] =  position[2]\n                                                      + static_cast<double>(zDir)\n                                                      * (globalBb.max()[2]-globalBb.min()[2]);\n                            isInside = isInsideRectangularDomain(positionCenterPeriodic, coef_*radius);\n                            if(isInside) break;\n                        }\n                        if(isInside) break;\n                    }\n                    if(isInside) break;\n                }\n            }\n\n\n            if(isInside)\n            {\n              // find cell\n              label oldID = cellIDs[index][0];\n              cellIDs[index][0] = findSingleCell(position,oldID);\n\n              if(cellIDs[index][0] < 0)\n              {\n                  label altStartPos = -1;\n\n                  for(unsigned int countPoints = 0; countPoints < satellitePoints_.size(); ++countPoints)\n                  {\n                    vector pos = getSatellitePoint(index, countPoints);\n                    isInside = isInsideRectangularDomain(pos, SMALL);\n\n                    if(isInside)\n                        altStartPos = findSingleCell(pos,oldID);\n\n                    //check for periodic domains, only do if check range is larger than 0\n                    if(checkPeriodicCells)\n                    {\n                        for(int iDir=0;iDir<3;iDir++)\n                        {\n                            if( pos[iDir] > globalBb.max()[iDir] && particleCloud_.wall_periodicityCheckRange(iDir)>0 ) \n                                pos[iDir]-=globalBb.max()[iDir]-globalBb.min()[iDir];\n                            else if( pos[iDir] < globalBb.min()[iDir] && particleCloud_.wall_periodicityCheckRange(iDir)>0 )\n                                pos[iDir]+=globalBb.max()[iDir]-globalBb.min()[iDir];\n                        }\n                        isInside = isInsideRectangularDomain(pos, SMALL);\n\n                        if(isInside)\n                          altStartPos=findSingleCell(pos,oldID); //particleCloud_.mesh().findCell(pos);//\n                    }\n\n                    if(altStartPos >= 0) // found position, we're done\n                    {\n                        cellIDs[index][0] = altStartPos;\n                        break;\n                    }\n                }\n              }\n            }\n        }\n    }\n    return 1;\n}\n\nbool engineSearchIB::isInsideRectangularDomain(vector centre, scalar skin) const\n{\n    vector offset(skin, skin, skin);\n    boundBox bb(bbPtr_().min()-offset, bbPtr_().max() + offset);\n    return bb.contains(centre);\n}\n\nvector engineSearchIB::generateSatellitePoint(int countPoints) const\n{\n    scalar theta, phi;\n    const scalar thetaSize = 180./zSplit_, phiSize = 360./xySplit_;\n    const scalar deg2rad = M_PI/180.;\n    vector pos(0.0, 0.0, 0.0);\n    // 1 point at bottom, 1 point at top\n    if(countPoints == 0)\n    {\n        pos[2] = 1.0;\n    } else if(countPoints == 1)\n    {\n        pos[2] = -1.0;\n    } else {\n        scalar thetaLevel = (countPoints - 2) / xySplit_;\n        theta = deg2rad * thetaSize * (thetaLevel+1);\n        phi = deg2rad * phiSize * (countPoints - 2 - thetaLevel*xySplit_);\n        pos[0] = sin(theta) * cos(phi);\n        pos[1] = sin(theta) * sin(phi);\n        pos[2] = cos(theta);\n    }\n    return pos;\n}\n\nvector engineSearchIB::getSatellitePoint(int index, int countPoints) const\n{\n    double radius=particleCloud_.radius(index);\n    vector position = particleCloud_.cfdemCloud::position(index);\n    vector pos = radius*satellitePoints_[countPoints] + position;\n    return pos;\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/engineSearchIB/engineSearchIB.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    engineSearchIB\n\nSourceFiles\n    engineSearchIB.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef engineSearchIB_H\n#define engineSearchIB_H\n\n#include \"engineSearch.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass engineSearchIB\n:\n    public engineSearch\n{\n\nprotected:\n    const label zSplit_;\n\n    const label xySplit_;\n\n    scalar coef_;\n\n    mutable autoPtr<boundBox> bbPtr_;\n\n    bool verbose_;\n\n    const label numberOfSatellitePoints_;\n\n    std::vector<vector> satellitePoints_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"engineIB\");\n\n\n    // Constructors\n\n    //- Construct from components\n    engineSearchIB\n    (\n        const dictionary& dict,\n        cfdemCloud& sm\n    );\n\n    // Destructor\n\n    ~engineSearchIB();\n\n\n    // Member Functions\n    label findCell\n    (\n        double** const& mask,\n        double**& positions,\n        double**& cellIDs,\n        int size,\n        bool checkRad=true\n    ) const;\n\n    vector generateSatellitePoint\n    (\n        int countPoints\n    ) const;\n    virtual vector getSatellitePoint\n    (\n        int index,\n        int countPoints\n    ) const;\n    bool isInsideRectangularDomain\n    (\n        vector point,\n        scalar skin\n    ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/locateModel/locateModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"locateModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(locateModel, 0);\n\ndefineRunTimeSelectionTable(locateModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nlocateModel::locateModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nlocateModel::~locateModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/locateModel/locateModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    locateModel\n\nSourceFiles\n    locateModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef locateModel_H\n#define locateModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class locateModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass locateModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"locateModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            locateModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        locateModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~locateModel();\n\n\n    // Selector\n\n        static autoPtr<locateModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Functions\n        virtual label findCell\n        (\n            double** const& mask,\n            double**& positions,\n            double**& cellIDs,\n            int size,\n            bool checkRad=true\n        ) const = 0;\n\n        virtual label findSingleCell\n        (\n            vector& position,\n            label& oldCellID\n        ) const = 0;\n\n        virtual label intersection\n        (\n                const point& pStart,\n                const point& pEnd\n        ) const\n        {\n            FatalError << \"The locate model you use does not define the function intersection(...).\" << abort(FatalError);\n            return -1;\n        };\n\n        virtual label intersections\n        (\n                const point& pStart,\n                const point& pEnd\n        ) const\n        {\n            FatalError << \"The locate model you use does not define the function intersections(...).\" << abort(FatalError);\n            return -1;\n        };\n\n        virtual label findNearestCell\n        (\n                const point& pStart\n        ) const\n        {\n            FatalError << \"The locate model you use does not define the function findNearestCell(...).\" << abort(FatalError);\n            return -1;\n        };\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/locateModel/newLocateModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"locateModel.H\"\n#include \"standardSearch.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<locateModel> locateModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word read_lfm\n    (\n        dict.lookup(\"locateModel\")\n    );\n\n    word ps\n    (\n        dict.lookupOrDefault<word>(\"particleShapeType\", \"\")\n    );\n    if (ps == \"superquadric\")\n        ps = \"Superquadric\"; // NOTE: change in case\n    else\n        ps = \"\";\n    word locateModelType(read_lfm + ps);\n\n    Info<< \"Selecting locateModel \"\n         << locateModelType << endl;\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(locateModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"locateModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown locateModelType type \"\n            << locateModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid locateModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<locateModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/standardSearch/standardSearch.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"standardSearch.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(standardSearch, 0);\n\naddToRunTimeSelectionTable\n(\n    locateModel,\n    standardSearch,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nstandardSearch::standardSearch\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    locateModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nstandardSearch::~standardSearch()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nlabel standardSearch::findCell\n(\n    double** const& mask,\n    double**& positions,\n    double**& cellIDs,\n    int size,\n    bool checkRad\n) const\n{\n    vector position;\n    for(int index = 0;index < size; ++index)\n    {\n        //if(mask[index][0] && particleCloud_.radius(index) > SMALL)\n        if(!checkRad || particleCloud_.radius(index) > SMALL)\n        {\n            // create pos vector\n            for(int i=0;i<3;i++) position[i] = positions[index][i];\n\n            // find cell\n            #if defined(version30)\n                cellIDs[index][0] = particleCloud_.mesh().findCell(position, polyMesh::FACE_PLANES);\n            #elif defined(version21)\n                cellIDs[index][0] = particleCloud_.mesh().findCell(position, polyMesh::FACEPLANES);\n            #elif defined(version16ext)\n                cellIDs[index][0] = particleCloud_.mesh().findCell(position);\n            #endif\n        }\n        else cellIDs[index][0]=-1;\n    }\n\n    return 1;\n}\n\nlabel standardSearch::findSingleCell\n(\n    vector& position,\n    label& oldCellID\n) const\n{\n    // find cell\n    #if defined(version30)\n        return particleCloud_.mesh().findCell(position, polyMesh::FACE_PLANES);\n    #elif defined(version21)\n        return particleCloud_.mesh().findCell(position, polyMesh::FACEPLANES);\n    #elif defined(version16ext)\n        return particleCloud_.mesh().findCell(position);\n    #endif\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/locateModel/standardSearch/standardSearch.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    standardSearch\n\nSourceFiles\n    standardSearch.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef standardSearch_H\n#define standardSearch_H\n\n#include \"locateModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass standardSearch\n:\n    public locateModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"standard\");\n\n\n    // Constructors\n\n        //- Construct from components\n        standardSearch\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~standardSearch();\n\n\n    // Member Functions\n        label findCell\n        (\n            double** const& mask,\n            double**& positions,\n            double**& cellIDs,\n            int size,\n            bool checkRad=true\n        ) const;\n\n        label findSingleCell\n        (\n            vector& position,\n            label& oldCellID\n        ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/meshMotionModel/meshMotionModel/meshMotionModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"meshMotionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(meshMotionModel, 0);\n\ndefineRunTimeSelectionTable(meshMotionModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nmeshMotionModel::meshMotionModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    moveZoneName_(\"\")\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nmeshMotionModel::~meshMotionModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntmp<volVectorField> meshMotionModel::f() const\n{\n    tmp<volVectorField> tmp\n    (\n        new volVectorField\n        (\n            IOobject\n            (\n                \"xxx\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedVector\n            (\n                \"zero\",\n                dimensionSet(0, 1, -2, 0, 0),\n                vector::zero\n            )\n        )\n    );\n    return tmp;\n}\n\ntmp<volScalarField> meshMotionModel::body() const\n{\n    tmp<volScalarField> tmp\n    (\n        new volScalarField\n        (\n            IOobject\n            (\n                \"xxx\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            scalar(0)\n        )\n    );\n    return tmp;\n}\n\ntmp<volScalarField> meshMotionModel::inside() const\n{\n    tmp<volScalarField> tmp\n    (\n        new volScalarField\n        (\n            IOobject\n            (\n                \"xxx\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            scalar(0)\n        )\n    );\n    return tmp;\n}\n\ntmp<volVectorField> meshMotionModel::momentumSource() const\n{\n    tmp<volVectorField> tmp\n    (\n        new volVectorField\n        (\n            IOobject\n            (\n                \"xxx\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedVector\n            (\n                \"zero\",\n                dimensionSet(0, 1, -2, 0, 0),\n                vector::zero\n            )\n        )\n    );\n    return tmp;\n}\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/meshMotionModel/meshMotionModel/meshMotionModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    meshMotionModel\n\nSourceFiles\n    meshMotionModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef meshMotionModel_H\n#define meshMotionModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class meshMotionModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass meshMotionModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        mutable word moveZoneName_;\n\n    // Protected member functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"meshMotionModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            meshMotionModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        meshMotionModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~meshMotionModel();\n\n\n    // Selector\n\n        static autoPtr<meshMotionModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Function\n        virtual labelList moveZone() const {return labelList(0);};\n\n        const word& moveZoneName() const {return moveZoneName_;}\n\n        virtual tmp<volVectorField> setMotion() const=0;\n\n        virtual void correctF(volVectorField&) const {};\n\n        virtual void correctUo(volVectorField&) const {};\n\n        virtual tmp<volVectorField> f() const;\n\n        virtual tmp<volScalarField> body() const;\n\n        virtual tmp<volScalarField> inside() const;\n\n        virtual tmp<volVectorField> momentumSource() const;\n\n        virtual void postProcessing(volScalarField&) const {};\n\n    // Access\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/meshMotionModel/meshMotionModel/newMeshMotionModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"meshMotionModel.H\"\n#include \"noMeshMotion.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<meshMotionModel> meshMotionModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word meshMotionModelType\n    (\n        dict.lookup(\"meshMotionModel\")\n    );\n\n    Info<< \"Selecting meshMotionModel \"\n         << meshMotionModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(meshMotionModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"meshMotionModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown meshMotionModelType type \"\n            << meshMotionModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid meshMotionModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<meshMotionModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/meshMotionModel/noMeshMotion/noMeshMotion.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noMeshMotion.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noMeshMotion, 0);\n\naddToRunTimeSelectionTable\n(\n    meshMotionModel,\n    noMeshMotion,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoMeshMotion::noMeshMotion\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    meshMotionModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoMeshMotion::~noMeshMotion()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\ntmp<volVectorField> noMeshMotion::setMotion() const\n{\n    tmp<volVectorField> tsource\n    (\n        new volVectorField\n        (\n            IOobject\n            (\n                \"xxx\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedVector\n            (\n                \"zero\",\n                dimensionSet(0, 1, -1, 0, 0),\n                vector::zero\n            )\n        )\n    );\n\n    // do sth\n    return tsource;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/meshMotionModel/noMeshMotion/noMeshMotion.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noMeshMotion\n\nSourceFiles\n    noMeshMotion.C\n\n\\*---------------------------------------------------------------------------*/\n#ifndef noMeshMotion_H\n#define noMeshMotion_H\n\n#include \"meshMotionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noMeshMotion\n:\n    public meshMotionModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"noMeshMotion\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noMeshMotion\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noMeshMotion();\n\n\n    // Member Functions\n        tmp<volVectorField> setMotion() const;\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"explicitCouple.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(explicitCouple, 0);\n\naddToRunTimeSelectionTable\n(\n    momCoupleModel,\n    explicitCouple,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nexplicitCouple::explicitCouple\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    momCoupleModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    fPrev_\n    (   IOobject\n        (\n            \"fPrev\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volVectorField> (\"f\")\n        //sm.mesh(),\n        //dimensionedVector(\"zero\", dimensionSet(1,-2,-2,0,0), vector(0,0,0)) // N/m3\n    ),\n    fNext_\n    (   IOobject\n        (\n            \"fNext\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volVectorField> (\"f\")\n        //sm.mesh(),\n        //dimensionedVector(\"zero\", dimensionSet(1,-2,-2,0,0), vector(0,0,0)) // N/m3\n    ),\n    fLimit_(1e10,1e10,1e10),\n    sourceField_\n    (   IOobject\n        (\n            \"sourceField\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh(),\n        dimensionedVector(\"zero\", dimensionSet(1,-2,-2,0,0), vector(0,0,0)) // N/m3\n    )\n{\n    if (propsDict_.found(\"fLimit\"))\n    {\n        fLimit_=vector(propsDict_.lookup (\"fLimit\"));\n        Info << \"explicit momentum exchange field is limited to : \" << fLimit_ << endl;\n    }\n    bool treatVoidCellsAsExplicitForce = propsDict_.lookupOrDefault<Switch>(\"treatVoidCellsAsExplicitForce\", true);\n    if (treatVoidCellsAsExplicitForce) particleCloud_.registryM().addProperty(\"treatVoidCellsAsExplicitForce\",1);\n    else particleCloud_.registryM().addProperty(\"treatVoidCellsAsExplicitForce\",0);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nexplicitCouple::~explicitCouple()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::explicitCouple::applyDebugSettings(bool debug) const\n{\n    if(!debug)\n    {\n        fPrev_.writeOpt() = IOobject::NO_WRITE;\n        fNext_.writeOpt() = IOobject::NO_WRITE;\n    }\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ndimensionedVector explicitCouple::returnIntegralSourceField() const\n{\n    //Sum is over cells of PROCESOR ONLY!!\n    dimensionedVector intSource = dimensionedVector(\"0\", dimensionSet(1, 1, -2, 0, 0), vector::zero);\n    forAll(sourceField_,cellI)\n        intSource.value() += sourceField_.internalField()[cellI] * particleCloud_.mesh().V()[cellI];\n\n    return intSource;  // in Newton\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ntmp<volVectorField> explicitCouple::expMomSource() const\n{\n    //This INCLUDES the source field that is set separately!\n    scalar tsf = particleCloud_.dataExchangeM().timeStepFraction();\n\n    // update fNext at last subTS\n    //if(1-tsf < 1e-4) //tsf==1\n\n    // update KslNext in first subTS\n    // NOTE: without following if we could update f every subTS (based on current values) and use this value\n    if(tsf < particleCloud_.mesh().time().deltaT().value()/particleCloud_.dataExchangeM().couplingTime() + 0.000001 )\n    {\n        // calc fNext\n        forAll(fNext_,cellI)\n        {\n            fNext_[cellI] = arrayToField(cellI);\n    \n            // limiter\n            for (int i=0;i<3;i++)\n            {\n                if (mag(fNext_[cellI][i]) > fLimit_[i]) fNext_[cellI][i] = fLimit_[i];\n            }\n        }\n    }\n\n    /*if(1-tsf < 1e-4) //tsf==1\n    {\n        return tmp<volVectorField>\n        (\n            new volVectorField(\"f_explicitCouple\", fPrev_)\n        );\n    }else*/\n    {\n        return tmp<volVectorField>\n        (\n            new volVectorField(\"f_explicitCouple\", (1 - tsf) * fPrev_ + tsf * fNext_)\n        );\n    }\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nvoid Foam::explicitCouple::resetMomSourceField() const\n{\n    fPrev_ == fNext_;\n    fNext_ == dimensionedVector(\"zero\", fNext_.dimensions(), vector::zero);\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ninline vector Foam::explicitCouple::arrayToField(label cellI) const\n{\n    //This INCLUDES the source field that is set separately!\n    return particleCloud_.forceM(0).expParticleForces()[cellI] / particleCloud_.mesh().V()[cellI] \n         + sourceField_[cellI];\n}\n\nvoid Foam::explicitCouple::setSourceField(volVectorField & field) const\n{\n    sourceField_ = field;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/explicitCouple/explicitCouple.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    explicitCouple\n\nSourceFiles\n    explicitCouple.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef explicitCouple_H\n#define explicitCouple_H\n\n#include \"momCoupleModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass explicitCouple\n:\n    public momCoupleModel\n{\nprivate:\n\n    dictionary propsDict_;\n\n    mutable volVectorField fPrev_;\n\n    mutable volVectorField fNext_;\n\n    vector fLimit_;     // limit for for exchange field\n\n    virtual inline vector arrayToField(label) const;\n\n    mutable volVectorField sourceField_; // N/m3\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"explicitCouple\");\n\n\n    // Constructors\n\n        //- Construct from components\n        explicitCouple\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~explicitCouple();\n\n\n    // Member Functions\n\n        void applyDebugSettings(bool) const;\n\n        tmp<volVectorField> expMomSource() const;\n\n        void resetMomSourceField() const;\n\n        void setSourceField(volVectorField &) const;\n\n        dimensionedVector returnIntegralSourceField() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/implicitCouple/implicitCouple.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"implicitCouple.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"forceModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(implicitCouple, 0);\n\naddToRunTimeSelectionTable\n(\n    momCoupleModel,\n    implicitCouple,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nimplicitCouple::implicitCouple\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    momCoupleModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    velFieldName_(propsDict_.lookupOrDefault<word>(\"velFieldName\",\"U\")),\n    granVelFieldName_(propsDict_.lookupOrDefault<word>(\"granVelFieldName\",\"Us\")),\n    voidfractionFieldName_(propsDict_.lookupOrDefault<word>(\"voidfractionFieldName\",\"voidfraction\")),\n    U_(sm.mesh().lookupObject<volVectorField> (velFieldName_)),\n    Us_(sm.mesh().lookupObject<volVectorField> (granVelFieldName_)),\n    alpha_(sm.mesh().lookupObject<volScalarField> (voidfractionFieldName_)),\n    KslLimit_(1e10),\n    KslPrev_\n    (   IOobject\n        (\n            \"KslPrev\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volScalarField> (\"Ksl\")\n        //sm.mesh(),\n        //dimensionedScalar(\"zero\", dimensionSet(1,-3,-1,0,0), 0)  // N/m3 / m/s\n    ),\n    KslNext_\n    (   IOobject\n        (\n            \"KslNext\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volScalarField> (\"Ksl\")\n        //sm.mesh(),\n        //dimensionedScalar(\"zero\", dimensionSet(1,-3,-1,0,0), 0)  // N/m3 / m/s\n    )\n{\n    Info << \"\" << endl;\n\n    if (propsDict_.found(\"KslLimit\"))\n    {\n        KslLimit_=readScalar(propsDict_.lookup (\"KslLimit\"));\n        Info << \"implicit momentum exchange field is limited to : \" << KslLimit_ << endl;\n    }\n\n    if (propsDict_.found(\"minAlphaP\"))\n        maxAlpha_ = 1-readScalar(propsDict_.lookup (\"minAlphaP\"));\n\n    Info << \"implicit momentum exchange field calculate if alphaP larger than : \" <<  maxAlpha_ << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nimplicitCouple::~implicitCouple()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::implicitCouple::applyDebugSettings(bool debug) const\n{\n    if(!debug)\n    {\n        KslPrev_.writeOpt() = IOobject::NO_WRITE;\n        KslNext_.writeOpt() = IOobject::NO_WRITE;\n    }\n}\n\ntmp<volScalarField> implicitCouple::impMomSource() const\n{\n    scalar tsf = particleCloud_.dataExchangeM().timeStepFraction();\n\n    // calc Ksl\n    scalar Ur;\n\n    // update KslNext at last subTS\n    //if(1-tsf < 1e-4) //tsf==1\n\n    // update KslNext in first subTS\n    // NOTE: without following if we could update Ksl every subTS (based on current values) and use this value\n    if(tsf < particleCloud_.mesh().time().deltaT().value()/particleCloud_.dataExchangeM().couplingTime() + 0.000001 )\n    {\n        forAll(KslNext_,cellI)\n        {\n            Ur = mag(U_[cellI] - Us_[cellI]);\n\n            if(Ur > SMALL && alpha_[cellI] < maxAlpha_) //momentum exchange switched off if alpha too big\n            {\n                // NOTE: impParticleForces() are calculated at coupling step based on current values\n                //       therefore the us of Next fields in forceM and here is recommended\n                KslNext_[cellI] = mag(particleCloud_.forceM(0).impParticleForces()[cellI])\n                            / Ur\n                            / particleCloud_.mesh().V()[cellI];\n            }\n            else KslNext_[cellI] = 0;\n\n            // limiter\n            if (KslNext_[cellI] > KslLimit_) KslNext_[cellI] = KslLimit_;\n        }\n    }\n\n    /*if(1-tsf < 1e-4) //tsf==1\n    {\n        return tmp<volScalarField>\n        (\n            new volScalarField(\"Ksl_implicitCouple\", KslPrev_)\n        );\n    }else*/\n    {\n        return tmp<volScalarField>\n        (\n            new volScalarField(\"Ksl_implicitCouple\", (1 - tsf) * KslPrev_ + tsf * KslNext_)\n        );\n    }\n}\n\nvoid Foam::implicitCouple::resetMomSourceField() const\n{\n    KslPrev_ == KslNext_;\n    KslNext_ == dimensionedScalar(\"zero\", KslNext_.dimensions(), 0.0);\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/implicitCouple/implicitCouple.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    implicitCouple\n\nSourceFiles\n    implicitCouple.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef implicitCouple_H\n#define implicitCouple_H\n\n#include \"momCoupleModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass implicitCouple\n:\n    public momCoupleModel\n{\n\nprivate:\n\n    dictionary propsDict_;\n\n    word velFieldName_;\n\n    word granVelFieldName_;\n\n    word voidfractionFieldName_;\n\n    const volVectorField& U_;    // ref to fluid velocity\n\n    const volVectorField& Us_;   // ref to granular velocity\n\n    const volScalarField& alpha_;    // ref to voidfraction\n\n    scalar KslLimit_;     // limit for for exchange field\n\n    mutable volScalarField KslPrev_;\n\n    mutable volScalarField KslNext_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"implicitCouple\");\n\n\n    // Constructors\n\n        //- Construct from components\n        implicitCouple\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~implicitCouple();\n\n\n    // Member Functions\n\n        void applyDebugSettings(bool) const;\n\n        tmp<volScalarField> impMomSource() const;\n\n        void resetMomSourceField() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/momCoupleModel/momCoupleModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"momCoupleModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(momCoupleModel, 0);\n\ndefineRunTimeSelectionTable(momCoupleModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\ntmp<volScalarField> momCoupleModel::impMomSource() const\n{\n    FatalError<<\"the solver calls for impMomSource()\\n\"\n              <<\", please set 'momCoupleModel' to type 'implicitCouple'\\n\"\n              << abort(FatalError);\n\n    tmp<volScalarField> tsource;\n    return tsource;\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ntmp<volVectorField> momCoupleModel::expMomSource() const\n{\n    FatalError<<\"the solver calls for expMomSource()\\n\"\n              <<\", please set 'momCoupleModel' to type 'explicitCouple'\\n\"\n              << abort(FatalError);\n    tmp<volVectorField> tsource;\n    return tsource;\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nvoid momCoupleModel::setSourceField(volVectorField & a) const\n{\n    //do nothing;\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ndimensionedVector momCoupleModel::returnIntegralSourceField() const\n{\n    FatalError<<\"the solver calls for returnIntegralSourceField()\\n\"\n              <<\", please set 'momCoupleModel' to type 'explicitCouple' to access this data.\\n\"\n              << abort(FatalError);\n\n    return dimensionedVector(\"0\", dimensionSet(1, 1, -2, 0, 0), vector::zero); // Newton\n}\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nmomCoupleModel::momCoupleModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    maxAlpha_(1-SMALL)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nmomCoupleModel::~momCoupleModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/momCoupleModel/momCoupleModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    momCoupleModel\n\nSourceFiles\n    momCoupleModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef momCoupleModel_H\n#define momCoupleModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include \"dataExchangeModel.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class momCoupleModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass momCoupleModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        scalar maxAlpha_;     // max fluid volume fraction to calculate exchange field\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"momCoupleModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            momCoupleModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        momCoupleModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~momCoupleModel();\n\n\n    // Selector\n\n        static autoPtr<momCoupleModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word momCoupleType\n        );\n\n\n    // Member Functions\n\n        virtual void applyDebugSettings(bool) const {};\n\n        // implicit momentum source field\n        virtual tmp<volScalarField> impMomSource() const;\n\n        // explicit momentum source field\n        virtual tmp<volVectorField> expMomSource() const;\n\n        virtual void resetMomSourceField() const=0;\n\n        virtual void setSourceField(volVectorField &) const;\n\n        virtual dimensionedVector returnIntegralSourceField() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/momCoupleModel/newMomCoupleModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"momCoupleModel.H\"\n#include \"explicitCouple.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<momCoupleModel> momCoupleModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word momCoupleType\n)\n{\n    Info<< \"Selecting momCoupleModel \"\n         << momCoupleType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(momCoupleType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"momCoupleModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown momCoupleType type \"\n            << momCoupleType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid momCoupleModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<momCoupleModel>(cstrIter()(dict,sm));\n}\n\n// * * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/noCouple/noCouple.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noCouple.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noCouple, 0);\n\naddToRunTimeSelectionTable\n(\n    momCoupleModel,\n    noCouple,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoCouple::noCouple\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    momCoupleModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoCouple::~noCouple()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nvoid Foam::noCouple::resetMomSourceField() const\n{\n    FatalError<<\"the solver calls for resetMomSourceField() although you use IB method where this is not needed!\\n\"\n              <<\", check your solver! - PANIC -\\n\";\n              //<< abort(FatalError);\n}\n\ntmp<volScalarField> noCouple::impMomSource() const\n{\n    tmp<volScalarField> tsource\n    (\n        new volScalarField\n        (\n            IOobject\n            (\n                \"Ksl_implicitCouple\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedScalar\n            (\n                \"zero\",\n                dimensionSet(1, -3, -1, 0, 0), // N/m3 / m/s\n                0\n            )\n        )\n    );\n\n    return tsource;\n}\n\ntmp<volVectorField> noCouple::expMomSource() const\n{\n    tmp<volVectorField> tsource\n    (\n        new volVectorField\n        (\n            IOobject\n            (\n                \"f_explicitCouple\",\n                particleCloud_.mesh().time().timeName(),\n                particleCloud_.mesh(),\n                IOobject::NO_READ,\n                IOobject::NO_WRITE\n            ),\n            particleCloud_.mesh(),\n            dimensionedVector\n            (\n                \"zero\",\n                dimensionSet(1, -2, -2, 0, 0), // N/m3\n                vector::zero\n            )\n        )\n    );\n\n    return tsource;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/momCoupleModel/noCouple/noCouple.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noCouple\n\nSourceFiles\n    noCouple.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noCouple_H\n#define noCouple_H\n\n#include \"momCoupleModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noCouple\n:\n    public momCoupleModel\n{\nprivate:\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"off\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noCouple\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noCouple();\n\n\n    // Member Functions\n        void resetMomSourceField() const;\n\n        tmp<volScalarField> impMomSource() const;\n\n        tmp<volVectorField> expMomSource() const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/noProbe/noProbe.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noProbe.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include <mpi.h>\n#include \"IOmanip.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noProbe, 0);\n\naddToRunTimeSelectionTable\n(\n    probeModel,\n    noProbe,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoProbe::noProbe\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    word   typeName,\n    const char*  logFileName\n)\n:\n    probeModel(dict,sm,typeName,logFileName)\n{}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoProbe::~noProbe()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/noProbe/noProbe.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noProbe\n\nSourceFiles\n    noProbe.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noProbe_H\n#define noProbe_H\n\n#include \"probeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noProbe\n:\n    public probeModel\n{\n\nprivate:\n\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"off\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noProbe\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            word   typeName,\n            const char*  logFileName\n        );\n\n    // Destructor\n\n        ~noProbe();\n\n    // Member Functions\n        bool active() const {return false;}; \n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"particleProbe.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"error.H\"\n#include \"IOmanip.H\"\n#include <mpi.h>\n#include <cstring>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(particleProbe, 0);\n\naddToRunTimeSelectionTable\n(\n    probeModel,\n    particleProbe,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nparticleProbe::particleProbe\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    const word& typeName,\n    const char* logFileName\n)\n:\n    probeModel(dict,sm,typeName,logFileName),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    name_(typeName),\n    particleCloud_(sm),\n    verbose_(false),\n    verboseToFile_(false),\n    writePrecision_(3),\n    dirName_(\"particleProbes\"),\n    rank_(-1),\n    sPtr(NULL),\n    printEvery_(1),\n    sampleAll_(false),\n    probeDebug_(false),\n    includePosition_(false),\n    particleIDsToSample_(propsDict_.lookup(\"particleIDsToSample\")),\n    itemCounter_(0),\n    currItemId_(0),\n    printCounter_(0),\n    printNow_(false),\n    printOnlyAt_(-1)\n{\n    if (propsDict_.found(\"verbose\")) verbose_=true;\n    if (propsDict_.found(\"verboseToFile\")) verboseToFile_=true;\n\n    if (propsDict_.found(\"printEvery\")) printEvery_= readScalar(propsDict_.lookup(\"printEvery\"));\n    if (propsDict_.found(\"printOnlyAtStep\")) printOnlyAt_= readScalar(propsDict_.lookup(\"printOnlyAtStep\"));\n    if (propsDict_.found(\"sampleAll\")) sampleAll_=true;\n    if (propsDict_.found(\"probeDebug\")) probeDebug_=true;\n    if (propsDict_.found(\"includePosition\")) includePosition_=true;\n\n    if (propsDict_.found(\"writePrecision\")) writePrecision_= readScalar(propsDict_.lookup(\"writePrecision\"));\n\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nparticleProbe::~particleProbe()\n{\n clearProbes();\n forAll(sPtrList_, i)\n     delete sPtrList_[i];\n}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid particleProbe::setOutputFile(const word& logFileName) const\n{\n    bool foundFile = false;\n    if(itemCounter_>0 && verboseToFile_ )\n    {\n        forAll(itemsToSample_, iterator)\n        {\n            if(itemsToSample_[iterator] == logFileName)\n            {\n                probeIndex_ = iterator ;\n                foundFile = true;\n            }\n        }\n\n        if(!foundFile)\n             FatalError <<  \"particleProbe::setOutputFile for logFileName \" <<  logFileName << \" : \"<< \"File not found\" << abort(FatalError);\n        currItemId_ = probeIndex_ + 1;\n        setCounter(); //set counter, will auto-check if first item\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::initialize(const word& modelName,const word& logFileName) const\n{\n  //update the list of items to be sampled\n  itemCounter_ += 1; \n  // Note: for other than ext one could use vValues.append(x)\n  // instead of setSize\n  itemsToSample_.setSize(itemsToSample_.size()+1, logFileName);\n\n  // init environment\n  name_ = modelName;\n  const char* fileNameOut_ = logFileName.c_str();\n\n  if(verboseToFile_)\n  {\n\n   if(printOnlyAt_==-1)\n   {\n    Info << \"Will sample these particle IDs: \" << particleIDsToSample_ << \" every \" <<  printEvery_ <<  endl;\n   }\n   else if(printOnlyAt_>-1)\n   {\n     Info << \"Will sample these particle IDs: \" << particleIDsToSample_ << \" at step \" <<  printOnlyAt_ <<  endl;\n   }\n   else\n   {\n    FatalError <<  \"particleProbe for model \" <<  name_ << \" : \"<< \"printOnlyAtStep cannot be negative or zero\" << abort(FatalError);\n   }\n\n    //initialize the output files\n    MPI_Comm_rank(MPI_COMM_WORLD,&rank_);\n\n    //open a separate file for each processor\n    char* filecurrent_ = new char[strlen(fileNameOut_) + 5]; //reserve 4 chars for processor name\n    sprintf(filecurrent_,\"%s%s%d\", fileNameOut_, \".\", rank_);\n    Info << \"particleProbe for model \" <<  name_ << \" will write to file \" << filecurrent_ \n         << \". This is item \" << itemCounter_ << \" to probe.\" << endl;\n\n      //generate the file streams\n      fileName probeSubDir = dirName_;\n      if (particleCloud_.mesh().name() != polyMesh::defaultRegion)\n      {\n                probeSubDir = probeSubDir/particleCloud_.mesh().name();\n      }\n      probeSubDir = probeSubDir/particleCloud_.mesh().time().timeName();\n\n       fileName probeDir_;\n       if (Pstream::parRun())\n       {\n           // Put in undecomposed case\n           // (Note: gives problems for distributed data running)\n           probeDir_ = particleCloud_.mesh().time().path()/\"..\"/probeSubDir;\n       }\n       else\n       {\n           probeDir_ = particleCloud_.mesh().time().path()/probeSubDir;\n       }\n\n    //manage files and OFstreams\n    mkDir(probeDir_);\n    sPtr = new OFstream(probeDir_/filecurrent_);\n    // Note: for other than ext one could use xx.append(x)\n    // instead of setSize\n    sPtrList_.setSize(sPtrList_.size()+1, sPtr);\n\n    delete [] filecurrent_;\n    //Clear the containers for the fields to be probed\n    scalarFields_.clear();\n    vectorFields_.clear();\n  }\n\n  Info << \"particleProbe::initialize done!\" << endl;\n  return;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::writeHeader() const\n{\n\n     if(verboseToFile_ )\n     {\n         *sPtr<<\"#processor: \" << rank_ << endl;\n         *sPtr<<\"#index   time   \"  << \"   \";  \n\n\n        *sPtr<<\"||  vectorData:  \"  << \"   \"; \n    \n         forAll(vectorFields_, iter)\n         {\n             if(!probeDebug_ && iter>0) break;\n             *sPtr << vectorFields_(iter) << \"   \"; \n          }\n\n         if(probeDebug_)\n         {\n            *sPtr<<\"||   scalarData:  \"  << \"   \";  \n            forAll(scalarFields_, iter)\n            {\n                 *sPtr << scalarFields_(iter)  << \"   \";\n            }\n         }\n\n         if(includePosition_) *sPtr<<\" ||  position\" << endl; \n         else *sPtr << endl; \n     }\n\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::clearProbes() const\n{\n\n for(std::vector< std::vector<double*> >::iterator \n       it  = vProbes_.begin(); \n       it != vProbes_.end(); \n     ++it) \n {\n    for(std::vector<double*>::iterator \n           jt  = (*it).begin(); \n           jt != (*it).end(); \n         ++jt) \n    {\n        delete[] (*jt);\n    }\n    (*it).clear();\n    \n }\n\n  for (unsigned int j=0; j<sProbes_.size(); j++)\n    sProbes_[j].clear();\n      \n  sProbes_.clear();\n  vProbes_.clear();\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::updateProbes(int index, Field<scalar> sValues, Field<vector> vValues) const\n{\n  //check if the particle already has an allocated vector. If not, create it. It should be only called at the beginning. \n  while(index >= static_cast<int>(vProbes_.size()))\n  {\n    std::vector<double*> particleVector_;\n    vProbes_.push_back(particleVector_);\n  }\n  \n  while(index >= static_cast<int>(sProbes_.size()))\n  {\n    std::vector<double> particleScalar_;\n    sProbes_.push_back(particleScalar_);\n  }\n  \n  //register vector probes on the corresponding vector\n  forAll(vValues, iter)\n  {\n   if(probeIndex_<static_cast<int>(vProbes_[index].size())) //The corresponding probe for this particle already exists, values are overwritten.\n   {\n    vProbes_[index][probeIndex_][0]=vValues[iter][0];\n    vProbes_[index][probeIndex_][1]=vValues[iter][1];\n    vProbes_[index][probeIndex_][2]=vValues[iter][2];\n   }\n   else //The corresponding probe for this particle has to be created\n   {\n    vProbes_[index].push_back(new double[3]); //this pointer MUST be freed in the destructor\n    vProbes_[index].back()[0]=vValues[iter][0];\n    vProbes_[index].back()[1]=vValues[iter][1];\n    vProbes_[index].back()[2]=vValues[iter][2];\n   }\n  }\n  \n  //register scalar probes on the corresponding vector\n  forAll(sValues, iter)\n  {\n   if(probeIndex_<static_cast<int>(sProbes_[index].size())) //The corresponding probe for this particle already exists, values are overwritten.\n    sProbes_[index][probeIndex_]=sValues[iter];\n   else //The corresponding probe for this particle has to be created\n    sProbes_[index].push_back(sValues[iter]); \n  }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::writeProbe(int index, Field<scalar> sValues, Field<vector> vValues) const\n{\n    updateProbes(index,sValues,vValues); //update probe vectors\n   \n    if(printNow_ && checkIDForPrint(index) &&  verboseToFile_) \n    {\n        sPtr = sPtrList_[probeIndex_]; //set the pointer to the output file from list\n\n        //index and time\n        *sPtr <<    setprecision(IOstream::defaultPrecision()+7) ;\n        *sPtr << index  << \"   \" \n                << particleCloud_.mesh().time().value()  << \"   \" ;\n        *sPtr << \"||   \";\n        \n        //vectorFields\n        *sPtr <<    setprecision(writePrecision_) ;\n         forAll(vValues, iter)\n         {\n             // if(!probeDebug_ && iter>0) break;\n             *sPtr << vValues[iter][0] << \"   \";\n             *sPtr << vValues[iter][1] << \"   \";\n             *sPtr << vValues[iter][2] << \"   \"; \n          }\n\n        //scalarFields\n        if(probeDebug_)\n        {\n            *sPtr << \"||   \";\n            forAll(sValues, iter)\n            {\n                *sPtr << sValues[iter] << \"   \"; \n            }\n        }\n\n        if(includePosition_)\n        {\n            *sPtr << \"||   \";\n            *sPtr << particleCloud_.cfdemCloud::position(index)[0] << \"   \" \n                  << particleCloud_.cfdemCloud::position(index)[1] << \"   \"\n                  << particleCloud_.cfdemCloud::position(index)[2]\n                  << endl;\n        }\n        else *sPtr << endl;\n    }\n    \n    return;\n    \n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nbool particleProbe::checkIDForPrint(int index) const\n{\n  \n      bool sampleThisId_ = false;\n      if(sampleAll_) sampleThisId_ = true;\n      else\n      {\n            forAll(particleIDsToSample_, iSample)\n            {\n                  if(index==particleIDsToSample_[iSample]) sampleThisId_ = true;\n            }\n      }\n      return sampleThisId_;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\nvoid particleProbe::setCounter() const\n{\n\n    //reset or increment counter for printing to file \n    //Do only if called by first item in the list of items!\n    if(currItemId_==1)\n    {\n       printCounter_++;\n       if(printOnlyAt_==-1)\n       {\n        if(  printCounter_ >= printEvery_ )\n        {\n            printCounter_=0;\n            printNow_ = true;\n        }\n        else printNow_ = false;\n       }\n       else if(printCounter_==printOnlyAt_)\n       {\n        printNow_ = true;\n       }\n       else \n       {\n        printNow_ = false;\n       }\n    \n    }\n    return;    \n\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/particleProbe/particleProbe.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    particleProbe\n\nSourceFiles\n    particleProbe.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef particleProbe_H\n#define particleProbe_H\n\n#include \"probeModel.H\"\n#include \"fvCFD.H\"\n#include \"polyMesh.H\"\n#include \"cfdemCloud.H\"\n#include \"OFstream.H\"\n#include <vector>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class particleProbe Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass particleProbe\n:\n    public probeModel\n{\n\nprivate:\n\n    dictionary propsDict_;\n\n    mutable word name_;\n\n    cfdemCloud& particleCloud_;\n\n    bool verbose_;\n\n    bool verboseToFile_;\n\n    int writePrecision_;\n\n    word dirName_;\n\n    mutable int rank_;\n\n    mutable OFstream* sPtr;\n\n    int printEvery_;\n\n    bool sampleAll_;\n\n    bool probeDebug_;\n\n    bool includePosition_;\n\n    const labelList particleIDsToSample_;\n\n    mutable wordList itemsToSample_;\n\n    mutable List<OFstream*> sPtrList_;                      //Must delete elements in destructor\n\n    mutable int itemCounter_;\n\n    mutable int currItemId_;\n\n    mutable int printCounter_;\n\n    mutable bool printNow_;\n\n    mutable std::vector< std::vector<double> > sProbes_;\n    \n    mutable std::vector< std::vector<double*> > vProbes_;   //Must delete elements in destructor\n    \n    mutable  std::vector<std::string> probeName_;\n    \n    mutable int probeIndex_;\n    \n    mutable int printOnlyAt_;\n  \n    \npublic:\n\n    //- Runtime type information\n    TypeName(\"particleProbe\");\n\n\n    // Constructors\n\n        //- Construct from components\n        particleProbe\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            const word& typeName,\n            const char* logFileName\n        );\n\n    // Destructor\n\n        ~particleProbe();\n\n    // Member Functions\n    void updateProbes(int index, Field<scalar> sValues, Field<vector> vValues) const;\n    void initialize(const word& modelName, const word& logFileName) const;\n    void setOutputFile(const word& logFileName) const;\n    void writeHeader() const;\n    void writeProbe(int index, Field<scalar> sValues, Field<vector> vValues) const;\n    bool checkIDForPrint(int) const;\n    void setCounter() const;\n    void clearProbes() const;\n    std::vector< std::vector<double*> >* getVprobe() { return &vProbes_; };\n    std::vector< std::vector<double> >* getSprobe() {return &sProbes_; };\n    \n    \n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/newProbeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"probeModel.H\"\n#include \"particleProbe.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<probeModel> probeModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    const word& typeName,\n    const char* logFileName\n)\n{\n    word probeModelType\n    (\n        dict.lookup(\"probeModel\")\n    );\n\n    Info<< \"Selecting probeModel \"\n         << probeModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(probeModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"probeModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown probeModelType type \"\n            << probeModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid probeModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<probeModel>(cstrIter()(dict,sm,probeModelType,logFileName));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"probeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(probeModel, 0);\n\ndefineRunTimeSelectionTable(probeModel, dictionary);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nprobeModel::probeModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm,\n    const word& typeName,\n    const char* logFileName\n)\n:\n    dict_(dict),\n    particleCloud_(sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nprobeModel::~probeModel(){}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/probeModel/probeModel/probeModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    probeModel\n\nSourceFiles\n    probeModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef probeModel_H\n#define probeModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n#include <vector>\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class probeModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass probeModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        //- Class used for grouping field types\n        template<class Type>\n        class cfdemFieldGroup\n        :\n            public DynamicList<word>\n        {\n        public:\n            //- Construct null\n            cfdemFieldGroup()\n            :\n                DynamicList<word>(0)\n            {}\n\n        };\n\n\npublic:\n\n    // Variables\n    //- Categorized scalar/vector/tensor vol fields\n    mutable cfdemFieldGroup<scalar> scalarFields_;\n    mutable cfdemFieldGroup<vector> vectorFields_;\n\n    //- Runtime type information\n    TypeName(\"probeModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            probeModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm,\n                const word& typeName,\n                const char* logFileName\n            ),\n            (dict,sm,typeName,logFileName)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        probeModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            const word& typeName,\n            const char* logFileName\n        );\n\n\n    // Destructor\n\n        virtual ~probeModel();\n\n\n    // Selector\n\n        static autoPtr<probeModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm,\n            const word& typeName,\n            const char* logFileName\n        );\n\n    // Member Functions\n\n    virtual void initialize(const word& modelName, const word& logFileName) const {};\n    virtual void setOutputFile(const word& logFileName) const {};\n    virtual void writeHeader() const {};\n    virtual void writeProbe(int index, Field<scalar> sValues, Field<vector> vValues) const {};\n    virtual bool checkIDForPrint(int) const {return false;};\n    virtual void setCounter() const {};\n    virtual bool active() const {return true;}; \n    virtual std::vector< std::vector<double*> >* getVprobe() {return NULL;};\n    virtual std::vector< std::vector<double> >* getSprobe() {return NULL;};\n    virtual void clearProbes() const {};\n\n\n    // Access\n\n};\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/registryModel/defaultRegistry/defaultRegistry.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"defaultRegistry.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(defaultRegistry, 0);\n\naddToRunTimeSelectionTable\n(\n    registryModel,\n    defaultRegistry,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ndefaultRegistry::defaultRegistry\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    registryModel(dict,sm)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ndefaultRegistry::~defaultRegistry()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/registryModel/defaultRegistry/defaultRegistry.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    defaultRegistry\n\nSourceFiles\n    defaultRegistry.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef defaultRegistry_H\n#define defaultRegistry_H\n\n#include \"registryModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class defaultRegistry Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass defaultRegistry\n:\n    public registryModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"defaultRegistry\");\n\n\n    // Constructors\n\n        //- Construct from components\n        defaultRegistry\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~defaultRegistry();\n\n\n    // Member Functions\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/registryModel/registryModel/newRegistryModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"registryModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<registryModel> registryModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    // for now always use default model here without asking for dict entry\n    word registryModelType(\"defaultRegistry\");\n    /*word registryModelType\n    (\n        dict.lookup(\"registryModel\")\n    );\n\n    Info<< \"Selecting registryModel \"\n         << registryModelType << endl;*/\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(registryModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"registryModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown registryModelType type \"\n            << registryModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid registryModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<registryModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/registryModel/registryModel/registryModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"registryModel.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(registryModel, 0);\n\ndefineRunTimeSelectionTable(registryModel, dictionary);\n\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid registryModel::addProperty(word name, scalar value) const\n{\n    //Pout << \"trying to add the property\" << name << \" to registry, with a value of \" << value << endl;\n    int index(checkIfExists(name,value));\n    if(index > -1)\n    {\n        scalar newValue(max(value,valuesScalar_[index]));\n        valuesScalar_[index] = newValue;\n        //Pout << \"   the property \" << name << \" was found in registry, the value is updated (if bigger than old) to \" << newValue << endl;\n    }\n    else\n    {\n        namesScalar_.append(name);\n        valuesScalar_.append(value);\n        //Pout << \"   the property \" << name << \" is (NEW!!!) put to the registry, the value is set to \" << value << endl;\n    }\n}\n\nscalar registryModel::getProperty(word name) const\n{\n    //Pout << \"trying to receive the property\" << name << \" from the registry...\" << endl;\n    int index(checkIfExists(name,scalar(1.)));\n    if(index > -1)\n    {\n        //Pout << \"   the property\" << name << \" was found in registry, the value is \" << valuesScalar_[index] << endl;\n        return valuesScalar_[index];\n    }\n    else\n    {\n        //Pout << \"   the property\" << name << \" is not found in the registry!\" << endl;\n        return -1.; \n    }\n}\n\ninline int registryModel::checkIfExists(word name, scalar value) const\n{\n    for(int i=0;i<namesScalar_.size();i++)\n        if(namesScalar_[i]==name) return i;\n    return -1;\n}\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nregistryModel::registryModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    namesScalar_(0),\n    valuesScalar_(0)\n{}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nregistryModel::~registryModel()\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/registryModel/registryModel/registryModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    registryModel\n\nSourceFiles\n    registryModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef registryModel_H\n#define registryModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class registryModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass registryModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        mutable wordList namesScalar_;\n\n        mutable  scalarList valuesScalar_;\n\npublic:\n\n    friend class voidFractionModel;\n\n    //- Runtime type information\n    TypeName(\"registryModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            registryModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        registryModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~registryModel();\n\n\n    // Selector\n\n        static autoPtr<registryModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Member Functions\n\n    void addProperty(word,scalar) const;\n\n    scalar getProperty(word) const;\n\n    inline int checkIfExists(word,scalar) const;\n\n\n    // Access\n\n};\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/constDiffSmoothing/constDiffSmoothing.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n                                Copyright (C) 2013-     Graz University of  \n                                                        Technology, IPPT\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"constDiffSmoothing.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(constDiffSmoothing, 0);\n\naddToRunTimeSelectionTable\n(\n    smoothingModel,\n    constDiffSmoothing,\n    dictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nconstDiffSmoothing::constDiffSmoothing\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    smoothingModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    lowerLimit_(readScalar(propsDict_.lookup(\"lowerLimit\"))),\n    upperLimit_(readScalar(propsDict_.lookup(\"upperLimit\"))),\n    smoothingLength_(dimensionedScalar(\"smoothingLength\",dimensionSet(0,1,0,0,0,0,0), readScalar(propsDict_.lookup(\"smoothingLength\")))),\n    smoothingLengthReferenceField_(dimensionedScalar(\"smoothingLengthReferenceField\",dimensionSet(0,1,0,0,0,0,0), readScalar(propsDict_.lookup(\"smoothingLength\")))),\n    DT_(\"DT\", dimensionSet(0,2,-1,0,0), 0.),\n    verbose_(false)\n{\n\n    if(propsDict_.found(\"verbose\"))  \n        verbose_ = true;\n\n    if(propsDict_.found(\"smoothingLengthReferenceField\"))  \n       smoothingLengthReferenceField_.value() = double(readScalar(propsDict_.lookup(\"smoothingLengthReferenceField\")));\n\n    checkFields(sSmoothField_);\n    checkFields(vSmoothField_);\n}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nconstDiffSmoothing::~constDiffSmoothing()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\nbool constDiffSmoothing::doSmoothing() const\n{\n    return true;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid Foam::constDiffSmoothing::smoothen(volScalarField& fieldSrc) const\n{\n    // Create scalar smooth field from virgin scalar smooth field template\n    volScalarField sSmoothField = sSmoothField_;\n\n    sSmoothField.dimensions().reset(fieldSrc.dimensions());\n    sSmoothField ==fieldSrc;\n    sSmoothField.correctBoundaryConditions();\n    sSmoothField.oldTime().dimensions().reset(fieldSrc.dimensions());\n    sSmoothField.oldTime()=fieldSrc;\n    sSmoothField.oldTime().correctBoundaryConditions();\n\n    double deltaT = sSmoothField.mesh().time().deltaTValue();\n    DT_.value() = smoothingLength_.value() * smoothingLength_.value() / deltaT;\n\n    // do smoothing\n    solve\n    (\n        fvm::ddt(sSmoothField)\n       -fvm::laplacian(DT_, sSmoothField)\n    );\n\n    // bound sSmoothField_\n    forAll(sSmoothField,cellI)\n    {\n        sSmoothField[cellI]=max(lowerLimit_,min(upperLimit_,sSmoothField[cellI]));\n    }  \n\n    // get data from working sSmoothField - will copy only values at new time\n    fieldSrc=sSmoothField;\n    fieldSrc.correctBoundaryConditions(); \n\n    if(verbose_)\n    {\n        Info << \"min/max(fieldoldTime) (unsmoothed): \" << min(sSmoothField.oldTime()) << tab << max(sSmoothField.oldTime()) << endl;\n        Info << \"min/max(fieldSrc): \" << min(fieldSrc) << tab << max(fieldSrc) << endl;\n        Info << \"min/max(fieldSrc.oldTime): \" << min(fieldSrc.oldTime()) << tab << max(fieldSrc.oldTime()) << endl;\n    }\n\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid Foam::constDiffSmoothing::smoothen(volVectorField& fieldSrc) const\n{\n    // Create scalar smooth field from virgin scalar smooth field template\n    volVectorField vSmoothField = vSmoothField_;\n\n    vSmoothField.dimensions().reset(fieldSrc.dimensions());\n    vSmoothField=fieldSrc;\n    vSmoothField.correctBoundaryConditions();\n    vSmoothField.oldTime().dimensions().reset(fieldSrc.dimensions());\n    vSmoothField.oldTime()=fieldSrc;\n    vSmoothField.oldTime().correctBoundaryConditions();\n\n    double deltaT = vSmoothField_.mesh().time().deltaTValue();\n    DT_.value() = smoothingLength_.value() * smoothingLength_.value() / deltaT;\n\n    // do smoothing\n    solve\n    (\n        fvm::ddt(vSmoothField)\n       -fvm::laplacian(DT_, vSmoothField)\n    );\n\n    // get data from working vSmoothField\n    fieldSrc=vSmoothField;\n    fieldSrc.correctBoundaryConditions(); \n\n    if(verbose_)\n    {\n        Info << \"min/max(fieldoldTime) (unsmoothed): \" << min(vSmoothField.oldTime()) << tab << max(vSmoothField.oldTime()) << endl;\n        Info << \"min/max(fieldSrc): \" << min(fieldSrc) << tab << max(fieldSrc) << endl;\n        Info << \"min/max(fieldSrc.oldTime): \" << min(fieldSrc.oldTime()) << tab << max(fieldSrc.oldTime()) << endl;\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\nvoid Foam::constDiffSmoothing::smoothenReferenceField(volVectorField& fieldSrc) const\n{\n    // Create scalar smooth field from virgin scalar smooth field template\n    volVectorField vSmoothField = vSmoothField_;\n\n    vSmoothField.dimensions().reset(fieldSrc.dimensions());\n    vSmoothField=fieldSrc;\n    vSmoothField.correctBoundaryConditions();\n    vSmoothField.oldTime().dimensions().reset(fieldSrc.dimensions());\n    vSmoothField.oldTime()=fieldSrc;\n    vSmoothField.oldTime().correctBoundaryConditions();\n\n    double sourceStrength = 1e5; //large number to keep reference values constant\n\n    dimensionedScalar deltaT = vSmoothField.mesh().time().deltaT();\n    DT_.value() = smoothingLengthReferenceField_.value() \n                         * smoothingLengthReferenceField_.value() / deltaT.value();\n\n    volScalarField NLarge\n    (\n        IOobject\n        (\n            \"NLarge\",\n            particleCloud_.mesh().time().timeName(),\n            particleCloud_.mesh(),\n            IOobject::NO_READ,\n            IOobject::NO_WRITE\n        ),\n        particleCloud_.mesh(),\n        0.0\n    );\n\n\n    //loop over particles and map max particle diameter to Euler Grid\n    forAll(vSmoothField,cellI)\n    {\n        if ( mag(vSmoothField.oldTime().internalField()[cellI]) > 0.0f)  // have a vector in the OLD vSmoothField, so keep it!\n            NLarge[cellI] = sourceStrength;\n    }\n\n    // do the smoothing\n    solve\n    (\n        fvm::ddt(vSmoothField)\n       -fvm::laplacian( DT_, vSmoothField)\n       == \n        NLarge / deltaT * vSmoothField.oldTime()  //add source to keep cell values constant\n       -fvm::Sp( NLarge / deltaT, vSmoothField)   //add sink to keep cell values constant\n    );\n\n    // get data from working vSmoothField\n    fieldSrc=vSmoothField;\n    fieldSrc.correctBoundaryConditions(); \n\n    if(verbose_)\n    {\n        Info << \"min/max(fieldoldTime) (unsmoothed): \" << min(vSmoothField.oldTime()) << tab << max(vSmoothField.oldTime()) << endl;\n        Info << \"min/max(fieldSrc): \" << min(fieldSrc) << tab << max(fieldSrc) << endl;\n        Info << \"min/max(fieldSrc.oldTime): \" << min(fieldSrc.oldTime()) << tab << max(fieldSrc.oldTime()) << endl;\n    }\n\n}\n\ndimensionedScalar Foam::constDiffSmoothing::smoothingLength() const\n{\n    return smoothingLength_;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/constDiffSmoothing/constDiffSmoothing.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n                                Copyright (C) 2013-     Graz University of  \n                                                        Technology, IPPT\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    constDiffSmoothing\n\nSourceFiles\n    constDiffSmoothing.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef constDiffSmoothing_H\n#define constDiffSmoothing_H\n\n#include \"smoothingModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class constDiffSmoothing Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass constDiffSmoothing\n:\n    public smoothingModel\n{\n\nprivate:\n\n    dictionary propsDict_;\n    scalar lowerLimit_;\n    scalar upperLimit_;\n    dimensionedScalar smoothingLength_;\n    dimensionedScalar smoothingLengthReferenceField_;\n    mutable dimensionedScalar DT_;\n    bool verbose_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"constDiffSmoothing\");\n\n\n    // Constructors\n\n        //- Construct from components\n        constDiffSmoothing\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~constDiffSmoothing();\n\n\n    // Member Functions\n        bool doSmoothing() const;\n\n        //void dSmoothing(volScalarField&) const;\n        \n        void smoothen(volScalarField&) const;\n\n        void smoothen(volVectorField&) const;\n\n        void smoothenReferenceField(volVectorField&) const;\n\n        dimensionedScalar smoothingLength() const;\n\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/noSmoothing/noSmoothing.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noSmoothing.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noSmoothing, 0);\n\naddToRunTimeSelectionTable\n(\n    smoothingModel,\n    noSmoothing,\n    dictionary\n);\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoSmoothing::noSmoothing\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    smoothingModel(dict,sm)\n{}\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoSmoothing::~noSmoothing()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::noSmoothing::smoothen(volScalarField& field) const\n{}\n\nvoid Foam::noSmoothing::smoothen(volVectorField& field) const\n{}\n\nvoid Foam::noSmoothing::smoothenAbsolutField(volScalarField& field) const\n{}\n\nvoid Foam::noSmoothing::smoothenAbsolutField(volVectorField& field) const\n{}\n\nvoid Foam::noSmoothing::smoothenReferenceField(volVectorField& field) const\n{}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/noSmoothing/noSmoothing.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noSmoothing\n\nSourceFiles\n    noSmoothing.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noSmoothing_H\n#define noSmoothing_H\n\n#include \"smoothingModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noSmoothing Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noSmoothing\n:\n    public smoothingModel\n{\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"off\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noSmoothing\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noSmoothing();\n\n\n    // Member Functions\n        void smoothen(volScalarField&) const;\n\n        void smoothen(volVectorField&) const;\n\n        void smoothenAbsolutField(volScalarField&) const;\n\n        void smoothenAbsolutField(volVectorField&) const;\n\n        void smoothenReferenceField(volVectorField&) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/smoothingModel/newSmoothingModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"smoothingModel.H\"\n#include \"standardSearch.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<smoothingModel> smoothingModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word smoothingModelType\n    (\n        dict.lookup(\"smoothingModel\")\n    );\n\n    Info<< \"Selecting smoothingModel \"\n         << smoothingModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(smoothingModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"smoothingModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown smoothingModelType type \"\n            << smoothingModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid smoothingModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<smoothingModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/smoothingModel/smoothingModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#include \"error.H\"\r\n#include \"smoothingModel.H\"\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\r\n\r\ndefineTypeNameAndDebug(smoothingModel, 0);\r\n\r\ndefineRunTimeSelectionTable(smoothingModel, dictionary);\r\n\r\n// * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * //\r\n\r\n// * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * //\r\n\r\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\r\n\r\n// Construct from components\r\nFoam::smoothingModel::smoothingModel\r\n(\r\n    const dictionary& dict,\r\n    cfdemCloud& sm\r\n)\r\n:\r\n    dict_(dict),\r\n    particleCloud_(sm),\r\n    vSmoothField_\r\n    (   \r\n        IOobject\r\n        (\r\n            \"vSmoothField\",\r\n            particleCloud_.mesh().time().timeName(),\r\n            particleCloud_.mesh(),\r\n            IOobject::READ_IF_PRESENT,\r\n            IOobject::NO_WRITE\r\n        ),\r\n        particleCloud_.mesh(),\r\n        dimensionedVector(\"zero\", dimensionSet(0,0,0,0,0), vector::zero)\r\n    ),\r\n    sSmoothField_\r\n    (   \r\n        IOobject\r\n        (\r\n            \"sSmoothField\",\r\n            particleCloud_.mesh().time().timeName(),\r\n            particleCloud_.mesh(),\r\n            IOobject::READ_IF_PRESENT,\r\n            IOobject::NO_WRITE\r\n        ),\r\n        particleCloud_.mesh(),\r\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 0)\r\n    ),\r\n    smoothingLength_(dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 0))\r\n{}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\r\n\r\nFoam::smoothingModel::~smoothingModel()\r\n{}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nvoid smoothingModel::checkFields(volScalarField& sSmoothField_) const\r\n{\r\n    // currently it is detected if field was auto generated or defined\r\n    // improvement would be changing the type here automatically\r\n    forAll(sSmoothField_.boundaryField(),patchI)\r\n        if(sSmoothField_.boundaryField()[patchI].type()==\"calculated\")\r\n            FatalError <<\"Scalar field:\"<< sSmoothField_.name() << \" must be defined.\\n\" << abort(FatalError);\r\n\r\n    sSmoothField_.writeOpt() = IOobject::AUTO_WRITE;\r\n}\r\n\r\nvoid smoothingModel::checkFields(volVectorField& vSmoothField_) const\r\n{\r\n    // currently it is detected if field was auto generated or defined\r\n    // improvement would be changing the type here automatically\r\n    forAll(vSmoothField_.boundaryField(),patchI)      \r\n        if(vSmoothField_.boundaryField()[patchI].type()==\"calculated\")\r\n            FatalError <<\"Vector field:\"<< vSmoothField_.name() << \" must be defined.\\n\" << abort(FatalError);\r\n\r\n    vSmoothField_.writeOpt() = IOobject::AUTO_WRITE;\r\n}\r\n\r\n// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\r\nbool smoothingModel::doSmoothing() const\r\n{\r\n    return false;\r\n}\r\n\r\nvoid smoothingModel::dSmoothing() const\r\n{\r\n    // do nothing\r\n    //dSmooth *= 0.0;\r\n}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\nvoid smoothingModel::smoothenAbsolutField(volScalarField& scalField) const\r\n{\r\n\r\n    //1 - First make the field volume-specific\r\n    particleCloud_.makeSpecific(scalField);\r\n\r\n    //2 - smoothen now the volume-specific field (the volume integral of this field will be conserved!)\r\n    smoothen(scalField);\r\n\r\n    //3 - Finally, make field absolute again\r\n    particleCloud_.scaleWithVcell(scalField);\r\n}\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\nvoid smoothingModel::smoothenAbsolutField(volVectorField& vecField) const\r\n{\r\n\r\n    //1 - First make the field volume-specific\r\n    particleCloud_.makeSpecific(vecField);\r\n\r\n    //2 - smoothen now the volume-specific field (the volume integral of this field will be conserved!)\r\n    smoothen(vecField);\r\n\r\n    //3 - Finally, make field absolute again\r\n    particleCloud_.scaleWithVcell(vecField);\r\n}\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\ndimensionedScalar smoothingModel::smoothingLength() const\r\n{\r\n    return smoothingLength_;\r\n}\r\n\r\n} // End namespace Foam\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/smoothingModel/smoothingModel/smoothingModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\r\nClass\r\n    smoothingModel\r\n\r\nSourceFiles\r\n    smoothingModel.C\r\n\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#ifndef smoothingModel_H\r\n#define smoothingModel_H\r\n\r\n#include \"fvCFD.H\"\r\n#include \"cfdemCloud.H\"\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n/*---------------------------------------------------------------------------*\\\r\n                           Class smoothingModel Declaration\r\n\\*---------------------------------------------------------------------------*/\r\n\r\nclass smoothingModel\r\n{\r\nprotected:\r\n\r\n    // Protected data\r\n    const dictionary& dict_;\r\n    cfdemCloud& particleCloud_;\r\n\r\n    mutable volVectorField vSmoothField_;\r\n    mutable volScalarField sSmoothField_;\r\n\r\n    void checkFields(volScalarField&) const;\r\n    void checkFields(volVectorField&) const;\r\n\r\n    dimensionedScalar smoothingLength_;\r\n    \r\npublic:\r\n\r\n    //- Runtime type information\r\n    TypeName(\"smoothingModel\");\r\n\r\n    // Declare runtime constructor selection table\r\n\r\n        declareRunTimeSelectionTable\r\n        (\r\n            autoPtr,\r\n            smoothingModel,\r\n            dictionary,\r\n            (\r\n                const dictionary& dict,\r\n                cfdemCloud& sm\r\n            ),\r\n            (dict,sm)\r\n        );\r\n\r\n    // Constructors\r\n\r\n        //- Construct from components\r\n        smoothingModel\r\n        (\r\n            const dictionary& dict,\r\n            cfdemCloud& sm\r\n        );\r\n\r\n    // Destructor\r\n\r\n        virtual ~smoothingModel();\r\n\r\n    // Selector\r\n\r\n        static autoPtr<smoothingModel> New\r\n        (\r\n            const dictionary& dict,\r\n            cfdemCloud& sm\r\n        );\r\n\r\n    // Member Functions\r\n\r\n        virtual bool doSmoothing() const;\r\n\r\n        // the particle diameter for smoothing\r\n        virtual void dSmoothing() const;\r\n\r\n        virtual void smoothen(volScalarField&) const=0;\r\n\r\n        virtual void smoothen(volVectorField&) const=0;\r\n\r\n        virtual void smoothenAbsolutField(volScalarField&) const; //for smoothing absolute fields (NOT per m³)\r\n\r\n        virtual void smoothenAbsolutField(volVectorField&) const; //for smoothing absolute fields (NOT per m³)\r\n\r\n        virtual void smoothenReferenceField(volVectorField&) const=0;\r\n\r\n        virtual dimensionedScalar smoothingLength() const;\r\n};\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n} // End namespace Foam\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n#endif\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#include \"error.H\"\r\n\r\n#include \"GaussVoidFraction.H\"\r\n#include \"addToRunTimeSelectionTable.H\"\r\n#include \"locateModel.H\"\r\n#include \"dataExchangeModel.H\"\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\r\n\r\ndefineTypeNameAndDebug(GaussVoidFraction, 0);\r\n\r\naddToRunTimeSelectionTable\r\n(\r\n    voidFractionModel,\r\n    GaussVoidFraction,\r\n    dictionary\r\n);\r\n\r\n\r\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\r\n\r\n// Construct from components\r\nGaussVoidFraction::GaussVoidFraction\r\n(\r\n    const dictionary& dict,\r\n    cfdemCloud& sm\r\n)\r\n:\r\n    voidFractionModel(dict,sm),\r\n    propsDict_(dict.subDict(typeName + \"Props\")),\r\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\r\n    alphaLimited_(0)\r\n{\r\n    Info << \"\\n\\n W A R N I N G - do not use in combination with differentialRegion model! \\n\\n\" << endl;\r\n    FatalError << \"\\n\\n This model does not yet work properly - Eqns need to be revised!!! \\n\\n\" << abort(FatalError);\r\n    //reading maxCellsPerParticle from dictionary\r\n    maxCellsPerParticle_=readLabel(propsDict_.lookup(\"maxCellsPerParticle\"));\r\n    //particleCloud_.setMaxCellsPerParticle(readLabel(propsDict_.lookup(\"maxCellsPerParticle\"))); // alternative to line above\r\n    if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< \"alphaMin shloud be > 1 and < 0.01.\" << abort(FatalError); }\r\n\r\n    checkWeightNporosity(propsDict_);\r\n}\r\n\r\n\r\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\r\n\r\nGaussVoidFraction::~GaussVoidFraction()\r\n{}\r\n\r\n\r\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\r\n\r\nvoid GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\r\n{\r\n    reAllocArrays();\r\n\r\n    voidfractionNext_ == dimensionedScalar(\"one\", voidfractionNext_.dimensions(), 1.);\r\n\r\n    scalar radius(-1);\r\n    scalar volume(0);\r\n    scalar scaleVol= weight();\r\n    scalar scaleRadius = pow(porosity(),1./3.);\r\n\r\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\r\n    {\r\n        //if(mask[index][0])\r\n        //{\r\n            //reset\r\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\r\n            {\r\n                particleWeights[index][subcell]=0;\r\n                particleVolumes[index][subcell]=0;\r\n            }\r\n            cellsPerParticle_[index][0]=1.0;\r\n            particleV[index][0]=0;\r\n\r\n            //collecting data\r\n            label particleCenterCellID=particleCloud_.cfdemCloud::cellIDs()[index][0];\r\n            radius = particleCloud_.radius(index);\r\n            volume = 4./3.*M_PI*radius*radius*radius*scaleVol;\r\n            radius *= scaleRadius;\r\n            vector positionCenter=particleCloud_.cfdemCloud::position(index);\r\n\t        scalar core;\r\n\t        scalar dist;\r\n\r\n            if (particleCenterCellID >= 0)\r\n            {\r\n                labelHashSet hashSett;\r\n\r\n                //determining label and degree of coveredness of cells covered by the particle\r\n                buildLabelHashSet(radius*3.0, positionCenter, particleCenterCellID, hashSett);\r\n                  //Info << \"completeSize=\" << hashSett.size() << \", completeList =\\n\" << endl;\r\n                  //for(label i=0;i<hashSett.size();i++) Info << \" ,\" << hashSett.toc()[i] << endl;\r\n\r\n\r\n                //generating list with cell and subcells\r\n                scalar hashSetLength = hashSett.size();\r\n                if (hashSetLength > maxCellsPerParticle_)\r\n                {\r\n                    FatalError<< \"big particle algo found more cells (\"<< hashSetLength\r\n                              <<\") than storage is prepared (\"<<maxCellsPerParticle_<<\")\" << abort(FatalError);\r\n                }\r\n                else if (hashSetLength > 0)\r\n                {\r\n                    cellsPerParticle_[index][0]=hashSetLength;\r\n\r\n                    //making sure that the cell containing the center is the first subcell\r\n                    particleCloud_.cfdemCloud::cellIDs()[index][0]=particleCenterCellID;\r\n                    //deleting the cell containing the center of the particle\r\n                    hashSett.erase(particleCenterCellID);\r\n\r\n                    //==========================//\r\n                    //setting the voidfractions\r\n\r\n                    // ===\r\n\t\t            dist = mag(particleCloud_.mesh().C()[particleCenterCellID]-particleCloud_.cfdemCloud::position(index));\r\n\t\t            core = pow(2.0/radius/radius/M_PI,1.5)*exp(-dist*dist/2.0/radius/radius)*particleCloud_.mesh().V()[particleCenterCellID]; //TODO revise!!!\r\n\r\n                    // ===\r\n\r\n                    // volume occupied in every covered cell\r\n                    scalar occupiedVolume = volume*core;\r\n\r\n                    // correct volumefraction of centre\r\n                    voidfractionNext_[particleCenterCellID] -=occupiedVolume/particleCloud_.mesh().V()[particleCenterCellID];\r\n\r\n                    particleWeights[index][0] += core;\r\n                    particleVolumes[index][0] += occupiedVolume;\r\n                    particleV[index][0] += occupiedVolume;\r\n\r\n                      //Info << \"Centre:set voidfraction in cellI=\" << particleCenterCellID\r\n                      //     << \", voidfraction =\" << voidfractionNext_[particleCenterCellID] << endl;\r\n\r\n                    // correct volumefraction of sub-cells\r\n                    for(label i=0;i<hashSetLength-1;i++)\r\n                    {\r\n                        label cellI=hashSett.toc()[i];\r\n                        particleCloud_.cfdemCloud::cellIDs()[index][i+1]=cellI; //adding subcell represenation\r\n\r\n                        //===\r\n\t\t                dist = mag(particleCloud_.mesh().C()[cellI]-particleCloud_.cfdemCloud::position(index));\r\n\t\t                core = pow(2.0/radius/radius/M_PI,1.5)*exp(-dist*dist/2.0/radius/radius)*particleCloud_.mesh().V()[cellI]; //TODO revise!!!\r\n                        scalar occupiedVolume = volume*core;\r\n                        //===\r\n\r\n                        voidfractionNext_[cellI] -=occupiedVolume/particleCloud_.mesh().V()[cellI];\r\n                        particleWeights[index][i+1] += core;\r\n                        particleVolumes[index][i+1] += occupiedVolume;\r\n                        particleV[index][0] += occupiedVolume;\r\n\r\n                          //Info << \"AFTER:set voidfraction in cellI=\" << cellI\r\n                          //     << \", voidfraction =\" << voidfractionNext_[cellI] << endl;\r\n\r\n                    }\r\n\r\n                    // debug\r\n                    if(index==0)\r\n                    {\r\n                        Info << \"particle 0 is represented by \" << hashSetLength << \"cells\" << endl;\r\n                    }\r\n                    //==========================//\r\n                }//end cells found on this proc\r\n            }// end found cells\r\n        //}// end if masked\r\n    }// end loop all particles\r\n\r\n    //bringing eulerian field to particle array\r\n    for(label index=0; index< particleCloud_.numberOfParticles(); index++)\r\n    {\r\n        for(label subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\r\n        {\r\n            label cellID = particleCloud_.cfdemCloud::cellIDs()[index][subcell];\r\n\r\n            if(cellID >= 0)\r\n            {\r\n                 // limiting voidfraction\r\n                 if (voidfractionNext_[cellID] < alphaMin_) voidfractionNext_[cellID]=alphaMin_;\r\n\r\n                 // set particle based voidfraction\r\n                 voidfractions[index][subcell] = voidfractionNext_[cellID];\r\n                 //Info<<\"setting the voidfraction, index = \"<<index<<endl;\r\n            }\r\n            else\r\n            {\r\n                voidfractions[index][subcell] = -1.;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid GaussVoidFraction::buildLabelHashSet\r\n(\r\n    const scalar radius,\r\n    const vector position,\r\n    const label cellID,\r\n    labelHashSet& hashSett\r\n)const\r\n{\r\n    hashSett.insert(cellID);\r\n    //Info<<\"cell inserted\"<<cellID<<endl;\r\n    const labelList& nc = particleCloud_.mesh().cellCells()[cellID];\r\n    forAll(nc,i){\r\n        label neighbor=nc[i];\r\n        if(!hashSett.found(neighbor) && mag(position-particleCloud_.mesh().C()[neighbor])<radius){\r\n            buildLabelHashSet(radius,position,neighbor,hashSett);\r\n        }\r\n    }\r\n\r\n}\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n} // End namespace Foam\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/GaussVoidFraction/GaussVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\r\n    CFDEMcoupling - Open Source CFD-DEM coupling\r\n\r\n    CFDEMcoupling is part of the CFDEMproject\r\n    www.cfdem.com\r\n                                Christoph Goniva, christoph.goniva@cfdem.com\r\n                                Copyright 2009-2012 JKU Linz\r\n                                Copyright 2012-     DCS Computing GmbH, Linz\r\n-------------------------------------------------------------------------------\r\nLicense\r\n    This file is part of CFDEMcoupling.\r\n\r\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\r\n    under the terms of the GNU General Public License as published by the\r\n    Free Software Foundation; either version 3 of the License, or (at your\r\n    option) any later version.\r\n\r\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\r\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r\n    for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\r\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r\n\r\nDescription\r\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\r\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\r\n\r\n    Gaussian distributed particle voidfraction model\r\n    contribution from RQ\r\n\r\nClass\r\n    GaussVoidFraction\r\n\r\nSourceFiles\r\n    GaussVoidFraction.C\r\n\r\n\\*---------------------------------------------------------------------------*/\r\n\r\n#ifndef GaussVoidFraction_H\r\n#define GaussVoidFraction_H\r\n\r\n#include \"voidFractionModel.H\"\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\nnamespace Foam\r\n{\r\n\r\n/*---------------------------------------------------------------------------*\\\r\n                           Class noDrag Declaration\r\n\\*---------------------------------------------------------------------------*/\r\n\r\nclass GaussVoidFraction\r\n:\r\n    public voidFractionModel\r\n{\r\n\r\nprivate:\r\n        dictionary propsDict_;\r\n\r\n        const scalar alphaMin_;          //min value of voidFraction\r\n\r\n\t    mutable bool alphaLimited_;\r\n\r\npublic:\r\n\r\n    //- Runtime type information\r\n    TypeName(\"Gauss\");\r\n\r\n\r\n    // Constructors\r\n\r\n        //- Construct from components\r\n        GaussVoidFraction\r\n        (\r\n            const dictionary& dict,\r\n            cfdemCloud& sm\r\n        );\r\n\r\n    // Destructor\r\n\r\n        ~GaussVoidFraction();\r\n\r\n\r\n    // Member Functions\r\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\r\n\r\n        void buildLabelHashSet\r\n        (\r\n            const scalar radius,\r\n            const vector position,\r\n            const label cellID,\r\n            labelHashSet& hashSett\r\n            /*labelHashSet& hashSetComplete,\r\n            labelHashSet& hashSetPartial,\r\n            labelHashSet& hashSetRest*/\r\n        ) const;\r\n};\r\n\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n} // End namespace Foam\r\n\r\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\r\n\r\n#endif\r\n\r\n// ************************************************************************* //\r\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/IBVoidFraction/IBVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"IBVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"locateModel.H\"\n#include \"dataExchangeModel.H\"\n\n#include <mpi.h>\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(IBVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    IBVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nIBVoidFraction::IBVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\n    alphaLimited_(0),\n    scaleUpVol_(readScalar(propsDict_.lookup(\"scaleUpVol\"))),\n    sqrtThree_(sqrt(3.0))\n{\n    Info << \"\\n\\n W A R N I N G - do not use in combination with differentialRegion model! \\n\\n\" << endl;\n    //Info << \"\\n\\n W A R N I N G - this model does not yet work properly! \\n\\n\" << endl;\n    maxCellsPerParticle_=readLabel(propsDict_.lookup(\"maxCellsPerParticle\"));\n    //particleCloud_.setMaxCellsPerParticle(readLabel(propsDict_.lookup(\"maxCellsPerParticle\"))); // alternative to line above\n\n    if(scaleUpVol_ < 1){ FatalError<< \"scaleUpVol shloud be > 1.\"<< abort(FatalError); }\n    if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< \"alphaMin shloud be > 1 and < 0.01.\" << abort(FatalError); }\n    \n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nIBVoidFraction::~IBVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\n{\n\n    int numprocs, me;\n    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);\n    MPI_Comm_rank(MPI_COMM_WORLD, &me);\n    const boundBox& globalBb = particleCloud_.mesh().bounds();\n\n    reAllocArrays();\n\n    voidfractionNext_ == dimensionedScalar(\"one\", voidfractionNext_.dimensions(), 1.);\n\n    for(int index=0; index < particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            //reset\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n            {\n                particleWeights[index][subcell] = 0;\n                particleVolumes[index][subcell] = 0;\n            }\n            cellsPerParticle_[index][0]=1.0;\n            particleV[index][0]=0;\n\n            //collecting data\n            label particleCenterCellID = particleCloud_.cfdemCloud::cellIDs()[index][0];\n            scalar radius = particleCloud_.radius(index);\n            vector positionCenter = particleCloud_.cfdemCloud::position(index);\n\n            if (particleCenterCellID >= 0)\n            {\n                labelHashSet hashSett;\n\n                //compute the voidfraction for the cell \"particleCentreCellID\n                vector cellCentrePosition = particleCloud_.mesh().C()[particleCenterCellID];\n                scalar fc = pointInParticle(index, positionCenter, cellCentrePosition);\n\n                vector minPeriodicParticlePos=positionCenter;\n                if(particleCloud_.checkPeriodicCells()) //consider minimal distance to all periodic images of this particle\n                {\n                    fc = minPeriodicDistance(index,cellCentrePosition, positionCenter, globalBb,\n                                             minPeriodicParticlePos,\n                                             particleCloud_.wall_periodicityCheckRange());\n                }\n                scalar centreDist=mag(cellCentrePosition-minPeriodicParticlePos);\n                scalar corona = 0.5*sqrtThree_*cbrt(particleCloud_.mesh().V()[particleCenterCellID]);\n                vector coronaPoint = cellCentrePosition;\n                if(centreDist > 0.0)\n                  coronaPoint = cellCentrePosition + (cellCentrePosition - minPeriodicParticlePos) * (corona / centreDist);\n\n                if(pointInParticle(index, minPeriodicParticlePos, coronaPoint) < 0.0)\n                {\n                    voidfractionNext_[particleCenterCellID] = 0;\n                }\n                else\n                {\n                    const labelList& vertices = particleCloud_.mesh().cellPoints()[particleCenterCellID];\n                    int nn = 0.0;\n                    forAll(vertices, i) nn ++;\n\n                    double ratio = 0.125; //1.0 / static_cast<double>(nn);\n                    forAll(vertices, i)\n                    {\n                        vector vertexPosition = particleCloud_.mesh().points()[vertices[i]];\n                        scalar fv = pointInParticle(index, positionCenter, vertexPosition);\n                        if(particleCloud_.checkPeriodicCells()) { //consider minimal distance to all periodic images of this particle\n                            fv = minPeriodicDistance(index,vertexPosition, positionCenter, globalBb, \n                                                     minPeriodicParticlePos,\n                                                     particleCloud_.wall_periodicityCheckRange());\n                        }\n                        if(fc < 0.0 &&  fv < 0.0)\n                            voidfractionNext_[particleCenterCellID]-=ratio;\n                        else if(fc < 0.0 && fv > 0.0) {\n                            //compute lambda\n                            scalar lambda = segmentParticleIntersection(index, minPeriodicParticlePos, cellCentrePosition, vertexPosition);\n                            voidfractionNext_[particleCenterCellID] -= ratio*lambda;\n                        } else if(fc > 0.0 && fv < 0.0) {\n                            //compute lambda\n                            scalar lambda = segmentParticleIntersection(index, minPeriodicParticlePos, vertexPosition, cellCentrePosition);\n                            voidfractionNext_[particleCenterCellID] -= ratio*lambda;\n                        }\n                    }\n                } //end particle partially overlapping with cell\n\n                //generating list with cell and subcells\n                buildLabelHashSet(index,minPeriodicParticlePos, particleCenterCellID, hashSett, true);\n\n                //Add cells of periodic particle images on same processor\n                if(particleCloud_.checkPeriodicCells())\n                {\n                  int doPeriodicImage[3];\n                  for(int iDir=0;iDir<3;iDir++)\n                  {\n                    doPeriodicImage[iDir]= 0;\n                    if( (minPeriodicParticlePos[iDir]+radius)>globalBb.max()[iDir] && particleCloud_.wall_periodicityCheckRange(iDir)>0)\n                    {\n                       doPeriodicImage[iDir] =-1;\n                    }\n                    if( (minPeriodicParticlePos[iDir]-radius)<globalBb.min()[iDir] && particleCloud_.wall_periodicityCheckRange(iDir)>0)\n                    {\n                         doPeriodicImage[iDir] = 1;\n                    }\n                  }\n                  //scan directions and map particles\n                  List<vector> particlePosList;         //List of particle center position\n                  List<label>  particleLabelList;\n\n                  int copyCounter=0;\n                  // Note: for other than ext one could use xx.append(x)\n                  // instead of setSize\n                  particlePosList.setSize(particlePosList.size()+1, minPeriodicParticlePos);\n\n                  //x-direction\n                  if(doPeriodicImage[0]!=0) {\n                    particlePosList.setSize(particlePosList.size()+1, particlePosList[copyCounter]\n                                              + vector(\n                                                               static_cast<double>(doPeriodicImage[0])\n                                                              *(globalBb.max()[0]-globalBb.min()[0]),\n                                                              0.0,\n                                                              0.0)\n                                               );\n                    copyCounter++;\n                  }\n                  //y-direction\n                  int currCopyCounter=copyCounter;\n                  if(doPeriodicImage[1]!=0) {\n                    for(int yDirCop=0; yDirCop<=currCopyCounter; yDirCop++) {\n                      particlePosList.setSize(particlePosList.size()+1, particlePosList[yDirCop]\n                          + vector(\n                                                              0.0,\n                                                               static_cast<double>(doPeriodicImage[1])\n                                                              *(globalBb.max()[1]-globalBb.min()[1]),\n                                                              0.0)\n                                               );\n                      copyCounter++;\n                     }\n                  }\n                  //z-direction\n                  currCopyCounter=copyCounter;\n                  if(doPeriodicImage[2]!=0) {\n                    for(int zDirCop=0; zDirCop<=currCopyCounter; zDirCop++) {\n                      particlePosList.setSize(particlePosList.size()+1, particlePosList[zDirCop]\n                          + vector(\n                                                              0.0,\n                                                              0.0,\n                                                               static_cast<double>(doPeriodicImage[2])\n                                                              *(globalBb.max()[2]-globalBb.min()[2])\n                                                              )\n                                               );\n                       copyCounter++;\n                     }\n                 }\n\n                  //add the nearest cell labels\n                  particleLabelList.setSize(particleLabelList.size()+1,particleCenterCellID);\n                  for(int iPeriodicImage=1;iPeriodicImage<=copyCounter; iPeriodicImage++)\n                  {\n                    label partCellId =\n\n                        particleCloud_.mesh().findNearestCell(particlePosList[iPeriodicImage]);\n                    particleLabelList.setSize(particleLabelList.size()+1,partCellId);\n\n                    buildLabelHashSet(index,particlePosList[iPeriodicImage], particleLabelList[iPeriodicImage], hashSett, false);\n                  }\n                } //end particleCloud_.checkPeriodicCells()\n\n                scalar hashSetLength = hashSett.size();\n                if (hashSetLength > maxCellsPerParticle_) {\n                    FatalError<< \"big particle algo found more cells (\"<< hashSetLength \n                              <<\") than storage is prepared (\"<<maxCellsPerParticle_<<\")\" << abort(FatalError);\n                } else if (hashSetLength > 0) {\n                  cellsPerParticle_[index][0]=hashSetLength;\n                  hashSett.erase(particleCenterCellID);\n\n                  for(label i=0;i<hashSetLength-1;i++) {\n                    label cellI=hashSett.toc()[i];\n                    particleCloud_.cfdemCloud::cellIDs()[index][i+1]=cellI; //adding subcell represenation\n                  }\n                }//end cells found on this proc\n            }// end found cells\n        //}// end if masked\n    }// end loop all particles\n\n    for(label index=0; index < particleCloud_.numberOfParticles(); index++) {\n      for(label subcell=0;subcell<cellsPerParticle_[index][0];subcell++) {\n        label cellID = particleCloud_.cfdemCloud::cellIDs()[index][subcell];\n\n        if(cellID >= 0) {\n          if(voidfractionNext_[cellID] < 0.0)\n            voidfractionNext_[cellID] = 0.0;\n          voidfractions[index][subcell] = voidfractionNext_[cellID];\n        } else {\n          voidfractions[index][subcell] = -1.;\n        }\n      }\n    }\n}\n\nvoid IBVoidFraction::buildLabelHashSet\n(\n    int index,\n    const vector position,\n    const label cellID,\n    labelHashSet& hashSett, \n    bool initialInsert //initial insertion of own cell\n)const\n{   \n\n    int me;\n    MPI_Comm_rank(MPI_COMM_WORLD, &me);\n\n    if(initialInsert) hashSett.insert(cellID);\n\n    const labelList& nc = particleCloud_.mesh().cellCells()[cellID];\n    forAll(nc,i) {\n        label neighbor=nc[i];\n        vector cellCentrePosition = particleCloud_.mesh().C()[neighbor];\n        scalar centreDist = mag(cellCentrePosition-position);\n        scalar fc = pointInParticle(index, position, cellCentrePosition);\n        scalar corona = 0.5*sqrtThree_*cbrt(particleCloud_.mesh().V()[neighbor]);\n\n        vector coronaPoint = cellCentrePosition;\n        if(centreDist > 0.0)\n          coronaPoint = cellCentrePosition + (cellCentrePosition - position) * (corona / centreDist);\n        \n        if(!hashSett.found(neighbor) && pointInParticle(index, position, coronaPoint) < 0.0){\n            voidfractionNext_[neighbor] = 0;\n            buildLabelHashSet(index, position, neighbor, hashSett, true);\n        }\n        else if(!hashSett.found(neighbor)) {\n            scalar scale = 1.0;\n            int nn = 0.0;\n            const labelList& vertexPoints = particleCloud_.mesh().cellPoints()[neighbor];\n            forAll(vertexPoints, i) {\n              nn ++;\n            }\n            double ratio = 0.125; //1.0 / static_cast<double>(nn);\n\n            forAll(vertexPoints, j) {\n                vector vertexPosition = particleCloud_.mesh().points()[vertexPoints[j]];\n                scalar fv = pointInParticle(index, position, vertexPosition);\n\n                if (fc < 0.0) {\n                    if (fv < 0.0) scale -= ratio;\n                    else {\n                      //compute lambda\n                      scalar lambda = segmentParticleIntersection(index, position, cellCentrePosition, vertexPosition);\n                      scale -=lambda * ratio;\n                    }\n                }\n                else if (fv < 0.0) {\n                  //compute lambda\n                  scalar lambda = segmentParticleIntersection(index, position, vertexPosition, cellCentrePosition);\n                  scale -= lambda * ratio;\n                }\n            }\n            if(scale < 0.0)\n              scale = 0.0;\n\n            if(voidfractionNext_[neighbor]==1) voidfractionNext_[neighbor] = scale;\n            else {\n              voidfractionNext_[neighbor] -= (1.0 - scale);\n              if(voidfractionNext_[neighbor]<0) voidfractionNext_[neighbor] = 0;\n            }\n            if(!(scale == 1))  buildLabelHashSet(index,position,neighbor,hashSett, true);\n        }\n    }\n}\n\ndouble IBVoidFraction::segmentParticleIntersection(int index, vector positionCenter, vector pointInside, vector pointOutside) const\n{\n  scalar radius =  particleCloud_.radius(index);\n  scalar a = (pointOutside - pointInside)&(pointOutside - pointInside);\n  scalar b = 2.*(pointOutside - pointInside)&(pointInside - positionCenter);\n  scalar c = ((pointInside - positionCenter)&(pointInside - positionCenter)) - radius*radius;\n  scalar lambda_ = 0.0;\n  scalar lambda = 0.0;\n  scalar D = b*b - 4.0*a*c;\n  double eps = 1e-12;\n  if(D >= 0.0) {\n    double sqrtD = sqrt(D);\n    lambda_ = (-b + sqrtD)/(2.0*a);\n    if(lambda_ >= -eps && lambda_ <= 1.0+eps)\n      lambda = lambda_;\n    else {\n      lambda_ = (-b - sqrtD)/(2.0*a);\n      if(lambda_ >= -eps && lambda_ <= 1.0+eps)\n        lambda = lambda_;\n    }\n  }\n\n  if(lambda < 0.0)\n    lambda = 0.0;\n  if(lambda > 1.0)\n    lambda = 1.0;\n  return lambda;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/IBVoidFraction/IBVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    void fraction model for the smooth representation of spheres with \n    radius > cell length.\n    contribution from Alice Hager\n\nClass\n    IBVoidFraction\n\nSourceFiles\n    IBVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef IBVoidFraction_H\n#define IBVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass IBVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n        dictionary propsDict_;\n\n        const scalar alphaMin_;          //NP min value of voidFraction\n\n        mutable bool alphaLimited_;\n\n        const scalar scaleUpVol_;        //NP scaling radius, keeping volume of particle\n        \n        const scalar sqrtThree_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"IB\");\n\n\n    // Constructors\n\n        //- Construct from components\n        IBVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~IBVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n\n        void buildLabelHashSet\n        (\n            int index,\n            const vector position,\n            const label cellID,\n            labelHashSet& hashSett,\n            bool          initialInsert\n        ) const;\n        \n\n        virtual double segmentParticleIntersection(int index, vector positionCenter, vector pointInside, vector pointOutside) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"bigParticleVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n#include \"locateModel.H\"\n#include \"dataExchangeModel.H\"\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(bigParticleVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    bigParticleVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nbigParticleVoidFraction::bigParticleVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\n    alphaLimited_(0)\n{\n    Info << \"\\n\\n W A R N I N G - do not use in combination with differentialRegion model! \\n\\n\" << endl;\n    Info << \"\\n\\n W A R N I N G - this model does not yet work properly! \\n\\n\" << endl;\n    //reading maxCellsPerParticle from dictionary\n    maxCellsPerParticle_=readLabel(propsDict_.lookup(\"maxCellsPerParticle\"));\n    //particleCloud_.setMaxCellsPerParticle(readLabel(propsDict_.lookup(\"maxCellsPerParticle\"))); // alternative to line above\n    if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< \"alphaMin shloud be > 1 and < 0.01.\" << abort(FatalError); }\n\n    checkWeightNporosity(propsDict_);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nbigParticleVoidFraction::~bigParticleVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\n{\n    reAllocArrays();\n\n    voidfractionNext_ == dimensionedScalar(\"one\", voidfractionNext_.dimensions(), 1.);\n\n    scalar radius(-1);\n    scalar volume(0);\n    scalar scaleVol= weight();\n    scalar scaleRadius = pow(porosity(),1./3.);\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            //reset\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n            {\n                particleWeights[index][subcell]=0;\n                particleVolumes[index][subcell]=0;\n            }\n            cellsPerParticle_[index][0]=1.0;\n            particleV[index][0]=0;\n\n            //collecting data\n            label particleCenterCellID=particleCloud_.cfdemCloud::cellIDs()[index][0];\n            radius = particleCloud_.radius(index);\n            volume = 4./3.*M_PI*radius*radius*radius*scaleVol;\n            radius *= scaleRadius;\n            vector positionCenter=particleCloud_.cfdemCloud::position(index);\n\n            if (particleCenterCellID >= 0)\n            {\n                labelHashSet hashSett;\n\n                //determining label and degree of coveredness of cells covered by the particle\n                buildLabelHashSet(radius, positionCenter, particleCenterCellID, hashSett);\n                  //Info << \"completeSize=\" << hashSett.size() << \", completeList =\\n\" << endl;\n                  //for(label i=0;i<hashSett.size();i++) Info << \" ,\" << hashSett.toc()[i] << endl;\n\n\n                //generating list with cell and subcells\n                scalar hashSetLength = hashSett.size();\n                if (hashSetLength > maxCellsPerParticle_)\n                {\n                    FatalError<< \"big particle algo found more cells (\"<< hashSetLength\n                              <<\") than storage is prepared (\"<<maxCellsPerParticle_<<\")\" << abort(FatalError);\n                }\n                else if (hashSetLength > 0)\n                {\n                    cellsPerParticle_[index][0]=hashSetLength;\n\n                    //making sure that the cell containing the center is the first subcell\n                    particleCloud_.cfdemCloud::cellIDs()[index][0]=particleCenterCellID;\n                    //deleting the cell containing the center of the particle\n                    hashSett.erase(particleCenterCellID);\n\n                    //==========================//\n                    //setting the voidfractions\n\n                    // volume occupied in every covered cell\n                    scalar occupiedVolume = volume/hashSetLength;\n\n                    // correct volumefraction of centre\n                    voidfractionNext_[particleCenterCellID] -=occupiedVolume/particleCloud_.mesh().V()[particleCenterCellID];\n\n                    particleWeights[index][0] += 1.0/hashSetLength;\n                    particleVolumes[index][0] += occupiedVolume;\n                    particleV[index][0] += occupiedVolume;\n\n                      //Info << \"Centre:set voidfraction in cellI=\" << particleCenterCellID\n                      //     << \", voidfraction =\" << voidfractionNext_[particleCenterCellID] << endl;\n\n                    // correct volumefraction of sub-cells\n                    for(label i=0;i<hashSetLength-1;i++)\n                    {\n                        label cellI=hashSett.toc()[i];\n                        particleCloud_.cfdemCloud::cellIDs()[index][i+1]=cellI; //adding subcell represenation\n\n                        voidfractionNext_[cellI] -=occupiedVolume/particleCloud_.mesh().V()[cellI];\n                        particleWeights[index][i+1] += 1.0/hashSetLength;\n                        particleVolumes[index][i+1] += occupiedVolume;\n                        particleV[index][0] += occupiedVolume;\n\n                          //Info << \"AFTER:set voidfraction in cellI=\" << cellI\n                          //     << \", voidfraction =\" << voidfractionNext_[cellI] << endl;\n\n                    }\n\n                    // debug\n                    if(index==0)\n                    {\n                        Info << \"particle 0 is represented by \" << hashSetLength << \"cells\" << endl;\n                    }\n                    //==========================//\n                }//end cells found on this proc\n            }// end found cells\n        //}// end if masked\n    }// end loop all particles\n\n    //bringing eulerian field to particle array\n    for(label index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        for(label subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n        {\n            label cellID = particleCloud_.cfdemCloud::cellIDs()[index][subcell];\n\n            if(cellID >= 0)\n            {\n                 // limiting voidfraction\n                 if (voidfractionNext_[cellID] < alphaMin_) voidfractionNext_[cellID]=alphaMin_;\n\n                 // set particle based voidfraction\n                 voidfractions[index][subcell] = voidfractionNext_[cellID];\n                 //Info<<\"setting the voidfraction, index = \"<<index<<endl;\n            }\n            else\n            {\n                voidfractions[index][subcell] = -1.;\n            }\n        }\n    }\n}\n\nvoid bigParticleVoidFraction::buildLabelHashSet\n(\n    const scalar radius,\n    const vector position,\n    const label cellID,\n    labelHashSet& hashSett\n)const\n{\n    hashSett.insert(cellID);\n    //Info<<\"cell inserted\"<<cellID<<endl;\n    const labelList& nc = particleCloud_.mesh().cellCells()[cellID];\n    forAll(nc,i){\n        label neighbor=nc[i];\n        if(!hashSett.found(neighbor) && mag(position-particleCloud_.mesh().C()[neighbor])<radius){\n            buildLabelHashSet(radius,position,neighbor,hashSett);\n        }\n    }\n\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/bigParticleVoidFraction/bigParticleVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    bigParticleVoidFraction\n\nSourceFiles\n    bigParticleVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef bigParticleVoidFraction_H\n#define bigParticleVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass bigParticleVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n        dictionary propsDict_;\n\n        const scalar alphaMin_;          // min value of voidFraction\n\n        mutable bool alphaLimited_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"bigParticle\");\n\n\n    // Constructors\n\n        //- Construct from components\n        bigParticleVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~bigParticleVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n\n        void buildLabelHashSet\n        (\n            const scalar radius,\n            const vector position,\n            const label cellID,\n            labelHashSet& hashSett\n            /*labelHashSet& hashSetComplete,\n            labelHashSet& hashSetPartial,\n            labelHashSet& hashSetRest*/\n        ) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"centreVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(centreVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    centreVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ncentreVoidFraction::centreVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\n    alphaLimited_(0)\n{\n    checkWeightNporosity(propsDict_);\n\n    if(porosity()!=1) FatalError << \"porosity not used in centreVoidFraction\" << abort(FatalError);\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ncentreVoidFraction::~centreVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\n{\n    reAllocArrays();\n\n    scalar volume(0);\n    scalar cellVol(0);\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        //if(mask[index][0])\n        //{\n            // reset\n            particleWeights[index][0]=0;\n            cellsPerParticle_[index][0]=1;\n\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n            if (cellI >= 0)  // particel centre is in domain\n            {\n                cellVol = voidfractionNext_.mesh().V()[cellI];\n                volume = particleCloud_.particleVolumeScaled(index, volScale());\n\n                // store volume for each particle\n                particleVolumes[index][0] = volume;\n                particleV[index][0] = volume;\n\n                voidfractionNext_[cellI] -= volume/cellVol;\n\n                if(voidfractionNext_[cellI] < alphaMin_ )\n                {\n                    voidfractionNext_[cellI] = alphaMin_;\n                    alphaLimited_ = 1;\n                }\n\n                if(index==0 && alphaLimited_) Info<<\"alpha limited to\" <<alphaMin_<<endl;\n\n                // store voidFraction for each particle\n                voidfractions[index][0] = voidfractionNext_[cellI];\n\n                // store cellweight for each particle  - this should not live here\n                particleWeights[index][0] = 1;\n\n                //===\n                label subPoint(0);\n                label partCellId=cellI;\n                vector subPosition=particleCloud_.cfdemCloud::position(index);\n                vector offset(0,0,0);\n                scalar subPointDiameter=particleCloud_.diameter(index); // this is different than radius for convex as d is calculated from volume\n                particleCloud_.setMpData(subPoint, index, partCellId, subPosition, offset, subPointDiameter);\n                //===\n\n                /*//OUTPUT\n                if (index==0)\n                {\n                    Info << \"centre cellI = \" << cellI << endl;\n                    Info << \"cellsPerParticle_=\" << cellsPerParticle_[index][0] << endl;\n\n                    for(int i=0;i<cellsPerParticle_[index][0];i++)\n                    {\n                       if(i==0)Info << \"cellids, voidfractions, particleWeights, : \\n\";\n                       Info << particleCloud_.cfdemCloud::cellIDs()[index][i] << \" ,\" << endl;\n                       Info << voidfractions[index][i] << \" ,\" << endl;\n                       Info << particleWeights[index][i] << \" ,\" << endl;\n                     }\n                }*/\n            }\n        //}\n    }\n    voidfractionNext_.correctBoundaryConditions();\n\n    // bring voidfraction from Eulerian Field to particle array\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        label cellID = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if(cellID >= 0)\n        {\n            voidfractions[index][0] = voidfractionNext_[cellID];\n        }\n        else\n        {\n            voidfractions[index][0] = -1.;\n        }\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/centreVoidFraction/centreVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    centreVoidFraction\n\nSourceFiles\n    centreVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef centreVoidFraction_H\n#define centreVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass centreVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n        dictionary propsDict_;\n\n        const scalar alphaMin_;          //NP min value of voidFraction\n\n\tmutable bool alphaLimited_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"centre\");\n\n\n    // Constructors\n\n        //- Construct from components\n        centreVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~centreVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"dividedVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(dividedVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    dividedVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ndividedVoidFraction::dividedVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    verbose_(false),\n    procBoundaryCorrection_(propsDict_.lookupOrDefault<Switch>(\"procBoundaryCorrection\", false)),\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\n    alphaLimited_(0),\n    tooMuch_(0.0),\n    interpolation_(propsDict_.lookupOrDefault<Switch>(\"interpolation\",false)),\n    cfdemUseOnly_(false)\n{\n    maxCellsPerParticle_ = 29;\n    //particleCloud_.setMaxCellsPerParticle(29);\n\n    if (alphaMin_ > 1 || alphaMin_ < 0.01)\n        FatalError<< \"alphaMin should be < 1 and > 0.01 !\" << abort(FatalError);\n    if (interpolation_==true){\n        Warning << \"interpolation for dividedVoidFraction does not yet work correctly!\" << endl;\n        Info << \"Using interpolated voidfraction field - do not use this in combination with interpolation in drag model!\"<< endl;\n    }\n\n    checkWeightNporosity(propsDict_);\n\n    if (propsDict_.found(\"verbose\")) verbose_=true;\n\n    if (propsDict_.found(\"cfdemUseOnly\"))\n    {\n        cfdemUseOnly_ = readBool(propsDict_.lookup(\"cfdemUseOnly\"));\n    }\n\n    // check if settings are consistent with locate model selected\n    if (procBoundaryCorrection_)\n    {\n        if(!(particleCloud_.locateM().type()==\"engineIB\"))\n        {\n            FatalError << typeName << \": You are requesting procBoundaryCorrection, this requires the use of engineIB!\\n\"\n                       << abort(FatalError);\n        }\n    }\n    else\n    {\n        if(particleCloud_.locateM().type()==\"engineIB\")\n        {\n            FatalError << typeName << \": You are using engineIB, this requires using procBoundaryCorrection=true!\\n\"\n                       << abort(FatalError);\n            //Warning << \"You are trying to use engineIB, this requires using procBoundaryCorrection=true\\n\"\n            //        << \"  procBoundaryCorrection will be used!\\n\" << endl;\n            //procBoundaryCorrection_ = true;\n        }\n    }\n\n    //generate marker points\n    // for 2 different radii\n    double r1 = cbrt(1.0/29.0);\n    double r2 = cbrt(15.0/29.0);\n    scalar r[] = { 0.75* (r2*r2*r2*r2 - r1*r1*r1*r1)/(r2*r2*r2 - r1*r1*r1),\n                   0.75* (1.0 - r2*r2*r2*r2)/(1.0 - r2*r2*r2) };\n\n    initOffsets(r);\n}\n\nvoid dividedVoidFraction::MSinit()\n{\n    Info << type() << \": activating multisphere mode...\" << endl;\n    if(particleCloud_.shapeTypeName() == \"multisphere\") msMode_ = true;\n\n    scalar r[] = { 0.623926, 0.623926 + 0.293976 };\n    initOffsets(r);\n}\n\nvoid dividedVoidFraction::initOffsets(const scalar *r)\n{\n    int m = 0;\n    offsets[m][0] = offsets[m][1] = offsets[m][2] = 0.0;\n    m ++;\n\n    for(label ir = 0; ir <= 1; ir += 1)\n    {\n        // try 8 subpoint derived from spherical coordinates\n        for (scalar zeta = 0.25*M_PI; zeta < 2.0*M_PI; zeta += 0.5*M_PI)\n        {\n            for (scalar theta = 0.25*M_PI; theta < M_PI; theta += 0.5*M_PI)\n            {\n                offsets[m][0] = r[ir]*Foam::sin(theta)*Foam::cos(zeta);\n                offsets[m][1] = r[ir]*Foam::sin(theta)*Foam::sin(zeta);\n                offsets[m][2] = r[ir]*Foam::cos(theta);\n                m ++;\n            }\n        }\n        // try 2 more subpoints for each coordinate direction (6 total)\n        for (int j = -1; j <= 1; j += 2)\n        {\n            offsets[m][0] = r[ir]*static_cast<double>(j);\n            offsets[m][1] = 0.;\n            offsets[m][2] = 0.;\n            m ++;\n\n            offsets[m][0] = 0.;\n            offsets[m][1] = r[ir]*static_cast<double>(j);\n            offsets[m][2] = 0.;\n            m ++;\n\n            offsets[m][0] = 0.;\n            offsets[m][1] = 0.;\n            offsets[m][2] = r[ir]*static_cast<double>(j);\n            m ++;\n        }\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ndividedVoidFraction::~dividedVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid dividedVoidFraction::setvoidFraction\n(\n    double** const& mask,\n    double**& voidfractions,\n    double**& particleWeights,\n    double**& particleVolumes,\n    double**& particleV\n) const\n{\n    if(cfdemUseOnly_)\n        reAllocArrays(particleCloud_.numberOfParticles());\n    else\n        reAllocArrays();\n\n    vector position(0.,0.,0.);\n    label cellID = -1;\n    scalar radius(-1.);\n    scalar volume(0.);\n    scalar cellVol(0.);\n    scalar scaleRadius(0);\n    if (msMode_)\n        scaleRadius = 1;\n    else\n        scaleRadius = cbrt(porosity());\n    const boundBox& globalBb = particleCloud_.mesh().bounds();\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(!checkParticleType(index)) continue; //skip this particle if not correct type\n\n        //if(mask[index][0])\n        //{\n            // reset\n\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n            {\n                particleWeights[index][subcell] = 0.;\n                particleVolumes[index][subcell] = 0.;\n            }\n            particleV[index][0] = 0.;\n            cellsPerParticle_[index][0] = 1.;\n\n            if (msMode_)\n            {\n                label clumpID = particleCloud_.clumpIndexOfParticle(index);\n                if (clumpID < 0)\n                    continue;\n                label clumpType = particleCloud_.clumpType(clumpID);\n                if (clumpType <= 0) //clump does not exist\n                    continue;\n            }\n\n            position = particleCloud_.cfdemCloud::position(index);\n            cellID = particleCloud_.cfdemCloud::cellIDs()[index][0];\n            radius = particleCloud_.radius(index);\n            volume = particleCloud_.particleVolumeScaled(index, volScale());\n            radius *= scaleRadius;\n            cellVol = 0.;\n\n            //--variables for sub-search\n            int nPoints = numberOfMarkerPoints;\n            int nNotFound=0,nUnEqual=0,nTotal=0;\n            vector offset(0.,0.,0.);\n            int cellsSet = 0;\n\n            label cellWithCenter(-1);\n            if(procBoundaryCorrection_)\n            {\n                // switch off cellIDs for force calc if steming from parallel search success\n                cellWithCenter = particleCloud_.locateM().findSingleCell(position,cellID);\n                particleCloud_.cfdemCloud::cellIDs()[index][0] = cellWithCenter;\n            }\n\n            if (cellID >= 0)  // particle centre is in domain\n            {\n                cellVol = particleCloud_.mesh().V()[cellID];\n                int subPoint=0;\n                scalar subPointDiameter(0);\n                for(int i = 0; i < numberOfMarkerPoints; i++)\n                {\n                    if((i == 0 && procBoundaryCorrection_) || i > 0)\n                    {\n                        offset = radius*offsets[i];\n                        #include \"setWeightedSource.H\"   // set source terms at position+offset\n                        subPoint++;\n                    }\n                }\n\n                if(cellsSet > numberOfMarkerPoints || cellsSet<0)\n                {\n                    Info << \"ERROR  cellsSet =\" << cellsSet << endl;\n                }\n\n                if(!procBoundaryCorrection_)\n                {\n                    // set source for particle center; source 1/nPts+weight of all subpoints that have not been found\n                    scalar centreWeight = 1./nPoints*(nPoints-cellsSet);\n                    // update voidfraction for each particle read\n                    scalar newAlpha = voidfractionNext_[cellID]- volume*centreWeight/cellVol;\n                    if(newAlpha > alphaMin_)\n                        voidfractionNext_[cellID] = newAlpha;\n                    else\n                    {\n                        voidfractionNext_[cellID] = alphaMin_;\n                        tooMuch_ += (alphaMin_-newAlpha) * cellVol;\n                    }\n                    // store cellweight for each particle --- this should be done for subpoints as well!!\n                    particleWeights[index][0] += centreWeight;\n\n                    // store particleVolume for each particle\n                    particleVolumes[index][0] += volume*centreWeight;\n                    particleV[index][0] += volume*centreWeight;\n                }\n                /*//OUTPUT\n                if (index==0 && verbose_)\n                {\n                    Info << \"centre cellID = \" << cellID << endl;\n                    Info << \"cellsPerParticle_=\" << cellsPerParticle_[index][0] << endl;\n\n                    for(int i=0;i<cellsPerParticle_[index][0];i++)\n                    {\n                       if(i==0)Info << \"cellids, voidfractions, particleWeights, : \\n\";\n                       Info << particleCloud_.cfdemCloud::cellIDs()[index][i] << \" ,\" << endl;\n                       Info << voidfractions[index][i] << \" ,\" << endl;\n                       Info << particleWeights[index][i] << \" ,\" << endl;\n                     }\n                }*/\n\n            }// end if in cell\n        //}// end if in mask\n    }// end loop all particles\n    voidfractionNext_.correctBoundaryConditions();\n\n    // reset counter of lost volume\n    if (verbose_) Pout << \"Total particle volume neglected: \" << tooMuch_<< endl;\n    tooMuch_ = 0.;\n\n    // bring voidfraction from Eulerian Field to particle array\n    //interpolationCellPoint<scalar> voidfractionInterpolator_(voidfractionNext_);\n    //scalar voidfractionAtPos(0);\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        /*if(interpolation_)\n        {\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n            if(cellI >= 0)\n            {\n                position = particleCloud_.cfdemCloud::position(index);\n                voidfractionAtPos=voidfractionInterpolator_.interpolate(position,cellI);\n            }else{\n                voidfractionAtPos=-1;\n            }\n\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n            {\n                label cellID = particleCloud_.cfdemCloud::cellIDs()[index][subcell];\n\n                if(cellID >= 0)\n                {\n                    if(voidfractionAtPos > 0)\n                        voidfractions[index][subcell] = voidfractionAtPos;\n                    else\n                        voidfractions[index][subcell] = voidfractionNext_[cellID];\n                }\n                else\n                {\n                    voidfractions[index][subcell] = -1.;\n                }\n            }\n        }\n        else*/\n        {\n            for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)\n            {\n                label cellID = particleCloud_.cfdemCloud::cellIDs()[index][subcell];\n\n                if(cellID >= 0)\n                {\n                    voidfractions[index][subcell] = voidfractionNext_[cellID];\n                }\n                else\n                {\n                    voidfractions[index][subcell] = -1.;\n                }\n            }\n        }\n    }\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/dividedVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    dividedVoidFraction\n\nSourceFiles\n    dividedVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef dividedVoidFraction_H\n#define dividedVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\nconst int numberOfMarkerPoints = 29;\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass dividedVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n        dictionary propsDict_;\n\n        bool verbose_;\n\n        Switch procBoundaryCorrection_;\n\n        const scalar alphaMin_;          // min value of voidFraction\n\n\t    mutable bool alphaLimited_;\n\n        mutable scalar tooMuch_;         // particle volume which is lost due to voidFraction limitation\n\n        bool interpolation_;\n\n        bool cfdemUseOnly_;\n\n\n        vector offsets[numberOfMarkerPoints];\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"divided\");\n\n\n    // Constructors\n\n        //- Construct from components\n        dividedVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~dividedVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n\n        void MSinit();\n\n        void initOffsets(const scalar*);\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/dividedVoidFraction/setWeightedSource.H",
    "content": "\n// set force and mass source at cell subCellID\n{\n    // locate subPoint\n    vector subPosition = position + offset;\n    if(particleCloud_.checkPeriodicCells())\n    {\n      for(int iDir=0;iDir<3;iDir++) {\n        if( subPosition[iDir] > globalBb.max()[iDir] )\n          subPosition[iDir]-=globalBb.max()[iDir]-globalBb.min()[iDir];\n        else if( subPosition[iDir] < globalBb.min()[iDir] )\n          subPosition[iDir]+=globalBb.max()[iDir]-globalBb.min()[iDir];\n      }\n    }\n    label partCellId = particleCloud_.locateM().findSingleCell(subPosition,cellID);\n               \n    //NP fprintf(lmp->screen,\"cellID=%d, partCellId=%d\\n\",static_cast<int>(cellID),static_cast<int>(partCellId));\n\n    if(partCellId!=cellID)\n    {\n        nUnEqual++;\n    }\n    if(partCellId<0)\n    {\n        nNotFound++;\n    }\n    nTotal++;\n\n    if (partCellId >= 0)  // subPoint is in domain\n    {\n        // update voidfraction for each particle read\n        scalar partCellVol = particleCloud_.mesh().V()[partCellId];\n        scalar particleVolume = volume/static_cast<scalar>(nPoints);\n        scalar newAlpha = voidfractionNext_[partCellId]- particleVolume / partCellVol;\n        \n        if(newAlpha > alphaMin_) voidfractionNext_[partCellId] = newAlpha;\n        else\n        {\n            voidfractionNext_[partCellId] = alphaMin_;\n            tooMuch_ += (alphaMin_-newAlpha) * partCellVol;\n        }\n\n        cellsSet++; // inc counter of cells affected\n\n        //====================================================//\n        // add sub particle representation\n        bool createNew = true;\n        label storeInIndex=0;\n        for(int i=0; i < cellsPerParticle_[index][0] ; i++)\n        {\n            if(partCellId == particleCloud_.cfdemCloud::cellIDs()[index][i]) \n            {\n                storeInIndex = i;\n                createNew = false;\n                break;\n            }\n        }\n\n        if(createNew)\n        {\n            cellsPerParticle_[index][0] ++;\n            storeInIndex = cellsPerParticle_[index][0]-1;\n            particleCloud_.cfdemCloud::cellIDs()[index][storeInIndex] = partCellId;\n\n        }\n\n        particleWeights[index][storeInIndex] += 1.0/static_cast<scalar>(nPoints);\n        particleVolumes[index][storeInIndex] += particleVolume;\n        particleV[index][0] += particleVolume;\n        //====================================================//\n\n        particleCloud_.setMpData(subPoint, index, partCellId, subPosition, offset, subPointDiameter);\n    }\n}\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/noVoidFraction/noVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"noVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(noVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    noVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nnoVoidFraction::noVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm)\n{\n    maxCellsPerParticle_ = 29; // cloud uses maxCellsPerParticle_ from this voidfraction model\n                               // here we assume voidFractionModelMS is dividedMS\n                               // better solution: maxCellsPerParticle_ lives in cloud\n\n//     Warning <<\"Please use 'noVoidFraction' in combination with a voidFractionModelMS dividedMS.\\n\" << endl;\n\n    // avoid that this model dumps Prev and Next fields\n    voidfractionPrev_.writeOpt() = IOobject::NO_WRITE;\n    voidfractionNext_.writeOpt() = IOobject::NO_WRITE;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nnoVoidFraction::~noVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid noVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\n{}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/noVoidFraction/noVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    noVoidFraction\n\nSourceFiles\n    noVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef noVoidFraction_H\n#define noVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class noDrag Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass noVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"noVoidFraction\");\n\n\n    // Constructors\n\n        //- Construct from components\n        noVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~noVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"trilinearVoidFraction.H\"\n#include \"addToRunTimeSelectionTable.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(trilinearVoidFraction, 0);\n\naddToRunTimeSelectionTable\n(\n    voidFractionModel,\n    trilinearVoidFraction,\n    dictionary\n);\n\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\ntrilinearVoidFraction::trilinearVoidFraction\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    voidFractionModel(dict,sm),\n    propsDict_(dict.subDict(typeName + \"Props\")),\n    alphaMin_(propsDict_.lookupOrDefault<scalar>(\"alphaMin\",0.1)),\n    bb_(particleCloud_.mesh().points(),false)\n\n{\n    maxCellsPerParticle_=8;\n    if(alphaMin_ > 1 || alphaMin_ < 0.01){ FatalError<< \"alphaMin should be < 1 and > 0.01 !!!\" << abort(FatalError); }\n    checkWeightNporosity(propsDict_);\n    if(porosity()!=1) FatalError << \"porosity not used in trilinearVoidFraction\" << abort(FatalError);\n\n    //Warning << \"trilinearVoidFraction model is ot yet complete and does not work near boundaries\" << endl;\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\ntrilinearVoidFraction::~trilinearVoidFraction()\n{}\n\n\n// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //\n\nvoid trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidfractions,double**& particleWeights,double**& particleVolumes,double**& particleV) const\n{\n    reAllocArrays();\n\n    scalar radius(-1);\n    scalar volume(0);\n    scalar scaleVol=weight();\n\n    vector partPos(0,0,0);\n    vector cellCenter(0,0,0);\n    vector pt(0,0,0);\n    vector posShift(0,0,0);\n    vector offsetCell(0,0,0);\n    vector offsetOrigin(0,0,0);\n\n    label i000(-1);\n    label i100(-1);\n    label i110(-1);\n    label i101(-1);\n    label i111(-1);\n    label i010(-1);\n    label i011(-1);\n    label i001(-1);\n\n\n\n    //bool alphaLimited(false);\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n\n        i000 = i100 = i010 = i001 = i101 = i011 = i110 = i111 = -1;\n        \n        scalar C000(0);\n        scalar C100(0);\n        scalar C110(0);\n        scalar C101(0);\n        scalar C111(0);\n        scalar C010(0);\n        scalar C011(0);\n        scalar C001(0);\n\n        scalar x(0);\n        scalar y(0);\n        scalar z(0);\n\n        scalar a(0);\n        scalar b(0);\n        scalar c(0);\n\n        label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if (cellI >= 0)\n        {\n            // get all neighbors of the cell (n1):\n            labelList n1 = particleCloud_.mesh().cellCells()[cellI];\n            // get all neighbors from the neighbors: \n            labelList allNeighs;\n            forAll(n1,neigh)\n            {\n                allNeighs.append(particleCloud_.mesh().cellCells()[n1[neigh]]);\n            }\n\n            // Find all neighs that occur more than once (part. for 3D case this has to be done twice): \n            labelList finalNeighs;\n            forAll(allNeighs,neigh)\n            {\n                label elem = allNeighs[neigh];\n                if (findIndices(allNeighs,elem).size()>1 && findIndices(finalNeighs,elem).size()==0 && elem != cellI)\n                    finalNeighs.append(elem);         \n            }\n            labelList allNeighs3D;\n            forAll(finalNeighs,neigh)\n            {\n                allNeighs3D.append(particleCloud_.mesh().cellCells()[finalNeighs[neigh]]);\n            }\n            labelList finalNeighs3D;\n            forAll(allNeighs3D,neigh)\n            {\n                label elem = allNeighs3D[neigh];\n                if (findIndices(allNeighs3D,elem).size()>1 && findIndices(finalNeighs,elem).size()==0  && findIndices(finalNeighs3D,elem).size()==0 && findIndices(n1,elem).size() == 0 && elem != cellI)\n                    finalNeighs3D.append(elem);  \n            }\n            // collect all cells that could be in the marked area (completeList)\n            labelList completeList;\n            completeList.append(cellI);\n            completeList.append(n1);\n            completeList.append(finalNeighs);\n            completeList.append(finalNeighs3D);\n\n            // now find out which ones are actually required:\n            partPos = particleCloud_.cfdemCloud::position(index);\n            cellCenter = particleCloud_.mesh().C()[cellI];\n            offsetCell = partPos-cellCenter;\n\n            a = offsetCell[0];\n            b = offsetCell[1];\n            c = offsetCell[2];\n\n            label keeper = cellI; \n\n            // search for the starting cell\n            if(a+SMALL>=0 && b+SMALL>=0 && c+SMALL>=0)\n                i000 = cellI;\n            else\n            {\n                // candidates\n                labelList candidates;\n                for (int i=0; i<completeList.size(); i++)\n                {\n                    label elem = completeList[i];\n                    vector ccelem = particleCloud_.mesh().C()[elem];\n                    if(ccelem[0]<=cellCenter[0]+SMALL && ccelem[1]<=cellCenter[1]+SMALL && ccelem[2]<=cellCenter[2]+SMALL)\n                        candidates.append(elem);\n                }\n\n                labelList possibleX;\n                if (a < 0)\n                {\n                    for (int i=0; i<candidates.size(); i++)\n                    {\n                        label elem = candidates[i];\n                        if (particleCloud_.mesh().C()[elem][0] < cellCenter[0])\n                            possibleX.append(elem);\n                    }\n                }\n                else\n                {\n                    for (int i = 0; i < candidates.size(); i++)\n                    {\n                        label elem = candidates[i];\n                        if (particleCloud_.mesh().C()[elem][0]+SMALL >= cellCenter[0])\n                            possibleX.append(elem);\n                    }\n                }\n                if(possibleX.size()==1)\n                    keeper = possibleX[0];\n\n                labelList possibleY;\n                if (b < 0)\n                {\n                    for (int i = 0; i < possibleX.size(); i++)\n                    {\n                        label elem = possibleX[i];\n                        if (particleCloud_.mesh().C()[elem][1] < cellCenter[1])\n                            possibleY.append(elem);\n                    }\n                }\n                else\n                {\n                    for (int i = 0; i < possibleX.size(); i++)\n                    {\n                        label elem = possibleX[i];\n                        if (particleCloud_.mesh().C()[elem][1]+SMALL >= cellCenter[1])\n                            possibleY.append(elem);\n                    }\n                }\n                if(possibleY.size()==1)\n                    keeper=possibleY[0];\n\n                if (c < 0)\n                {\n                    for (int i = 0; i < possibleY.size(); i++)\n                    {\n                        label elem = possibleY[i];\n                        if (particleCloud_.mesh().C()[elem][2] < cellCenter[2])\n                            i000 = elem;\n                    }\n                }\n                else\n                {\n                    for (int i = 0; i < possibleY.size(); i++)\n                    {\n                        label elem = possibleY[i];\n                        if (particleCloud_.mesh().C()[elem][2]+SMALL >= cellCenter[2])\n                            i000 = elem;\n                    }\n                }\n            }\n\n            // if for some reason the starting cell is not in the investigated domain set to current cell\n            //Info << \"i000: \" << i000 << endl;\n            if (i000 == -1)\n                i000 = keeper; //cellI;\n\n            // i100, i010 and i001 are amongst the neigbors of i000 if they can be found:\n            vector centerI000 = particleCloud_.mesh().C()[i000];\n            labelList neighsI000 = particleCloud_.mesh().cellCells()[i000];\n            for (int i=0; i<neighsI000.size();i++)\n            {\n                label elem = neighsI000[i];\n                vector ccelem = particleCloud_.mesh().C()[elem];\n                if (ccelem[0] >= centerI000[0]+SMALL )\n                    i100 = elem;\n                if (ccelem[1] >= centerI000[1]+SMALL)\n                    i010 = elem;\n                if (ccelem[2] >= centerI000[2]+SMALL)\n                    i001 = elem;\n            }\n\n            // i110, i101, i011 are shared neighbors of two of the three previous\n            // get i110: \n            if (i100 != -1 && i010 != -1)\n            {\n                labelList allNeighs = particleCloud_.mesh().cellCells()[i100];\n                allNeighs.append(particleCloud_.mesh().cellCells()[i010]);\n                for(int i=0;i<allNeighs.size();i++)\n                {\n                    label elem = allNeighs[i];\n                    if (findIndices(allNeighs,elem).size()>1 && elem != i000)\n                    i110 = elem;         \n                }\n            }\n\n            // get i101\n            if (i100 != -1 && i001 != -1)\n            {\n                labelList allNeighs = particleCloud_.mesh().cellCells()[i100];\n                allNeighs.append(particleCloud_.mesh().cellCells()[i001]);\n                for(int i=0;i<allNeighs.size();i++)\n                {\n                    label elem = allNeighs[i];\n                    if (findIndices(allNeighs,elem).size()>1 && elem != i000)\n                    {\n                        i101 = elem;         \n                    }\n                }\n            }\n\n            // get i011\n            if (i010 != -1 && i001 != -1)\n            {\n                labelList allNeighs = particleCloud_.mesh().cellCells()[i010];\n                allNeighs.append(particleCloud_.mesh().cellCells()[i001]);\n                for(int i=0;i<allNeighs.size();i++)\n                {\n                    label elem = allNeighs[i];\n                    if (findIndices(allNeighs,elem).size()>1 && elem != i000)\n                        i011 = elem;         \n                }\n            }\n\n            // i111 is a shared neighbor of i110, i101 and i011 \n            // get i111\n            //if (i010 != -1 && i001 != -1)\n            if (i110 != -1 && i101 != -1 && i011 != -1)\n            {\n                labelList allNeighs = particleCloud_.mesh().cellCells()[i101];\n                allNeighs.append(particleCloud_.mesh().cellCells()[i011]);\n                allNeighs.append(particleCloud_.mesh().cellCells()[i110]);\n                for(int i=0;i<allNeighs.size();i++)\n                {\n                    label elem = allNeighs[i];\n                    if (findIndices(allNeighs,elem).size()>2 && elem != i000)\n                        i111 = elem;         \n                }\n            }\n\n            offsetOrigin = particleCloud_.mesh().C()[i000] - partPos;\n\n            if (i100 != -1)\n                x = mag(offsetOrigin[0])/mag(particleCloud_.mesh().C()[i000][0]-particleCloud_.mesh().C()[i100][0]);\n            if (i010 != -1)\n                y = mag(offsetOrigin[1])/mag(particleCloud_.mesh().C()[i000][1]-particleCloud_.mesh().C()[i010][1]);\n            if (i001 != -1)\n                z = mag(offsetOrigin[2])/mag(particleCloud_.mesh().C()[i000][2]-particleCloud_.mesh().C()[i001][2]);\n\n            // calculate the mapping coeffs - distribute to neighboring cells \n            C000=(1-x)*(1-y)*(1-z);\n            C100=x*(1-y)*(1-z);\n            if (i110 == -1)\n            {\n                C100 += 0.5*x*y*(1-z);\n                C010 += 0.5*x*y*(1-z);\n            }\n            else\n                C110=x*y*(1-z);\n            C010=(1-x)*y*(1-z);\n            C001=(1-x)*(1-y)*z;\n            if (i101 == -1)\n            {\n                C100 += 0.5*x*(1-y)*z;\n                C001 += 0.5*x*(1-y)*z;\n            }\n            else\n                C101=x*(1-y)*z;\n            if (i111 == -1)\n            {\n                C101 +=0.33*x*y*z;\n                C011 +=0.33*x*y*z;\n                C110 +=0.34*x*y*z;\n            }\n            else\n                C111=x*y*z;\n            if (i011 == -1)\n            {\n                C010 += 0.5*(1-x)*y*z;\n                C001 += 0.5*(1-x)*y*z;\n            }\n            else \n                C011=(1-x)*y*z;\n\n            // set weights\n            particleWeights[index][0]=C000;\n            particleWeights[index][1]=C100;\n            particleWeights[index][2]=C110;\n            particleWeights[index][3]=C010;\n            particleWeights[index][4]=C001;\n            particleWeights[index][5]=C101;\n            particleWeights[index][6]=C111;\n            particleWeights[index][7]=C011;\n\n            // set cellIDs\n            particleCloud_.cfdemCloud::cellIDs()[index][0]=i000;\n            particleCloud_.cfdemCloud::cellIDs()[index][1]=i100;\n            particleCloud_.cfdemCloud::cellIDs()[index][2]=i110;\n            particleCloud_.cfdemCloud::cellIDs()[index][3]=i010;\n            particleCloud_.cfdemCloud::cellIDs()[index][4]=i001;\n            particleCloud_.cfdemCloud::cellIDs()[index][5]=i101;\n            particleCloud_.cfdemCloud::cellIDs()[index][6]=i111;\n            particleCloud_.cfdemCloud::cellIDs()[index][7]=i011;\n\n            radius = particleCloud_.radius(index);\n            volume = 4./3.*M_PI*radius*radius*radius*scaleVol;\n\n            // change voidfraction according to covered volume\n            if (i000 > -1 && alphaMin_ < voidfractionNext_[i000]-volume*C000/particleCloud_.mesh().V()[i000]) \n                voidfractionNext_[i000]-=volume*C000/particleCloud_.mesh().V()[i000];\n            if (i100 > -1 && alphaMin_ < voidfractionNext_[i100]-volume*C100/particleCloud_.mesh().V()[i100])\n                voidfractionNext_[i100]-=volume*C100/particleCloud_.mesh().V()[i100];\n            if (i010 > -1 && alphaMin_ < voidfractionNext_[i010]-volume*C010/particleCloud_.mesh().V()[i010])\n                voidfractionNext_[i010]-=volume*C010/particleCloud_.mesh().V()[i010];\n            if (i001 > -1 && alphaMin_ < voidfractionNext_[i001]-volume*C001/particleCloud_.mesh().V()[i001])\n                voidfractionNext_[i001]-=volume*C001/particleCloud_.mesh().V()[i001];\n            if (i101 > -1 && alphaMin_ < voidfractionNext_[i101]-volume*C101/particleCloud_.mesh().V()[i101])\n                voidfractionNext_[i101]-=volume*C101/particleCloud_.mesh().V()[i101];\n            if (i011 > -1 && alphaMin_ < voidfractionNext_[i011]-volume*C011/particleCloud_.mesh().V()[i011])\n                voidfractionNext_[i011]-=volume*C011/particleCloud_.mesh().V()[i011];\n            if (i110 > -1 && alphaMin_ < voidfractionNext_[i110]-volume*C110/particleCloud_.mesh().V()[i110])\n                voidfractionNext_[i110]-=volume*C110/particleCloud_.mesh().V()[i110];\n            if (i111 > -1 && alphaMin_ < voidfractionNext_[i111]-volume*C111/particleCloud_.mesh().V()[i111])\n                voidfractionNext_[i111]-=volume*C111/particleCloud_.mesh().V()[i111];\n\n            // debugging\n            /*Info << \"partPos: \" << partPos << endl;\n            Info << \"cellI=\" << cellI << endl;\n            Info << \"a=\" << a << endl;\n            Info << \"b=\" << b << endl;\n            Info << \"c=\" << c << endl;\n            Info << \"x=\" << x << endl;\n            Info << \"y=\" << y << endl;\n            Info << \"z=\" << z << endl;\n            Info << \"i000=\" << i000 << endl;\n            Info << \"i100=\" << i100 << endl;\n            Info << \"i010=\" << i010 << endl;\n            Info << \"i001=\" << i001 << endl;\n            Info << \"i101=\" << i101 << endl;\n            Info << \"i011=\" << i011 << endl;\n            Info << \"i110=\" << i110 << endl;\n            Info << \"i111=\" << i111 << endl;\n\n            Info << \"C000=\" << C000 << endl;\n            Info << \"C100=\" << C100 << endl;\n            Info << \"C010=\" << C010 << endl;\n            Info << \"C001=\" << C001 << endl;\n            Info << \"C101=\" << C101 << endl;\n            Info << \"C011=\" << C011 << endl;\n            Info << \"C110=\" << C110 << endl;\n            Info << \"C111=\" << C111 << endl;\n            Info << \"sum(Cijk)=\" << C000+C100+C010+C001+C101+C011+C110+C111 << endl;*/\n\n            // store voidfraction for each particle\n            voidfractions[index][0] = voidfractionNext_[cellI];\n\n            // store cellweight for each particle  - this should not live here\n            particleWeights[index][0] = 1;\n        }\n    }\n\n    voidfractionNext_.correctBoundaryConditions();\n\n    // bring voidfraction from Eulerian Field to particle array\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        label cellID = particleCloud_.cfdemCloud::cellIDs()[index][0];\n\n        if(cellID >= 0)\n        {\n            if (i000 != -1) voidfractions[index][0] = voidfractionNext_[i000];\n            if (i100 != -1) voidfractions[index][1] = voidfractionNext_[i100];\n            if (i110 != -1) voidfractions[index][2] = voidfractionNext_[i110];\n            if (i010 != -1) voidfractions[index][3] = voidfractionNext_[i010];\n            if (i001 != -1) voidfractions[index][4] = voidfractionNext_[i001];\n            if (i101 != -1) voidfractions[index][5] = voidfractionNext_[i101];\n            if (i111 != -1) voidfractions[index][6] = voidfractionNext_[i111];\n            if (i011 != -1) voidfractions[index][7] = voidfractionNext_[i011];\n        }\n        else\n        {\n            for(int i=0;i<8;i++)\n                voidfractions[index][i] = -1.;\n        }\n    }\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/trilinearVoidFraction/trilinearVoidFraction.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\nClass\n    trilinearVoidFraction\n\nSourceFiles\n    trilinearVoidFraction.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef trilinearVoidFraction_H\n#define trilinearVoidFraction_H\n\n#include \"voidFractionModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class trilinearVoidFraction Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass trilinearVoidFraction\n:\n    public voidFractionModel\n{\n\nprivate:\n        dictionary propsDict_;\n\n        const scalar alphaMin_;\n\n        boundBox bb_;\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"trilinear\");\n\n\n    // Constructors\n\n        //- Construct from components\n        trilinearVoidFraction\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n    // Destructor\n\n        ~trilinearVoidFraction();\n\n\n    // Member Functions\n        void setvoidFraction(double** const& ,double**&, double**&, double**&, double**&) const;\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/newVoidFractionModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n\n#include \"voidFractionModel.H\"\n#include \"centreVoidFraction.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\nautoPtr<voidFractionModel> voidFractionModel::New\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n{\n    word read_vfm\n    (\n        dict.lookup(\"voidFractionModel\")\n    );\n\n    word ps\n    (\n        dict.lookupOrDefault<word>(\"particleShapeType\", \"\")\n    );\n    if (ps == \"superquadric\")\n        ps = \"Superquadric\"; // NOTE: change in case\n    else\n        ps = \"\";\n    word voidFractionModelType(read_vfm + ps);\n\n    Info<< \"Selecting voidFractionModel \"\n         << voidFractionModelType << endl;\n\n\n    dictionaryConstructorTable::iterator cstrIter =\n        dictionaryConstructorTablePtr_->find(voidFractionModelType);\n\n    if (cstrIter == dictionaryConstructorTablePtr_->end())\n    {\n        FatalError\n            << \"voidFractionModel::New(const dictionary&, const spray&) : \"\n            << endl\n            << \"    unknown voidFractionModelType type \"\n            << voidFractionModelType\n            << \", constructor not in hash table\" << endl << endl\n            << \"    Valid voidFractionModel types are :\"\n            << endl;\n        Info<< dictionaryConstructorTablePtr_->toc()\n            << abort(FatalError);\n    }\n\n    return autoPtr<voidFractionModel>(cstrIter()(dict,sm));\n}\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.C",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\\*---------------------------------------------------------------------------*/\n\n#include \"error.H\"\n#include \"voidFractionModel.H\"\n#include \"dataExchangeModel.H\"\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //\n\ndefineTypeNameAndDebug(voidFractionModel, 0);\n\ndefineRunTimeSelectionTable(voidFractionModel, dictionary);\n\n// * * * * * * * * * * * * * * private Member Functions  * * * * * * * * * * * * * //\n\n// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //\n\n// Construct from components\nvoidFractionModel::voidFractionModel\n(\n    const dictionary& dict,\n    cfdemCloud& sm\n)\n:\n    dict_(dict),\n    particleCloud_(sm),\n    voidfractionPrev_\n    (   IOobject\n        (\n            \"voidfractionPrev\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volScalarField> (\"voidfraction\")\n        /*sm.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 1)*/\n    ),\n    voidfractionNext_\n    (   IOobject\n        (\n            \"voidfractionNext\",\n            sm.mesh().time().timeName(),\n            sm.mesh(),\n            IOobject::READ_IF_PRESENT,//MUST_READ,\n            IOobject::AUTO_WRITE\n        ),\n        sm.mesh().lookupObject<volScalarField> (\"voidfraction\")\n        /*sm.mesh(),\n        dimensionedScalar(\"zero\", dimensionSet(0,0,0,0,0), 1)*/\n    ),\n    cellsPerParticle_(NULL),\n    maxCellsPerParticle_(1),\n    weight_(1.),\n    porosity_(1.),\n    msMode_(false),\n    volScale_(0),\n    arraysAllocated_(false),\n    nMP_(labelList(101)),\n    maxNMP_(-1)\n{\n    // init nMP_ for each clump type\n    // this is overwritten by dividedVoidFractionMP (if used)\n    // there the user defines nMP per clump type\n    int maxNTypes(101); // TODO this hardcoded value is not beautiful but avoids useless communication of type for many cases\n                        // see also above construction of nMP_\n                        // see also connection to cloudMSI.H constructor\n    for(int i=0;i<maxNTypes;i++) nMP_[i]=1;\n\n    reAllocArrays();\n}\n\n\n// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //\n\nvoidFractionModel::~voidFractionModel()\n{\n    particleCloud_.dataExchangeM().destroy(cellsPerParticle_,1);\n}\n\n// * * * * * * * * * * * * * * public Member Functions  * * * * * * * * * * * * * //\n\nvoid Foam::voidFractionModel::applyDebugSettings(bool debug) const\n{\n    if(!debug)\n    {\n        voidfractionPrev_.writeOpt() = IOobject::NO_WRITE;\n        voidfractionNext_.writeOpt() = IOobject::NO_WRITE;\n    }\n}\n\ntmp<volScalarField> Foam::voidFractionModel::voidFractionInterp() const\n{\n    scalar tsf = particleCloud_.dataExchangeM().timeStepFraction();\n    /*if(1-tsf < 1e-4 && particleCloud_.dataExchangeM().couplingStep() > 1)   // if no subTS &&  !firstTS\n    {\n        //Info << \"using voidfractionPrev\" << endl;\n        return tmp<volScalarField>\n        (\n            new volScalarField(\"alpha_voidFractionModel\", voidfractionPrev_)\n        );\n    }\n    else*/                                                                    // if subTS || firstTS\n    {\n        //Info << \"using voidfraction blend, tsf=\" << tsf << endl;\n        return tmp<volScalarField>\n        (\n            new volScalarField(\"alpha_voidFractionModel\", (1 - tsf) * voidfractionPrev_ + tsf * voidfractionNext_)\n        );\n    }\n}\n\nvoid Foam::voidFractionModel::resetVoidFractions() const\n{\n    voidfractionPrev_ == voidfractionNext_;\n    voidfractionNext_ == dimensionedScalar(\"one\", voidfractionNext_.dimensions(), 1.);\n}\n\n/*void Foam::voidFractionModel::undoVoidFractions(double**const& mask) const\n{\n    voidfractionPrev_.internalField() = voidfractionNext_.internalField();\n\n    for(int index=0; index< particleCloud_.numberOfParticles(); index++)\n    {\n        if(mask[index][0])\n        {\n            // undo voidfraction cause by particle\n            label cellI = particleCloud_.cfdemCloud::cellIDs()[index][0];\n            scalar cellVolume=voidfractionNext_.mesh().V()[cellI];\n            voidfractionNext_[cellI] += particleCloud_.particleVolumes()[index][0]/cellVolume;\n        }\n    }\n}*/\n\ndouble** const& Foam::voidFractionModel::cellsPerParticle() const\n{\n    return cellsPerParticle_;\n}\n\nint Foam::voidFractionModel::maxCellsPerParticle() const\n{\n    return maxCellsPerParticle_;\n}\n\nvoid Foam::voidFractionModel::reAllocArrays() const\n{\n    if(particleCloud_.numberOfParticlesChanged() || !arraysAllocated_)\n    {\n        // get arrays of new length\n        particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1);\n        arraysAllocated_ = true;\n    }\n}\n\nvoid Foam::voidFractionModel::reAllocArrays(int nP) const\n{\n    if(particleCloud_.numberOfParticlesChanged() || !arraysAllocated_)\n    {\n        // get arrays of new length\n        particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1,nP);\n        arraysAllocated_ = true;\n    }\n}\n\ndouble Foam::voidFractionModel::pointInParticle(int index, vector positionCenter, vector point, double scale) const\n{\n    scalar radius =  particleCloud_.radius(index);\n    //Pout << \"radius=\" << radius << endl;\n    if(radius>SMALL)\n    {\n        scalar pointDistSq = magSqr(point - positionCenter);\n        return pointDistSq / (scale*scale*radius*radius) - 1.0;\n    }\n    else\n    {\n        return 0.;\n    }\n}\n\ndouble Foam::voidFractionModel::pointInParticle(int index, vector positionCenter, vector point) const {\n  return pointInParticle(index, positionCenter, point, 1.0);\n}\n\n//Function to determine minimal distance of point\n//to one of the periodic images of a particle\ndouble Foam::voidFractionModel::minPeriodicDistance(int index,\n                                                    vector    cellCentrePosition,\n                                                    vector    positionCenter,\n                                                    boundBox  globalBb,\n                                                    vector&   minPeriodicPos,\n                                                    vector    dirCheckRange\n                                                   )const\n{\n    double f=999e32;\n    vector positionCenterPeriodic;\n\n    for(  int xDir=-static_cast<int>(dirCheckRange[0]);\n              xDir<=static_cast<int>(dirCheckRange[0]);\n              xDir++)\n    {\n        positionCenterPeriodic[0] =  positionCenter[0]\n                                  + static_cast<double>(xDir)\n                                  * (globalBb.max()[0]-globalBb.min()[0]);\n        for(int yDir=-static_cast<int>(dirCheckRange[1]);\n                yDir<=static_cast<int>(dirCheckRange[1]);\n                yDir++)\n        {\n            positionCenterPeriodic[1] =  positionCenter[1]\n                                      + static_cast<double>(yDir)\n                                      * (globalBb.max()[1]-globalBb.min()[1]);\n            for(int zDir=-static_cast<int>(dirCheckRange[2]);\n                    zDir<=static_cast<int>(dirCheckRange[2]);\n                    zDir++)\n            {\n                positionCenterPeriodic[2] =  positionCenter[2]\n                                          + static_cast<double>(zDir)\n                                          * (globalBb.max()[2]-globalBb.min()[2]);\n                //if( mag(cellCentrePosition-positionCenterPeriodic)<f)\n                if(pointInParticle(index, positionCenterPeriodic, cellCentrePosition) < f)\n                {\n                    f = pointInParticle(index, positionCenterPeriodic, cellCentrePosition);\n                    minPeriodicPos = positionCenterPeriodic;\n                }\n            }\n        }\n    }\n\n    return f;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/lagrangian/cfdemParticle/subModels/voidFractionModel/voidFractionModel/voidFractionModel.H",
    "content": "/*---------------------------------------------------------------------------*\\\n    CFDEMcoupling - Open Source CFD-DEM coupling\n\n    CFDEMcoupling is part of the CFDEMproject\n    www.cfdem.com\n                                Christoph Goniva, christoph.goniva@cfdem.com\n                                Copyright 2009-2012 JKU Linz\n                                Copyright 2012-     DCS Computing GmbH, Linz\n-------------------------------------------------------------------------------\nLicense\n    This file is part of CFDEMcoupling.\n\n    CFDEMcoupling is free software; you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by the\n    Free Software Foundation; either version 3 of the License, or (at your\n    option) any later version.\n\n    CFDEMcoupling is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n    for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with CFDEMcoupling; if not, write to the Free Software Foundation,\n    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\nDescription\n    This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS\n    and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).\n\n    Gaussian distributed particle voidfraction model\n    contribution from RQ\n\nClass\n    voidFractionModel\n\nSourceFiles\n    voidFractionModel.C\n\n\\*---------------------------------------------------------------------------*/\n\n#ifndef voidFractionModel_H\n#define voidFractionModel_H\n\n#include \"fvCFD.H\"\n#include \"cfdemCloud.H\"\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnamespace Foam\n{\n\n/*---------------------------------------------------------------------------*\\\n                           Class voidFractionModel Declaration\n\\*---------------------------------------------------------------------------*/\n\nclass voidFractionModel\n{\n\nprotected:\n\n    // Protected data\n        const dictionary& dict_;\n\n        cfdemCloud& particleCloud_;\n\n        mutable volScalarField voidfractionPrev_;\n\n        mutable volScalarField voidfractionNext_;\n\n        mutable double ** cellsPerParticle_;\n\n        int maxCellsPerParticle_;\n\n        mutable scalar weight_;\n\n        mutable scalar porosity_;\n\n        bool msMode_;\n\n        mutable scalarList volScale_;\n\n        mutable bool arraysAllocated_;\n\n        mutable labelList nMP_;\n\n        mutable int maxNMP_;\n\n    // Protected member functions\n\npublic:\n\n    //- Runtime type information\n    TypeName(\"voidFractionModel\");\n\n    // Declare runtime constructor selection table\n\n        declareRunTimeSelectionTable\n        (\n            autoPtr,\n            voidFractionModel,\n            dictionary,\n            (\n                const dictionary& dict,\n                cfdemCloud& sm\n            ),\n            (dict,sm)\n        );\n\n\n    // Constructors\n\n        //- Construct from components\n        voidFractionModel\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // Destructor\n\n        virtual ~voidFractionModel();\n\n\n    // Selector\n\n        static autoPtr<voidFractionModel> New\n        (\n            const dictionary& dict,\n            cfdemCloud& sm\n        );\n\n\n    // public member functions\n        void applyDebugSettings(bool) const;\n\n        virtual void setvoidFraction(double** const&,double**&,double**&,double**&,double**&) const = 0;\n\n        tmp<volScalarField> voidFractionInterp() const;\n\n        inline volScalarField& voidFractionPrev()const { return voidfractionPrev_; }\n\n        inline volScalarField& voidFractionNext()const { return voidfractionNext_; }\n\n        inline scalar weight()const { return weight_; }\n\n        inline scalar porosity()const { return porosity_; }\n\n        inline void checkWeightNporosity(dictionary& propsDict) const\n        {\n            // read vol scale if defined, otherwise use 1 as default\n            // NOTE: default only 10 types allowed! (if more, user has to specify volScale list)\n\n            // read or default volScale\n            if (propsDict.found(\"volScale\"))\n            {\n                volScale_ = scalarList(propsDict.lookup(\"volScale\"));\n                Info << \"  Reading volScale,... volScale = \" << volScale_ << endl;\n            }\n            else\n            {\n                Info << \"  Variable volScale was not specified, using default 1 for all particle templates.\\n\"\n                     << \"  Note: for more than 10 particle templates, please specify volScale manually.\" << endl;\n                volScale_ = scalarList(10);\n                forAll(volScale_,i) volScale_[i] = 1.;\n            }\n\n            if (propsDict.found(\"porosity\"))\n            {\n                porosity_ = readScalar(propsDict.lookup(\"porosity\"));\n                Info << \"The voidfraction model is using porosity = \" << porosity_ << endl;\n            }\n\n            // check for deprecated\n            if (propsDict.found(\"scaleUpVol\"))\n                    FatalError << \"\\n You are trying to use the deprecated keyword scaleUpVol in your voidfraction model settings.\"\n                               << \" You might want to use the keyword volScale instead. Please consult the documentation for more information.\" \n                               << abort(FatalError);\n            if (propsDict.found(\"weight\"))\n                    FatalError << \"\\n You are trying to use the deprecated keyword weight in your voidfraction model settings.\"\n                               << \" You might want to use the keyword volScale instead. Please consult the documentation for more information.\" \n                               << abort(FatalError);\n\n            // TODO here we should have a sanity check (but we do not yet have a global info on nr of types)\n            //if(volScale().size()!=particleCloud_.nClumpTypes()) // sanity check for volScale\n            //    FatalError  << \"volScale has \" << volScale().size() \n            //                << \" entries, but there are \" << particleCloud_.nClumpTypes() << \" particle types.\" << abort(FatalError);\n        };\n\n        void resetVoidFractions() const;\n\n        //void undoVoidFractions(double**const&) const;\n\n        double** const& cellsPerParticle() const;\n\n        int maxCellsPerParticle() const;\n\n        void reAllocArrays() const;\n\n        void reAllocArrays(int nP) const;  //force number of particles during reallocation, for CFD offline-use\n\n        virtual void setParticleType(label type) const {};\n\n        virtual bool checkParticleType(label) const {return true;}; //consider all particles by default\n\n        virtual double minPeriodicDistance\n        (\n            int index,\n            vector    cellCentrePosition,\n            vector    positionCenter,\n            boundBox  globalBb,\n            vector&   minPeriodicPos,\n            vector    dirCheckRange = vector(1,1,1)\n        ) const;\n        virtual double pointInParticle(int index, vector positionCenter, vector point, double scale) const;\n        virtual double pointInParticle(int index, vector positionCenter, vector point) const;\n\n    // MS interface functions\n        virtual void MSinit () {}; // extra init function for MS stuff\n\n        inline const scalarList& volScale() const {return volScale_;};\n\n        inline labelList nMP() const {return nMP_;};\n\n        inline int nMP(int ct) const {return nMP_[ct];};\n\n        inline void setNMP(int ct, int len) const {nMP_[ct]=len;};\n\n        inline int maxNMP() const { return maxNMP_;};\n\n        inline void setMaxNMP(int i) const { maxNMP_=i;};\n};\n\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n} // End namespace Foam\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n#endif\n\n// ************************************************************************* //\n"
  },
  {
    "path": "src/version_CFDEMcoupling_branch.txt",
    "content": "CFDEMcoupling-DCS\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest\n# Christoph Goniva - August 2011\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM init\n    $casePath/parDEMrun.sh\nfi\n\n#- run parallel CFD-DEM in new terminal\n. $casePath/parCFDDEMrun.sh\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/T",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      T;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 1 0 0 0];\n\ninternalField   uniform 263;\n\nboundaryField\n{\n    inlet           \n    {\n        type            fixedValue;\n        value           uniform 263;\n    }\n\n    outlet          \n    {\n        type            zeroGradient;\n    }\n\n    wall       \n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/TSource",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0.05\";\n    object      TSource;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 -1 1 0 0 0];\n\n// Tsource[K/s] = q[W/m3]/(rho[kg/m3]*cp[W*s/(kg*K)])\n// Q=10 W\n// V=0.01 m3\n// q=1000 W/m3\n// cp=1000\n// rho=1\n// --> Tsource = 1 \n\ninternalField   uniform 0;  \n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    wall\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0.001);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        type            fixedValue;\n        value           uniform (0 0 1);\n    }\n\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/epsilon",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      epsilon;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -3 0 0 0 0];\n\ninternalField   uniform 0.003;\n\nboundaryField\n{\n    wall\n    {\n        type            epsilonWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0.003;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.003;\n        value           uniform 0.003;\n    }\n    inlet\n    {\n        /*type            turbulentMixingLengthDissipationRateInlet;\n        mixingLength    0.005;\n        value           uniform 0.003;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0.001;\n\nboundaryField\n{\n    wall\n    {\n        type            kqRWallFunction;\n        value           uniform 0.001;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.001;\n        value           uniform 0.001;\n    }\n    inlet\n    {\n        /*type            turbulentIntensityKineticEnergyInlet;\n        intensity       0.05;\n        value           uniform 0.001;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/nut",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      nut;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            nutkWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n\n    wall\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n    outlet\n    {\n        //type            zeroGradient;\n        type            fixedValue;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 1.188;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\nsolveFlow   true;\n\nmodelType B; // A or B\n\ncouplingInterval 500;\n\nvoidFractionModel divided;\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;//particleProbe;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;//dilute;//\n\nclockModel off;//standardClock;//\n\nsmoothingModel off;\n\nforceModels\n(\n    KochHillDrag\n    scalarGeneralExchange\n    Archimedes\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType RASProperties;//LESProperties;//OFversion24x\nturbulenceModelType turbulenceProperties;//OFversion30x\n\n//===========================================================================//\n// sub-model properties\nparticleProbeProps\n{\n    particleIDsToSample (0 0);\n    verboseToFile;      //main switch\n    printEvery 20;      //print every this many CFD time steps\n    sampleAll;          //Activate sampling for all particles\n    probeDebug;         //probes additional fields\n    includePosition;    //will include particle position in the output file\n    writePrecision 4;   //number of significant digits to print\n}\n\nscalarGeneralExchangeProps\n{\n/*    verbose                 true;*/\n    tempFieldName           \"T\";\n    partTempName            \"Temp\";\n    //Option 1: cool with implicit coupling\n/*    partHeatTransCoeffName  \"heatTransCoeff\"; //switch off for explicit coupling, e.g., to ParScale    */\n/*    partHeatFluidName       \"heatFluid\"; //switch off for explicit coupling, e.g., to ParScale    */\n\n    //Option 2: cool with explicit setting of flux\n    partHeatFluxName        \"convectiveHeatFlux\"; //switch off for implicit coupling, e.g., to ParScale  \n\n    lambda                  0.0256;\n    //Cp                      1007;\n    Prandtl                 70.097; //WARNING: this is not a typical gas - just for testing purposes!\n    useLiMason              true; \n    \n    //Lists with information for each species FOR THE PARTICLES\n    //MUST be in the same order as eulerian species in 'scalarTransportProperties'\n    //MUST correspond to property/atom in liggghts (use 'couple/cfd/speciesConvection' to auto-generate individual fields)\n    partSpeciesNames\n    (\n    );\n    partSpeciesFluxNames\n    (\n    );\n    partSpeciesTransCoeffNames\n    (\n    );\n    partSpeciesFluidNames\n    (\n    );\n    DMolecular\n    (\n    );\n    //parameters for the vapor pressure model\n    parameterVap\n    (\n        0\n    );\n}\n\nimplicitCoupleProps\n{\n    //KslLimit 0;  // source switched off!!!\n}\n\nexplicitCoupleProps\n{\n    //fLimit (0 0 0);\n}\n\nKochHillDragProps\n{\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10000;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\ncentreProps\n{\n}\n\ndividedProps\n{\n    alphaMin 0.4;\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 -9.81 0);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n   execute\n);\n\n// reset particle temperature every coupling step\nexecuteProps1\n{\n    command\n    (\n        set\n        region\n        total\n        noBlanks\n        property\n        slash\n        atom  // former peratom\n        blanks\n        Temp\n        number\n    );\n    scalars\n    (\n        600\n    );\n    runFirst off; \n    runLast off;\n    runEveryCouplingStep on;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/scalarTransportProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          scalarTransportProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nscalarTransportModel generalManual;\n\ngeneralManualProps\n{\n    ScT 0.7; //optional\n    PrT 0.7; //optional\n\n    //in case the user does not want to generate a separate field,\n    //the volumetric heat capacity can be set here (as a global constant)\n    cpVolumetric 1196; //this is the mixture density times the heat capacity\n                       //must have dimensions [J/K/(m_voidspace)³]\n                       //will only be used if cpVolumetricFieldName, or updateMixtureProperties = false\n\n//    cpVolumetricFieldName   \"cpRho\"; \n//    rhoMixFieldName         \"rhoMix\"; \n\n    eulerianFields\n    (\n        //C\n        T\n    );\n\n   //    fvOptionsC {}\n    fvOptionsT {}\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-03;\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType  RAS;//OFversion30x\n\nRAS\n{\n    RASModel        kEpsilon;\n\n    turbulence      on;\n\n    printCoeffs     on;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/octave/totalPressureDropAndNusselt.m",
    "content": "close all;\nclear;\nclc;\n\n\n%*********************************************************************%\n% pressure drop\n%*********************************************************************%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.022;\t\t\t% particle diameter\nphip = 1;\t\t\t% sphericity\nepsilon = 0.4436;\t\t        % voidfraction\nU = 1;    \t\t\t% superficial velocity\nL = 1;\t\t\t    % length of bed\nrhoG = 1.188;\t\t% density in kg/m\nnuG = 1.5e-3;\t    % kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG*U^2)/(phip*dp))\n        )\n\nfprintf('final pressure drop = %f Pa\\n',dpErgun)\n%====================================%\n% simulation data\n%====================================%\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\n\ndata = load(path);\n[x,y]=size(data);\ndp_sim = data(:,2)-data(:,y);\nt_sim = data(:,1);\nfprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% plot data\n%====================================%\nfigure(1)\nplot(t_sim,dpErgun*ones(1,length(t_sim)),t_sim,dp_sim)\naxis([0,0.7,0,dpErgun(length(dpErgun))])\ntitle(\"Ergun pressure drop\")\nlegend(\"analytical - Ergun\",\"simulation\") \n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_pressureDrop.png\"\n\n%*********************************************************************%\n% heat transfer\n%*********************************************************************%\n\n%====================================%\n% simulation data\n%====================================%\n\ncp = 1007;\nA = 0.01;\nU = U;\nalpha = epsilon;\nnuF = nuG;\nrhoF = rhoG;\nTp = 600;\nNp = 1005;\nlambda = 0.0256;\n\n%path = '../probes/0/T'; % ext32\npath = '../postProcessing/probes/0/T';\n\ndata = load(path);\n[x,y]=size(data);\nTin_sim =  data(:,2);                                          % mean temp inlet temp [K]\nTout_sim = data(:,3);                                          % mean temp outlet temp [K]\nt_sim = data(:,1);\nfprintf('final inlet temperature of sim = %f K\\n',Tin_sim(length(Tin_sim)) )\nfprintf('final outlet temperature of sim = %f K\\n',Tout_sim(length(Tout_sim)) )\n\n\nuF = U/alpha;                                               % interstitial velocity [m/s]\nReP_sim = uF.*ones(length(t_sim),1)*dp/nuF;                                       % ReynoldsNr based in dp\nPr = nuF*rhoF*cp/lambda;\nqin_sim = U * A * rhoF * cp .* Tin_sim;\nqout_sim = U * A * rhoF * cp .* Tout_sim;\nq_sim = (qout_sim-qin_sim);                                 % particle fluid heat flux [W] (out-in)\nTmean_sim = 0.5*(Tin_sim+Tout_sim);                               % mean temp of fluid\ndeltaT = Tp - Tmean_sim;                                          % mean temp diff between partcles and fluid\nh=q_sim./(Np*dp^2*pi*deltaT);                                      % average particle-fluid heat transfer coeff [W/(m2*K)]\nNu_sim = h.*dp/lambda;                                             % mean particle Nusselt nr\nt_sim = data(:,1);\nfprintf('q_sim = %f \\n',q_sim(length(Nu_sim)))\nfprintf('Nu_sim = %f \\n',Nu_sim(length(Nu_sim)))\n\n%===================\n% Nusselt Equation\n%===================\nfprintf('\\ncalc Nusselt eqn:\\n')\n\n%% following Li and Mason\nn=3.5\nif (ReP_sim(length(uF)) <200)\n     Nu_LiMason=2.*ones(length(uF),1)+0.6*alpha^n.*ReP_sim.^0.5.*Pr^0.33;\nelseif (ReP_sim(length(uF)) <1500)\n     Nu_LiMason=2.*ones(length(uF),1)+0.5*alpha^n.*ReP_sim.^0.5*Pr^0.33 + 0.02*alpha^n.*ReP_sim.^0.8.*Pr^0.33;\nelse\n     Nu_LiMason=2.*ones(length(uF),1) +0.000045*alpha^n.*ReP_sim.^1.8;\nend\n\nfprintf('Nu_LiMason = %f \\n',Nu_LiMason(length(Nu_LiMason)))\n\n%====================================%\n% plot data\n%====================================%\nfigure(2)\nplot(t_sim,Nu_LiMason,t_sim,Nu_sim)\ntitle(\"Nusselt nr\")\nlegend(\"analytical - \",\"simulation\") \n\n%print('cfdemSolverPisoScalar_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_Nusselt.png\"\n\nfigure(3)\nplot(t_sim,Tin_sim,t_sim,Tout_sim)\ntitle(\"inlet/outlet temperature\")\nlegend(\"inlet\",\"outlet\") \n\n%print('cfdemSolverPisoScalar_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_temperatures.png\"\n\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/0/heat.json",
    "content": "{\n    \"name\": \"heat\",\n    \"data\":\n    {\n        \"1\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"2\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"3\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"4\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"5\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"6\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"7\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"8\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"9\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"10\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"11\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"12\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"13\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"14\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"15\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"16\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"17\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"18\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"19\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"20\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"21\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"22\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"23\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"24\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"25\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"26\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"27\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"28\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"29\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"30\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"31\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"32\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"33\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"34\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"35\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"36\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"37\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"38\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"39\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"40\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"41\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"42\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"43\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"44\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"45\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"46\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"47\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"48\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"49\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"50\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"51\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"52\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"53\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"54\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"55\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"56\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"57\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"58\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"59\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"60\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"61\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"62\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"63\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"64\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"65\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"66\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"67\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"68\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"69\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"70\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"71\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"72\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"73\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"74\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"75\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"76\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"77\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"78\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"79\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"80\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"81\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"82\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"83\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"84\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"85\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"86\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"87\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"88\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"89\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"90\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"91\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"92\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"93\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"94\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"95\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"96\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"97\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"98\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"99\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"100\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"101\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"102\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"103\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"104\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"105\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"106\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"107\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"108\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"109\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"110\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"111\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"112\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"113\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"114\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"115\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"116\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"117\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"118\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"119\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"120\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"121\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"122\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"123\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"124\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"125\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"126\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"127\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"128\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"129\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"130\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"131\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"132\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"133\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"134\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"135\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"136\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"137\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"138\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"139\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"140\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"141\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"142\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"143\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"144\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"145\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"146\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"147\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"148\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"149\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"150\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"151\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"152\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"153\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"154\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"155\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"156\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"157\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"158\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"159\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"160\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"161\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"162\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"163\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"164\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"165\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"166\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"167\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"168\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"169\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"170\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"171\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"172\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"173\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"174\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"175\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"176\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"177\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"178\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"179\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"180\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"181\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"182\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"183\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"184\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"185\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"186\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"187\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"188\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"189\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"190\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"191\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"192\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"193\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"194\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"195\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"196\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"197\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"198\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"199\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"200\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"201\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"202\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"203\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"204\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"205\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"206\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"207\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"208\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"209\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"210\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"211\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"212\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"213\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"214\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"215\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"216\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"217\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"218\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"219\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"220\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"221\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"222\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"223\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"224\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"225\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"226\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"227\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"228\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"229\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"230\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"231\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"232\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"233\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"234\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"235\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"236\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"237\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"238\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"239\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"240\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"241\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"242\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"243\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"244\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"245\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"246\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"247\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"248\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"249\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"250\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"251\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"252\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"253\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"254\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"255\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"256\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"257\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"258\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"259\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"260\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"261\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"262\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"263\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"264\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"265\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"266\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"267\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"268\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"269\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"270\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"271\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"272\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"273\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"274\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"275\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"276\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"277\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"278\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"279\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"280\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"281\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"282\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"283\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"284\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"285\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"286\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"287\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"288\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"289\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"290\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"291\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"292\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"293\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"294\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"295\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"296\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"297\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"298\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"299\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"300\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"301\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"302\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"303\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"304\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"305\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"306\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"307\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"308\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"309\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"310\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"311\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"312\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"313\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"314\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"315\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"316\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"317\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"318\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"319\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"320\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"321\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"322\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"323\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"324\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"325\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"326\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"327\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"328\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"329\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"330\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"331\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"332\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"333\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"334\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"335\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"336\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"337\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"338\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"339\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"340\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"341\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"342\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"343\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"344\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"345\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"346\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"347\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"348\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"349\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"350\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"351\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"352\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"353\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"354\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"355\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"356\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"357\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"358\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"359\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"360\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"361\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"362\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"363\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"364\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"365\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"366\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"367\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"368\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"369\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"370\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"371\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"372\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"373\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"374\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"375\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"376\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"377\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"378\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"379\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"380\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"381\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"382\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"383\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"384\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"385\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"386\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"387\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"388\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"389\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"390\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"391\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"392\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"393\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"394\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"395\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"396\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"397\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"398\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"399\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"400\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"401\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"402\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"403\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"404\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"405\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"406\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"407\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"408\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"409\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"410\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"411\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"412\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"413\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"414\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"415\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"416\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"417\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"418\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"419\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"420\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"421\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"422\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"423\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"424\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"425\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"426\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"427\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"428\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"429\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"430\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"431\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"432\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"433\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"434\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"435\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"436\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"437\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"438\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"439\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"440\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"441\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"442\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"443\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"444\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"445\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"446\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"447\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"448\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"449\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"450\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"451\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"452\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"453\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"454\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"455\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"456\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"457\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"458\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"459\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"460\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"461\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"462\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"463\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"464\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"465\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"466\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"467\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"468\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"469\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"470\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"471\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"472\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"473\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"474\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"475\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"476\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"477\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"478\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"479\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"480\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"481\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"482\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"483\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"484\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"485\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"486\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"487\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"488\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"489\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"490\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"491\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"492\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"493\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"494\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"495\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"496\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"497\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"498\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"499\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"500\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"501\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"502\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"503\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"504\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"505\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"506\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"507\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"508\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"509\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"510\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"511\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"512\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"513\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"514\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"515\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"516\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"517\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"518\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"519\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"520\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"521\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"522\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"523\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"524\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"525\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"526\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"527\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"528\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"529\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"530\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"531\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"532\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"533\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"534\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"535\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"536\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"537\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"538\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"539\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"540\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"541\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"542\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"543\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"544\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"545\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"546\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"547\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"548\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"549\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"550\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"551\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"552\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"553\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"554\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"555\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"556\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"557\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"558\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"559\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"560\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"561\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"562\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"563\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"564\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"565\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"566\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"567\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"568\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"569\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"570\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"571\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"572\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"573\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"574\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"575\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"576\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"577\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"578\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"579\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"580\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"581\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"582\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"583\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"584\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"585\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"586\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"587\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"588\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"589\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"590\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"591\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"592\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"593\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"594\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"595\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"596\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"597\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"598\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"599\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"600\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"601\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"602\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"603\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"604\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"605\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"606\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"607\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"608\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"609\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"610\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"611\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"612\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"613\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"614\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"615\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"616\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"617\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"618\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"619\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"620\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"621\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"622\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"623\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"624\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"625\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"626\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"627\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"628\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"629\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"630\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"631\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"632\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"633\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"634\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"635\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"636\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"637\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"638\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"639\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"640\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"641\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"642\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"643\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"644\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"645\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"646\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"647\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"648\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"649\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"650\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"651\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"652\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"653\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"654\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"655\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"656\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"657\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"658\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"659\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"660\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"661\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"662\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"663\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"664\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"665\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"666\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"667\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"668\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"669\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"670\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"671\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"672\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"673\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"674\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"675\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"676\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"677\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"678\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"679\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"680\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"681\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"682\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"683\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"684\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"685\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"686\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"687\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"688\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"689\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"690\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"691\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"692\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"693\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"694\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"695\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"696\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"697\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"698\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"699\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"700\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"701\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"702\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"703\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"704\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"705\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"706\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"707\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"708\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"709\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"710\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"711\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"712\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"713\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"714\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"715\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"716\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"717\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"718\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"719\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"720\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"721\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"722\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"723\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"724\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"725\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"726\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"727\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"728\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"729\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"730\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"731\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"732\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"733\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"734\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"735\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"736\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"737\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"738\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"739\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"740\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"741\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"742\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"743\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"744\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"745\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"746\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"747\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"748\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"749\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"750\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"751\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"752\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"753\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"754\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"755\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"756\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"757\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"758\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"759\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"760\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"761\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"762\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"763\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"764\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"765\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"766\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"767\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"768\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"769\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"770\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"771\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"772\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"773\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"774\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"775\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"776\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"777\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"778\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"779\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"780\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"781\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"782\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"783\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"784\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"785\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"786\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"787\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"788\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"789\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"790\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"791\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"792\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"793\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"794\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"795\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"796\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"797\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"798\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"799\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"800\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"801\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"802\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"803\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"804\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"805\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"806\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"807\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"808\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"809\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"810\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"811\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"812\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"813\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"814\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"815\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"816\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"817\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"818\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"819\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"820\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"821\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"822\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"823\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"824\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"825\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"826\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"827\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"828\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"829\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"830\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"831\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"832\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"833\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"834\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"835\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"836\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"837\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"838\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"839\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"840\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"841\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"842\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"843\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"844\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"845\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"846\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"847\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"848\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"849\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"850\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"851\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"852\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"853\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"854\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"855\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"856\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"857\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"858\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"859\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"860\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"861\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"862\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"863\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"864\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"865\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"866\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"867\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"868\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"869\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"870\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"871\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"872\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"873\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"874\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"875\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"876\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"877\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"878\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"879\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"880\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"881\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"882\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"883\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"884\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"885\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"886\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"887\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"888\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"889\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"890\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"891\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"892\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"893\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"894\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"895\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"896\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"897\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"898\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"899\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"900\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"901\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"902\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"903\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"904\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"905\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"906\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"907\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"908\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"909\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"910\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"911\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"912\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"913\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"914\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"915\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"916\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"917\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"918\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"919\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"920\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"921\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"922\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"923\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"924\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"925\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"926\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"927\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"928\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"929\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"930\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"931\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"932\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"933\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"934\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"935\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"936\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"937\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"938\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"939\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"940\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"941\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"942\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"943\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"944\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"945\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"946\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"947\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"948\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"949\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"950\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"951\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"952\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"953\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"954\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"955\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"956\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"957\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"958\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"959\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"960\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"961\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"962\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"963\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"964\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"965\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"966\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"967\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"968\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"969\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"970\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"971\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"972\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"973\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"974\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"975\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"976\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"977\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"978\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"979\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"980\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"981\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"982\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"983\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"984\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"985\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"986\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"987\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"988\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"989\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"990\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"991\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"992\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"993\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"994\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"995\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"996\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"997\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"998\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"999\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1000\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1001\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1002\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1003\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1004\":  [293,293,293,293,293,293,293,293,293,293,  323], \n        \"1005\":  [293,293,293,293,293,293,293,293,293,293,  323]\n    }\n}"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/0/radius.json",
    "content": "{\n    \"name\": \"radius\",\n    \"data\":\n    {\n        \"1\":  [0.001], \n        \"2\":  [0.001], \n        \"3\":  [0.001], \n        \"4\":  [0.001], \n        \"5\":  [0.001], \n        \"6\":  [0.001], \n        \"7\":  [0.001], \n        \"8\":  [0.001], \n        \"9\":  [0.001], \n        \"10\":  [0.001], \n        \"11\":  [0.001], \n        \"12\":  [0.001], \n        \"13\":  [0.001], \n        \"14\":  [0.001], \n        \"15\":  [0.001], \n        \"16\":  [0.001], \n        \"17\":  [0.001], \n        \"18\":  [0.001], \n        \"19\":  [0.001], \n        \"20\":  [0.001], \n        \"21\":  [0.001], \n        \"22\":  [0.001], \n        \"23\":  [0.001], \n        \"24\":  [0.001], \n        \"25\":  [0.001], \n        \"26\":  [0.001], \n        \"27\":  [0.001], \n        \"28\":  [0.001], \n        \"29\":  [0.001], \n        \"30\":  [0.001], \n        \"31\":  [0.001], \n        \"32\":  [0.001], \n        \"33\":  [0.001], \n        \"34\":  [0.001], \n        \"35\":  [0.001], \n        \"36\":  [0.001], \n        \"37\":  [0.001], \n        \"38\":  [0.001], \n        \"39\":  [0.001], \n        \"40\":  [0.001], \n        \"41\":  [0.001], \n        \"42\":  [0.001], \n        \"43\":  [0.001], \n        \"44\":  [0.001], \n        \"45\":  [0.001], \n        \"46\":  [0.001], \n        \"47\":  [0.001], \n        \"48\":  [0.001], \n        \"49\":  [0.001], \n        \"50\":  [0.001], \n        \"51\":  [0.001], \n        \"52\":  [0.001], \n        \"53\":  [0.001], \n        \"54\":  [0.001], \n        \"55\":  [0.001], \n        \"56\":  [0.001], \n        \"57\":  [0.001], \n        \"58\":  [0.001], \n        \"59\":  [0.001], \n        \"60\":  [0.001], \n        \"61\":  [0.001], \n        \"62\":  [0.001], \n        \"63\":  [0.001], \n        \"64\":  [0.001], \n        \"65\":  [0.001], \n        \"66\":  [0.001], \n        \"67\":  [0.001], \n        \"68\":  [0.001], \n        \"69\":  [0.001], \n        \"70\":  [0.001], \n        \"71\":  [0.001], \n        \"72\":  [0.001], \n        \"73\":  [0.001], \n        \"74\":  [0.001], \n        \"75\":  [0.001], \n        \"76\":  [0.001], \n        \"77\":  [0.001], \n        \"78\":  [0.001], \n        \"79\":  [0.001], \n        \"80\":  [0.001], \n        \"81\":  [0.001], \n        \"82\":  [0.001], \n        \"83\":  [0.001], \n        \"84\":  [0.001], \n        \"85\":  [0.001], \n        \"86\":  [0.001], \n        \"87\":  [0.001], \n        \"88\":  [0.001], \n        \"89\":  [0.001], \n        \"90\":  [0.001], \n        \"91\":  [0.001], \n        \"92\":  [0.001], \n        \"93\":  [0.001], \n        \"94\":  [0.001], \n        \"95\":  [0.001], \n        \"96\":  [0.001], \n        \"97\":  [0.001], \n        \"98\":  [0.001], \n        \"99\":  [0.001], \n        \"100\":  [0.001], \n        \"101\":  [0.001], \n        \"102\":  [0.001], \n        \"103\":  [0.001], \n        \"104\":  [0.001], \n        \"105\":  [0.001], \n        \"106\":  [0.001], \n        \"107\":  [0.001], \n        \"108\":  [0.001], \n        \"109\":  [0.001], \n        \"110\":  [0.001], \n        \"111\":  [0.001], \n        \"112\":  [0.001], \n        \"113\":  [0.001], \n        \"114\":  [0.001], \n        \"115\":  [0.001], \n        \"116\":  [0.001], \n        \"117\":  [0.001], \n        \"118\":  [0.001], \n        \"119\":  [0.001], \n        \"120\":  [0.001], \n        \"121\":  [0.001], \n        \"122\":  [0.001], \n        \"123\":  [0.001], \n        \"124\":  [0.001], \n        \"125\":  [0.001], \n        \"126\":  [0.001], \n        \"127\":  [0.001], \n        \"128\":  [0.001], \n        \"129\":  [0.001], \n        \"130\":  [0.001], \n        \"131\":  [0.001], \n        \"132\":  [0.001], \n        \"133\":  [0.001], \n        \"134\":  [0.001], \n        \"135\":  [0.001], \n        \"136\":  [0.001], \n        \"137\":  [0.001], \n        \"138\":  [0.001], \n        \"139\":  [0.001], \n        \"140\":  [0.001], \n        \"141\":  [0.001], \n        \"142\":  [0.001], \n        \"143\":  [0.001], \n        \"144\":  [0.001], \n        \"145\":  [0.001], \n        \"146\":  [0.001], \n        \"147\":  [0.001], \n        \"148\":  [0.001], \n        \"149\":  [0.001], \n        \"150\":  [0.001], \n        \"151\":  [0.001], \n        \"152\":  [0.001], \n        \"153\":  [0.001], \n        \"154\":  [0.001], \n        \"155\":  [0.001], \n        \"156\":  [0.001], \n        \"157\":  [0.001], \n        \"158\":  [0.001], \n        \"159\":  [0.001], \n        \"160\":  [0.001], \n        \"161\":  [0.001], \n        \"162\":  [0.001], \n        \"163\":  [0.001], \n        \"164\":  [0.001], \n        \"165\":  [0.001], \n        \"166\":  [0.001], \n        \"167\":  [0.001], \n        \"168\":  [0.001], \n        \"169\":  [0.001], \n        \"170\":  [0.001], \n        \"171\":  [0.001], \n        \"172\":  [0.001], \n        \"173\":  [0.001], \n        \"174\":  [0.001], \n        \"175\":  [0.001], \n        \"176\":  [0.001], \n        \"177\":  [0.001], \n        \"178\":  [0.001], \n        \"179\":  [0.001], \n        \"180\":  [0.001], \n        \"181\":  [0.001], \n        \"182\":  [0.001], \n        \"183\":  [0.001], \n        \"184\":  [0.001], \n        \"185\":  [0.001], \n        \"186\":  [0.001], \n        \"187\":  [0.001], \n        \"188\":  [0.001], \n        \"189\":  [0.001], \n        \"190\":  [0.001], \n        \"191\":  [0.001], \n        \"192\":  [0.001], \n        \"193\":  [0.001], \n        \"194\":  [0.001], \n        \"195\":  [0.001], \n        \"196\":  [0.001], \n        \"197\":  [0.001], \n        \"198\":  [0.001], \n        \"199\":  [0.001], \n        \"200\":  [0.001], \n        \"201\":  [0.001], \n        \"202\":  [0.001], \n        \"203\":  [0.001], \n        \"204\":  [0.001], \n        \"205\":  [0.001], \n        \"206\":  [0.001], \n        \"207\":  [0.001], \n        \"208\":  [0.001], \n        \"209\":  [0.001], \n        \"210\":  [0.001], \n        \"211\":  [0.001], \n        \"212\":  [0.001], \n        \"213\":  [0.001], \n        \"214\":  [0.001], \n        \"215\":  [0.001], \n        \"216\":  [0.001], \n        \"217\":  [0.001], \n        \"218\":  [0.001], \n        \"219\":  [0.001], \n        \"220\":  [0.001], \n        \"221\":  [0.001], \n        \"222\":  [0.001], \n        \"223\":  [0.001], \n        \"224\":  [0.001], \n        \"225\":  [0.001], \n        \"226\":  [0.001], \n        \"227\":  [0.001], \n        \"228\":  [0.001], \n        \"229\":  [0.001], \n        \"230\":  [0.001], \n        \"231\":  [0.001], \n        \"232\":  [0.001], \n        \"233\":  [0.001], \n        \"234\":  [0.001], \n        \"235\":  [0.001], \n        \"236\":  [0.001], \n        \"237\":  [0.001], \n        \"238\":  [0.001], \n        \"239\":  [0.001], \n        \"240\":  [0.001], \n        \"241\":  [0.001], \n        \"242\":  [0.001], \n        \"243\":  [0.001], \n        \"244\":  [0.001], \n        \"245\":  [0.001], \n        \"246\":  [0.001], \n        \"247\":  [0.001], \n        \"248\":  [0.001], \n        \"249\":  [0.001], \n        \"250\":  [0.001], \n        \"251\":  [0.001], \n        \"252\":  [0.001], \n        \"253\":  [0.001], \n        \"254\":  [0.001], \n        \"255\":  [0.001], \n        \"256\":  [0.001], \n        \"257\":  [0.001], \n        \"258\":  [0.001], \n        \"259\":  [0.001], \n        \"260\":  [0.001], \n        \"261\":  [0.001], \n        \"262\":  [0.001], \n        \"263\":  [0.001], \n        \"264\":  [0.001], \n        \"265\":  [0.001], \n        \"266\":  [0.001], \n        \"267\":  [0.001], \n        \"268\":  [0.001], \n        \"269\":  [0.001], \n        \"270\":  [0.001], \n        \"271\":  [0.001], \n        \"272\":  [0.001], \n        \"273\":  [0.001], \n        \"274\":  [0.001], \n        \"275\":  [0.001], \n        \"276\":  [0.001], \n        \"277\":  [0.001], \n        \"278\":  [0.001], \n        \"279\":  [0.001], \n        \"280\":  [0.001], \n        \"281\":  [0.001], \n        \"282\":  [0.001], \n        \"283\":  [0.001], \n        \"284\":  [0.001], \n        \"285\":  [0.001], \n        \"286\":  [0.001], \n        \"287\":  [0.001], \n        \"288\":  [0.001], \n        \"289\":  [0.001], \n        \"290\":  [0.001], \n        \"291\":  [0.001], \n        \"292\":  [0.001], \n        \"293\":  [0.001], \n        \"294\":  [0.001], \n        \"295\":  [0.001], \n        \"296\":  [0.001], \n        \"297\":  [0.001], \n        \"298\":  [0.001], \n        \"299\":  [0.001], \n        \"300\":  [0.001], \n        \"301\":  [0.001], \n        \"302\":  [0.001], \n        \"303\":  [0.001], \n        \"304\":  [0.001], \n        \"305\":  [0.001], \n        \"306\":  [0.001], \n        \"307\":  [0.001], \n        \"308\":  [0.001], \n        \"309\":  [0.001], \n        \"310\":  [0.001], \n        \"311\":  [0.001], \n        \"312\":  [0.001], \n        \"313\":  [0.001], \n        \"314\":  [0.001], \n        \"315\":  [0.001], \n        \"316\":  [0.001], \n        \"317\":  [0.001], \n        \"318\":  [0.001], \n        \"319\":  [0.001], \n        \"320\":  [0.001], \n        \"321\":  [0.001], \n        \"322\":  [0.001], \n        \"323\":  [0.001], \n        \"324\":  [0.001], \n        \"325\":  [0.001], \n        \"326\":  [0.001], \n        \"327\":  [0.001], \n        \"328\":  [0.001], \n        \"329\":  [0.001], \n        \"330\":  [0.001], \n        \"331\":  [0.001], \n        \"332\":  [0.001], \n        \"333\":  [0.001], \n        \"334\":  [0.001], \n        \"335\":  [0.001], \n        \"336\":  [0.001], \n        \"337\":  [0.001], \n        \"338\":  [0.001], \n        \"339\":  [0.001], \n        \"340\":  [0.001], \n        \"341\":  [0.001], \n        \"342\":  [0.001], \n        \"343\":  [0.001], \n        \"344\":  [0.001], \n        \"345\":  [0.001], \n        \"346\":  [0.001], \n        \"347\":  [0.001], \n        \"348\":  [0.001], \n        \"349\":  [0.001], \n        \"350\":  [0.001], \n        \"351\":  [0.001], \n        \"352\":  [0.001], \n        \"353\":  [0.001], \n        \"354\":  [0.001], \n        \"355\":  [0.001], \n        \"356\":  [0.001], \n        \"357\":  [0.001], \n        \"358\":  [0.001], \n        \"359\":  [0.001], \n        \"360\":  [0.001], \n        \"361\":  [0.001], \n        \"362\":  [0.001], \n        \"363\":  [0.001], \n        \"364\":  [0.001], \n        \"365\":  [0.001], \n        \"366\":  [0.001], \n        \"367\":  [0.001], \n        \"368\":  [0.001], \n        \"369\":  [0.001], \n        \"370\":  [0.001], \n        \"371\":  [0.001], \n        \"372\":  [0.001], \n        \"373\":  [0.001], \n        \"374\":  [0.001], \n        \"375\":  [0.001], \n        \"376\":  [0.001], \n        \"377\":  [0.001], \n        \"378\":  [0.001], \n        \"379\":  [0.001], \n        \"380\":  [0.001], \n        \"381\":  [0.001], \n        \"382\":  [0.001], \n        \"383\":  [0.001], \n        \"384\":  [0.001], \n        \"385\":  [0.001], \n        \"386\":  [0.001], \n        \"387\":  [0.001], \n        \"388\":  [0.001], \n        \"389\":  [0.001], \n        \"390\":  [0.001], \n        \"391\":  [0.001], \n        \"392\":  [0.001], \n        \"393\":  [0.001], \n        \"394\":  [0.001], \n        \"395\":  [0.001], \n        \"396\":  [0.001], \n        \"397\":  [0.001], \n        \"398\":  [0.001], \n        \"399\":  [0.001], \n        \"400\":  [0.001], \n        \"401\":  [0.001], \n        \"402\":  [0.001], \n        \"403\":  [0.001], \n        \"404\":  [0.001], \n        \"405\":  [0.001], \n        \"406\":  [0.001], \n        \"407\":  [0.001], \n        \"408\":  [0.001], \n        \"409\":  [0.001], \n        \"410\":  [0.001], \n        \"411\":  [0.001], \n        \"412\":  [0.001], \n        \"413\":  [0.001], \n        \"414\":  [0.001], \n        \"415\":  [0.001], \n        \"416\":  [0.001], \n        \"417\":  [0.001], \n        \"418\":  [0.001], \n        \"419\":  [0.001], \n        \"420\":  [0.001], \n        \"421\":  [0.001], \n        \"422\":  [0.001], \n        \"423\":  [0.001], \n        \"424\":  [0.001], \n        \"425\":  [0.001], \n        \"426\":  [0.001], \n        \"427\":  [0.001], \n        \"428\":  [0.001], \n        \"429\":  [0.001], \n        \"430\":  [0.001], \n        \"431\":  [0.001], \n        \"432\":  [0.001], \n        \"433\":  [0.001], \n        \"434\":  [0.001], \n        \"435\":  [0.001], \n        \"436\":  [0.001], \n        \"437\":  [0.001], \n        \"438\":  [0.001], \n        \"439\":  [0.001], \n        \"440\":  [0.001], \n        \"441\":  [0.001], \n        \"442\":  [0.001], \n        \"443\":  [0.001], \n        \"444\":  [0.001], \n        \"445\":  [0.001], \n        \"446\":  [0.001], \n        \"447\":  [0.001], \n        \"448\":  [0.001], \n        \"449\":  [0.001], \n        \"450\":  [0.001], \n        \"451\":  [0.001], \n        \"452\":  [0.001], \n        \"453\":  [0.001], \n        \"454\":  [0.001], \n        \"455\":  [0.001], \n        \"456\":  [0.001], \n        \"457\":  [0.001], \n        \"458\":  [0.001], \n        \"459\":  [0.001], \n        \"460\":  [0.001], \n        \"461\":  [0.001], \n        \"462\":  [0.001], \n        \"463\":  [0.001], \n        \"464\":  [0.001], \n        \"465\":  [0.001], \n        \"466\":  [0.001], \n        \"467\":  [0.001], \n        \"468\":  [0.001], \n        \"469\":  [0.001], \n        \"470\":  [0.001], \n        \"471\":  [0.001], \n        \"472\":  [0.001], \n        \"473\":  [0.001], \n        \"474\":  [0.001], \n        \"475\":  [0.001], \n        \"476\":  [0.001], \n        \"477\":  [0.001], \n        \"478\":  [0.001], \n        \"479\":  [0.001], \n        \"480\":  [0.001], \n        \"481\":  [0.001], \n        \"482\":  [0.001], \n        \"483\":  [0.001], \n        \"484\":  [0.001], \n        \"485\":  [0.001], \n        \"486\":  [0.001], \n        \"487\":  [0.001], \n        \"488\":  [0.001], \n        \"489\":  [0.001], \n        \"490\":  [0.001], \n        \"491\":  [0.001], \n        \"492\":  [0.001], \n        \"493\":  [0.001], \n        \"494\":  [0.001], \n        \"495\":  [0.001], \n        \"496\":  [0.001], \n        \"497\":  [0.001], \n        \"498\":  [0.001], \n        \"499\":  [0.001], \n        \"500\":  [0.001], \n        \"501\":  [0.001], \n        \"502\":  [0.001], \n        \"503\":  [0.001], \n        \"504\":  [0.001], \n        \"505\":  [0.001], \n        \"506\":  [0.001], \n        \"507\":  [0.001], \n        \"508\":  [0.001], \n        \"509\":  [0.001], \n        \"510\":  [0.001], \n        \"511\":  [0.001], \n        \"512\":  [0.001], \n        \"513\":  [0.001], \n        \"514\":  [0.001], \n        \"515\":  [0.001], \n        \"516\":  [0.001], \n        \"517\":  [0.001], \n        \"518\":  [0.001], \n        \"519\":  [0.001], \n        \"520\":  [0.001], \n        \"521\":  [0.001], \n        \"522\":  [0.001], \n        \"523\":  [0.001], \n        \"524\":  [0.001], \n        \"525\":  [0.001], \n        \"526\":  [0.001], \n        \"527\":  [0.001], \n        \"528\":  [0.001], \n        \"529\":  [0.001], \n        \"530\":  [0.001], \n        \"531\":  [0.001], \n        \"532\":  [0.001], \n        \"533\":  [0.001], \n        \"534\":  [0.001], \n        \"535\":  [0.001], \n        \"536\":  [0.001], \n        \"537\":  [0.001], \n        \"538\":  [0.001], \n        \"539\":  [0.001], \n        \"540\":  [0.001], \n        \"541\":  [0.001], \n        \"542\":  [0.001], \n        \"543\":  [0.001], \n        \"544\":  [0.001], \n        \"545\":  [0.001], \n        \"546\":  [0.001], \n        \"547\":  [0.001], \n        \"548\":  [0.001], \n        \"549\":  [0.001], \n        \"550\":  [0.001], \n        \"551\":  [0.001], \n        \"552\":  [0.001], \n        \"553\":  [0.001], \n        \"554\":  [0.001], \n        \"555\":  [0.001], \n        \"556\":  [0.001], \n        \"557\":  [0.001], \n        \"558\":  [0.001], \n        \"559\":  [0.001], \n        \"560\":  [0.001], \n        \"561\":  [0.001], \n        \"562\":  [0.001], \n        \"563\":  [0.001], \n        \"564\":  [0.001], \n        \"565\":  [0.001], \n        \"566\":  [0.001], \n        \"567\":  [0.001], \n        \"568\":  [0.001], \n        \"569\":  [0.001], \n        \"570\":  [0.001], \n        \"571\":  [0.001], \n        \"572\":  [0.001], \n        \"573\":  [0.001], \n        \"574\":  [0.001], \n        \"575\":  [0.001], \n        \"576\":  [0.001], \n        \"577\":  [0.001], \n        \"578\":  [0.001], \n        \"579\":  [0.001], \n        \"580\":  [0.001], \n        \"581\":  [0.001], \n        \"582\":  [0.001], \n        \"583\":  [0.001], \n        \"584\":  [0.001], \n        \"585\":  [0.001], \n        \"586\":  [0.001], \n        \"587\":  [0.001], \n        \"588\":  [0.001], \n        \"589\":  [0.001], \n        \"590\":  [0.001], \n        \"591\":  [0.001], \n        \"592\":  [0.001], \n        \"593\":  [0.001], \n        \"594\":  [0.001], \n        \"595\":  [0.001], \n        \"596\":  [0.001], \n        \"597\":  [0.001], \n        \"598\":  [0.001], \n        \"599\":  [0.001], \n        \"600\":  [0.001], \n        \"601\":  [0.001], \n        \"602\":  [0.001], \n        \"603\":  [0.001], \n        \"604\":  [0.001], \n        \"605\":  [0.001], \n        \"606\":  [0.001], \n        \"607\":  [0.001], \n        \"608\":  [0.001], \n        \"609\":  [0.001], \n        \"610\":  [0.001], \n        \"611\":  [0.001], \n        \"612\":  [0.001], \n        \"613\":  [0.001], \n        \"614\":  [0.001], \n        \"615\":  [0.001], \n        \"616\":  [0.001], \n        \"617\":  [0.001], \n        \"618\":  [0.001], \n        \"619\":  [0.001], \n        \"620\":  [0.001], \n        \"621\":  [0.001], \n        \"622\":  [0.001], \n        \"623\":  [0.001], \n        \"624\":  [0.001], \n        \"625\":  [0.001], \n        \"626\":  [0.001], \n        \"627\":  [0.001], \n        \"628\":  [0.001], \n        \"629\":  [0.001], \n        \"630\":  [0.001], \n        \"631\":  [0.001], \n        \"632\":  [0.001], \n        \"633\":  [0.001], \n        \"634\":  [0.001], \n        \"635\":  [0.001], \n        \"636\":  [0.001], \n        \"637\":  [0.001], \n        \"638\":  [0.001], \n        \"639\":  [0.001], \n        \"640\":  [0.001], \n        \"641\":  [0.001], \n        \"642\":  [0.001], \n        \"643\":  [0.001], \n        \"644\":  [0.001], \n        \"645\":  [0.001], \n        \"646\":  [0.001], \n        \"647\":  [0.001], \n        \"648\":  [0.001], \n        \"649\":  [0.001], \n        \"650\":  [0.001], \n        \"651\":  [0.001], \n        \"652\":  [0.001], \n        \"653\":  [0.001], \n        \"654\":  [0.001], \n        \"655\":  [0.001], \n        \"656\":  [0.001], \n        \"657\":  [0.001], \n        \"658\":  [0.001], \n        \"659\":  [0.001], \n        \"660\":  [0.001], \n        \"661\":  [0.001], \n        \"662\":  [0.001], \n        \"663\":  [0.001], \n        \"664\":  [0.001], \n        \"665\":  [0.001], \n        \"666\":  [0.001], \n        \"667\":  [0.001], \n        \"668\":  [0.001], \n        \"669\":  [0.001], \n        \"670\":  [0.001], \n        \"671\":  [0.001], \n        \"672\":  [0.001], \n        \"673\":  [0.001], \n        \"674\":  [0.001], \n        \"675\":  [0.001], \n        \"676\":  [0.001], \n        \"677\":  [0.001], \n        \"678\":  [0.001], \n        \"679\":  [0.001], \n        \"680\":  [0.001], \n        \"681\":  [0.001], \n        \"682\":  [0.001], \n        \"683\":  [0.001], \n        \"684\":  [0.001], \n        \"685\":  [0.001], \n        \"686\":  [0.001], \n        \"687\":  [0.001], \n        \"688\":  [0.001], \n        \"689\":  [0.001], \n        \"690\":  [0.001], \n        \"691\":  [0.001], \n        \"692\":  [0.001], \n        \"693\":  [0.001], \n        \"694\":  [0.001], \n        \"695\":  [0.001], \n        \"696\":  [0.001], \n        \"697\":  [0.001], \n        \"698\":  [0.001], \n        \"699\":  [0.001], \n        \"700\":  [0.001], \n        \"701\":  [0.001], \n        \"702\":  [0.001], \n        \"703\":  [0.001], \n        \"704\":  [0.001], \n        \"705\":  [0.001], \n        \"706\":  [0.001], \n        \"707\":  [0.001], \n        \"708\":  [0.001], \n        \"709\":  [0.001], \n        \"710\":  [0.001], \n        \"711\":  [0.001], \n        \"712\":  [0.001], \n        \"713\":  [0.001], \n        \"714\":  [0.001], \n        \"715\":  [0.001], \n        \"716\":  [0.001], \n        \"717\":  [0.001], \n        \"718\":  [0.001], \n        \"719\":  [0.001], \n        \"720\":  [0.001], \n        \"721\":  [0.001], \n        \"722\":  [0.001], \n        \"723\":  [0.001], \n        \"724\":  [0.001], \n        \"725\":  [0.001], \n        \"726\":  [0.001], \n        \"727\":  [0.001], \n        \"728\":  [0.001], \n        \"729\":  [0.001], \n        \"730\":  [0.001], \n        \"731\":  [0.001], \n        \"732\":  [0.001], \n        \"733\":  [0.001], \n        \"734\":  [0.001], \n        \"735\":  [0.001], \n        \"736\":  [0.001], \n        \"737\":  [0.001], \n        \"738\":  [0.001], \n        \"739\":  [0.001], \n        \"740\":  [0.001], \n        \"741\":  [0.001], \n        \"742\":  [0.001], \n        \"743\":  [0.001], \n        \"744\":  [0.001], \n        \"745\":  [0.001], \n        \"746\":  [0.001], \n        \"747\":  [0.001], \n        \"748\":  [0.001], \n        \"749\":  [0.001], \n        \"750\":  [0.001], \n        \"751\":  [0.001], \n        \"752\":  [0.001], \n        \"753\":  [0.001], \n        \"754\":  [0.001], \n        \"755\":  [0.001], \n        \"756\":  [0.001], \n        \"757\":  [0.001], \n        \"758\":  [0.001], \n        \"759\":  [0.001], \n        \"760\":  [0.001], \n        \"761\":  [0.001], \n        \"762\":  [0.001], \n        \"763\":  [0.001], \n        \"764\":  [0.001], \n        \"765\":  [0.001], \n        \"766\":  [0.001], \n        \"767\":  [0.001], \n        \"768\":  [0.001], \n        \"769\":  [0.001], \n        \"770\":  [0.001], \n        \"771\":  [0.001], \n        \"772\":  [0.001], \n        \"773\":  [0.001], \n        \"774\":  [0.001], \n        \"775\":  [0.001], \n        \"776\":  [0.001], \n        \"777\":  [0.001], \n        \"778\":  [0.001], \n        \"779\":  [0.001], \n        \"780\":  [0.001], \n        \"781\":  [0.001], \n        \"782\":  [0.001], \n        \"783\":  [0.001], \n        \"784\":  [0.001], \n        \"785\":  [0.001], \n        \"786\":  [0.001], \n        \"787\":  [0.001], \n        \"788\":  [0.001], \n        \"789\":  [0.001], \n        \"790\":  [0.001], \n        \"791\":  [0.001], \n        \"792\":  [0.001], \n        \"793\":  [0.001], \n        \"794\":  [0.001], \n        \"795\":  [0.001], \n        \"796\":  [0.001], \n        \"797\":  [0.001], \n        \"798\":  [0.001], \n        \"799\":  [0.001], \n        \"800\":  [0.001], \n        \"801\":  [0.001], \n        \"802\":  [0.001], \n        \"803\":  [0.001], \n        \"804\":  [0.001], \n        \"805\":  [0.001], \n        \"806\":  [0.001], \n        \"807\":  [0.001], \n        \"808\":  [0.001], \n        \"809\":  [0.001], \n        \"810\":  [0.001], \n        \"811\":  [0.001], \n        \"812\":  [0.001], \n        \"813\":  [0.001], \n        \"814\":  [0.001], \n        \"815\":  [0.001], \n        \"816\":  [0.001], \n        \"817\":  [0.001], \n        \"818\":  [0.001], \n        \"819\":  [0.001], \n        \"820\":  [0.001], \n        \"821\":  [0.001], \n        \"822\":  [0.001], \n        \"823\":  [0.001], \n        \"824\":  [0.001], \n        \"825\":  [0.001], \n        \"826\":  [0.001], \n        \"827\":  [0.001], \n        \"828\":  [0.001], \n        \"829\":  [0.001], \n        \"830\":  [0.001], \n        \"831\":  [0.001], \n        \"832\":  [0.001], \n        \"833\":  [0.001], \n        \"834\":  [0.001], \n        \"835\":  [0.001], \n        \"836\":  [0.001], \n        \"837\":  [0.001], \n        \"838\":  [0.001], \n        \"839\":  [0.001], \n        \"840\":  [0.001], \n        \"841\":  [0.001], \n        \"842\":  [0.001], \n        \"843\":  [0.001], \n        \"844\":  [0.001], \n        \"845\":  [0.001], \n        \"846\":  [0.001], \n        \"847\":  [0.001], \n        \"848\":  [0.001], \n        \"849\":  [0.001], \n        \"850\":  [0.001], \n        \"851\":  [0.001], \n        \"852\":  [0.001], \n        \"853\":  [0.001], \n        \"854\":  [0.001], \n        \"855\":  [0.001], \n        \"856\":  [0.001], \n        \"857\":  [0.001], \n        \"858\":  [0.001], \n        \"859\":  [0.001], \n        \"860\":  [0.001], \n        \"861\":  [0.001], \n        \"862\":  [0.001], \n        \"863\":  [0.001], \n        \"864\":  [0.001], \n        \"865\":  [0.001], \n        \"866\":  [0.001], \n        \"867\":  [0.001], \n        \"868\":  [0.001], \n        \"869\":  [0.001], \n        \"870\":  [0.001], \n        \"871\":  [0.001], \n        \"872\":  [0.001], \n        \"873\":  [0.001], \n        \"874\":  [0.001], \n        \"875\":  [0.001], \n        \"876\":  [0.001], \n        \"877\":  [0.001], \n        \"878\":  [0.001], \n        \"879\":  [0.001], \n        \"880\":  [0.001], \n        \"881\":  [0.001], \n        \"882\":  [0.001], \n        \"883\":  [0.001], \n        \"884\":  [0.001], \n        \"885\":  [0.001], \n        \"886\":  [0.001], \n        \"887\":  [0.001], \n        \"888\":  [0.001], \n        \"889\":  [0.001], \n        \"890\":  [0.001], \n        \"891\":  [0.001], \n        \"892\":  [0.001], \n        \"893\":  [0.001], \n        \"894\":  [0.001], \n        \"895\":  [0.001], \n        \"896\":  [0.001], \n        \"897\":  [0.001], \n        \"898\":  [0.001], \n        \"899\":  [0.001], \n        \"900\":  [0.001], \n        \"901\":  [0.001], \n        \"902\":  [0.001], \n        \"903\":  [0.001], \n        \"904\":  [0.001], \n        \"905\":  [0.001], \n        \"906\":  [0.001], \n        \"907\":  [0.001], \n        \"908\":  [0.001], \n        \"909\":  [0.001], \n        \"910\":  [0.001], \n        \"911\":  [0.001], \n        \"912\":  [0.001], \n        \"913\":  [0.001], \n        \"914\":  [0.001], \n        \"915\":  [0.001], \n        \"916\":  [0.001], \n        \"917\":  [0.001], \n        \"918\":  [0.001], \n        \"919\":  [0.001], \n        \"920\":  [0.001], \n        \"921\":  [0.001], \n        \"922\":  [0.001], \n        \"923\":  [0.001], \n        \"924\":  [0.001], \n        \"925\":  [0.001], \n        \"926\":  [0.001], \n        \"927\":  [0.001], \n        \"928\":  [0.001], \n        \"929\":  [0.001], \n        \"930\":  [0.001], \n        \"931\":  [0.001], \n        \"932\":  [0.001], \n        \"933\":  [0.001], \n        \"934\":  [0.001], \n        \"935\":  [0.001], \n        \"936\":  [0.001], \n        \"937\":  [0.001], \n        \"938\":  [0.001], \n        \"939\":  [0.001], \n        \"940\":  [0.001], \n        \"941\":  [0.001], \n        \"942\":  [0.001], \n        \"943\":  [0.001], \n        \"944\":  [0.001], \n        \"945\":  [0.001], \n        \"946\":  [0.001], \n        \"947\":  [0.001], \n        \"948\":  [0.001], \n        \"949\":  [0.001], \n        \"950\":  [0.001], \n        \"951\":  [0.001], \n        \"952\":  [0.001], \n        \"953\":  [0.001], \n        \"954\":  [0.001], \n        \"955\":  [0.001], \n        \"956\":  [0.001], \n        \"957\":  [0.001], \n        \"958\":  [0.001], \n        \"959\":  [0.001], \n        \"960\":  [0.001], \n        \"961\":  [0.001], \n        \"962\":  [0.001], \n        \"963\":  [0.001], \n        \"964\":  [0.001], \n        \"965\":  [0.001], \n        \"966\":  [0.001], \n        \"967\":  [0.001], \n        \"968\":  [0.001], \n        \"969\":  [0.001], \n        \"970\":  [0.001], \n        \"971\":  [0.001], \n        \"972\":  [0.001], \n        \"973\":  [0.001], \n        \"974\":  [0.001], \n        \"975\":  [0.001], \n        \"976\":  [0.001], \n        \"977\":  [0.001], \n        \"978\":  [0.001], \n        \"979\":  [0.001], \n        \"980\":  [0.001], \n        \"981\":  [0.001], \n        \"982\":  [0.001], \n        \"983\":  [0.001], \n        \"984\":  [0.001], \n        \"985\":  [0.001], \n        \"986\":  [0.001], \n        \"987\":  [0.001], \n        \"988\":  [0.001], \n        \"989\":  [0.001], \n        \"990\":  [0.001], \n        \"991\":  [0.001], \n        \"992\":  [0.001], \n        \"993\":  [0.001], \n        \"994\":  [0.001], \n        \"995\":  [0.001], \n        \"996\":  [0.001], \n        \"997\":  [0.001], \n        \"998\":  [0.001], \n        \"999\":  [0.001], \n        \"1000\":  [0.001], \n        \"1001\":  [0.001], \n        \"1002\":  [0.001], \n        \"1003\":  [0.001], \n        \"1004\":  [0.001], \n        \"1005\":  [0.001]\n    }\n}"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/genPascalInput.m",
    "content": "% *.m file\nclear\nclc\nmore off\n\nnumberOfParticles = 1005\n\n%================================================================\ntext = '[293,293,293,293,293,293,293,293,293,293,  323]';\n\nfid=fopen('0/heat.json','w');\n\n% header\nfprintf(fid, ['{\\n']);\nfprintf(fid, ['    \"name\": \"heat\",\\n']);\nfprintf(fid, ['    \"data\":\\n']);\nfprintf(fid, ['    {\\n']);\n\nfor iP=1:numberOfParticles\n    index=iP;\n    fprintf(fid, ['        \"',num2str(index), '\":  ', text ]);\n    if(iP==numberOfParticles)\n        fprintf(fid, ['\\n']);\n    else\n        fprintf(fid, [', \\n']);\n    end        \nend\n\n% footer\nfprintf(fid, ['    }\\n']);\nfprintf(fid, ['}']);\nfclose(fid);\n%================================================================\ntext = '[0.001]';\n\nfid=fopen('0/radius.json','w');\n\n% header\nfprintf(fid, ['{\\n']);\nfprintf(fid, ['    \"name\": \"radius\",\\n']);\nfprintf(fid, ['    \"data\":\\n']);\nfprintf(fid, ['    {\\n']);\n\nfor iP=1:numberOfParticles\n    index=iP;\n    fprintf(fid, ['        \"',num2str(index), '\":  ', text ]);\n    if(iP==numberOfParticles)\n        fprintf(fid, ['\\n']);\n    else\n        fprintf(fid, [', \\n']);\n    end        \nend\n\n% footer\nfprintf(fid, ['    }\\n']);\nfprintf(fid, ['}']);\nfclose(fid);\n%================================================================\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/in.pascal",
    "content": "particle_mesh nGridPoints 10\n\nparticle_data number_particles 1005 \n#coupling json myCoupling\ncoupling liggghts\n\n#Heat properties\nmodel propertiesThermo heatThermalConductivity_solid \nmodel propertiesThermo heatCapacity_solid \nmodel propertiesThermo heatDensity_solid \n\n\n#Equations\n#Option 1: cool with implicit coupling\n#modelEqn 1DSpherical  heat     BC0 1  BC1 2\t# 2 Convective: will cool based on coefficient and fluid temp\n\n#Option 2: cool with explicit setting of flux\nmodelEqn 1DSpherical  heat     BC0 1  BC1 0\t# 0 Neumann: will cool with a fixed rate provided by LIGGGHTS\n\ncontrol outputTimeStep 0.1\ncontrol timeStep 5e-6\n#control run 0.000025 init yes\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/coupling_liggghts.json",
    "content": "{\n  \"properties\":\n  {\n    \"verbose\"  :  false,\n    \"pullEvery\":  1\n  }\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/integrator.json",
    "content": "{\n    \"integrator\":       \n    {\n        \"type\":             \"CVODE\",\n        \"linearSolver\":     \"CVDiag\"\n    },\n    \"parameters\":\n\t{\n      \"absTol\":     1e-6,\n      \"relTol\":     1e-6,\n      \"mxsteps\":    -1,\n      \"maxord\":     3,\n      \"deltaTInit\": 1e-10,\n      \"deltaTMin\":  1e-16,\n      \"deltaTMax\":  1.0,\n      \"maxNonLinearIterations\": 2\n    }\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/model_heatCapacity_solid.json",
    "content": "{\n    \"properties\":\n\t{\n      \"model\" :  \"const\",\n\t   \"const_value\" :  800.0\n    }\n\t\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/model_heatDensity_solid.json",
    "content": "{\n    \"properties\": \n\t{\n        \"model\": \"const\",\n        \"const_value\": 2500\n    }\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/model_heatThermalConductivity_solid.json",
    "content": "{\n    \"properties\":\n\t{\n    \t\"model\" :        \"const\",\n\t   \t\"const_value\" :  0.8 \n    }\n\t\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/pascal/settings/verbose.json",
    "content": "{\n    \"verbose\":\n    {\n    }\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/settings/parscale.json",
    "content": "{\n    \"input\":\n    {\n        \"writeJSON\" : true,\n        \"writeHDF5\" : false\n    }\n\n}\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1.;\n\nvertices\n(\n    (0. 0 -0.5)\n    (0.1 0 -0.5)\n    (0.1 0.1 -0.5)\n    (0. 0.1 -0.5)\n    (0. 0 1.5)\n    (0.1 0 1.5)\n    (0.1 0.1 1.5)\n    (0. 0.1 1.5)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (2 2 33) simpleGrading (1 1 1)\n);\n\nedges\n(\n);\n\npatches\n(\n    wall inlet\n    (\n        (0 3 2 1)\n    )\n    wall outlet\n    (\n        (4 5 6 7)\n    )\n    wall wall\n    (\n        (3 7 6 2)\n        (1 5 4 0)\n        (0 4 7 3)\n        (2 6 5 1)\n    )\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPisoSTM;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;//1.5;\n\ndeltaT          0.005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.1;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nmaxDeltaT       1;\n\n//libs ( \"libgroovyBC.so\" );\n//#include \"libsAndFunctionsOF3x\"\n//#include \"libsAndFunctionsOF4x\"\n#include \"libsAndFunctionsOF5x\"\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/controlDict.foam",
    "content": ""
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/decomposeParDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      decomposeParDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains 2;\n\nmethod          simple;\n\nsimpleCoeffs\n{\n    n               ( 1 1 2 );\n    delta           0.001;\n}\n\nhierarchicalCoeffs\n{\n    n               ( 2 2 1 );\n    delta           0.001;\n    order           xyz;\n}\n\nmetisCoeffs\n{\n}\n\nmanualCoeffs\n{\n    dataFile        \"\";\n}\n\ndistributed     no;\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n    div(phi,T)      Gauss limitedLinear 1; //Gauss upwind; //\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n    laplacian((DT*voidfraction),T) Gauss linear corrected;    \n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    UFinal\n    {\n        $U\n    }\n\n    \"(k|epsilon)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0.1;\n    }\n    \"(k|epsilon)Final\"\n    {\n        $epsilon;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(T|C)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-06;\n        relTol          0;\n    }\n}\n\nPIMPLE\n{\n    nOuterCorrectors 1;\n}\nrelaxationFactors\n{\n    fields\n    {\n\t    p\t1.0;\n    }\n    equations\n    {\n        \"U.*\"           1.0;\n        \"k.*\"           1.;\n        \"epsilon.*\"    1.;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/libsAndFunctionsOF3x",
    "content": "functions\n(\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.05 0.05 -0.499)\n            (0.05 0.05 1.499)\n        );\n\n        // Fields to be probed\n        fields ( p T );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n    volFlow_inlet\n    {\n        type            faceSource;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        enabled         true;\n        outputControl   outputTime;//timeStep;\n        log             true;\n\t    writeArea\t    true; //write for OF 3.0 to be consistent\n        valueOutput     true;\n        source          patch;\n        sourceName      inlet;\n        operation       sum;\n\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_outlet\n    {\n        type            faceSource;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        enabled         true;\n        outputControl   outputTime;//timeStep;\n        log             true;\n        writeArea       true; //write for OF 3.0 to be consistent\n        valueOutput     true;\n        source          patch;\n        sourceName      outlet;\n        operation       sum;\n\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_wall\n    {\n        type            faceSource;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        enabled         true;\n        outputControl   outputTime;//timeStep;\n        log             true;\n        writeArea       true; //write for OF 3.0 to be consistent\n        valueOutput     true;\n        source          patch;\n        sourceName      wall;\n        operation       sum;\n\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n/*\n// simpleFunctionObjects\n   heatFlux\n   {\n     type patchHeatFlux;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     cp 1007;       // cp in [J/(kg*K)]\n     factor  1.188; // density for incomp solvers!\n   }\n\n   massFlux\n   {\n     type patchMassFlow;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     factor  1.188; // density for incomp solvers!\n   }\n\n   pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }\n\n   T\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     factor  1;\n   }*/\n);\n// ************************************************************************* // \n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/libsAndFunctionsOF4x",
    "content": "functions\n{\n\n    probes\n    {\n        libs ( \"libsampling.so\" );  \n        type        probes;\n        name        probes;\n        writeControl   timeStep; //outputTime;\n        writeInterval  1;\n        fields ( p T );\n        probeLocations\n        (\n            (0.05 0.05 -0.499)\n            (0.05 0.05 1.499)\n        );\n    }\n\n    volFlow_inlet\n    {\n        type           \t\t surfaceRegion;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         inlet;\n        operation      \t\t sum;\n        valueOutput     true;\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_outlet\n    {\n        type           \t\t surfaceRegion;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         outlet;\n        operation      \t\t sum;\n        valueOutput     true;\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_wall\n    {\n        type           \t\t surfaceRegion;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         wall;\n        operation      \t\t sum;\n        valueOutput     true;\n\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n// simpleFunctionObjects\n   /*heatFlux\n   {\n     type patchHeatFlux;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     cp 1007;       // cp in [J/(kg*K)]\n     factor  1.188; // density for incomp solvers!\n   }*/\n   massFlux\n   {\n     type patchMassFlow;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     factor  1.188; // density for incomp solvers!\n   }\n\n   pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }\n\n   T\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     factor  1;\n   }\n};\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/CFD/system/libsAndFunctionsOF5x",
    "content": "functions\n{\n\n    probes\n    {\n        libs ( \"libsampling.so\" );  \n        type        probes;\n        name        probes;\n        writeControl   timeStep; //outputTime;\n        writeInterval  1;\n        fields ( p T );\n        probeLocations\n        (\n            (0.05 0.05 -0.499)\n            (0.05 0.05 1.499)\n        );\n    }\n\n    volFlow_inlet\n    {\n        type           \t\t surfaceFieldValue;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         inlet;\n        operation      \t\t sum;\n        valueOutput     true;\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_outlet\n    {\n        type           \t\t surfaceFieldValue;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         outlet;\n        operation      \t\t sum;\n        valueOutput     true;\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n\n    volFlow_wall\n    {\n        type           \t\t surfaceFieldValue;\n        functionObjectLibs \t (\"libfieldFunctionObjects.so\");\n        writeControl  \t \t writeTime;\n        log \t\t\t yes;\n        writeFields\t         true; //write for OF 3.0 to be consistent\n        regionType               patch;\n        name     \t         wall;\n        operation      \t\t sum;\n        valueOutput     true;\n\n        fields\n        (\n            phi\n        );\n        surfaceFormat null;\n    }\n// simpleFunctionObjects\n   /*heatFlux\n   {\n     type patchHeatFlux;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     cp 1007;       // cp in [J/(kg*K)]\n     factor  1.188; // density for incomp solvers!\n   }*/\n   massFlux\n   {\n     type patchMassFlow;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     factor  1.188; // density for incomp solvers!\n   }\n\n   pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }\n\n   T\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n\n     outputControlMode timeStep;\n     outputInterval    1;\n     writeStartTime    no;\n\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     factor  1;\n   }\n};\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\nregion          reg block 0. 0.1 0. 0.1 0. 1.1 units box\ncreate_box      1 reg\n\nneighbor        0.002 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history #Hertzian without cohesion\npair_coeff  * *\n\ntimestep    0.00001\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n\n# particle distributions and insertion\nregion      bc block 0. 0.1 0. 0.1 0. 1.1 units box\nfix         pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.011\nfix         pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix         ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -3. insert_every 10000 overlapcheck yes all_in yes particles_in_region 1005 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol #f_heattransfer\nthermo          1000\nthermo_modify   lost ignore norm no\n\n#insert the first particles\nrun             1\ndump            dmp all custom 1000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius #f_heattransfer[0] f_heatFlux[0]\n\nrun             150000\n\nwrite_restart   post/restart/liggghts.restart\n\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\n#######################################################\n# variables                                           #\n#######################################################\nvariable r0 equal 0.011\n#######################################################\n\n# read packed bed and calc convective heat transfer\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        ${r0} bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0. 0. -1.\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\n# cfd coupling\nfix         cfd all couple/cfd couple_every 100 mpi\nfix         cfd2 all couple/cfd/force/implicit\n\n\n# heat transfer\nfix         ftco all property/global thermalConductivity peratomtype 5. # lambda in [W/(K*m)]\nfix         ftca all property/global thermalCapacity peratomtype 0.1    # cp in [J/(kg*K)]\nfix         heattransfer all heat/gran initial_temperature 999 ##temperature not relevant - will be overwritten by ParScale\n\n#Option 1: cool with implicit coupling\n#fix     cfd3 all couple/cfd/convectiveImpl #this is an IMPLICIT coupling\n\n#Option 2: cool with explicit setting of flux\nfix     cfd3 all couple/cfd/convection T0 0 #Temperature is irrelevant, so set to 0\nfix     heatTransCoeff all property/atom heatTransCoeff scalar yes no no 0 #NOT USED, but pulled from ParScale by default, so need to provide something here!\nfix     heatFluid all property/atom heatFluid scalar yes no no 0 #NOT USED, but pulled from ParScale by default, so need to provide something here!\n\n# set particle temperature for the bed\nrun         0\nregion      total block INF INF INF INF INF INF units box\nset         region total property/atom Temp 600.\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n#------------------------------Parscale Coupling_pascal-----------------------------------------------\n\nfix         coupling_pascal all couple/pascal reneighbor_at_least_every 1 couple_every 1\nfix         heatAv          all property/atom heatAv    scalar no yes no none  #average temperature\nfix         TempMin         all property/atom TempMin   scalar no yes no none #minimum particle \n\n#-----------------------------------------------------------------------------------------------------\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\ndump        dmp all custom 20000 ../DEM/post/dump*.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius f_Temp[0] f_heatFlux[0] #f_speciesC[0] f_speciesCFlux[0]\n\nrun         1\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/cleanCase.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n#--------------------------------------------------------------------------------#\n\n\n\n#- clean up case\necho \"deleting data at: $casePath ?\"\n#read\nrm -r $casePath/*.e*\nrm -r $casePath/*.o*\nrm -r $casePath/log*\nrm -r $casePath/CFD/0.0*\nrm -r $casePath/CFD/log.*\nrm -r $casePath/CFD/averageProps\nrm -r $casePath/CFD/*.OpenFOAM\nrm -r $casePath/CFD/*.restart*\nrm -r $casePath/CFD/clockData\nrm -r $casePath/CFD/*.dat\nrm -r $casePath/CFD/*.profile\nrm -r $casePath/CFD/octave/*.dat\nrm -r $casePath/CFD/octave/*.eps\nrm -r $casePath/CFD/octave/octave-workspace\nrm -r $casePath/CFD/processor*\nrm -r $casePath/CFD/VTK\nrm -r $casePath/CFD/volAvU\nrm -r $casePath/CFD/couplingFiles\nrm -r $casePath/CFD/particles\nrm -r $casePath/CFD/probe*\nrm -r $casePath/CFD/postProcess*\nrm -r $casePath/CFD/particleProbes\nrm -r $casePath/CFD/*Restart*\nrm -r $casePath/CFD/*restart*\nrm -r $casePath/CFD/fluidFlowStats.res\nrm -r $casePath/CFD/constant/polyMesh/*.gz\nrm -r $casePath/CFD/constant/polyMesh/faces\nrm -r $casePath/CFD/constant/polyMesh/neighbour\nrm -r $casePath/CFD/constant/polyMesh/owner\nrm -r $casePath/CFD/constant/polyMesh/points\nrm -r $casePath/CFD/constant/polyMesh/boundary\nrm -r $casePath/CFD/constant/polyMesh/sets\nrm -r $casePath/CFD/processor*\nrm -r $casePath/DEM/postParticles/*\nrm -r $casePath/DEM/postGlobal/*\nrm -r $casePath/DEM/post/*.*\nrm -r $casePath/DEM/post/restart/*.*\nrm -r $casePath/DEM/log.*\nrm -r $casePath/DEM/*Restart*\nrm -r $casePath/DEM/*restart*\n\nrm -r $casePath/CFD/pascal/0.*\nrm -r $casePath/CFD/pascal/1.*\nrm -r $casePath/CFD/pascal/2.*\nrm -r $casePath/CFD/codeInfo.*\nrm -r $casePath/CFD/*.dat\n\necho \"done\"\n\n\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - May. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPisoSTM_packedBedTempParScale_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPisoSTM\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\ncleanup=\"true\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n#------------------------------#\nif [ $runOctave == \"true\" ]\n  then\n\n    #- change path\n    cd octave\n\n    #- rmove old graph\n    rm *.png\n\n    #- run octave\n    octave --no-gui totalPressureDropAndNusselt.m\n\n    #- show plots \n    eog cfdemSolverPisoSTM_Nusselt.png &\n    eog cfdemSolverPisoSTM_pressureDrop.png\n    #------------------------------#\n\n    #- copy log file to test harness\n    cp ../../$logfileName $testHarnessPath\n    cp cfdemSolverPisoSTM_Nusselt.png $testHarnessPath\n    cp cfdemSolverPisoSTM_pressureDrop.png $testHarnessPath\n\nfi\n\n#-------------------------------------------------------#\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nif [ $cleanup == \"true\" ]\n  then\n    #- clean up case\n    keepDEMrestart=\"false\"\n    cleanCFDEMcase $casePath/CFD $keepDEMrestart\nfi\n\n\n"
  },
  {
    "path": "tutorials/ParScale/cfdemSolverPisoSTM/packedBedTempParScale/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Daniel Queteschiner - June 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName\n\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for cfdemPostproc\n# Christoph Goniva - Nov. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\nliggghtsSim=\"true\"\ncfdemPostProc=\"true\"\npostproc=\"true\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ $liggghtsSim == \"true\" ]\n  then\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$casePath\"\n    headerText=\"run_liggghts_fillCylinder_DEM\"\n    logfileName=\"log_$headerText\"\n    solverName=\"in.liggghts_init\"\n    #--------------------------------------------------------------------------------#\n\n    #- clean up case\n    rm -r $casePath/DEM/post/*\n\n    #- call function to run DEM case\n    DEMrun $logpath $logfileName $casePath $headerText $solverName\n\n\n    #- generate VTK data (no longer needed as we directly write vtk)\n    #cd $casePath/DEM/post\n    #python $CFDEM_LPP_DIR/lpp.py  dump.liggghts_init\n\nfi\n\nif [ $cfdemPostProc == \"true\" ]\n  then\n    #--------------------------------------------------------------------------------#\n    #- define variables\n    logpath=\"$casePath\"\n    headerText=\"run_cfdemPostproc_fillCylinder_CFD\"\n    logfileName=\"log_$headerText\"\n    solverName=\"cfdemPostproc\"\n    debugMode=\"off\"          # on | off | strict\n    #--------------------------------------------------------------------------------#\n\n    #- clean up case\n    rm -r $casePath/CFD/0.*\n\n    #- call function to run CFD cas\n    CFDrun $logpath $logfileName $casePath $headerText $solverName $debugMode\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- get VTK data from CFD sim\n    #foamToVTK\n    \n    #- start paraview\n    echo \"\"\n    echo \"trying to start paraview...\"\n    #paraview4 # use your start command for paraview here\n    $HOME/software/ParaView-4.3.1-Linux-64bit/bin/paraview\n    read\nfi\n\n#- keep terminal open (if started in new terminal)\n#echo \"...press enter to clean up case\"\n#echo \"press Ctr+C to keep data\"\n#read\n\n#- clean up case\necho \"deleting data at: $casePath ?\\n\"\nread\nsource $WM_PROJECT_DIR/bin/tools/CleanFunctions\ncd $casePath/CFD\ncleanCase\nrm -r $casePath/CFD/postProcessing\nrm -r $casePath/CFD/lagrangian\nrm -r $casePath/CFD/clockData\nrm $casePath/CFD/octave/octave-workspace\nrm -r $casePath/CFD/hpctoolkit-*\nrm $casePath/DEM/post/*.*\ntouch $casePath/DEM/post/.gitignore\n#rm $casePath/DEM/post/restart/*.*\nrm $casePath/DEM/post/restart/liggghts.restartCFDEM*\ntouch $casePath/DEM/post/restart/.gitignore\necho \"done\"\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/0/dummy",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM Extend Project: Open Source CFD        |\n|  \\\\    /   O peration     | Version:  1.6-ext                               |\n|   \\\\  /    A nd           | Web:      www.extend-project.de                 |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       tetPointScalarField;\n    object      gagaga;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 0;\n\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;\n\nturbulence      off;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType A;\n\ncouplingInterval 10;\n\nvoidFractionModel divided; // centre; //\n\nlocateModel standard;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel oneWayVTK;\n\naveragingModel dense;\n\nclockModel off;\n\nsmoothingModel off;\n\nforceModels\n(\n    noDrag\n);\n\nmomCoupleModels\n(\n    off\n);\n\n//turbulenceModelType RASProperties;//OFversion24x\nturbulenceModelType turbulenceProperties;//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\ntypeConcentrationProps\n{\n    verbose true;\n    useDivided true;\n    normConcentrationReference 0.07;\n    typesA\n    (\n        1\n    );\n\n    typesB\n    (\n        2\n    );\n}\n\nnoDragProps\n{\n}\n\noneWayVTKProps\n{\n    DEMts 0.0001;\n    relativePath \"../DEM/post\";\n    couplingFilename \"liggghts_init%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ncentreProps\n{\n}\n\ndividedProps\n{\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n);\n\nexecuteProps0\n{\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-04;\n\nmovingPatchNames\n(\n    outlet\n    inlet\n);\n\nscaling         1.0;\n\niterations      1;\n\nshrinkMesh      true;\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel; //OFversion24x\nsimulationType  laminar;//OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.0                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\nversion  2.0;\nformat   ascii;\nclass       dictionary;\nobject      blockMeshDict;\n}\n// ************************************\n\n\n\n\n\n\n   meshGenApp blockMesh;\n   convertToMeters 1;\n\n    //64 mm column diameter\n    //15 cm length\n   \n   \n   \n    //Width of middle square section\n   \n   \n   \n   \n    //how many cells in the square section\n    //how many cells from square section to perimeter\n    // how many cells from top to bottom\n\n   vertices\n   (\n    ( 0.0069 0.0069 0.0  ) // Vertex fiveoclocksqb = 0 \n    (-0.0069 0.0069 0.0  ) // Vertex sevenoclocksqb = 1 \n    (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 \n    ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 \n    (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 \n    (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 \n    ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 \n\n    ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 \n    (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 \n    (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 \n    ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 \n    (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 \n    (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 \n    ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 \n   );\t\t\t\t\n\n   blocks\n   (\n    //square block\n    hex (\n       2 3 0 1   \n       10 11 8 9   \n       )\n    (8 8 24)\n    simpleGrading (1 1 1)\n\n    //slice1\n    hex (\n       1 0 4 5\n       9 8 12 13\n       )\n    (8 4 24)\n    simpleGrading (1 1 1)\n\n    //slice2\n    hex (\n       6 2 1  5 \n       14 10 9   13 \n       )\n   ( 4 8 24)\nsimpleGrading (1 1 1)\n\n   //slice3\n   hex (\n         6 7 3 2   \n         14 15 11 10   \n       )\n   (8 4 24)\nsimpleGrading (1 1 1)\n\n   //slice4\n   hex (\n         3 7 4 0  \n         11 15 12 8  \n       )\n   (4 8 24)\nsimpleGrading (1 1 1)\n\n   );\n\n\n   //create the quarter circles\n   edges\n   (\n    arc 4 5 (0.0 0.0138 0.0 )\n    arc 5 6 (-0.0138 0.0 0.0)\n    arc 6 7 (0.0 -0.0138 0.0 )\n    arc 7 4 (0.0138 0.0 0.0)\n\n    arc 12 13 (0.0 0.0138 0.0553 )\n    arc 13 14 (-0.0138 0.0 0.0553 )\n    arc 14 15 (0.0 -0.0138 0.0553 )\n    arc 15 12 (0.0138 0.0 0.0553 )\n\n   );\n\n   patches\n   (\n    patch inlet\n    (\n     (0 3 2 1)\n     (0 4 7 3)\n     (4 0 1 5)\n     (1 2 6 5)\n     (3 7 6 2)\n    )\n\n    patch outlet\n    (\n     (8 11 10 9)\n     (8 12 15 11)\n     (12 8 9 13)\n     (9 10 14 13)\n     (11 15 14 10)\n    )\n\n    wall wall\n    (\n     (5 4 12 13)\n     (5 13 14 6)\n     (6 14 15 7)\n     (7 15 12 4)\n    )\n\n);\n\nmergePatchPairs\n(\n);\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.003;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.001;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n// ************************************************************************* //\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.00003 1e-4 0.0001)\n            (0.00003 1e-4 0.01)\n            (0.00003 1e-4 0.02)\n            (0.00003 1e-4 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( voidfraction voidfractionNext voidfractionPrev);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n}\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.003;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.001;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         none;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((nuEff*dev(T(grad(U))))) Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         none;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    k\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    epsilon\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 1;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemPostproc/fillCylinder/DEM/in.liggghts_init",
    "content": "# Pour granular particles into chute container, then induce flow\necho        both\natom_style\tgranular\natom_modify\tmap array\ncommunicate\tsingle vel yes\n\nboundary\tm m m\nnewton\t\toff\n\nunits\t\tsi\n\nregion\t\treg block -0.015 0.015 -0.015 0.015 -0.001 0.0554 units box\ncreate_box\t2 reg\n\nneighbor\t0.001 bin\nneigh_modify\tdelay 0\n\n\n#Material properties required for new pair styles\n\nfix \t\tm1 all property/global youngsModulus peratomtype 5.e6 5.e6\nfix \t\tm2 all property/global poissonsRatio peratomtype 0.45 0.45\nfix \t\tm3 all property/global coefficientRestitution peratomtypepair 2 0.3 0.3 0.3 0.3\nfix \t\tm4 all property/global coefficientFriction peratomtypepair 2 0.5 0.5 0.5 0.5\n\n#pair style\npair_style gran model hertz tangential history\npair_coeff\t* *\n\n#timestep, gravity\ntimestep\t0.00001\nfix\t\tgravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n#walls\nfix zwalls1 all wall/gran model hertz tangential history primitive type 1  zplane 0.0\nfix zwalls2 all wall/gran model hertz tangential history primitive type 1  zplane 0.0553\nfix cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.0138 0. 0.\n\n#cfd coupling\n#fix\t\tcfd all couple/cfd\n\n#particle insertion\nregion\t\tbc cylinder z 0.0 0.0 0.012 0.02 0.03 units box\nregion\t\tbc2 cylinder z 0.0 0.0 0.012 0.01 0.02 units box\nfix\t\t    pts1 all particletemplate/sphere 49979687 atom_type 1 density constant 200 radius constant 0.001\nfix\t\t    pts2 all particletemplate/sphere 49979693 atom_type 2 density constant 200 radius constant 0.001\nfix\t\t    pdd1 all particledistribution/discrete 15485863  1 pts1 1.0\nfix\t\t    pdd2 all particledistribution/discrete  15485867 1 pts2 1.0\n\nfix\t\tins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -1. insert_every once overlapcheck yes all_in yes particles_in_region 1000 region bc\nfix\t\tins2 all insert/pack seed 32452867 distributiontemplate pdd2 vel constant 0. 0. -1. insert_every once overlapcheck yes all_in yes particles_in_region 1000 region bc2\n\n#apply nve integration to all particles that are inserted as single particles\nfix\t\tintegr all nve/sphere\n\n\n#screen output\ncompute\t\t1 all erotate/sphere\nthermo_style\tcustom step atoms ke c_1 vol\nthermo\t\t1000\nthermo_modify\tlost ignore norm no\n\n#insert the first particles so that dump is not empty\nrun\t\t1\ndump\t\tdmp all custom/vtk 1000 post/liggghts_init*.vtk id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius\ndump_modify dmp binary no\n\nrun\t\t3000 upto\n#write_restart \tliggghts.restart\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest\n# Christoph Goniva - July. 2011, mod by Alice Hager - July 2011\n#===================================================================#\n\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\necho $casePath\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\n\n#gnome-terminal --title='cfdemSolverIB twoSpheresGlowinskiMPI CFD' -e \"bash $casePath/parCFDDEMrun.sh\"\n. $casePath/parCFDDEMrun.sh\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet      \n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n\n    wall      \n    {\n        type            zeroGradient;\n\n    }\n\n    outlet      \n    {\n        type            fixedValue;//zeroGradient;\n        value          uniform (0 0 0);\n    }\n\n    /*frontAndBack    \n    {\n        type            empty;\n    }*/\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n    wall      \n    {\n        type            zeroGradient;\n    }\n    frontAndBack\n    {\n        type            zeroGradient;\n    }  \n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 100000;\n\nboundaryField\n{\n    inlet      \n    {\n        type            zeroGradient;\n    }\n\n    wall      \n    {\n        type            zeroGradient;\n    }\n\n    outlet\n    {\n        type            zeroGradient;//fixedValue;\n        //value           uniform 100000;\n    }\n\n    frontAndBack    \n    {\n        type            empty;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/0/phiIB",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      phiIB;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    inlet      \n    {\n        //type            zeroGradient;\n        type            fixedValue;\n        value           uniform 0; \n    }\n\n    wall      \n    {\n        type            zeroGradient;\n    }\n\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 0;\n        //type            zeroGradient;\n    }\n\n    frontAndBack    \n    {\n        type            empty;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n    wall      \n    {\n        type            zeroGradient;\n    }\n    frontAndBack\n    {\n        type            zeroGradient;\n    }  \n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;//kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType none;\n\ncouplingInterval 10;\n\ndepth 0;\n\nvoidFractionModel IB;//bigParticle;//centre; //\n\nlocateModel engineIB;//standard;//\n\nmeshMotionModel noMeshMotion;\n\ndataExchangeModel twoWayMPI;//twoWayFiles;\n\nIOModel basicIO;\n\nprobeModel off;\n\naveragingModel dilute;\n\nclockModel off;\n\nsmoothingModel off;\n\nforceModels\n(\n    ShirgaonkarIB\n    ArchimedesIB\n);\n\nmomCoupleModels\n(\n);\n\n//turbulenceModelType RASProperties;//LESProperties; //OFversion24x\nturbulenceModelType turbulenceProperties; //OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nShirgaonkarIBProps\n{\n    pressureFieldName \"p\";\n}\n\nArchimedesIBProps\n{\n    voidfractionFieldName \"voidfractionNext\";\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10000;\n    DEMts 0.00003;\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\nIBProps\n{\n    maxCellsPerParticle 1000;\n    alphaMin 0.30;\n    scaleUpVol 1.0;\n}\n\nbigParticleProps\n{\n    maxCellsPerParticle 1000;\n    alphaMin 0.30;\n}\ncentreProps\n{\n    alphaMin 0.30;\n}\n\ndividedProps\n{\n    alphaMin 0.05;\n    volScale ( 1.2 );\n}\n\nengineIBProps\n{\n    treeSearch false;\n    zSplit 8;\n    xySplit 16;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/dynamicMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      dynamicMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndynamicFvMesh   dynamicRefineFvMesh;//staticFvMesh;//\n\ndynamicRefineFvMeshCoeffs\n{\n    refineInterval  1;//refine every refineInterval timesteps\n    field           interFace;\n    lowerRefineLevel .0001;\n    upperRefineLevel 0.99;\n    unrefineLevel   10;\n    nBufferLayers   1;\n    maxRefinement   2;//maximum refinement level (starts from 0)\n    maxCells        1000000;\n    correctFluxes\n    (\n        (phi    U)\n        (phi_0  U)\n    );\n    dumpLevel       false;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           (0 0 -981);\n//value           (0 0 0);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 0.01;//0.111426;//1.875e-03;//7.5e-03;//0.265883;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType      laminar;//OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/octave/coord_pos.mat",
    "content": "# Created by Octave 3.2.3, Fri Jul 15 15:25:22 2011 CEST <alice@alice-desktop>\n# name: coord\n# type: matrix\n# rows: 35\n# columns: 4\n 0.0007668711656441718 4.994152046783626 0.0007668711656441718 4.502923976608187\n 0.008819018404907975 4.982456140350877 0.009585889570552147 4.479532163742689\n 0.01878834355828221 4.95906432748538 0.01687116564417178 4.456140350877193\n 0.02799079754601227 4.923976608187134 0.02377300613496933 4.432748538011696\n 0.03489263803680982 4.87719298245614 0.03029141104294479 4.409356725146199\n 0.04064417177914111 4.830409356725146 0.03680981595092025 4.362573099415204\n 0.04716257668711656 4.7953216374269 0.04447852760736196 4.315789473684211\n 0.05483128834355828 4.736842105263158 0.05138036809815951 4.257309941520468\n 0.06096625766871166 4.678362573099415 0.05789877300613497 4.198830409356725\n 0.06940184049079755 4.608187134502923 0.06403374233128835 4.140350877192982\n 0.0789877300613497 4.502923976608187 0.0709355828220859 4.081871345029239\n 0.08857361963190184 4.39766081871345 0.07745398773006135 4.011695906432748\n 0.09470858895705522 4.327485380116959 0.08588957055214724 3.91812865497076\n 0.1023773006134969 4.23391812865497 0.09279141104294479 3.83625730994152\n 0.1108128834355828 4.128654970760234 0.09930981595092024 3.766081871345029\n 0.1165644171779141 4.046783625730994 0.1058282208588957 3.695906432748538\n 0.1219325153374233 3.964912280701754 0.111579754601227 3.625730994152047\n 0.1273006134969325 3.883040935672514 0.1184815950920245 3.555555555555555\n 0.1345858895705521 3.766081871345029 0.1253834355828221 3.473684210526315\n 0.1418711656441718 3.637426900584795 0.1334355828220859 3.380116959064327\n 0.1491564417177914 3.497076023391813 0.1403374233128834 3.298245614035087\n 0.156058282208589 3.380116959064327 0.147239263803681 3.204678362573099\n 0.1625766871165644 3.263157894736842 0.1549079754601227 3.111111111111111\n 0.1706288343558282 3.134502923976608 0.1614263803680982 3.029239766081871\n 0.1779141104294479 3.029239766081871 0.1679447852760736 2.923976608187134\n 0.1855828220858896 2.912280701754386 0.1748466257668712 2.830409356725146\n 0.1924846625766871 2.807017543859649 0.1825153374233129 2.701754385964912\n 0.1997699386503068 2.690058479532164 0.192101226993865 2.573099415204678\n 0.2070552147239264 2.56140350877193 0.2001533742331288 2.456140350877193\n 0.2151073619631902 2.432748538011696 0.2070552147239264 2.350877192982456\n 0.2223926380368098 2.315789473684211 0.2177914110429448 2.210526315789473\n 0.2289110429447853 2.210526315789473 0.2269938650306748 2.116959064327485\n 0.2373466257668712 2.105263157894737 0.236579754601227 2.035087719298246\n 0.2434815950920245 2.023391812865497 0.2427147239263804 1.976608187134503\n 0.2492331288343558 1.953216374269006 0.2496165644171779 1.953216374269006\n# name: L1\n# type: scalar\n3\n# name: dataLen\n# type: matrix\n# rows: 3\n# columns: 1\n 35\n 35\n 0\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/octave/coord_vel.mat",
    "content": "# Created by Octave 3.2.3, Fri Jul 15 13:54:15 2011 CEST <alice@FLUID50>\n# name: coord\n# type: matrix\n# rows: 113\n# columns: 4\n 0.0003894080996884735 -0.2761341222879672 0.001557632398753894 -0.512820512820511\n 0.002725856697819315 -0.7100591715976314 0.003894080996884735 -0.9072978303747519\n 0.005062305295950155 -1.143984220907299 0.005841121495327103 -1.301775147928993\n 0.007009345794392523 -1.499013806706113 0.008177570093457943 -1.735700197238657\n 0.009345794392523364 -1.893491124260354 0.009735202492211837 -2.011834319526628\n 0.01090342679127726 -2.209072978303748 0.01129283489096573 -2.327416173570018\n 0.01246105919003115 -2.524654832347139 0.0132398753894081 -2.603550295857989\n 0.01440809968847352 -2.800788954635109 0.01557632398753894 -2.958579881656803\n 0.01635514018691589 -3.155818540433923 0.01752336448598131 -3.353057199211044\n 0.01869158878504673 -3.510848126232741 0.01985981308411215 -3.708086785009861\n 0.02102803738317757 -3.865877712031558 0.02180685358255452 -4.023668639053254\n 0.02297507788161994 -4.181459566074951 0.02414330218068536 -4.378698224852071\n 0.0249221183800623 -4.497041420118343 0.02609034267912773 -4.694280078895464\n 0.02686915887850467 -4.812623274161735 0.02803738317757009 -4.970414201183432\n 0.02881619937694704 -5.088757396449704 0.02959501557632399 -5.2465483234714\n 0.03076323987538941 -5.404339250493097 0.03193146417445483 -5.562130177514792\n 0.03309968847352025 -5.719921104536489 0.03426791277258567 -5.956607495069033\n 0.03582554517133956 -6.11439842209073 0.03699376947040498 -6.272189349112425\n 0.0381619937694704 -6.469428007889546 0.0397196261682243 -6.627218934911243\n 0.04088785046728972 -6.824457593688363 0.04244548286604361 -7.021696252465484\n 0.04400311526479751 -7.179487179487179 0.04517133956386293 -7.416173570019724\n 0.04711838006230529 -7.495069033530571 0.04750778816199377 -7.731755424063117\n 0.04984423676012461 -7.810650887573965 0.05023364485981308 -8.007889546351084\n 0.05257009345794392 -8.086785009861932 0.05179127725856698 -8.205128205128204\n 0.05607476635514019 -8.402366863905325 0.05373831775700934 -8.402366863905325\n 0.05919003115264797 -8.717948717948717 0.05607476635514019 -8.63905325443787\n 0.06269470404984423 -9.03353057199211 0.05802180685358255 -8.796844181459566\n 0.06580996884735202 -9.23076923076923 0.05996884735202492 -8.994082840236686\n 0.06892523364485981 -9.506903353057199 0.06191588785046729 -9.151873767258383\n 0.07165109034267912 -9.704142011834319 0.06386292834890965 -9.349112426035504\n 0.07437694704049844 -9.90138067061144 0.06658878504672897 -9.546351084812624\n 0.07749221183800623 -10.13806706114398 0.06814641744548286 -9.664694280078896\n 0.08099688473520249 -10.3353057199211 0.06853582554517133 -9.664694280078896\n 0.0852803738317757 -10.61143984220907 0.07126168224299065 -9.90138067061144\n 0.08956386292834891 -10.88757396449704 0.07359813084112149 -10.01972386587771\n 0.09228971962616822 -11.16370808678501 0.07593457943925233 -10.13806706114398\n 0.09501557632398754 -11.40039447731755 0.07982866043613707 -10.3353057199211\n 0.09813084112149532 -11.59763313609468 0.08333333333333333 -10.45364891518738\n 0.1008566978193146 -11.91321499013807 0.08722741433021806 -10.61143984220907\n 0.1031931464174455 -12.14990138067061 0.0911214953271028 -10.72978303747534\n 0.1059190031152648 -12.50493096646943 0.09462616822429906 -10.84812623274162\n 0.1082554517133956 -12.82051282051282 0.0985202492211838 -11.00591715976331\n 0.1105919003115265 -13.17554240631164 0.102803738317757 -11.08481262327416\n 0.1133177570093458 -13.53057199211045 0.1066978193146417 -11.20315581854043\n 0.1152647975077882 -13.88560157790927 0.1105919003115265 -11.28205128205128\n 0.1172118380062305 -14.28007889546351 0.1144859813084112 -11.36094674556213\n 0.1191588785046729 -14.63510848126233 0.1183800623052959 -11.43984220907298\n 0.1214953271028037 -15.06903353057199 0.1218847352024922 -11.51873767258383\n 0.1234423676012461 -15.38461538461539 0.1257788161993769 -11.59763313609468\n 0.1253894080996885 -15.77909270216962 0.1281152647975078 -11.67652859960552\n 0.1273364485981308 -16.09467455621302 0.1320093457943925 -11.75542406311637\n 0.1296728971962617 -16.44970414201184 0.1366822429906542 -11.87376725838264\n 0.131619937694704 -16.7258382642998 0.1401869158878505 -11.95266272189349\n 0.1335669781931464 -17.0414201183432 0.1433021806853582 -12.07100591715976\n 0.1359034267912773 -17.31755424063116 0.146417445482866 -12.14990138067061\n 0.1382398753894081 -17.59368836291913 0.1495327102803738 -12.26824457593688\n 0.1425233644859813 -17.83037475345168 0.1530373831775701 -12.42603550295858\n 0.1460280373831776 -18.0276134122288 0.1561526479750779 -12.58382642998028\n 0.1491433021806854 -18.10650887573965 0.1584890965732087 -12.70216962524655\n 0.1522585669781931 -18.14595660749507 0.1588785046728972 -12.97830374753452\n 0.1557632398753894 -18.14595660749507 0.1592679127725857 -13.21499013806706\n 0.1580996884735202 -18.06706114398422 0.1596573208722741 -13.6094674556213\n 0.1584890965732087 -17.75147928994083 0.1600467289719626 -13.92504930966469\n 0.1592679127725857 -17.23865877712031 0.1604361370716511 -14.16173570019724\n 0.1592679127725857 -17.51479289940828 0.1604361370716511 -14.43786982248521\n 0.1600467289719626 -16.56804733727811 0.1604361370716511 -14.7534516765286\n 0.1600467289719626 -16.92307692307692 0.161214953271028 -14.9112426035503\n 0.1604361370716511 -15.93688362919132 0.1627725856697819 -15.02958579881657\n 0.1608255451713396 -16.29191321499014 0.1631619937694704 -15.02958579881657\n 0.1623831775700935 -15.77909270216962 0.1635514018691589 -15.18737672583826\n 0.1635514018691589 -15.54240631163708 0.1647196261682243 -15.38461538461539\n 0.1654984423676013 -15.50295857988166 0.1666666666666667 -15.30571992110454\n 0.1678348909657321 -15.54240631163708 0.169392523364486 -15.22682445759369\n 0.1701713395638629 -15.62130177514793 0.1721183800623053 -15.22682445759369\n 0.1736760124610592 -15.70019723865878 0.1744548286604361 -15.18737672583826\n 0.17601246105919 -15.70019723865878 0.1775700934579439 -15.14792899408284\n 0.1783489096573209 -15.70019723865878 0.1799065420560748 -15.10848126232742\n 0.1814641744548287 -15.77909270216962 0.183411214953271 -15.10848126232742\n 0.183411214953271 -15.81854043392505 0.1873052959501558 -15.06903353057199\n 0.1865264797507788 -15.93688362919132 0.1911993769470405 -14.95069033530572\n 0.1904205607476636 -16.09467455621302 0.1931464174454829 -14.83234714003945\n 0.1935358255451713 -16.17357001972386 0.1954828660436137 -14.7534516765286\n 0.1962616822429906 -16.25246548323472 0.1974299065420561 -14.5956607495069\n 0.1997663551401869 -16.29191321499014 0.1993769470404984 -14.47731755424063\n 0.2017133956386293 -16.25246548323472 0.2005451713395638 -14.28007889546351\n 0.2040498442367601 -16.17357001972386 0.2024922118380062 -14.08284023668639\n 0.2067757009345794 -16.13412228796844 0.2024922118380062 -14.12228796844181\n 0.2087227414330218 -16.05522682445759 0.2040498442367601 -13.84615384615385\n 0.2114485981308411 -15.93688362919132 0.2059968847352025 -13.64891518737673\n 0.2137850467289719 -15.81854043392505 0.2071651090342679 -13.41222879684418\n 0.2165109034267913 -15.70019723865878 0.2091121495327103 -13.17554240631164\n 0.2176791277258567 -15.5818540433925 0.2098909657320872 -12.93885601577909\n 0.2200155763239875 -15.34516765285996 0.2114485981308411 -12.74161735700197\n 0.2219626168224299 -15.14792899408284 0.2126168224299065 -12.50493096646943\n 0.2231308411214953 -14.95069033530572 0.2137850467289719 -12.22879684418146\n 0.2254672897196262 -14.67455621301775 0.2153426791277258 -11.91321499013807\n 0.227803738317757 -14.35897435897436 0.2172897196261682 -11.6370808678501\n 0.2297507788161994 -14.08284023668639 0.2188473520249221 -11.28205128205128\n 0.2316978193146417 -13.767258382643 0.2200155763239875 -11.00591715976331\n 0.2332554517133956 -13.49112426035503 0.2215732087227414 -10.69033530571992\n 0.2355919003115265 -13.21499013806706 0.2231308411214953 -10.3353057199211\n 0.2379283489096573 -12.93885601577909 0.2250778816199377 -9.980276134122288\n 0.2402647975077881 -12.66272189349112 0.2274143302180685 -9.546351084812624\n 0.242601246105919 -12.38658777120316 0.2274143302180685 -9.585798816568047\n 0.2453271028037383 -12.14990138067061 0.2293613707165109 -9.191321499013807\n 0.2472741433021807 -11.95266272189349 0.2313084112149533 -8.757396449704142\n 0.2492211838006231 -11.7948717948718 0.2332554517133956 -8.481262327416173\n 0 0 0.235202492211838 -8.205128205128204\n 0 0 0.2371495327102804 -7.968441814595661\n 0 0 0.2390965732087227 -7.692307692307692\n 0 0 0.2410436137071651 -7.455621301775148\n 0 0 0.2433800623052959 -7.297830374753451\n 0 0 0.2461059190031153 -7.140039447731755\n# name: L1\n# type: scalar\n3\n# name: dataLen\n# type: matrix\n# rows: 3\n# columns: 1\n 107\n 113\n 0\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/octave/postproc.m",
    "content": "% postproc.m: loads the data necessary and saves the graphs (compared to the reults by glowinski)\n\nclear;\nclc;\nclose all;\n\n% read data from literature\nload coord_pos.mat\n\n% read data from simulation\npar1=load('../../DEM/post/position_particle_1.txt');\npar2=load('../../DEM/post/position_particle_2.txt');\n\nlinienstaerke=2;\nMarkerGroesse=8;\n\n\nfigure(1)\noffset=5-par1(1,4);\nh= plot(par1(:,1),offset+par1(:,4),'*',par2(:,1),offset+par2(:,4),'+',coord(1:dataLen(1,1),1+(1-1)*2),coord(1:dataLen(1,1),2+(1-1)*2),'o',coord(1:dataLen(2,1),1+(2-1)*2),coord(1:dataLen(2,1),2+(2-1)*2),'s');\n set(h,'LineWidth',linienstaerke,'MarkerSize',MarkerGroesse);\nset(gca,'FontSize',14)\naxis([0 .25 0 6])\nxlabel('time (s)')\nylabel('position (cm)')\ntitle('Comparison of the y-position of two particles','FontSize',15)\nlegend('following particle','leading particle','following particle Glow.','leading particle Glow.')\nset(gca,'FontSize',12)\n#print('pos_y_two_part_rec_glow.png')\nprint('pos_y_two_part_rec_glow.eps','-deps2')\n\nclear;\n\n% read data from literature\nload coord_vel.mat\n\n% read data from simulation\npar1vel=load('../../DEM/post/velocity_particle_1.txt');\npar2vel=load('../../DEM/post/velocity_particle_2.txt');\n\n\nlinienstaerke=2;\nMarkerGroesse=8;\n\nfigure(2)\nh= plot(par1vel(:,1),par1vel(:,4),'*',par2vel(:,1),par2vel(:,4),'+',coord(1:dataLen(1,1),1+(1-1)*2),coord(1:dataLen(1,1),2+(1-1)*2),'o',coord(1:dataLen(2,1),1+(2-1)*2),coord(1:dataLen(2,1),2+(2-1)*2),'s');\n set(h,'LineWidth',linienstaerke,'MarkerSize',MarkerGroesse);\nset(gca,'FontSize',14)\naxis([0 .25 -20 0])\nxlabel('time (s)')\nylabel('position (cm)')\ntitle('Comparison of the settling velocity of two particles','FontSize',15)\nlegend('following particle','leading particle','following particle Glow.','leading particle Glow.')\nset(gca,'FontSize',12)\n%print('vel_y_two_part_rec_glow.png')\nprint('vel_y_two_part_rec_glow.eps','-deps2')\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1;\n\n/*vertices\n(\n    (0 -8 -0.05)\n    (1 -8 -0.05)\n    (1 4 -0.05)\n    (0 4 -0.05)\n    (0 -8 0.05)\n    (1 -8 0.05)\n    (1 4 0.05)\n    (0 4 0.05)\n);*/\n\nvertices\n(\n    (0 0 0)\n    (1 0 0)\n    (1 1 0)\n    (0 1 0)\n    (0 0 4)\n    (1 0 4)\n    (1 1 4)\n    (0 1 4)\n);\n\nblocks          \n(\n    hex (0 1 2 3 4 5 6 7) (10 10 40) simpleGrading (1 1 1)\n    //hex (0 1 2 3 4 5 6 7) (120 480 1) simpleGrading (1 1 1)\n);\n\nedges           \n(\n);\n\npatches         \n(\n    wall inlet \n    (\n         (0 3 2 1)\n    )\n    wall wall \n    (\n        (2 6 5 1)   \n        (0 4 7 3)\n        (3 7 6 2)     \n        (1 5 4 0)\n    )\n    wall outlet\n    (\n         (4 5 6 7)\n    )\n    /*empty frontAndBack \n    (\n        (0 3 2 1)\n        (4 5 6 7)\n    )*/\n);\n\nmergePatchPairs \n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     interDyMFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.0003;\n\nwriteControl    adjustableRunTime;//timeStep;//\n\nwriteInterval   0.01;//10;//0.05;//\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable off;//yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\n\n// ************************************************************************* //\n\n\nfunctions\n{\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );\n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.5001 0.5001 0.0001)\n            (0.5001 0.5001 1.0001)\n            (0.5001 0.5001 2.0001)\n            (0.5001 0.5001 3.0001)\n        );\n\n        // Fields to be probed\n        fields ( p );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     interDyMFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.0003;\n\nwriteControl    adjustableRunTime;//timeStep;//\n\nwriteInterval   0.003;//10;//0.05;//\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable off;//yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\n\n// ************************************************************************* //\n\n\nfunctions\n(\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );\n        // Name of the directory for probe data\n        name        drag;\n        probeLocations\n        (\n            (0.0 0.0 0.0)\n        );\n\n        // Fields to be probed\n        fields ( particleForces );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/decomposeParDict",
    "content": "/*-------------------------------*- C++ -*---------------------------------*\\\n|    =========                                                              |\n|    \\\\      /     OpenFOAM                                                 |\n|     \\\\    /                                                               |\n|      \\\\  /       The Open Source CFD Toolbox                              |\n|       \\\\/                                        http://www.OpenFOAM.org  |\n\\*-------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    note        \"mesh decomposition control dictionary\";\n    location    \"system\";\n    object      decomposeParDict;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains  4;\n\n//- Keep owner and neighbour on same processor for faces in zones:\n// preserveFaceZones (heater solid1 solid3);\n\n//method          scotch;\n// method          hierarchical;\n method          simple;\n// method          metis;\n// method          manual;\n\nsimpleCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n}\n\nhierarchicalCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n    order       xyz;\n}\n\nmetisCoeffs\n{\n /*\n    processorWeights\n    (\n        1\n        1\n        1\n        1\n    );\n  */\n}\n\nscotchCoeffs\n{\n    //processorWeights\n    //(\n    //    1\n    //    1\n    //    1\n    //    1\n    //);\n    //writeGraph  true;\n    //strategy \"b\";\n}\n\nmanualCoeffs\n{\n    dataFile    \"decompositionData\";\n}\n\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div(U)          Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n    laplacian(phiIB) Gauss linear corrected;\n    laplacian(U) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    k\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    epsilon\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    phiIB\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       100000;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        f f f\nnewton          off\n\nunits           si\nprocessors      2 2 1\n\nregion          reg block 0. 1. 0. 1. 0. 4. units box\ncreate_box      1 reg\n\nneighbor        0.3 bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for new pair styles\n\nfix             m1 all property/global youngsModulus peratomtype 5.e7\nfix             m2 all property/global poissonsRatio peratomtype 0.45\nfix             m3 all property/global coefficientRestitution peratomtypepair 1 0.9\nfix             m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style      gran model hertz tangential history #Hertzian without cohesion\npair_coeff      * *\n\n# timestep, gravity\ntimestep        0.00003\n\nfix             gravi all gravity 981 vector 0.0 0.0 -1.0\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 1.\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 1.\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 4.\n\n# cfd coupling\nfix     cfd  all couple/cfd couple_every 10 mpi\nfix     cfd2 all couple/cfd/force\n\n\n# create single partciles\ncreate_atoms 1 single .5 .5 3.5  units box\ncreate_atoms 1 single .5 .5 3.16 units box\nset atom 1 diameter 0.167 density 1.5 vx 0 vy 0 vz 0\nset atom 2 diameter 0.167 density 1.5 vx 0 vy 0 vz 0\n\nvariable        vx1 equal vx[1]\nvariable        vy1 equal vy[1]\nvariable        vz1 equal vz[1]\nvariable        vx2 equal vx[2]\nvariable        vy2 equal vy[2]\nvariable        vz2 equal vz[2]\nvariable        x1 equal x[1]\nvariable        y1 equal y[1]\nvariable        z1 equal z[1]\nvariable        x2 equal x[2]\nvariable        y2 equal y[2]\nvariable        z2 equal z[2]\nvariable        time equal step*dt\n\nfix             extra1 all print 100 \"${time} ${vx1} ${vy1} ${vz1}\" file ../DEM/post/velocity_particle_1.txt title \"%\" screen no\nfix             extra2 all print 100 \"${time} ${vx2} ${vy2} ${vz2}\" file ../DEM/post/velocity_particle_2.txt title \"%\" screen no\nfix             extra3 all print 100 \"${time} ${x1}  ${y1}  ${z1}\"  file ../DEM/post/position_particle_1.txt title \"%\" screen no\nfix             extra4 all print 100 \"${time} ${x2}  ${y2}  ${z2}\"  file ../DEM/post/position_particle_2.txt title \"%\" screen no\n\n\n# apply nve integration to all particles that are inserted as single particles\nfix             integr all nve/sphere #wenn das ausgeblendet, dann kein vel update\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\ndump            dmp all custom 1000 ../DEM/post/dump.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius \n\n#force : f_couple_cfd[0] f_couple_cfd[1] f_couple_cfd[2]\n#node : f_couple_cfd[6]\n#cell id : f_couple_cfd[7]\n\nrun             1\n\n"
  },
  {
    "path": "tutorials/cfdemSolverIB/twoSpheresGlowinskiMPI/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverIB_twoSpheresGlowinskiMPI_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverIB\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\nif [ $runOctave == \"true\" ]\n  then\n    \n    cd $casePath/CFD/octave\n    octave --no-gui postproc.m\n    evince pos_y_two_part_rec_glow.eps \n    evince vel_y_two_part_rec_glow.eps \n    #display pos_y_two_part_rec_glow.png &\n    #display vel_y_two_part_rec_glow.png &\nfi\n\nif [ $postproc == \"true\" ]\n  then\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- copy log file to test harness\ncp ../../$logfileName $testHarnessPath\n\n#- clean up case\nkeepDEMrestart=\"false\"\ncleanCFDEMcase $casePath/CFD $keepDEMrestart\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run ErgunTestMPI\n# Christoph Goniva - Sept. 2010\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM in new terminal\n    $casePath/parDEMrun.sh\nfi\n\n# keep old couplingProperties\ncp $casePath/CFD/constant/couplingProperties $casePath/CFD/constant/couplingProperties_backup\ncp $casePath/CFD/0/p $casePath/CFD/0/p_backup\ncp $casePath/CFD/0/U $casePath/CFD/0/U_backup\n\n# change to KH implForceDEM \n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_m1 -case $casePath/CFD\n\n# change to M2M + type B\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_1 -case $casePath/CFD\n\n# change to MPI + type A\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_2 -case $casePath/CFD\n\n# change to MPI + engineIB\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_3 -case $casePath/CFD\n\n# change to MPI + subTS (bigger coupling interval)\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_4 -case $casePath/CFD\n\n# change to MPI + type Bfull\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_5 -case $casePath/CFD\n\n# change to cfdemSolverPimpleImExFace + MPI + type Bfull + explicit gradP\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_6 -case $casePath/CFD\n\n# change to M2M + type B + fixedFluxPressure\n#changeDictionary -dict changeDicts/changeDictionaryDict_0 -case $casePath/CFD\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_1 -case $casePath/CFD\n\n# change to MPI + type A + fixedFluxPressure\n#changeDictionary -dict changeDicts/changeDictionaryDict_0 -case $casePath/CFD\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_2 -case $casePath/CFD\n\n# change to MPI + folveFlow false + constant inflow\n#changeDictionary -dict changeDicts/changeDictionaryDict_8 -case $casePath/CFD\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_7 -case $casePath/CFD\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso ErgunTestMPI CFD'  -e \"bash $casePath/parCFDDEMrun.sh\" \n. $casePath/parCFDDEMrun.sh\n\n# restore old couplingProperties\nmv $casePath/CFD/constant/couplingProperties_backup $casePath/CFD/constant/couplingProperties\nmv $casePath/CFD/0/p_backup $casePath/CFD/0/p \nmv $casePath/CFD/0/U_backup $casePath/CFD/0/U\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        /*type            flowRateInletVelocity;\n        flowRate        0.001;\n        value           uniform (0 0 0);*/\n\n        /*type            fixedValue;\n        value           uniform (0 0 0.0001);*/\n\n        //type            zeroGradient;\n\n        /*type            groovyBC;\n        variables       \"Uend=vector(0,0,0.02);tEnd=0.1;\";\n        valueExpression \"((time() < tEnd) ? Uend/tEnd*time():Uend)\";\n        value           uniform (0 0 0);*/\n\n        // 2.0.x, 1.6,ext\n        /*type            timeVaryingUniformFixedValue;\n        fileName        \"steps_0p1s\";\n        outOfBounds     clamp;\n        value           uniform (0 0 0);*/\n\n        // 2.1.x or higher\n        type            uniformFixedValue;\n        uniformValue     table\n        (\n            (0.000 (0 0 0.002))\n            (0.100 (0 0 0.020))\n        );\n    }\n\n    outlet\n    {\n        /*type            fluxCorrectedVelocity; //inletOutlet;\n        value           uniform (0 0 0);\n        inletValue      uniform (0 0 0);*/\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/epsilon",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      epsilon;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -3 0 0 0 0];\n\ninternalField   uniform 0.003;\n\nboundaryField\n{\n    wall\n    {\n        type            epsilonWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0.003;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.003;\n        value           uniform 0.003;\n    }\n    inlet\n    {\n        /*type            turbulentMixingLengthDissipationRateInlet;\n        mixingLength    0.005;\n        value           uniform 0.003;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 1e-6;\n\nboundaryField\n{\n    wall\n    {\n        type            kqRWallFunction;\n        value           $internalField;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      $internalField;\n        value           $internalField;\n    }\n    inlet\n    {\n        type            turbulentIntensityKineticEnergyInlet;\n        intensity       0.01;\n        value           $internalField;\n        //type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/nut",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      nut;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            nutkWallFunction;\n        value           $internalField;\n    }\n    outlet\n    {\n        type            calculated;\n        value           $internalField;\n    }\n    inlet\n    {\n        type            calculated;\n        value           $internalField;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n\n    wall\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n        value           $internalField;\n    }\n\n    inlet\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n        value           $internalField;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           $internalField;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 10;\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;\n\nturbulence      off;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType \"A\"; // A or B\n\ncouplingInterval 50;\n\nvoidFractionModel divided;//centre;//\n\nlocateModel engine;//engineIB;//\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;//dilute;//\n\nclockModel off;//standardClock;//\n\nsmoothingModel off;// localPSizeDiffSmoothing;// constDiffSmoothing; //\n\nforceModels\n(\n    //GidaspowDrag\n    //BeetstraDrag\n    //DiFeliceDrag\n    gradPForce\n    viscForce\n    KochHillDrag\n    //DEMbasedDrag\n    //RongDrag\n    Archimedes\n    //volWeightedAverage\n    //totalMomentumExchange\n    //particleCellVolume\n    //fieldTimeAverage\n    fieldStore\n    //fieldVolWeighted\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nlocalPSizeDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    dSmoothingLength 1.5e-3;\n    Csmoothing    1.0;\n}\n\nconstDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    smoothingLength 1.5e-3;\n}\n\nimplicitCoupleProps\n{\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\nvolWeightedAverageProps\n{\n    scalarFieldNames\n    (\n        voidfraction\n    );\n    vectorFieldNames\n    (\n    );\n    upperThreshold 0.999;\n    lowerThreshold 0;\n    verbose true;\n}\ntotalMomentumExchangeProps\n{\n    implicitMomExFieldName \"Ksl\";\n    explicitMomExFieldName \"none\";\n    fluidVelFieldName \"U\";\n}\nGidaspowDragProps\n{\n    verbose true;\n    interpolation true;\n    phi 1;\n}\nDEMbasedDragProps\n{\n}\n\nDiFeliceDragProps\n{\n    //verbose true;\n    interpolation true;\n}\n\nKochHillDragProps\n{\n    //verbose true;\n    interpolation true;\n    //implForceDEMaccumulated true;\n    //explicitCorr true;\n}\n\nBeetstraDragProps\n{\n    rhoParticle     2000.;\n    interpolation true;\n    useFilteredDragModel ;\n    useParcelSizeDependentFilteredDrag ;\n    k       0.05;\n    aLimit  0.0;\n//    verbose true;\n}\n\nRongDragProps\n{\n    verbose true;\n    interpolation true;\n    implForceDEMaccumulated true;\n}\n\nvirtualMassForceProps\n{\n}\n\nparticleCellVolumeProps\n{\n    upperThreshold 0.999;\n    lowerThreshold 0.;\n    verbose true;\n}\n\nfieldStoreProps\n{\n    scalarFieldNames\n    (\n    );\n\n    vectorFieldNames\n    (\n        \"U\"\n    );\n}\n\nfieldVolWeightedProps\n{\n    startTime 0;\n\n    scalarFieldNames\n    (\n    );\n\n    vectorFieldNames\n    (\n        \"U\"\n    );\n    useVolumeFraction true;\n    volumeFractionName \"voidfraction\";\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10100;\n}\n\ncentreProps\n{\n}\n\n\"(engineProps|turboEngineProps|turboEngineM2MProps)\"\n{\n    treeSearch true;\n}\n\nengineIBProps\n{\n    treeSearch true;\n    zSplit 8;\n    xySplit 16;\n}\n\ndividedProps\n{\n}\n\n\"(twoWayMPIProps|M2MProps)\"\n{\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 0 -9.81 );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n    runLiggghts\n    writeLiggghts\n    //execute\n);\n// ************************************************************************* //\n\n/*runLiggghtsProps\n{\n    preNo false;\n}*/\n\nwriteLiggghtsProps\n{\n    // path and name:\n    path \"../DEM/post/restart\"; // optional setting (default \"../DEM\")\n    //writeName \"liggghts.restartCFDEM\"; // optional setting (default \"liggghts.restartCFDEM\")\n    overwrite on; // optional setting (default off)\n    writeLastOnly off; // optional setting (default on)\n    //verbose; // optional setting (default off)\n}\n\n//EXAMPLE:\n//execute \"write_restart ../DEM/post/restart/liggghts.restartRareCFDEM_XYZ\",\n//where XYZ is the simulation time,\n//every 0.02s, starting after 0.04s\nexecuteProps2\n{\n    startTime 0.04;\n    endTime 100;\n    timeInterval 40; // interval related to coupling time (e.g. 40(=timeInterval)*1e-5s(=deltaTDEM)*50(=couplingInterval)=0.02s)\n    command\n    (\n        write_restart\n        noBlanks\n        dotdot\n        slash\n        DEM\n        slash\n        post\n        slash\n        restart\n        slash\n        liggghts\n        dot\n        restartRareCFDEM_\n        timeStamp\n    );\n    runFirst off;\n    runLast off;\n    runEveryCouplingStep off;\n    runEveryWriteStep off;\n}\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-04;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel; //OFversion24x\nsimulationType  laminar;//RAS; //OFversion30x\n\nRAS\n{\n    RASModel        kEpsilon;//kOmegaSST;\n\n    turbulence      on;\n\n    printCoeffs     on;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/octave/loaddata.m",
    "content": "function [data,colname]=loaddata(filename,columns,headerlines)\r\n\r\n% data = loaddata(filename,columns,headerlines)\r\n% data = loaddata(filename,0,headerlines): automatc detection of \r\n%           columns by word count in first headerline or first data line\r\n%           (if headerline==0), separated by blanks or tabs\r\n%           columns=-1: write colum assignment code lines\r\n%              works only if headerline>0 and colnames separated by \r\n%              not more than 1 blank!\r\n%           columns=-2: columns separated by 2 blanks (fluent/scheme auswertung-instat.scm)\r\n% [data, colname] = loaddata(filename,0,headerlines) \r\n%           colname = cell string array of column names from headerline\r\n\r\nfprintf(1,'loading %s ...  ', filename);\r\nf=fopen(filename,'r');\r\nif f==-1\r\n  fprintf(1,'\\n*** error: could not open \"%s\" ...\\n', filename);\r\n  data=[];\r\nelse\r\n  for i=1:headerlines\r\n    if i==1 s=fgets(f); else fgets(f); end\r\n  end\r\n  if headerlines==0\r\n    s=fgets(f); frewind(f);\r\n  end\r\n  if columns<=0 % & headerlines>=1\r\n    fprintf(1,'\\n');\r\n    fprintf(1,'  %s',s);\r\n    pos = findstr(sprintf('\\t'),s); % trennzeichenpositionen in zeile suchen\r\n    if length(pos)>0\r\n      endpos=length(s);\r\n      %if isspace(s(endpos-1)) endpos=endpos-1; end\r\n      pos = [0 pos(1,:) endpos]; % anfangs- und endposition hinzufgen\r\n    elseif columns==-2 % spalteneintrge durch 2 blanks getrennt (fluent/scheme)\r\n      pos=[0];\r\n      for i=1:length(s)-1\r\n        if isspace(s(i)) & isspace(s(i+1))\r\n          pos(end+1)=i+1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);      \r\n    else % spalteneintrge durch blanks getrennt     \r\n      %pos = findstr(' ',s); % trennzeichenpositionen in zeile suchen\r\n      pos=[];\r\n      word=0;\r\n      for i=1:length(s)\r\n        if isspace(s(i))\r\n          word=0;\r\n        elseif ~word\r\n          word=1;\r\n          pos(end+1)=i-1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);\r\n    end\r\n    if headerlines>=1\r\n      for i=1:length(pos)-1 % alle spalten\r\n        colname{i}=s(pos(i)+1:pos(i+1)-1);\r\n        if columns==-1 fprintf(' = data(strmatch(''%s'',colname),:); %% column %d\\n', colname{i},i); end\r\n        if columns==-2 fprintf('%% column %d: %s\\n', i, colname{i}); end\r\n      end   \r\n    end\r\n    columns = length(pos)-1;\r\n    fprintf(1,'  total: %d columns ',columns);\r\n  end\r\n  data=fscanf(f,'%f',[columns,inf]);\r\n  fclose(f);\r\n  fprintf(1,'done.\\n');\r\nend\r\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/octave/totalPressureDrop.m",
    "content": "%\nclose all;\nclear;\nclc;\n\n%====================================%\n% simulation data 1\n%====================================%\nrhoG = 10\t\t\t% density in kg/m3\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\ndata = load(path);\n[x,y]=size(data)\ndp_sim = (data(:,2)-data(:,y))*rhoG; %conversion to Pa!\nt_sim = data(:,1);\n%fprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% analytical calculation\n%====================================%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.001\t\t\t% particle diameter\nphip = 1\t\t\t% sphericity\nepsilon = 0.451335  % voidfraction\nUstart = 0.002\nUend = 0.02\ntimeStepSize = 0.0005;            % time interval of pressure data\nTstart = 0;\nTend = t_sim(length(t_sim));\ndeltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize);\nU = Ustart+deltaU:deltaU:Uend;  % velocity over time\nUa = U / epsilon;\t\t% physical velocity\nL = 0.0156\t\t\t% length of bed\nnuG = 1.5*10^-4\t\t\t% kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp))\n        );\n\nfprintf('NOTE: this pressure is divided by density (according to CFD solver)\\n')\nfprintf('so the result does not depend on density\\n')\n\n%fprintf('final pressure drop (Ergun eqn)= %f Pa\\n',dpErgun)\n\n%==================================\n% min fluidization velocity in m/s\n%==================================\nrhoP = 2000                     % particle density in kg/m3\ng = 9.81                        % gravity m/s2\n\nUmf = dp^2*(rhoP-rhoG)*g/(150*muG)*(epsilon^3*phip^2)/(1-epsilon);\nReMF = Umf*dp*rhoG/muG;\nif(ReMF<20)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif(ReMF>20 && ReMF<1000)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif (ReMF>=1000)\n    fprintf('applying eqn2 for Umf.\\n')\n    Umf = sqrt(dp*(rhoP-rhoG)*g/(1.75*rhoG)*epsilon^3*phip);\n    ReMF = Umf*dp*rhoG/muG;\nend\n\ndpUmf= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp))\n        );\n%pHydr=0;\n%dpUmf2=(L*(1-epsilon)*(rhoP-rhoG)*g+pHydr)\n%====================================%\n% plot data\n%====================================%\nfigure(2)\nplot(U,dp_sim)\ntitle(\"Ergun pressure drop vs. simulation\")\na=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\nlegend(a,\"simulation\")\nxlabel(\"velocity in [m/s]\")\nylabel(\"pressure drop [Pa]\")\naxis([0,Uend,0,dpErgun(length(dpErgun))])\n\nfigure(1)\nplot(U,dpErgun,U,dp_sim,[Umf,Uend],dpUmf*ones(1,2))\ntitle(\"Ergun pressure drop vs. simulation\")\na=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\nlegend(a,\"simulation\",\"analyt. deltaP at Umf\",\"location\",\"northwest\")\nxlabel(\"velocity in [m/s]\")\nylabel(\"pressure drop [Pa]\")\naxis([0,Uend,0,dpErgun(length(dpErgun))])\n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPiso_ErgunTestMPI.png\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/steps_0p1s",
    "content": "(\n    (0.000 (0 0 0.002))\n    (0.100 (0 0 0.020))\n)\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.0                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\nversion  2.0;\nformat   ascii;\nclass       dictionary;\nobject      blockMeshDict;\n}\n// ************************************\n\n\n\n\n\n\n   meshGenApp blockMesh;\n   convertToMeters 1;\n\n    //64 mm column diameter\n    //15 cm length\n   \n   \n   \n    //Width of middle square section\n   \n   \n   \n   \n    //how many cells in the square section\n    //how many cells from square section to perimeter\n    // how many cells from top to bottom\n\n   vertices\n   (\n    ( 0.0069 0.0069 0.0  ) // Vertex fiveoclocksqb = 0 \n    (-0.0069 0.0069 0.0  ) // Vertex sevenoclocksqb = 1 \n    (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 \n    ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 \n    (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 \n    (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 \n    ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 \n\n    ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 \n    (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 \n    (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 \n    ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 \n    (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 \n    (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 \n    ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 \n   );\t\t\t\t\n\n   blocks\n   (\n    //square block\n    hex (\n       2 3 0 1   \n       10 11 8 9   \n       )\n    (8 8 24)\n    simpleGrading (1 1 1)\n\n    //slice1\n    hex (\n       1 0 4 5\n       9 8 12 13\n       )\n    (8 4 24)\n    simpleGrading (1 1 1)\n\n    //slice2\n    hex (\n       6 2 1  5 \n       14 10 9   13 \n       )\n   ( 4 8 24)\nsimpleGrading (1 1 1)\n\n   //slice3\n   hex (\n         6 7 3 2   \n         14 15 11 10   \n       )\n   (8 4 24)\nsimpleGrading (1 1 1)\n\n   //slice4\n   hex (\n         3 7 4 0  \n         11 15 12 8  \n       )\n   (4 8 24)\nsimpleGrading (1 1 1)\n\n   );\n\n\n   //create the quarter circles\n   edges\n   (\n    arc 4 5 (0.0 0.0138 0.0 )\n    arc 5 6 (-0.0138 0.0 0.0)\n    arc 6 7 (0.0 -0.0138 0.0 )\n    arc 7 4 (0.0138 0.0 0.0)\n\n    arc 12 13 (0.0 0.0138 0.0553 )\n    arc 13 14 (-0.0138 0.0 0.0553 )\n    arc 14 15 (0.0 -0.0138 0.0553 )\n    arc 15 12 (0.0138 0.0 0.0553 )\n\n   );\n\n   patches\n   (\n    patch inlet\n    (\n     (0 3 2 1)\n     (0 4 7 3)\n     (4 0 1 5)\n     (1 2 6 5)\n     (3 7 6 2)\n    )\n\n    patch outlet\n    (\n     (8 11 10 9)\n     (8 12 15 11)\n     (12 8 9 13)\n     (9 10 14 13)\n     (11 15 14 10)\n    )\n\n    wall wall\n    (\n     (5 4 12 13)\n     (5 13 14 6)\n     (6 14 15 7)\n     (7 15 12 4)\n    )\n\n);\n\nmergePatchPairs\n(\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPiso;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.0005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n/*libs (\n    \"libsimpleSwakFunctionObjects.so\"\n    \"libswakFunctionObjects.so\"\n    \"libgroovyBC.so\"\n    \"libfiniteVolumeCFDEM.so\"\n);*/\n\nfunctions\n{\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.00003 0 0.0001)\n            (0.00003 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n    volFlow_inlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             true;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            inlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_outlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             true;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            outlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_wall\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             true;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            wall;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;//0.01;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.001;//0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nlibs (\"libOpenFOAM.so\" \"libgroovyBC.so\");\n\nfunctions\n(\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n);\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/decomposeParDict",
    "content": "/*-------------------------------*- C++ -*---------------------------------*\\\n|    =========                                                              |\n|    \\\\      /     OpenFOAM                                                 |\n|     \\\\    /                                                               |\n|      \\\\  /       The Open Source CFD Toolbox                              |\n|       \\\\/                                        http://www.OpenFOAM.org  |\n\\*-------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    note        \"mesh decomposition control dictionary\";\n    location    \"system\";\n    object      decomposeParDict;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains  4;\n\n//- Keep owner and neighbour on same processor for faces in zones:\n// preserveFaceZones (heater solid1 solid3);\n\n//method          scotch;\n// method          hierarchical;\n method          simple;\n// method          metis;\n// method          manual;\n\nsimpleCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n}\n\nhierarchicalCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n    order       xyz;\n}\n\nmetisCoeffs\n{\n /*\n    processorWeights\n    (\n        1\n        1\n        1\n        1\n    );\n  */\n}\n\nscotchCoeffs\n{\n    //processorWeights\n    //(\n    //    1\n    //    1\n    //    1\n    //    1\n    //);\n    //writeGraph  true;\n    //strategy \"b\";\n}\n\nmanualCoeffs\n{\n    dataFile    \"decompositionData\";\n}\n\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/funkySetFieldsDict",
    "content": "FoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"/.automount/werner/Werner/bgschaid/bgschaid-foamStuff/DepositionTests\";\n    case            \"neutralTest\";\n    instance        \"system\";\n    local           \"\";\n\n    class           dictionary;\n    object          funkySetFieldsDict;\n}\n\nexpressions\n(\n\tinit\n\t{\n\t\tfield voidfraction;\n\t\texpression \"1\";\n                valuePatches 2(inlet outlet); // set value 1 at those patches\n\t}\n\tsetGamma\n\t{\n\t\tfield voidfraction;\n\t\texpression \"0.43\";\n\t\t//condition \"pow(pow(pos().x-0.2,2) + pow(pos().y-0,2)+ pow(pos().z-0,2),0.5) < 0.04\";\n                condition \"pos().z < 0.01467 && pos().z > 0.0\";\n                keepPatches true;\n                //valuePatches 1(inlet); // set value 1 at those patches\n\t}\n\t\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n// kOmegaSST\nwallDist\n{\n    method meshWave;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        $p;\n        relTol          0;\n    }\n\n    \"(U|k|epsilon|omega|R|nuTilda)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0.1;\n    }\n\n    \"(U|k|epsilon|omega|R|nuTilda)Final\"\n    {\n        $U;\n        relTol          0;\n    }\n\n    \"(voidfraction|Us|Ksl|dSmoothing|UsNext|voidfractionNext|sSmoothField|vSmoothField)\"\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-05;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 1;\n    pRefCell        0;\n    pRefValue       0;\n}\nPIMPLE\n{\n    nOuterCorrectors 1;\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\nrelaxationFactors\n{\n    fields\n    {\n\t    p\t1.0;\n    }\n    equations\n    {\n        \"U.*\"           1.;\n        \"k.*\"           1.;\n        \"epsilon.*\"     1.;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           si\n\nregion          reg block -0.015 0.015 -0.015 0.015 -0.001 0.0554 units box\ncreate_box      1 reg\n\nneighbor        0.001 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n# walls\nfix     zwalls1  all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2  all wall/gran model hertz tangential history primitive type 1 zplane 0.0553\nfix     cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.01385 0. 0.\n\n# particle distributions and insertion\nregion  bc cylinder z 0.0 0.0 0.012 0. 0.055 units box\nfix     pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2000 radius constant 0.0005\nfix     pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix     ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -1. insert_every once overlapcheck yes all_in yes particles_in_region 10000 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix     integr all nve/sphere\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun         1\ndump        dmp all custom 5000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius\n\nrun         10000 upto\nwrite_restart   post/restart/liggghts.restart\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           si\nprocessors      2 2 1\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        0.0005 bin\nneigh_modify    delay 0\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n# walls\nfix         zwalls1 all wall/gran model hertz tangential history primitive type 1  zplane 0.0\nfix         zwalls2 all wall/gran model hertz tangential history primitive type 1  zplane 0.0553\nfix         cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.01385 0. 0.\n\n# cfd coupling\nfix         cfd all couple/cfd couple_every 100 mpi\nfix         cfd2 all couple/cfd/force/implicit\n#fix         cfd2 all couple/cfd/force/accumulator RongDrag 10 1.5e-3\n#fix         cfd2 all couple/cfd/force/implicit/accumulated #CrankNicolson 0.5\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# center of mass\ncompute     centerOfMass all com\n\n# compute explicit dragforce\ncompute     explDrag all reduce update_on_run_end yes sum f_dragforce[1] f_dragforce[2] f_dragforce[3]\n\n# sum of explicit and implicit drag force given from CFD to DEM\nvariable    totalDragX equal f_cfd2[1]\nvariable    totalDragY equal f_cfd2[2]\nvariable    totalDragZ equal f_cfd2[3]\n\n# explicit drag force given from CFD to DEM\nvariable    explicitDragX equal c_explDrag[1]\nvariable    explicitDragY equal c_explDrag[2]\nvariable    explicitDragZ equal c_explDrag[3]\n\nvariable    time equal step*dt\nfix         extra all print 10 \"${time} ${explicitDragX} ${explicitDragY} ${explicitDragZ} ${totalDragX} ${totalDragY} ${totalDragZ}\" file ../DEM/post/forces.txt title \"# time expDrag(X Y Z) totDrag(X Y Z)\"\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol c_centerOfMass[3] c_explDrag[1] c_explDrag[2] c_explDrag[3] f_cfd2[1] f_cfd2[2] f_cfd2[3]\nthermo          10\nthermo_modify   lost ignore norm no\n\ndump            dmp all custom 5000 ../DEM/post/dump*.liggghts_run id type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \n#dump            dmp all custom/vtk 5000 ../DEM/post/dump_liggghts_run.*.vtk id type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \n\nrun             0\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_ErgunTestMPI_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict | profile\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n\nif [ $runOctave == \"true\" ]\n    then\n        #------------------------------#\n        #  octave\n\n        #- change path\n        cd octave\n\n        #- rmove old graph\n        rm cfdemSolverPiso_ErgunTestMPI.png\n\n        #- run octave\n        octave --no-gui totalPressureDrop.m\n\n        #- show plot \n        eog cfdemSolverPiso_ErgunTestMPI.png\n\n        #- copy log file to test harness\n        cp ../../$logfileName $testHarnessPath\n        cp cfdemSolverPiso_ErgunTestMPI.png $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py dump*.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nkeepDEMrestart=\"false\"\ncleanCFDEMcase $casePath/CFD $keepDEMrestart\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Christoph Goniva - July 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\necho \"starting DEM run in parallel...\"\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=4\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run ErgunTestMPI_cgs (working in CGS unit system)\n# Christoph Goniva - March 2013\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM\n    $casePath/parDEMrun.sh\nfi\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso ErgunTestMPI_cgs CFD'  -e \"bash $casePath/parCFDDEMrun.sh\"\n. $casePath/parCFDDEMrun.sh\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        /*type            flowRateInletVelocity;\n        flowRate        0.001;\n        value           uniform (0 0 0);*/\n\n        /*type            fixedValue;\n        value           uniform (0 0 0.0001);*/\n\n        //type            zeroGradient;\n\n        /*type            groovyBC;\n        variables       \"Uend=vector(0,0,2);tEnd=0.1;\";\n        valueExpression \"((time() < tEnd) ? Uend/tEnd*time():Uend)\";\n        value           uniform (0 0 0);*/\n\n        /*// 2.0.x, 1.6,ext\n        type            timeVaryingUniformFixedValue;\n        fileName        \"steps_0p1s\";\n        outOfBounds     clamp;\n        value           uniform (0 0 0);*/\n\n        // 2.1.x\n        type            uniformFixedValue;\n        uniformValue     table\n        (\n            (0.000 (0 0 0.2))\n            (0.010 (0 0 0.2))\n            (0.011 (0 0 0.4))\n            (0.020 (0 0 0.4))\n            (0.021 (0 0 0.6))\n            (0.030 (0 0 0.6))\n            (0.031 (0 0 0.8))\n            (0.040 (0 0 0.8))\n            (0.041 (0 0 1.0))\n            (0.050 (0 0 1.0))\n            (0.051 (0 0 1.2))\n            (0.060 (0 0 1.2))\n            (0.061 (0 0 1.4))\n            (0.070 (0 0 1.4))\n            (0.071 (0 0 1.6))\n            (0.080 (0 0 1.6))\n            (0.081 (0 0 1.8))\n            (0.090 (0 0 1.8))\n            (0.091 (0 0 2.0))\n            (0.100 (0 0 2.0))\n        );\n    }\n\n    outlet\n    {\n        /*type            fluxCorrectedVelocity; //inletOutlet;\n        value           uniform (0 0 0);\n        inletValue      uniform (0 0 0);*/\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 0.01;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;\n\nturbulence      off;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType \"A\"; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel divided;\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel \"basicIO\";\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;//twoWayM2M;//twoWayFiles;//oneWayVTK;//\n\naveragingModel dense;//dilute;//\n\nclockModel standardClock;//off;\n\nsmoothingModel off;\n\nforceModels\n(\n    //GidaspowDrag\n    DiFeliceDrag\n    //KochHillDrag\n    gradPForce\n    viscForce\n    Archimedes\n    //volWeightedAverage\n    //totalMomentumExchange\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nimplicitCoupleProps\n{\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\nvolWeightedAverageProps\n{\n    scalarFieldNames\n    (\n        voidfraction\n    );\n    vectorFieldNames\n    (\n    );\n    upperThreshold 0.999;\n    lowerThreshold 0;\n    verbose;\n}\ntotalMomentumExchangeProps\n{\n    implicitMomExFieldName \"Ksl\";\n    explicitMomExFieldName \"none\";\n    fluidVelFieldName \"U\";\n}\nGidaspowDragProps\n{\n}\nDiFeliceDragProps\n{\n}\n\nKochHillDragProps\n{\n}\n\nvirtualMassForceProps\n{\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10100;\n}\n\ncentreProps\n{\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\ndividedProps\n{\n}\n\ntwoWayMPIProps\n{\n    //maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\ntwoWayM2MProps\n{\n    maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 0 -981 );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n);\n// ************************************************************************* //\n\n/*runLiggghtsProps\n{\n    preNo false;\n}*/\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5;\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType  laminar;//OFversion30x\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/octave/loaddata.m",
    "content": "function [data,colname]=loaddata(filename,columns,headerlines)\r\n\r\n% data = loaddata(filename,columns,headerlines)\r\n% data = loaddata(filename,0,headerlines): automatc detection of \r\n%           columns by word count in first headerline or first data line\r\n%           (if headerline==0), separated by blanks or tabs\r\n%           columns=-1: write colum assignment code lines\r\n%              works only if headerline>0 and colnames separated by \r\n%              not more than 1 blank!\r\n%           columns=-2: columns separated by 2 blanks (fluent/scheme auswertung-instat.scm)\r\n% [data, colname] = loaddata(filename,0,headerlines) \r\n%           colname = cell string array of column names from headerline\r\n\r\nfprintf(1,'loading %s ...  ', filename);\r\nf=fopen(filename,'r');\r\nif f==-1\r\n  fprintf(1,'\\n*** error: could not open \"%s\" ...\\n', filename);\r\n  data=[];\r\nelse\r\n  for i=1:headerlines\r\n    if i==1 s=fgets(f); else fgets(f); end\r\n  end\r\n  if headerlines==0\r\n    s=fgets(f); frewind(f);\r\n  end\r\n  if columns<=0 % & headerlines>=1\r\n    fprintf(1,'\\n');\r\n    fprintf(1,'  %s',s);\r\n    pos = findstr(sprintf('\\t'),s); % trennzeichenpositionen in zeile suchen\r\n    if length(pos)>0\r\n      endpos=length(s);\r\n      %if isspace(s(endpos-1)) endpos=endpos-1; end\r\n      pos = [0 pos(1,:) endpos]; % anfangs- und endposition hinzufgen\r\n    elseif columns==-2 % spalteneintrge durch 2 blanks getrennt (fluent/scheme)\r\n      pos=[0];\r\n      for i=1:length(s)-1\r\n        if isspace(s(i)) & isspace(s(i+1))\r\n          pos(end+1)=i+1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);      \r\n    else % spalteneintrge durch blanks getrennt     \r\n      %pos = findstr(' ',s); % trennzeichenpositionen in zeile suchen\r\n      pos=[];\r\n      word=0;\r\n      for i=1:length(s)\r\n        if isspace(s(i))\r\n          word=0;\r\n        elseif ~word\r\n          word=1;\r\n          pos(end+1)=i-1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);\r\n    end\r\n    if headerlines>=1\r\n      for i=1:length(pos)-1 % alle spalten\r\n        colname{i}=s(pos(i)+1:pos(i+1)-1);\r\n        if columns==-1 fprintf(' = data(strmatch(''%s'',colname),:); %% column %d\\n', colname{i},i); end\r\n        if columns==-2 fprintf('%% column %d: %s\\n', i, colname{i}); end\r\n      end   \r\n    end\r\n    columns = length(pos)-1;\r\n    fprintf(1,'  total: %d columns ',columns);\r\n  end\r\n  data=fscanf(f,'%f',[columns,inf]);\r\n  fclose(f);\r\n  fprintf(1,'done.\\n');\r\nend\r\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/octave/totalPressureDrop.m",
    "content": "close all;\nclear;\nclc;\n\n%====================================%\n% simulation data 1\n%====================================%\nrhoG = 0.01\t\t\t% density in g/cm3\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\n\n%- nomenclature before 2.4.x\n%columns=22;\n%headerlines=4;\n%data = loaddata(path,columns,headerlines);\n%data=transpose(data);\n\ndata = load(path);\n[x,y]=size(data)\ndp_sim = (data(:,2)-data(:,y))*rhoG*0.1; % *rhoG to get pressure, then *0.1 to get from Ba in Pa\nt_sim = data(:,1);\n%fprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% analytical calculation (in SI units)\n%====================================%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.001\t\t\t% particle diameter\nphip = 1\t\t\t% sphericity\nepsilon = 0.451335              % void fraction\nUstart = 0.002\nUend = 0.02\ntimeStepSize = 0.001;            % time interval of pressure data\nTstart = 0;\nTend = t_sim(length(t_sim));\ndeltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize);\nU = Ustart+deltaU:deltaU:Uend;  % velocity over time\nUa = U / epsilon;\t\t% physical velocity\nL = 0.0156\t\t\t% length of bed\nrhoG = 10\t\t\t% density in kg/m3\nnuG = 1.5*10^-4\t\t\t% kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp))\n        );\n\nfprintf('NOTE: this pressure is divided by density (according to CFD solver)\\n')\nfprintf('so the result does not depend on density\\n')\n\n%fprintf('final pressure drop (Ergun eqn)= %f Pa\\n',dpErgun)\n\n%==================================\n% min fluidization velocity in m/s\n%==================================\nrhoP = 2000                      % particle density in kg/m3\ng = 9.81                        % gravity m/s2\n\nUmf = dp^2*(rhoP-rhoG)*g/(150*muG)*(epsilon^3*phip^2)/(1-epsilon);\nReMF = Umf*dp*rhoG/muG;\nif(ReMF<20)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif(ReMF>20 && ReMF<1000)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif (ReMF>=1000)\n    fprintf('applying eqn2 for Umf.\\n')\n    Umf = sqrt(dp*(rhoP-rhoG)*g/(1.75*rhoG)*epsilon^3*phip);\n    ReMF = Umf*dp*rhoG/muG;\nend\n\ndpUmf= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp))\n        );\n%dpUmf2=(L*(1-epsilon)*(rhoP-rhoG)*g+pHydr)\n%====================================%\n% plot data\n%====================================%\nfigure(2)\nplot(U,dp_sim)\ntitle(\"Ergun pressure drop vs. simulation\")\na=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\nlegend(a,\"simulation\")\nxlabel(\"velocity in [m/s]\")\nylabel(\"pressure drop [Pa]\")\n%axis([0,Uend,0,dpErgun(length(dpErgun))])\n\nfigure(1)\nplot(U,dpErgun,U,dp_sim,[Umf,Uend],dpUmf*ones(1,2))\ntitle(\"Ergun pressure drop vs. simulation\")\na=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\nlegend(a,\"simulation\",\"analyt. deltaP at Umf\")\nxlabel(\"velocity in [m/s]\")\nylabel(\"pressure drop [Pa]\")\n%axis([0,Uend,0,dpErgun(length(dpErgun))])\n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPiso_ErgunTestMPI.eps\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/steps_0p1s",
    "content": "(\n            (0.000 (0 0 0.2))\n            (0.010 (0 0 0.2))\n            (0.011 (0 0 0.4))\n            (0.020 (0 0 0.4))\n            (0.021 (0 0 0.6))\n            (0.030 (0 0 0.6))\n            (0.031 (0 0 0.8))\n            (0.040 (0 0 0.8))\n            (0.041 (0 0 1.0))\n            (0.050 (0 0 1.0))\n            (0.051 (0 0 1.2))\n            (0.060 (0 0 1.2))\n            (0.061 (0 0 1.4))\n            (0.070 (0 0 1.4))\n            (0.071 (0 0 1.6))\n            (0.080 (0 0 1.6))\n            (0.081 (0 0 1.8))\n            (0.090 (0 0 1.8))\n            (0.091 (0 0 2.0))\n            (0.100 (0 0 2.0))\n)\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.0                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\nversion  2.0;\nformat   ascii;\nclass       dictionary;\nobject      blockMeshDict;\n}\n// ************************************\n   meshGenApp blockMesh;\n   convertToMeters 100;\n\n    //64 mm column diameter\n    //15 cm length\n   \n   \n   \n    //Width of middle square section\n   \n   \n   \n   \n    //how many cells in the square section\n    //how many cells from square section to perimeter\n    // how many cells from top to bottom\n\n   vertices\n   (\n    ( 0.0069 0.0069 0.0  ) // Vertex fiveoclocksqb = 0 \n    (-0.0069 0.0069 0.0  ) // Vertex sevenoclocksqb = 1 \n    (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 \n    ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 \n    (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 \n    (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 \n    ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 \n\n    ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 \n    (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 \n    (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 \n    ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 \n    (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 \n    (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 \n    ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 \n   );\t\t\t\t\n\n   blocks\n   (\n    //square block\n    hex (\n       2 3 0 1   \n       10 11 8 9   \n       )\n    (8 8 24)\n    simpleGrading (1 1 1)\n\n    //slice1\n    hex (\n       1 0 4 5\n       9 8 12 13\n       )\n    (8 4 24)\n    simpleGrading (1 1 1)\n\n    //slice2\n    hex (\n       6 2 1  5 \n       14 10 9   13 \n       )\n   ( 4 8 24)\nsimpleGrading (1 1 1)\n\n   //slice3\n   hex (\n         6 7 3 2   \n         14 15 11 10   \n       )\n   (8 4 24)\nsimpleGrading (1 1 1)\n\n   //slice4\n   hex (\n         3 7 4 0  \n         11 15 12 8  \n       )\n   (4 8 24)\nsimpleGrading (1 1 1)\n\n   );\n\n\n   //create the quarter circles\n   edges\n   (\n    arc 4 5 (0.0 0.0138 0.0 )\n    arc 5 6 (-0.0138 0.0 0.0)\n    arc 6 7 (0.0 -0.0138 0.0 )\n    arc 7 4 (0.0138 0.0 0.0)\n\n    arc 12 13 (0.0 0.0138 0.0553 )\n    arc 13 14 (-0.0138 0.0 0.0553 )\n    arc 14 15 (0.0 -0.0138 0.0553 )\n    arc 15 12 (0.0138 0.0 0.0553 )\n\n   );\n\n   patches\n   (\n    patch inlet\n    (\n     (0 3 2 1)\n     (0 4 7 3)\n     (4 0 1 5)\n     (1 2 6 5)\n     (3 7 6 2)\n    )\n\n    patch outlet\n    (\n     (8 11 10 9)\n     (8 12 15 11)\n     (12 8 9 13)\n     (9 10 14 13)\n     (11 15 14 10)\n    )\n\n    wall wall\n    (\n     (5 4 12 13)\n     (5 13 14 6)\n     (6 14 15 7)\n     (7 15 12 4)\n    )\n\n);\n\nmergePatchPairs\n(\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n//libs ( \"libgroovyBC.so\" );\nDimensionedConstants\n{\n    unitSet             CGS; // SI; // USCS; // \n\n    CGSCoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 2.99792e+10; // speed of light in vacuum (cm/s)\n            G               G [ -1 3 -2 0 0 0 0 ] 6.67429e-8; // gravitational constant (cm^3/(gs^2))\n            h               h [ 1 2 -1 0 0 0 0 ] 6.62607e-27; // Planck's constant (erg.s)\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 4.803204e-10; // elementary charge (statcoulomb)\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 9.10938e-28; // electron mass (g)\n            mp              mp [ 1 0 0 0 0 0 0 ] 1.67262e-24; // proton mass (g)\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 1.66054e-24; // atomic mass unit (g)\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.38065e-16; // Boltzman constant (erg/K)\n        }\n        standard\n        {\n            //- Standard pressure [bar]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 1000000; // 1 bar (barye)\n            //- Standard temperature [degK]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 298.15; // should be same as in SI unit system\n        }\n    }\n\n    SICoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 2.99792e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 6.67429e-11;\n            h               h [ 1 2 -1 0 0 0 0 ] 6.62607e-34;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 9.10938e-31;\n            mp              mp [ 1 0 0 0 0 0 0 ] 1.67262e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 1.66054e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.38065e-23;\n        }\n        standard\n        {\n            //- Standard pressure [Pa]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 100000;\n            //- Standard temperature [degK]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 298.15;\n        }\n    }\n\n    USCSCoeffs\n    {\n        universal\n        {\n            c               c [ 0 1 -1 0 0 0 0 ] 9.83558e+08;\n            G               G [ -1 3 -2 0 0 0 0 ] 1.06909e-09;\n            h               h [ 1 2 -1 0 0 0 0 ] 1.57234e-32;\n        }\n        electromagnetic\n        {\n            e               e [ 0 0 1 0 0 1 0 ] 1.60218e-19;\n        }\n        atomic\n        {\n            me              me [ 1 0 0 0 0 0 0 ] 2.00825e-30;\n            mp              mp [ 1 0 0 0 0 0 0 ] 3.68746e-27;\n        }\n        physicoChemical\n        {\n            mu              mu [ 1 0 0 0 0 0 0 ] 3.66083e-27;\n            k               k [ 1 2 -2 -1 0 0 0 ] 1.82012e-22;\n        }\n        standard\n        {\n            //- Standard pressure [lbm/ft^2]\n            Pstd            Pstd [ 1 -1 -2 0 0 0 0 ] 2088.6;\n            //- Standard temperature [degR]\n            Tstd            Tstd [ 0 0 0 1 0 0 0 ] 536.67;\n        }\n    }\n}\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.01)\n            (0 0 0.26)\n            (0 0 0.51)\n            (0 0 0.76)\n            (0 0 1.01)\n            (0 0 1.26)\n            (0 0 1.51)\n            (0 0 1.76)\n            (0 0 2.01)\n            (0 0 2.26)\n            (0 0 2.51)\n            (0 0 2.76)\n            (0 0 3.01)\n            (0 0 3.26)\n            (0 0 3.51)\n            (0 0 3.75)\n            (0 0 4.01)\n            (0 0 4.26)\n            (0 0 4.51)\n            (0 0 4.76)\n            (0 0 5.29)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;//0.01;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.001;//0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nlibs (\"libOpenFOAM.so\" \"libgroovyBC.so\");\n\nfunctions\n(\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n);\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/decomposeParDict",
    "content": "/*-------------------------------*- C++ -*---------------------------------*\\\n|    =========                                                              |\n|    \\\\      /     OpenFOAM                                                 |\n|     \\\\    /                                                               |\n|      \\\\  /       The Open Source CFD Toolbox                              |\n|       \\\\/                                        http://www.OpenFOAM.org  |\n\\*-------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    note        \"mesh decomposition control dictionary\";\n    location    \"system\";\n    object      decomposeParDict;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains  4;\n\n//- Keep owner and neighbour on same processor for faces in zones:\n// preserveFaceZones (heater solid1 solid3);\n\n//method          scotch;\n// method          hierarchical;\n method          simple;\n// method          metis;\n// method          manual;\n\nsimpleCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n}\n\nhierarchicalCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n    order       xyz;\n}\n\nmetisCoeffs\n{\n /*\n    processorWeights\n    (\n        1\n        1\n        1\n        1\n    );\n  */\n}\n\nscotchCoeffs\n{\n    //processorWeights\n    //(\n    //    1\n    //    1\n    //    1\n    //    1\n    //);\n    //writeGraph  true;\n    //strategy \"b\";\n}\n\nmanualCoeffs\n{\n    dataFile    \"decompositionData\";\n}\n\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/funkySetFieldsDict",
    "content": "FoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"/.automount/werner/Werner/bgschaid/bgschaid-foamStuff/DepositionTests\";\n    case            \"neutralTest\";\n    instance        \"system\";\n    local           \"\";\n\n    class           dictionary;\n    object          funkySetFieldsDict;\n}\n\nexpressions\n(\n\tinit\n\t{\n\t\tfield voidfraction;\n\t\texpression \"1\";\n                valuePatches 2(inlet outlet); // set value 1 at those patches\n\t}\n\tsetGamma\n\t{\n\t\tfield voidfraction;\n\t\texpression \"0.43\";\n\t\t//condition \"pow(pow(pos().x-0.2,2) + pow(pos().y-0,2)+ pow(pos().z-0,2),0.5) < 0.04\";\n                condition \"pos().z < 0.01467 && pos().z > 0.0\";\n                keepPatches true;\n                //valuePatches 1(inlet); // set value 1 at those patches\n\t}\n\t\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    k\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    epsilon\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 1;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           cgs\n\nregion          reg block -1.5 1.5 -1.5 1.5 -0.1 5.54 units box\ncreate_box      1 reg\n\nneighbor        0.1 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\nsoft_particles yes\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 981 vector 0.0 0.0 -1.0\n\n# walls\nfix     zwalls1  all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2  all wall/gran model hertz tangential history primitive type 1 zplane 5.53\nfix     cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 1.385 0. 0.\n\n# particle distributions and insertion\nregion  bc cylinder z 0.0 0.0 1.2 0. 5.5 units box\nfix     pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2. radius constant 0.05\nfix     pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix     ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -100. insert_every once overlapcheck yes all_in yes particles_in_region 10000 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix     integr all nve/sphere\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun         1\ndump        dmp all custom 5000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius\n#force : f_couple_cfd[0] f_couple_cfd[1] f_couple_cfd[2]\n#node : f_couple_cfd[6]\n#cell id : f_couple_cfd[7]\n\nrun         10000 upto\nwrite_restart   post/restart/liggghts.restart\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           cgs\nprocessors      2 2 1\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        0.1 bin\nneigh_modify    delay 0\n\n# Material properties required for granular pair styles\nsoft_particles yes\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 981 vector 0.0 0.0 -1.0\n\n# walls\nfix         zwalls1  all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix         zwalls2  all wall/gran model hertz tangential history primitive type 1 zplane 5.53\nfix         cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 1.385 0. 0.\n\n# change the particles density\nset         group all density 2.0\n\n# cfd coupling\nfix         cfd all couple/cfd couple_every 100 mpi\nfix         cfd2 all couple/cfd/force/implicit\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# center of mass\ncompute     centerOfMass all com\n\n# sum of explicit and implicit drag force given from CFD to DEM\nvariable    dragtotalX equal f_cfd2[1]\nvariable    dragtotalY equal f_cfd2[2]\nvariable    dragtotalZ equal f_cfd2[3]\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol c_centerOfMass[3] v_dragtotalX v_dragtotalY v_dragtotalZ\nthermo          10\nthermo_modify   lost ignore norm no\n\ndump            dmp all custom 5000 ../DEM/post/dump*.liggghts_run id type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \n\nrun             1\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run ErgunTestMPI_cgs \n# Christoph Goniva - March 2013\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_ErgunTestMPI_cgs_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n\nif [ $runOctave == \"true\" ]\n    then\n        #------------------------------#\n        #  octave\n\n        #- change path\n        cd octave\n\n        #- rmove old graph\n        rm cfdemSolverPiso_ErgunTestMPI.eps\n\n        #- run octave\n        octave --no-gui totalPressureDrop.m\n\n        #- show plot \n        evince cfdemSolverPiso_ErgunTestMPI.eps\n\n        #- copy log file to test harness\n        cp ../../$logfileName $testHarnessPath\n        cp cfdemSolverPiso_ErgunTestMPI.eps $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finisehd? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py dump*.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\n\nfi\n\n#- clean up case\necho \"deleting data at: $casePath :\\n\"\nsource $WM_PROJECT_DIR/bin/tools/CleanFunctions\ncd $casePath/CFD\ncleanCase\nrm -r $casePath/CFD/clockData\nrm $casePath/DEM/post/*.*\n#rm -r $casePath/DEM/post/restart/*.*\ntouch $casePath/DEM/post/.gitignore\ntouch $casePath/DEM/post/restart/.gitignore\necho \"done\"\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_cgs/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Daniel Queteschiner - June 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest\n# Christoph Goniva - Sept. 2010\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nrunOctave=\"true\"\npostproc=\"false\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM in new terminal\n    $casePath/parDEMrun.sh\nfi\n\n#-------------------------------------------------------#\n# adapt settings for init run\ncp $casePath/CFD/constant/liggghtsCommands_run $casePath/CFD/constant/liggghtsCommands\ncp $casePath/CFD/constant/couplingProperties_run $casePath/CFD/constant/couplingProperties\ncp $casePath/CFD/system/controlDict_run $casePath/CFD/system/controlDict\n#-------------------------------------------------------#\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso ErgunTestMPI_restart CFD'  -e \"bash $casePath/parCFDDEMrun.sh\" \n. $casePath/parCFDDEMrun.sh\n\n#- wait until sim has finished then run octave\necho \"simulation finished? ...press enter to proceed\"\nread\n\n\n#-------------------------------------------------------#\n# adapt settings for init or restart run\ncp $casePath/CFD/constant/liggghtsCommands_restart $casePath/CFD/constant/liggghtsCommands\ncp $casePath/CFD/constant/couplingProperties_restart $casePath/CFD/constant/couplingProperties\ncp $casePath/CFD/system/controlDict_restart $casePath/CFD/system/controlDict\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso ErgunTestMPI_restart CFD'  -e \"bash $casePath/parCFDDEMrun.sh\" \n. $casePath/parCFDDEMrun.sh\n\n\n#- wait until sim has finished then run octave\necho \"simulation finished? ...press enter to proceed\"\nread\n#-------------------------------------------------------#\n\n\nif [ $runOctave == \"true\" ]\n  then\n    #- change path\n    cd $casePath/CFD/octave\n\n    #- rmove old graph\n    rm cfdemSolverPiso_ErgunTestMPI.eps\n\n    #- run octave\n    octave --no-gui totalPressureDrop.m\n\n    #- show plot \n    evince cfdemSolverPiso_ErgunTestMPI.eps\n\n    #- copy log file to test harness\n    cp $casePath/../$logfileName $testHarnessPath\n    cp cfdemSolverPiso_ErgunTestMPI.eps $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finisehd? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_restart\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\necho \"deleting data at: $casePath :\\n\"\nsource $WM_PROJECT_DIR/bin/tools/CleanFunctions\ncd $casePath/CFD\ncleanCase\nrm -r $casePath/CFD/constant/liggghtsCommands\nrm -r $casePath/CFD/constant/couplingProperties\nrm -r $casePath/CFD/clockData\nrm -r $casePath/DEM/post/*.*\n#rm -r $casePath/DEM/post/restart/*.*\ntouch $casePath/DEM/post/.gitignore\ntouch $casePath/DEM/post/restart/.gitignore\necho \"done\"\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        /*type            flowRateInletVelocity;\n        flowRate        0.001;\n        value           uniform (0 0 0);*/\n\n        /*type            fixedValue;\n        value           uniform (0 0 0.0001);*/\n\n        //type            zeroGradient;\n\n/*        type            groovyBC;\n        variables       \"Uend=vector(0,0,0.02);tEnd=0.1;\";\n        valueExpression \"((time() < tEnd) ? Uend/tEnd*time():Uend)\";\n        value           uniform (0 0 0);*/\n\n        // 2.0.x, 1.6,ext\n        /*type            timeVaryingUniformFixedValue;\n        fileName        \"steps_0p1s\";\n        outOfBounds     clamp;\n        value           uniform (0 0 0);*/\n\n        // 2.1.x or higher\n        type            uniformFixedValue;\n        uniformValue     table\n        (\n            (0.000 (0 0 0.002))\n            (0.100 (0 0 0.020))\n        );\n    }\n\n    outlet\n    {\n        /*type            fluxCorrectedVelocity; //inletOutlet;\n        value           uniform (0 0 0);\n        inletValue      uniform (0 0 0);*/\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/epsilon",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      epsilon;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -3 0 0 0 0];\n\ninternalField   uniform 0.003;\n\nboundaryField\n{\n    wall\n    {\n        type            epsilonWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0.003;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.003;\n        value           uniform 0.003;\n    }\n    inlet\n    {\n        /*type            turbulentMixingLengthDissipationRateInlet;\n        mixingLength    0.005;\n        value           uniform 0.003;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0.001;\n\nboundaryField\n{\n    wall\n    {\n        type            kqRWallFunction;\n        value           uniform 0.001;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.001;\n        value           uniform 0.001;\n    }\n    inlet\n    {\n        /*type            turbulentIntensityKineticEnergyInlet;\n        intensity       0.05;\n        value           uniform 0.001;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/nut",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      nut;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            nutWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 1.0e5;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 100000;\n    }\n    outlet\n    {\n        //type            zeroGradient;\n\n        type            fixedValue;\n        value           uniform 1.0e5;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 10;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;\n\nturbulence      off;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/couplingProperties_restart",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\ndebug false;\nmodelType \"A\"; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel divided;//centre;//\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;//twoWayM2M;//twoWayFiles;//oneWayVTK;//\n\naveragingModel dense;//dilute;//\n\nclockModel standardClock;//off;//\n\nsmoothingModel off;// localPSizeDiffSmoothing;// constDiffSmoothing; //\n\nforceModels\n(\n    //GidaspowDrag\n    //BeetstraDrag\n    //DiFeliceDrag\n    KochHillDrag\n    gradPForce\n    viscForce\n    Archimedes\n    //volWeightedAverage\n    //totalMomentumExchange\n    //particleCellVolume\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nlocalPSizeDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    dSmoothingLength 1.5e-3;\n    Csmoothing    1.0; \n}\n\nconstDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    smoothingLength 1.5e-3;\n}\n\nimplicitCoupleProps\n{\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\nvolWeightedAverageProps\n{\n    scalarFieldNames\n    (\n        voidfraction\n    );\n    vectorFieldNames\n    (\n    );\n    upperThreshold 0.999;\n    lowerThreshold 0;\n    verbose;\n}\ntotalMomentumExchangeProps\n{\n    implicitMomExFieldName \"Ksl\";\n    explicitMomExFieldName \"none\";\n    fluidVelFieldName \"U\";\n}\nGidaspowDragProps\n{\n    verbose;\n    phi 1;\n}\nDiFeliceDragProps\n{\n}\n\nKochHillDragProps\n{\n    //verbose;\n}\n\nBeetstraDragProps\n{\n    rhoParticle     2000.;\n    interpolation ;\n    useFilteredDragModel ;\n    useParcelSizeDependentFilteredDrag ;\n    k       0.05;\n    aLimit  0.0;\n//    verbose ;\n}\n\nvirtualMassForceProps\n{\n}\n\nparticleCellVolumeProps\n{\n    upperThreshold 0.999;\n    lowerThreshold 0.;\n    verbose true;\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10100;\n}\n\ncentreProps\n{\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\ndividedProps\n{\n    alphaMin 0.01;\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_restart\";\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/couplingProperties_run",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\ndebug false;\nmodelType \"A\"; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel divided;//centre;//\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;//twoWayM2M;//twoWayFiles;//oneWayVTK;//\n\naveragingModel dense;//dilute;//\n\nclockModel standardClock;//off;\n\nsmoothingModel off;// localPSizeDiffSmoothing;// constDiffSmoothing; //\n\nforceModels\n(\n    //GidaspowDrag\n    //BeetstraDrag\n    //DiFeliceDrag\n    KochHillDrag\n    gradPForce\n    viscForce\n    Archimedes\n    //volWeightedAverage\n    //totalMomentumExchange\n    //particleCellVolume\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nlocalPSizeDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    dSmoothingLength 1.5e-3;\n    Csmoothing    1.0; \n}\n\nconstDiffSmoothingProps\n{\n    lowerLimit 0.1;\n    upperLimit 1e10;\n    smoothingLength 1.5e-3;\n}\n\nimplicitCoupleProps\n{\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\nvolWeightedAverageProps\n{\n    scalarFieldNames\n    (\n        voidfraction\n    );\n    vectorFieldNames\n    (\n    );\n    upperThreshold 0.999;\n    lowerThreshold 0;\n    verbose;\n}\ntotalMomentumExchangeProps\n{\n    implicitMomExFieldName \"Ksl\";\n    explicitMomExFieldName \"none\";\n    fluidVelFieldName \"U\";\n}\nGidaspowDragProps\n{\n    verbose;\n    phi 1;\n}\nDiFeliceDragProps\n{\n}\n\nKochHillDragProps\n{\n    //verbose;\n}\n\nBeetstraDragProps\n{\n    rhoParticle     2000.;\n    interpolation ;\n    useFilteredDragModel ;\n    useParcelSizeDependentFilteredDrag ;\n    k       0.05;\n    aLimit  0.0;\n//    verbose ;\n}\n\nvirtualMassForceProps\n{\n}\n\nparticleCellVolumeProps\n{\n    upperThreshold 0.999;\n    lowerThreshold 0.;\n    verbose true;\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10100;\n}\n\ncentreProps\n{\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\ndividedProps\n{\n    alphaMin 0.01;\n}\n\ntwoWayMPIProps\n{\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\ntwoWayM2MProps\n{\n    maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 0 -9.81 );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/liggghtsCommands_restart",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n);\n// ************************************************************************* //\n\n/*runLiggghtsProps\n{\n    preNo false;\n}*/\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/liggghtsCommands_run",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n    runLiggghts\n    writeLiggghts\n);\n\nrunLiggghtsProps\n{\n    preNo false;\n}\n\n//- optional\nwriteLiggghtsProps\n{\n    writeLastOnly off;\n    writeName \"post/restart/liggghts.restartCFDEM\";\n    overwrite on;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-04;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType  laminar;//OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/octave/loaddata.m",
    "content": "function [data,colname]=loaddata(filename,columns,headerlines)\r\n\r\n% data = loaddata(filename,columns,headerlines)\r\n% data = loaddata(filename,0,headerlines): automatc detection of \r\n%           columns by word count in first headerline or first data line\r\n%           (if headerline==0), separated by blanks or tabs\r\n%           columns=-1: write colum assignment code lines\r\n%              works only if headerline>0 and colnames separated by \r\n%              not more than 1 blank!\r\n%           columns=-2: columns separated by 2 blanks (fluent/scheme auswertung-instat.scm)\r\n% [data, colname] = loaddata(filename,0,headerlines) \r\n%           colname = cell string array of column names from headerline\r\n\r\nfprintf(1,'loading %s ...  ', filename);\r\nf=fopen(filename,'r');\r\nif f==-1\r\n  fprintf(1,'\\n*** error: could not open \"%s\" ...\\n', filename);\r\n  data=[];\r\nelse\r\n  for i=1:headerlines\r\n    if i==1 s=fgets(f); else fgets(f); end\r\n  end\r\n  if headerlines==0\r\n    s=fgets(f); frewind(f);\r\n  end\r\n  if columns<=0 % & headerlines>=1\r\n    fprintf(1,'\\n');\r\n    fprintf(1,'  %s',s);\r\n    pos = findstr(sprintf('\\t'),s); % trennzeichenpositionen in zeile suchen\r\n    if length(pos)>0\r\n      endpos=length(s);\r\n      %if isspace(s(endpos-1)) endpos=endpos-1; end\r\n      pos = [0 pos(1,:) endpos]; % anfangs- und endposition hinzufgen\r\n    elseif columns==-2 % spalteneintrge durch 2 blanks getrennt (fluent/scheme)\r\n      pos=[0];\r\n      for i=1:length(s)-1\r\n        if isspace(s(i)) & isspace(s(i+1))\r\n          pos(end+1)=i+1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);      \r\n    else % spalteneintrge durch blanks getrennt     \r\n      %pos = findstr(' ',s); % trennzeichenpositionen in zeile suchen\r\n      pos=[];\r\n      word=0;\r\n      for i=1:length(s)\r\n        if isspace(s(i))\r\n          word=0;\r\n        elseif ~word\r\n          word=1;\r\n          pos(end+1)=i-1;\r\n        end\r\n      end\r\n      pos(end+1)=length(s);\r\n    end\r\n    if headerlines>=1\r\n      for i=1:length(pos)-1 % alle spalten\r\n        colname{i}=s(pos(i)+1:pos(i+1)-1);\r\n        if columns==-1 fprintf(' = data(strmatch(''%s'',colname),:); %% column %d\\n', colname{i},i); end\r\n        if columns==-2 fprintf('%% column %d: %s\\n', i, colname{i}); end\r\n      end   \r\n    end\r\n    columns = length(pos)-1;\r\n    fprintf(1,'  total: %d columns ',columns);\r\n  end\r\n  data=fscanf(f,'%f',[columns,inf]);\r\n  fclose(f);\r\n  fprintf(1,'done.\\n');\r\nend\r\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/octave/totalPressureDrop.m",
    "content": "close all;\nclear;\nclc;\n\n%====================================%\n% simulation data 1\n%====================================%\nrhoG = 10\t\t\t% density in kg/m3\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\n\n%- nomenclature before 2.4.x\n%columns=22;\n%headerlines=4;\n%data = loaddata(path,columns,headerlines);\n%data=transpose(data);\n\ndata = load(path);\n[x,y]=size(data)\ndp_sim = (data(:,2)-data(:,y))*rhoG; % conversion to Pa\nt_sim = data(:,1);\n%fprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% simulation data 2\n%====================================%\n%path = '../probes/0.05/p'; % ext32\npath = '../postProcessing/probes/0.05/p';\n\n%- nomenclature before 2.4.x\n%columns=22;\n%headerlines=4;\n%data = loaddata(path,columns,headerlines);\n%data=transpose(data);\n\ndata = load(path);\n[x,y]=size(data)\ndp_sim_2 = (data(:,2)-data(:,y))*rhoG; % conversion to Pa\nt_sim_2 = data(:,1);\n%fprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n\n%====================================%\n% analytical calculation\n%====================================%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.001\t\t\t% particle diameter\nphip = 1\t\t\t% sphericity\nepsilon = 0.451335              % void fraction\nUstart = 0.002\nUend = 0.02\ntimeStepSize = 0.001;            % time interval of pressure data\nTstart = 0;\nTend = t_sim(length(t_sim))\nTend=0.1\ndeltaU=(Uend-Ustart)/((Tend-Tstart)/timeStepSize);\nU = Ustart+deltaU:deltaU:Uend;  % velocity over time\nUa = U / epsilon;\t\t% physical velocity\nL = 0.0156\t\t\t% length of bed\nnuG = 1.5*10^-4\t\t\t% kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*U.^2)/(phip*dp))\n        );\n\nfprintf('NOTE: this pressure is divided by density (according to CFD solver)\\n')\nfprintf('so the result does not depend on density\\n')\n\n%fprintf('final pressure drop (Ergun eqn)= %f Pa\\n',dpErgun)\n\n%==================================\n% min fluidization velocity in m/s\n%==================================\nrhoP = 2000                      % particle density in kg/m3\ng = 9.81                        % gravity m/s2\nUmf = dp^2*(rhoP-rhoG)*g/(150*muG)*(epsilon^3*phip^2)/(1-epsilon);\nReMF = Umf*dp*rhoG/muG;\nif(ReMF<20)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif(ReMF>20 && ReMF<1000)\n    fprintf('applying eqn1 for Umf.\\n')\nelseif (ReMF>=1000)\n    fprintf('applying eqn2 for Umf.\\n')\n    Umf = sqrt(dp*(rhoP-rhoG)*g/(1.75*rhoG)*epsilon^3*phip);\n    ReMF = Umf*dp*rhoG/muG;\nend\n\ndpUmf= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG.*Umf)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG.*Umf.^2)/(phip*dp))\n        );\n\n%====================================%\n% plot data\n%====================================%\n\n%figure(2)\n%plot(U,dp_sim)\n%title(\"Ergun pressure drop vs. simulation\")\n%a=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\n%legend(a,\"simulation\")\n%xlabel(\"velocity in [m/s]\")\n%ylabel(\"pressure drop [Pa]\")\n%axis([0,Uend,0,dpErgun(length(dpErgun))])\n\nfigure(1)\nplot(U,dpErgun,U(1:length(t_sim)),dp_sim,U(length(t_sim)+1:length(U)),dp_sim_2,'-+',[Umf,Uend],dpUmf*ones(1,2))\ntitle(\"Ergun pressure drop vs. simulation\")\na=strcat(\"analytical (Ergun), Umf=\",num2str(Umf),\", dpUmf=\",num2str(dpUmf));\nlegend(a,\"simulation\")\nxlabel(\"velocity in [m/s]\")\nylabel(\"pressure drop [Pa]\")\naxis([0,Uend,0,dpErgun(length(dpErgun))])\n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPiso_ErgunTestMPI.eps\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/steps_0p1s",
    "content": "(\n    (0.000 (0 0 0.002))\n    (0.100 (0 0 0.020))\n)\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.0                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\nversion  2.0;\nformat   ascii;\nclass       dictionary;\nobject      blockMeshDict;\n}\n// ************************************\n\n\n\n\n\n\n   meshGenApp blockMesh;\n   convertToMeters 1;\n\n    //64 mm column diameter\n    //15 cm length\n   \n   \n   \n    //Width of middle square section\n   \n   \n   \n   \n    //how many cells in the square section\n    //how many cells from square section to perimeter\n    // how many cells from top to bottom\n\n   vertices\n   (\n    ( 0.0069 0.0069 0.0  ) // Vertex fiveoclocksqb = 0 \n    (-0.0069 0.0069 0.0  ) // Vertex sevenoclocksqb = 1 \n    (-0.0069 -0.0069 0.0 ) // Vertex elevenoclocksqb = 2 \n    ( 0.0069 -0.0069 0.0 ) // Vertex oneoclocksqb = 3 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0 ) // Vertex fiveoclockcb = 4 \n    (-0.00975807358913172 0.00975807357161699 0.0) // Vertex sevenoclockcb = 5 \n    (-0.00975807358913172 -0.00975807357161699 0.0) // Vertex elevenoclockcb = 6 \n    ( 0.00975807358913172 -0.00975807357161699 0.0) // Vertex oneoclockcb = 7 \n\n    ( 0.0069 0.0069 0.0553) // Vertex fiveoclocksqt = 8 \n    (-0.0069 0.0069 0.0553) // Vertex sevenoclocksqt = 9 \n    (-0.0069 -0.0069 0.0553) // Vertex elevenoclocksqt = 10 \n    ( 0.0069 -0.0069 0.0553) // Vertex oneoclocksqt = 11 \n   \n    ( 0.00975807358913172 0.00975807357161699 0.0553) // Vertex fiveoclockct = 12 \n    (-0.00975807358913172 0.00975807357161699 0.0553) // Vertex sevenoclockct = 13 \n    (-0.00975807358913172 -0.00975807357161699 0.0553) // Vertex elevenoclockct = 14 \n    ( 0.00975807358913172 -0.00975807357161699 0.0553) // Vertex oneoclockct = 15 \n   );\t\t\t\t\n\n   blocks\n   (\n    //square block\n    hex (\n       2 3 0 1   \n       10 11 8 9   \n       )\n    (8 8 24)\n    simpleGrading (1 1 1)\n\n    //slice1\n    hex (\n       1 0 4 5\n       9 8 12 13\n       )\n    (8 4 24)\n    simpleGrading (1 1 1)\n\n    //slice2\n    hex (\n       6 2 1  5 \n       14 10 9   13 \n       )\n   ( 4 8 24)\nsimpleGrading (1 1 1)\n\n   //slice3\n   hex (\n         6 7 3 2   \n         14 15 11 10   \n       )\n   (8 4 24)\nsimpleGrading (1 1 1)\n\n   //slice4\n   hex (\n         3 7 4 0  \n         11 15 12 8  \n       )\n   (4 8 24)\nsimpleGrading (1 1 1)\n\n   );\n\n\n   //create the quarter circles\n   edges\n   (\n    arc 4 5 (0.0 0.0138 0.0 )\n    arc 5 6 (-0.0138 0.0 0.0)\n    arc 6 7 (0.0 -0.0138 0.0 )\n    arc 7 4 (0.0138 0.0 0.0)\n\n    arc 12 13 (0.0 0.0138 0.0553 )\n    arc 13 14 (-0.0138 0.0 0.0553 )\n    arc 14 15 (0.0 -0.0138 0.0553 )\n    arc 15 12 (0.0138 0.0 0.0553 )\n\n   );\n\n   patches\n   (\n    patch inlet\n    (\n     (0 3 2 1)\n     (0 4 7 3)\n     (4 0 1 5)\n     (1 2 6 5)\n     (3 7 6 2)\n    )\n\n    patch outlet\n    (\n     (8 11 10 9)\n     (8 12 15 11)\n     (12 8 9 13)\n     (9 10 14 13)\n     (11 15 14 10)\n    )\n\n    wall wall\n    (\n     (5 4 12 13)\n     (5 13 14 6)\n     (6 14 15 7)\n     (7 15 12 4)\n    )\n\n);\n\nmergePatchPairs\n(\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0.05;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n//libs ( \"libgroovyBC.so\" \"libfiniteVolumeCFDEM.so\");\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction voidfractionNext voidfractionPrev);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.1;//0.01;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.001;//0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nlibs (\"libOpenFOAM.so\" \"libgroovyBC.so\");\n\nfunctions\n(\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n);\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/controlDict_restart",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0.05;\n\nstopAt          endTime;\n\nendTime         0.1;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n//libs ( \"libgroovyBC.so\" \"libfiniteVolumeCFDEM.so\");\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction voidfractionNext voidfractionPrev);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/controlDict_run",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.05;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n//libs ( \"libgroovyBC.so\" \"libfiniteVolumeCFDEM.so\");\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0.0001)\n            (0 0 0.0026)\n            (0 0 0.0051)\n            (0 0 0.0076)\n            (0 0 0.0101)\n            (0 0 0.0126)\n            (0 0 0.0151)\n            (0 0 0.0176)\n            (0 0 0.0201)\n            (0 0 0.0226)\n            (0 0 0.0251)\n            (0 0 0.0276)\n            (0 0 0.0301)\n            (0 0 0.0326)\n            (0 0 0.0351)\n            (0 0 0.0375)\n            (0 0 0.0401)\n            (0 0 0.0426)\n            (0 0 0.0451)\n            (0 0 0.0476)\n            (0 0 0.0529)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction volAverage_voidfraction voidfractionNext voidfractionPrev);\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/decomposeParDict",
    "content": "/*-------------------------------*- C++ -*---------------------------------*\\\n|    =========                                                              |\n|    \\\\      /     OpenFOAM                                                 |\n|     \\\\    /                                                               |\n|      \\\\  /       The Open Source CFD Toolbox                              |\n|       \\\\/                                        http://www.OpenFOAM.org  |\n\\*-------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    note        \"mesh decomposition control dictionary\";\n    location    \"system\";\n    object      decomposeParDict;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains  4;\n\n//- Keep owner and neighbour on same processor for faces in zones:\n// preserveFaceZones (heater solid1 solid3);\n\n//method          scotch;\n// method          hierarchical;\n method          simple;\n// method          metis;\n// method          manual;\n\nsimpleCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n}\n\nhierarchicalCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n    order       xyz;\n}\n\nmetisCoeffs\n{\n /*\n    processorWeights\n    (\n        1\n        1\n        1\n        1\n    );\n  */\n}\n\nscotchCoeffs\n{\n    //processorWeights\n    //(\n    //    1\n    //    1\n    //    1\n    //    1\n    //);\n    //writeGraph  true;\n    //strategy \"b\";\n}\n\nmanualCoeffs\n{\n    dataFile    \"decompositionData\";\n}\n\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/funkySetFieldsDict",
    "content": "FoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"/.automount/werner/Werner/bgschaid/bgschaid-foamStuff/DepositionTests\";\n    case            \"neutralTest\";\n    instance        \"system\";\n    local           \"\";\n\n    class           dictionary;\n    object          funkySetFieldsDict;\n}\n\nexpressions\n(\n\tinit\n\t{\n\t\tfield voidfraction;\n\t\texpression \"1\";\n                valuePatches 2(inlet outlet); // set value 1 at those patches\n\t}\n\tsetGamma\n\t{\n\t\tfield voidfraction;\n\t\texpression \"0.43\";\n\t\t//condition \"pow(pow(pos().x-0.2,2) + pow(pos().y-0,2)+ pow(pos().z-0,2),0.5) < 0.04\";\n                condition \"pos().z < 0.01467 && pos().z > 0.0\";\n                keepPatches true;\n                //valuePatches 1(inlet); // set value 1 at those patches\n\t}\n\t\n);\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    \"(p)\"\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    \"(U|k|epsilon|R|nuTilda)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(voidfraction|Us|Ksl|dSmoothing)\"\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-05;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 1;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/in.liggghts_init",
    "content": "# Pour granular particles into chute container, then induce flow\necho both\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           si\n\nregion          reg block -0.015 0.015 -0.015 0.015 -0.001 0.0554 units box\ncreate_box      1 reg\n\nneighbor        0.001 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n# walls\nfix         zwalls1 all wall/gran model hertz tangential history primitive type 1  zplane 0.0\nfix         zwalls2 all wall/gran model hertz tangential history primitive type 1  zplane 0.0553\nfix         cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.01385 0. 0.\n\n# particle distributions and insertion\nregion      bc cylinder z 0.0 0.0 0.012 0. 0.055 units box\nfix         pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2000 radius constant 0.0005\nfix         pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix         ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -1. insert_every once overlapcheck yes all_in yes particles_in_region 10000 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun         1\ndump        dmp all custom 5000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius \n#force : f_couple_cfd[0] f_couple_cfd[1] f_couple_cfd[2]\n#node : f_couple_cfd[6]\n#cell id : f_couple_cfd[7]\n\nrun         10000 upto\nwrite_restart   post/restart/liggghts.restart\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/in.liggghts_restart",
    "content": "# Pour granular particles into chute container, then induce flow\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           si\nprocessors      2 2 1\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restartCFDEM\n\nneighbor        0.0005 bin\nneigh_modify    delay 0\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\nfix     zwalls1  all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2  all wall/gran model hertz tangential history primitive type 1 zplane 0.0553\nfix     cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.01385 0. 0.\n\n# change the particles density\nset     group all density 2000\n\n# cfd coupling\nfix     cfd all couple/cfd couple_every 100 mpi\nfix     cfd2 all couple/cfd/force/implicit\n\n# apply nve integration to all particles that are inserted as single particles\nfix     integr all nve/sphere\n\n# center of mass\ncompute     centerOfMass all com\n\n# compute total dragforce\ncompute     dragtotal all reduce sum f_dragforce[1] f_dragforce[2] f_dragforce[3]\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol c_centerOfMass[3] c_dragtotal[1] c_dragtotal[2] c_dragtotal[3]\nthermo          10\nthermo_modify   lost ignore norm no\n\ndump        dmp all custom 5000 ../DEM/post/dump*.liggghts_restart id type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \n\nrun         1\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/DEM/in.liggghts_run",
    "content": "# Pour granular particles into chute container, then induce flow\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        m m m\nnewton          off\n\nunits           si\nprocessors      2 2 1\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        0.0005 bin\nneigh_modify    delay 0\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\nfix     zwalls1  all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2  all wall/gran model hertz tangential history primitive type 1 zplane 0.0553\nfix     cylwalls all wall/gran model hertz tangential history primitive type 1 zcylinder 0.01385 0. 0.\n\n# change the particles density\nset     group all density 2000\n\n# cfd coupling\nfix     cfd all couple/cfd couple_every 100 mpi\nfix     cfd2 all couple/cfd/force/implicit\n\n# apply nve integration to all particles that are inserted as single particles\nfix     integr all nve/sphere\n\n# center of mass\ncompute     centerOfMass all com\n\n# compute total dragforce\ncompute     dragtotal all reduce sum f_dragforce[1] f_dragforce[2] f_dragforce[3]\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol c_centerOfMass[3] c_dragtotal[1] c_dragtotal[2] c_dragtotal[3]\nthermo          10\nthermo_modify   lost ignore norm no\n\ndump        dmp all custom 5000 ../DEM/post/dump*.liggghts_restart id type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \n\nrun         1\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_ErgunTestMPI_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\nseparateDEM=\"false\"\nreconstuctCase=\"true\"    # true | false\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $separateDEM $reconstuctCase\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/ErgunTestMPI_restart/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI_restart testcase\n# init ErgunTestMPI_restart\n# Daniel Queteschiner - June 2014, DCS Computing GmbH\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run periodicChannel\n# Christoph Goniva - Sept. 2010\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM in new terminal\n    $casePath/parDEMrun.sh\nfi\n\n#- run parallel CFD-DEM in new terminal\n. $casePath/parCFDDEMrun.sh\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0.;\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 1.3;\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    inlet\n    {\n        type            cyclic;\n    }\n\n    outlet\n    {\n        type            cyclic;\n    }\n    wall\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;\n\nturbulence      off;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType \"A\"; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel divided;//centre;//\n\nlocateModel engine;//engineIB;//\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;//dilute;//\n\nclockModel off;//standardClock;//\n\nsmoothingModel off;// localPSizeDiffSmoothing;// constDiffSmoothing; //\n\nforceModels\n(\n    KochHillDrag\n    gradPForce\n    viscForce\n    Archimedes\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nimplicitCoupleProps\n{\n}\n\ngradPForceProps\n{\n    interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\n\nArchimedesProps\n{\n}\n\nKochHillDragProps\n{\n    rhoParticle 1500;\n    interpolation true;\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\ndividedProps\n{\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10100;\n    liggghtsPath \"../DEM/in.liggghts_resume\";\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 0 9.81 );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n    runLiggghts\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-04;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel; //OFversion24x\nsimulationType  laminar; //OFversion30x\n\nRAS //OFversion30x\n{ //OFversion30x\n    RASModel    laminar; //kEpsilon; //OFversion30x\n    turbulence off; //OFversion30x\n    printCoeffs on; //OFversion30x\n} //OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/octave/checkVolFlow.m",
    "content": "%\nclose all;\nclear;\nclc;\n\n%====================================%\n% simulation data\n%====================================%\n\nskip=0;\nnrSamples = 0;\nAinlet=1.000000e-02;    % cross sectional area in m2\nUtarget=10;            % target superficial velocity in m/s\nVtarget=Utarget*Ainlet; % target flowrate in m3/s\n\nfilename = 'surfaceFieldValue.dat';\ntimedirectory = '0';\n\n    %Daten einlesen\n    path = '../../CFD/postProcessing/volFlow_inlet';\n    data = transpose(load(strcat(path,'/',timedirectory,'/',filename)));          %data\n    [x,y]=size(data);\n    time=data(1,1+skip:y)\n    volFlow_inlet=data(2,1+skip:y)\n\n    %Daten einlesen\n    path = '../../CFD/postProcessing/volFlow_outlet';\n    data = transpose(load(strcat(path,'/',timedirectory,'/',filename)));          %data\n    [x,y]=size(data)\n    time=data(1,1+skip:y);\n    volFlow_outlet=data(2,1+skip:y);\n\n    %Daten einlesen\n    path = '../../CFD/postProcessing/volFlow_wall';\n    data = transpose(load(strcat(path,'/',timedirectory,'/',filename)));          %data\n    [x,y]=size(data)\n    time=data(1,1+skip:y);\n    volFlow_wall=data(2,1+skip:y);\n\n%- time integrate data to vol entered per TS\ndeltatT=time(2)-time(1)\nvolPerTs_inlet=volFlow_inlet(1,:).*deltatT;\nvolPerTs_outlet=volFlow_outlet(1,:).*deltatT;\nvolPerTs_wall=volFlow_wall(1,:).*deltatT;\n\n%- accumulated vol entered\nvol_inlet(1)=volPerTs_inlet(1);\nvol_outlet(1)=volPerTs_outlet(1);\nvol_wall(1)=volPerTs_wall(1);\nfor i=2:y-skip\n    vol_inlet(i) = vol_inlet(i-1) + volPerTs_inlet(i);\n    vol_outlet(i) = vol_outlet(i-1) + volPerTs_outlet(i);\n    vol_wall(i) = vol_wall(i-1) + volPerTs_wall(i);\nend\n\n%===================================\n% plot 1\nxAxisLabel = 'time [s]';\nyAxisLabel = 'time integrated flux in [m3]';\n\n% Create figure\nfigure1 = figure('PaperPositionMode','manual','PaperUnits','centimeters',...\n%    'PaperPosition',[0 0 15.5 10],'PaperSize',[15.5 10],...\n    'Color',[1 1 1]);\n\n% Create axes\naxes1 = axes('Parent',figure1,'YGrid','on','XGrid','on','LineWidth',1,...\n    'FontWeight','normal','FontSize',11,'FontName','Helvetica-Narrow');\nbox(axes1,'on');\nhold(axes1,'all');\n\n% Create plot\nplot(time,vol_inlet,'r','Parent',axes1,'Marker','none','LineWidth',1,...\n     time,-vol_outlet,'g','Parent',axes1,'Marker','none','LineWidth',1,...\n     time,-vol_wall,'b','Parent',axes1,'Marker','none','LineWidth',1);\n\n% Create xlabel\nxlabel(xAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Create ylabel\nylabel(yAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Define axis\n%axis([dMin,dMax]);\n\ntitle('time integrated flux acoss patches');\nlegend('inlet','-1*outlet','wall');\nprint -color \"volEntered.png\"\n\n%===================================\n% plot 2\nxAxisLabel = 'time [s]';\nyAxisLabel = 'vol entered in TS [m3]';\n\n% Create figure\nfigure2 = figure('PaperPositionMode','manual','PaperUnits','centimeters',...\n%    'PaperPosition',[0 0 15.5 10],'PaperSize',[15.5 10],...\n    'Color',[1 1 1]);\n\n% Create axes\naxes2 = axes('Parent',figure2,'YGrid','on','XGrid','on','LineWidth',1,...\n    'FontWeight','normal','FontSize',11,'FontName','Helvetica-Narrow');\nbox(axes2,'on');\nhold(axes2,'all');\n\n% Create plot\nplot(time,volPerTs_inlet,'r','Parent',axes2,'Marker','none','LineWidth',1,...\n     time,-volPerTs_outlet,'g','Parent',axes2,'Marker','none','LineWidth',1,...\n     time,-volPerTs_wall,'b','Parent',axes2,'Marker','none','LineWidth',1);\n\n% Create xlabel\nxlabel(xAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Create ylabel\nylabel(yAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Define axis\n%axis([dMin,dMax]);\n\ntitle('vol flux * time = vol entered per TS');\nlegend('inlet','outlet','wall');\nprint -color \"volEnteredPerTS.png\"\n\n%===================================\n% plot 3\nxAxisLabel = 'time [s]';\nyAxisLabel = 'vol flux in [m3/s]';\n\n% Create figure\nfigure3 = figure('PaperPositionMode','manual','PaperUnits','centimeters',...\n%    'PaperPosition',[0 0 15.5 10],'PaperSize',[15.5 10],...\n    'Color',[1 1 1]);\n\n% Create axes\naxes3 = axes('Parent',figure3,'YGrid','on','XGrid','on','LineWidth',1,...\n    'FontWeight','normal','FontSize',11,'FontName','Helvetica-Narrow');\nbox(axes3,'on');\nhold(axes3,'all');\n\n% Create plot\nplot(time,volFlow_inlet(1,:),'r','Parent',axes3,'Marker','none','LineWidth',1,...\n     time,-volFlow_outlet(1,:),'g','Parent',axes3,'Marker','none','LineWidth',1,...\n     time,-volFlow_wall(1,:),'b','Parent',axes3,'Marker','none','LineWidth',1,...\n     [min(time),max(time)],[-Vtarget,-Vtarget],'c','Parent',axes3,'Marker','none','LineWidth',1);\n\n% Create xlabel\nxlabel(xAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Create ylabel\nylabel(yAxisLabel,'FontWeight','bold','FontSize',11,'FontName','Helvetica-Narrow');\n% Define axis\n%axis([dMin,dMax]);\n\ntitle('vol flux');\nlegend('inlet','outlet','wall','Vtarget');\nprint -color \"volflow.png\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1;//0.008;\n\nvertices\n(\n    (0. 0. 0.)\n    (0.4 0. 0.)\n    (0.4 0.1 0.)\n    (0. 0.1 0.)\n    (0. 0. 0.1)\n    (0.4 0. 0.1)\n    (0.4 0.1 0.1)\n    (0. 0.1 0.1)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (32 8 8) simpleGrading (1 1 1)\n);\n\nedges\n(\n);\n\nboundary\n(\n    wall\n    {\n        type wall;\n        faces\n        (\n        (0 3 2 1)//bottom\n        (4 5 6 7)//top\n        (1 5 4 0)//front\n        (3 7 6 2)//back\n        );\n    }\n\n    outlet\n    {\n        type cyclic;//cyclicAMI;\n        neighbourPatch inlet;\n        transform translational;\n        separationVector (-0.4 0 0);\n        faces\n        (\n        (2 6 5 1)//outlet\n        );\n    }\n\n    inlet\n    {\n        type cyclic;//cyclicAMI;\n        neighbourPatch outlet;\n        transform translational;\n        separationVector (0.4 0 0);\n        faces\n        (\n        (0 4 7 3)//inlet\n        );\n    }\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPiso;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.01;\n\ndeltaT          1e-3;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   1e-3;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nlibs ( \"libfvOptionsCFDEM.so\" );\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.00003 0.050001 0.050001)\n            (0.39999 0.050001 0.050001)\n        );\n\n        // Fields to be probed\n        fields ( p U voidfraction );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n    volFlow_inlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            inlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_outlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            outlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_wall\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            wall;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     pisoFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         2.0;\n\ndeltaT          1e-5;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.2;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\n//libs ( \"libgroovyBC.so\" );\n\nfunctions\n(\n\n/*    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0 0 0)\n        );\n\n        // Fields to be probed\n        fields ( avUslipX avUslipY avUslipZ );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n/*/\n\n    volAvU\n    {\n        type            cellSource;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        enabled         true;\n        outputControl   outputTime;//timeStep;//\n        log             false;\n        valueOutput     false;\n        source          all;\n        operation       weightedAverage;\n        weightField     \"voidfraction\";\n        fields\n        (\n            U \n        );\n    }\n\n   /*pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }*/\n);\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/decomposeParDict",
    "content": "/*-------------------------------*- C++ -*---------------------------------*\\\n|    =========                                                              |\n|    \\\\      /     OpenFOAM                                                 |\n|     \\\\    /                                                               |\n|      \\\\  /       The Open Source CFD Toolbox                              |\n|       \\\\/                                        http://www.OpenFOAM.org  |\n\\*-------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    note        \"mesh decomposition control dictionary\";\n    location    \"system\";\n    object      decomposeParDict;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains  4;\n\n//- Keep owner and neighbour on same processor for faces in zones:\n// preserveFaceZones (heater solid1 solid3);\n\n//method          scotch;\n// method          hierarchical;\n method          simple;\n// method          metis;\n// method          manual;\n\nsimpleCoeffs\n{\n    n           (1 1 4);\n    delta       0.001;\n}\n\nhierarchicalCoeffs\n{\n    n           (2 2 1);\n    delta       0.001;\n    order       xyz;\n}\n\nmetisCoeffs\n{\n /*\n    processorWeights\n    (\n        1\n        1\n        1\n        1\n    );\n  */\n}\n\nscotchCoeffs\n{\n    //processorWeights\n    //(\n    //    1\n    //    1\n    //    1\n    //    1\n    //);\n    //writeGraph  true;\n    //strategy \"b\";\n}\n\nmanualCoeffs\n{\n    dataFile    \"decompositionData\";\n}\n\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/fvOptions",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  3.0.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      fvOptions;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nmomentumSource\n{\n    type            meanSupVelocityForce;\n    active          yes;\n\n    meanSupVelocityForceCoeffs\n    {\n        selectionMode   all; // apply force to all cells\n\n        fields      (U); // name of velocity field\n        Ubar            (10 0 0);// desired mean velocity\n        relaxation      0.9; // optional relaxation factor\n        twoPhase        false;\n        coupled         true;\n        voidfractionField \"voidfraction\";\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         backward;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        $p;\n        relTol          0;\n    }\n\n    \"(U|k|epsilon|R|nuTilda)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0.1;\n    }\n\n    \"(U|k|epsilon|R|nuTilda)Final\"\n    {\n        $U;\n        relTol          0;\n    }\n}\n\nrelaxationFactors\n{\n    fields\n    {\n\t    p\t1.0;\n    }\n    equations\n    {\n        \"U.*\"           1.;\n        \"k.*\"           1.;\n        \"epsilon.*\"     1.;\n    }\n}\n\nPISO\n{\n    nCorrectors     3;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\ncommunicate     single vel yes\n\nboundary        p f f\nnewton          off\n\nunits           si\n\nregion\t\t    reg block 0 0.4 0 0.1 0 0.1 units box\ncreate_box\t    1 reg\n\nneighbor        0.001 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history # Hertzian without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 0.0 1.0\n\n# walls\n#fix xwalls1 all wall/gran model hertz tangential history primitive type 1  xplane 0.0\n#fix xwalls2 all wall/gran model hertz tangential history primitive type 1  xplane 0.4\nfix ywalls1 all wall/gran model hertz tangential history primitive type 1  yplane 0.0\nfix ywalls2 all wall/gran model hertz tangential history primitive type 1  yplane 0.1\nfix zwalls1 all wall/gran model hertz tangential history primitive type 1  zplane 0.0\nfix zwalls2 all wall/gran model hertz tangential history primitive type 1  zplane 0.1\n\n# particle distributions and insertion\nfix     pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2000 radius constant 0.0005\nfix     pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix     ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. 1. insert_every once overlapcheck yes all_in yes particles_in_region 1000 region reg\n\n# apply nve integration to all particles that are inserted as single particles\nfix     integr all nve/sphere\n\n# screen output\ncompute         1 all erotate/sphere\nthermo_style    custom step atoms ke c_1 vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun     1\ndump    dmp all custom 5000 post/dump.liggghts_init id type type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius \n\nrun     10000 upto\nwrite_restart post/restart/liggghts.restart\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/DEM/in.liggghts_resume",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style\t    granular\natom_modify\t    map array\ncommunicate\t    single vel yes\n\nboundary\t    p f f\nnewton\t\t    off\n\nunits\t\t    si\nprocessors\t    2 2 1\n\n#read the restart file\nread_restart \t../DEM/post/restart/liggghts.restart\n\nneighbor\t0.0005 bin\nneigh_modify\tdelay 0\n\n#Material properties required for new pair styles\n\nfix \t\tm1 all property/global youngsModulus peratomtype 5.e6\nfix \t\tm2 all property/global poissonsRatio peratomtype 0.45\nfix \t\tm3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix \t\tm4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n#pair style\npair_style gran model hertz tangential history #Hertzian without cohesion\npair_coeff\t* *\n\n#timestep, gravity\ntimestep\t0.00001\nfix\t\tgravi all gravity 9.81 vector 0.0 0.0 1.0\n\n#walls\n#fix xwalls1 all wall/gran model hertz tangential history primitive type 1  xplane 0.0\n#fix xwalls2 all wall/gran model hertz tangential history primitive type 1  xplane 0.4\nfix ywalls1 all wall/gran model hertz tangential history primitive type 1  yplane 0.0\nfix ywalls2 all wall/gran model hertz tangential history primitive type 1  yplane 0.1\nfix zwalls1 all wall/gran model hertz tangential history primitive type 1  zplane 0.0\nfix zwalls2 all wall/gran model hertz tangential history primitive type 1  zplane 0.1\n\n#cfd coupling\nfix\t\tcfd all couple/cfd couple_every 100 mpi\nfix\t\tcfd2 all couple/cfd/force/implicit\n\n#apply nve integration to all particles that are inserted as single particles\nfix\t\tintegr all nve/sphere\n\n#center of mass\ncompute         centerOfMass all com\n\n# sum of explicit and implicit drag force given from CFD to DEM\nvariable    dragtotalX equal f_cfd2[1]\nvariable    dragtotalY equal f_cfd2[2]\nvariable    dragtotalZ equal f_cfd2[3]\n\n#screen output\ncompute\t\t1 all erotate/sphere\nthermo_style\tcustom step atoms ke c_1 vol c_centerOfMass[3] v_dragtotalX v_dragtotalY v_dragtotalZ\nthermo\t\t10\nthermo_modify\tlost ignore norm no\n\n#insert the first particles so that dump is not empty\ndump \t\tmyDump all stl 1 post/dump_*.stl\n#run\t\t1\ndump\t\tdmp all custom 5000 ../DEM/post/dump*.liggghts_restart id type type x y z vx vy vz fx fy fz f_dragforce[1] f_dragforce[2] f_dragforce[3] radius \nundump\t\tmyDump\n\nrun\t\t    0\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_periodicChannel_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"4\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\ncleanCase=\"true\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n\nif [ $runOctave == \"true\" ]\n    then\n        #------------------------------#\n        #  octave\n\n        #- change path\n        cd octave\n\n        #- rmove old graph\n        rm *.png\n\n        #- run octave\n        octave --no-gui checkVolFlow.m\n\n        #- show plot \n        eog volflow.png\n\n        #- copy log file to test harness\n        cp ../../$logfileName $testHarnessPath\n        cp *.png $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py dump*.liggghts_restart\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\n\nfi\n\n#- clean up case\nif [ $cleanCase == \"true\" ]\n  then\n    #- clean up case\n    keepDEMrestart=\"false\"\n    cleanCFDEMcase $casePath/CFD $keepDEMrestart\nfi\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/periodicChannel/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Christoph Goniva - July 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\necho \"starting DEM run in parallel...\"\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=4\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine\n# run settlingTest\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\n# keep old couplingProperties\ncp $casePath/CFD/constant/couplingProperties $casePath/CFD/constant/couplingProperties_backup\ncp $casePath/CFD/system/controlDict $casePath/CFD/system/controlDict_backup\n\n# change to M2M\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_1 -case $casePath/CFD\n\n# change to MPI\n# changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_2 -case $casePath/CFD\n\n# change to subTS\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_3 -case $casePath/CFD\n\n# change to MPI and implForceDEM\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_4 -case $casePath/CFD\n\n# change to MPI and implForceDEM + CN=0.9\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_5 -case $casePath/CFD\n\n# change to MPI and integrateImplicitly + CN=0.9\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_6 -case $casePath/CFD\n\n# change to MPI and use DiFelice voidfraction correction\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_7 -case $casePath/CFD\n\n# change to MPI and use DiFelice with scaleDragByFieldFunction\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_8 -case $casePath/CFD\n\n# change to MPI and use DiFelice with scaleDragByReFunction\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_9 -case $casePath/CFD\n\n# change to MPI and use DiFelice with scaleDragByReFunction & scaleDragByFieldFunction\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_10 -case $casePath/CFD\n\n# change to MPI and use Tang voidfraction correction\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_11 -case $casePath/CFD\n\n# change to particle specific cg test\n# changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_pcg -case $casePath/CFD\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso settlingTest CFD'  -e \"bash $casePath/parCFDDEMrun.sh\"\n. $casePath/parCFDDEMrun.sh\n\n# restore old couplingProperties\nmv $casePath/CFD/constant/couplingProperties_backup $casePath/CFD/constant/couplingProperties\nmv $casePath/CFD/system/controlDict_backup $casePath/CFD/system/controlDict\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet\n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform (0 0 0);\n    }\n    walls\n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n        value           uniform (0 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    walls       \n    {\n        type            fixedValue;\n        value           uniform 0;\n    }\n\n    inlet          \n    {\n        type            inletOutlet;\n        inletValue      uniform 0;\n        value           uniform 0;\n    }\n    outlet          \n    {\n        type            outletInlet;\n        outletValue      uniform 0;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/nuSgs",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      nuSgs;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    \".*\"       \n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    walls\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            totalPressure;\n        p0              uniform 0;\n        U               U;\n        phi             phi;\n        rho             rho;\n        psi             none;\n        gamma           1;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 10;\n\nboundaryField\n{\n    \".*\"   \n    {\n        type            zeroGradient;\n        value           $internalField;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/sSmoothField",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      sSmoothField;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/vSmoothField",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      vSmoothField;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    \".*\"\n    {\n        type            zeroGradient;\n        value           uniform 1;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/LESProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      LESProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nLESModel        oneEqEddy;\n\ndelta           cubeRootVol;\n\nprintCoeffs     on;\n\ncubeRootVolCoeffs\n{\n    deltaCoeff      1;\n}\n\nPrandtlCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    smoothCoeffs\n    {\n        delta           cubeRootVol;\n        cubeRootVolCoeffs\n        {\n            deltaCoeff      1;\n        }\n\n        maxDeltaRatio   1.1;\n    }\n\n    Cdelta          0.158;\n}\n\nvanDriestCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    smoothCoeffs\n    {\n        delta           cubeRootVol;\n        cubeRootVolCoeffs\n        {\n            deltaCoeff      1;\n        }\n\n        maxDeltaRatio   1.1;\n    }\n\n    Aplus           26;\n    Cdelta          0.158;\n}\n\nsmoothCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    maxDeltaRatio   1.1;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;//kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\nmodelType B; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel divided;//centre;//bigParticle;//\n\nlocateModel engine;//turboEngineM2M;//\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO; //trackIO; // \n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;//M2M;//\n\naveragingModel dense;//dilute;//\n\nclockModel off; //standardClock;//\n\nsmoothingModel  off; //constDiffSmoothing; //off;//\n\n//useDDTvoidfraction;\n\nforceModels\n(\n    DiFeliceDrag\n    //SchillerNaumannDrag\n    //KochHillDrag\n    //MeiLift\n    //virtualMassForce\n    //gradPForce\n    //viscForce\n    Archimedes\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType RASProperties;//LESProperties;//OFversion24x\nturbulenceModelType turbulenceProperties;//LESProperties;//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nconstDiffSmoothingProps\n{\n    lowerLimit 0.0;\n    upperLimit 1e99;\n    smoothingLength 3e-4;\n} \n\nimplicitCoupleProps\n{\n}\n\nDiFeliceDragProps\n{\n    verbose true;\n    \n    //- use of scalar viscosity for drag\n    //scalarViscosity true;\n    //nu nu [ 0 2 -1 0 0 0 0 ] 1e-04;\n\n    implForceDEM false; // corresponds to couple/cfd/force force explicit\n}\n\nSchillerNaumannDragProps\n{\n    densityFieldName \"rho\";\n}\n\nKochHillDragProps\n{\n    densityFieldName \"rho\";\n}\n\nMeiLiftProps\n{\n    densityFieldName \"rho\";\n}\n\nArchimedesProps\n{\n    densityFieldName \"rho\";\n}\n\nvirtualMassForceProps\n{\n    densityFieldName \"rho\";\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\n\"(twoWayMPIProps|M2MProps)\"\n{\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10000;\n    DEMts 0.00001;\n}\n\ncentreProps\n{\n    alphaMin 0.30;\n}\n\ndividedProps\n{\n    alphaMin 0.3;\n}\n\nbigParticleProps\n{\n    maxCellsPerParticle 1000;\n    alphaMin 0.30;\n}\n\n\"(engineProps|turboEngineM2MProps)\"\n{\n    treeSearch true;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 -9.81 0);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n    runLiggghts\n    writeLiggghts\n);\n\n// ************************************************************************* //\n\nwriteLiggghtsProps\n{\n    writeLastOnly off;\n    path \"../DEM/post/restart\";\n    //writeName \"name\";\n    overwrite on;\n    verbose;\n}\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/particleTrackProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  2.1.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      particleTrackProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ncloudName       particleCloud;\n\nsampleFrequency 1;\n\nmaxPositions      10;\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//LESModel; //OFversion24x\nsimulationType      laminar;//OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/octave/settlingVelocity.m",
    "content": "%\nclose all;\nclear;\nclc;\n\n%====================================%\n% simulation data\n%====================================%\npath = '../../DEM/post/velocity.txt';\ndata = load(path);\nU_sim = data(:,2:4);\nt_sim = data(:,1);\nfprintf('final velocity of sim = %f/%f/%f m/s\\n',U_sim(length(U_sim(:,1)),1),U_sim(length(U_sim(:,1)),2),U_sim(length(U_sim(:,1)),3) )\n\n\n%====================================%\nU_=0\nX_=0\ndt=0.001\ntEnd=0.2\nnuc = 1e-05\nrhoc = 10\nd_ = 0.0001\nrhop = 3000\ng=9.81\nUc=0\n%====================================%\n% analytical calculation\n%====================================%\ncount=1;\nfor t=0:dt:tEnd\n    count=count+1;\n    t_(count)=t;\n    magUr = (U_(count-1)-Uc);\n    ReFunc = 1.0;\n    Re = magUr*d_/nuc;\n    if Re > 0.01\n        ReFunc += 0.15*Re^0.687;\n    end\n\n    Dc = (24.0*nuc/d_)*ReFunc*(3.0/4.0)*(rhoc/(d_*rhop));\n    U_(count) = (U_(count-1) + dt*(Dc*Uc + (1.0 - rhoc/rhop)*g))/(1.0 + dt*Dc);\n    X_(count) = X_(count-1) + dt*U_(count);\n    Re_(count) = Re; \n\nend\nfprintf('final velociy = %f m/s\\n',U_(length(U_)))\nfprintf('final position = %f m\\n',X_(length(X_)))\n\n%====================================%\n% plot data\n%====================================%\nfigure(1)\nplot(t_,U_, 'k--')\nhold on\nplot(t_sim,-U_sim(:,2),'rd-')\nlegend(\"analytical - Stokes\",\"simulation - DiFelice?\") \n\n%print('cfdemSolverPiso_settlingTestMPI.eps','-deps2')\nprint -color \"cfdemSolverPiso_settlingTestMPI.png\"\n\n%figure(2)\n%plot(t_,X_)\n\n%figure(3)\n%plot(t_,Re_)\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 0.1;\n\nvertices\n(\n    (0.45 0 0.45)\n    (0.55 0 0.45)\n    (0.55 0.5 0.45)\n    (0.45 0.5 0.45)\n    (0.45 0 0.55)\n    (0.55 0 0.55)\n    (0.55 0.5 0.55)\n    (0.45 0.5 0.55)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (4 20 4) simpleGrading (1 1 1)  // regular grid\n    //hex (0 1 2 3 4 5 6 7) (25 125 25) simpleGrading (1 1 1)    // irrregular fine grid\n    //hex (0 1 2 3 4 5 6 7) (25 25 25) simpleGrading (1 1 1)    // irrregular coarse grid\n    //hex (0 1 2 3 4 5 6 7) (10 25 10) simpleGrading (1 1 1)    // irrregular grid (ratio 2)\n);\n\nedges\n(\n);\n\npatches\n(\n    patch inlet\n    (\n        (3 7 6 2)\n    )\n    patch outlet\n    (\n        (1 5 4 0)\n    )\n    wall walls\n    (\n        (0 4 7 3)\n        (2 6 5 1)\n        (0 3 2 1)\n        (4 5 6 7)\n    )\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  3.0.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPiso;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.15;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.05;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     interDyMFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.15;\n\ndeltaT          0.001; //0.0005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;//0.05;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/decomposeParDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      decomposeParDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains 2;\n\nmethod          simple;\n\nsimpleCoeffs\n{\n    n               ( 1 2 1 );\n    delta           0.001;\n}\n\nhierarchicalCoeffs\n{\n    n               ( 2 2 1 );\n    delta           0.001;\n    order           xyz;\n}\n\nmetisCoeffs\n{\n}\n\nmanualCoeffs\n{\n    dataFile        \"\";\n}\n\ndistributed     no;\n\nroots           ( );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((nuEff*dev(T(grad(U))))) Gauss linear;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    \"(U|k|epsilon|R|nuTilda)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(voidfraction|Ksl|UsNext|voidfractionNext|sSmoothField|vSmoothField|fSmooth)\"\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-09;\n        relTol          1e-06;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array sort 0 0\ncommunicate     single vel yes\n\nboundary        f f f\nnewton          off\n\nunits           si\n\nregion          reg block 0 0.1 0 0.1 0 0.1 units box\ncreate_box      1 reg\n\nneighbor        0.003 bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for granular pair styles\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n#fix         m5 all property/global characteristicVelocity scalar 2.0\n\n# pair style\npair_style  gran model hertz tangential history # hertz without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0.0 -1.0 0.0\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 0.01\n\n# create single partciles\ncreate_atoms    1 single 0.05 0.025  0.05 units box\nset             group all diameter 0.0001 density 3000\n\n# cfd coupling\nfix     cfd all couple/cfd couple_every 100 mpi\nfix     cfd2 all couple/cfd/force\n\nvariable    vx equal vx[1]\nvariable    vy equal vy[1]\nvariable    vz equal vz[1]\nvariable    time equal step*dt\nfix         extra all print 100 \"${time} ${vx} ${vy} ${vz}\" file ../DEM/post/velocity.txt title \"#\" screen no\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun     0\ndump    dmp all custom 5000 ../DEM/post/dump.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius\n\nrun     0 upto\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/settlingTestMPI/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_settlingTestMPI_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\ncleanUp=\"true\"\npostproc=\"false\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode \"false\" \"true\"\n\nif [ $runOctave == \"true\" ]\n    then\n        #- change path\n        cd octave\n\n        #- rmove old graph\n        rm cfdemSolverPiso_settlingTestMPI.png\n\n        #- run octave\n        octave --no-gui settlingVelocity.m\n\n        #- show plot \n        eog cfdemSolverPiso_settlingTestMPI.png\n\n        #- copy log file to test harness\n        cp ../../$logfileName $testHarnessPath\n        cp cfdemSolverPiso_settlingTestMPI.png $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nif [ $cleanUp == \"true\" ]\n  then\n    keepDEMrestart=\"false\"\n    cleanCFDEMcase $casePath/CFD $keepDEMrestart\nfi\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run voidfractionTest\n# Christoph Goniva - Jan. 2016\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPiso voidfractionTest CFD'  -e \"bash $casePath/parCFDDEMrun.sh\"\n. $casePath/parCFDDEMrun.sh\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    \"(inlet|outlet|walls)\"     \n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    inlet\n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform (0 0 0);\n    }\n    walls\n    {\n        type            fixedValue;\n        value           uniform (0 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    \"(inlet|outlet|walls)\"\n    {\n        type            zeroGradient;\n        value           uniform (0 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    walls\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            totalPressure;\n        p0              uniform 0;\n        U               U;\n        phi             phi;\n        rho             rho;\n        psi             none;\n        gamma           1;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 10;\n\nboundaryField\n{\n    \"(inlet|outlet|walls)\"   \n    {\n        type            zeroGradient;\n        value           uniform 10;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    \"(inlet|outlet|walls)\"\n    {\n        type            zeroGradient;\n        value           uniform 1;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;//kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nsolveFlow off;\n\nuseDDTvoidfraction b;\n\nmodelType B; // A or B\n\ncouplingInterval 100;\n\nvoidFractionModel trilinear;\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;\n\nclockModel off;\n\nsmoothingModel off;\n\n//useDDTvoidfraction;\n\nforceModels\n(\n    DiFeliceDrag\n    Archimedes\n    noDrag\n    particleCellVolume\n    volWeightedAverage\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType \"RASProperties\";//\"LESProperties\";//OFversion24x\nturbulenceModelType turbulenceProperties;//\"LESProperties\";//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nnoDragProps\n{\n}\n\nparticleCellVolumeProps\n{\n    upperThreshold 1e20;\n    lowerThreshold 0.;\n    verbose true;\n    writeToFile true;\n}\n\nvolWeightedAverageProps\n{\n    useVolumeFraction true;\n    scalarFieldNames\n    (\n        ddtVoidfraction\n    );\n    vectorFieldNames\n    (\n    );\n    upperThreshold 1e20;\n    lowerThreshold 0;\n    writeToFile true;\n    verbose true;\n}\n\nparticleProbeProps\n{\n    particleIDsToSample (0 0);\n    verboseToFile;      //main switch\n    printEvery 1;       //print every this many CFD time steps\n    sampleAll;          //Activate sampling for all particles\n    probeDebug;         //probes additional fields\n    includePosition;    //will include particle position in the output file\n    writePrecision 4;   //number of significant digits to print\n}\n\nconstDiffSmoothingProps\n{\n    lowerLimit 0.0;\n    upperLimit 1e99;\n    smoothingLength 1e-3;\n} \n\nimplicitCoupleProps\n{\n}\n\nDiFeliceDragProps\n{\n    verbose false;\n    \n    //- use of scalar viscosity for drag\n    //scalarViscosity true;\n    //nu nu [ 0 2 -1 0 0 0 0 ] 1e-04;\n}\n\nSchillerNaumannDragProps\n{\n    densityFieldName \"rho\";\n}\n\nKochHillDragProps\n{\n    densityFieldName \"rho\";\n}\n\nMeiLiftProps\n{\n    densityFieldName \"rho\";\n}\n\nArchimedesProps\n{\n    densityFieldName \"rho\";\n}\n\nvirtualMassForceProps\n{\n    densityFieldName \"rho\";\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayMPIProps\n{\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\ntwoWayFilesProps\n{\n    maxNumberOfParticles 10000;\n    DEMts 0.00001;\n}\n\ncentreProps\n{\n    alphaMin 0.30;\n}\n\ndividedProps\n{\n    alphaMin 0.3;\n}\n\ntrilinearProps\n{\n    alphaMin 0.3; // not yet used in code!\n}\n\nbigParticleProps\n{\n    maxCellsPerParticle 1000;\n    alphaMin 0.30;\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 -9.81 0);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n    runLiggghts\n    //writeLiggghts\n);\n\n// ************************************************************************* //\n\nwriteLiggghtsProps\n{\n    writeLastOnly off;\n    //writeName \"name\";\n    overwrite on;\n    verbose;\n}\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1e-05;\n\nCrossPowerLawCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    m               m [ 0 0 1 0 0 0 0 ] 1;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\nBirdCarreauCoeffs\n{\n    nu0             nu0 [ 0 2 -1 0 0 0 0 ] 1e-06;\n    nuInf           nuInf [ 0 2 -1 0 0 0 0 ] 1e-06;\n    k               k [ 0 0 1 0 0 0 0 ] 0;\n    n               n [ 0 0 0 0 0 0 0 ] 1;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel; //OFversion24x\nsimulationType  laminar; //OFversion30x\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/octave/particleCellVolume.m",
    "content": "%test\nclose all;\nclear;\nclc;\n\n%====================================%\n% simulation data\n%====================================%\npath = '../postProcessing/particleCellVolume/0/particleCellVolume.txt';\ndata = load(path);\nVp_sim = data(:,2);\nt_sim = data(:,1);\n\npath = '../postProcessing/volWeightedAverage/0/volWeightedAverage.txt';\ndata = load(path);\nvolAvDdtVoidFraction_sim = data(:,2);\nt_sim = data(:,1);\n\n%====================================%\ndp=2*0.0015;\nvp=0.3\ndeltaT=0.001 % coupling time\n%====================================%\n% analytical calculation\n%====================================%\nVp=dp*dp*dp*pi/6;\nnp=1000;\nVptot=np*Vp\n\nkernelSize=8\nVc=(0.1/10)^3*kernelSize\nVp=dp^3*pi/6\ndeltaVpdt=Vp*(deltaT*vp)/dp\navg_ddt_voidfraction=deltaVpdt/(Vc*deltaT)\n\n%====================================%\n% plot data\n%====================================%\nfigure(1)\nplot(t_sim,(Vp_sim./Vptot)*100,'r-')\nhold on;\n%legend(\"error\")\ntitle(\"particle volume represented in cells\");\ngrid on;\nxlabel(\"time in s\");\nylabel(\"particle cell volume / particle volume in %\");\nprint('-dpng','-r450', 'particleCellVolume')\n\nfigure(2)\nplot(t_sim,volAvDdtVoidFraction_sim,'r-',[min(t_sim),max(t_sim)],[avg_ddt_voidfraction,avg_ddt_voidfraction],'b-')\ngrid on;\n%axis([0,max(t_sim),0,100])\nhold on;\nlegend(\"simulation\",'analytic')\ntitle(\"average ddt(voidfraction)\");\ngrid on;\nxlabel(\"time in s\");\nylabel(\"average ddt(voidfraction)\");\nprint('-dpng','-r450', 'averageDDTvoidfraction')\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1;\n\nvertices\n(\n    (0.0 0 0.0)\n    (0.1 0 0.0)\n    (0.1 0.1 0.0)\n    (0.0 0.1 0.0)\n    (0.0 0 1.0)\n    (0.1 0 1.0)\n    (0.1 0.1 1.0)\n    (0.0 0.1 1.0)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (10 10 100) simpleGrading (1 1 1)\n);\n\nedges\n(\n);\n\npatches\n(\n    patch inlet\n    (\n        (3 7 6 2)\n    )\n    patch outlet\n    (\n        (1 5 4 0)\n    )\n    wall walls\n    (\n        (0 4 7 3)\n        (2 6 5 1)\n        (0 3 2 1)\n        (4 5 6 7)\n    )\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPiso;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.2;\n\ndeltaT          0.001;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.05;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\nfunctions\n{\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.05001 0.05001 0.5)\n        );\n\n        // Fields to be probed\n        fields ( volAverage_ddtVoidfraction voidfraction );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/controlDict.foam",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     interDyMFoam;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         0.15;\n\ndeltaT          0.001; //0.0005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.01;//0.05;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo           1;\n\nmaxDeltaT       1;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/decomposeParDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      decomposeParDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains 2;\n\nmethod          simple;\n\nsimpleCoeffs\n{\n    n               ( 1 1 2 );\n    delta           0.001;\n}\n\nhierarchicalCoeffs\n{\n    n               ( 2 2 1 );\n    delta           0.001;\n    order           xyz;\n}\n\nmetisCoeffs\n{\n}\n\nmanualCoeffs\n{\n    dataFile        \"\";\n}\n\ndistributed     no;\n\nroots           ( );\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default          Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((nuEff*dev(T(grad(U))))) Gauss linear;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n}\n\ninterpolationSchemes\n{\n    default         linear;\n    //interpolate(U)  linear;\n    //interpolate((1|A(U))) linear;\n    //interpolate((U*voidfraction)) linear;\n    //interpolate((Us*voidfraction)) linear;\n    //interpolate((Ksl|rho)) linear;\n    \n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    \"(U|k|epsilon|R|nuTilda)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(voidfraction|Ksl|UsNext|voidfractionNext|sSmoothField|vSmoothField|fSmooth)\"\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-09;\n        relTol          1e-06;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array sort 0 0\ncommunicate     single vel yes\n\nboundary        f f f\nnewton          off\n\nunits           si\n\nregion          reg block 0 0.1 0 0.1 0. 1.0 units box\ncreate_box      1 reg\n\nneighbor        0.003 bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for granular pair styles\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n#fix         m5 all property/global characteristicVelocity scalar 2.0\n\n# pair style\npair_style  gran model hertz tangential history # hertz without cohesion\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 0.0 vector 0.0 0.0 -1.0\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 0.01\n\n# create single partciles\nregion      bc block 0 0.1 0 0.1 0.53 1.0 units box\nfix\t\t    pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 3000 radius constant 0.0015\nfix\t\t    pdd1 all particledistribution/discrete 15485867  1 pts1 1.0\n\nfix\t\tins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -0.3 insert_every once overlapcheck yes all_in yes particles_in_region 1000 region bc\n\n#create_atoms    1 single 0.00733 0.0517 0.6 units box\n#set             group all diameter 0.003 density 3000\n\n# cfd coupling\nfix     cfd all couple/cfd couple_every 100 mpi\nfix     cfd2 all couple/cfd/force/implicit\n\nvariable    vx equal vx[1]\nvariable    vy equal vy[1]\nvariable    vz equal vz[1]\nvariable    time equal step*dt\nfix         extra all print 100 \"${time} ${vx} ${vy} ${vz}\" file ../DEM/post/velocity.txt title \"#\" screen no\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# screen output\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n# insert the first particles so that dump is not empty\nrun     0\ndump    dmp all custom 5000 ../DEM/post/dump.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius\n\nrun     0 upto\n"
  },
  {
    "path": "tutorials/cfdemSolverPiso/voidfractionTest/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPiso_voidfractionTest_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPiso\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\nseparateDEM=\"false\"\nreconstuctCase=\"false\"\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\ncleanUp=\"true\"\npostproc=\"false\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $separateDEM $reconstuctCase\n\nif [ $runOctave == \"true\" ]\n    then\n        #- change path\n        cd octave\n\n        #- rmove old graph\n        rm averageDDTvoidfraction.png\n\n        #- run octave\n        octave --no-gui particleCellVolume.m\n\n        #- show plot \n        eog averageDDTvoidfraction.png\n\n        #- copy log file to test harness\n        cp ../../$logfileName $testHarnessPath\n        cp averageDDTvoidfraction.png $testHarnessPath\nfi\n\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nif [ $cleanUp == \"true\" ]\n  then\n    echo \"deleting data at: $casePath ?:\\n\"\n    read\n    source $WM_PROJECT_DIR/bin/tools/CleanFunctions\n    cd $casePath/CFD\n    cleanCase\n    cd $casePath\n    rm -r $casePath/CFD/particleProbes\n    rm -r $casePath/CFD/postProcessing\n    rm -r $casePath/CFD/clockData\n    rm -r $casePath/DEM/post/*\n    rm -r $casePath/DEM/liggghts.restartCFDEM*\n    echo \"done\"\nfi\n\n#- preserve post directory\ntouch $casePath/DEM/post/.gitignore\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest\n# Christoph Goniva - August 2011\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM init\n    $casePath/parDEMrun.sh\nfi\n\n# keep old couplingProperties\ncp $casePath/CFD/constant/couplingProperties $casePath/CFD/constant/couplingProperties_backup\n\n# change to socket\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_1 -case $casePath/CFD\n\n. $casePath/parCFDDEMrun.sh\n\n# restore old couplingProperties\nmv $casePath/CFD/constant/couplingProperties_backup $casePath/CFD/constant/couplingProperties\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/C",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      C;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    inlet           \n    {\n        type            fixedValue;\n        value           $internalField;\n    }\n\n    outlet          \n    {\n        type            zeroGradient;\n    }\n\n    wall       \n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/CSource",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0.05\";\n    object      CSource;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 -1 0 0 0 0];\n\ninternalField   uniform 0;  \n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    wall\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/T",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      T;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 1 0 0 0];\n\ninternalField   uniform 263;\n\nboundaryField\n{\n    inlet           \n    {\n        type            fixedValue;\n        value           uniform 263;\n    }\n\n    outlet          \n    {\n        type            zeroGradient;\n    }\n\n    wall       \n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/TSource",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0.05\";\n    object      TSource;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 -1 1 0 0 0];\n\n// Tsource[K/s] = q[W/m3]/(rho[kg/m3]*cp[W*s/(kg*K)])\n// Q=10 W\n// V=0.01 m3\n// q=1000 W/m3\n// cp=1000\n// rho=1\n// --> Tsource = 1 \n\ninternalField   uniform 0;  \n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    wall\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0.001);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        type            fixedValue;\n        value           uniform (0 0 1);\n    }\n\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/epsilon",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      epsilon;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -3 0 0 0 0];\n\ninternalField   uniform 0.003;\n\nboundaryField\n{\n    wall\n    {\n        type            epsilonWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0.003;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.003;\n        value           uniform 0.003;\n    }\n    inlet\n    {\n        /*type            turbulentMixingLengthDissipationRateInlet;\n        mixingLength    0.005;\n        value           uniform 0.003;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0.001;\n\nboundaryField\n{\n    wall\n    {\n        type            kqRWallFunction;\n        value           uniform 0.001;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.001;\n        value           uniform 0.001;\n    }\n    inlet\n    {\n        /*type            turbulentIntensityKineticEnergyInlet;\n        intensity       0.05;\n        value           uniform 0.001;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/nut",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      nut;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            nutkWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n\n    wall\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n    outlet\n    {\n        //type            zeroGradient;\n        type            fixedValue;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 1.188;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/LESProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      LESProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nLESModel        oneEqEddy;\n\ndelta           cubeRootVol;\n\nprintCoeffs     on;\n\ncubeRootVolCoeffs\n{\n    deltaCoeff      1;\n}\n\nPrandtlCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    smoothCoeffs\n    {\n        delta           cubeRootVol;\n        cubeRootVolCoeffs\n        {\n            deltaCoeff      1;\n        }\n\n        maxDeltaRatio   1.1;\n    }\n\n    Cdelta          0.158;\n}\n\nvanDriestCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    smoothCoeffs\n    {\n        delta           cubeRootVol;\n        cubeRootVolCoeffs\n        {\n            deltaCoeff      1;\n        }\n\n        maxDeltaRatio   1.1;\n    }\n\n    Aplus           26;\n    Cdelta          0.158;\n}\n\nsmoothCoeffs\n{\n    delta           cubeRootVol;\n    cubeRootVolCoeffs\n    {\n        deltaCoeff      1;\n    }\n\n    maxDeltaRatio   1.1;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\nsolveFlow   true;\n\nmodelType B; // A or B\n\ncouplingInterval 500;\n\nvoidFractionModel divided;\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;//dilute;//\n\nclockModel off;//standardClock;//\n\nsmoothingModel off;\n\nforceModels\n(\n    KochHillDrag\n    scalarGeneralExchange\n    Archimedes\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType RASProperties;//LESProperties;//OFversion24x\nturbulenceModelType turbulenceProperties;//OFversion30x\n\n//===========================================================================//\n// sub-model properties\nparticleProbeProps\n{\n    particleIDsToSample (0 0);\n    verboseToFile;      //main switch\n    printEvery 20;      //print every this many CFD time steps\n    sampleAll;          //Activate sampling for all particles\n    probeDebug;         //probes additional fields\n    includePosition;    //will include particle position in the output file\n    writePrecision 4;   //number of significant digits to print\n}\n\nscalarGeneralExchangeProps\n{\n/*    verbose                 true;*/\n    tempFieldName           \"T\";\n    partTempName            \"Temp\";\n    partHeatFluxName        \"convectiveHeatFlux\";\n    lambda                  0.0256;\n    Prandtl                 70.097; //WARNING: this is not a typical gas - just for testing purposes!\n    useLiMason              true; \n    \n    //Lists with information for each species FOR THE PARTICLES\n    //MUST be in the same order as eulerian species in 'scalarTransportProperties'\n    //MUST correspond to property/atom in ligghts (use 'couple/cfd/speciesConvection' to auto-generate individual fields)\n    partSpeciesNames\n    (\n        speciesC\n    );\n    partSpeciesFluxNames\n    (\n        speciesCFlux\n    );\n    partSpeciesTransCoeffNames\n    (\n        none //speciesCTransCoeff\n    );\n    partSpeciesFluidNames\n    (\n        none //speciesCFluid\n    );\n    DMolecular\n    (\n        1e-5\n    );\n    //parameters for the vapor pressure model\n    parameterVap\n    (\n        0\n    );\n\n}\n\nimplicitCoupleProps\n{\n    //KslLimit 0;  // source switched off!!!\n}\n\nexplicitCoupleProps\n{\n    //fLimit (0 0 0);\n}\n\nKochHillDragProps\n{\n}\n\nDiFeliceDragProps\n{\n    //verbose true;\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10000;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\ncentreProps\n{\n}\n\ndividedProps\n{\n    alphaMin 0.4;\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 -9.81 0);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n   execute\n);\n\n// reset particle temperature every coupling step\nexecuteProps1\n{\n    command\n    (\n        set\n        region\n        total\n        noBlanks\n        property\n        slash\n        atom  // former peratom\n        blanks\n        Temp\n        number\n    );\n    scalars\n    (\n        600\n    );\n    runFirst off; \n    runLast off;\n    runEveryCouplingStep on;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/scalarTransportProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          scalarTransportProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nscalarTransportModel generalManual;\n\ngeneralManualProps\n{\n    ScT 0.7; //optional\n    PrT 0.7; //optional\n\n    //in case the user does not want to generate a separate field,\n    //the volumetric heat capacity can be set here (as a global constant)\n    cpVolumetric 1196; //this is the mixture density times the heat capacity\n                       //must have dimensions [J/K/(m_voidspace)³]\n                       //will only be used if cpVolumetricFieldName, or updateMixtureProperties = false\n\n//    cpVolumetricFieldName   \"cpRho\"; \n    rhoMixFieldName         \"rhoMix\"; \n\n    eulerianFields\n    (\n        C   //any concentration fields MUST be first to have correct numbering\n        T\n    );\n    \n    fvOptionsC {}\n    fvOptionsT {}\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-03;\n\nDT              DT [ 0 2 -1 0 0 0 0 ] 2.1399e-5;//2.1399e-5;  // lambda/(rho*Cp) = 0.0256/(1.188*1007)\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType  RAS;//OFversion30x\n\nRAS\n{\n    RASModel        kEpsilon;\n\n    turbulence      on;\n\n    printCoeffs     on;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/octave/totalPressureDropAndNusselt.m",
    "content": "close all;\nclear;\nclc;\n\n\n%*********************************************************************%\n% pressure drop\n%*********************************************************************%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.022;\t\t\t% particle diameter\nphip = 1;\t\t\t% sphericity\nepsilon = 0.4436;\t\t        % voidfraction\nU = 1;    \t\t\t% superficial velocity\nL = 1;\t\t\t    % length of bed\nrhoG = 1.188;\t\t% density in kg/m\nnuG = 1.5e-3;\t    % kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG*U^2)/(phip*dp))\n        )\n\nfprintf('final pressure drop = %f Pa\\n',dpErgun)\n%====================================%\n% simulation data\n%====================================%\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\n\ndata = load(path);\n[x,y]=size(data);\ndp_sim = data(:,2)-data(:,y);\nt_sim = data(:,1);\nfprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% plot data\n%====================================%\nfigure(1)\nplot(t_sim,dpErgun*ones(1,length(t_sim)),t_sim,dp_sim)\naxis([0,0.7,0,dpErgun(length(dpErgun))])\ntitle(\"Ergun pressure drop\")\nlegend(\"analytical - Ergun\",\"simulation\") \n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_pressureDrop.png\"\n\n%*********************************************************************%\n% heat transfer\n%*********************************************************************%\n\n%====================================%\n% simulation data\n%====================================%\n\ncp = 1007;\nA = 0.01;\nU = U;\nalpha = epsilon;\nnuF = nuG;\nrhoF = rhoG;\nTp = 600;\nNp = 1005;\nlambda = 0.0256;\n\n%path = '../probes/0/T'; % ext32\npath = '../postProcessing/probes/0/T';\n\ndata = load(path);\n[x,y]=size(data);\nTin_sim =  data(:,2);                                          % mean temp inlet temp [K]\nTout_sim = data(:,3);                                          % mean temp outlet temp [K]\nt_sim = data(:,1);\nfprintf('final inlet temperature of sim = %f K\\n',Tin_sim(length(Tin_sim)) )\nfprintf('final outlet temperature of sim = %f K\\n',Tout_sim(length(Tout_sim)) )\n\n\nuF = U/alpha;                                               % interstitial velocity [m/s]\nReP_sim = uF.*ones(length(t_sim),1)*dp/nuF;                                       % ReynoldsNr based in dp\nPr = nuF*rhoF*cp/lambda;\nqin_sim = U * A * rhoF * cp .* Tin_sim;\nqout_sim = U * A * rhoF * cp .* Tout_sim;\nq_sim = (qout_sim-qin_sim);                                 % particle fluid heat flux [W] (out-in)\nTmean_sim = 0.5*(Tin_sim+Tout_sim);                               % mean temp of fluid\ndeltaT = Tp - Tmean_sim;                                          % mean temp diff between partcles and fluid\nh=q_sim./(Np*dp^2*pi*deltaT);                                      % average particle-fluid heat transfer coeff [W/(m2*K)]\nNu_sim = h.*dp/lambda;                                             % mean particle Nusselt nr\nt_sim = data(:,1);\nfprintf('q_sim = %f \\n',q_sim(length(Nu_sim)))\nfprintf('Nu_sim = %f \\n',Nu_sim(length(Nu_sim)))\n\n%===================\n% Nusselt Equation\n%===================\nfprintf('\\ncalc Nusselt eqn:\\n')\n\n%% following Li and Mason\nn=3.5\nif (ReP_sim(length(uF)) <200)\n     Nu_LiMason=2.*ones(length(uF),1)+0.6*alpha^n.*ReP_sim.^0.5.*Pr^0.33;\nelseif (ReP_sim(length(uF)) <1500)\n     Nu_LiMason=2.*ones(length(uF),1)+0.5*alpha^n.*ReP_sim.^0.5*Pr^0.33 + 0.02*alpha^n.*ReP_sim.^0.8.*Pr^0.33;\nelse\n     Nu_LiMason=2.*ones(length(uF),1) +0.000045*alpha^n.*ReP_sim.^1.8;\nend\n\nfprintf('Nu_LiMason = %f \\n',Nu_LiMason(length(Nu_LiMason)))\n\n%====================================%\n% plot data\n%====================================%\nfigure(2)\nplot(t_sim,Nu_LiMason,t_sim,Nu_sim)\ntitle(\"Nusselt nr\")\nlegend(\"analytical - \",\"simulation\") \n\n%print('cfdemSolverPisoSTM_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_Nusselt.png\"\n\nfigure(3)\nplot(t_sim,Tin_sim,t_sim,Tout_sim)\ntitle(\"inlet/outlet temperature\")\nlegend(\"inlet\",\"outlet\") \n\n%print('cfdemSolverPisoSTM_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoSTM_temperatures.png\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1.;\n\nvertices\n(\n    (0. 0 -0.5)\n    (0.1 0 -0.5)\n    (0.1 0.1 -0.5)\n    (0. 0.1 -0.5)\n    (0. 0 1.5)\n    (0.1 0 1.5)\n    (0.1 0.1 1.5)\n    (0. 0.1 1.5)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (2 2 33) simpleGrading (1 1 1)\n);\n\nedges\n(\n);\n\npatches\n(\n    wall inlet\n    (\n        (0 3 2 1)\n    )\n    wall outlet\n    (\n        (4 5 6 7)\n    )\n    wall wall\n    (\n        (3 7 6 2)\n        (1 5 4 0)\n        (0 4 7 3)\n        (2 6 5 1)\n    )\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPisoSTM;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         1.5;\n\ndeltaT          0.005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.5;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nmaxDeltaT       1;\n\n//libs ( \"libgroovyBC.so\" );\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.05 0.05 -0.499)\n            (0.05 0.05 1.499)\n        );\n\n        // Fields to be probed\n        fields ( p T );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n    volFlow_inlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            inlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_outlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            outlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_wall\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            wall;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n/*\n// simpleFunctionObjects\n   heatFlux\n   {\n     type patchHeatFlux;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     cp 1007;       // cp in [J/(kg*K)]\n     factor  1.188; // density for incomp solvers!\n   }\n\n   massFlux\n   {\n     type patchMassFlow;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     factor  1.188; // density for incomp solvers!\n   }\n\n   pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }\n\n   T\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/controlDict.foam",
    "content": ""
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/decomposeParDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      decomposeParDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains 2;\n\nmethod          simple;\n\nsimpleCoeffs\n{\n    n               ( 1 1 2 );\n    delta           0.001;\n}\n\nhierarchicalCoeffs\n{\n    n               ( 2 2 1 );\n    delta           0.001;\n    order           xyz;\n}\n\nmetisCoeffs\n{\n}\n\nmanualCoeffs\n{\n    dataFile        \"\";\n}\n\ndistributed     no;\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n    div(phi,T)      Gauss limitedLinear 1; //Gauss upwind; //\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n    laplacian((DT*voidfraction),T) Gauss linear corrected;    \n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    UFinal\n    {\n        $U\n    }\n\n    \"(k|epsilon)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0.1;\n    }\n    \"(k|epsilon)Final\"\n    {\n        $epsilon;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(T|C)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-06;\n        relTol          0;\n    }\n}\n\nPIMPLE\n{\n    nOuterCorrectors 1;\n}\nrelaxationFactors\n{\n    fields\n    {\n\t    p\t1.0;\n    }\n    equations\n    {\n        \"U.*\"           1.0;\n        \"k.*\"           1.;\n        \"epsilon.*\"    1.;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\nregion          reg block 0. 0.1 0. 0.1 0. 1.1 units box\ncreate_box      1 reg\n\nneighbor        0.002 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history #Hertzian without cohesion\npair_coeff  * *\n\ntimestep    0.00001\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n# heat transfer\nfix         ftco all property/global thermalConductivity peratomtype 5. # lambda in [W/(K*m)]\nfix         ftca all property/global thermalCapacity peratomtype 10.    # cp in [J/(kg*K)]\nfix         heattransfer all heat/gran initial_temperature 263.\n\n# particle distributions and insertion\nregion      bc block 0. 0.1 0. 0.1 0. 1.1 units box\nfix         pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.011\nfix         pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix         ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -3. insert_every 10000 overlapcheck yes all_in yes particles_in_region 1005 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke f_heattransfer vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n#insert the first particles\nrun             1\ndump            dmp all custom 50000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius f_heattransfer[0] f_heatFlux[0]\n\nrun             150000\n\nwrite_restart   post/restart/liggghts.restart\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\n#######################################################\n# variables                                           #\n#######################################################\nvariable r0 equal 0.011\n#######################################################\n\n# read packed bed and calc convective heat transfer\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        ${r0} bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0. 0. -1.\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\n# cfd coupling\nfix         cfd all couple/cfd couple_every 100 mpi\nfix         cfd2 all couple/cfd/force/implicit\n\n\n# heat transfer\nfix         ftco all property/global thermalConductivity peratomtype 5. # lambda in [W/(K*m)]\nfix         ftca all property/global thermalCapacity peratomtype 0.1    # cp in [J/(kg*K)]\n\nrun         0\nfix         heattransfer all heat/gran initial_temperature 600.\nfix         cfd3 all couple/cfd/convection T0 600\n\n# species transfer\nfix         specCap all property/global              speciesCCapacity peratomtype 1.0\nfix         cfd4    all couple/cfd/speciesConvection speciesName speciesC species0 1.0 #this fix will add all relevant exchange fields for the species\n\n# set particle temperature for the bed\nregion      total block INF INF INF INF INF INF units box\n#set         region total property/atom Temp 600.\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke vol f_heattransfer\nthermo          1000\nthermo_modify   lost ignore norm no\n\ndump        dmp all custom 50000 ../DEM/post/dump*.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius f_Temp[0] f_heatFlux[0] f_speciesC[0] f_speciesCFlux[0]\n\nrun         0\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/cleanCase.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - Feb. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n#--------------------------------------------------------------------------------#\n\n\n\n#- clean up case\necho \"deleting data at: $casePath ?\"\n#read\nrm -r $casePath/*.e*\nrm -r $casePath/*.o*\nrm -r $casePath/log*\nrm -r $casePath/CFD/0.0*\nrm -r $casePath/CFD/log.*\nrm -r $casePath/CFD/averageProps\nrm -r $casePath/CFD/*.OpenFOAM\nrm -r $casePath/CFD/*.restart*\nrm -r $casePath/CFD/clockData\nrm -r $casePath/CFD/*.dat\nrm -r $casePath/CFD/octave/*.dat\nrm -r $casePath/CFD/octave/*.eps\nrm -r $casePath/CFD/octave/octave-workspace\nrm -r $casePath/CFD/processor*\nrm -r $casePath/CFD/VTK\nrm -r $casePath/CFD/volAvU\nrm -r $casePath/CFD/couplingFiles\nrm -r $casePath/CFD/particles\nrm -r $casePath/CFD/probe*\nrm -r $casePath/CFD/postProcess*\nrm -r $casePath/CFD/particleProbes\nrm -r $casePath/CFD/*Restart*\nrm -r $casePath/CFD/*restart*\nrm -r $casePath/CFD/fluidFlowStats.res\nrm -r $casePath/CFD/constant/polyMesh/*.gz\nrm -r $casePath/CFD/constant/polyMesh/faces\nrm -r $casePath/CFD/constant/polyMesh/neighbour\nrm -r $casePath/CFD/constant/polyMesh/owner\nrm -r $casePath/CFD/constant/polyMesh/points\nrm -r $casePath/CFD/constant/polyMesh/boundary\nrm -r $casePath/CFD/processor*\nrm -r $casePath/DEM/postParticles/*\nrm -r $casePath/DEM/postGlobal/*\nrm -r $casePath/DEM/post/*.*\nrm -r $casePath/DEM/post/restart/*.*\nrm -r $casePath/DEM/log.*\nrm -r $casePath/DEM/*Restart*\nrm -r $casePath/DEM/*restart*\n\nrm -r $casePath/CFD/pascal/0.*\nrm -r $casePath/CFD/pascal/1.*\nrm -r $casePath/CFD/pascal/2.*\nrm -r $casePath/CFD/codeInfo.*\nrm -r $casePath/CFD/*.dat\n\necho \"done\"\n\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - May. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPisoSTM_packedBedTemp_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPisoSTM\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\nseparateDEM=\"\" #\"in.liggghts_run_socket\"                   # use for socket variation only!\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\ncleanup=\"true\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode $separateDEM\n\n#------------------------------#\nif [ $runOctave == \"true\" ]\n  then\n\n    #- change path\n    cd octave\n\n    #- rmove old graph\n    rm *.png\n\n    #- run octave\n    octave --no-gui totalPressureDropAndNusselt.m\n\n    #- show plots \n    eog cfdemSolverPisoSTM_Nusselt.png &\n    eog cfdemSolverPisoSTM_pressureDrop.png\n    #------------------------------#\n\n    #- copy log file to test harness\n    cp ../../$logfileName $testHarnessPath\n    cp cfdemSolverPisoSTM_Nusselt.png $testHarnessPath\n    cp cfdemSolverPisoSTM_pressureDrop.png $testHarnessPath\n\nfi\n\n#-------------------------------------------------------#\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nif [ $cleanup == \"true\" ]\n  then\n    #- clean up case\n    keepDEMrestart=\"true\"\n    cleanCFDEMcase $casePath/CFD $keepDEMrestart\nfi\n\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoSTM/packedBedTemp/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Daniel Queteschiner - June 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/Allrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine\n# run settlingTest\n# Christoph Goniva - August 2011\n#===================================================================#\n\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\n\n# check if mesh was built\nif [ -f \"$casePath/CFD/constant/polyMesh/points\" ]; then\n    echo \"mesh was built before - using old mesh\"\nelse\n    echo \"mesh needs to be built\"\n    cd $casePath/CFD\n    blockMesh\nfi\n\nif [ -f \"$casePath/DEM/post/restart/liggghts.restart\" ];  then\n    echo \"LIGGGHTS init was run before - using existing restart file\"\nelse\n    #- run DEM init\n    $casePath/parDEMrun.sh\nfi\n\n# keep old couplingProperties\ncp $casePath/CFD/constant/couplingProperties $casePath/CFD/constant/couplingProperties_backup\n\n# change to use Deen Nusselt correlation\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_1 -case $casePath/CFD\n\n# change to use Gunn Nusselt correlation\n#changeDictionary -instance constant -dict changeDicts/changeDictionaryDict_2 -case $casePath/CFD\n\n#- run parallel CFD-DEM in new terminal\n#gnome-terminal --title='cfdemSolverPisoScalar packedBedTemp CFD'  -e \"bash $casePath/parCFDDEMrun.sh\"\n. $casePath/parCFDDEMrun.sh\n\n# restore old couplingProperties\nmv $casePath/CFD/constant/couplingProperties_backup $casePath/CFD/constant/couplingProperties\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/Ksl",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      Ksl;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/T",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      T;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 1 0 0 0];\n\ninternalField   uniform 263;\n\nboundaryField\n{\n    inlet           \n    {\n        type            fixedValue;\n        value           uniform 263;\n    }\n\n    outlet          \n    {\n        type            zeroGradient;\n    }\n\n    wall       \n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/Tsource",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0.05\";\n    object      Tsource;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 -1 1 0 0 0];\n\n// Tsource[K/s] = q[W/m3]/(rho[kg/m3]*cp[W*s/(kg*K)])\n// Q=10 W\n// V=0.01 m3\n// q=1000 W/m3\n// cp=1000\n// rho=1\n// --> Tsource = 1 \n\ninternalField   uniform 0;  \n\nboundaryField\n{\n    inlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n    wall\n    {\n        type            zeroGradient;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/U",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    object      U;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0.001);\n\nboundaryField\n{\n\n    wall\n    {\n        //type            fixedValue;\n        //value           uniform (0 0 0);\n        type            slip;\n    }\n\n    inlet\n    {\n        type            fixedValue;\n        value           uniform (0 0 1);\n    }\n\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/Us",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volVectorField;\n    location    \"0\";\n    object      Us;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -1 0 0 0 0];\n\ninternalField   uniform (0 0 0);\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n    inlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);;\n    }\n    outlet\n    {\n        type            zeroGradient;\n        //type            fixedValue;\n        //value           uniform (1 0 0);\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/alphat",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  3.0.x                                 |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      alphat;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            alphatJayatillekeWallFunction;\n        Prt             0.85;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/epsilon",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      epsilon;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -3 0 0 0 0];\n\ninternalField   uniform 0.003;\n\nboundaryField\n{\n    wall\n    {\n        type            epsilonWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0.003;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.003;\n        value           uniform 0.003;\n    }\n    inlet\n    {\n        /*type            turbulentMixingLengthDissipationRateInlet;\n        mixingLength    0.005;\n        value           uniform 0.003;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/k",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      k;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0.001;\n\nboundaryField\n{\n    wall\n    {\n        type            kqRWallFunction;\n        value           uniform 0.001;\n    }\n    outlet\n    {\n        type            inletOutlet;\n        inletValue      uniform 0.001;\n        value           uniform 0.001;\n    }\n    inlet\n    {\n        /*type            turbulentIntensityKineticEnergyInlet;\n        intensity       0.05;\n        value           uniform 0.001;*/\n        type            zeroGradient;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/nut",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      nut;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -1 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n    wall\n    {\n        type            nutkWallFunction;\n        Cmu             0.09;\n        kappa           0.41;\n        E               9.8;\n        value           uniform 0;\n    }\n    outlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n    inlet\n    {\n        type            calculated;\n        value           uniform 0;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/p",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      p;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 2 -2 0 0 0 0];\n\ninternalField   uniform 0;\n\nboundaryField\n{\n\n    wall\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n//        type            fixedFluxPressure;\n//        phi             phi;\n        type            zeroGradient;\n    }\n    outlet\n    {\n        //type            zeroGradient;\n        type            fixedValue;\n        value           uniform 0;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/rho",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    object      rho;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [1 -3 0 0 0 0 0];\n\ninternalField   uniform 1.188;\n\nboundaryField\n{\n\n    wall\n    {\n        type            zeroGradient;\n    }\n\n    inlet\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            zeroGradient;\n    }\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/0/voidfraction",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       volScalarField;\n    location    \"0\";\n    object      voidfraction;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 0 0 0 0 0 0];\n\ninternalField   uniform 1;\n\nboundaryField\n{\n    wall\n    {\n        type            zeroGradient;\n    }\n    outlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n    inlet\n    {\n        type            fixedValue;\n        value           uniform 1;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/RASProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      RASProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nRASModel        laminar;//kEpsilon;\n\nturbulence      on;\n\nprintCoeffs     on;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/couplingProperties",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          couplingProperties;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//===========================================================================//\n// sub-models & settings\n\nmodelType B; // A or B\n\ncouplingInterval 500;\n\nvoidFractionModel divided;\n\nlocateModel engine;\n\nmeshMotionModel noMeshMotion;\n\nIOModel basicIO;\n\nprobeModel off;\n\ndataExchangeModel twoWayMPI;\n\naveragingModel dense;//dilute;//\n\nclockModel off;//standardClock;//\n\nsmoothingModel off;\n\nforceModels\n(\n    KochHillDrag\n    LaEuScalarTemp\n    Archimedes\n);\n\nmomCoupleModels\n(\n    implicitCouple\n);\n\n//turbulenceModelType RASProperties;//LESProperties;//OFversion24x\nturbulenceModelType turbulenceProperties;//OFversion30x\n\n//===========================================================================//\n// sub-model properties\n\nLaEuScalarTempProps\n{\n    tempFieldName \"T\";\n    partTempName \"Temp\";\n    partHeatFluxName \"convectiveHeatFlux\";\n    lambda 0.0256;\n    Cp 1007;\n}\n\nimplicitCoupleProps\n{\n    //KslLimit 0;  // source switched off!!!\n}\n\nKochHillDragProps\n{\n}\n\nDiFeliceDragProps\n{\n    //verbose true;\n}\n\nArchimedesProps\n{\n}\ngradPForceProps\n{\n    //interpolation true;\n}\n\nviscForceProps\n{\n    interpolation true;\n}\n\noneWayVTKProps\n{\n    couplingFilename \"vtk_out%4.4d.vtk\";\n    maxNumberOfParticles 30000;\n}\n\ntwoWayMPIProps\n{\n    maxNumberOfParticles 10000;\n    liggghtsPath \"../DEM/in.liggghts_run\";\n}\n\ncentreProps\n{\n}\n\ndividedProps\n{\n    alphaMin 0.4;\n}\n\nengineProps\n{\n    treeSearch true;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/g",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       uniformDimensionedVectorField;\n    location    \"constant\";\n    object      g;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ndimensions      [0 1 -2 0 0 0 0];\nvalue           ( 0 -9.81 0);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/liggghtsCommands",
    "content": "/*---------------------------------------------------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.4                                   |\n|   \\\\  /    A nd           | Web:      http://www.openfoam.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\n\n\nFoamFile\n{\n    version         2.0;\n    format          ascii;\n\n    root            \"\";\n    case            \"\";\n    instance        \"\";\n    local           \"\";\n\n    class           dictionary;\n    object          liggghtsCommands;\n}\n\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nliggghtsCommandModels\n(\n   runLiggghts\n   execute\n);\n\n// reset particle temperature every coupling step\nexecuteProps1\n{\n    command\n    (\n        set\n        region\n        total\n        noBlanks\n        property\n        slash\n        atom  // former peratom\n        blanks\n        Temp\n        number\n    );\n    scalars\n    (\n        600\n    );\n    runFirst off; \n    runLast off;\n    runEveryCouplingStep on;\n}\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/transportProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      transportProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\ntransportModel  Newtonian;\n\n// Laminar viscosity\nnu              nu [ 0 2 -1 0 0 0 0 ] 1.5e-03;\n\n// Laminar Prandtl number\nPr              [0 0 0 0 0 0 0] 70.097; // alpha=nu/Pr=2.1399e-5\n\n// Turbulent Prandtl number\nPrt             [0 0 0 0 0 0 0] 1e15;\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/constant/turbulenceProperties",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"constant\";\n    object      turbulenceProperties;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\n//simulationType  RASModel;//OFversion24x\nsimulationType  RAS;//OFversion30x\n\nRAS\n{\n    RASModel        kEpsilon;\n\n    turbulence      on;\n\n    printCoeffs     on;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/octave/totalPressureDropAndNusselt.m",
    "content": "close all;\nclear;\nclc;\n\n\n%*********************************************************************%\n% pressure drop\n%*********************************************************************%\n\n%===================\n% Ergun Equation\n%===================\nfprintf('\\ncalc Ergun eqn:\\n')\ndp = 0.022;\t\t\t% particle diameter\nphip = 1;\t\t\t% sphericity\nepsilon = 0.4436;\t\t        % voidfraction\nU = 1;    \t\t\t% superficial velocity\nL = 1;\t\t\t% length of bed\nrhoG = 1.188;\t\t\t% density in kg/m\nnuG = 1.5e-3;\t        \t% kinemat Visk in m2/s\nmuG = nuG*rhoG\t\t\t% dynam visc in Pa s\n\ndpErgun= L * (\n                150*((1-epsilon)^2/epsilon^3)*((muG*U)/(phip*dp)^2) \n              +1.75*((1-epsilon)/epsilon^3)*((rhoG*U^2)/(phip*dp))\n        )\n\nfprintf('final pressure drop = %f Pa\\n',dpErgun)\n%====================================%\n% simulation data\n%====================================%\n%path = '../probes/0/p'; % ext32\npath = '../postProcessing/probes/0/p';\n\ndata = load(path);\n[x,y]=size(data);\ndp_sim = data(:,2)-data(:,y);\nt_sim = data(:,1);\nfprintf('final pressureDrop of sim = %f Pa\\n',dp_sim(length(dp_sim)) )\n\n%====================================%\n% plot data\n%====================================%\nfigure(1)\nplot(t_sim,dpErgun*ones(1,length(t_sim)),t_sim,dp_sim)\naxis([0,0.7,0,dpErgun(length(dpErgun))])\ntitle(\"Ergun pressure drop\")\nlegend(\"analytical - Ergun\",\"simulation\") \n\n%print('cfdemSolverPiso_settlingTest.eps','-deps2')\nprint -color \"cfdemSolverPisoScalar_pressureDrop.png\"\n\n%*********************************************************************%\n% heat transfer\n%*********************************************************************%\n\n%====================================%\n% simulation data\n%====================================%\n\ncp = 1007;\nA = 0.01;\nU = U;\nalpha = epsilon;\nnuF = nuG;\nrhoF = rhoG;\nTp = 600;\nNp = 1005;\nlambda = 0.0256;\n\n%path = '../probes/0/T'; % ext32\npath = '../postProcessing/probes/0/T';\n\ndata = load(path);\n[x,y]=size(data);\nTin_sim =  data(:,2);                                          % mean temp inlet temp [K]\nTout_sim = data(:,3);                                          % mean temp outlet temp [K]\nt_sim = data(:,1);\nfprintf('final inlet temperature of sim = %f K\\n',Tin_sim(length(Tin_sim)) )\nfprintf('final outlet temperature of sim = %f K\\n',Tout_sim(length(Tout_sim)) )\n\n\nuF = U/alpha;                                               % interstitial velocity [m/s]\nReP_sim = uF.*ones(length(t_sim),1)*dp/nuF;                                       % ReynoldsNr based in dp\nPr = nuF*rhoF*cp/lambda;\nqin_sim = U * A * rhoF * cp .* Tin_sim;\nqout_sim = U * A * rhoF * cp .* Tout_sim;\nq_sim = (qout_sim-qin_sim);                                 % particle fluid heat flux [W] (out-in)\nTmean_sim = 0.5*(Tin_sim+Tout_sim);                               % mean temp of fluid\ndeltaT = Tp - Tmean_sim;                                          % mean temp diff between partcles and fluid\nh=q_sim./(Np*dp^2*pi*deltaT);                                      % average particle-fluid heat transfer coeff [W/(m2*K)]\nNu_sim = h.*dp/lambda;                                             % mean particle Nusselt nr\nt_sim = data(:,1);\nfprintf('q_sim = %f \\n',q_sim(length(Nu_sim)))\nfprintf('Nu_sim = %f \\n',Nu_sim(length(Nu_sim)))\n\n%===================\n% Nusselt Equation\n%===================\nfprintf('\\ncalc Nusselt eqn:\\n')\n\n%% following Li and Mason\nn=3.5\nif (ReP_sim(length(uF)) <200)\n     Nu_LiMason=2.*ones(length(uF),1)+0.6*alpha^n.*ReP_sim.^0.5.*Pr^0.33;\nelseif (ReP_sim(length(uF)) <1500)\n     Nu_LiMason=2.*ones(length(uF),1)+0.5*alpha^n.*ReP_sim.^0.5*Pr^0.33 + 0.02*alpha^n.*ReP_sim.^0.8.*Pr^0.33;\nelse\n     Nu_LiMason=2.*ones(length(uF),1) +0.000045*alpha^n.*ReP_sim.^1.8;\nend\n\nfprintf('Nu_LiMason = %f \\n',Nu_LiMason(length(Nu_LiMason)))\n\n%====================================%\n% plot data\n%====================================%\nfigure(2)\nplot(t_sim,Nu_LiMason,t_sim,Nu_sim)\ntitle(\"Nusselt nr\")\nlegend(\"analytical - \",\"simulation\") \n\n%print('cfdemSolverPisoScalar_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoScalar_Nusselt.png\"\n\nfigure(3)\nplot(t_sim,Tin_sim,t_sim,Tout_sim)\ntitle(\"inlet/outlet temperature\")\nlegend(\"inlet\",\"outlet\") \n\n%print('cfdemSolverPisoScalar_NusseltNr.eps','-deps2')\nprint -color \"cfdemSolverPisoScalar_temperatures.png\"\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/blockMeshDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      http://www.OpenFOAM.org               |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    object      blockMeshDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nconvertToMeters 1.;\n\nvertices\n(\n    (0. 0 -0.5)\n    (0.1 0 -0.5)\n    (0.1 0.1 -0.5)\n    (0. 0.1 -0.5)\n    (0. 0 1.5)\n    (0.1 0 1.5)\n    (0.1 0.1 1.5)\n    (0. 0.1 1.5)\n);\n\nblocks\n(\n    hex (0 1 2 3 4 5 6 7) (2 2 33) simpleGrading (1 1 1)\n);\n\nedges\n(\n);\n\npatches\n(\n    wall inlet\n    (\n        (0 3 2 1)\n    )\n    wall outlet\n    (\n        (4 5 6 7)\n    )\n    wall wall\n    (\n        (3 7 6 2)\n        (1 5 4 0)\n        (0 4 7 3)\n        (2 6 5 1)\n    )\n);\n\nmergePatchPairs\n(\n);\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/controlDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      controlDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\napplication     cfdemSolverPisoScalar;\n\nstartFrom       startTime;\n\nstartTime       0;\n\nstopAt          endTime;\n\nendTime         1.5;\n\ndeltaT          0.005;\n\nwriteControl    adjustableRunTime;\n\nwriteInterval   0.1;\n\npurgeWrite      0;\n\nwriteFormat     ascii;\n\nwritePrecision  6;\n\nwriteCompression uncompressed;\n\ntimeFormat      general;\n\ntimePrecision   6;\n\nrunTimeModifiable yes;\n\nadjustTimeStep  no;\n\nmaxCo 0.1;\n\nmaxDeltaT       1;\n\n//libs ( \"libgroovyBC.so\" );\n\nfunctions\n{\n\n    probes\n    {\n        type        probes;\n        // Where to load it from\n        functionObjectLibs ( \"libsampling.so\" );  \n        // Name of the directory for probe data\n        name        probes;\n        probeLocations\n        (\n            (0.05 0.05 -0.499)\n            (0.05 0.05 1.499)\n        );\n\n        // Fields to be probed\n        fields ( p T );\n\n        // Write at same frequency as fields\n        outputControl   timeStep;//outputTime;\n        outputInterval  1;\n    }\n\n    volFlow_inlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            inlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_outlet\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            outlet;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n    volFlow_wall\n    {\n        type            surfaceFieldValue;\n        functionObjectLibs (\"libfieldFunctionObjects.so\");\n        outputControl   timeStep;\n        outputInterval  1;\n        log             false;\n        writeFields     false;\n        valueOutput     false;\n        regionType      patch;\n        name            wall;\n        operation       sum;\n        fields\n        (\n            phi\n        );\n    }\n\n/*\n// simpleFunctionObjects\n   heatFlux\n   {\n     type patchHeatFlux;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     cp 1007;       // cp in [J/(kg*K)]\n     factor  1.188; // density for incomp solvers!\n   }\n\n   massFlux\n   {\n     type patchMassFlow;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     factor  1.188; // density for incomp solvers!\n   }\n\n   pressureDrop\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields\n     (\n         p\n     );\n     factor  1;\n   }\n\n   T\n   {\n     type patchAverage;\n     functionObjectLibs\n     (\n         \"libsimpleFunctionObjects.so\"\n     );\n     verbose true;\n     patches\n     (\n         inlet\n         outlet\n     );\n     fields    // name of temp field\n     (\n         T\n     );\n     factor  1;\n   }*/\n}\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/controlDict.foam",
    "content": ""
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/decomposeParDict",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      decomposeParDict;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nnumberOfSubdomains 2;\n\nmethod          simple;\n\nsimpleCoeffs\n{\n    n               ( 1 1 2 );\n    delta           0.001;\n}\n\nhierarchicalCoeffs\n{\n    n               ( 2 2 1 );\n    delta           0.001;\n    order           xyz;\n}\n\nmetisCoeffs\n{\n}\n\nmanualCoeffs\n{\n    dataFile        \"\";\n}\n\ndistributed     no;\n\n//// Is the case distributed\n//distributed     yes;\n//// Per slave (so nProcs-1 entries) the directory above the case.\n//roots           \n//(\n//    \"/tmp\"\n//    \"/tmp\"\n//);\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/fvSchemes",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSchemes;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nddtSchemes\n{\n    default         Euler;\n}\n\ngradSchemes\n{\n    default         Gauss linear;\n    grad(p)         Gauss linear;\n    grad(U)         Gauss linear;\n}\n\ndivSchemes\n{\n    default         Gauss linear;\n    div(phi,U)      Gauss limitedLinearV 1;\n    div(phi,k)      Gauss limitedLinear 1;\n    div(phi,epsilon) Gauss limitedLinear 1;\n    div(phi,R)      Gauss limitedLinear 1;\n    div(R)          Gauss linear;\n    div(phi,nuTilda) Gauss limitedLinear 1;\n    div((nuEff*dev(grad(U).T()))) Gauss linear;\n    div((viscousTerm*dev(grad(U).T()))) Gauss linear;\n    div((nu*dev(grad(U).T()))) Gauss linear;\n    div(phi,T)      Gauss limitedLinear 1; //Gauss upwind; //\n}\n\nlaplacianSchemes\n{\n    default         Gauss linear corrected;\n    laplacian(nuEff,U) Gauss linear corrected;\n    laplacian(viscousTerm,U) Gauss linear corrected;\n    laplacian(nu,U) Gauss linear corrected;\n    laplacian((1|A(U)),p) Gauss linear corrected;\n    laplacian((voidfraction2|A(U)),p) Gauss linear corrected;\n    laplacian(DkEff,k) Gauss linear corrected;\n    laplacian(DepsilonEff,epsilon) Gauss linear corrected;\n    laplacian(DREff,R) Gauss linear corrected;\n    laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;\n    laplacian((DT*voidfraction),T) Gauss linear corrected;    \n}\n\ninterpolationSchemes\n{\n    default         linear;\n    interpolate(U)  linear;\n}\n\nsnGradSchemes\n{\n    default         corrected;\n}\n\nfluxRequired\n{\n    default         no;\n    p               ;\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/CFD/system/fvSolution",
    "content": "/*--------------------------------*- C++ -*----------------------------------*\\\n| =========                 |                                                 |\n| \\\\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |\n|  \\\\    /   O peration     | Version:  1.6                                   |\n|   \\\\  /    A nd           | Web:      www.OpenFOAM.org                      |\n|    \\\\/     M anipulation  |                                                 |\n\\*---------------------------------------------------------------------------*/\nFoamFile\n{\n    version     2.0;\n    format      ascii;\n    class       dictionary;\n    location    \"system\";\n    object      fvSolution;\n}\n// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //\n\nsolvers\n{\n    p\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0.1;\n    }\n\n    pFinal\n    {\n        solver          PCG;\n        preconditioner  DIC;\n        tolerance       1e-06;\n        relTol          0;\n    }\n\n    U\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    UFinal\n    {\n        $U\n    }\n\n    k\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    epsilon\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    R\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    nuTilda\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-05;\n        relTol          0;\n    }\n\n    \"(T|C)\"\n    {\n        solver          PBiCG;\n        preconditioner  DILU;\n        tolerance       1e-06;\n        relTol          0;\n    }\n}\n\nPISO\n{\n    nCorrectors     4;\n    nNonOrthogonalCorrectors 0;\n    pRefCell        0;\n    pRefValue       0;\n}\n\nPIMPLE\n{\n    nOuterCorrectors 1;\n}\nrelaxationFactors\n{\n    fields\n    {\n\t    p\t1.0;\n    }\n    equations\n    {\n        \"U.*\"           1.0;\n        \"k.*\"           1.;\n        \"epsilon.*\"    1.;\n    }\n}\n\n\n// ************************************************************************* //\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/DEM/in.liggghts_init",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\nregion          reg block 0. 0.1 0. 0.1 0. 1.1 units box\ncreate_box      1 reg\n\nneighbor        0.002 bin\nneigh_modify    delay 0\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history #Hertzian without cohesion\npair_coeff  * *\n\ntimestep    0.00001\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\nfix         gravi all gravity 9.81 vector 0.0 0.0 -1.0\n\n# heat transfer\nfix         ftco all property/global thermalConductivity peratomtype 5. # lambda in [W/(K*m)]\nfix         ftca all property/global thermalCapacity peratomtype 10.    # cp in [J/(kg*K)]\nfix         heattransfer all heat/gran initial_temperature 263.\n\n# particle distributions and insertion\nregion      bc block 0. 0.1 0. 0.1 0. 1.1 units box\nfix         pts1 all particletemplate/sphere 15485863 atom_type 1 density constant 2500 radius constant 0.011\nfix         pdd1 all particledistribution/discrete 15485867 1 pts1 1.0\n\nfix         ins all insert/pack seed 32452843 distributiontemplate pdd1 vel constant 0. 0. -3. insert_every 10000 overlapcheck yes all_in yes particles_in_region 1005 region bc\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke f_heattransfer vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\n#insert the first particles\nrun             1\ndump            dmp all custom 1000 post/dump.liggghts_init id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius f_heattransfer[0] f_heatFlux[0]\n\nrun             150000\n\nwrite_restart   post/restart/liggghts.restart\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/DEM/in.liggghts_run",
    "content": "echo            both\nlog             ../DEM/log.liggghts\n\n#######################################################\n# variables                                           #\n#######################################################\nvariable r0 equal 0.011\n#######################################################\n\n# read packed bed and calc convective heat transfer\natom_style      granular\natom_modify     map array\nboundary        m m m\nnewton          off\n\ncommunicate     single vel yes\n\nunits           si\nprocessors      1 1 2\n\n# read the restart file\nread_restart    ../DEM/post/restart/liggghts.restart\n\nneighbor        ${r0} bin\nneigh_modify    delay 0 binsize 0.01\n\n\n# Material properties required for granular pair styles\n\nfix         m1 all property/global youngsModulus peratomtype 5.e6\nfix         m2 all property/global poissonsRatio peratomtype 0.45\nfix         m3 all property/global coefficientRestitution peratomtypepair 1 0.3\nfix         m4 all property/global coefficientFriction peratomtypepair 1 0.5\n\n# pair style\npair_style  gran model hertz tangential history\npair_coeff  * *\n\n# timestep, gravity\ntimestep    0.00001\nfix         gravi all gravity 9.81 vector 0. 0. -1.\n\n# walls\nfix     xwalls1 all wall/gran model hertz tangential history primitive type 1 xplane 0.0\nfix     xwalls2 all wall/gran model hertz tangential history primitive type 1 xplane 0.1\nfix     ywalls1 all wall/gran model hertz tangential history primitive type 1 yplane 0.0\nfix     ywalls2 all wall/gran model hertz tangential history primitive type 1 yplane 0.1\nfix     zwalls1 all wall/gran model hertz tangential history primitive type 1 zplane 0.0\nfix     zwalls2 all wall/gran model hertz tangential history primitive type 1 zplane 1.1\n\n# cfd coupling\nfix         cfd all couple/cfd couple_every 100 mpi\nfix         cfd2 all couple/cfd/force/implicit\n\n\n# heat transfer\nfix         ftco all property/global thermalConductivity peratomtype 5. # lambda in [W/(K*m)]\nfix         ftca all property/global thermalCapacity peratomtype 0.1    # cp in [J/(kg*K)]\n\nrun         0\nfix         heattransfer all heat/gran initial_temperature 600.\nfix         cfd3 all couple/cfd/convection T0 600\n\n# set particle temperature for the bed\nregion      total block INF INF INF INF INF INF units box\n#set         region total property/atom Temp 600.\n\n# apply nve integration to all particles that are inserted as single particles\nfix         integr all nve/sphere\n\n# output settings, include total thermal energy\ncompute         rke all erotate/sphere\nthermo_style    custom step atoms ke c_rke f_heattransfer vol\nthermo          1000\nthermo_modify   lost ignore norm no\n\ndump        dmp all custom 20000 ../DEM/post/dump*.liggghts_run id type x y z ix iy iz vx vy vz fx fy fz omegax omegay omegaz radius f_Temp[0] f_heatFlux[0]\n\nrun         0\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/parCFDDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# allrun script for testcase as part of test routine \n# run settlingTest CFD part\n# Christoph Goniva - May. 2011\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=$casePath\nheaderText=\"run_parallel_cfdemSolverPisoScalar_packedBedTemp_CFDDEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"cfdemSolverPisoScalar\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\ndebugMode=\"off\"          # on | off| strict\ntestHarnessPath=\"$CFDEM_TEST_HARNESS_PATH\"\nrunOctave=\"true\"\npostproc=\"false\"\ncleanup=\"true\"\n#--------------------------------------------------------------------------------#\n\n#- call function to run a parallel CFD-DEM case\nparCFDDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName $debugMode\n\n#------------------------------#\nif [ $runOctave == \"true\" ]\n  then\n\n    #- change path\n    cd octave\n\n    #- rmove old graph\n    rm *.png\n\n    #- run octave\n    octave --no-gui totalPressureDropAndNusselt.m\n\n    #- show plots \n    eog cfdemSolverPisoScalar_Nusselt.png &\n    eog cfdemSolverPisoScalar_pressureDrop.png\n    #------------------------------#\n\n    #- copy log file to test harness\n    cp ../../$logfileName $testHarnessPath\n    cp cfdemSolverPisoScalar_Nusselt.png $testHarnessPath\n    cp cfdemSolverPisoScalar_pressureDrop.png $testHarnessPath\n\nfi\n\n#-------------------------------------------------------#\nif [ $postproc == \"true\" ]\n  then\n\n    #- keep terminal open (if started in new terminal)\n    echo \"simulation finished? ...press enter to proceed\"\n    read\n\n    #- get VTK data from liggghts dump file\n    cd $casePath/DEM/post\n    python -i $CFDEM_LPP_DIR/lpp.py  dump.liggghts_run\n\n    #- get VTK data from CFD sim\n    cd $casePath/CFD\n    foamToVTK                                                   #- serial run of foamToVTK\n    #source $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh                       #- include functions\n    #pseudoParallelRun \"foamToVTK\" $nrPostProcProcessors          #- pseudo parallel run of foamToVTK\n\n    #- start paraview\n    paraview\n\n    #- keep terminal open (if started in new terminal)\n    echo \"...press enter to clean up case\"\n    echo \"press Ctr+C to keep data\"\n    read\nfi\n\n#- clean up case\nif [ $cleanup == \"true\" ]\n  then\n    keepDEMrestart=\"false\"\n    cleanCFDEMcase $casePath/CFD $keepDEMrestart\nfi\n\n\n"
  },
  {
    "path": "tutorials/cfdemSolverPisoScalar/packedBedTemp/parDEMrun.sh",
    "content": "#!/bin/bash\n\n#===================================================================#\n# DEMrun script for ErgunTestMPI testcase\n# init ErgunTestMPI\n# Daniel Queteschiner - June 2014\n#===================================================================#\n\n#- source CFDEM env vars\n. ~/.bashrc\n\n#- include functions\nsource $CFDEM_SRC_DIR/lagrangian/cfdemParticle/etc/functions.sh\n\n#--------------------------------------------------------------------------------#\n#- define variables\ncasePath=\"$(dirname \"$(readlink -f ${BASH_SOURCE[0]})\")\"\nlogpath=\"$casePath\"\nheaderText=\"run_liggghts_init_DEM\"\nlogfileName=\"log_$headerText\"\nsolverName=\"in.liggghts_init\"\nnrProcs=\"2\"\nmachineFileName=\"none\"   # yourMachinefileName | none\n#--------------------------------------------------------------------------------#\n\n#- call function to run DEM case\nparDEMrun $logpath $logfileName $casePath $headerText $solverName $nrProcs $machineFileName\n\n"
  }
]